[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