Browse Source

mac80211: Allow switching of the ath10k regulatory domain (#1001)

ath10k has to switch the regulatory domain when switching the default
country when ATH_USER_REGD is enabled. This is for example important when
switching from country US (FCC) to DE (ETSI). The ath implementation will
use ath_reg_dyn_country_user_allow to check if this is allowed.

Unfortunately, this function always seems to return false to
ath_reg_notifier_apply even when ATH_USER_REGD is enabled. But it must
actually always accept the requests from the user (when ATH_USER_REGD is
enabled) to correctly set the conformance test limits in the ath10k binary
blob.

Not doing it will sometimes allow too high transmit powers on edge channels
for correctly calibrated devices outside their default regulatory domain.

Signed-off-by: Sven Eckelmann <sven.eckelmann@open-mesh.com>
Sven Eckelmann 7 years ago
parent
commit
86b938553d

+ 70 - 0
patches/openwrt/0088-mac80211-Allow-switching-of-the-ath-regulatory-domain.patch

@@ -0,0 +1,70 @@
+From: Sven Eckelmann <sven.eckelmann@open-mesh.com>
+Date: Fri, 6 Jan 2017 13:29:56 +0100
+Subject: mac80211: Allow switching of the ath regulatory domain
+
+ath10k has to switch the regulatory domain when switching the default
+country when ATH_USER_REGD is enabled. This is for example important when
+switching from country US (FCC) to DE (ETSI). The ath implementation will
+use ath_reg_dyn_country_user_allow to check if this is allowed.
+
+Unfortunately, this function always seems to return false to
+ath_reg_notifier_apply even when ATH_USER_REGD is enabled. But it must
+actually always accept the requests from the user (when ATH_USER_REGD is
+enabled) to correctly set the conformance test limits in the ath10k binary
+blob.
+
+Not doing it will sometimes allow too high transmit powers on edge channels
+for correctly calibrated devices outside their default regulatory domain.
+
+Signed-off-by: Sven Eckelmann <sven.eckelmann@open-mesh.com>
+
+Forwarded: https://github.com/openwrt/openwrt/pull/306
+
+diff --git a/package/kernel/mac80211/patches/402-ath_regd_optional.patch b/package/kernel/mac80211/patches/402-ath_regd_optional.patch
+index 463428371b4c96ee63b6eba1477023ff739c6129..a3572a297718f883f6126fc33aff5e14a046b9a0 100644
+--- a/package/kernel/mac80211/patches/402-ath_regd_optional.patch
++++ b/package/kernel/mac80211/patches/402-ath_regd_optional.patch
+@@ -1,6 +1,15 @@
+ --- a/drivers/net/wireless/ath/regd.c
+ +++ b/drivers/net/wireless/ath/regd.c
+-@@ -341,6 +341,10 @@ ath_reg_apply_beaconing_flags(struct wip
++@@ -188,6 +188,8 @@ static bool dynamic_country_user_possibl
++ 
++ static bool ath_reg_dyn_country_user_allow(struct ath_regulatory *reg)
++ {
+++	if (config_enabled(CPTCFG_ATH_USER_REGD))
+++		return true;
++ 	if (!config_enabled(CPTCFG_ATH_REG_DYNAMIC_USER_REG_HINTS))
++ 		return false;
++ 	if (!dynamic_country_user_possible(reg))
++@@ -341,6 +343,10 @@ ath_reg_apply_beaconing_flags(struct wip
+  	struct ieee80211_channel *ch;
+  	unsigned int i;
+  
+@@ -11,7 +20,7 @@
+  	for (band = 0; band < NUM_NL80211_BANDS; band++) {
+  		if (!wiphy->bands[band])
+  			continue;
+-@@ -374,6 +378,10 @@ ath_reg_apply_ir_flags(struct wiphy *wip
++@@ -374,6 +380,10 @@ ath_reg_apply_ir_flags(struct wiphy *wip
+  {
+  	struct ieee80211_supported_band *sband;
+  
+@@ -22,7 +31,7 @@
+  	sband = wiphy->bands[NL80211_BAND_2GHZ];
+  	if (!sband)
+  		return;
+-@@ -402,6 +410,10 @@ static void ath_reg_apply_radar_flags(st
++@@ -402,6 +412,10 @@ static void ath_reg_apply_radar_flags(st
+  	struct ieee80211_channel *ch;
+  	unsigned int i;
+  
+@@ -33,7 +42,7 @@
+  	if (!wiphy->bands[NL80211_BAND_5GHZ])
+  		return;
+  
+-@@ -633,6 +645,11 @@ ath_regd_init_wiphy(struct ath_regulator
++@@ -633,6 +647,11 @@ ath_regd_init_wiphy(struct ath_regulator
+  	const struct ieee80211_regdomain *regd;
+  
+  	wiphy->reg_notifier = reg_notifier;