mac80211: fix regdb locking issues
authorFelix Fietkau <nbd@openwrt.org>
Fri, 14 Sep 2012 13:37:30 +0000 (13:37 +0000)
committerFelix Fietkau <nbd@openwrt.org>
Fri, 14 Sep 2012 13:37:30 +0000 (13:37 +0000)
SVN-Revision: 33398

package/mac80211/patches/300-pending_work.patch
package/mac80211/patches/405-regd_no_assoc_hints.patch

index 66f1abb63ee574bd278d66d7a71c298a757eed2b..183a86221b4e60e9ec1f06cdac290cdb5438e02a 100644 (file)
        priv->tsf_high32 = 0;
        priv->tsf_low32 = 0;
  
+--- a/net/wireless/reg.c
++++ b/net/wireless/reg.c
+@@ -352,6 +352,9 @@ static void reg_regdb_search(struct work
+       struct reg_regdb_search_request *request;
+       const struct ieee80211_regdomain *curdom, *regdom;
+       int i, r;
++      bool set_reg = false;
++
++      mutex_lock(&cfg80211_mutex);
+       mutex_lock(&reg_regdb_search_mutex);
+       while (!list_empty(&reg_regdb_search_list)) {
+@@ -367,9 +370,7 @@ static void reg_regdb_search(struct work
+                               r = reg_copy_regd(&regdom, curdom);
+                               if (r)
+                                       break;
+-                              mutex_lock(&cfg80211_mutex);
+-                              set_regdom(regdom);
+-                              mutex_unlock(&cfg80211_mutex);
++                              set_reg = true;
+                               break;
+                       }
+               }
+@@ -377,6 +378,11 @@ static void reg_regdb_search(struct work
+               kfree(request);
+       }
+       mutex_unlock(&reg_regdb_search_mutex);
++
++      if (set_reg)
++              set_regdom(regdom);
++
++      mutex_unlock(&cfg80211_mutex);
+ }
+ static DECLARE_WORK(reg_regdb_work, reg_regdb_search);
index 2e2ba93c5023fc6e2d1de693738496b750e47f65..8a5c2a2e33cc9e1b8a3b06356190cd102d45051b 100644 (file)
@@ -1,6 +1,6 @@
 --- a/net/wireless/reg.c
 +++ b/net/wireless/reg.c
-@@ -1790,6 +1790,8 @@ void regulatory_hint_11d(struct wiphy *w
+@@ -1796,6 +1796,8 @@ void regulatory_hint_11d(struct wiphy *w
        enum environment_cap env = ENVIRON_ANY;
        struct regulatory_request *request;
  
@@ -9,7 +9,7 @@
        mutex_lock(&reg_mutex);
  
        if (unlikely(!last_request))
-@@ -2024,6 +2026,8 @@ static void restore_regulatory_settings(
+@@ -2030,6 +2032,8 @@ static void restore_regulatory_settings(
  
  void regulatory_hint_disconnect(void)
  {