cfg80211: avoid flushing the global workqueue for core reg hints
[safe/jmp/linux-2.6] / net / wireless / reg.c
index baa898a..5dcda28 100644 (file)
 #include <net/cfg80211.h>
 #include "core.h"
 #include "reg.h"
+#include "regdb.h"
 #include "nl80211.h"
 
+#ifdef CONFIG_CFG80211_REG_DEBUG
+#define REG_DBG_PRINT(format, args...) \
+       do { \
+               printk(KERN_DEBUG format , ## args); \
+       } while (0)
+#else
+#define REG_DBG_PRINT(args...)
+#endif
+
 /* Receipt of information from last regulatory request */
 static struct regulatory_request *last_request;
 
@@ -128,78 +138,6 @@ static char *ieee80211_regdom = "00";
 module_param(ieee80211_regdom, charp, 0444);
 MODULE_PARM_DESC(ieee80211_regdom, "IEEE 802.11 regulatory domain code");
 
-#ifdef CONFIG_WIRELESS_OLD_REGULATORY
-/*
- * We assume 40 MHz bandwidth for the old regulatory work.
- * We make emphasis we are using the exact same frequencies
- * as before
- */
-
-static const struct ieee80211_regdomain us_regdom = {
-       .n_reg_rules = 6,
-       .alpha2 =  "US",
-       .reg_rules = {
-               /* IEEE 802.11b/g, channels 1..11 */
-               REG_RULE(2412-10, 2462+10, 40, 6, 27, 0),
-               /* IEEE 802.11a, channel 36..48 */
-               REG_RULE(5180-10, 5240+10, 40, 6, 17, 0),
-               /* IEEE 802.11a, channels 48..64 */
-               REG_RULE(5260-10, 5320+10, 40, 6, 20, NL80211_RRF_DFS),
-               /* IEEE 802.11a, channels 100..124 */
-               REG_RULE(5500-10, 5590+10, 40, 6, 20, NL80211_RRF_DFS),
-               /* IEEE 802.11a, channels 132..144 */
-               REG_RULE(5660-10, 5700+10, 40, 6, 20, NL80211_RRF_DFS),
-               /* IEEE 802.11a, channels 149..165, outdoor */
-               REG_RULE(5745-10, 5825+10, 40, 6, 30, 0),
-       }
-};
-
-static const struct ieee80211_regdomain jp_regdom = {
-       .n_reg_rules = 6,
-       .alpha2 =  "JP",
-       .reg_rules = {
-               /* IEEE 802.11b/g, channels 1..11 */
-               REG_RULE(2412-10, 2462+10, 40, 6, 20, 0),
-               /* IEEE 802.11b/g, channels 12..13 */
-               REG_RULE(2467-10, 2472+10, 20, 6, 20, 0),
-               /* IEEE 802.11b/g, channel 14 */
-               REG_RULE(2484-10, 2484+10, 20, 6, 20, NL80211_RRF_NO_OFDM),
-               /* IEEE 802.11a, channels 36..48 */
-               REG_RULE(5180-10, 5240+10, 40, 6, 20, 0),
-               /* IEEE 802.11a, channels 52..64 */
-               REG_RULE(5260-10, 5320+10, 40, 6, 20, NL80211_RRF_DFS),
-               /* IEEE 802.11a, channels 100..144 */
-               REG_RULE(5500-10, 5700+10, 40, 6, 23, NL80211_RRF_DFS),
-       }
-};
-
-static const struct ieee80211_regdomain *static_regdom(char *alpha2)
-{
-       if (alpha2[0] == 'U' && alpha2[1] == 'S')
-               return &us_regdom;
-       if (alpha2[0] == 'J' && alpha2[1] == 'P')
-               return &jp_regdom;
-       /* Use world roaming rules for "EU", since it was a pseudo
-          domain anyway... */
-       if (alpha2[0] == 'E' && alpha2[1] == 'U')
-               return &world_regdom;
-       /* Default, world roaming rules */
-       return &world_regdom;
-}
-
-static bool is_old_static_regdom(const struct ieee80211_regdomain *rd)
-{
-       if (rd == &us_regdom || rd == &jp_regdom || rd == &world_regdom)
-               return true;
-       return false;
-}
-#else
-static inline bool is_old_static_regdom(const struct ieee80211_regdomain *rd)
-{
-       return false;
-}
-#endif
-
 static void reset_regdomains(void)
 {
        /* avoid freeing static information or freeing something twice */
@@ -209,8 +147,6 @@ static void reset_regdomains(void)
                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);
@@ -335,6 +271,98 @@ static bool country_ie_integrity_changes(u32 checksum)
        return false;
 }
 
