[PATCH ath-next] wifi: ath12k: account TX stats only when ACK/BA status is present
Baochen Qiang
baochen.qiang at oss.qualcomm.com
Sun Mar 1 17:30:35 PST 2026
On 2/26/2026 1:19 PM, Sarika Sharma wrote:
> The fields tx_retry_failed, tx_retry_count, and tx_duration are
> currently updated outside the HTT_PPDU_STATS_TAG_USR_COMPLTN_ACK_BA_STATUS
> flag check. In certain scenarios, firmware delivers multiple PPDU
> statistics for the same PPDU, first without BA/ACK information, and
> later with BA/ACK status once it becomes available. As the same PPDU
> is processed again, these counters are updated a second time,
> resulting in duplicate TX statistics.
>
> To address this, move the accounting of tx_retry_failed and
> tx_retry_count under the ACK/BA status flag check, and similarly gate
> tx_duration on the same path. This ensures that each PPDU contributes
> to these counters exactly once, avoids double counting, and provides
> consistent reporting in userspace tools such as station dump.
>
> Tested-on: QCN9274 hw2.0 PCI WLAN.WBE.1.6-01243-QCAHKSWPL_SILICONZ-1
>
> Fixes: a0b963e1da5b ("wifi: ath12k: fetch tx_retry and tx_failed from htt_ppdu_stats_user_cmpltn_common_tlv")
> Signed-off-by: Sarika Sharma <sarika.sharma at oss.qualcomm.com>
> ---
> drivers/net/wireless/ath/ath12k/dp_htt.c | 24 +++++++++++++-----------
> 1 file changed, 13 insertions(+), 11 deletions(-)
>
> diff --git a/drivers/net/wireless/ath/ath12k/dp_htt.c b/drivers/net/wireless/ath/ath12k/dp_htt.c
> index cc71c5c5de5a..61c1c3b2350e 100644
> --- a/drivers/net/wireless/ath/ath12k/dp_htt.c
> +++ b/drivers/net/wireless/ath/ath12k/dp_htt.c
> @@ -205,16 +205,9 @@ ath12k_update_per_peer_tx_stats(struct ath12k_pdev_dp *dp_pdev,
> if (!(usr_stats->tlv_flags & BIT(HTT_PPDU_STATS_TAG_USR_RATE)))
> return;
>
> - if (usr_stats->tlv_flags & BIT(HTT_PPDU_STATS_TAG_USR_COMPLTN_COMMON)) {
> + if (usr_stats->tlv_flags & BIT(HTT_PPDU_STATS_TAG_USR_COMPLTN_COMMON))
> is_ampdu =
> HTT_USR_CMPLTN_IS_AMPDU(usr_stats->cmpltn_cmn.flags);
> - tx_retry_failed =
> - __le16_to_cpu(usr_stats->cmpltn_cmn.mpdu_tried) -
> - __le16_to_cpu(usr_stats->cmpltn_cmn.mpdu_success);
> - tx_retry_count =
> - HTT_USR_CMPLTN_LONG_RETRY(usr_stats->cmpltn_cmn.flags) +
> - HTT_USR_CMPLTN_SHORT_RETRY(usr_stats->cmpltn_cmn.flags);
> - }
>
> if (usr_stats->tlv_flags &
> BIT(HTT_PPDU_STATS_TAG_USR_COMPLTN_ACK_BA_STATUS)) {
> @@ -223,10 +216,19 @@ ath12k_update_per_peer_tx_stats(struct ath12k_pdev_dp *dp_pdev,
> HTT_PPDU_STATS_ACK_BA_INFO_NUM_MSDU_M);
> tid = le32_get_bits(usr_stats->ack_ba.info,
> HTT_PPDU_STATS_ACK_BA_INFO_TID_NUM);
> - }
>
> - if (common->fes_duration_us)
> - tx_duration = le32_to_cpu(common->fes_duration_us);
> + if (usr_stats->tlv_flags & BIT(HTT_PPDU_STATS_TAG_USR_COMPLTN_COMMON)) {
> + tx_retry_failed =
> + __le16_to_cpu(usr_stats->cmpltn_cmn.mpdu_tried) -
> + __le16_to_cpu(usr_stats->cmpltn_cmn.mpdu_success);
> + tx_retry_count =
> + HTT_USR_CMPLTN_LONG_RETRY(usr_stats->cmpltn_cmn.flags) +
> + HTT_USR_CMPLTN_SHORT_RETRY(usr_stats->cmpltn_cmn.flags);
> + }
> +
> + if (common->fes_duration_us)
> + tx_duration = le32_to_cpu(common->fes_duration_us);
> + }
>
> user_rate = &usr_stats->rate;
> flags = HTT_USR_RATE_PREAMBLE(user_rate->rate_flags);
>
> base-commit: 62f9b9b19939138c34ce0ac1e5d4969d617ecbb6
Reviewed-by: Baochen Qiang <baochen.qiang at oss.qualcomm.com>
More information about the ath12k
mailing list