[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