]> rtime.felk.cvut.cz Git - socketcan-devel.git/commitdiff
dev: add register_candev() and unregister_candev()
authorwolf <wolf@030b6a49-0b11-0410-94ab-b0dab22257f2>
Tue, 20 Jan 2009 18:48:41 +0000 (18:48 +0000)
committerwolf <wolf@030b6a49-0b11-0410-94ab-b0dab22257f2>
Tue, 20 Jan 2009 18:48:41 +0000 (18:48 +0000)
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 <wg@grandegger.com>
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

kernel/2.6/drivers/net/can/dev.c
kernel/2.6/drivers/net/can/mcp251x.c
kernel/2.6/drivers/net/can/mscan/mscan.c
kernel/2.6/drivers/net/can/sja1000/sja1000.c
kernel/2.6/drivers/net/can/softing/softing_main.c
kernel/2.6/include/linux/can/dev.h

index def7b18f952929077d2ff756c1559c7c9beead79..b123cb6e48919c94b4af680b98dfa37ecd80907c 100644 (file)
@@ -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);
index 3600efda2f1435b3b7041a379045519b8f9cf4ef..47328d0f306e527da953ca87d4b26bc23a0d5f77 100644 (file)
@@ -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)
index af72e78aa71ebbab8f14d1a7c666204c51704af5..03dae77d8848d75404f76b4b8ac99279401f4627 100644 (file)
@@ -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(&regs->canctl1, in_8(&regs->canctl1) & ~MSCAN_CANE);
-       unregister_netdev(dev);
+       unregister_candev(dev);
 }
 EXPORT_SYMBOL(unregister_mscandev);
 
index 43775f821ef1f249316463d977f8f1a9164860c8..d63b73630d24d8bc6192ebfe78e049b467b30428 100644 (file)
@@ -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);
 
index 19ec72e5dbe58581e67d5e5ed10cfd89466b1619..a26cb1cb0c329d2c1a6657ef4ba3d00cb1cc5c56 100644 (file)
@@ -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)
index 5db4c2e8dce7e2e7336e47513127356815aa60ba..686b31e05d1497cefdb009c84bc91ed5b126cf32 100644 (file)
@@ -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);