Search Linux Wireless

[PATCH] ath6kl: fix device registration ordering

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Defer device registration to cfg80211 until it is ready.
This fixes a race against udev whereby device events
(both udev and RTNL) might be emitted with an unregistered
device specification (wlan%d).

This fixes a race on ath6kl on systems where the device
boots up really quickly to the the point udev and the
respective userspace daemon tries to start mucking with
the device prior to the device being initialized properly.

This fixes this bug:

http://code.google.com/p/chromium-os/issues/detail?id=13159

Without this loading of ath6kl will fail.

Cc: stable@xxxxxxxxxx
Cc: Naveen Singh <naveen.singh@xxxxxxxxxxx>
Signed-off-by: Luis R. Rodriguez <lrodriguez@xxxxxxxxxxx>
---
 drivers/staging/ath6kl/os/linux/ar6000_drv.c |    8 ++++++++
 drivers/staging/ath6kl/os/linux/cfg80211.c   |    9 ---------
 2 files changed, 8 insertions(+), 9 deletions(-)

diff --git a/drivers/staging/ath6kl/os/linux/ar6000_drv.c b/drivers/staging/ath6kl/os/linux/ar6000_drv.c
index 6ca147f..67e89c4 100644
--- a/drivers/staging/ath6kl/os/linux/ar6000_drv.c
+++ b/drivers/staging/ath6kl/os/linux/ar6000_drv.c
@@ -1842,11 +1842,19 @@ ar6000_avail_ev(void *context, void *hif_handle)
                     dev->name, (unsigned long)ar->arHifDevice, (unsigned long)dev, device_index,
                     (unsigned long)ar));
 
+#ifdef ATH6K_CONFIG_CFG80211
+	init_status = wiphy_register(wdev->wiphy);
+#endif
+
 avail_ev_failed :
     if (init_status) {
         if (bmienable) { 
             ar6000_sysfs_bmi_deinit(ar);  
         }
+#ifdef ATH6K_CONFIG_CFG80211
+        ar6k_cfg80211_deinit(ar);
+#endif
+
     }
 
     return init_status;
diff --git a/drivers/staging/ath6kl/os/linux/cfg80211.c b/drivers/staging/ath6kl/os/linux/cfg80211.c
index 1f799c1..17a572a 100644
--- a/drivers/staging/ath6kl/os/linux/cfg80211.c
+++ b/drivers/staging/ath6kl/os/linux/cfg80211.c
@@ -1416,7 +1416,6 @@ cfg80211_ops ar6k_cfg80211_ops = {
 struct wireless_dev *
 ar6k_cfg80211_init(struct device *dev)
 {
-    int ret = 0;
     struct wireless_dev *wdev;
 
     AR_DEBUG_PRINTF(ATH_DEBUG_INFO, ("%s: \n", __func__));
@@ -1451,14 +1450,6 @@ ar6k_cfg80211_init(struct device *dev)
     wdev->wiphy->cipher_suites = cipher_suites;
     wdev->wiphy->n_cipher_suites = ARRAY_SIZE(cipher_suites);
 
-    ret = wiphy_register(wdev->wiphy);
-    if(ret < 0) {
-        AR_DEBUG_PRINTF(ATH_DEBUG_ERR,
-                        ("%s: Couldn't register wiphy device\n", __func__));
-        wiphy_free(wdev->wiphy);
-        return ERR_PTR(ret);
-    }
-
     return wdev;
 }
 
-- 
1.7.4.15.g7811d

--
To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Linux Host AP]     [ATH6KL]     [Linux Bluetooth]     [Linux Netdev]     [Kernel Newbies]     [Linux Kernel]     [IDE]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux ATA RAID]     [Samba]     [Device Mapper]
  Powered by Linux