From: Nithyanantham Paramasivam nithyanantham.paramasivam@oss.qualcomm.com
[ Upstream commit 82993345aef6987a916337ebd2fca3ff4a6250a7 ]
Increase DP_REO_CMD_RING_SIZE from 128 to 256 to avoid queuing failures observed during stress test scenarios.
Tested-on: QCN9274 hw2.0 PCI WLAN.WBE.1.3.1-00173-QCAHKSWPL_SILICONZ-1 Tested-on: WCN7850 hw2.0 PCI WLAN.HMT.1.0.c5-00481-QCAHMTSWPL_V1.0_V2.0_SILICONZ-3
Signed-off-by: Nithyanantham Paramasivam nithyanantham.paramasivam@oss.qualcomm.com Reviewed-by: Baochen Qiang baochen.qiang@oss.qualcomm.com Reviewed-by: Vasanthakumar Thiagarajan vasanthakumar.thiagarajan@oss.qualcomm.com Link: https://patch.msgid.link/20250806111750.3214584-2-nithyanantham.paramasivam@... Signed-off-by: Jeff Johnson jeff.johnson@oss.qualcomm.com Signed-off-by: Sasha Levin sashal@kernel.org ---
LLM Generated explanations, may be completely bogus:
YES - Bumping `DP_REO_CMD_RING_SIZE` to 256 in `drivers/net/wireless/ath/ath12k/dp.h:187` directly enlarges the REO command SRNG that `ath12k_dp_srng_setup()` provisions in `drivers/net/wireless/ath/ath12k/dp.c:555-563`, so the host can queue twice as many HAL_REO commands (peer/TID deletes, cache flushes, stats reads) before the hardware must drain them. - Under the current 128-entry limit, heavy peer churn makes `ath12k_hal_reo_cmd_send()` fall off the ring and return `-ENOBUFS` (`drivers/net/wireless/ath/ath12k/hal_rx.c:223-236`), which propagates straight back to callers via `ath12k_dp_reo_cmd_send()` (`drivers/net/wireless/ath/ath12k/dp_rx.c:650-667`) and leaves TID teardown paths dropping the descriptor while firmware still references it—exactly the “queuing failures” and memory corruption observed during stress. - Ath11k has already shipped with the same 256-entry setting (`drivers/net/wireless/ath/ath11k/dp.h:218`), so the larger ring size is a proven, firmware-compatible configuration for this hardware family rather than a new feature. - The cost of doubling this DMA ring is only ~6 KiB (256 × 48-byte entries), and the SRNG limits in `hal.c/hal.h` leave ample headroom, so the change is low risk and entirely contained to ath12k datapath setup. - Because it prevents a real-world failure that can take the device down, while touching only one constant, the patch squarely fits the stable rules (important bugfix, minimal surface area, no architectural churn).
Natural follow-up for stable maintainers: 1. Consider also backporting the subsequent ath12k retry fix for REO RX queue updates to cover any residual overflow scenarios that might still appear beyond the expanded ring capacity.
drivers/net/wireless/ath/ath12k/dp.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/net/wireless/ath/ath12k/dp.h b/drivers/net/wireless/ath/ath12k/dp.h index 7baa48b86f7ad..10093b4515882 100644 --- a/drivers/net/wireless/ath/ath12k/dp.h +++ b/drivers/net/wireless/ath/ath12k/dp.h @@ -184,7 +184,7 @@ struct ath12k_pdev_dp { #define DP_REO_REINJECT_RING_SIZE 32 #define DP_RX_RELEASE_RING_SIZE 1024 #define DP_REO_EXCEPTION_RING_SIZE 128 -#define DP_REO_CMD_RING_SIZE 128 +#define DP_REO_CMD_RING_SIZE 256 #define DP_REO_STATUS_RING_SIZE 2048 #define DP_RXDMA_BUF_RING_SIZE 4096 #define DP_RX_MAC_BUF_RING_SIZE 2048