aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFelix Fietkau <nbd@openwrt.org>2013-09-29 12:54:03 +0000
committerFelix Fietkau <nbd@openwrt.org>2013-09-29 12:54:03 +0000
commit9913be8a047dcf96ccc051db123f90fb036a9f7b (patch)
tree6021fbfaa0451f04ef2be1c7f7bc11323c188eb0
parentd3033f20d8a1bd363374180c669cfabbf26097a8 (diff)
downloadupstream-9913be8a047dcf96ccc051db123f90fb036a9f7b.tar.gz
upstream-9913be8a047dcf96ccc051db123f90fb036a9f7b.tar.bz2
upstream-9913be8a047dcf96ccc051db123f90fb036a9f7b.zip
mac80211: really fix the long standing wds ap tx power regression (#14153)
Signed-off-by: Felix Fietkau <nbd@openwrt.org> Backport of r38255 git-svn-id: svn://svn.openwrt.org/openwrt/branches/attitude_adjustment@38256 3c298f89-4303-0410-b956-a3cf2f4a3e73
-rw-r--r--package/mac80211/patches/300-pending_work.patch31
-rw-r--r--package/mac80211/patches/523-mac80211_configure_antenna_gain.patch15
2 files changed, 38 insertions, 8 deletions
diff --git a/package/mac80211/patches/300-pending_work.patch b/package/mac80211/patches/300-pending_work.patch
index 63333bee5c..f3b53097e9 100644
--- a/package/mac80211/patches/300-pending_work.patch
+++ b/package/mac80211/patches/300-pending_work.patch
@@ -1074,3 +1074,34 @@
return -EIO;
rt2800_init_bbp(rt2x00dev);
+--- a/net/mac80211/main.c
++++ b/net/mac80211/main.c
+@@ -101,7 +101,7 @@ static u32 ieee80211_hw_conf_chan(struct
+ struct ieee80211_sub_if_data *sdata;
+ struct cfg80211_chan_def chandef = {};
+ u32 changed = 0;
+- int power;
++ int power = 0;
+ u32 offchannel_flag;
+
+ offchannel_flag = local->hw.conf.flags & IEEE80211_CONF_OFFCHANNEL;
+@@ -155,16 +155,16 @@ static u32 ieee80211_hw_conf_chan(struct
+ changed |= IEEE80211_CONF_CHANGE_SMPS;
+ }
+
+- power = chandef.chan->max_power;
+-
+ rcu_read_lock();
+ list_for_each_entry_rcu(sdata, &local->interfaces, list) {
+ if (!rcu_access_pointer(sdata->vif.chanctx_conf))
+ continue;
+- power = min(power, sdata->vif.bss_conf.txpower);
++ power = max(power, sdata->vif.bss_conf.txpower);
+ }
+ rcu_read_unlock();
+
++ power = min(power, chandef.chan->max_power);
++
+ if (local->hw.conf.power_level != power) {
+ changed |= IEEE80211_CONF_CHANGE_POWER;
+ local->hw.conf.power_level = power;
diff --git a/package/mac80211/patches/523-mac80211_configure_antenna_gain.patch b/package/mac80211/patches/523-mac80211_configure_antenna_gain.patch
index 1e53de4ba0..d247c561db 100644
--- a/package/mac80211/patches/523-mac80211_configure_antenna_gain.patch
+++ b/package/mac80211/patches/523-mac80211_configure_antenna_gain.patch
@@ -120,18 +120,17 @@
const u8 *addr);
--- a/net/mac80211/main.c
+++ b/net/mac80211/main.c
-@@ -101,7 +101,7 @@ static u32 ieee80211_hw_conf_chan(struct
- struct ieee80211_sub_if_data *sdata;
+@@ -102,6 +102,7 @@ static u32 ieee80211_hw_conf_chan(struct
struct cfg80211_chan_def chandef = {};
u32 changed = 0;
-- int power;
-+ int power, ant_gain, max_power;
+ int power = 0;
++ int ant_gain, max_power;
u32 offchannel_flag;
offchannel_flag = local->hw.conf.flags & IEEE80211_CONF_OFFCHANNEL;
-@@ -165,8 +165,21 @@ static u32 ieee80211_hw_conf_chan(struct
- }
- rcu_read_unlock();
+@@ -165,8 +166,21 @@ static u32 ieee80211_hw_conf_chan(struct
+
+ power = min(power, chandef.chan->max_power);
- if (local->hw.conf.power_level != power) {
+ max_power = chandef.chan->max_reg_power;
@@ -152,7 +151,7 @@
local->hw.cur_power_level = power;
local->hw.conf.power_level = power;
}
-@@ -597,6 +610,7 @@ struct ieee80211_hw *ieee80211_alloc_hw(
+@@ -597,6 +611,7 @@ struct ieee80211_hw *ieee80211_alloc_hw(
IEEE80211_RADIOTAP_MCS_HAVE_BW;
local->hw.radiotap_vht_details = IEEE80211_RADIOTAP_VHT_KNOWN_GI |
IEEE80211_RADIOTAP_VHT_KNOWN_BANDWIDTH;