rtlwifi: Update regulatory database
authorShao Fu <shaofu@realtek.com>
Fri, 15 May 2015 21:32:59 +0000 (16:32 -0500)
committerBen Hutchings <ben@decadent.org.uk>
Thu, 23 Feb 2017 03:50:48 +0000 (03:50 +0000)
commit 02b5fffbe9e02f5d63fa4a801fb807cf0aab4fc9 upstream.

Driver rtlwifi maintains its own regulatory information, The Chrome Autotest
(https://www.chromium.org/chromium-os/testing/autotest-user-doc)
showed some errors. This patch adds the necessary information for rtlwifi.

Signed-off-by: Shao Fu <shaofu@realtek.com>
Signed-off-by: Larry Finger <Larry.Finger@lwfinger.net>
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
[bwh: Backported to 3.2: adjust context]
Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
drivers/net/wireless/rtlwifi/regd.c
drivers/net/wireless/rtlwifi/regd.h

index 9fedb1f..faf28da 100644 (file)
@@ -44,6 +44,7 @@ static struct country_code_to_enum_rd allCountries[] = {
        {COUNTRY_CODE_GLOBAL_DOMAIN, "JP"},
        {COUNTRY_CODE_WORLD_WIDE_13, "EC"},
        {COUNTRY_CODE_TELEC_NETGEAR, "EC"},
        {COUNTRY_CODE_GLOBAL_DOMAIN, "JP"},
        {COUNTRY_CODE_WORLD_WIDE_13, "EC"},
        {COUNTRY_CODE_TELEC_NETGEAR, "EC"},
+       {COUNTRY_CODE_WORLD_WIDE_13_5G_ALL, "US"},
 };
 
 /*
 };
 
 /*
@@ -135,6 +136,17 @@ static const struct ieee80211_regdomain rtl_regdom_14_60_64 = {
                      }
 };
 
                      }
 };
 
+static const struct ieee80211_regdomain rtl_regdom_12_13_5g_all = {
+       .n_reg_rules = 4,
+       .alpha2 = "99",
+       .reg_rules = {
+                       RTL819x_2GHZ_CH01_11,
+                       RTL819x_2GHZ_CH12_13,
+                       RTL819x_5GHZ_5150_5350,
+                       RTL819x_5GHZ_5470_5850,
+               }
+};
+
 static const struct ieee80211_regdomain rtl_regdom_14 = {
        .n_reg_rules = 3,
        .alpha2 = "99",
 static const struct ieee80211_regdomain rtl_regdom_14 = {
        .n_reg_rules = 3,
        .alpha2 = "99",
@@ -346,6 +358,8 @@ static const struct ieee80211_regdomain *_rtl_regdomain_select(
                return &rtl_regdom_14_60_64;
        case COUNTRY_CODE_GLOBAL_DOMAIN:
                return &rtl_regdom_14;
                return &rtl_regdom_14_60_64;
        case COUNTRY_CODE_GLOBAL_DOMAIN:
                return &rtl_regdom_14;
+       case COUNTRY_CODE_WORLD_WIDE_13_5G_ALL:
+               return &rtl_regdom_12_13_5g_all;
        default:
                return &rtl_regdom_no_midband;
        }
        default:
                return &rtl_regdom_no_midband;
        }
@@ -383,6 +397,25 @@ static struct country_code_to_enum_rd *_rtl_regd_find_country(u16 countrycode)
        return NULL;
 }
 
        return NULL;
 }
 
+static u8 channel_plan_to_country_code(u8 channelplan)
+{
+       switch (channelplan) {
+       case 0x20:
+       case 0x21:
+               return COUNTRY_CODE_WORLD_WIDE_13;
+       case 0x22:
+               return COUNTRY_CODE_IC;
+       case 0x32:
+               return COUNTRY_CODE_TELEC_NETGEAR;
+       case 0x41:
+               return COUNTRY_CODE_GLOBAL_DOMAIN;
+       case 0x7f:
+               return COUNTRY_CODE_WORLD_WIDE_13_5G_ALL;
+       default:
+               return COUNTRY_CODE_MAX; /*Error*/
+       }
+}
+
 int rtl_regd_init(struct ieee80211_hw *hw,
                  int (*reg_notifier) (struct wiphy *wiphy,
                                       struct regulatory_request *request))
 int rtl_regd_init(struct ieee80211_hw *hw,
                  int (*reg_notifier) (struct wiphy *wiphy,
                                       struct regulatory_request *request))
@@ -395,11 +428,12 @@ int rtl_regd_init(struct ieee80211_hw *hw,
                return -EINVAL;
 
        /* init country_code from efuse channel plan */
                return -EINVAL;
 
        /* init country_code from efuse channel plan */
-       rtlpriv->regd.country_code = rtlpriv->efuse.channel_plan;
+       rtlpriv->regd.country_code =
+               channel_plan_to_country_code(rtlpriv->efuse.channel_plan);
 
 
-       RT_TRACE(rtlpriv, COMP_REGD, DBG_TRACE,
-                (KERN_DEBUG "rtl: EEPROM regdomain: 0x%0x\n",
-                 rtlpriv->regd.country_code));
+       RT_TRACE(rtlpriv, COMP_REGD, DBG_DMESG,
+                (KERN_DEBUG "rtl: EEPROM regdomain: 0x%0x conuntry code: %d\n",
+                rtlpriv->efuse.channel_plan, rtlpriv->regd.country_code));
 
        if (rtlpriv->regd.country_code >= COUNTRY_CODE_MAX) {
                RT_TRACE(rtlpriv, COMP_REGD, DBG_DMESG,
 
        if (rtlpriv->regd.country_code >= COUNTRY_CODE_MAX) {
                RT_TRACE(rtlpriv, COMP_REGD, DBG_DMESG,
index d231189..883cebb 100644 (file)
@@ -49,6 +49,7 @@ enum country_code_type_t {
        COUNTRY_CODE_GLOBAL_DOMAIN = 10,
        COUNTRY_CODE_WORLD_WIDE_13 = 11,
        COUNTRY_CODE_TELEC_NETGEAR = 12,
        COUNTRY_CODE_GLOBAL_DOMAIN = 10,
        COUNTRY_CODE_WORLD_WIDE_13 = 11,
        COUNTRY_CODE_TELEC_NETGEAR = 12,
+       COUNTRY_CODE_WORLD_WIDE_13_5G_ALL = 13,
 
        /*add new channel plan above this line */
        COUNTRY_CODE_MAX
 
        /*add new channel plan above this line */
        COUNTRY_CODE_MAX