From: wolf Date: Tue, 20 Jan 2009 18:48:41 +0000 (+0000) Subject: dev: add register_candev() and unregister_candev() X-Git-Url: http://rtime.felk.cvut.cz/gitweb/socketcan-devel.git/commitdiff_plain/30b0377c20a6e914a44592fa44d91bdcab916b19?hp=192f8c106817e0a5e4b99b7e3c709d920be75ad3 dev: add register_candev() and unregister_candev() Not all CAN devices are using the CAN device interface, like vcan or slcan. Providing "struct can_priv" and SYSFS files for them seems overkill. Because it's awkward to identify a device using the CAN device interface in the netdev notifier callback, the functions register_candev() and unregister_candev() have been introduced. All devices using the CAN device interface should call them instead of register_netdev() and unregister_netdev(). Signed-off-by: Wolfgang Grandegger This line, and those below, will be ignored-- M kernel/2.6/include/linux/can/dev.h M kernel/2.6/drivers/net/can/dev.c M kernel/2.6/drivers/net/can/mcp251x.c M kernel/2.6/drivers/net/can/mscan/mscan.c M kernel/2.6/drivers/net/can/softing/softing_main.c M kernel/2.6/drivers/net/can/sja1000/sja1000.c git-svn-id: svn://svn.berlios.de//socketcan/trunk@905 030b6a49-0b11-0410-94ab-b0dab22257f2 --- diff --git a/kernel/2.6/drivers/net/can/dev.c b/kernel/2.6/drivers/net/can/dev.c index def7b18..b123cb6 100644 --- a/kernel/2.6/drivers/net/can/dev.c +++ b/kernel/2.6/drivers/net/can/dev.c @@ -289,6 +289,30 @@ void free_candev(struct net_device *dev) } EXPORT_SYMBOL(free_candev); +int register_candev(struct net_device *dev) +{ + int err; + + err = register_netdev(dev); + if (err) + return err; + +#ifdef CONFIG_SYSFS + can_create_sysfs(dev); +#endif + return 0; +} +EXPORT_SYMBOL(register_candev); + +void unregister_candev(struct net_device *dev) +{ +#ifdef CONFIG_SYSFS + can_remove_sysfs(dev); +#endif + unregister_netdev(dev); +} +EXPORT_SYMBOL(unregister_candev); + /* * Local echo of CAN messages * @@ -471,57 +495,15 @@ void can_close_cleanup(struct net_device *dev) } EXPORT_SYMBOL(can_close_cleanup); -static int can_netdev_notifier_call(struct notifier_block *nb, - unsigned long state, - void *ndev) -{ - struct net_device *dev = ndev; - - if (dev->type != ARPHRD_CAN) - return 0; - -#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,24) - /* omit virtual CAN software network devices */ - if (dev->rtnl_link_ops) { - const struct rtnl_link_ops *ops = dev->rtnl_link_ops; - if (!strcmp(ops->kind, "vcan")) - return 0; - } -#else - /* software CAN devices like 'vcan' do not have private data */ - if (!dev->priv) - return 0; -#endif - - switch (state) { - case NETDEV_REGISTER: -#ifdef CONFIG_SYSFS - can_create_sysfs(dev); -#endif - break; - case NETDEV_UNREGISTER: -#ifdef CONFIG_SYSFS - can_remove_sysfs(dev); -#endif - break; - } - return 0; -} - -static struct notifier_block can_netdev_notifier = { - .notifier_call = can_netdev_notifier_call, -}; - static __init int can_dev_init(void) { printk(KERN_INFO MOD_DESC "\n"); - return register_netdevice_notifier(&can_netdev_notifier); + return 0; } module_init(can_dev_init); static __exit void can_dev_exit(void) { - unregister_netdevice_notifier(&can_netdev_notifier); } module_exit(can_dev_exit); diff --git a/kernel/2.6/drivers/net/can/mcp251x.c b/kernel/2.6/drivers/net/can/mcp251x.c index 3600efd..47328d0 100644 --- a/kernel/2.6/drivers/net/can/mcp251x.c +++ b/kernel/2.6/drivers/net/can/mcp251x.c @@ -1111,7 +1111,7 @@ static int __devinit mcp251x_can_probe(struct spi_device *spi) if (pdata->transceiver_enable) pdata->transceiver_enable(0); - ret = register_netdev(net); + ret = register_candev(net); if (ret >= 0) { dev_info(&spi->dev, "probed\n"); return ret; @@ -1155,7 +1155,7 @@ static int __devexit mcp251x_can_remove(struct spi_device *spi) kfree(priv->spi_rx_buf); } - unregister_netdev(net); + unregister_candev(net); free_candev(net); if (pdata->power_enable) diff --git a/kernel/2.6/drivers/net/can/mscan/mscan.c b/kernel/2.6/drivers/net/can/mscan/mscan.c index af72e78..03dae77 100644 --- a/kernel/2.6/drivers/net/can/mscan/mscan.c +++ b/kernel/2.6/drivers/net/can/mscan/mscan.c @@ -719,7 +719,7 @@ int register_mscandev(struct net_device *dev, int clock_src) mscan_set_mode(dev, MSCAN_INIT_MODE); - return register_netdev(dev); + return register_candev(dev); } EXPORT_SYMBOL(register_mscandev); @@ -728,7 +728,7 @@ void unregister_mscandev(struct net_device *dev) struct mscan_regs *regs = (struct mscan_regs *)dev->base_addr; mscan_set_mode(dev, MSCAN_INIT_MODE); out_8(®s->canctl1, in_8(®s->canctl1) & ~MSCAN_CANE); - unregister_netdev(dev); + unregister_candev(dev); } EXPORT_SYMBOL(unregister_mscandev); diff --git a/kernel/2.6/drivers/net/can/sja1000/sja1000.c b/kernel/2.6/drivers/net/can/sja1000/sja1000.c index 43775f8..d63b736 100644 --- a/kernel/2.6/drivers/net/can/sja1000/sja1000.c +++ b/kernel/2.6/drivers/net/can/sja1000/sja1000.c @@ -782,7 +782,7 @@ int register_sja1000dev(struct net_device *dev) priv->can.do_set_mode = sja1000_set_mode; priv->dev = dev; - err = register_netdev(dev); + err = register_candev(dev); if (err) { printk(KERN_INFO "%s: registering netdev failed\n", DRV_NAME); @@ -799,7 +799,7 @@ EXPORT_SYMBOL(register_sja1000dev); void unregister_sja1000dev(struct net_device *dev) { set_reset_mode(dev); - unregister_netdev(dev); + unregister_candev(dev); } EXPORT_SYMBOL(unregister_sja1000dev); diff --git a/kernel/2.6/drivers/net/can/softing/softing_main.c b/kernel/2.6/drivers/net/can/softing/softing_main.c index 19ec72e..a26cb1c 100644 --- a/kernel/2.6/drivers/net/can/softing/softing_main.c +++ b/kernel/2.6/drivers/net/can/softing/softing_main.c @@ -900,7 +900,7 @@ static int reg_netdev(struct softing_priv *priv) { int ret; netif_carrier_off(priv->netdev); - ret = register_netdev(priv->netdev); + ret = register_candev(priv->netdev); if (ret) { mod_alert("%s, register failed", priv->card->id.name); goto reg_failed; @@ -912,7 +912,7 @@ static int reg_netdev(struct softing_priv *priv) } return 0; sysfs_failed: - unregister_netdev(priv->netdev); + unregister_candev(priv->netdev); reg_failed: return EINVAL; } @@ -920,7 +920,7 @@ reg_failed: static void unreg_netdev(struct softing_priv *priv) { rm_netdev_sysfs(priv); - unregister_netdev(priv->netdev); + unregister_candev(priv->netdev); } void rm_softing(struct softing *card) diff --git a/kernel/2.6/include/linux/can/dev.h b/kernel/2.6/include/linux/can/dev.h index 5db4c2e..686b31e 100644 --- a/kernel/2.6/include/linux/can/dev.h +++ b/kernel/2.6/include/linux/can/dev.h @@ -133,6 +133,8 @@ struct net_device_stats *can_get_stats(struct net_device *dev); struct net_device *alloc_candev(int sizeof_priv); void free_candev(struct net_device *dev); +int register_candev(struct net_device *dev); +void unregister_candev(struct net_device *dev); int can_set_bittiming(struct net_device *dev);