[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