diff --git a/recipes-kernel/mac80211/mac80211/0009-netmodule-patches.patch b/recipes-kernel/mac80211/mac80211/0009-netmodule-patches.patch index e7e7a7a..caf1648 100644 --- a/recipes-kernel/mac80211/mac80211/0009-netmodule-patches.patch +++ b/recipes-kernel/mac80211/mac80211/0009-netmodule-patches.patch @@ -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);