+static int reg_copy_regd(const struct ieee80211_regdomain **dst_regd,
+                        const struct ieee80211_regdomain *src_regd)
+{
+       struct ieee80211_regdomain *regd;
+       int size_of_regd = 0;
+       unsigned int i;
+
+       size_of_regd = sizeof(struct ieee80211_regdomain) +
+         ((src_regd->n_reg_rules + 1) * sizeof(struct ieee80211_reg_rule));
+
+       regd = kzalloc(size_of_regd, GFP_KERNEL);
+       if (!regd)
+               return -ENOMEM;
+
+       memcpy(regd, src_regd, sizeof(struct ieee80211_regdomain));
+
+       for (i = 0; i < src_regd->n_reg_rules; i++)
+               memcpy(&regd->reg_rules[i], &src_regd->reg_rules[i],
+                       sizeof(struct ieee80211_reg_rule));
+
+       *dst_regd = regd;
+       return 0;
+}
+
+#ifdef CONFIG_CFG80211_INTERNAL_REGDB
+struct reg_regdb_search_request {
+       char alpha2[2];
+       struct list_head list;
+};
+
+static LIST_HEAD(reg_regdb_search_list);
+static DEFINE_SPINLOCK(reg_regdb_search_lock);
+
+static void reg_regdb_search(struct work_struct *work)
+{
+       struct reg_regdb_search_request *request;
+       const struct ieee80211_regdomain *curdom, *regdom;
+       int i, r;
+
+       spin_lock(&reg_regdb_search_lock);
+       while (!list_empty(&reg_regdb_search_list)) {
+               request = list_first_entry(&reg_regdb_search_list,
+                                          struct reg_regdb_search_request,
+                                          list);
+               list_del(&request->list);
+
+               for (i=0; i<reg_regdb_size; i++) {
+                       curdom = reg_regdb[i];
+
+                       if (!memcmp(request->alpha2, curdom->alpha2, 2)) {
+                               r = reg_copy_regd(&regdom, curdom);
+                               if (r)
+                                       break;
+                               spin_unlock(&reg_regdb_search_lock);
+                               mutex_lock(&cfg80211_mutex);
+                               set_regdom(regdom);
+                               mutex_unlock(&cfg80211_mutex);
+                               spin_lock(&reg_regdb_search_lock);
+                               break;
+                       }
+               }
+
+               kfree(request);
+       }
+       spin_unlock(&reg_regdb_search_lock);
+}
+
+static DECLARE_WORK(reg_regdb_work, reg_regdb_search);
+
+static void reg_regdb_query(const char *alpha2)
+{
+       struct reg_regdb_search_request *request;
+
+       if (!alpha2)
+               return;
+
+       request = kzalloc(sizeof(struct reg_regdb_search_request), GFP_KERNEL);
+       if (!request)
+               return;
+
+       memcpy(request->alpha2, alpha2, 2);
+
+       spin_lock(&reg_regdb_search_lock);
+       list_add_tail(&request->list, &reg_regdb_search_list);
+       spin_unlock(&reg_regdb_search_lock);
+
+       schedule_work(&reg_regdb_work);
+}
+#else
+static inline void reg_regdb_query(const char *alpha2) {}
+#endif /* CONFIG_CFG80211_INTERNAL_REGDB */
+
 /*
  * This lets us keep regulatory code which is updated on a regulatory
  * basis in userspace.
@@ -354,6 +382,9 @@ static int call_crda(const char *alpha2)
                printk(KERN_INFO "cfg80211: Calling CRDA to update world "
                        "regulatory domain\n");
 
+       /* query internal regulatory database (if it exists) */
+       reg_regdb_query(alpha2);
+
        country_env[8] = alpha2[0];
        country_env[9] = alpha2[1];
 
