linux/drivers/net/wireless/ath/ath12k
Baochen Qiang 60fb2cf51e wifi: ath12k: fix EHT TX MCS limitation due to wrong 20 MHz-only parsing
When connecting to an AP configured for EHT 20 MHz with a full EHT
MCS/NSS map (supporting MCS 0-13)

Supported EHT-MCS and NSS Set
    EHT-MCS Map (BW <= 80MHz): 0x444444
        .... .... .... .... .... 0100 = Rx Max Nss That Supports EHT-MCS 0-9: 4
        .... .... .... .... 0100 .... = Tx Max Nss That Supports EHT-MCS 0-9: 4
        .... .... .... 0100 .... .... = Rx Max Nss That Supports EHT-MCS 10-11: 4
        .... .... 0100 .... .... .... = Tx Max Nss That Supports EHT-MCS 10-11: 4
        .... 0100 .... .... .... .... = Rx Max Nss That Supports EHT-MCS 12-13: 4
        0100 .... .... .... .... .... = Tx Max Nss That Supports EHT-MCS 12-13: 4

TX throughput is observed to be significantly lower than expected.
Investigation shows that TX rates are limited to EHT MCS 11, even though
the AP advertises support for EHT MCS 12/13.

The root cause is an incorrect parsing of the Supported EHT-MCS and NSS
Set element in ath12k_peer_assoc_h_eht().

IEEE Std 802.11be-2024 Figure 9-1074as describes the format for 20
MHz-Only Non-AP STAs.

IEEE Std 802.11be-2024 Figure 9-1074at describes the format for all
other AP and non-AP STAs.

Currently the first format is parsed when the peer advertises no wider
HE channel width support, without considering whether it is an AP or a
non-AP STA. This is incorrect: the peer AP's capabilities must be parsed
using Figure 9-1074at even when it operates on 20 MHz only. Parsing it
as Figure 9-1074as causes rx_tx_mcs13_max_nss to be interpreted as zero,
which is then passed to firmware, leading firmware to assume the peer
does not support MCS 13 and to limit TX rates at MCS 11.

Fix this by parsing the Figure 9-1074as format only when the peer is a
20 MHz-Only non-AP STA, i.e. when the local interface operates as AP or
mesh point.

Tested-on: WCN7850 hw2.0 PCI WLAN.HMT.1.1.c5-00302-QCAHMTSWPL_V1.0_V2.0_SILICONZ-1.115823.3

