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
}
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
*
}
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);
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;
kfree(priv->spi_rx_buf);
}
- unregister_netdev(net);
+ unregister_candev(net);
free_candev(net);
if (pdata->power_enable)
mscan_set_mode(dev, MSCAN_INIT_MODE);
- return register_netdev(dev);
+ return register_candev(dev);
}
EXPORT_SYMBOL(register_mscandev);
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);
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);
void unregister_sja1000dev(struct net_device *dev)
{
set_reset_mode(dev);
- unregister_netdev(dev);
+ unregister_candev(dev);
}
EXPORT_SYMBOL(unregister_sja1000dev);
{
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;
}
return 0;
sysfs_failed:
- unregister_netdev(priv->netdev);
+ unregister_candev(priv->netdev);
reg_failed:
return EINVAL;
}
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)
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);