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







[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