Lately, delayed sysfs registration of net_device (in netdev_run_todo) was
removed. This allows us to remove hack that used class interface for sysfs
registration.

Signed-off-by: Jiri Benc <[EMAIL PROTECTED]>

---

 net/d80211/ieee80211.c       |   18 +++++++++++++++--
 net/d80211/ieee80211_i.h     |    2 ++
 net/d80211/ieee80211_iface.c |   15 ++++++++++++++
 net/d80211/ieee80211_sysfs.c |   45 ++++++------------------------------------
 4 files changed, 39 insertions(+), 41 deletions(-)

beb1533d9181d1c6d195de5743517b3559bfd9f9
diff --git a/net/d80211/ieee80211.c b/net/d80211/ieee80211.c
index f549098..9724a49 100644
--- a/net/d80211/ieee80211.c
+++ b/net/d80211/ieee80211.c
@@ -4197,9 +4197,21 @@ int ieee80211_register_hw(struct net_dev
 
        if (hw->fraglist)
                dev->features |= NETIF_F_FRAGLIST;
-       result = register_netdev(dev);
-       if (result < 0)
+       rtnl_lock();
+       result = dev_alloc_name(dev, dev->name);
+       if (result < 0) {
+               rtnl_unlock();
+               goto fail_dev;
+       }
+       result = register_netdevice(dev);
+       if (result < 0) {
+               rtnl_unlock();
                goto fail_dev;
+       }
+       result = ieee80211_sysfs_add_netdevice(dev);
+       rtnl_unlock();
+       if (result < 0)
+               goto fail_if_sysfs;
 
        if (rate_control_initialize(local) < 0) {
                printk(KERN_DEBUG "%s: Failed to initialize rate control "
@@ -4223,6 +4235,8 @@ int ieee80211_register_hw(struct net_dev
        return 0;
 
 fail_rate:
+       ieee80211_sysfs_remove_netdevice(dev);
+fail_if_sysfs:
        unregister_netdev(dev);
 fail_dev:
        sta_info_stop(local);
diff --git a/net/d80211/ieee80211_i.h b/net/d80211/ieee80211_i.h
index 94e151d..19d9d98 100644
--- a/net/d80211/ieee80211_i.h
+++ b/net/d80211/ieee80211_i.h
@@ -599,6 +599,8 @@ int ieee80211_if_add_mgmt(struct net_dev
 void ieee80211_if_del_mgmt(struct net_device *dev);
 
 /* ieee80211_sysfs.c */
+int ieee80211_sysfs_add_netdevice(struct net_device *dev);
+void ieee80211_sysfs_remove_netdevice(struct net_device *dev);
 int ieee80211_register_sysfs(struct ieee80211_local *local);
 void ieee80211_unregister_sysfs(struct ieee80211_local *local);
 int ieee80211_sysfs_init(void);
diff --git a/net/d80211/ieee80211_iface.c b/net/d80211/ieee80211_iface.c
index 6631738..d534fe4 100644
--- a/net/d80211/ieee80211_iface.c
+++ b/net/d80211/ieee80211_iface.c
@@ -76,6 +76,13 @@ int ieee80211_if_add(struct net_device *
        ret = register_netdevice(ndev);
        if (ret)
                goto fail;
+       ret = ieee80211_sysfs_add_netdevice(ndev);
+       if (ret) {
+               /* ndev will be freed by ndev->destructor */
+               unregister_netdevice(ndev);
+               *new_dev = NULL;
+               return ret;
+       }
 
        list_add(&sdata->list, &local->sub_if_list);
        ieee80211_proc_init_virtual(ndev);
@@ -123,10 +130,16 @@ int ieee80211_if_add_mgmt(struct net_dev
        ret = register_netdevice(ndev);
        if (ret)
                goto fail;
+       ret = ieee80211_sysfs_add_netdevice(ndev);
+       if (ret)
+               goto fail_sysfs;
        if (local->open_count > 0)
                dev_open(ndev);
        local->apdev = ndev;
        return 0;
+
+fail_sysfs:
+       unregister_netdevice(ndev);
 fail:
        free_netdev(ndev);
        return ret;
@@ -139,6 +152,7 @@ void ieee80211_if_del_mgmt(struct net_de
 
        ASSERT_RTNL();
        apdev = local->apdev;
+       ieee80211_sysfs_remove_netdevice(apdev);
        local->apdev = NULL;
        unregister_netdevice(apdev);
 }
@@ -293,6 +307,7 @@ void __ieee80211_if_del(struct ieee80211
        ieee80211_if_reinit(dev);
        list_del(&sdata->list);
        ieee80211_proc_deinit_virtual(dev);
+       ieee80211_sysfs_remove_netdevice(dev);
        unregister_netdevice(dev);
        /* Except master interface, the net_device will be freed by
         * net_device->destructor (i. e. ieee80211_if_free). */
diff --git a/net/d80211/ieee80211_sysfs.c b/net/d80211/ieee80211_sysfs.c
index 463f9aa..5c7af9f 100644
--- a/net/d80211/ieee80211_sysfs.c
+++ b/net/d80211/ieee80211_sysfs.c
@@ -98,60 +98,27 @@ void ieee80211_unregister_sysfs(struct i
        class_device_del(&local->class_dev);
 }
 
-static int ieee80211_add_netdevice(struct class_device *cd,
-                                  struct class_interface *cintf)
+int ieee80211_sysfs_add_netdevice(struct net_device *dev)
 {
-       struct net_device *dev = container_of(cd, struct net_device, class_dev);
        struct ieee80211_local *local = dev->priv;
 
-       if (ieee80211_dev_find_index(local) < 0)
-               return 0;
-       return sysfs_create_link(&cd->kobj, &local->class_dev.kobj, "wiphy");
+       return sysfs_create_link(&dev->class_dev.kobj, &local->class_dev.kobj,
+                                "wiphy");
 }
 
-static void ieee80211_remove_netdevice(struct class_device *cd,
-                                      struct class_interface *cintf)
+void ieee80211_sysfs_remove_netdevice(struct net_device *dev)
 {
-       struct net_device *dev = container_of(cd, struct net_device, class_dev);
        struct ieee80211_local *local = dev->priv;
 
-       if (ieee80211_dev_find_index(local) >= 0)
-               sysfs_remove_link(&cd->kobj, "wiphy");
-}
-
-static struct class_interface ieee80211_wiphy_cintf = {
-       .add = ieee80211_add_netdevice,
-       .remove = ieee80211_remove_netdevice,
-};
-
-/* Adds class interface watching for new network devices and adding "wiphy"
- * attribute (symlink) to them. */
-static int ieee80211_register_wiphy_cintf(void)
-{
-       ieee80211_wiphy_cintf.class = loopback_dev.class_dev.class;
-       return class_interface_register(&ieee80211_wiphy_cintf);
-}
-
-static void ieee80211_unregister_wiphy_cintf(void)
-{
-       class_interface_unregister(&ieee80211_wiphy_cintf);
+       sysfs_remove_link(&dev->class_dev.kobj, "wiphy");
 }
 
 int ieee80211_sysfs_init(void)
 {
-       int result;
-
-       result = class_register(&ieee80211_class);
-       if (result)
-               return result;
-       result = ieee80211_register_wiphy_cintf();
-       if (result)
-               class_unregister(&ieee80211_class);
-       return result;
+       return class_register(&ieee80211_class);
 }
 
 void ieee80211_sysfs_deinit(void)
 {
-       ieee80211_unregister_wiphy_cintf();
        class_unregister(&ieee80211_class);
 }
-- 
1.3.0

-
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to