[PATCH v2 5/5] wifi: mac80211: set tx power per radio in a wiphy

Roopni Devanathan
2025-01-24T17:18:55Z

From: Rameshkumar Sundaram <quic_ramess@quicinc.com>

If set tx power is being done without a valid wdev/sdata
then the configuration applies to the radio but currently
it is being done at wiphy level(i.e. to all radios of wiphy)
since radio identifier is not available.

Use the radio_id argument of ieee80211_set_tx_power() to identify
to which radio of the wiphy the configuration should be applied.
If the wiphy is a multi-radio wiphy(wiphy.n_radios > 0), validate the
radio index of link's channel context against the radio id provided
and apply the configuration.

radio id value of NL80211_WIPHY_RADIO_ID_MAX(255) indicates that radio
index is not mentioned and the configuration applies to all radio(s) of
the wiphy.

Signed-off-by: Rameshkumar Sundaram <quic_ramess@quicinc.com>
---
net/mac80211/cfg.c | 13 +++++++++++++
1 file changed, 13 insertions(+)

diff --git a/net/mac80211/cfg.c b/net/mac80211/cfg.c
index f86350b3a668..ed769672ea77 100644
--- a/net/mac80211/cfg.c
+++ b/net/mac80211/cfg.c
@@ -3079,6 +3079,7 @@ static int ieee80211_set_tx_power(struct wiphy *wiphy,
struct ieee80211_local *local = wiphy_priv(wiphy);
struct ieee80211_sub_if_data *sdata;
enum nl80211_tx_power_setting txp_type = type;
+ struct ieee80211_chanctx_conf *conf;
bool update_txp_type = false;
bool has_monitor = false;
int user_power_level;
@@ -3154,6 +3155,12 @@ static int ieee80211_set_tx_power(struct wiphy *wiphy,
if (!link)
continue;

+ if (radio_id < wiphy->n_radio) {
+ conf = wiphy_dereference(wiphy, link->conf->chanctx_conf);
+ if (!conf || conf->radio_idx != radio_id)
+ continue;
+ }
+
link->user_power_level = local->user_power_level;
if (txp_type != link->conf->txpower_type)
update_txp_type = true;
@@ -3174,6 +3181,12 @@ static int ieee80211_set_tx_power(struct wiphy *wiphy,
if (!link)
continue;

+ if (radio_id < wiphy->n_radio) {
+ conf = wiphy_dereference(wiphy, link->conf->chanctx_conf);
+ if (!conf || conf->radio_idx != radio_id)
+ continue;
+ }
+
ieee80211_recalc_txpower(link, update_txp_type);
}
}
--
2.17.1