aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLuis R. Rodriguez <mcgrof@do-not-panic.com>2013-11-11 16:15:29 -0500
committerJohannes Berg <johannes.berg@intel.com>2013-11-25 14:51:46 -0500
commita2f73b6c5db3c272d87eaebb5bed355d75a0f25f (patch)
tree1cf299d0c5b2287afe742430d7e15cb3c1d43b4f
parentca91dc97b8a0ffd05721806654eaff2cf13ba5cb (diff)
cfg80211: move regulatory flags to their own variable
We'll expand this later, this will make it easier to classify and review what things are related to regulatory or not. Coccinelle only missed 4 hits, which I had to do manually, supplying the SmPL in case of merge conflicts. @@ struct wiphy *wiphy; @@ -wiphy->flags |= WIPHY_FLAG_CUSTOM_REGULATORY +wiphy->regulatory_flags |= REGULATORY_CUSTOM_REG @@ expression e; @@ -e->flags |= WIPHY_FLAG_CUSTOM_REGULATORY +e->regulatory_flags |= REGULATORY_CUSTOM_REG @@ struct wiphy *wiphy; @@ -wiphy->flags &= ~WIPHY_FLAG_CUSTOM_REGULATORY +wiphy->regulatory_flags &= ~REGULATORY_CUSTOM_REG @@ struct wiphy *wiphy; @@ -wiphy->flags & WIPHY_FLAG_CUSTOM_REGULATORY +wiphy->regulatory_flags & REGULATORY_CUSTOM_REG @@ struct wiphy *wiphy; @@ -wiphy->flags |= WIPHY_FLAG_STRICT_REGULATORY +wiphy->regulatory_flags |= REGULATORY_STRICT_REG @@ expression e; @@ -e->flags |= WIPHY_FLAG_STRICT_REGULATORY +e->regulatory_flags |= REGULATORY_STRICT_REG @@ struct wiphy *wiphy; @@ -wiphy->flags &= ~WIPHY_FLAG_STRICT_REGULATORY +wiphy->regulatory_flags &= ~REGULATORY_STRICT_REG @@ struct wiphy *wiphy; @@ -wiphy->flags & WIPHY_FLAG_STRICT_REGULATORY +wiphy->regulatory_flags & REGULATORY_STRICT_REG @@ struct wiphy *wiphy; @@ -wiphy->flags |= WIPHY_FLAG_DISABLE_BEACON_HINTS +wiphy->regulatory_flags |= REGULATORY_DISABLE_BEACON_HINTS @@ expression e; @@ -e->flags |= WIPHY_FLAG_DISABLE_BEACON_HINTS +e->regulatory_flags |= REGULATORY_DISABLE_BEACON_HINTS @@ struct wiphy *wiphy; @@ -wiphy->flags &= ~WIPHY_FLAG_DISABLE_BEACON_HINTS +wiphy->regulatory_flags &= ~REGULATORY_DISABLE_BEACON_HINTS @@ struct wiphy *wiphy; @@ -wiphy->flags & WIPHY_FLAG_DISABLE_BEACON_HINTS +wiphy->regulatory_flags & REGULATORY_DISABLE_BEACON_HINTS Generated-by: Coccinelle SmPL Cc: Julia Lawall <julia.lawall@lip6.fr> Cc: Peter Senna Tschudin <peter.senna@gmail.com> Cc: Mihir Shete <smihir@qti.qualcomm.com> Cc: Henri Bahini <hbahini@qca.qualcomm.com> Cc: Tushnim Bhattacharyya <tushnimb@qca.qualcomm.com> Signed-off-by: Luis R. Rodriguez <mcgrof@do-not-panic.com> [fix up whitespace damage, overly long lines] Signed-off-by: Johannes Berg <johannes.berg@intel.com>
-rw-r--r--drivers/net/wireless/ath/regd.c4
-rw-r--r--drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c2
-rw-r--r--drivers/net/wireless/brcm80211/brcmsmac/channel.c4
-rw-r--r--drivers/net/wireless/iwlegacy/3945-mac.c6
-rw-r--r--drivers/net/wireless/iwlegacy/4965-mac.c6
-rw-r--r--drivers/net/wireless/iwlwifi/dvm/mac80211.c6
-rw-r--r--drivers/net/wireless/iwlwifi/mvm/mac80211.c6
-rw-r--r--drivers/net/wireless/mac80211_hwsim.c25
-rw-r--r--drivers/net/wireless/mwifiex/cfg80211.c5
-rw-r--r--drivers/net/wireless/rtlwifi/regd.c6
-rw-r--r--include/net/cfg80211.h33
-rw-r--r--include/net/regulatory.h59
-rw-r--r--net/wireless/core.c2
-rw-r--r--net/wireless/reg.c32
14 files changed, 108 insertions, 88 deletions
diff --git a/drivers/net/wireless/ath/regd.c b/drivers/net/wireless/ath/regd.c
index e93e517a699f..aba782cd09a2 100644
--- a/drivers/net/wireless/ath/regd.c
+++ b/drivers/net/wireless/ath/regd.c
@@ -601,7 +601,7 @@ ath_regd_init_wiphy(struct ath_regulatory *reg,
601 const struct ieee80211_regdomain *regd; 601 const struct ieee80211_regdomain *regd;
602 602
603 wiphy->reg_notifier = reg_notifier; 603 wiphy->reg_notifier = reg_notifier;
604 wiphy->flags |= WIPHY_FLAG_STRICT_REGULATORY; 604 wiphy->regulatory_flags |= REGULATORY_STRICT_REG;
605 605
606 if (ath_is_world_regd(reg)) { 606 if (ath_is_world_regd(reg)) {
607 /* 607 /*
@@ -609,7 +609,7 @@ ath_regd_init_wiphy(struct ath_regulatory *reg,
609 * saved on the wiphy orig_* parameters 609 * saved on the wiphy orig_* parameters
610 */ 610 */
611 regd = ath_world_regdomain(reg); 611 regd = ath_world_regdomain(reg);
612 wiphy->flags |= WIPHY_FLAG_CUSTOM_REGULATORY; 612 wiphy->regulatory_flags |= REGULATORY_CUSTOM_REG;
613 } else { 613 } else {
614 /* 614 /*
615 * This gets applied in the case of the absence of CRDA, 615 * This gets applied in the case of the absence of CRDA,
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c b/drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c
index b6a09f97f9a3..1850efa83cf8 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c
+++ b/drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c
@@ -4341,7 +4341,7 @@ static struct wiphy *brcmf_setup_wiphy(struct device *phydev)
4341 wiphy->max_remain_on_channel_duration = 5000; 4341 wiphy->max_remain_on_channel_duration = 5000;
4342 brcmf_wiphy_pno_params(wiphy); 4342 brcmf_wiphy_pno_params(wiphy);
4343 brcmf_dbg(INFO, "Registering custom regulatory\n"); 4343 brcmf_dbg(INFO, "Registering custom regulatory\n");
4344 wiphy->flags |= WIPHY_FLAG_CUSTOM_REGULATORY; 4344 wiphy->regulatory_flags |= REGULATORY_CUSTOM_REG;
4345 wiphy_apply_custom_regulatory(wiphy, &brcmf_regdom); 4345 wiphy_apply_custom_regulatory(wiphy, &brcmf_regdom);
4346 err = wiphy_register(wiphy); 4346 err = wiphy_register(wiphy);
4347 if (err < 0) { 4347 if (err < 0) {
diff --git a/drivers/net/wireless/brcm80211/brcmsmac/channel.c b/drivers/net/wireless/brcm80211/brcmsmac/channel.c
index 7d8f3fd69a87..ef05df04136b 100644
--- a/drivers/net/wireless/brcm80211/brcmsmac/channel.c
+++ b/drivers/net/wireless/brcm80211/brcmsmac/channel.c
@@ -766,8 +766,8 @@ void brcms_c_regd_init(struct brcms_c_info *wlc)
766 } 766 }
767 767
768 wlc->wiphy->reg_notifier = brcms_reg_notifier; 768 wlc->wiphy->reg_notifier = brcms_reg_notifier;
769 wlc->wiphy->flags |= WIPHY_FLAG_CUSTOM_REGULATORY | 769 wlc->wiphy->regulatory_flags |= REGULATORY_CUSTOM_REG |
770 WIPHY_FLAG_STRICT_REGULATORY; 770 REGULATORY_STRICT_REG;
771 wiphy_apply_custom_regulatory(wlc->wiphy, regd->regdomain); 771 wiphy_apply_custom_regulatory(wlc->wiphy, regd->regdomain);
772 brcms_reg_apply_beaconing_flags(wiphy, NL80211_REGDOM_SET_BY_DRIVER); 772 brcms_reg_apply_beaconing_flags(wiphy, NL80211_REGDOM_SET_BY_DRIVER);
773} 773}
diff --git a/drivers/net/wireless/iwlegacy/3945-mac.c b/drivers/net/wireless/iwlegacy/3945-mac.c
index 5a66595b0faf..5c3bcedd679b 100644
--- a/drivers/net/wireless/iwlegacy/3945-mac.c
+++ b/drivers/net/wireless/iwlegacy/3945-mac.c
@@ -3575,9 +3575,9 @@ il3945_setup_mac(struct il_priv *il)
3575 hw->wiphy->interface_modes = 3575 hw->wiphy->interface_modes =
3576 BIT(NL80211_IFTYPE_STATION) | BIT(NL80211_IFTYPE_ADHOC); 3576 BIT(NL80211_IFTYPE_STATION) | BIT(NL80211_IFTYPE_ADHOC);
3577 3577
3578 hw->wiphy->flags |= 3578 hw->wiphy->flags |= WIPHY_FLAG_IBSS_RSN;
3579 WIPHY_FLAG_CUSTOM_REGULATORY | WIPHY_FLAG_DISABLE_BEACON_HINTS | 3579 hw->wiphy->regulatory_flags |= REGULATORY_CUSTOM_REG |
3580 WIPHY_FLAG_IBSS_RSN; 3580 REGULATORY_DISABLE_BEACON_HINTS;
3581 3581
3582 hw->wiphy->flags &= ~WIPHY_FLAG_PS_ON_BY_DEFAULT; 3582 hw->wiphy->flags &= ~WIPHY_FLAG_PS_ON_BY_DEFAULT;
3583 3583
diff --git a/drivers/net/wireless/iwlegacy/4965-mac.c b/drivers/net/wireless/iwlegacy/4965-mac.c
index 1c5f8cdbd3a5..43f488a8cda2 100644
--- a/drivers/net/wireless/iwlegacy/4965-mac.c
+++ b/drivers/net/wireless/iwlegacy/4965-mac.c
@@ -5778,9 +5778,9 @@ il4965_mac_setup_register(struct il_priv *il, u32 max_probe_length)
5778 hw->wiphy->interface_modes = 5778 hw->wiphy->interface_modes =
5779 BIT(NL80211_IFTYPE_STATION) | BIT(NL80211_IFTYPE_ADHOC); 5779 BIT(NL80211_IFTYPE_STATION) | BIT(NL80211_IFTYPE_ADHOC);
5780 5780
5781 hw->wiphy->flags |= 5781 hw->wiphy->flags |= WIPHY_FLAG_IBSS_RSN;
5782 WIPHY_FLAG_CUSTOM_REGULATORY | WIPHY_FLAG_DISABLE_BEACON_HINTS | 5782 hw->wiphy->regulatory_flags |= REGULATORY_CUSTOM_REG |
5783 WIPHY_FLAG_IBSS_RSN; 5783 REGULATORY_DISABLE_BEACON_HINTS;
5784 5784
5785 /* 5785 /*
5786 * For now, disable PS by default because it affects 5786 * For now, disable PS by default because it affects
diff --git a/drivers/net/wireless/iwlwifi/dvm/mac80211.c b/drivers/net/wireless/iwlwifi/dvm/mac80211.c
index cae4d3182e33..217f1ca321a0 100644
--- a/drivers/net/wireless/iwlwifi/dvm/mac80211.c
+++ b/drivers/net/wireless/iwlwifi/dvm/mac80211.c
@@ -155,9 +155,9 @@ int iwlagn_mac_setup_register(struct iwl_priv *priv,
155 ARRAY_SIZE(iwlagn_iface_combinations_dualmode); 155 ARRAY_SIZE(iwlagn_iface_combinations_dualmode);
156 } 156 }
157 157
158 hw->wiphy->flags |= WIPHY_FLAG_CUSTOM_REGULATORY | 158 hw->wiphy->flags |= WIPHY_FLAG_IBSS_RSN;
159 WIPHY_FLAG_DISABLE_BEACON_HINTS | 159 hw->wiphy->regulatory_flags |= REGULATORY_CUSTOM_REG |
160 WIPHY_FLAG_IBSS_RSN; 160 REGULATORY_DISABLE_BEACON_HINTS;
161 161
162#ifdef CONFIG_PM_SLEEP 162#ifdef CONFIG_PM_SLEEP
163 if (priv->fw->img[IWL_UCODE_WOWLAN].sec[0].len && 163 if (priv->fw->img[IWL_UCODE_WOWLAN].sec[0].len &&
diff --git a/drivers/net/wireless/iwlwifi/mvm/mac80211.c b/drivers/net/wireless/iwlwifi/mvm/mac80211.c
index 74bc2c8af06d..b56c989ad784 100644
--- a/drivers/net/wireless/iwlwifi/mvm/mac80211.c
+++ b/drivers/net/wireless/iwlwifi/mvm/mac80211.c
@@ -199,9 +199,9 @@ int iwl_mvm_mac_setup_register(struct iwl_mvm *mvm)
199 if (IWL_UCODE_API(mvm->fw->ucode_ver) >= 8) 199 if (IWL_UCODE_API(mvm->fw->ucode_ver) >= 8)
200 hw->wiphy->interface_modes |= BIT(NL80211_IFTYPE_ADHOC); 200 hw->wiphy->interface_modes |= BIT(NL80211_IFTYPE_ADHOC);
201 201
202 hw->wiphy->flags |= WIPHY_FLAG_CUSTOM_REGULATORY | 202 hw->wiphy->flags |= WIPHY_FLAG_IBSS_RSN;
203 WIPHY_FLAG_DISABLE_BEACON_HINTS | 203 hw->wiphy->regulatory_flags |= REGULATORY_CUSTOM_REG |
204 WIPHY_FLAG_IBSS_RSN; 204 REGULATORY_DISABLE_BEACON_HINTS;
205 205
206 hw->wiphy->iface_combinations = iwl_mvm_iface_combinations; 206 hw->wiphy->iface_combinations = iwl_mvm_iface_combinations;
207 hw->wiphy->n_iface_combinations = 207 hw->wiphy->n_iface_combinations =
diff --git a/drivers/net/wireless/mac80211_hwsim.c b/drivers/net/wireless/mac80211_hwsim.c
index 8c7f4ab70d29..bcc7d8208f23 100644
--- a/drivers/net/wireless/mac80211_hwsim.c
+++ b/drivers/net/wireless/mac80211_hwsim.c
@@ -2456,46 +2456,53 @@ static int __init init_mac80211_hwsim(void)
2456 break; 2456 break;
2457 case HWSIM_REGTEST_WORLD_ROAM: 2457 case HWSIM_REGTEST_WORLD_ROAM:
2458 if (i == 0) { 2458 if (i == 0) {
2459 hw->wiphy->flags |= WIPHY_FLAG_CUSTOM_REGULATORY; 2459 hw->wiphy->regulatory_flags |=
2460 REGULATORY_CUSTOM_REG;
2460 wiphy_apply_custom_regulatory(hw->wiphy, 2461 wiphy_apply_custom_regulatory(hw->wiphy,
2461 &hwsim_world_regdom_custom_01); 2462 &hwsim_world_regdom_custom_01);
2462 } 2463 }
2463 break; 2464 break;
2464 case HWSIM_REGTEST_CUSTOM_WORLD: 2465 case HWSIM_REGTEST_CUSTOM_WORLD:
2465 hw->wiphy->flags |= WIPHY_FLAG_CUSTOM_REGULATORY; 2466 hw->wiphy->regulatory_flags |= REGULATORY_CUSTOM_REG;
2466 wiphy_apply_custom_regulatory(hw->wiphy, 2467 wiphy_apply_custom_regulatory(hw->wiphy,
2467 &hwsim_world_regdom_custom_01); 2468 &hwsim_world_regdom_custom_01);
2468 break; 2469 break;
2469 case HWSIM_REGTEST_CUSTOM_WORLD_2: 2470 case HWSIM_REGTEST_CUSTOM_WORLD_2:
2470 if (i == 0) { 2471 if (i == 0) {
2471 hw->wiphy->flags |= WIPHY_FLAG_CUSTOM_REGULATORY; 2472 hw->wiphy->regulatory_flags |=
2473 REGULATORY_CUSTOM_REG;
2472 wiphy_apply_custom_regulatory(hw->wiphy, 2474 wiphy_apply_custom_regulatory(hw->wiphy,
2473 &hwsim_world_regdom_custom_01); 2475 &hwsim_world_regdom_custom_01);
2474 } else if (i == 1) { 2476 } else if (i == 1) {
2475 hw->wiphy->flags |= WIPHY_FLAG_CUSTOM_REGULATORY; 2477 hw->wiphy->regulatory_flags |=
2478 REGULATORY_CUSTOM_REG;
2476 wiphy_apply_custom_regulatory(hw->wiphy, 2479 wiphy_apply_custom_regulatory(hw->wiphy,
2477 &hwsim_world_regdom_custom_02); 2480 &hwsim_world_regdom_custom_02);
2478 } 2481 }
2479 break; 2482 break;
2480 case HWSIM_REGTEST_STRICT_ALL: 2483 case HWSIM_REGTEST_STRICT_ALL:
2481 hw->wiphy->flags |= WIPHY_FLAG_STRICT_REGULATORY; 2484 hw->wiphy->regulatory_flags |= REGULATORY_STRICT_REG;
2482 break; 2485 break;
2483 case HWSIM_REGTEST_STRICT_FOLLOW: 2486 case HWSIM_REGTEST_STRICT_FOLLOW:
2484 case HWSIM_REGTEST_STRICT_AND_DRIVER_REG: 2487 case HWSIM_REGTEST_STRICT_AND_DRIVER_REG:
2485 if (i == 0) 2488 if (i == 0)
2486 hw->wiphy->flags |= WIPHY_FLAG_STRICT_REGULATORY; 2489 hw->wiphy->regulatory_flags |=
2490 REGULATORY_STRICT_REG;
2487 break; 2491 break;
2488 case HWSIM_REGTEST_ALL: 2492 case HWSIM_REGTEST_ALL:
2489 if (i == 0) { 2493 if (i == 0) {
2490 hw->wiphy->flags |= WIPHY_FLAG_CUSTOM_REGULATORY; 2494 hw->wiphy->regulatory_flags |=
2495 REGULATORY_CUSTOM_REG;
2491 wiphy_apply_custom_regulatory(hw->wiphy, 2496 wiphy_apply_custom_regulatory(hw->wiphy,
2492 &hwsim_world_regdom_custom_01); 2497 &hwsim_world_regdom_custom_01);
2493 } else if (i == 1) { 2498 } else if (i == 1) {
2494 hw->wiphy->flags |= WIPHY_FLAG_CUSTOM_REGULATORY; 2499 hw->wiphy->regulatory_flags |=
2500 REGULATORY_CUSTOM_REG;
2495 wiphy_apply_custom_regulatory(hw->wiphy, 2501 wiphy_apply_custom_regulatory(hw->wiphy,
2496 &hwsim_world_regdom_custom_02); 2502 &hwsim_world_regdom_custom_02);
2497 } else if (i == 4) 2503 } else if (i == 4)
2498 hw->wiphy->flags |= WIPHY_FLAG_STRICT_REGULATORY; 2504 hw->wiphy->regulatory_flags |=
2505 REGULATORY_STRICT_REG;
2499 break; 2506 break;
2500 default: 2507 default:
2501 break; 2508 break;
diff --git a/drivers/net/wireless/mwifiex/cfg80211.c b/drivers/net/wireless/mwifiex/cfg80211.c
index 7f68943f02c2..d6d1d91a26dc 100644
--- a/drivers/net/wireless/mwifiex/cfg80211.c
+++ b/drivers/net/wireless/mwifiex/cfg80211.c
@@ -2687,9 +2687,10 @@ int mwifiex_register_cfg80211(struct mwifiex_adapter *adapter)
2687 wiphy->flags |= WIPHY_FLAG_HAVE_AP_SME | 2687 wiphy->flags |= WIPHY_FLAG_HAVE_AP_SME |
2688 WIPHY_FLAG_AP_PROBE_RESP_OFFLOAD | 2688 WIPHY_FLAG_AP_PROBE_RESP_OFFLOAD |
2689 WIPHY_FLAG_AP_UAPSD | 2689 WIPHY_FLAG_AP_UAPSD |
2690 WIPHY_FLAG_CUSTOM_REGULATORY |
2691 WIPHY_FLAG_STRICT_REGULATORY |
2692 WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL; 2690 WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL;
2691 wiphy->regulatory_flags |=
2692 REGULATORY_CUSTOM_REG |
2693 REGULATORY_STRICT_REG;
2693 2694
2694 wiphy_apply_custom_regulatory(wiphy, &mwifiex_world_regdom_custom); 2695 wiphy_apply_custom_regulatory(wiphy, &mwifiex_world_regdom_custom);
2695 2696
diff --git a/drivers/net/wireless/rtlwifi/regd.c b/drivers/net/wireless/rtlwifi/regd.c
index 8453c53143f5..89e36568e70f 100644
--- a/drivers/net/wireless/rtlwifi/regd.c
+++ b/drivers/net/wireless/rtlwifi/regd.c
@@ -344,9 +344,9 @@ static int _rtl_regd_init_wiphy(struct rtl_regulatory *reg,
344 344
345 wiphy->reg_notifier = reg_notifier; 345 wiphy->reg_notifier = reg_notifier;
346 346
347 wiphy->flags |= WIPHY_FLAG_CUSTOM_REGULATORY; 347 wiphy->regulatory_flags |= REGULATORY_CUSTOM_REG;
348 wiphy->flags &= ~WIPHY_FLAG_STRICT_REGULATORY; 348 wiphy->regulatory_flags &= ~REGULATORY_STRICT_REG;
349 wiphy->flags &= ~WIPHY_FLAG_DISABLE_BEACON_HINTS; 349 wiphy->regulatory_flags &= ~REGULATORY_DISABLE_BEACON_HINTS;
350 350
351 regd = _rtl_regdomain_select(reg); 351 regd = _rtl_regdomain_select(reg);
352 wiphy_apply_custom_regulatory(wiphy, regd); 352 wiphy_apply_custom_regulatory(wiphy, regd);
diff --git a/include/net/cfg80211.h b/include/net/cfg80211.h
index 968f2ad40ccd..bacc5033f0b6 100644
--- a/include/net/cfg80211.h
+++ b/include/net/cfg80211.h
@@ -2437,29 +2437,6 @@ struct cfg80211_ops {
2437/** 2437/**
2438 * enum wiphy_flags - wiphy capability flags 2438 * enum wiphy_flags - wiphy capability flags
2439 * 2439 *
2440 * @WIPHY_FLAG_CUSTOM_REGULATORY: tells us the driver for this device
2441 * has its own custom regulatory domain and cannot identify the
2442 * ISO / IEC 3166 alpha2 it belongs to. When this is enabled
2443 * we will disregard the first regulatory hint (when the
2444 * initiator is %REGDOM_SET_BY_CORE). Drivers that use
2445 * wiphy_apply_custom_regulatory() should have this flag set
2446 * or the regulatory core will set it for wiphy.
2447 * @WIPHY_FLAG_STRICT_REGULATORY: tells us the driver for this device will
2448 * ignore regulatory domain settings until it gets its own regulatory
2449 * domain via its regulatory_hint() unless the regulatory hint is
2450 * from a country IE. After its gets its own regulatory domain it will
2451 * only allow further regulatory domain settings to further enhance
2452 * compliance. For example if channel 13 and 14 are disabled by this
2453 * regulatory domain no user regulatory domain can enable these channels
2454 * at a later time. This can be used for devices which do not have
2455 * calibration information guaranteed for frequencies or settings
2456 * outside of its regulatory domain. If used in combination with
2457 * WIPHY_FLAG_CUSTOM_REGULATORY the inspected country IE power settings
2458 * will be followed.
2459 * @WIPHY_FLAG_DISABLE_BEACON_HINTS: enable this if your driver needs to ensure
2460 * that passive scan flags and beaconing flags may not be lifted by
2461 * cfg80211 due to regulatory beacon hints. For more information on beacon
2462 * hints read the documenation for regulatory_hint_found_beacon()
2463 * @WIPHY_FLAG_NETNS_OK: if not set, do not allow changing the netns of this 2440 * @WIPHY_FLAG_NETNS_OK: if not set, do not allow changing the netns of this
2464 * wiphy at all 2441 * wiphy at all
2465 * @WIPHY_FLAG_PS_ON_BY_DEFAULT: if set to true, powersave will be enabled 2442 * @WIPHY_FLAG_PS_ON_BY_DEFAULT: if set to true, powersave will be enabled
@@ -2498,9 +2475,9 @@ struct cfg80211_ops {
2498 * beaconing mode (AP, IBSS, Mesh, ...). 2475 * beaconing mode (AP, IBSS, Mesh, ...).
2499 */ 2476 */
2500enum wiphy_flags { 2477enum wiphy_flags {
2501 WIPHY_FLAG_CUSTOM_REGULATORY = BIT(0), 2478 /* use hole at 0 */
2502 WIPHY_FLAG_STRICT_REGULATORY = BIT(1), 2479 /* use hole at 1 */
2503 WIPHY_FLAG_DISABLE_BEACON_HINTS = BIT(2), 2480 /* use hole at 2 */
2504 WIPHY_FLAG_NETNS_OK = BIT(3), 2481 WIPHY_FLAG_NETNS_OK = BIT(3),
2505 WIPHY_FLAG_PS_ON_BY_DEFAULT = BIT(4), 2482 WIPHY_FLAG_PS_ON_BY_DEFAULT = BIT(4),
2506 WIPHY_FLAG_4ADDR_AP = BIT(5), 2483 WIPHY_FLAG_4ADDR_AP = BIT(5),
@@ -2722,6 +2699,8 @@ struct wiphy_coalesce_support {
2722 * @software_iftypes: bitmask of software interface types, these are not 2699 * @software_iftypes: bitmask of software interface types, these are not
2723 * subject to any restrictions since they are purely managed in SW. 2700 * subject to any restrictions since they are purely managed in SW.
2724 * @flags: wiphy flags, see &enum wiphy_flags 2701 * @flags: wiphy flags, see &enum wiphy_flags
2702 * @regulatory_flags: wiphy regulatory flags, see
2703 * &enum ieee80211_regulatory_flags
2725 * @features: features advertised to nl80211, see &enum nl80211_feature_flags. 2704 * @features: features advertised to nl80211, see &enum nl80211_feature_flags.
2726 * @bss_priv_size: each BSS struct has private data allocated with it, 2705 * @bss_priv_size: each BSS struct has private data allocated with it,
2727 * this variable determines its size 2706 * this variable determines its size
@@ -2810,7 +2789,7 @@ struct wiphy {
2810 2789
2811 u16 max_acl_mac_addrs; 2790 u16 max_acl_mac_addrs;
2812 2791
2813 u32 flags, features; 2792 u32 flags, regulatory_flags, features;
2814 2793
2815 u32 ap_sme_capa; 2794 u32 ap_sme_capa;
2816 2795
diff --git a/include/net/regulatory.h b/include/net/regulatory.h
index f17ed590d64a..a6a20e2a54c4 100644
--- a/include/net/regulatory.h
+++ b/include/net/regulatory.h
@@ -38,17 +38,17 @@ enum environment_cap {
38 * 38 *
39 * @rcu_head: RCU head struct used to free the request 39 * @rcu_head: RCU head struct used to free the request
40 * @wiphy_idx: this is set if this request's initiator is 40 * @wiphy_idx: this is set if this request's initiator is
41 * %REGDOM_SET_BY_COUNTRY_IE or %REGDOM_SET_BY_DRIVER. This 41 * %REGDOM_SET_BY_COUNTRY_IE or %REGDOM_SET_BY_DRIVER. This
42 * can be used by the wireless core to deal with conflicts 42 * can be used by the wireless core to deal with conflicts
43 * and potentially inform users of which devices specifically 43 * and potentially inform users of which devices specifically
44 * cased the conflicts. 44 * cased the conflicts.
45 * @initiator: indicates who sent this request, could be any of 45 * @initiator: indicates who sent this request, could be any of
46 * of those set in nl80211_reg_initiator (%NL80211_REGDOM_SET_BY_*) 46 * of those set in nl80211_reg_initiator (%NL80211_REGDOM_SET_BY_*)
47 * @alpha2: the ISO / IEC 3166 alpha2 country code of the requested 47 * @alpha2: the ISO / IEC 3166 alpha2 country code of the requested
48 * regulatory domain. We have a few special codes: 48 * regulatory domain. We have a few special codes:
49 * 00 - World regulatory domain 49 * 00 - World regulatory domain
50 * 99 - built by driver but a specific alpha2 cannot be determined 50 * 99 - built by driver but a specific alpha2 cannot be determined
51 * 98 - result of an intersection between two regulatory domains 51 * 98 - result of an intersection between two regulatory domains
52 * 97 - regulatory domain has not yet been configured 52 * 97 - regulatory domain has not yet been configured
53 * @dfs_region: If CRDA responded with a regulatory domain that requires 53 * @dfs_region: If CRDA responded with a regulatory domain that requires
54 * DFS master operation on a known DFS region (NL80211_DFS_*), 54 * DFS master operation on a known DFS region (NL80211_DFS_*),
@@ -59,8 +59,8 @@ enum environment_cap {
59 * of hint passed. This could be any of the %NL80211_USER_REG_HINT_* 59 * of hint passed. This could be any of the %NL80211_USER_REG_HINT_*
60 * types. 60 * types.
61 * @intersect: indicates whether the wireless core should intersect 61 * @intersect: indicates whether the wireless core should intersect
62 * the requested regulatory domain with the presently set regulatory 62 * the requested regulatory domain with the presently set regulatory
63 * domain. 63 * domain.
64 * @processed: indicates whether or not this requests has already been 64 * @processed: indicates whether or not this requests has already been
65 * processed. When the last request is processed it means that the 65 * processed. When the last request is processed it means that the
66 * currently regulatory domain set on cfg80211 is updated from 66 * currently regulatory domain set on cfg80211 is updated from
@@ -68,9 +68,9 @@ enum environment_cap {
68 * the last request is not yet processed we must yield until it 68 * the last request is not yet processed we must yield until it
69 * is processed before processing any new requests. 69 * is processed before processing any new requests.
70 * @country_ie_checksum: checksum of the last processed and accepted 70 * @country_ie_checksum: checksum of the last processed and accepted
71 * country IE 71 * country IE
72 * @country_ie_env: lets us know if the AP is telling us we are outdoor, 72 * @country_ie_env: lets us know if the AP is telling us we are outdoor,
73 * indoor, or if it doesn't matter 73 * indoor, or if it doesn't matter
74 * @list: used to insert into the reg_requests_list linked list 74 * @list: used to insert into the reg_requests_list linked list
75 */ 75 */
76struct regulatory_request { 76struct regulatory_request {
@@ -86,6 +86,39 @@ struct regulatory_request {
86 struct list_head list; 86 struct list_head list;
87}; 87};
88 88
89/**
90 * enum ieee80211_regulatory_flags - device regulatory flags
91 *
92 * @REGULATORY_CUSTOM_REG: tells us the driver for this device
93 * has its own custom regulatory domain and cannot identify the
94 * ISO / IEC 3166 alpha2 it belongs to. When this is enabled
95 * we will disregard the first regulatory hint (when the
96 * initiator is %REGDOM_SET_BY_CORE). Drivers that use
97 * wiphy_apply_custom_regulatory() should have this flag set
98 * or the regulatory core will set it for the wiphy.
99 * @REGULATORY_STRICT_REG: tells us the driver for this device will
100 * ignore regulatory domain settings until it gets its own regulatory
101 * domain via its regulatory_hint() unless the regulatory hint is
102 * from a country IE. After its gets its own regulatory domain it will
103 * only allow further regulatory domain settings to further enhance
104 * compliance. For example if channel 13 and 14 are disabled by this
105 * regulatory domain no user regulatory domain can enable these channels
106 * at a later time. This can be used for devices which do not have
107 * calibration information guaranteed for frequencies or settings
108 * outside of its regulatory domain. If used in combination with
109 * REGULATORY_FLAG_CUSTOM_REG the inspected country IE power settings
110 * will be followed.
111 * @REGULATORY_DISABLE_BEACON_HINTS: enable this if your driver needs to
112 * ensure that passive scan flags and beaconing flags may not be lifted by
113 * cfg80211 due to regulatory beacon hints. For more information on beacon
114 * hints read the documenation for regulatory_hint_found_beacon()
115 */
116enum ieee80211_regulatory_flags {
117 REGULATORY_CUSTOM_REG = BIT(0),
118 REGULATORY_STRICT_REG = BIT(1),
119 REGULATORY_DISABLE_BEACON_HINTS = BIT(2),
120};
121
89struct ieee80211_freq_range { 122struct ieee80211_freq_range {
90 u32 start_freq_khz; 123 u32 start_freq_khz;
91 u32 end_freq_khz; 124 u32 end_freq_khz;
diff --git a/net/wireless/core.c b/net/wireless/core.c
index 9dca0925a1a9..fc968c861ee4 100644
--- a/net/wireless/core.c
+++ b/net/wireless/core.c
@@ -586,7 +586,7 @@ int wiphy_register(struct wiphy *wiphy)
586 if (IS_ERR(rdev->wiphy.debugfsdir)) 586 if (IS_ERR(rdev->wiphy.debugfsdir))
587 rdev->wiphy.debugfsdir = NULL; 587 rdev->wiphy.debugfsdir = NULL;
588 588
589 if (wiphy->flags & WIPHY_FLAG_CUSTOM_REGULATORY) { 589 if (wiphy->regulatory_flags & REGULATORY_CUSTOM_REG) {
590 struct regulatory_request request; 590 struct regulatory_request request;
591 591
592 request.wiphy_idx = get_wiphy_idx(wiphy); 592 request.wiphy_idx = get_wiphy_idx(wiphy);
diff --git a/net/wireless/reg.c b/net/wireless/reg.c
index a75c5eddd25f..e44b4bb20b92 100644
--- a/net/wireless/reg.c
+++ b/net/wireless/reg.c
@@ -868,7 +868,7 @@ static void handle_channel(struct wiphy *wiphy,
868 868
869 if (lr->initiator == NL80211_REGDOM_SET_BY_DRIVER && 869 if (lr->initiator == NL80211_REGDOM_SET_BY_DRIVER &&
870 request_wiphy && request_wiphy == wiphy && 870 request_wiphy && request_wiphy == wiphy &&
871 request_wiphy->flags & WIPHY_FLAG_STRICT_REGULATORY) { 871 request_wiphy->regulatory_flags & REGULATORY_STRICT_REG) {
872 REG_DBG_PRINT("Disabling freq %d MHz for good\n", 872 REG_DBG_PRINT("Disabling freq %d MHz for good\n",
873 chan->center_freq); 873 chan->center_freq);
874 chan->orig_flags |= IEEE80211_CHAN_DISABLED; 874 chan->orig_flags |= IEEE80211_CHAN_DISABLED;
@@ -895,7 +895,7 @@ static void handle_channel(struct wiphy *wiphy,
895 895
896 if (lr->initiator == NL80211_REGDOM_SET_BY_DRIVER && 896 if (lr->initiator == NL80211_REGDOM_SET_BY_DRIVER &&
897 request_wiphy && request_wiphy == wiphy && 897 request_wiphy && request_wiphy == wiphy &&
898 request_wiphy->flags & WIPHY_FLAG_STRICT_REGULATORY) { 898 request_wiphy->regulatory_flags & REGULATORY_STRICT_REG) {
899 /* 899 /*
900 * This guarantees the driver's requested regulatory domain 900 * This guarantees the driver's requested regulatory domain
901 * will always be used as a base for further regulatory 901 * will always be used as a base for further regulatory
@@ -922,12 +922,12 @@ static void handle_channel(struct wiphy *wiphy,
922 if (chan->orig_mpwr) { 922 if (chan->orig_mpwr) {
923 /* 923 /*
924 * Devices that have their own custom regulatory domain 924 * Devices that have their own custom regulatory domain
925 * but also use WIPHY_FLAG_STRICT_REGULATORY will follow the 925 * but also use REGULATORY_STRICT_REG will follow the
926 * passed country IE power settings. 926 * passed country IE power settings.
927 */ 927 */
928 if (initiator == NL80211_REGDOM_SET_BY_COUNTRY_IE && 928 if (initiator == NL80211_REGDOM_SET_BY_COUNTRY_IE &&
929 wiphy->flags & WIPHY_FLAG_CUSTOM_REGULATORY && 929 wiphy->regulatory_flags & REGULATORY_CUSTOM_REG &&
930 wiphy->flags & WIPHY_FLAG_STRICT_REGULATORY) 930 wiphy->regulatory_flags & REGULATORY_STRICT_REG)
931 chan->max_power = chan->max_reg_power; 931 chan->max_power = chan->max_reg_power;
932 else 932 else
933 chan->max_power = min(chan->orig_mpwr, 933 chan->max_power = min(chan->orig_mpwr,
@@ -997,8 +997,8 @@ static bool reg_dev_ignore_cell_hint(struct wiphy *wiphy)
997 997
998static bool wiphy_strict_alpha2_regd(struct wiphy *wiphy) 998static bool wiphy_strict_alpha2_regd(struct wiphy *wiphy)
999{ 999{
1000 if (wiphy->flags & WIPHY_FLAG_STRICT_REGULATORY && 1000 if (wiphy->regulatory_flags & REGULATORY_STRICT_REG &&
1001 !(wiphy->flags & WIPHY_FLAG_CUSTOM_REGULATORY)) 1001 !(wiphy->regulatory_flags & REGULATORY_CUSTOM_REG))
1002 return true; 1002 return true;
1003 return false; 1003 return false;
1004} 1004}
@@ -1016,7 +1016,7 @@ static bool ignore_reg_update(struct wiphy *wiphy,
1016 } 1016 }
1017 1017
1018 if (initiator == NL80211_REGDOM_SET_BY_CORE && 1018 if (initiator == NL80211_REGDOM_SET_BY_CORE &&
1019 wiphy->flags & WIPHY_FLAG_CUSTOM_REGULATORY) { 1019 wiphy->regulatory_flags & REGULATORY_CUSTOM_REG) {
1020 REG_DBG_PRINT("Ignoring regulatory request set by %s " 1020 REG_DBG_PRINT("Ignoring regulatory request set by %s "
1021 "since the driver uses its own custom " 1021 "since the driver uses its own custom "
1022 "regulatory domain\n", 1022 "regulatory domain\n",
@@ -1054,7 +1054,7 @@ static bool reg_is_world_roaming(struct wiphy *wiphy)
1054 return true; 1054 return true;
1055 1055
1056 if (lr && lr->initiator != NL80211_REGDOM_SET_BY_COUNTRY_IE && 1056 if (lr && lr->initiator != NL80211_REGDOM_SET_BY_COUNTRY_IE &&
1057 wiphy->flags & WIPHY_FLAG_CUSTOM_REGULATORY) 1057 wiphy->regulatory_flags & REGULATORY_CUSTOM_REG)
1058 return true; 1058 return true;
1059 1059
1060 return false; 1060 return false;
@@ -1082,7 +1082,7 @@ static void handle_reg_beacon(struct wiphy *wiphy, unsigned int chan_idx,
1082 if (!reg_is_world_roaming(wiphy)) 1082 if (!reg_is_world_roaming(wiphy))
1083 return; 1083 return;
1084 1084
1085 if (wiphy->flags & WIPHY_FLAG_DISABLE_BEACON_HINTS) 1085 if (wiphy->regulatory_flags & REGULATORY_DISABLE_BEACON_HINTS)
1086 return; 1086 return;
1087 1087
1088 chan_before.center_freq = chan->center_freq; 1088 chan_before.center_freq = chan->center_freq;
@@ -1242,7 +1242,7 @@ static void wiphy_update_regulatory(struct wiphy *wiphy,
1242 * as some drivers used this to restore its orig_* reg domain. 1242 * as some drivers used this to restore its orig_* reg domain.
1243 */ 1243 */
1244 if (initiator == NL80211_REGDOM_SET_BY_CORE && 1244 if (initiator == NL80211_REGDOM_SET_BY_CORE &&
1245 wiphy->flags & WIPHY_FLAG_CUSTOM_REGULATORY) 1245 wiphy->regulatory_flags & REGULATORY_CUSTOM_REG)
1246 reg_call_notifier(wiphy, lr); 1246 reg_call_notifier(wiphy, lr);
1247 return; 1247 return;
1248 } 1248 }
@@ -1328,9 +1328,9 @@ void wiphy_apply_custom_regulatory(struct wiphy *wiphy,
1328 enum ieee80211_band band; 1328 enum ieee80211_band band;
1329 unsigned int bands_set = 0; 1329 unsigned int bands_set = 0;
1330 1330
1331 WARN(!(wiphy->flags & WIPHY_FLAG_CUSTOM_REGULATORY), 1331 WARN(!(wiphy->regulatory_flags & REGULATORY_CUSTOM_REG),
1332 "wiphy should have WIPHY_FLAG_CUSTOM_REGULATORY\n"); 1332 "wiphy should have REGULATORY_CUSTOM_REG\n");
1333 wiphy->flags |= WIPHY_FLAG_CUSTOM_REGULATORY; 1333 wiphy->regulatory_flags |= REGULATORY_CUSTOM_REG;
1334 1334
1335 for (band = 0; band < IEEE80211_NUM_BANDS; band++) { 1335 for (band = 0; band < IEEE80211_NUM_BANDS; band++) {
1336 if (!wiphy->bands[band]) 1336 if (!wiphy->bands[band])
@@ -1659,7 +1659,7 @@ static void reg_process_hint(struct regulatory_request *reg_request)
1659 1659
1660 /* This is required so that the orig_* parameters are saved */ 1660 /* This is required so that the orig_* parameters are saved */
1661 if (treatment == REG_REQ_ALREADY_SET && wiphy && 1661 if (treatment == REG_REQ_ALREADY_SET && wiphy &&
1662 wiphy->flags & WIPHY_FLAG_STRICT_REGULATORY) 1662 wiphy->regulatory_flags & REGULATORY_STRICT_REG)
1663 wiphy_update_regulatory(wiphy, reg_request->initiator); 1663 wiphy_update_regulatory(wiphy, reg_request->initiator);
1664} 1664}
1665 1665
@@ -1986,7 +1986,7 @@ static void restore_regulatory_settings(bool reset_user)
1986 world_alpha2[1] = cfg80211_world_regdom->alpha2[1]; 1986 world_alpha2[1] = cfg80211_world_regdom->alpha2[1];
1987 1987
1988 list_for_each_entry(rdev, &cfg80211_rdev_list, list) { 1988 list_for_each_entry(rdev, &cfg80211_rdev_list, list) {
1989 if (rdev->wiphy.flags & WIPHY_FLAG_CUSTOM_REGULATORY) 1989 if (rdev->wiphy.regulatory_flags & REGULATORY_CUSTOM_REG)
1990 restore_custom_reg_settings(&rdev->wiphy); 1990 restore_custom_reg_settings(&rdev->wiphy);
1991 } 1991 }
1992 1992