Skip to content

Commit 0f708ce

Browse files
jhovoldgregkh
authored andcommitted
wifi: ath11k: fix dest ring-buffer corruption
commit 8c1ba50 upstream. Add the missing memory barrier to make sure that destination ring descriptors are read after the head pointers to avoid using stale data on weakly ordered architectures like aarch64. The barrier is added to the ath11k_hal_srng_access_begin() helper for symmetry with follow-on fixes for source ring buffer corruption which will add barriers to ath11k_hal_srng_access_end(). 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-2-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 d4c7edd commit 0f708ce

File tree

3 files changed

+11
-7
lines changed

3 files changed

+11
-7
lines changed

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

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -393,9 +393,6 @@ static int ath11k_ce_completed_recv_next(struct ath11k_ce_pipe *pipe,
393393
goto err;
394394
}
395395

396-
/* Make sure descriptor is read after the head pointer. */
397-
dma_rmb();
398-
399396
*nbytes = ath11k_hal_ce_dst_status_get_length(desc);
400397

401398
*skb = pipe->dest_ring->skb[sw_index];

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

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2650,9 +2650,6 @@ int ath11k_dp_process_rx(struct ath11k_base *ab, int ring_id,
26502650
try_again:
26512651
ath11k_hal_srng_access_begin(ab, srng);
26522652

2653-
/* Make sure descriptor is read after the head pointer. */
2654-
dma_rmb();
2655-
26562653
while (likely(desc =
26572654
(struct hal_reo_dest_ring *)ath11k_hal_srng_dst_get_next_entry(ab,
26582655
srng))) {

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

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -823,13 +823,23 @@ u32 *ath11k_hal_srng_src_peek(struct ath11k_base *ab, struct hal_srng *srng)
823823

824824
void ath11k_hal_srng_access_begin(struct ath11k_base *ab, struct hal_srng *srng)
825825
{
826+
u32 hp;
827+
826828
lockdep_assert_held(&srng->lock);
827829

828830
if (srng->ring_dir == HAL_SRNG_DIR_SRC) {
829831
srng->u.src_ring.cached_tp =
830832
*(volatile u32 *)srng->u.src_ring.tp_addr;
831833
} else {
832-
srng->u.dst_ring.cached_hp = READ_ONCE(*srng->u.dst_ring.hp_addr);
834+
hp = READ_ONCE(*srng->u.dst_ring.hp_addr);
835+
836+
if (hp != srng->u.dst_ring.cached_hp) {
837+
srng->u.dst_ring.cached_hp = hp;
838+
/* Make sure descriptor is read after the head
839+
* pointer.
840+
*/
841+
dma_rmb();
842+
}
833843

834844
/* Try to prefetch the next descriptor in the ring */
835845
if (srng->flags & HAL_SRNG_FLAGS_CACHED)

0 commit comments

Comments
 (0)