]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - net/wireless/reg.c
Merge branch 'omap-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/tmlind...
[linux-2.6-omap-h63xx.git] / net / wireless / reg.c
index 5fbeab50996f84ecedf65d87e78a441141173c35..626dbb688499bd9dafa0b963305df65d3ac0c04a 100644 (file)
@@ -68,7 +68,7 @@ static struct list_head regulatory_requests;
 /* Central wireless core regulatory domains, we only need two,
  * the current one and a world regulatory domain in case we have no
  * information to give us an alpha2 */
-static struct ieee80211_regdomain *cfg80211_regdomain;
+static const struct ieee80211_regdomain *cfg80211_regdomain;
 
 /* We keep a static world regulatory domain in case of the absence of CRDA */
 static const struct ieee80211_regdomain world_regdom = {
@@ -81,8 +81,8 @@ static const struct ieee80211_regdomain world_regdom = {
        }
 };
 
-static struct ieee80211_regdomain *cfg80211_world_regdom =
-       (struct ieee80211_regdomain *) &world_regdom;
+static const struct ieee80211_regdomain *cfg80211_world_regdom =
+       &world_regdom;
 
 #ifdef CONFIG_WIRELESS_OLD_REGULATORY
 static char *ieee80211_regdom = "US";
@@ -168,46 +168,41 @@ static const struct ieee80211_regdomain *static_regdom(char *alpha2)
        return &us_regdom;
 }
 
-static bool is_old_static_regdom(struct ieee80211_regdomain *rd)
+static bool is_old_static_regdom(const struct ieee80211_regdomain *rd)
 {
        if (rd == &us_regdom || rd == &jp_regdom || rd == &eu_regdom)
                return true;
        return false;
 }
-
-/* The old crap never deals with a world regulatory domain, it only
- * deals with the static regulatory domain passed and if possible
- * an updated "US" or "JP" regulatory domain. We do however store the
- * old static regulatory domain in cfg80211_world_regdom for convenience
- * of use here */
-static void reset_regdomains_static(void)
+#else
+static inline bool is_old_static_regdom(const struct ieee80211_regdomain *rd)
 {
-       if (!is_old_static_regdom(cfg80211_regdomain))
-               kfree(cfg80211_regdomain);
-       /* This is setting the regdom to the old static regdom */
-       cfg80211_regdomain =
-               (struct ieee80211_regdomain *) cfg80211_world_regdom;
+       return false;
 }
-#else
+#endif
+
 static void reset_regdomains(void)
 {
-       if (cfg80211_world_regdom && cfg80211_world_regdom != &world_regdom) {
-               if (cfg80211_world_regdom == cfg80211_regdomain) {
-                       kfree(cfg80211_regdomain);
-               } else {
-                       kfree(cfg80211_world_regdom);
-                       kfree(cfg80211_regdomain);
-               }
-       } else if (cfg80211_regdomain && cfg80211_regdomain != &world_regdom)
-               kfree(cfg80211_regdomain);
+       /* avoid freeing static information or freeing something twice */
+       if (cfg80211_regdomain == cfg80211_world_regdom)
+               cfg80211_regdomain = NULL;
+       if (cfg80211_world_regdom == &world_regdom)
+               cfg80211_world_regdom = NULL;
+       if (cfg80211_regdomain == &world_regdom)
+               cfg80211_regdomain = NULL;
+       if (is_old_static_regdom(cfg80211_regdomain))
+               cfg80211_regdomain = NULL;
+
+       kfree(cfg80211_regdomain);
+       kfree(cfg80211_world_regdom);
 
-       cfg80211_world_regdom = (struct ieee80211_regdomain *) &world_regdom;
+       cfg80211_world_regdom = &world_regdom;
        cfg80211_regdomain = NULL;
 }
 
 /* Dynamic world regulatory domain requested by the wireless
  * core upon initialization */
-static void update_world_regdomain(struct ieee80211_regdomain *rd)
+static void update_world_regdomain(const struct ieee80211_regdomain *rd)
 {
        BUG_ON(list_empty(&regulatory_requests));
 
@@ -216,9 +211,8 @@ static void update_world_regdomain(struct ieee80211_regdomain *rd)
        cfg80211_world_regdom = rd;
        cfg80211_regdomain = rd;
 }
-#endif
 
-bool is_world_regdom(char *alpha2)
+bool is_world_regdom(const char *alpha2)
 {
        if (!alpha2)
                return false;
@@ -227,7 +221,7 @@ bool is_world_regdom(char *alpha2)
        return false;
 }
 
-static bool is_alpha2_set(char *alpha2)
+static bool is_alpha2_set(const char *alpha2)
 {
        if (!alpha2)
                return false;
@@ -244,7 +238,7 @@ static bool is_alpha_upper(char letter)
        return false;
 }
 
