Search Linux Wireless

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

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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


-- 
Maxime








[Index of Archives]     [Linux Host AP]     [ATH6KL]     [Linux Wireless Personal Area Network]     [Linux Bluetooth]     [Wireless Regulations]     [Linux Netdev]     [Kernel Newbies]     [Linux Kernel]     [IDE]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite Hiking]     [MIPS Linux]     [ARM Linux]     [Linux RAID]

  Powered by Linux