Fixes: 6c95151e2e ("wifi: ath12k: Add EHT MCS/NSS rates to Peer Assoc")
Signed-off-by: Baochen Qiang <baochen.qiang@oss.qualcomm.com>
Reviewed-by: Rameshkumar Sundaram <rameshkumar.sundaram@oss.qualcomm.com>
Link: https://patch.msgid.link/20260514-ath12k-fix-20mhz-only-mcs-map-v1-1-a38d4a9b21a2@oss.qualcomm.com
Signed-off-by: Jeff Johnson <jeff.johnson@oss.qualcomm.com>
2026-05-18 06:47:03 -07:00
..
wifi7 wifi: ath12k: Use michael_mic() from cfg80211 2026-04-08 08:55:15 +02:00
acpi.c
acpi.h
ahb.c wifi: ath12k: Enable IPQ5424 WiFi device support 2026-04-07 17:28:22 -07:00
ahb.h wifi: ath12k: Enable IPQ5424 WiFi device support 2026-04-07 17:28:22 -07:00
ce.c Convert 'alloc_flex' family to use the new default GFP_KERNEL argument 2026-02-21 17:09:51 -08:00
ce.h wifi: ath12k: Add CE remap hardware parameters for IPQ5424 2026-04-07 17:28:22 -07:00
cmn_defs.h wifi: ath12k: Segregate the common and wifi7 specific structures 2025-10-10 07:06:19 -07:00
core.c wifi: ath12k: fix OF node refcount imbalance in WSI graph traversal 2026-04-23 10:57:49 -07:00
core.h wifi: ath12k: Add ath12k_hw_params for IPQ5424 2026-04-07 17:28:21 -07:00
coredump.c
coredump.h
dbring.c wifi: ath12k: Segregate the common and wifi7 specific structures 2025-10-10 07:06:19 -07:00
dbring.h
debug.c wifi: ath12k: Build all the files in wifi7 directory into ath12k_wifi7.ko 2025-11-05 07:16:55 -08:00
debug.h wifi: ath12k: fix wrong logging ID used for CE 2025-09-18 16:43:47 -07:00
debugfs_htt_stats.c wifi: ath12k: Support channel change stats 2026-04-07 17:28:19 -07:00
debugfs_htt_stats.h wifi: ath12k: Support channel change stats 2026-04-07 17:28:19 -07:00
debugfs_sta.c wifi: ath12k: Replace lock/unlock with guard() 2025-11-05 07:16:56 -08:00
debugfs_sta.h wifi: ath12k: Add peer extended Rx statistics debugfs support 2025-02-11 07:27:09 -08:00
debugfs.c wifi: ath12k: Create symlink for each radio in a wiphy 2026-04-07 17:28:20 -07:00
debugfs.h wifi: ath12k: Avoid CPU busy-wait by handling VDEV_STAT and BCN_STAT 2025-06-17 16:28:34 -07:00
dp_cmn.h wifi: ath12k: Move DP specific link stats to DP link peer 2025-11-05 07:16:54 -08:00
dp_htt.c wifi: ath12k: account TX stats only when ACK/BA status is present 2026-03-06 12:23:15 -08:00
dp_htt.h wifi: ath12k: Move HTT specific code from dp.c to newly introduced files 2025-09-03 10:07:00 -07:00
dp_mon.c Merge branch 'ath12k-ng' into ath-next 2025-12-15 08:55:21 -08:00
dp_mon.h Merge branch 'ath12k-ng' into ath-next 2025-12-15 08:55:21 -08:00
dp_peer.c Convert 'alloc_obj' family to use the new default GFP_KERNEL argument 2026-02-21 17:09:51 -08:00
dp_peer.h wifi: ath12k: Use michael_mic() from cfg80211 2026-04-08 08:55:15 +02:00
dp_rx.c wifi: ath12k: fix peer_id usage in normal RX path 2026-05-04 07:15:20 -07:00
dp_rx.h wifi: ath12k: Use michael_mic() from cfg80211 2026-04-08 08:55:15 +02:00
dp_tx.c wifi: ath12k: add the missing RCU lock in ath12k_dp_tx_free_txbuf() 2025-11-19 11:52:08 -08:00
dp_tx.h wifi: ath12k: Use dp objects in performance critical paths 2025-11-05 07:16:56 -08:00
dp.c wifi: ath12k: Use michael_mic() from cfg80211 2026-04-08 08:55:15 +02:00
dp.h Merge branch 'ath12k-ng' into ath-next 2025-12-15 08:55:21 -08:00
fw.c wifi: ath12k: support downloading auxiliary ucode image for QCC2072 2026-01-15 17:19:40 -08:00
fw.h wifi: ath12k: support downloading auxiliary ucode image for QCC2072 2026-01-15 17:19:40 -08:00
hal.c wifi: ath12k: handle REO status ring for QCC2072 2026-01-15 17:19:41 -08:00
hal.h wifi: ath12k: Fix legacy rate mapping for monitor mode capture 2026-03-06 12:23:16 -08:00
hif.h
htc.c Merge branch 'ath12k-ng' into ath-next 2025-12-15 08:55:21 -08:00
htc.h
hw.h wifi: ath12k: support downloading auxiliary ucode image for QCC2072 2026-01-15 17:19:40 -08:00
Kconfig wifi: ath12k: Use michael_mic() from cfg80211 2026-04-08 08:55:15 +02:00
mac.c wifi: ath12k: fix EHT TX MCS limitation due to wrong 20 MHz-only parsing 2026-05-18 06:47:03 -07:00
mac.h wifi: ath12k: support OBSS PD configuration for AP mode 2026-01-30 07:12:37 -08:00
Makefile wifi: ath12k: add basic hwmon temperature reporting 2026-02-26 13:25:39 -08:00
mhi.c Convert 'alloc_obj' family to use the new default GFP_KERNEL argument 2026-02-21 17:09:51 -08:00
mhi.h Merge branch 'ath12k-ng' into ath-next 2025-12-15 08:55:21 -08:00
p2p.c wifi: ath12k: use lockdep_assert_in_rcu_read_lock() for RCU assertions 2026-04-23 10:57:50 -07:00
p2p.h
pci.c wifi: ath12k: fix PCIE_LOCAL_REG_QRTR_NODE_ID definition for QCC2072 2026-01-15 17:19:42 -08:00
pci.h wifi: ath12k: fix PCIE_LOCAL_REG_QRTR_NODE_ID definition for QCC2072 2026-01-15 17:19:42 -08:00
peer.c Convert 'alloc_obj' family to use the new default GFP_KERNEL argument 2026-02-21 17:09:51 -08:00
peer.h wifi: ath12k: Define ath12k_dp_peer structure & APIs for create & delete 2025-10-27 07:02:01 -07:00
qmi.c ath.git patches for v7.1 (PR #1) 2026-03-04 11:40:33 +01:00
qmi.h wifi: ath12k: support downloading auxiliary ucode image for QCC2072 2026-01-15 17:19:40 -08:00
reg.c Convert 'alloc_flex' family to use the new default GFP_KERNEL argument 2026-02-21 17:09:51 -08:00
reg.h wifi: ath12k: handle regulatory hints during mac registration 2025-06-23 07:28:32 -07:00
testmode.c wifi: ath12k: Add framework for hardware specific ieee80211_ops registration 2025-09-30 09:12:58 -07:00
testmode.h
thermal.c wifi: ath12k: add basic hwmon temperature reporting 2026-02-26 13:25:39 -08:00
thermal.h wifi: ath12k: add basic hwmon temperature reporting 2026-02-26 13:25:39 -08:00
trace.c
trace.h
wmi.c wifi: ath12k: initialize RSSI dBm conversion event state 2026-05-04 07:15:20 -07:00
wmi.h wifi: ath12k: Remove unused DFS Unit Test definitions 2026-03-16 08:34:23 -07:00
wow.c Convert 'alloc_obj' family to use the new default GFP_KERNEL argument 2026-02-21 17:09:51 -08:00
wow.h