-static bool is_unknown_alpha2(char *alpha2)
+static bool is_unknown_alpha2(const char *alpha2)
 {
        if (!alpha2)
                return false;
@@ -255,7 +249,7 @@ static bool is_unknown_alpha2(char *alpha2)
        return false;
 }
 
-static bool is_an_alpha2(char *alpha2)
+static bool is_an_alpha2(const char *alpha2)
 {
        if (!alpha2)
                return false;
@@ -264,7 +258,7 @@ static bool is_an_alpha2(char *alpha2)
        return false;
 }
 
-static bool alpha2_equal(char *alpha2_x, char *alpha2_y)
+static bool alpha2_equal(const char *alpha2_x, const char *alpha2_y)
 {
        if (!alpha2_x || !alpha2_y)
                return false;
@@ -274,7 +268,7 @@ static bool alpha2_equal(char *alpha2_x, char *alpha2_y)
        return false;
 }
 
-static bool regdom_changed(char *alpha2)
+static bool regdom_changed(const char *alpha2)
 {
        if (!cfg80211_regdomain)
                return true;
@@ -297,12 +291,8 @@ static int call_crda(const char *alpha2)
                printk(KERN_INFO "cfg80211: Calling CRDA for country: %c%c\n",
                        alpha2[0], alpha2[1]);
        else
-#ifdef CONFIG_WIRELESS_OLD_REGULATORY
-               return -EINVAL;
-#else
                printk(KERN_INFO "cfg80211: Calling CRDA to update world "
                        "regulatory domain\n");
-#endif
 
        country_env[8] = alpha2[0];
        country_env[9] = alpha2[1];
@@ -405,7 +395,7 @@ static int ignore_request(struct wiphy *wiphy, enum reg_set_by set_by,
        }
 }
 
