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