[PATCH v3] wifi: ath12k: fix incorrect HT/VHT/HE/EHT MCS reporting in monitor mode

Baochen Qiang baochen.qiang at oss.qualcomm.com
Sun May 31 22:44:11 PDT 2026



On 5/7/2026 9:53 AM, kwan1996 wrote:
> From: Kwan Lai Chee Hou <laicheehou9 at gmail.com>
> 
> In monitor mode, the driver incorrectly assigns the legacy rate
> to the rate_idx field of the radiotap header for HT/VHT/HE/EHT
> frames, ignoring the actual MCS value parsed from the hardware.
> 
> This causes packet analyzers (like Wireshark) to display incorrect
> MCS values (e.g., legacy base rates instead of the true MCS).
> 
> Fix this by assigning ppdu_info->mcs as the default rate_mcs
> in ath12k_dp_mon_fill_rx_rate(), and remove rate_idx assignments in 
> ath12k_dp_mon_update_radiotap() to preserve
> the previously calculated MCS values (including the HT NSS offset).
> 
> Link: https://bugzilla.kernel.org/show_bug.cgi?id=220864
> 
> Tested-on: QCN9274 hw2.0 PCI WLAN.WBE.1.4.1-00199-QCAHKSWPL_SILICONZ
> 

Fixes: 5393dcb45209 ("wifi: ath12k: change the status update in the monitor Rx") ?

> Signed-off-by: Kwan Lai Chee Hou <laicheehou9 at gmail.com>
> 
> ---
> v3: 
>  - Simplify rate_mcs assignment logic in ath12k_dp_mon_fill_rx_rate.
>  - remove rate_idx assignments in ath12k_dp_mon_update_radiotap to avoid overwriting the HT (802.11n) MCS calculated earlier.
>  
> v2: Fix indentation and formatting issues in v1.
> ---
>  drivers/net/wireless/ath/ath12k/dp_mon.c | 6 ++----
>  1 file changed, 2 insertions(+), 4 deletions(-)
> 
> diff --git a/drivers/net/wireless/ath/ath12k/dp_mon.c b/drivers/net/wireless/ath/ath12k/dp_mon.c
> index 39d1967..79347c3 100644
> --- a/drivers/net/wireless/ath/ath12k/dp_mon.c
> +++ b/drivers/net/wireless/ath/ath12k/dp_mon.c
> @@ -1910,13 +1910,14 @@ ath12k_dp_mon_fill_rx_rate(struct ath12k *ar,
>  	bool is_cck;
>  
>  	pkt_type = ppdu_info->preamble_type;
> -	rate_mcs = ppdu_info->rate;
> +	rate_mcs = ppdu_info->mcs;
>  	nss = ppdu_info->nss;
>  	sgi = ppdu_info->gi;
>  
>  	switch (pkt_type) {
>  	case RX_MSDU_START_PKT_TYPE_11A:
>  	case RX_MSDU_START_PKT_TYPE_11B:
> +		rate_mcs = ppdu_info->rate;
>  		is_cck = (pkt_type == RX_MSDU_START_PKT_TYPE_11B);
>  		if (rx_status->band < NUM_NL80211_BANDS) {
>  			sband = &ar->mac.sbands[rx_status->band];
> @@ -2259,13 +2260,10 @@ static void ath12k_dp_mon_update_radiotap(struct ath12k *ar,
>  		rxs->encoding = RX_ENC_HE;
>  		ptr = skb_push(mon_skb, sizeof(struct ieee80211_radiotap_he));
>  		ath12k_dp_mon_rx_update_radiotap_he(ppduinfo, ptr);
> -		rxs->rate_idx = ppduinfo->rate;
>  	} else if (ppduinfo->vht_flags) {
>  		rxs->encoding = RX_ENC_VHT;
> -		rxs->rate_idx = ppduinfo->rate;
>  	} else if (ppduinfo->ht_flags) {
>  		rxs->encoding = RX_ENC_HT;
> -		rxs->rate_idx = ppduinfo->rate;
>  	} else {
>  		rxs->encoding = RX_ENC_LEGACY;
>  		sband = &ar->mac.sbands[rxs->band];

Reviewed-by: Baochen Qiang <baochen.qiang at oss.qualcomm.com>



More information about the ath12k mailing list