|
@@ -29,7 +29,7 @@ static const char fmt_ulong[] = "%lu\n";
|
|
|
|
|
|
static inline int dev_isalive(const struct net_device *dev)
|
|
|
{
|
|
|
- return dev->reg_state == NETREG_REGISTERED;
|
|
|
+ return dev->reg_state <= NETREG_REGISTERED;
|
|
|
}
|
|
|
|
|
|
/* use same locking rules as GIF* ioctl's */
|
|
@@ -445,58 +445,33 @@ static struct class net_class = {
|
|
|
|
|
|
void netdev_unregister_sysfs(struct net_device * net)
|
|
|
{
|
|
|
- struct class_device * class_dev = &(net->class_dev);
|
|
|
-
|
|
|
- if (net->get_stats)
|
|
|
- sysfs_remove_group(&class_dev->kobj, &netstat_group);
|
|
|
-
|
|
|
-#ifdef WIRELESS_EXT
|
|
|
- if (net->get_wireless_stats || (net->wireless_handlers &&
|
|
|
- net->wireless_handlers->get_wireless_stats))
|
|
|
- sysfs_remove_group(&class_dev->kobj, &wireless_group);
|
|
|
-#endif
|
|
|
- class_device_del(class_dev);
|
|
|
-
|
|
|
+ class_device_del(&(net->class_dev));
|
|
|
}
|
|
|
|
|
|
/* Create sysfs entries for network device. */
|
|
|
int netdev_register_sysfs(struct net_device *net)
|
|
|
{
|
|
|
struct class_device *class_dev = &(net->class_dev);
|
|
|
- int ret;
|
|
|
+ struct attribute_group **groups = net->sysfs_groups;
|
|
|
|
|
|
+ class_device_initialize(class_dev);
|
|
|
class_dev->class = &net_class;
|
|
|
class_dev->class_data = net;
|
|
|
+ class_dev->groups = groups;
|
|
|
|
|
|
+ BUILD_BUG_ON(BUS_ID_SIZE < IFNAMSIZ);
|
|
|
strlcpy(class_dev->class_id, net->name, BUS_ID_SIZE);
|
|
|
- if ((ret = class_device_register(class_dev)))
|
|
|
- goto out;
|
|
|
|
|
|
- if (net->get_stats &&
|
|
|
- (ret = sysfs_create_group(&class_dev->kobj, &netstat_group)))
|
|
|
- goto out_unreg;
|
|
|
+ if (net->get_stats)
|
|
|
+ *groups++ = &netstat_group;
|
|
|
|
|
|
#ifdef WIRELESS_EXT
|
|
|
- if (net->get_wireless_stats || (net->wireless_handlers &&
|
|
|
- net->wireless_handlers->get_wireless_stats)) {
|
|
|
- ret = sysfs_create_group(&class_dev->kobj, &wireless_group);
|
|
|
- if (ret)
|
|
|
- goto out_cleanup;
|
|
|
- }
|
|
|
- return 0;
|
|
|
-out_cleanup:
|
|
|
- if (net->get_stats)
|
|
|
- sysfs_remove_group(&class_dev->kobj, &netstat_group);
|
|
|
-#else
|
|
|
- return 0;
|
|
|
+ if (net->get_wireless_stats
|
|
|
+ || (net->wireless_handlers && net->wireless_handlers->get_wireless_stats))
|
|
|
+ *groups++ = &wireless_group;
|
|
|
#endif
|
|
|
|
|
|
-out_unreg:
|
|
|
- printk(KERN_WARNING "%s: sysfs attribute registration failed %d\n",
|
|
|
- net->name, ret);
|
|
|
- class_device_unregister(class_dev);
|
|
|
-out:
|
|
|
- return ret;
|
|
|
+ return class_device_add(class_dev);
|
|
|
}
|
|
|
|
|
|
int netdev_sysfs_init(void)
|