@@ -454,12 +485,212 @@ static bool freq_in_rule_band(const struct ieee80211_freq_range *freq_range,
 }
 
 /*
+ * This is a work around for sanity checking ieee80211_channel_to_frequency()'s
+ * work. ieee80211_channel_to_frequency() can for example currently provide a
+ * 2 GHz channel when in fact a 5 GHz channel was desired. An example would be
+ * an AP providing channel 8 on a country IE triplet when it sent this on the
+ * 5 GHz band, that channel is designed to be channel 8 on 5 GHz, not a 2 GHz
+ * channel.
+ *
+ * This can be removed once ieee80211_channel_to_frequency() takes in a band.
+ */
+static bool chan_in_band(int chan, enum ieee80211_band band)
+{
+       int center_freq = ieee80211_channel_to_frequency(chan);
+
+       switch (band) {
+       case IEEE80211_BAND_2GHZ:
+               if (center_freq <= 2484)
+                       return true;
+               return false;
+       case IEEE80211_BAND_5GHZ:
+               if (center_freq >= 5005)
+                       return true;
+               return false;
+       default:
+               return false;
+       }
+}
+
+/*
+ * Some APs may send a country IE triplet for each channel they
+ * support and while this is completely overkill and silly we still
+ * need to support it. We avoid making a single rule for each channel
+ * though and to help us with this we use this helper to find the
+ * actual subband end channel. These type of country IE triplet
+ * scenerios are handled then, all yielding two regulaotry rules from
+ * parsing a country IE:
+ *
+ * [1]
+ * [2]
+ * [36]
+ * [40]
+ *
+ * [1]
+ * [2-4]
+ * [5-12]
+ * [36]
+ * [40-44]
+ *
+ * [1-4]
+ * [5-7]
+ * [36-44]
+ * [48-64]
+ *
+ * [36-36]
+ * [40-40]
+ * [44-44]
+ * [48-48]
+ * [52-52]
+ * [56-56]
+ * [60-60]
+ * [64-64]
+ * [100-100]
+ * [104-104]
+ * [108-108]
+ * [112-112]
+ * [116-116]
+ * [120-120]
+ * [124-124]
+ * [128-128]
+ * [132-132]
+ * [136-136]
+ * [140-140]
+ *
+ * Returns 0 if the IE has been found to be invalid in the middle
+ * somewhere.
+ */
+static int max_subband_chan(enum ieee80211_band band,
+                           int orig_cur_chan,
+                           int orig_end_channel,
+                           s8 orig_max_power,
+                           u8 **country_ie,
+                           u8 *country_ie_len)
+{
+       u8 *triplets_start = *country_ie;
+       u8 len_at_triplet = *country_ie_len;
+       int end_subband_chan = orig_end_channel;
+
+       /*
+        * We'll deal with padding for the caller unless
+        * its not immediate and we don't process any channels
+        */
+       if (*country_ie_len == 1) {
+               *country_ie += 1;
+               *country_ie_len -= 1;
+               return orig_end_channel;
+       }
+
+       /* Move to the next triplet and then start search */
+       *country_ie += 3;
+       *country_ie_len -= 3;
+
+       if (!chan_in_band(orig_cur_chan, band))
+               return 0;
+
+       while (*country_ie_len >= 3) {
+               int end_channel = 0;
+               struct ieee80211_country_ie_triplet *triplet =
+                       (struct ieee80211_country_ie_triplet *) *country_ie;
+               int cur_channel = 0, next_expected_chan;
+
+               /* means last triplet is completely unrelated to this one */
+               if (triplet->ext.reg_extension_id >=
+                               IEEE80211_COUNTRY_EXTENSION_ID) {
+                       *country_ie -= 3;
+                       *country_ie_len += 3;
+                       break;
+               }
+
+               if (triplet->chans.first_channel == 0) {
+                       *country_ie += 1;
+                       *country_ie_len -= 1;
+                       if (*country_ie_len != 0)
+                               return 0;
+                       break;
+               }
+
+               if (triplet->chans.num_channels == 0)
+                       return 0;
+
+               /* Monitonically increasing channel order */
+               if (triplet->chans.first_channel <= end_subband_chan)
+                       return 0;
+
+               if (!chan_in_band(triplet->chans.first_channel, band))
+                       return 0;
+
+               /* 2 GHz */
+               if (triplet->chans.first_channel <= 14) {
+                       end_channel = triplet->chans.first_channel +
+                               triplet->chans.num_channels - 1;
+               }
+               else {
+                       end_channel =  triplet->chans.first_channel +
+                               (4 * (triplet->chans.num_channels - 1));
+               }
+
+               if (!chan_in_band(end_channel, band))
+                       return 0;
+
+               if (orig_max_power != triplet->chans.max_power) {
+                       *country_ie -= 3;
+                       *country_ie_len += 3;
+                       break;
+               }
+
+               cur_channel = triplet->chans.first_channel;
+
+               /* The key is finding the right next expected channel */
+               if (band == IEEE80211_BAND_2GHZ)
+                       next_expected_chan = end_subband_chan + 1;
+                else
+                       next_expected_chan = end_subband_chan + 4;
+
+               if (cur_channel != next_expected_chan) {
+                       *country_ie -= 3;
+                       *country_ie_len += 3;
+                       break;
+               }
+
+               end_subband_chan = end_channel;
+
+               /* Move to the next one */
+               *country_ie += 3;
+               *country_ie_len -= 3;
+
+               /*
+                * Padding needs to be dealt with if we processed
+                * some channels.
+                */
+               if (*country_ie_len == 1) {
+                       *country_ie += 1;
+                       *country_ie_len -= 1;
+                       break;
+               }
+
+               /* If seen, the IE is invalid */
+               if (*country_ie_len == 2)
+                       return 0;
+       }
+
+       if (end_subband_chan == orig_end_channel) {
+               *country_ie = triplets_start;
+               *country_ie_len = len_at_triplet;
+               return orig_end_channel;
+       }
+
+       return end_subband_chan;
+}
+
+/*
  * Converts a country IE to a regulatory domain. A regulatory domain
  * structure has a lot of information which the IE doesn't yet have,
  * so for the other values we use upper max values as we will intersect
  * with our userspace regulatory agent to get lower bounds.
  */
 static struct ieee80211_regdomain *country_ie_2_rd(
+                               enum ieee80211_band band,
                                u8 *country_ie,
                                u8 country_ie_len,
                                u32 *checksum)
