Currently, in sta_set_sinfo() during the NL80211_CMD_GET_STATION call, mac80211 sets certain non-MLO applicable fields with default values even for MLO stations. These fields are later cleared in cfg80211 before the data is sent to userspace, resulting in unnecessary operations. Hence, avoid setting these fields for MLO stations to simplify the code and eliminate redundant processing. Signed-off-by: Sarika Sharma --- net/mac80211/sta_info.c | 49 +++++++++++++++++++++++------------------ net/wireless/nl80211.c | 6 ----- 2 files changed, 28 insertions(+), 27 deletions(-) diff --git a/net/mac80211/sta_info.c b/net/mac80211/sta_info.c index e6ed9375105c..981f3e0ecb17 100644 --- a/net/mac80211/sta_info.c +++ b/net/mac80211/sta_info.c @@ -3150,27 +3150,6 @@ void sta_set_sinfo(struct sta_info *sta, struct station_info *sinfo, } } - /* for the average - if pcpu_rx_stats isn't set - rxstats must point to - * the sta->rx_stats struct, so the check here is fine with and without - * pcpu statistics - */ - if (last_rxstats->chains && - !(sinfo->filled & (BIT_ULL(NL80211_STA_INFO_CHAIN_SIGNAL) | - BIT_ULL(NL80211_STA_INFO_CHAIN_SIGNAL_AVG)))) { - sinfo->filled |= BIT_ULL(NL80211_STA_INFO_CHAIN_SIGNAL); - if (!sta->deflink.pcpu_rx_stats) - sinfo->filled |= BIT_ULL(NL80211_STA_INFO_CHAIN_SIGNAL_AVG); - - sinfo->chains = last_rxstats->chains; - - for (i = 0; i < ARRAY_SIZE(sinfo->chain_signal); i++) { - sinfo->chain_signal[i] = - last_rxstats->chain_signal_last[i]; - sinfo->chain_signal_avg[i] = - -ewma_signal_read(&sta->deflink.rx_stats_avg.chain_signal[i]); - } - } - if (!(sinfo->filled & BIT_ULL(NL80211_STA_INFO_TX_BITRATE)) && !sta->sta.valid_links && ieee80211_rate_valid(&sta->deflink.tx_stats.last_rate)) { @@ -3278,6 +3257,34 @@ void sta_set_sinfo(struct sta_info *sta, struct station_info *sinfo, sta_set_link_sinfo(sta, link_sinfo, link, tidstats); sinfo->links[link_id] = link_sinfo; } + } else { + /* + * Set non-MLO applicable fields. + * For the average: if pcpu_rx_stats isn't set, rxstats must + * point to the sta->rx_stats struct, so the check here is fine + * with and without per-CPU statistics. + */ + if (last_rxstats->chains && + !(sinfo->filled & + (BIT_ULL(NL80211_STA_INFO_CHAIN_SIGNAL) | + BIT_ULL(NL80211_STA_INFO_CHAIN_SIGNAL_AVG)))) { + sinfo->filled |= + BIT_ULL(NL80211_STA_INFO_CHAIN_SIGNAL); + if (!sta->deflink.pcpu_rx_stats) + sinfo->filled |= + BIT_ULL(NL80211_STA_INFO_CHAIN_SIGNAL_AVG); + + sinfo->chains = last_rxstats->chains; + + for (i = 0; i < ARRAY_SIZE(sinfo->chain_signal); i++) { + struct ewma_signal chain_signal = + sta->deflink.rx_stats_avg.chain_signal[i]; + sinfo->chain_signal[i] = + last_rxstats->chain_signal_last[i]; + sinfo->chain_signal_avg[i] = + -ewma_signal_read(&chain_signal); + } + } } } diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c index 108583fb2cd2..2a62be4f574a 100644 --- a/net/wireless/nl80211.c +++ b/net/wireless/nl80211.c @@ -8182,12 +8182,6 @@ static void cfg80211_sta_set_mld_sinfo(struct station_info *sinfo) BIT(NL80211_TID_STATS_TX_MSDU_FAILED); } } - - /* Reset sinfo->filled bits to exclude fields which don't make - * much sense at the MLO level. - */ - sinfo->filled &= ~BIT_ULL(NL80211_STA_INFO_CHAIN_SIGNAL); - sinfo->filled &= ~BIT_ULL(NL80211_STA_INFO_CHAIN_SIGNAL_AVG); } static int nl80211_dump_station(struct sk_buff *skb, -- 2.34.1