@@ -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;
@@ -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]);
@@ -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) {
@@ -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.
*/
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@quicinc.com> --- 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(-)