@@ -521,10 +752,29 @@ static struct ieee80211_regdomain *country_ie_2_rd(
                        continue;
                }
 
+               /*
+                * APs can add padding to make length divisible
+                * by two, required by the spec.
+                */
+               if (triplet->chans.first_channel == 0) {
+                       country_ie++;
+                       country_ie_len--;
+                       /* This is expected to be at the very end only */
+                       if (country_ie_len != 0)
+                               return NULL;
+                       break;
+               }
+
+               if (triplet->chans.num_channels == 0)
+                       return NULL;
+
+               if (!chan_in_band(triplet->chans.first_channel, band))
+                       return NULL;
+
                /* 2 GHz */
-               if (triplet->chans.first_channel <= 14)
+               if (band == IEEE80211_BAND_2GHZ)
                        end_channel = triplet->chans.first_channel +
-                               triplet->chans.num_channels;
+                               triplet->chans.num_channels - 1;
                else
                        /*
                         * 5 GHz -- For example in country IEs if the first
@@ -539,6 +789,24 @@ static struct ieee80211_regdomain *country_ie_2_rd(
                                (4 * (triplet->chans.num_channels - 1));
 
                cur_channel = triplet->chans.first_channel;
+
+               /*
+                * Enhancement for APs that send a triplet for every channel
+                * or for whatever reason sends triplets with multiple channels
+                * separated when in fact they should be together.
+                */
+               end_channel = max_subband_chan(band,
+                                              cur_channel,
+                                              end_channel,
+                                              triplet->chans.max_power,
+                                              &country_ie,
+                                              &country_ie_len);
+               if (!end_channel)
+                       return NULL;
+
+               if (!chan_in_band(end_channel, band))
+                       return NULL;
+
                cur_sub_max_channel = end_channel;
 
                /* Basic sanity check */
