FIX: [mac80211] recalc txpower depending on antenna gain

Remark:
This piece of code was missing within the last driver update

BugzId: 72714
This commit is contained in:
Patrick Walther 2021-05-17 16:31:47 +02:00
parent dc032ec273
commit e67d63f8a4
1 changed files with 46 additions and 0 deletions

View File

@ -663,3 +663,49 @@ index 78f2927..4fa5b0d 100644
data->txpower.flags = IW_TXPOW_DBM;
return 0;
diff --git a/net/mac80211/iface.c b/net/mac80211/iface.c
index bf17fa9..0908f4a 100644
--- a/net/mac80211/iface.c
+++ b/net/mac80211/iface.c
@@ -47,7 +47,8 @@ static void ieee80211_iface_work(struct work_struct *work);
bool __ieee80211_recalc_txpower(struct ieee80211_sub_if_data *sdata)
{
struct ieee80211_chanctx_conf *chanctx_conf;
- int power;
+ int power, max_power;
+ struct ieee80211_channel *chan;
rcu_read_lock();
chanctx_conf = rcu_dereference(sdata->vif.chanctx_conf);
@@ -56,15 +57,30 @@ bool __ieee80211_recalc_txpower(struct ieee80211_sub_if_data *sdata)
return false;
}
- power = ieee80211_chandef_max_power(&chanctx_conf->def);
+ power = max_power = ieee80211_chandef_max_power(&chanctx_conf->def);
rcu_read_unlock();
+ chan = chanctx_conf->def.chan;
+ if (sdata->wdev.iftype == NL80211_IFTYPE_STATION ||
+ sdata->wdev.iftype == NL80211_IFTYPE_MESH_POINT) {
+ if (chan->flags & IEEE80211_CHAN_RADAR) {
+ if (chan->max_reg_client_no_tpc_power > 0) {
+ max_power = power = chan->max_reg_client_no_tpc_power;
+ }
+ }
+ }
+
if (sdata->user_power_level != IEEE80211_UNSET_POWER_LEVEL)
power = min(power, sdata->user_power_level);
if (sdata->ap_power_level != IEEE80211_UNSET_POWER_LEVEL)
power = min(power, sdata->ap_power_level);
+ if (sdata->local->user_antenna_gain > 0 && sdata->local->use_chanctx) {
+ max_power -= sdata->local->user_antenna_gain;
+ power = min(power, max_power);
+ }
+
if (power != sdata->vif.bss_conf.txpower) {
sdata->vif.bss_conf.txpower = power;
ieee80211_hw_config(sdata->local, 0);