-static bool __reg_is_valid_request(char *alpha2,
+static bool __reg_is_valid_request(const char *alpha2,
        struct regulatory_request **request)
 {
        struct regulatory_request *req;
@@ -421,16 +411,16 @@ static bool __reg_is_valid_request(char *alpha2,
 }
 
 /* Used by nl80211 before kmalloc'ing our regulatory domain */
-bool reg_is_valid_request(char *alpha2)
+bool reg_is_valid_request(const char *alpha2)
 {
        struct regulatory_request *request = NULL;
        return  __reg_is_valid_request(alpha2, &request);
 }
 
 /* Sanity check on a regulatory rule */
-static bool is_valid_reg_rule(struct ieee80211_reg_rule *rule)
+static bool is_valid_reg_rule(const struct ieee80211_reg_rule *rule)
 {
-       struct ieee80211_freq_range *freq_range = &rule->freq_range;
+       const struct ieee80211_freq_range *freq_range = &rule->freq_range;
        u32 freq_diff;
 
        if (freq_range->start_freq_khz == 0 || freq_range->end_freq_khz == 0)
@@ -447,9 +437,9 @@ static bool is_valid_reg_rule(struct ieee80211_reg_rule *rule)
        return true;
 }
 
-static bool is_valid_rd(struct ieee80211_regdomain *rd)
+static bool is_valid_rd(const struct ieee80211_regdomain *rd)
 {
-       struct ieee80211_reg_rule *reg_rule = NULL;
+       const struct ieee80211_reg_rule *reg_rule = NULL;
        unsigned int i;
 
        if (!rd->n_reg_rules)
@@ -661,12 +651,12 @@ unlock_and_exit:
 EXPORT_SYMBOL(regulatory_hint);
 
 
-static void print_rd_rules(struct ieee80211_regdomain *rd)
+static void print_rd_rules(const struct ieee80211_regdomain *rd)
 {
        unsigned int i;
-       struct ieee80211_reg_rule *reg_rule = NULL;
-       struct ieee80211_freq_range *freq_range = NULL;
-       struct ieee80211_power_rule *power_rule = NULL;
+       const struct ieee80211_reg_rule *reg_rule = NULL;
+       const struct ieee80211_freq_range *freq_range = NULL;
+       const struct ieee80211_power_rule *power_rule = NULL;
 
        printk(KERN_INFO "\t(start_freq - end_freq @ bandwidth), "
                "(max_antenna_gain, max_eirp)\n");
@@ -696,7 +686,7 @@ static void print_rd_rules(struct ieee80211_regdomain *rd)
        }
 }
 
-static void print_regdomain(struct ieee80211_regdomain *rd)
+static void print_regdomain(const struct ieee80211_regdomain *rd)
 {
 
        if (is_world_regdom(rd->alpha2))
@@ -715,33 +705,25 @@ static void print_regdomain(struct ieee80211_regdomain *rd)
        print_rd_rules(rd);
 }
 
-void print_regdomain_info(struct ieee80211_regdomain *rd)
+void print_regdomain_info(const struct ieee80211_regdomain *rd)
 {
        printk(KERN_INFO "cfg80211: Regulatory domain: %c%c\n",
                rd->alpha2[0], rd->alpha2[1]);
        print_rd_rules(rd);
 }
 
-static int __set_regdom(struct ieee80211_regdomain *rd)
+static int __set_regdom(const struct ieee80211_regdomain *rd)
 {
        struct regulatory_request *request = NULL;
 
        /* Some basic sanity checks first */
 
-#ifdef CONFIG_WIRELESS_OLD_REGULATORY
-       /* We ignore the world regdom with the old static regdomains setup
-        * as there is no point to it with static regulatory definitions :(
-        * Don't worry this shit will be removed soon... */
-       if (is_world_regdom(rd->alpha2))
-               return -EINVAL;
-#else
        if (is_world_regdom(rd->alpha2)) {
                if (WARN_ON(!__reg_is_valid_request(rd->alpha2, &request)))
                        return -EINVAL;
                update_world_regdomain(rd);
                return 0;
        }
-#endif
 
        if (!is_alpha2_set(rd->alpha2) && !is_an_alpha2(rd->alpha2) &&
                        !is_unknown_alpha2(rd->alpha2))
@@ -750,15 +732,10 @@ static int __set_regdom(struct ieee80211_regdomain *rd)
        if (list_empty(&regulatory_requests))
                return -EINVAL;
 
-#ifdef CONFIG_WIRELESS_OLD_REGULATORY
-       /* Static "US" and "JP" will be overridden, but just once */
+       /* allow overriding the static definitions if CRDA is present */
        if (!is_old_static_regdom(cfg80211_regdomain) &&
-                       !regdom_changed(rd->alpha2))
-               return -EINVAL;
-#else
-       if (!regdom_changed(rd->alpha2))
+           !regdom_changed(rd->alpha2))
                return -EINVAL;
-#endif
 
        /* Now lets set the regulatory domain, update all driver channels
         * and finally inform them of what we have done, in case they want
@@ -768,11 +745,7 @@ static int __set_regdom(struct ieee80211_regdomain *rd)
        if (WARN_ON(!__reg_is_valid_request(rd->alpha2, &request)))
                return -EINVAL;
 
-#ifdef CONFIG_WIRELESS_OLD_REGULATORY
-       reset_regdomains_static();
-#else
        reset_regdomains();
-#endif
 
        /* Country IE parsing coming soon */
        switch (request->initiator) {
@@ -804,7 +777,7 @@ static int __set_regdom(struct ieee80211_regdomain *rd)
  * multiple drivers can be ironed out later. Caller must've already
  * kmalloc'd the rd structure. If this calls fails you should kfree()
  * the passed rd. Caller must hold cfg80211_drv_mutex */
-int set_regdom(struct ieee80211_regdomain *rd)
+int set_regdom(const struct ieee80211_regdomain *rd)
 {
        struct regulatory_request *this_request = NULL, *prev_request = NULL;
        int r;
@@ -857,12 +830,9 @@ int regulatory_init(void)
                return PTR_ERR(reg_pdev);
 
 #ifdef CONFIG_WIRELESS_OLD_REGULATORY
-       cfg80211_regdomain =
-               (struct ieee80211_regdomain *) static_regdom(ieee80211_regdom);
-       /* Used during reset_regdomains_static() */
-       cfg80211_world_regdom = cfg80211_regdomain;
+       cfg80211_regdomain = static_regdom(ieee80211_regdom);
 
-       printk(KERN_INFO "cfg80211: Using old static regulatory domain:\n");
+       printk(KERN_INFO "cfg80211: Using static regulatory domain info\n");
        print_regdomain_info(cfg80211_regdomain);
        /* The old code still requests for a new regdomain and if
         * you have CRDA you get it updated, otherwise you get
@@ -872,8 +842,7 @@ int regulatory_init(void)
                err = __regulatory_hint(NULL, REGDOM_SET_BY_CORE,
                                        ieee80211_regdom, NULL);
 #else
-       cfg80211_regdomain =
-               (struct ieee80211_regdomain *) cfg80211_world_regdom;
+       cfg80211_regdomain = cfg80211_world_regdom;
 
        err = __regulatory_hint(NULL, REGDOM_SET_BY_CORE, "00", NULL);
        if (err)
@@ -891,11 +860,7 @@ void regulatory_exit(void)
 
        mutex_lock(&cfg80211_drv_mutex);
 
-#ifdef CONFIG_WIRELESS_OLD_REGULATORY
-       reset_regdomains_static();
-#else
        reset_regdomains();
-#endif
 
        list_for_each_entry_safe(req, req_tmp, &regulatory_requests, list) {
                list_del(&req->list);