@@ -569,10 +837,13 @@ static struct ieee80211_regdomain *country_ie_2_rd(
 
                last_sub_max_channel = cur_sub_max_channel;
 
-               country_ie += 3;
-               country_ie_len -= 3;
                num_rules++;
 
+               if (country_ie_len >= 3) {
+                       country_ie += 3;
+                       country_ie_len -= 3;
+               }
+
                /*
                 * Note: this is not a IEEE requirement but
                 * simply a memory requirement
@@ -615,6 +886,12 @@ static struct ieee80211_regdomain *country_ie_2_rd(
                        continue;
                }
 
+               if (triplet->chans.first_channel == 0) {
+                       country_ie++;
+                       country_ie_len--;
+                       break;
+               }
+
                reg_rule = &rd->reg_rules[i];
                freq_range = &reg_rule->freq_range;
                power_rule = &reg_rule->power_rule;
@@ -622,13 +899,20 @@ static struct ieee80211_regdomain *country_ie_2_rd(
                reg_rule->flags = flags;
 
                /* 2 GHz */
-               if (triplet->chans.first_channel <= 14)
+               if (band == IEEE80211_BAND_2GHZ)
                        end_channel = triplet->chans.first_channel +
-                               triplet->chans.num_channels;
+                               triplet->chans.num_channels -1;
                else
                        end_channel =  triplet->chans.first_channel +
                                (4 * (triplet->chans.num_channels - 1));
 
+               end_channel = max_subband_chan(band,
+                                              triplet->chans.first_channel,
+                                              end_channel,
+                                              triplet->chans.max_power,
+                                              &country_ie,
+                                              &country_ie_len);
+
                /*
                 * The +10 is since the regulatory domain expects
                 * the actual band edge, not the center of freq for
@@ -649,12 +933,15 @@ static struct ieee80211_regdomain *country_ie_2_rd(
                 */
                freq_range->max_bandwidth_khz = MHZ_TO_KHZ(40);
                power_rule->max_antenna_gain = DBI_TO_MBI(100);
-               power_rule->max_eirp = DBM_TO_MBM(100);
+               power_rule->max_eirp = DBM_TO_MBM(triplet->chans.max_power);
 
-               country_ie += 3;
-               country_ie_len -= 3;
                i++;
 
+               if (country_ie_len >= 3) {
+                       country_ie += 3;
+                       country_ie_len -= 3;
+               }
+
                BUG_ON(i > NL80211_MAX_SUPP_REG_RULES);
        }
 
