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