mbox series

[RFC,0/3] wifi: mac80211/ath12k: add support to fill link statistics of multi-link station

Message ID 20250122133424.1226555-1-quic_sarishar@quicinc.com
Headers show
Series wifi: mac80211/ath12k: add support to fill link statistics of multi-link station | expand

Message

Sarika Sharma Jan. 22, 2025, 1:34 p.m. UTC
Currently, station statistics are filled at deflink for both non-ML and
multi-link(ML) station.

Hence, add support to fill station statistics for the corresponding
link of station.

Depends-On: [RFC,v2,00/12] wifi: cfg80211/mac80211: add support to
            handle per link statistics of multi-link station
Link: https://patchwork.kernel.org/project/linux-wireless/cover/20250117124554.3719808-1-quic_sarishar@quicinc.com/

Depends-On: [v10,0/3] wifi: ath12k: report station mode stats
Link: https://patchwork.kernel.org/project/linux-wireless/cover/20250115063537.35797-1-quic_lingbok@quicinc.com/

Sarika Sharma (3):
  wifi: mac80211: correct RX stats packet increment for multi-link
  wifi: ath12k: add link support for multi-link in arsta
  wifi: ath12k: add EHT support for TX rate

 drivers/net/wireless/ath/ath12k/dp_mon.c | 25 +++++++++++++++-------
 drivers/net/wireless/ath/ath12k/dp_rx.c  | 21 ++++++++++++++----
 drivers/net/wireless/ath/ath12k/peer.h   | 27 +++++++++++++++++++++++-
 drivers/net/wireless/ath/ath12k/wmi.h    |  3 ++-
 net/mac80211/rx.c                        | 15 +++++++++++--
 5 files changed, 75 insertions(+), 16 deletions(-)


base-commit: e7ef944b3e2c31b608800925e784f67596375770

Comments

Maxime Bizon Jan. 23, 2025, 1:33 p.m. UTC | #1
On Wed, 2025-01-22 at 19:04 +0530, Sarika Sharma wrote:

Hello,

> +       case WMI_RATE_PREAMBLE_EHT:
> +               arsta->txrate.mcs = mcs;
> +               arsta->txrate.flags = RATE_INFO_FLAGS_EHT_MCS;
> +               arsta->txrate.he_dcm = dcm;
> +               arsta->txrate.eht_gi = ath12k_eht_gi_to_nl80211_eht_gi(sgi);
> +               tones = le16_to_cpu(user_rate->ru_end) -
> +                       le16_to_cpu(user_rate->ru_start) + 1;
> +               v = ath12k_mac_eht_ru_tones_to_nl80211_eht_ru_alloc(tones);
> +               arsta->txrate.eht_ru_alloc = v;
> +               break;
>         }
> 

The logic to set arsta->txrate.bw to RATE_INFO_BW_HE_RU or
RATE_INFO_BW_EHT_RU like in dp_tx completion is missing here.

How about something like this ?

