]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - net/wireless/reg.c
cfg80211: separate intersection section in __set_regdom()
[linux-2.6-omap-h63xx.git] / net / wireless / reg.c
index 290ececd4f1189888a2280d43ab68a8b751d4824..845e2d32663265001ad7a5e16f3635ffac1a4362 100644 (file)
@@ -826,10 +826,6 @@ static int __set_regdom(const struct ieee80211_regdomain *rd)
        if (WARN_ON(!reg_is_valid_request(rd->alpha2)))
                return -EINVAL;
 
-       reset_regdomains();
-
-       /* Country IE parsing coming soon */
-
        if (!is_valid_rd(rd)) {
                printk(KERN_ERR "cfg80211: Invalid "
                        "regulatory domain detected:\n");
@@ -837,16 +833,33 @@ static int __set_regdom(const struct ieee80211_regdomain *rd)
                return -EINVAL;
        }
 
-       if (unlikely(last_request->intersect)) {
+       if (!last_request->intersect) {
+               reset_regdomains();
+               cfg80211_regdomain = rd;
+               return 0;
+       }
+
+       /* Intersection requires a bit more work */
+
+       if (last_request->initiator != REGDOM_SET_BY_COUNTRY_IE) {
+
                intersected_rd = regdom_intersect(rd, cfg80211_regdomain);
                if (!intersected_rd)
                        return -EINVAL;
+
+               /* We can trash what CRDA provided now */
                kfree(rd);
-               rd = intersected_rd;
+               rd = NULL;
+
+               reset_regdomains();
+               cfg80211_regdomain = intersected_rd;
+
+               return 0;
        }
 
-       /* Tada! */
-       cfg80211_regdomain = rd;
+       /* Country IE parsing coming soon */
+       reset_regdomains();
+       WARN_ON(1);
 
        return 0;
 }