]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - drivers/net/wireless/ath/regd.c
Merge remote-tracking branch 'block/for-next'
[karo-tx-linux.git] / drivers / net / wireless / ath / regd.c
index 7d077c752dd56ca9e3c3d9cb0aae0c951795cadb..c00687e05688e6498b70131ba11c1105d0b933b1 100644 (file)
@@ -356,14 +356,131 @@ static u16 ath_regd_find_country_by_name(char *alpha2)
        return -1;
 }
 
+static int __ath_reg_dyn_country(struct wiphy *wiphy,
+                                struct ath_regulatory *reg,
+                                struct regulatory_request *request)
+{
+       u16 country_code;
+
+       if (!ath_is_world_regd(reg))
+               return -EINVAL;
+
+       country_code = ath_regd_find_country_by_name(request->alpha2);
+       if (country_code == (u16) -1)
+               return -EINVAL;
+
+       reg->current_rd = COUNTRY_ERD_FLAG;
+       reg->current_rd |= country_code;
+
+       __ath_regd_init(reg);
+
+       ath_reg_apply_world_flags(wiphy, request->initiator, reg);
+
+       return 0;
+}
+
+static void ath_reg_dyn_country(struct wiphy *wiphy,
+                               struct ath_regulatory *reg,
+                               struct regulatory_request *request)
+{
+       if (__ath_reg_dyn_country(wiphy, reg, request))
+               return;
+
+       printk(KERN_DEBUG "ath: regdomain 0x%0x "
+                         "dynamically updated by %s\n",
+              reg->current_rd,
+              reg_initiator_name(request->initiator));
+}
+
+static bool dynamic_country_user_possible(struct ath_regulatory *reg)
+{
+       if (config_enabled(CONFIG_ATH_REG_DYNAMIC_USER_CERT_TESTING))
+               return true;
+
+       switch (reg->country_code) {
+       case CTRY_UNITED_STATES:
+       case CTRY_JAPAN1:
+       case CTRY_JAPAN2:
+       case CTRY_JAPAN3:
+       case CTRY_JAPAN4:
+       case CTRY_JAPAN5:
+       case CTRY_JAPAN6:
+       case CTRY_JAPAN7:
+       case CTRY_JAPAN8:
+       case CTRY_JAPAN9:
+       case CTRY_JAPAN10:
+       case CTRY_JAPAN11:
+       case CTRY_JAPAN12:
+       case CTRY_JAPAN13:
+       case CTRY_JAPAN14:
+       case CTRY_JAPAN15:
+       case CTRY_JAPAN16:
+       case CTRY_JAPAN17:
+       case CTRY_JAPAN18:
+       case CTRY_JAPAN19:
+       case CTRY_JAPAN20:
+       case CTRY_JAPAN21:
+       case CTRY_JAPAN22:
+       case CTRY_JAPAN23:
+       case CTRY_JAPAN24:
+       case CTRY_JAPAN25:
+       case CTRY_JAPAN26:
+       case CTRY_JAPAN27:
+       case CTRY_JAPAN28:
+       case CTRY_JAPAN29:
+       case CTRY_JAPAN30:
+       case CTRY_JAPAN31:
+       case CTRY_JAPAN32:
+       case CTRY_JAPAN33:
+       case CTRY_JAPAN34:
+       case CTRY_JAPAN35:
+       case CTRY_JAPAN36:
+       case CTRY_JAPAN37:
+       case CTRY_JAPAN38:
+       case CTRY_JAPAN39:
+       case CTRY_JAPAN40:
+       case CTRY_JAPAN41:
+       case CTRY_JAPAN42:
+       case CTRY_JAPAN43:
+       case CTRY_JAPAN44:
+       case CTRY_JAPAN45:
+       case CTRY_JAPAN46:
+       case CTRY_JAPAN47:
+       case CTRY_JAPAN48:
+       case CTRY_JAPAN49:
+       case CTRY_JAPAN50:
+       case CTRY_JAPAN51:
+       case CTRY_JAPAN52:
+       case CTRY_JAPAN53:
+       case CTRY_JAPAN54:
+       case CTRY_JAPAN55:
+       case CTRY_JAPAN56:
+       case CTRY_JAPAN57:
+       case CTRY_JAPAN58:
+       case CTRY_JAPAN59:
+               return false;
+       }
+
+       return true;
+}
+
+static void ath_reg_dyn_country_user(struct wiphy *wiphy,
+                                    struct ath_regulatory *reg,
+                                    struct regulatory_request *request)
+{
+       if (!config_enabled(CONFIG_ATH_REG_DYNAMIC_USER_REG_HINTS))
+               return;
+       if (!dynamic_country_user_possible(reg))
+               return;
+       ath_reg_dyn_country(wiphy, reg, request);
+}
+
 void ath_reg_notifier_apply(struct wiphy *wiphy,
                            struct regulatory_request *request,
                            struct ath_regulatory *reg)
 {
        struct ath_common *common = container_of(reg, struct ath_common,
                                                 regulatory);
-       u16 country_code;
-
        /* We always apply this */
        ath_reg_apply_radar_flags(wiphy);
 
@@ -388,25 +505,12 @@ void ath_reg_notifier_apply(struct wiphy *wiphy,
                       sizeof(struct ath_regulatory));
                break;
        case NL80211_REGDOM_SET_BY_DRIVER:
+               break;
        case NL80211_REGDOM_SET_BY_USER:
+               ath_reg_dyn_country_user(wiphy, reg, request);
                break;
        case NL80211_REGDOM_SET_BY_COUNTRY_IE:
-               if (!ath_is_world_regd(reg))
-                       break;
-
-               country_code = ath_regd_find_country_by_name(request->alpha2);
-               if (country_code == (u16) -1)
-                       break;
-
-               reg->current_rd = COUNTRY_ERD_FLAG;
-               reg->current_rd |= country_code;
-
-               printk(KERN_DEBUG "ath: regdomain 0x%0x updated by CountryIE\n",
-                       reg->current_rd);
-               __ath_regd_init(reg);
-
-               ath_reg_apply_world_flags(wiphy, request->initiator, reg);
-
+               ath_reg_dyn_country(wiphy, reg, request);
                break;
        }
 }