diff --git a/drivers/net/wireless/ath/ath12k/dp.h b/drivers/net/wireless/ath/ath12k/dp.h
index c3c607eae476..de2095ed8863 100644
--- a/drivers/net/wireless/ath/ath12k/dp.h
+++ b/drivers/net/wireless/ath/ath12k/dp.h
@@ -1506,6 +1506,8 @@ enum HTT_PPDU_STATS_PPDU_TYPE {
 #define HTT_PPDU_STATS_USER_RATE_FLAGS_DCM_M           BIT(28)
 #define HTT_PPDU_STATS_USER_RATE_FLAGS_LDPC_M          BIT(29)
 
+#define HTT_USR_RATE_PPDU_TYPE(_val) \
+               le32_get_bits(_val, HTT_PPDU_STATS_USER_RATE_INFO1_PPDU_TYPE_M)
 #define HTT_USR_RATE_PREAMBLE(_val) \
                le32_get_bits(_val, HTT_PPDU_STATS_USER_RATE_FLAGS_PREAMBLE_M)
 #define HTT_USR_RATE_BW(_val) \
diff --git a/drivers/net/wireless/ath/ath12k/dp_rx.c b/drivers/net/wireless/ath/ath12k/dp_rx.c
index eaec3949470d..c8d377544422 100644
--- a/drivers/net/wireless/ath/ath12k/dp_rx.c
+++ b/drivers/net/wireless/ath/ath12k/dp_rx.c
@@ -1370,12 +1370,12 @@ ath12k_update_per_peer_tx_stats(struct ath12k *ar,
        struct htt_ppdu_user_stats *usr_stats = &ppdu_stats->user_stats[user];
        struct htt_ppdu_stats_common *common = &ppdu_stats->common;
        int ret;
-       u8 flags, mcs, nss, bw, sgi, dcm, rate_idx = 0;
+       u8 flags, mcs, nss, bw, sgi, dcm, ppdu_type, rate_idx = 0;
        u32 v, succ_bytes = 0;
        u16 tones, rate = 0, succ_pkts = 0;
        u32 tx_duration = 0;
        u8 tid = HTT_PPDU_STATS_NON_QOS_TID;
-       bool is_ampdu = false;
+       bool is_ofdma, is_ampdu = false;
 
        if (!(usr_stats->tlv_flags & BIT(HTT_PPDU_STATS_TAG_USR_RATE)))
                return;
@@ -1403,6 +1403,9 @@ ath12k_update_per_peer_tx_stats(struct ath12k *ar,
        mcs = HTT_USR_RATE_MCS(user_rate->rate_flags);
        sgi = HTT_USR_RATE_GI(user_rate->rate_flags);
        dcm = HTT_USR_RATE_DCM(user_rate->rate_flags);
+       ppdu_type = HTT_USR_RATE_PPDU_TYPE(user_rate->rate_flags);
+       is_ofdma = (ppdu_type == HTT_PPDU_STATS_PPDU_TYPE_MU_OFDMA) |
+               (ppdu_type == HTT_PPDU_STATS_PPDU_TYPE_MU_MIMO_OFDMA);
 
        /* Note: If host configured fixed rates and in some other special
         * cases, the broadcast/management frames are sent in different rates.
@@ -1479,6 +1482,16 @@ ath12k_update_per_peer_tx_stats(struct ath12k *ar,
                v = ath12k_he_ru_tones_to_nl80211_he_ru_alloc(tones);
                arsta->txrate.he_ru_alloc = v;
                break;
+       case WMI_RATE_PREAMBLE_EHT:
+               arsta->txrate.mcs = mcs;
+               arsta->txrate.flags = RATE_INFO_FLAGS_EHT_MCS;
+               arsta->txrate.he_dcm = dcm;
+               arsta->txrate.eht_gi = ath12k_mac_eht_gi_to_nl80211_eht_gi(sgi);
+               tones = le16_to_cpu(user_rate->ru_end) -
+                       le16_to_cpu(user_rate->ru_start) + 1;
+               v = ath12k_mac_eht_ru_tones_to_nl80211_eht_ru_alloc(tones);
+               arsta->txrate.eht_ru_alloc = v;
+               break;
        }
 
        arsta->txrate.nss = nss;
@@ -1486,6 +1499,13 @@ ath12k_update_per_peer_tx_stats(struct ath12k *ar,
        arsta->tx_duration += tx_duration;
        memcpy(&arsta->last_txrate, &arsta->txrate, sizeof(struct rate_info));
 
+       if (is_ofdma) {
+               if (flags == WMI_RATE_PREAMBLE_HE)
+                       arsta->txrate.bw = RATE_INFO_BW_HE_RU;
+               else if (flags == WMI_RATE_PREAMBLE_EHT)
+                       arsta->txrate.bw = RATE_INFO_BW_EHT_RU;
+       }
+
        /* PPDU stats reported for mgmt packet doesn't have valid tx bytes.
         * So skip peer stats update for mgmt packets.
         */
Sarika Sharma Jan. 24, 2025, 10:08 a.m. UTC | #2
On 1/23/2025 7:03 PM, Maxime Bizon wrote:
> 
> On Wed, 2025-01-22 at 19:04 +0530, Sarika Sharma wrote:
> 
> Hello,
> 
>> +       case WMI_RATE_PREAMBLE_EHT:
>> +               arsta->txrate.mcs = mcs;
>> +               arsta->txrate.flags = RATE_INFO_FLAGS_EHT_MCS;
>> +               arsta->txrate.he_dcm = dcm;
>> +               arsta->txrate.eht_gi = ath12k_eht_gi_to_nl80211_eht_gi(sgi);
>> +               tones = le16_to_cpu(user_rate->ru_end) -
>> +                       le16_to_cpu(user_rate->ru_start) + 1;
>> +               v = ath12k_mac_eht_ru_tones_to_nl80211_eht_ru_alloc(tones);
>> +               arsta->txrate.eht_ru_alloc = v;
>> +               break;
>>          }
>>
> 
> The logic to set arsta->txrate.bw to RATE_INFO_BW_HE_RU or
> RATE_INFO_BW_EHT_RU like in dp_tx completion is missing here.
> 

This patch is to support EHT rates and currently arsta->txrate.bw is 
filled as
arsta->txrate.bw = ath12k_mac_bw_to_mac80211_bw(bw).

Sure will check below suggestion and add another patch to include 
arsta->txrate.bw for both HE and EHT correctly.

> How about something like this ?
> 
> diff --git a/drivers/net/wireless/ath/ath12k/dp.h b/drivers/net/wireless/ath/ath12k/dp.h
> index c3c607eae476..de2095ed8863 100644
> --- a/drivers/net/wireless/ath/ath12k/dp.h
> +++ b/drivers/net/wireless/ath/ath12k/dp.h
> @@ -1506,6 +1506,8 @@ enum HTT_PPDU_STATS_PPDU_TYPE {
>   #define HTT_PPDU_STATS_USER_RATE_FLAGS_DCM_M           BIT(28)
>   #define HTT_PPDU_STATS_USER_RATE_FLAGS_LDPC_M          BIT(29)
>   
> +#define HTT_USR_RATE_PPDU_TYPE(_val) \
> +               le32_get_bits(_val, HTT_PPDU_STATS_USER_RATE_INFO1_PPDU_TYPE_M)
>   #define HTT_USR_RATE_PREAMBLE(_val) \
>                  le32_get_bits(_val, HTT_PPDU_STATS_USER_RATE_FLAGS_PREAMBLE_M)
>   #define HTT_USR_RATE_BW(_val) \
> diff --git a/drivers/net/wireless/ath/ath12k/dp_rx.c b/drivers/net/wireless/ath/ath12k/dp_rx.c
> index eaec3949470d..c8d377544422 100644
> --- a/drivers/net/wireless/ath/ath12k/dp_rx.c
> +++ b/drivers/net/wireless/ath/ath12k/dp_rx.c
> @@ -1370,12 +1370,12 @@ ath12k_update_per_peer_tx_stats(struct ath12k *ar,
>          struct htt_ppdu_user_stats *usr_stats = &ppdu_stats->user_stats[user];
>          struct htt_ppdu_stats_common *common = &ppdu_stats->common;
>          int ret;
> -       u8 flags, mcs, nss, bw, sgi, dcm, rate_idx = 0;
> +       u8 flags, mcs, nss, bw, sgi, dcm, ppdu_type, rate_idx = 0;
>          u32 v, succ_bytes = 0;
>          u16 tones, rate = 0, succ_pkts = 0;
>          u32 tx_duration = 0;
>          u8 tid = HTT_PPDU_STATS_NON_QOS_TID;
> -       bool is_ampdu = false;
> +       bool is_ofdma, is_ampdu = false;
>   
>          if (!(usr_stats->tlv_flags & BIT(HTT_PPDU_STATS_TAG_USR_RATE)))
>                  return;
> @@ -1403,6 +1403,9 @@ ath12k_update_per_peer_tx_stats(struct ath12k *ar,
>          mcs = HTT_USR_RATE_MCS(user_rate->rate_flags);
>          sgi = HTT_USR_RATE_GI(user_rate->rate_flags);
>          dcm = HTT_USR_RATE_DCM(user_rate->rate_flags);
> +       ppdu_type = HTT_USR_RATE_PPDU_TYPE(user_rate->rate_flags);
> +       is_ofdma = (ppdu_type == HTT_PPDU_STATS_PPDU_TYPE_MU_OFDMA) |
> +               (ppdu_type == HTT_PPDU_STATS_PPDU_TYPE_MU_MIMO_OFDMA);
>   
>          /* Note: If host configured fixed rates and in some other special
>           * cases, the broadcast/management frames are sent in different rates.
> @@ -1479,6 +1482,16 @@ ath12k_update_per_peer_tx_stats(struct ath12k *ar,
>                  v = ath12k_he_ru_tones_to_nl80211_he_ru_alloc(tones);
>                  arsta->txrate.he_ru_alloc = v;
>                  break;
> +       case WMI_RATE_PREAMBLE_EHT:
> +               arsta->txrate.mcs = mcs;
> +               arsta->txrate.flags = RATE_INFO_FLAGS_EHT_MCS;
> +               arsta->txrate.he_dcm = dcm;
> +               arsta->txrate.eht_gi = ath12k_mac_eht_gi_to_nl80211_eht_gi(sgi);
> +               tones = le16_to_cpu(user_rate->ru_end) -
> +                       le16_to_cpu(user_rate->ru_start) + 1;
> +               v = ath12k_mac_eht_ru_tones_to_nl80211_eht_ru_alloc(tones);
> +               arsta->txrate.eht_ru_alloc = v;
> +               break;
>          }
>   
>          arsta->txrate.nss = nss;
> @@ -1486,6 +1499,13 @@ ath12k_update_per_peer_tx_stats(struct ath12k *ar,
>          arsta->tx_duration += tx_duration;
>          memcpy(&arsta->last_txrate, &arsta->txrate, sizeof(struct rate_info));
>   
> +       if (is_ofdma) {
> +               if (flags == WMI_RATE_PREAMBLE_HE)
> +                       arsta->txrate.bw = RATE_INFO_BW_HE_RU;
> +               else if (flags == WMI_RATE_PREAMBLE_EHT)
> +                       arsta->txrate.bw = RATE_INFO_BW_EHT_RU;
> +       }
> +
>          /* PPDU stats reported for mgmt packet doesn't have valid tx bytes.
>           * So skip peer stats update for mgmt packets.
>           */
> 
>