mac80211: really fix the long standing wds ap tx power regression (#14153)
Signed-off-by: Felix Fietkau <nbd@openwrt.org> SVN-Revision: 38255
This commit is contained in:
parent
a94b5fbd5c
commit
f07713f7cf
2 changed files with 38 additions and 8 deletions
|
@ -7822,3 +7822,34 @@
|
||||||
#define AR_SREV_9485_OR_LATER(_ah) \
|
#define AR_SREV_9485_OR_LATER(_ah) \
|
||||||
(((_ah)->hw_version.macVersion >= AR_SREV_VERSION_9485))
|
(((_ah)->hw_version.macVersion >= AR_SREV_VERSION_9485))
|
||||||
|
|
||||||
|
--- 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;
|
||||||
|
|
|
@ -130,18 +130,17 @@
|
||||||
const u8 *addr);
|
const u8 *addr);
|
||||||
--- a/net/mac80211/main.c
|
--- a/net/mac80211/main.c
|
||||||
+++ b/net/mac80211/main.c
|
+++ b/net/mac80211/main.c
|
||||||
@@ -101,7 +101,7 @@ static u32 ieee80211_hw_conf_chan(struct
|
@@ -102,6 +102,7 @@ static u32 ieee80211_hw_conf_chan(struct
|
||||||
struct ieee80211_sub_if_data *sdata;
|
|
||||||
struct cfg80211_chan_def chandef = {};
|
struct cfg80211_chan_def chandef = {};
|
||||||
u32 changed = 0;
|
u32 changed = 0;
|
||||||
- int power;
|
int power = 0;
|
||||||
+ int power, ant_gain, max_power;
|
+ int ant_gain, max_power;
|
||||||
u32 offchannel_flag;
|
u32 offchannel_flag;
|
||||||
|
|
||||||
offchannel_flag = local->hw.conf.flags & IEEE80211_CONF_OFFCHANNEL;
|
offchannel_flag = local->hw.conf.flags & IEEE80211_CONF_OFFCHANNEL;
|
||||||
@@ -165,8 +165,21 @@ static u32 ieee80211_hw_conf_chan(struct
|
@@ -165,8 +166,21 @@ static u32 ieee80211_hw_conf_chan(struct
|
||||||
}
|
|
||||||
rcu_read_unlock();
|
power = min(power, chandef.chan->max_power);
|
||||||
|
|
||||||
- if (local->hw.conf.power_level != power) {
|
- if (local->hw.conf.power_level != power) {
|
||||||
+ max_power = chandef.chan->max_reg_power;
|
+ max_power = chandef.chan->max_reg_power;
|
||||||
|
@ -162,7 +161,7 @@
|
||||||
local->hw.cur_power_level = power;
|
local->hw.cur_power_level = power;
|
||||||
local->hw.conf.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;
|
IEEE80211_RADIOTAP_MCS_HAVE_BW;
|
||||||
local->hw.radiotap_vht_details = IEEE80211_RADIOTAP_VHT_KNOWN_GI |
|
local->hw.radiotap_vht_details = IEEE80211_RADIOTAP_VHT_KNOWN_GI |
|
||||||
IEEE80211_RADIOTAP_VHT_KNOWN_BANDWIDTH;
|
IEEE80211_RADIOTAP_VHT_KNOWN_BANDWIDTH;
|
||||||
|
|
Loading…
Reference in a new issue