@@ -950,25 +1237,21 @@ static void handle_channel(struct wiphy *wiphy, enum ieee80211_band band,
                if (r == -ERANGE &&
                    last_request->initiator ==
                    NL80211_REGDOM_SET_BY_COUNTRY_IE) {
-#ifdef CONFIG_CFG80211_REG_DEBUG
-                       printk(KERN_DEBUG "cfg80211: Leaving channel %d MHz "
+                       REG_DBG_PRINT("cfg80211: Leaving channel %d MHz "
                                "intact on %s - no rule found in band on "
                                "Country IE\n",
-                               chan->center_freq, wiphy_name(wiphy));
-#endif
+                       chan->center_freq, wiphy_name(wiphy));
                } else {
                /*
                 * In this case we know the country IE has at least one reg rule
                 * for the band so we respect its band definitions
                 */
-#ifdef CONFIG_CFG80211_REG_DEBUG
                        if (last_request->initiator ==
                            NL80211_REGDOM_SET_BY_COUNTRY_IE)
-                               printk(KERN_DEBUG "cfg80211: Disabling "
+                               REG_DBG_PRINT("cfg80211: Disabling "
                                        "channel %d MHz on %s due to "
                                        "Country IE\n",
                                        chan->center_freq, wiphy_name(wiphy));
-#endif
                        flags |= IEEE80211_CHAN_DISABLED;
                        chan->flags = flags;
                }
@@ -1342,30 +1625,6 @@ void wiphy_apply_custom_regulatory(struct wiphy *wiphy,
 }
 EXPORT_SYMBOL(wiphy_apply_custom_regulatory);
 
-static int reg_copy_regd(const struct ieee80211_regdomain **dst_regd,
-                        const struct ieee80211_regdomain *src_regd)
-{
-       struct ieee80211_regdomain *regd;
-       int size_of_regd = 0;
-       unsigned int i;
-
-       size_of_regd = sizeof(struct ieee80211_regdomain) +
-         ((src_regd->n_reg_rules + 1) * sizeof(struct ieee80211_reg_rule));
-
-       regd = kzalloc(size_of_regd, GFP_KERNEL);
-       if (!regd)
-               return -ENOMEM;
-
-       memcpy(regd, src_regd, sizeof(struct ieee80211_regdomain));
-
-       for (i = 0; i < src_regd->n_reg_rules; i++)
-               memcpy(&regd->reg_rules[i], &src_regd->reg_rules[i],
-                       sizeof(struct ieee80211_reg_rule));
-
-       *dst_regd = regd;
-       return 0;
-}
-
 /*
  * Return value which can be used by ignore_request() to indicate
  * it has been determined we should intersect two regulatory domains
@@ -1418,8 +1677,6 @@ static int ignore_request(struct wiphy *wiphy,
                return REG_INTERSECT;
        case NL80211_REGDOM_SET_BY_DRIVER:
                if (last_request->initiator == NL80211_REGDOM_SET_BY_CORE) {
-                       if (is_old_static_regdom(cfg80211_regdomain))
-                               return 0;
                        if (regdom_changes(pending_request->alpha2))
                                return 0;
                        return -EALREADY;
@@ -1456,8 +1713,7 @@ static int ignore_request(struct wiphy *wiphy,
                                return -EAGAIN;
                }
 
-               if (!is_old_static_regdom(cfg80211_regdomain) &&
-                   !regdom_changes(pending_request->alpha2))
+               if (!regdom_changes(pending_request->alpha2))
                        return -EALREADY;
 
                return 0;
@@ -1664,14 +1920,12 @@ static int regulatory_hint_core(const char *alpha2)
        request->alpha2[1] = alpha2[1];
        request->initiator = NL80211_REGDOM_SET_BY_CORE;
 
-       queue_regulatory_request(request);
-
        /*
         * This ensures last_request is populated once modules
         * come swinging in and calling regulatory hints and
         * wiphy_apply_custom_regulatory().
         */
-       flush_scheduled_work();
+       reg_process_hint(request);
 
        return 0;
 }
@@ -1690,7 +1944,7 @@ int regulatory_hint_user(const char *alpha2)
        request->wiphy_idx = WIPHY_IDX_STALE;
        request->alpha2[0] = alpha2[0];
        request->alpha2[1] = alpha2[1];
-       request->initiator = NL80211_REGDOM_SET_BY_USER,
+       request->initiator = NL80211_REGDOM_SET_BY_USER;
 
        queue_regulatory_request(request);
 
@@ -1758,8 +2012,9 @@ static bool reg_same_country_ie_hint(struct wiphy *wiphy,
  * therefore cannot iterate over the rdev list here.
  */
 void regulatory_hint_11d(struct wiphy *wiphy,
-                       u8 *country_ie,
-                       u8 country_ie_len)
+                        enum ieee80211_band band,
+                        u8 *country_ie,
+                        u8 country_ie_len)
 {
        struct ieee80211_regdomain *rd = NULL;
        char alpha2[2];
@@ -1805,9 +2060,11 @@ void regulatory_hint_11d(struct wiphy *wiphy,
            wiphy_idx_valid(last_request->wiphy_idx)))
                goto out;
 
-       rd = country_ie_2_rd(country_ie, country_ie_len, &checksum);
-       if (!rd)
+       rd = country_ie_2_rd(band, country_ie, country_ie_len, &checksum);
+       if (!rd) {
+               REG_DBG_PRINT("cfg80211: Ignoring bogus country IE\n");
                goto out;
+       }
 
        /*
         * This will not happen right now but we leave it here for the
@@ -1875,13 +2132,12 @@ int regulatory_hint_found_beacon(struct wiphy *wiphy,
        if (!reg_beacon)
                return -ENOMEM;
 
-#ifdef CONFIG_CFG80211_REG_DEBUG
-       printk(KERN_DEBUG "cfg80211: Found new beacon on "
-               "frequency: %d MHz (Ch %d) on %s\n",
-               beacon_chan->center_freq,
-               ieee80211_frequency_to_channel(beacon_chan->center_freq),
-               wiphy_name(wiphy));
-#endif
+       REG_DBG_PRINT("cfg80211: Found new beacon on "
+                     "frequency: %d MHz (Ch %d) on %s\n",
+                     beacon_chan->center_freq,
+                     ieee80211_frequency_to_channel(beacon_chan->center_freq),
+                     wiphy_name(wiphy));
+
        memcpy(&reg_beacon->chan, beacon_chan,
                sizeof(struct ieee80211_channel));
 
@@ -2039,8 +2295,7 @@ static int __set_regdom(const struct ieee80211_regdomain *rd)
                 * If someone else asked us to change the rd lets only bother
                 * checking if the alpha2 changes if CRDA was already called
                 */
-               if (!is_old_static_regdom(cfg80211_regdomain) &&
-                   !regdom_changes(rd->alpha2))
+               if (!regdom_changes(rd->alpha2))
                        return -EINVAL;
        }
 
@@ -2239,15 +2494,8 @@ int regulatory_init(void)
        spin_lock_init(&reg_requests_lock);
        spin_lock_init(&reg_pending_beacons_lock);
 
-#ifdef CONFIG_WIRELESS_OLD_REGULATORY
-       cfg80211_regdomain = static_regdom(ieee80211_regdom);
-
-       printk(KERN_INFO "cfg80211: Using static regulatory domain info\n");
-       print_regdomain_info(cfg80211_regdomain);
-#else
        cfg80211_regdomain = cfg80211_world_regdom;
 
-#endif
        /* We always try to get an update for the static regdomain */
        err = regulatory_hint_core(cfg80211_regdomain->alpha2);
        if (err) {