[PATCH RFC 3/3] wifi: ath12k: add EHT support for TX rate

Sarika Sharma quic_sarishar at quicinc.com
Fri Jan 24 02:08:12 PST 2025


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.
>           */
> 
> 




More information about the ath12k mailing list