Currently, while filling the link level station statistics, valid_links is checked. There might be the case when driver offload link station statistics and does not provide per-link statistics. Hence, add flag WIPHY_FLAG_SUPPORTS_MLO_STA_PER_LINK_STATS in wiphy structure to indicate that driver supports per link station statistics. Set this flag during hw_register if driver supports per-link station statistics and check this flag while filling the station_info structure for MLO. Signed-off-by: Sarika Sharma <quic_sarishar@xxxxxxxxxxx> --- drivers/net/wireless/ath/ath12k/mac.c | 1 + include/net/cfg80211.h | 9 ++++++++- net/mac80211/sta_info.c | 4 +++- net/wireless/nl80211.c | 2 +- 4 files changed, 13 insertions(+), 3 deletions(-) diff --git a/drivers/net/wireless/ath/ath12k/mac.c b/drivers/net/wireless/ath/ath12k/mac.c index ef4f7eb07763..8023b8943fa4 100644 --- a/drivers/net/wireless/ath/ath12k/mac.c +++ b/drivers/net/wireless/ath/ath12k/mac.c @@ -10670,6 +10670,7 @@ static int ath12k_mac_hw_register(struct ath12k_hw *ah) * once WIPHY_FLAG_SUPPORTS_MLO is enabled. */ wiphy->flags |= WIPHY_FLAG_DISABLE_WEXT; + wiphy->flags |= WIPHY_FLAG_SUPPORTS_MLO_STA_PER_LINK_STATS; hw->queues = ATH12K_HW_MAX_QUEUES; wiphy->tx_queue_len = ATH12K_QUEUE_LEN; diff --git a/include/net/cfg80211.h b/include/net/cfg80211.h index 21eafad17d4b..218ecf2b52d1 100644 --- a/include/net/cfg80211.h +++ b/include/net/cfg80211.h @@ -2158,6 +2158,9 @@ struct link_station_info { * @local_pm: local mesh STA power save mode * @peer_pm: peer mesh STA power save mode * @nonpeer_pm: non-peer mesh STA power save mode + * @is_per_link_stats_support: 0- for non-ML STA and for ML STA,if driver + * offload link decisions and do not provide per-link statistics. + * 1- if driver provides per-link statistics. * @assoc_link_id: Indicates MLO link ID of the AP, with which the station * completed (re)association. This information filled for both MLO * and non-MLO STA connections when the AP affiliated with an MLD. @@ -2201,6 +2204,7 @@ struct station_info { enum nl80211_mesh_power_mode peer_pm; enum nl80211_mesh_power_mode nonpeer_pm; + bool is_per_link_stats_support; u8 assoc_link_id; u8 mld_addr[ETH_ALEN] __aligned(2); const u8 *assoc_resp_ies; @@ -5035,6 +5039,8 @@ struct cfg80211_ops { * @WIPHY_FLAG_SUPPORTS_NSTR_NONPRIMARY: support connection to non-primary link * of an NSTR mobile AP MLD. * @WIPHY_FLAG_DISABLE_WEXT: disable wireless extensions for this device + * @WIPHY_FLAG_SUPPORTS_MLO_STA_PER_LINK_STATS: The driver does not offload + * link decisions and provide per-link statistics for MLO STA. */ enum wiphy_flags { WIPHY_FLAG_SUPPORTS_EXT_KEK_KCK = BIT(0), @@ -5063,6 +5069,7 @@ enum wiphy_flags { WIPHY_FLAG_HAS_CHANNEL_SWITCH = BIT(23), WIPHY_FLAG_NOTIFY_REGDOM_BY_DRIVER = BIT(24), WIPHY_FLAG_CHANNEL_CHANGE_ON_BEACON = BIT(25), + WIPHY_FLAG_SUPPORTS_MLO_STA_PER_LINK_STATS = BIT(26), }; /** @@ -8476,7 +8483,7 @@ static inline void cfg80211_sinfo_release_content(struct station_info *sinfo) { int link_id; - if (sinfo->valid_links) { + if (sinfo->is_per_link_stats_support && sinfo->valid_links) { for_each_valid_link(sinfo, link_id) { kfree(sinfo->links[link_id]->pertid); kfree(sinfo->links[link_id]); diff --git a/net/mac80211/sta_info.c b/net/mac80211/sta_info.c index 508bb7aff1f6..4c0235f01eba 100644 --- a/net/mac80211/sta_info.c +++ b/net/mac80211/sta_info.c @@ -2846,6 +2846,8 @@ void sta_set_sinfo(struct sta_info *sta, struct station_info *sinfo, sinfo->generation = sdata->local->sta_generation; sinfo->valid_links = sta->sta.valid_links; + sinfo->is_per_link_stats_support = + !!(sdata->local->hw.wiphy->flags & WIPHY_FLAG_SUPPORTS_MLO_STA_PER_LINK_STATS); sinfo->filled |= BIT_ULL(NL80211_STA_INFO_STA_FLAGS) | BIT_ULL(NL80211_STA_INFO_CONNECTED_TIME) | @@ -2882,7 +2884,7 @@ void sta_set_sinfo(struct sta_info *sta, struct station_info *sinfo, if (test_sta_flag(sta, WLAN_STA_TDLS_PEER)) sinfo->sta_flags.set |= BIT(NL80211_STA_FLAG_TDLS_PEER); - if (sinfo->valid_links) { + if (sinfo->is_per_link_stats_support && sinfo->valid_links) { memcpy(sinfo->mld_addr, sta->addr, ETH_ALEN); for_each_valid_link(sinfo, link_id) { diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c index 2e9dee9c4ef7..ef589a7b3bdb 100644 --- a/net/wireless/nl80211.c +++ b/net/wireless/nl80211.c @@ -6882,7 +6882,7 @@ static int nl80211_send_station(struct sk_buff *msg, u32 cmd, u32 portid, &sinfo->sta_flags)) goto nla_put_failure; - if (sinfo->valid_links) { + if (sinfo->is_per_link_stats_support && sinfo->valid_links) { /* TODO: Add accumulated stats for packets, bytes for * better representation at MLO level. */ -- 2.34.1