Skip to content

Commit e517e20

Browse files
Gaole Zhanggregkh
authored andcommitted
wifi: ath11k: fix NULL pointer dereference in ath11k_hal_srng_access_begin
[ Upstream commit e8d8567 ] In ATH11K_QMI_EVENT_FW_READY, ATH11K_FLAG_REGISTERED is set unconditionally even when ath11k_core_qmi_firmware_ready() fails. This leaves the driver in an inconsistent state where initialization is considered complete although the firmware ready handling did not finish successfully. During the subsequent SSR, the driver enters the restart path based on this incorrect state and dereferences uninitialized srng members, resulting in a NULL pointer dereference. Call trace: ath11k_hal_srng_access_begin+0xc/0x60 [ath11k] (P) ath11k_ce_cleanup_pipes+0x17c/0x180 [ath11k] ath11k_core_restart+0x40/0x168 [ath11k] Fix this by: - skipping firmware_ready if ATH11K_FLAG_REGISTERED is already set - setting ATH11K_FLAG_REGISTERED only when firmware_ready succeeds - setting ATH11K_FLAG_QMI_FAIL and aborting the FW_READY handling on error Tested-on: WCN6750 hw1.0 AHB WLAN.MSL.2.0.c2-00204-QCAMSLSWPLZ-1 Fixes: 6fe62a8 ("wifi: ath11k: Add cold boot calibration support on WCN6750") Signed-off-by: Gaole Zhang <gaole.zhang@oss.qualcomm.com> Reviewed-by: Baochen Qiang <baochen.qiang@oss.qualcomm.com> Reviewed-by: Rameshkumar Sundaram <rameshkumar.sundaram@oss.qualcomm.com> Link: https://patch.msgid.link/20260609090609.4041009-1-gaole.zhang@oss.qualcomm.com Signed-off-by: Jeff Johnson <jeff.johnson@oss.qualcomm.com> Signed-off-by: Sasha Levin <sashal@kernel.org>
1 parent 7f184ca commit e517e20

1 file changed

Lines changed: 8 additions & 3 deletions

File tree

  • drivers/net/wireless/ath/ath11k

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

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3276,9 +3276,14 @@ static void ath11k_qmi_driver_event_work(struct work_struct *work)
32763276
clear_bit(ATH11K_FLAG_CRASH_FLUSH,
32773277
&ab->dev_flags);
32783278
clear_bit(ATH11K_FLAG_RECOVERY, &ab->dev_flags);
3279-
ath11k_core_qmi_firmware_ready(ab);
3280-
set_bit(ATH11K_FLAG_REGISTERED, &ab->dev_flags);
3281-
3279+
if (!test_bit(ATH11K_FLAG_REGISTERED, &ab->dev_flags)) {
3280+
ret = ath11k_core_qmi_firmware_ready(ab);
3281+
if (ret) {
3282+
set_bit(ATH11K_FLAG_QMI_FAIL, &ab->dev_flags);
3283+
break;
3284+
}
3285+
set_bit(ATH11K_FLAG_REGISTERED, &ab->dev_flags);
3286+
}
32823287
break;
32833288
case ATH11K_QMI_EVENT_COLD_BOOT_CAL_DONE:
32843289
break;

0 commit comments

Comments
 (0)