Skip to content

Commit eed5fcf

Browse files
jhovoldgregkh
authored andcommitted
wifi: ath11k: fix source ring-buffer corruption
commit 6efa0df upstream. Add the missing memory barrier to make sure that LMAC source ring descriptors are written before updating the head pointer to avoid passing stale data to the firmware on weakly ordered architectures like aarch64. Note that non-LMAC rings use MMIO write accessors which have the required write memory barrier. Tested-on: WCN6855 hw2.1 WLAN.HSP.1.1-03125-QCAHSPSWPL_V1_V2_SILICONZ_LITE-3.6510.41 Fixes: d5c6515 ("ath11k: driver for Qualcomm IEEE 802.11ax devices") Cc: stable@vger.kernel.org # 5.6 Signed-off-by: Johan Hovold <johan+linaro@kernel.org> Reviewed-by: Baochen Qiang <quic_bqiang@quicinc.com> Link: https://patch.msgid.link/20250604143457.26032-5-johan+linaro@kernel.org Signed-off-by: Jeff Johnson <jeff.johnson@oss.qualcomm.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
1 parent 0f708ce commit eed5fcf

File tree

1 file changed

+9
-1
lines changed
  • drivers/net/wireless/ath/ath11k

1 file changed

+9
-1
lines changed

drivers/net/wireless/ath/ath11k/hal.c

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -862,7 +862,11 @@ void ath11k_hal_srng_access_end(struct ath11k_base *ab, struct hal_srng *srng)
862862
if (srng->ring_dir == HAL_SRNG_DIR_SRC) {
863863
srng->u.src_ring.last_tp =
864864
*(volatile u32 *)srng->u.src_ring.tp_addr;
865-
*srng->u.src_ring.hp_addr = srng->u.src_ring.hp;
865+
/* Make sure descriptor is written before updating the
866+
* head pointer.
867+
*/
868+
dma_wmb();
869+
WRITE_ONCE(*srng->u.src_ring.hp_addr, srng->u.src_ring.hp);
866870
} else {
867871
srng->u.dst_ring.last_hp = *srng->u.dst_ring.hp_addr;
868872
*srng->u.dst_ring.tp_addr = srng->u.dst_ring.tp;
@@ -871,6 +875,10 @@ void ath11k_hal_srng_access_end(struct ath11k_base *ab, struct hal_srng *srng)
871875
if (srng->ring_dir == HAL_SRNG_DIR_SRC) {
872876
srng->u.src_ring.last_tp =
873877
*(volatile u32 *)srng->u.src_ring.tp_addr;
878+
/* Assume implementation use an MMIO write accessor
879+
* which has the required wmb() so that the descriptor
880+
* is written before the updating the head pointer.
881+
*/
874882
ath11k_hif_write32(ab,
875883
(unsigned long)srng->u.src_ring.hp_addr -
876884
(unsigned long)ab->mem,

0 commit comments

Comments
 (0)