* [PATCH ath-next v2 0/2] wifi: ath11k: fix SoC reboot on firmware crash on AHB
@ 2026-07-26 22:19 Julius Bairaktaris
2026-07-26 22:19 ` [PATCH ath-next v2 1/2] wifi: ath11k: implement CE interrupt enable/disable for AHB Julius Bairaktaris
` (5 more replies)
0 siblings, 6 replies; 15+ messages in thread
From: Julius Bairaktaris @ 2026-07-26 22:19 UTC (permalink / raw)
To: jjohnson
Cc: ath11k, linux-wireless, linux-kernel, baochen.qiang,
vasanthakumar.thiagarajan, rameshkumar.sundaram
On IPQ8074 every firmware assert takes the whole SoC down. The DP NAPI
keeps polling while ath11k_core_reconfigure_on_crash() frees the data
path underneath it, and dereferences a ring the teardown has already
cleared.
The interrupts used to be disabled at the top of that function.
commit d455e805de70 ("wifi: ath11k: rearrange IRQ enable/disable in reset path")
moved the disable into ath11k_core_reset(), which AHB parts never reach
on a real firmware crash: reset_work is queued only from mhi.c and from
the debugfs hw-restart handler. Patch 2 puts the disable back on the
crash path. Patch 1 is a prerequisite - the CE half of the quiesce is a
no-op on AHB today because the bus never implemented the hif ops.
Reproduced and fixed on a Xiaomi AX3600 (IPQ8074 hw2.0), with no
out-of-tree modules loaded, using the debugfs simulate_fw_crash
'assert' trigger:
before: 2/2 asserts panic in ath11k_dp_rx_process_mon_status() and
reboot the SoC
after: 3/3 asserts recover, 5 firmware boots across a single 397 s
uptime, no panics, both radios stay up
Note the debugfs 'hw-restart' trigger does not reproduce this, since it
goes through ath11k_core_reset() - the one path that still disables the
interrupts. Only a real firmware assert does.
Patch 1 is by inspection: it makes ath11k_hif_ce_irq_disable() take
effect on AHB, which also fixes the existing call in
ath11k_core_reset(). I have not managed to trigger a CE-side crash on
its own, so if you would rather see that split out or dropped, say so.
Changes in v2 (no functional change, review comments from Jeff on 2/2):
- separate the ath-specific Tested-on tag from the upstream tags with a
blank line
- use the standard kernel block comment style, with /* on its own line
v1: https://lore.kernel.org/ath11k/20260725141757.1316877-1-julius@bairaktaris.de/
Julius Bairaktaris (2):
wifi: ath11k: implement CE interrupt enable/disable for AHB
wifi: ath11k: disable interrupts during firmware crash recovery
drivers/net/wireless/ath/ath11k/ahb.c | 9 ++++++++-
drivers/net/wireless/ath/ath11k/core.c | 10 ++++++++++
2 files changed, 18 insertions(+), 1 deletion(-)
--
2.53.0
^ permalink raw reply [flat|nested] 15+ messages in thread* [PATCH ath-next v2 1/2] wifi: ath11k: implement CE interrupt enable/disable for AHB 2026-07-26 22:19 [PATCH ath-next v2 0/2] wifi: ath11k: fix SoC reboot on firmware crash on AHB Julius Bairaktaris @ 2026-07-26 22:19 ` Julius Bairaktaris 2026-07-26 22:19 ` [PATCH ath-next v2 2/2] wifi: ath11k: disable interrupts during firmware crash recovery Julius Bairaktaris ` (4 subsequent siblings) 5 siblings, 0 replies; 15+ messages in thread From: Julius Bairaktaris @ 2026-07-26 22:19 UTC (permalink / raw) To: jjohnson Cc: ath11k, linux-wireless, linux-kernel, baochen.qiang, vasanthakumar.thiagarajan, rameshkumar.sundaram ath11k_core_reset() calls ath11k_hif_ce_irq_disable() right before it powers the target down, but ath11k_ahb_hif_ops_ipq8074 never set the ce_irq_enable/ce_irq_disable pair, and ath11k_hif_ce_irq_disable() does nothing when the op is NULL. On AHB the copy engine interrupts and their tasklets therefore stay live across rproc_shutdown(), where the register space they touch is no longer accessible. Wire the ops up. The sequence is the one ath11k_ahb_stop() already runs, factored into a helper and reused, so behaviour on the stop path is unchanged. wcn6750 is not affected: it uses the pcic ops, which implement the pair already. Assisted-by: Claude:claude-opus-5 Signed-off-by: Julius Bairaktaris <julius@bairaktaris.de> --- drivers/net/wireless/ath/ath11k/ahb.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/drivers/net/wireless/ath/ath11k/ahb.c b/drivers/net/wireless/ath/ath11k/ahb.c index f566d699d074..72da6919c277 100644 --- a/drivers/net/wireless/ath/ath11k/ahb.c +++ b/drivers/net/wireless/ath/ath11k/ahb.c @@ -391,12 +391,17 @@ static void ath11k_ahb_ext_irq_disable(struct ath11k_base *ab) ath11k_ahb_sync_ext_irqs(ab); } -static void ath11k_ahb_stop(struct ath11k_base *ab) +static void ath11k_ahb_ce_irq_disable_sync(struct ath11k_base *ab) { if (!test_bit(ATH11K_FLAG_CRASH_FLUSH, &ab->dev_flags)) ath11k_ahb_ce_irqs_disable(ab); ath11k_ahb_sync_ce_irqs(ab); ath11k_ahb_kill_tasklets(ab); +} + +static void ath11k_ahb_stop(struct ath11k_base *ab) +{ + ath11k_ahb_ce_irq_disable_sync(ab); timer_delete_sync(&ab->rx_replenish_retry); ath11k_ce_cleanup_pipes(ab); } @@ -773,6 +778,8 @@ static const struct ath11k_hif_ops ath11k_ahb_hif_ops_ipq8074 = { .map_service_to_pipe = ath11k_ahb_map_service_to_pipe, .power_down = ath11k_ahb_power_down, .power_up = ath11k_ahb_power_up, + .ce_irq_enable = ath11k_ahb_ce_irqs_enable, + .ce_irq_disable = ath11k_ahb_ce_irq_disable_sync, }; static const struct ath11k_hif_ops ath11k_ahb_hif_ops_wcn6750 = { -- 2.53.0 ^ permalink raw reply [flat|nested] 15+ messages in thread
* [PATCH ath-next v2 2/2] wifi: ath11k: disable interrupts during firmware crash recovery 2026-07-26 22:19 [PATCH ath-next v2 0/2] wifi: ath11k: fix SoC reboot on firmware crash on AHB Julius Bairaktaris 2026-07-26 22:19 ` [PATCH ath-next v2 1/2] wifi: ath11k: implement CE interrupt enable/disable for AHB Julius Bairaktaris @ 2026-07-26 22:19 ` Julius Bairaktaris [not found] ` <CGME20260911075315eucas1p1b4ffb1f57ef187e0a055072ccc0983e3@eucas1p1.samsung.com> 2026-07-31 3:07 ` [PATCH ath-next v2 0/2] wifi: ath11k: fix SoC reboot on firmware crash on AHB Baochen Qiang ` (3 subsequent siblings) 5 siblings, 1 reply; 15+ messages in thread From: Julius Bairaktaris @ 2026-07-26 22:19 UTC (permalink / raw) To: jjohnson Cc: ath11k, linux-wireless, linux-kernel, baochen.qiang, vasanthakumar.thiagarajan, rameshkumar.sundaram On IPQ8074 a firmware assert reboots the SoC: Unable to handle kernel read from unreadable memory at virtual address 0 pc : ath11k_hal_srng_access_begin+0xc/0x60 [ath11k] lr : ath11k_dp_rx_process_mon_status+0x15c/0xd84 [ath11k] Call trace: ath11k_hal_srng_access_begin+0xc/0x60 [ath11k] ath11k_dp_rx_process_mon_rings+0xa0/0x5d4 [ath11k] ath11k_dp_service_srng+0x1f4/0x348 [ath11k] ath11k_ahb_ext_grp_napi_poll+0x34/0xd4 [ath11k_ahb] __napi_poll+0x38/0x188 net_rx_action+0x120/0x2c0 ath11k_core_reconfigure_on_crash() tears the data path down with ath11k_dp_pdev_free(), ath11k_dp_free() and ath11k_hal_srng_clear(), which memsets the ring list. The DP NAPI is still running while that happens, so it services a ring whose address pointer has just been cleared. That function used to disable the interrupts first, until commit d455e805de70 ("wifi: ath11k: rearrange IRQ enable/disable in reset path") moved the disable into ath11k_core_reset(). reset_work is only queued from mhi.c and from the debugfs hw-restart handler, so AHB parts never run it on a real firmware crash. Their recovery goes QMI server exit -> restart_work -> ath11k_core_reconfigure_on_crash() -> ath11k_core_qmi_firmware_ready(), and nothing disables the interrupts anywhere along it. Disable them again on the crash path. The reset path has already done so by the time it gets here, hence the ab->is_reset check. This is also why the debugfs hw-restart trigger never showed the problem: it goes through ath11k_core_reset(), the one path that still had the disable. Tested-on: IPQ8074 hw2.0 AHB WLAN.HK.2.12-01460-QCAHKSWPL_SILICONZ-1 Fixes: d455e805de70 ("wifi: ath11k: rearrange IRQ enable/disable in reset path") Assisted-by: Claude:claude-opus-5 Signed-off-by: Julius Bairaktaris <julius@bairaktaris.de> --- drivers/net/wireless/ath/ath11k/core.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/drivers/net/wireless/ath/ath11k/core.c b/drivers/net/wireless/ath/ath11k/core.c index 8039124e7832..d2ed6a0ea7e3 100644 --- a/drivers/net/wireless/ath/ath11k/core.c +++ b/drivers/net/wireless/ath/ath11k/core.c @@ -2334,6 +2334,16 @@ static int ath11k_core_reconfigure_on_crash(struct ath11k_base *ab) mutex_lock(&ab->core_lock); ath11k_thermal_unregister(ab); + + /* + * ath11k_core_reset() already disabled the interrupts on the reset + * path; only the firmware crash path reaches here with them live. + */ + if (!ab->is_reset) { + ath11k_hif_irq_disable(ab); + ath11k_hif_ce_irq_disable(ab); + } + ath11k_dp_pdev_free(ab); ath11k_cfr_deinit(ab); ath11k_spectral_deinit(ab); -- 2.53.0 ^ permalink raw reply [flat|nested] 15+ messages in thread
[parent not found: <CGME20260911075315eucas1p1b4ffb1f57ef187e0a055072ccc0983e3@eucas1p1.samsung.com>]
* Re: [PATCH ath-next v2 2/2] wifi: ath11k: disable interrupts during firmware crash recovery [not found] ` <CGME20260911075315eucas1p1b4ffb1f57ef187e0a055072ccc0983e3@eucas1p1.samsung.com> @ 2026-09-11 7:53 ` Marek Szyprowski 2026-09-11 16:54 ` Jeff Johnson 2026-09-14 6:32 ` Baochen Qiang 0 siblings, 2 replies; 15+ messages in thread From: Marek Szyprowski @ 2026-09-11 7:53 UTC (permalink / raw) To: Julius Bairaktaris, jjohnson Cc: ath11k, linux-wireless, linux-kernel, baochen.qiang, vasanthakumar.thiagarajan, rameshkumar.sundaram On 27.07.2026 00:19, Julius Bairaktaris wrote: > On IPQ8074 a firmware assert reboots the SoC: > > Unable to handle kernel read from unreadable memory at virtual address 0 > pc : ath11k_hal_srng_access_begin+0xc/0x60 [ath11k] > lr : ath11k_dp_rx_process_mon_status+0x15c/0xd84 [ath11k] > Call trace: > ath11k_hal_srng_access_begin+0xc/0x60 [ath11k] > ath11k_dp_rx_process_mon_rings+0xa0/0x5d4 [ath11k] > ath11k_dp_service_srng+0x1f4/0x348 [ath11k] > ath11k_ahb_ext_grp_napi_poll+0x34/0xd4 [ath11k_ahb] > __napi_poll+0x38/0x188 > net_rx_action+0x120/0x2c0 > > ath11k_core_reconfigure_on_crash() tears the data path down with > ath11k_dp_pdev_free(), ath11k_dp_free() and ath11k_hal_srng_clear(), > which memsets the ring list. The DP NAPI is still running while that > happens, so it services a ring whose address pointer has just been > cleared. > > That function used to disable the interrupts first, until > commit d455e805de70 ("wifi: ath11k: rearrange IRQ enable/disable in reset path") > moved the disable into ath11k_core_reset(). reset_work is only queued > from mhi.c and from the debugfs hw-restart handler, so AHB parts never > run it on a real firmware crash. Their recovery goes QMI server exit -> > restart_work -> ath11k_core_reconfigure_on_crash() -> > ath11k_core_qmi_firmware_ready(), and nothing disables the interrupts > anywhere along it. > > Disable them again on the crash path. The reset path has already done > so by the time it gets here, hence the ab->is_reset check. > > This is also why the debugfs hw-restart trigger never showed the > problem: it goes through ath11k_core_reset(), the one path that still > had the disable. > > Tested-on: IPQ8074 hw2.0 AHB WLAN.HK.2.12-01460-QCAHKSWPL_SILICONZ-1 > > Fixes: d455e805de70 ("wifi: ath11k: rearrange IRQ enable/disable in reset path") > Assisted-by: Claude:claude-opus-5 > Signed-off-by: Julius Bairaktaris <julius@bairaktaris.de> This patch landed recently in linux-next as commit f7a74e131d3f ("wifi: ath11k: disable interrupts during firmware crash recovery"). In my tests I found that it causes a regression on QCOM RB5 board during system suspend/resume cycle (s2idle): # time rtcwake -s10 -mmem rtcwake: assuming RTC uses UTC ... rtcwake: wakeup from "mem" using /dev/rtc0 at Thu Jan 1 00:05:43 1970 PM: suspend entry (s2idle) Filesystems sync: 0.037 seconds Freezing user space processes Freezing user space processes completed (elapsed 0.008 seconds) OOM killer disabled. Freezing remaining freezable tasks Freezing remaining freezable tasks completed (elapsed 0.004 seconds) printk: Suspending console(s) (use no_console_suspend to debug) dwc3-qcom-legacy a6f8800.usb: port-1 HS-PHY not in L2 qcom-pcie 1c08000.pcie: Device not found qcom-pcie 1c10000.pcie: Device not found qcom-pcie 1c00000.pcie: PCIe Gen.2 x1 link up mhi mhi0: Requested to power ON mhi mhi0: Power on setup success mhi mhi0: Wait for device to enter SBL or Mission mode ath11k_pci 0000:01:00.0: chip_id 0x0 chip_family 0xb board_id 0x4 soc_id 0xffffffff ath11k_pci 0000:01:00.0: fw_version 0x10121492 fw_build_timestamp 2021-11-04 11:23 fw_build_id ath11k_pci 0000:01:00.0: failed to receive control response completion, polling.. ath11k_pci 0000:01:00.0: Service connect timeout ath11k_pci 0000:01:00.0: failed to connect to HTT: -110 ath11k_pci 0000:01:00.0: failed to start core: -110 ath11k_pci 0000:01:00.0: failed to reconfigure driver on crash recovery ax88179_178a 2-1.1:1.0 eth0: ax88179 - Link status is: 1 ath11k_pci 0000:01:00.0: timeout while waiting for restart complete ath11k_pci 0000:01:00.0: failed to resume core: -110 ath11k_pci 0000:01:00.0: PM: dpm_run_callback(): pci_pm_resume returns -110 ath11k_pci 0000:01:00.0: PM: failed to resume async: error -110 ath11k_pci 0000:01:00.0: failed to send WMI_PDEV_SET_PARAM cmd ath11k_pci 0000:01:00.0: failed to enable PMF QOS: (-108 ------------[ cut here ]------------ Hardware became unavailable upon resume. This could be a software issue prior to suspend or a hardware issue. WARNING: net/mac80211/util.c:1957 at ieee80211_reconfig+0x508/0x1ed0 [mac80211], CPU#0: kworker/u32:1/61 Modules linked in: ... CPU: 0 UID: 0 PID: 61 Comm: kworker/u32:1 Not tainted 7.2.0+ #13652 PREEMPT Hardware name: Qualcomm Technologies, Inc. Robotics RB5 (DT) Workqueue: async async_run_entry_fn pstate: 60400005 (nZCv daif +PAN -UAO -TCO -DIT -SSBS BTYPE=--) pc : ieee80211_reconfig+0x508/0x1ed0 [mac80211] lr : ieee80211_reconfig+0x508/0x1ed0 [mac80211] .. Call trace: ieee80211_reconfig+0x508/0x1ed0 [mac80211] (P) ieee80211_resume+0x4c/0x68 [mac80211] wiphy_resume+0xb0/0x28c [cfg80211] dpm_run_callback+0x8c/0x158 device_resume+0x128/0x36c async_resume+0x24/0x3c async_run_entry_fn+0x34/0xe0 process_one_work+0x24c/0x844 worker_thread+0x1bc/0x368 kthread+0x134/0x140 ret_from_fork+0x10/0x20 irq event stamp: 701092 hardirqs last enabled at (701091): [<ffffac645b5ec938>] vprintk_store+0x3e4/0x49c hardirqs last disabled at (701092): [<ffffac645c7dc11c>] el1_brk64+0x20/0x60 softirqs last enabled at (701078): [<ffffac640ef2c358>] ath11k_htc_send+0x264/0x2f0 [ath11k] softirqs last disabled at (701076): [<ffffac640ef2c344>] ath11k_htc_send+0x250/0x2f0 [ath11k] ---[ end trace 0000000000000000 ]--- ------------[ cut here ]------------ WARNING: net/mac80211/driver-ops.c:41 at drv_stop+0x24c/0x264 [mac80211], CPU#0: kworker/u32:1/61 Modules linked in: ... CPU: 0 UID: 0 PID: 61 Comm: kworker/u32:1 Tainted: G W 7.2.0+ #13652 PREEMPT Tainted: [W]=WARN Hardware name: Qualcomm Technologies, Inc. Robotics RB5 (DT) Workqueue: async async_run_entry_fn pstate: 60400005 (nZCv daif +PAN -UAO -TCO -DIT -SSBS BTYPE=--) pc : drv_stop+0x24c/0x264 [mac80211] lr : drv_stop+0x23c/0x264 [mac80211] ... Call trace: drv_stop+0x24c/0x264 [mac80211] (P) ieee80211_stop_device+0x80/0x90 [mac80211] ieee80211_do_stop+0x614/0x960 [mac80211] ieee80211_stop+0x68/0xd8 [mac80211] __dev_close_many+0xe0/0x224 netif_close_many+0x8c/0x1c0 netif_close+0x70/0x84 dev_close+0x38/0x60 cfg80211_shutdown_all_interfaces+0x4c/0x138 [cfg80211] wiphy_resume+0xec/0x28c [cfg80211] dpm_run_callback+0x8c/0x158 device_resume+0x128/0x36c async_resume+0x24/0x3c async_run_entry_fn+0x34/0xe0 process_one_work+0x24c/0x844 worker_thread+0x1bc/0x368 kthread+0x134/0x140 ret_from_fork+0x10/0x20 irq event stamp: 701378 hardirqs last enabled at (701377): [<ffffac645c7f21e4>] _raw_spin_unlock_irqrestore+0x6c/0x70 hardirqs last disabled at (701378): [<ffffac645c7dc11c>] el1_brk64+0x20/0x60 softirqs last enabled at (701366): [<ffffac640ed4dedc>] ieee80211_stop_device+0x2c/0x90 [mac80211] softirqs last disabled at (701360): [<ffffac640ed4dec8>] ieee80211_stop_device+0x18/0x90 [mac80211] ---[ end trace 0000000000000000 ]--- ieee80211 phy0: PM: dpm_run_callback(): wiphy_resume [cfg80211] returns -108 ieee80211 phy0: PM: failed to resume async: error -108 OOM killer enabled. Restarting tasks: Starting Restarting tasks: Done random: crng reseeded on system resumption PM: suspend exit Before that commit it worked fine: # time rtcwake -s10 -mmem rtcwake: assuming RTC uses UTC ... rtcwake: wakeup from "mem" using /dev/rtc0 at Thu Jan 1 00:05:42 1970 PM: suspend entry (s2idle) Filesystems sync: 0.042 seconds Freezing user space processes Freezing user space processes completed (elapsed 0.005 seconds) OOM killer disabled. Freezing remaining freezable tasks Freezing remaining freezable tasks completed (elapsed 0.003 seconds) printk: Suspending console(s) (use no_console_suspend to debug) dwc3-qcom-legacy a6f8800.usb: port-1 HS-PHY not in L2 qcom-pcie 1c08000.pcie: Device not found qcom-pcie 1c10000.pcie: Device not found qcom-pcie 1c00000.pcie: PCIe Gen.2 x1 link up mhi mhi0: Requested to power ON mhi mhi0: Power on setup success mhi mhi0: Wait for device to enter SBL or Mission mode ath11k_pci 0000:01:00.0: chip_id 0x0 chip_family 0xb board_id 0x4 soc_id 0xffffffff ath11k_pci 0000:01:00.0: fw_version 0x10121492 fw_build_timestamp 2021-11-04 11:23 fw_build_id OOM killer enabled. Restarting tasks: Starting Restarting tasks: Done random: crng reseeded on system resumption PM: suspend exit > --- > drivers/net/wireless/ath/ath11k/core.c | 10 ++++++++++ > 1 file changed, 10 insertions(+) > > diff --git a/drivers/net/wireless/ath/ath11k/core.c b/drivers/net/wireless/ath/ath11k/core.c > index 8039124e7832..d2ed6a0ea7e3 100644 > --- a/drivers/net/wireless/ath/ath11k/core.c > +++ b/drivers/net/wireless/ath/ath11k/core.c > @@ -2334,6 +2334,16 @@ static int ath11k_core_reconfigure_on_crash(struct ath11k_base *ab) > > mutex_lock(&ab->core_lock); > ath11k_thermal_unregister(ab); > + > + /* > + * ath11k_core_reset() already disabled the interrupts on the reset > + * path; only the firmware crash path reaches here with them live. > + */ > + if (!ab->is_reset) { > + ath11k_hif_irq_disable(ab); > + ath11k_hif_ce_irq_disable(ab); > + } > + > ath11k_dp_pdev_free(ab); > ath11k_cfr_deinit(ab); > ath11k_spectral_deinit(ab); Best regards -- Marek Szyprowski, PhD Samsung R&D Institute Poland ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH ath-next v2 2/2] wifi: ath11k: disable interrupts during firmware crash recovery 2026-09-11 7:53 ` Marek Szyprowski @ 2026-09-11 16:54 ` Jeff Johnson 2026-09-14 6:32 ` Baochen Qiang 1 sibling, 0 replies; 15+ messages in thread From: Jeff Johnson @ 2026-09-11 16:54 UTC (permalink / raw) To: baochen.qiang Cc: ath11k, linux-wireless, linux-kernel, vasanthakumar.thiagarajan, rameshkumar.sundaram, jjohnson, Julius Bairaktaris, Marek Szyprowski On 9/11/2026 12:53 AM, Marek Szyprowski wrote: > On 27.07.2026 00:19, Julius Bairaktaris wrote: >> On IPQ8074 a firmware assert reboots the SoC: >> >> Unable to handle kernel read from unreadable memory at virtual address 0 >> pc : ath11k_hal_srng_access_begin+0xc/0x60 [ath11k] >> lr : ath11k_dp_rx_process_mon_status+0x15c/0xd84 [ath11k] >> Call trace: >> ath11k_hal_srng_access_begin+0xc/0x60 [ath11k] >> ath11k_dp_rx_process_mon_rings+0xa0/0x5d4 [ath11k] >> ath11k_dp_service_srng+0x1f4/0x348 [ath11k] >> ath11k_ahb_ext_grp_napi_poll+0x34/0xd4 [ath11k_ahb] >> __napi_poll+0x38/0x188 >> net_rx_action+0x120/0x2c0 >> >> ath11k_core_reconfigure_on_crash() tears the data path down with >> ath11k_dp_pdev_free(), ath11k_dp_free() and ath11k_hal_srng_clear(), >> which memsets the ring list. The DP NAPI is still running while that >> happens, so it services a ring whose address pointer has just been >> cleared. >> >> That function used to disable the interrupts first, until >> commit d455e805de70 ("wifi: ath11k: rearrange IRQ enable/disable in reset path") >> moved the disable into ath11k_core_reset(). reset_work is only queued >> from mhi.c and from the debugfs hw-restart handler, so AHB parts never >> run it on a real firmware crash. Their recovery goes QMI server exit -> >> restart_work -> ath11k_core_reconfigure_on_crash() -> >> ath11k_core_qmi_firmware_ready(), and nothing disables the interrupts >> anywhere along it. >> >> Disable them again on the crash path. The reset path has already done >> so by the time it gets here, hence the ab->is_reset check. >> >> This is also why the debugfs hw-restart trigger never showed the >> problem: it goes through ath11k_core_reset(), the one path that still >> had the disable. >> >> Tested-on: IPQ8074 hw2.0 AHB WLAN.HK.2.12-01460-QCAHKSWPL_SILICONZ-1 >> >> Fixes: d455e805de70 ("wifi: ath11k: rearrange IRQ enable/disable in reset path") >> Assisted-by: Claude:claude-opus-5 >> Signed-off-by: Julius Bairaktaris <julius@bairaktaris.de> > > > This patch landed recently in linux-next as commit f7a74e131d3f ("wifi: ath11k: > disable interrupts during firmware crash recovery"). In my tests I found that it > causes a regression on QCOM RB5 board during system suspend/resume cycle > (s2idle): > > > # time rtcwake -s10 -mmem > rtcwake: assuming RTC uses UTC ... > rtcwake: wakeup from "mem" using /dev/rtc0 at Thu Jan 1 00:05:43 1970 > PM: suspend entry (s2idle) > Filesystems sync: 0.037 seconds > Freezing user space processes > Freezing user space processes completed (elapsed 0.008 seconds) > OOM killer disabled. > Freezing remaining freezable tasks > Freezing remaining freezable tasks completed (elapsed 0.004 seconds) > printk: Suspending console(s) (use no_console_suspend to debug) > dwc3-qcom-legacy a6f8800.usb: port-1 HS-PHY not in L2 > qcom-pcie 1c08000.pcie: Device not found > qcom-pcie 1c10000.pcie: Device not found > qcom-pcie 1c00000.pcie: PCIe Gen.2 x1 link up > mhi mhi0: Requested to power ON > mhi mhi0: Power on setup success > mhi mhi0: Wait for device to enter SBL or Mission mode > ath11k_pci 0000:01:00.0: chip_id 0x0 chip_family 0xb board_id 0x4 soc_id 0xffffffff > ath11k_pci 0000:01:00.0: fw_version 0x10121492 fw_build_timestamp 2021-11-04 11:23 fw_build_id > ath11k_pci 0000:01:00.0: failed to receive control response completion, polling.. > ath11k_pci 0000:01:00.0: Service connect timeout > ath11k_pci 0000:01:00.0: failed to connect to HTT: -110 > ath11k_pci 0000:01:00.0: failed to start core: -110 > ath11k_pci 0000:01:00.0: failed to reconfigure driver on crash recovery > ax88179_178a 2-1.1:1.0 eth0: ax88179 - Link status is: 1 > ath11k_pci 0000:01:00.0: timeout while waiting for restart complete > ath11k_pci 0000:01:00.0: failed to resume core: -110 > ath11k_pci 0000:01:00.0: PM: dpm_run_callback(): pci_pm_resume returns -110 > ath11k_pci 0000:01:00.0: PM: failed to resume async: error -110 > ath11k_pci 0000:01:00.0: failed to send WMI_PDEV_SET_PARAM cmd > ath11k_pci 0000:01:00.0: failed to enable PMF QOS: (-108 > ------------[ cut here ]------------ > Hardware became unavailable upon resume. This could be a software issue prior to suspend or a hardware issue. > WARNING: net/mac80211/util.c:1957 at ieee80211_reconfig+0x508/0x1ed0 [mac80211], CPU#0: kworker/u32:1/61 > Modules linked in: ... > CPU: 0 UID: 0 PID: 61 Comm: kworker/u32:1 Not tainted 7.2.0+ #13652 PREEMPT > Hardware name: Qualcomm Technologies, Inc. Robotics RB5 (DT) > Workqueue: async async_run_entry_fn > pstate: 60400005 (nZCv daif +PAN -UAO -TCO -DIT -SSBS BTYPE=--) > pc : ieee80211_reconfig+0x508/0x1ed0 [mac80211] > lr : ieee80211_reconfig+0x508/0x1ed0 [mac80211] > .. > Call trace: > ieee80211_reconfig+0x508/0x1ed0 [mac80211] (P) > ieee80211_resume+0x4c/0x68 [mac80211] > wiphy_resume+0xb0/0x28c [cfg80211] > dpm_run_callback+0x8c/0x158 > device_resume+0x128/0x36c > async_resume+0x24/0x3c > async_run_entry_fn+0x34/0xe0 > process_one_work+0x24c/0x844 > worker_thread+0x1bc/0x368 > kthread+0x134/0x140 > ret_from_fork+0x10/0x20 > irq event stamp: 701092 > hardirqs last enabled at (701091): [<ffffac645b5ec938>] vprintk_store+0x3e4/0x49c > hardirqs last disabled at (701092): [<ffffac645c7dc11c>] el1_brk64+0x20/0x60 > softirqs last enabled at (701078): [<ffffac640ef2c358>] ath11k_htc_send+0x264/0x2f0 [ath11k] > softirqs last disabled at (701076): [<ffffac640ef2c344>] ath11k_htc_send+0x250/0x2f0 [ath11k] > ---[ end trace 0000000000000000 ]--- > ------------[ cut here ]------------ > WARNING: net/mac80211/driver-ops.c:41 at drv_stop+0x24c/0x264 [mac80211], CPU#0: kworker/u32:1/61 > Modules linked in: ... > CPU: 0 UID: 0 PID: 61 Comm: kworker/u32:1 Tainted: G W 7.2.0+ #13652 PREEMPT > Tainted: [W]=WARN > Hardware name: Qualcomm Technologies, Inc. Robotics RB5 (DT) > Workqueue: async async_run_entry_fn > pstate: 60400005 (nZCv daif +PAN -UAO -TCO -DIT -SSBS BTYPE=--) > pc : drv_stop+0x24c/0x264 [mac80211] > lr : drv_stop+0x23c/0x264 [mac80211] > ... > Call trace: > drv_stop+0x24c/0x264 [mac80211] (P) > ieee80211_stop_device+0x80/0x90 [mac80211] > ieee80211_do_stop+0x614/0x960 [mac80211] > ieee80211_stop+0x68/0xd8 [mac80211] > __dev_close_many+0xe0/0x224 > netif_close_many+0x8c/0x1c0 > netif_close+0x70/0x84 > dev_close+0x38/0x60 > cfg80211_shutdown_all_interfaces+0x4c/0x138 [cfg80211] > wiphy_resume+0xec/0x28c [cfg80211] > dpm_run_callback+0x8c/0x158 > device_resume+0x128/0x36c > async_resume+0x24/0x3c > async_run_entry_fn+0x34/0xe0 > process_one_work+0x24c/0x844 > worker_thread+0x1bc/0x368 > kthread+0x134/0x140 > ret_from_fork+0x10/0x20 > irq event stamp: 701378 > hardirqs last enabled at (701377): [<ffffac645c7f21e4>] _raw_spin_unlock_irqrestore+0x6c/0x70 > hardirqs last disabled at (701378): [<ffffac645c7dc11c>] el1_brk64+0x20/0x60 > softirqs last enabled at (701366): [<ffffac640ed4dedc>] ieee80211_stop_device+0x2c/0x90 [mac80211] > softirqs last disabled at (701360): [<ffffac640ed4dec8>] ieee80211_stop_device+0x18/0x90 [mac80211] > ---[ end trace 0000000000000000 ]--- > ieee80211 phy0: PM: dpm_run_callback(): wiphy_resume [cfg80211] returns -108 > ieee80211 phy0: PM: failed to resume async: error -108 > OOM killer enabled. > Restarting tasks: Starting > Restarting tasks: Done > random: crng reseeded on system resumption > PM: suspend exit > > > Before that commit it worked fine: > > # time rtcwake -s10 -mmem > rtcwake: assuming RTC uses UTC ... > rtcwake: wakeup from "mem" using /dev/rtc0 at Thu Jan 1 00:05:42 1970 > PM: suspend entry (s2idle) > Filesystems sync: 0.042 seconds > Freezing user space processes > Freezing user space processes completed (elapsed 0.005 seconds) > OOM killer disabled. > Freezing remaining freezable tasks > Freezing remaining freezable tasks completed (elapsed 0.003 seconds) > printk: Suspending console(s) (use no_console_suspend to debug) > dwc3-qcom-legacy a6f8800.usb: port-1 HS-PHY not in L2 > qcom-pcie 1c08000.pcie: Device not found > qcom-pcie 1c10000.pcie: Device not found > qcom-pcie 1c00000.pcie: PCIe Gen.2 x1 link up > mhi mhi0: Requested to power ON > mhi mhi0: Power on setup success > mhi mhi0: Wait for device to enter SBL or Mission mode > ath11k_pci 0000:01:00.0: chip_id 0x0 chip_family 0xb board_id 0x4 soc_id 0xffffffff > ath11k_pci 0000:01:00.0: fw_version 0x10121492 fw_build_timestamp 2021-11-04 11:23 fw_build_id > OOM killer enabled. > Restarting tasks: Starting > Restarting tasks: Done > random: crng reseeded on system resumption > PM: suspend exit Baochen, can you look into this? Thanks! /jeff ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH ath-next v2 2/2] wifi: ath11k: disable interrupts during firmware crash recovery 2026-09-11 7:53 ` Marek Szyprowski 2026-09-11 16:54 ` Jeff Johnson @ 2026-09-14 6:32 ` Baochen Qiang 2026-09-14 6:47 ` Julius Bairaktaris 2026-09-14 7:22 ` Marek Szyprowski 1 sibling, 2 replies; 15+ messages in thread From: Baochen Qiang @ 2026-09-14 6:32 UTC (permalink / raw) To: Marek Szyprowski, Julius Bairaktaris, jjohnson Cc: ath11k, linux-wireless, linux-kernel, vasanthakumar.thiagarajan, rameshkumar.sundaram On 9/11/2026 3:53 PM, Marek Szyprowski wrote: > On 27.07.2026 00:19, Julius Bairaktaris wrote: >> On IPQ8074 a firmware assert reboots the SoC: >> >> Unable to handle kernel read from unreadable memory at virtual address 0 >> pc : ath11k_hal_srng_access_begin+0xc/0x60 [ath11k] >> lr : ath11k_dp_rx_process_mon_status+0x15c/0xd84 [ath11k] >> Call trace: >> ath11k_hal_srng_access_begin+0xc/0x60 [ath11k] >> ath11k_dp_rx_process_mon_rings+0xa0/0x5d4 [ath11k] >> ath11k_dp_service_srng+0x1f4/0x348 [ath11k] >> ath11k_ahb_ext_grp_napi_poll+0x34/0xd4 [ath11k_ahb] >> __napi_poll+0x38/0x188 >> net_rx_action+0x120/0x2c0 >> >> ath11k_core_reconfigure_on_crash() tears the data path down with >> ath11k_dp_pdev_free(), ath11k_dp_free() and ath11k_hal_srng_clear(), >> which memsets the ring list. The DP NAPI is still running while that >> happens, so it services a ring whose address pointer has just been >> cleared. >> >> That function used to disable the interrupts first, until >> commit d455e805de70 ("wifi: ath11k: rearrange IRQ enable/disable in reset path") >> moved the disable into ath11k_core_reset(). reset_work is only queued >> from mhi.c and from the debugfs hw-restart handler, so AHB parts never >> run it on a real firmware crash. Their recovery goes QMI server exit -> >> restart_work -> ath11k_core_reconfigure_on_crash() -> >> ath11k_core_qmi_firmware_ready(), and nothing disables the interrupts >> anywhere along it. >> >> Disable them again on the crash path. The reset path has already done >> so by the time it gets here, hence the ab->is_reset check. >> >> This is also why the debugfs hw-restart trigger never showed the >> problem: it goes through ath11k_core_reset(), the one path that still >> had the disable. >> >> Tested-on: IPQ8074 hw2.0 AHB WLAN.HK.2.12-01460-QCAHKSWPL_SILICONZ-1 >> >> Fixes: d455e805de70 ("wifi: ath11k: rearrange IRQ enable/disable in reset path") >> Assisted-by: Claude:claude-opus-5 >> Signed-off-by: Julius Bairaktaris <julius@bairaktaris.de> > > > This patch landed recently in linux-next as commit f7a74e131d3f ("wifi: ath11k: > disable interrupts during firmware crash recovery"). In my tests I found that it > causes a regression on QCOM RB5 board during system suspend/resume cycle > (s2idle): Hi @Marek, can you please try if below diff can fix this regression? Also, @Julis, can you please also confirm if it can address your original issue as well? diff --git a/drivers/net/wireless/ath/ath11k/core.c b/drivers/net/wireless/ath/ath11k/core.c index d2ed6a0ea7e3..1ad0a47653de 100644 --- a/drivers/net/wireless/ath/ath11k/core.c +++ b/drivers/net/wireless/ath/ath11k/core.c @@ -1275,9 +1275,6 @@ int ath11k_core_suspend_late(struct ath11k_base *ab) if (ab->actual_pm_policy == ATH11K_PM_WOW) return 0; - ath11k_hif_irq_disable(ab); - ath11k_hif_ce_irq_disable(ab); - ath11k_hif_power_down(ab, true); return 0; @@ -2333,17 +2330,9 @@ static int ath11k_core_reconfigure_on_crash(struct ath11k_base *ab) int ret; mutex_lock(&ab->core_lock); + ath11k_hif_irq_disable(ab); + ath11k_hif_ce_irq_disable(ab); ath11k_thermal_unregister(ab); - - /* - * ath11k_core_reset() already disabled the interrupts on the reset - * path; only the firmware crash path reaches here with them live. - */ - if (!ab->is_reset) { - ath11k_hif_irq_disable(ab); - ath11k_hif_ce_irq_disable(ab); - } - ath11k_dp_pdev_free(ab); ath11k_cfr_deinit(ab); ath11k_spectral_deinit(ab); @@ -2605,9 +2594,6 @@ static void ath11k_core_reset(struct work_struct *work) time_left = wait_for_completion_timeout(&ab->recovery_start, ATH11K_RECOVER_START_TIMEOUT_HZ); - ath11k_hif_irq_disable(ab); - ath11k_hif_ce_irq_disable(ab); - ath11k_hif_power_down(ab, false); ath11k_hif_power_up(ab); -- 2.34.1 ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH ath-next v2 2/2] wifi: ath11k: disable interrupts during firmware crash recovery 2026-09-14 6:32 ` Baochen Qiang @ 2026-09-14 6:47 ` Julius Bairaktaris 2026-09-14 7:22 ` Marek Szyprowski 1 sibling, 0 replies; 15+ messages in thread From: Julius Bairaktaris @ 2026-09-14 6:47 UTC (permalink / raw) To: Baochen Qiang Cc: Marek Szyprowski, jjohnson, ath11k, linux-wireless, linux-kernel, vasanthakumar.thiagarajan, rameshkumar.sundaram Hi Baochen, I am without my router until 21 September 2026 and will report back then. Julius Am Mo., 14. Sept. 2026 um 06:32 Uhr schrieb Baochen Qiang <baochen.qiang@oss.qualcomm.com>: > > > > On 9/11/2026 3:53 PM, Marek Szyprowski wrote: > > On 27.07.2026 00:19, Julius Bairaktaris wrote: > >> On IPQ8074 a firmware assert reboots the SoC: > >> > >> Unable to handle kernel read from unreadable memory at virtual address 0 > >> pc : ath11k_hal_srng_access_begin+0xc/0x60 [ath11k] > >> lr : ath11k_dp_rx_process_mon_status+0x15c/0xd84 [ath11k] > >> Call trace: > >> ath11k_hal_srng_access_begin+0xc/0x60 [ath11k] > >> ath11k_dp_rx_process_mon_rings+0xa0/0x5d4 [ath11k] > >> ath11k_dp_service_srng+0x1f4/0x348 [ath11k] > >> ath11k_ahb_ext_grp_napi_poll+0x34/0xd4 [ath11k_ahb] > >> __napi_poll+0x38/0x188 > >> net_rx_action+0x120/0x2c0 > >> > >> ath11k_core_reconfigure_on_crash() tears the data path down with > >> ath11k_dp_pdev_free(), ath11k_dp_free() and ath11k_hal_srng_clear(), > >> which memsets the ring list. The DP NAPI is still running while that > >> happens, so it services a ring whose address pointer has just been > >> cleared. > >> > >> That function used to disable the interrupts first, until > >> commit d455e805de70 ("wifi: ath11k: rearrange IRQ enable/disable in reset path") > >> moved the disable into ath11k_core_reset(). reset_work is only queued > >> from mhi.c and from the debugfs hw-restart handler, so AHB parts never > >> run it on a real firmware crash. Their recovery goes QMI server exit -> > >> restart_work -> ath11k_core_reconfigure_on_crash() -> > >> ath11k_core_qmi_firmware_ready(), and nothing disables the interrupts > >> anywhere along it. > >> > >> Disable them again on the crash path. The reset path has already done > >> so by the time it gets here, hence the ab->is_reset check. > >> > >> This is also why the debugfs hw-restart trigger never showed the > >> problem: it goes through ath11k_core_reset(), the one path that still > >> had the disable. > >> > >> Tested-on: IPQ8074 hw2.0 AHB WLAN.HK.2.12-01460-QCAHKSWPL_SILICONZ-1 > >> > >> Fixes: d455e805de70 ("wifi: ath11k: rearrange IRQ enable/disable in reset path") > >> Assisted-by: Claude:claude-opus-5 > >> Signed-off-by: Julius Bairaktaris <julius@bairaktaris.de> > > > > > > This patch landed recently in linux-next as commit f7a74e131d3f ("wifi: ath11k: > > disable interrupts during firmware crash recovery"). In my tests I found that it > > causes a regression on QCOM RB5 board during system suspend/resume cycle > > (s2idle): > > Hi @Marek, can you please try if below diff can fix this regression? Also, @Julis, can you > please also confirm if it can address your original issue as well? > > diff --git a/drivers/net/wireless/ath/ath11k/core.c b/drivers/net/wireless/ath/ath11k/core.c > index d2ed6a0ea7e3..1ad0a47653de 100644 > --- a/drivers/net/wireless/ath/ath11k/core.c > +++ b/drivers/net/wireless/ath/ath11k/core.c > @@ -1275,9 +1275,6 @@ int ath11k_core_suspend_late(struct ath11k_base *ab) > if (ab->actual_pm_policy == ATH11K_PM_WOW) > return 0; > > - ath11k_hif_irq_disable(ab); > - ath11k_hif_ce_irq_disable(ab); > - > ath11k_hif_power_down(ab, true); > > return 0; > @@ -2333,17 +2330,9 @@ static int ath11k_core_reconfigure_on_crash(struct ath11k_base *ab) > int ret; > > mutex_lock(&ab->core_lock); > + ath11k_hif_irq_disable(ab); > + ath11k_hif_ce_irq_disable(ab); > ath11k_thermal_unregister(ab); > - > - /* > - * ath11k_core_reset() already disabled the interrupts on the reset > - * path; only the firmware crash path reaches here with them live. > - */ > - if (!ab->is_reset) { > - ath11k_hif_irq_disable(ab); > - ath11k_hif_ce_irq_disable(ab); > - } > - > ath11k_dp_pdev_free(ab); > ath11k_cfr_deinit(ab); > ath11k_spectral_deinit(ab); > @@ -2605,9 +2594,6 @@ static void ath11k_core_reset(struct work_struct *work) > time_left = wait_for_completion_timeout(&ab->recovery_start, > ATH11K_RECOVER_START_TIMEOUT_HZ); > > - ath11k_hif_irq_disable(ab); > - ath11k_hif_ce_irq_disable(ab); > - > ath11k_hif_power_down(ab, false); > ath11k_hif_power_up(ab); > > -- > 2.34.1 > ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH ath-next v2 2/2] wifi: ath11k: disable interrupts during firmware crash recovery 2026-09-14 6:32 ` Baochen Qiang 2026-09-14 6:47 ` Julius Bairaktaris @ 2026-09-14 7:22 ` Marek Szyprowski 2026-09-20 16:42 ` Julius Bairaktaris 1 sibling, 1 reply; 15+ messages in thread From: Marek Szyprowski @ 2026-09-14 7:22 UTC (permalink / raw) To: Baochen Qiang, Julius Bairaktaris, jjohnson Cc: ath11k, linux-wireless, linux-kernel, vasanthakumar.thiagarajan, rameshkumar.sundaram On 14.09.2026 08:32, Baochen Qiang wrote: > On 9/11/2026 3:53 PM, Marek Szyprowski wrote: >> On 27.07.2026 00:19, Julius Bairaktaris wrote: >>> On IPQ8074 a firmware assert reboots the SoC: >>> >>> Unable to handle kernel read from unreadable memory at virtual address 0 >>> pc : ath11k_hal_srng_access_begin+0xc/0x60 [ath11k] >>> lr : ath11k_dp_rx_process_mon_status+0x15c/0xd84 [ath11k] >>> Call trace: >>> ath11k_hal_srng_access_begin+0xc/0x60 [ath11k] >>> ath11k_dp_rx_process_mon_rings+0xa0/0x5d4 [ath11k] >>> ath11k_dp_service_srng+0x1f4/0x348 [ath11k] >>> ath11k_ahb_ext_grp_napi_poll+0x34/0xd4 [ath11k_ahb] >>> __napi_poll+0x38/0x188 >>> net_rx_action+0x120/0x2c0 >>> >>> ath11k_core_reconfigure_on_crash() tears the data path down with >>> ath11k_dp_pdev_free(), ath11k_dp_free() and ath11k_hal_srng_clear(), >>> which memsets the ring list. The DP NAPI is still running while that >>> happens, so it services a ring whose address pointer has just been >>> cleared. >>> >>> That function used to disable the interrupts first, until >>> commit d455e805de70 ("wifi: ath11k: rearrange IRQ enable/disable in reset path") >>> moved the disable into ath11k_core_reset(). reset_work is only queued >>> from mhi.c and from the debugfs hw-restart handler, so AHB parts never >>> run it on a real firmware crash. Their recovery goes QMI server exit -> >>> restart_work -> ath11k_core_reconfigure_on_crash() -> >>> ath11k_core_qmi_firmware_ready(), and nothing disables the interrupts >>> anywhere along it. >>> >>> Disable them again on the crash path. The reset path has already done >>> so by the time it gets here, hence the ab->is_reset check. >>> >>> This is also why the debugfs hw-restart trigger never showed the >>> problem: it goes through ath11k_core_reset(), the one path that still >>> had the disable. >>> >>> Tested-on: IPQ8074 hw2.0 AHB WLAN.HK.2.12-01460-QCAHKSWPL_SILICONZ-1 >>> >>> Fixes: d455e805de70 ("wifi: ath11k: rearrange IRQ enable/disable in reset path") >>> Assisted-by: Claude:claude-opus-5 >>> Signed-off-by: Julius Bairaktaris <julius@bairaktaris.de> >> >> This patch landed recently in linux-next as commit f7a74e131d3f ("wifi: ath11k: >> disable interrupts during firmware crash recovery"). In my tests I found that it >> causes a regression on QCOM RB5 board during system suspend/resume cycle >> (s2idle): > Hi @Marek, can you please try if below diff can fix this regression? Also, @Julis, can you > please also confirm if it can address your original issue as well? Works fine in my tests, feel free to add: Reported-by: Marek Szyprowski <m.szyprowski@samsung.com> Tested-by: Marek Szyprowski <m.szyprowski@samsung.com> > diff --git a/drivers/net/wireless/ath/ath11k/core.c b/drivers/net/wireless/ath/ath11k/core.c > index d2ed6a0ea7e3..1ad0a47653de 100644 > --- a/drivers/net/wireless/ath/ath11k/core.c > +++ b/drivers/net/wireless/ath/ath11k/core.c > @@ -1275,9 +1275,6 @@ int ath11k_core_suspend_late(struct ath11k_base *ab) > if (ab->actual_pm_policy == ATH11K_PM_WOW) > return 0; > > - ath11k_hif_irq_disable(ab); > - ath11k_hif_ce_irq_disable(ab); > - > ath11k_hif_power_down(ab, true); > > return 0; > @@ -2333,17 +2330,9 @@ static int ath11k_core_reconfigure_on_crash(struct ath11k_base *ab) > int ret; > > mutex_lock(&ab->core_lock); > + ath11k_hif_irq_disable(ab); > + ath11k_hif_ce_irq_disable(ab); > ath11k_thermal_unregister(ab); > - > - /* > - * ath11k_core_reset() already disabled the interrupts on the reset > - * path; only the firmware crash path reaches here with them live. > - */ > - if (!ab->is_reset) { > - ath11k_hif_irq_disable(ab); > - ath11k_hif_ce_irq_disable(ab); > - } > - > ath11k_dp_pdev_free(ab); > ath11k_cfr_deinit(ab); > ath11k_spectral_deinit(ab); > @@ -2605,9 +2594,6 @@ static void ath11k_core_reset(struct work_struct *work) > time_left = wait_for_completion_timeout(&ab->recovery_start, > ATH11K_RECOVER_START_TIMEOUT_HZ); > > - ath11k_hif_irq_disable(ab); > - ath11k_hif_ce_irq_disable(ab); > - > ath11k_hif_power_down(ab, false); > ath11k_hif_power_up(ab); > Best regards -- Marek Szyprowski, PhD Samsung R&D Institute Poland ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH ath-next v2 2/2] wifi: ath11k: disable interrupts during firmware crash recovery 2026-09-14 7:22 ` Marek Szyprowski @ 2026-09-20 16:42 ` Julius Bairaktaris 2026-09-21 3:17 ` Baochen Qiang 0 siblings, 1 reply; 15+ messages in thread From: Julius Bairaktaris @ 2026-09-20 16:42 UTC (permalink / raw) To: Marek Szyprowski Cc: Baochen Qiang, jjohnson, ath11k, linux-wireless, linux-kernel, vasanthakumar.thiagarajan, rameshkumar.sundaram Hi @Baochen, tested 5 times and it solves the problem. Thanks! Julius Am Mo., 14. Sept. 2026 um 07:22 Uhr schrieb Marek Szyprowski <m.szyprowski@samsung.com>: > > On 14.09.2026 08:32, Baochen Qiang wrote: > > On 9/11/2026 3:53 PM, Marek Szyprowski wrote: > >> On 27.07.2026 00:19, Julius Bairaktaris wrote: > >>> On IPQ8074 a firmware assert reboots the SoC: > >>> > >>> Unable to handle kernel read from unreadable memory at virtual address 0 > >>> pc : ath11k_hal_srng_access_begin+0xc/0x60 [ath11k] > >>> lr : ath11k_dp_rx_process_mon_status+0x15c/0xd84 [ath11k] > >>> Call trace: > >>> ath11k_hal_srng_access_begin+0xc/0x60 [ath11k] > >>> ath11k_dp_rx_process_mon_rings+0xa0/0x5d4 [ath11k] > >>> ath11k_dp_service_srng+0x1f4/0x348 [ath11k] > >>> ath11k_ahb_ext_grp_napi_poll+0x34/0xd4 [ath11k_ahb] > >>> __napi_poll+0x38/0x188 > >>> net_rx_action+0x120/0x2c0 > >>> > >>> ath11k_core_reconfigure_on_crash() tears the data path down with > >>> ath11k_dp_pdev_free(), ath11k_dp_free() and ath11k_hal_srng_clear(), > >>> which memsets the ring list. The DP NAPI is still running while that > >>> happens, so it services a ring whose address pointer has just been > >>> cleared. > >>> > >>> That function used to disable the interrupts first, until > >>> commit d455e805de70 ("wifi: ath11k: rearrange IRQ enable/disable in reset path") > >>> moved the disable into ath11k_core_reset(). reset_work is only queued > >>> from mhi.c and from the debugfs hw-restart handler, so AHB parts never > >>> run it on a real firmware crash. Their recovery goes QMI server exit -> > >>> restart_work -> ath11k_core_reconfigure_on_crash() -> > >>> ath11k_core_qmi_firmware_ready(), and nothing disables the interrupts > >>> anywhere along it. > >>> > >>> Disable them again on the crash path. The reset path has already done > >>> so by the time it gets here, hence the ab->is_reset check. > >>> > >>> This is also why the debugfs hw-restart trigger never showed the > >>> problem: it goes through ath11k_core_reset(), the one path that still > >>> had the disable. > >>> > >>> Tested-on: IPQ8074 hw2.0 AHB WLAN.HK.2.12-01460-QCAHKSWPL_SILICONZ-1 > >>> > >>> Fixes: d455e805de70 ("wifi: ath11k: rearrange IRQ enable/disable in reset path") > >>> Assisted-by: Claude:claude-opus-5 > >>> Signed-off-by: Julius Bairaktaris <julius@bairaktaris.de> > >> > >> This patch landed recently in linux-next as commit f7a74e131d3f ("wifi: ath11k: > >> disable interrupts during firmware crash recovery"). In my tests I found that it > >> causes a regression on QCOM RB5 board during system suspend/resume cycle > >> (s2idle): > > Hi @Marek, can you please try if below diff can fix this regression? Also, @Julis, can you > > please also confirm if it can address your original issue as well? > > > Works fine in my tests, feel free to add: > > Reported-by: Marek Szyprowski <m.szyprowski@samsung.com> > Tested-by: Marek Szyprowski <m.szyprowski@samsung.com> > > > > diff --git a/drivers/net/wireless/ath/ath11k/core.c b/drivers/net/wireless/ath/ath11k/core.c > > index d2ed6a0ea7e3..1ad0a47653de 100644 > > --- a/drivers/net/wireless/ath/ath11k/core.c > > +++ b/drivers/net/wireless/ath/ath11k/core.c > > @@ -1275,9 +1275,6 @@ int ath11k_core_suspend_late(struct ath11k_base *ab) > > if (ab->actual_pm_policy == ATH11K_PM_WOW) > > return 0; > > > > - ath11k_hif_irq_disable(ab); > > - ath11k_hif_ce_irq_disable(ab); > > - > > ath11k_hif_power_down(ab, true); > > > > return 0; > > @@ -2333,17 +2330,9 @@ static int ath11k_core_reconfigure_on_crash(struct ath11k_base *ab) > > int ret; > > > > mutex_lock(&ab->core_lock); > > + ath11k_hif_irq_disable(ab); > > + ath11k_hif_ce_irq_disable(ab); > > ath11k_thermal_unregister(ab); > > - > > - /* > > - * ath11k_core_reset() already disabled the interrupts on the reset > > - * path; only the firmware crash path reaches here with them live. > > - */ > > - if (!ab->is_reset) { > > - ath11k_hif_irq_disable(ab); > > - ath11k_hif_ce_irq_disable(ab); > > - } > > - > > ath11k_dp_pdev_free(ab); > > ath11k_cfr_deinit(ab); > > ath11k_spectral_deinit(ab); > > @@ -2605,9 +2594,6 @@ static void ath11k_core_reset(struct work_struct *work) > > time_left = wait_for_completion_timeout(&ab->recovery_start, > > ATH11K_RECOVER_START_TIMEOUT_HZ); > > > > - ath11k_hif_irq_disable(ab); > > - ath11k_hif_ce_irq_disable(ab); > > - > > ath11k_hif_power_down(ab, false); > > ath11k_hif_power_up(ab); > > > Best regards > -- > Marek Szyprowski, PhD > Samsung R&D Institute Poland > ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH ath-next v2 2/2] wifi: ath11k: disable interrupts during firmware crash recovery 2026-09-20 16:42 ` Julius Bairaktaris @ 2026-09-21 3:17 ` Baochen Qiang 2026-09-21 6:32 ` Julius Bairaktaris 0 siblings, 1 reply; 15+ messages in thread From: Baochen Qiang @ 2026-09-21 3:17 UTC (permalink / raw) To: Julius Bairaktaris, Marek Szyprowski Cc: jjohnson, ath11k, linux-wireless, linux-kernel, vasanthakumar.thiagarajan, rameshkumar.sundaram On 9/21/2026 12:42 AM, Julius Bairaktaris wrote: > Hi @Baochen, > > tested 5 times and it solves the problem. Thanks! Thanks. Can I have below tag when I submit the fix ? Tested-by: Julius Bairaktaris <julius@bairaktaris.de> ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH ath-next v2 2/2] wifi: ath11k: disable interrupts during firmware crash recovery 2026-09-21 3:17 ` Baochen Qiang @ 2026-09-21 6:32 ` Julius Bairaktaris 0 siblings, 0 replies; 15+ messages in thread From: Julius Bairaktaris @ 2026-09-21 6:32 UTC (permalink / raw) To: Baochen Qiang Cc: Marek Szyprowski, jjohnson, ath11k, linux-wireless, linux-kernel, vasanthakumar.thiagarajan, rameshkumar.sundaram Yes, sure Am Mo., 21. Sept. 2026 um 03:17 Uhr schrieb Baochen Qiang <baochen.qiang@oss.qualcomm.com>: > > > > On 9/21/2026 12:42 AM, Julius Bairaktaris wrote: > > Hi @Baochen, > > > > tested 5 times and it solves the problem. Thanks! > > Thanks. Can I have below tag when I submit the fix ? > > Tested-by: Julius Bairaktaris <julius@bairaktaris.de> ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH ath-next v2 0/2] wifi: ath11k: fix SoC reboot on firmware crash on AHB 2026-07-26 22:19 [PATCH ath-next v2 0/2] wifi: ath11k: fix SoC reboot on firmware crash on AHB Julius Bairaktaris 2026-07-26 22:19 ` [PATCH ath-next v2 1/2] wifi: ath11k: implement CE interrupt enable/disable for AHB Julius Bairaktaris 2026-07-26 22:19 ` [PATCH ath-next v2 2/2] wifi: ath11k: disable interrupts during firmware crash recovery Julius Bairaktaris @ 2026-07-31 3:07 ` Baochen Qiang 2026-08-05 10:48 ` Julius Bairaktaris ` (2 subsequent siblings) 5 siblings, 0 replies; 15+ messages in thread From: Baochen Qiang @ 2026-07-31 3:07 UTC (permalink / raw) To: Julius Bairaktaris, jjohnson Cc: ath11k, linux-wireless, linux-kernel, vasanthakumar.thiagarajan, rameshkumar.sundaram On 7/27/2026 6:19 AM, Julius Bairaktaris wrote: > On IPQ8074 every firmware assert takes the whole SoC down. The DP NAPI > keeps polling while ath11k_core_reconfigure_on_crash() frees the data > path underneath it, and dereferences a ring the teardown has already > cleared. > > The interrupts used to be disabled at the top of that function. > commit d455e805de70 ("wifi: ath11k: rearrange IRQ enable/disable in reset path") > moved the disable into ath11k_core_reset(), which AHB parts never reach > on a real firmware crash: reset_work is queued only from mhi.c and from > the debugfs hw-restart handler. Patch 2 puts the disable back on the > crash path. Patch 1 is a prerequisite - the CE half of the quiesce is a > no-op on AHB today because the bus never implemented the hif ops. > > Reproduced and fixed on a Xiaomi AX3600 (IPQ8074 hw2.0), with no > out-of-tree modules loaded, using the debugfs simulate_fw_crash > 'assert' trigger: > > before: 2/2 asserts panic in ath11k_dp_rx_process_mon_status() and > reboot the SoC > after: 3/3 asserts recover, 5 firmware boots across a single 397 s > uptime, no panics, both radios stay up > > Note the debugfs 'hw-restart' trigger does not reproduce this, since it > goes through ath11k_core_reset() - the one path that still disables the > interrupts. Only a real firmware assert does. > > Patch 1 is by inspection: it makes ath11k_hif_ce_irq_disable() take > effect on AHB, which also fixes the existing call in > ath11k_core_reset(). I have not managed to trigger a CE-side crash on > its own, so if you would rather see that split out or dropped, say so. > > Changes in v2 (no functional change, review comments from Jeff on 2/2): > - separate the ath-specific Tested-on tag from the upstream tags with a > blank line > - use the standard kernel block comment style, with /* on its own line > > v1: https://lore.kernel.org/ath11k/20260725141757.1316877-1-julius@bairaktaris.de/ > > Julius Bairaktaris (2): > wifi: ath11k: implement CE interrupt enable/disable for AHB > wifi: ath11k: disable interrupts during firmware crash recovery > > drivers/net/wireless/ath/ath11k/ahb.c | 9 ++++++++- > drivers/net/wireless/ath/ath11k/core.c | 10 ++++++++++ > 2 files changed, 18 insertions(+), 1 deletion(-) > Reviewed-by: Baochen Qiang <baochen.qiang@oss.qualcomm.com> ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH ath-next v2 0/2] wifi: ath11k: fix SoC reboot on firmware crash on AHB 2026-07-26 22:19 [PATCH ath-next v2 0/2] wifi: ath11k: fix SoC reboot on firmware crash on AHB Julius Bairaktaris ` (2 preceding siblings ...) 2026-07-31 3:07 ` [PATCH ath-next v2 0/2] wifi: ath11k: fix SoC reboot on firmware crash on AHB Baochen Qiang @ 2026-08-05 10:48 ` Julius Bairaktaris 2026-08-05 11:13 ` Rameshkumar Sundaram 2026-09-03 19:02 ` Jeff Johnson 5 siblings, 0 replies; 15+ messages in thread From: Julius Bairaktaris @ 2026-08-05 10:48 UTC (permalink / raw) To: jjohnson Cc: ath11k, linux-wireless, linux-kernel, Baochen Qiang, Vasanthakumar Thiagarajan, Rameshkumar Sundaram Ping, and some extra data since v1 only had my own bring-up tree behind it. I have now reproduced this on a stock ath11k with no out-of-tree modules loaded at all, on an otherwise unmodified OpenWrt mac80211 backports 6.18.39 build for the Xiaomi AX3600 (IPQ8074 hw2.0), firmware WLAN.HK.2.12-01460-QCAHKSWPL_SILICONZ-1: # grep -c ath11k_nss /proc/kallsyms 0 # lsmod | grep -c qca 0 Driving the debugfs simulate_fw_crash 'assert' trigger, panic captured via ramoops: without this series: 1 assert -> panic, SoC reboot with this series: 5 asserts -> 5 recoveries, boot_id unchanged, both radios back up The panic is the one from the cover letter, verbatim: Unable to handle kernel read from unreadable memory at virtual address 0 pc : ath11k_hal_srng_access_begin+0xc/0x60 [ath11k] lr : ath11k_dp_rx_process_mon_status+0x15c/0xd84 [ath11k] Call trace: ath11k_hal_srng_access_begin+0xc/0x60 [ath11k] (P) ath11k_dp_rx_process_mon_rings+0xa0/0x5d4 [ath11k] ath11k_dp_service_srng+0x1f4/0x348 [ath11k] ath11k_ahb_ext_grp_napi_poll+0x34/0xd4 [ath11k_ahb] So the AHB crash path really does reach ath11k_core_reconfigure_on_crash() with the interrupts live on a plain upstream driver, not only on mine. Two things I found while doing that run, both separate from this series and neither ready to send: - the recovery leaves a list_del() warning from finish_wait() in ath11k_wmi_cmd_send(), once per recovery. ath11k_wmi_pdev_attach() re-runs init_waitqueue_head() on tx_ce_desc_wq on every recovery, under a task that is still queued on it. - once ath11k_core_reconfigure_on_crash() takes its err_hal_srng_deinit path, nothing calls ath11k_hal_srng_init() again, so srng_config stays freed and every later restart faults. A recovery that fails once looks unrecoverable by construction. I will send those separately once I have them properly narrowed; flagging them here only in case they are already known. Thanks, Julius ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH ath-next v2 0/2] wifi: ath11k: fix SoC reboot on firmware crash on AHB 2026-07-26 22:19 [PATCH ath-next v2 0/2] wifi: ath11k: fix SoC reboot on firmware crash on AHB Julius Bairaktaris ` (3 preceding siblings ...) 2026-08-05 10:48 ` Julius Bairaktaris @ 2026-08-05 11:13 ` Rameshkumar Sundaram 2026-09-03 19:02 ` Jeff Johnson 5 siblings, 0 replies; 15+ messages in thread From: Rameshkumar Sundaram @ 2026-08-05 11:13 UTC (permalink / raw) To: Julius Bairaktaris, jjohnson Cc: ath11k, linux-wireless, linux-kernel, baochen.qiang, vasanthakumar.thiagarajan On 7/27/2026 3:49 AM, Julius Bairaktaris wrote: > On IPQ8074 every firmware assert takes the whole SoC down. The DP NAPI > keeps polling while ath11k_core_reconfigure_on_crash() frees the data > path underneath it, and dereferences a ring the teardown has already > cleared. > > The interrupts used to be disabled at the top of that function. > commit d455e805de70 ("wifi: ath11k: rearrange IRQ enable/disable in reset path") > moved the disable into ath11k_core_reset(), which AHB parts never reach > on a real firmware crash: reset_work is queued only from mhi.c and from > the debugfs hw-restart handler. Patch 2 puts the disable back on the > crash path. Patch 1 is a prerequisite - the CE half of the quiesce is a > no-op on AHB today because the bus never implemented the hif ops. > > Reproduced and fixed on a Xiaomi AX3600 (IPQ8074 hw2.0), with no > out-of-tree modules loaded, using the debugfs simulate_fw_crash > 'assert' trigger: > > before: 2/2 asserts panic in ath11k_dp_rx_process_mon_status() and > reboot the SoC > after: 3/3 asserts recover, 5 firmware boots across a single 397 s > uptime, no panics, both radios stay up > > Note the debugfs 'hw-restart' trigger does not reproduce this, since it > goes through ath11k_core_reset() - the one path that still disables the > interrupts. Only a real firmware assert does. > > Patch 1 is by inspection: it makes ath11k_hif_ce_irq_disable() take > effect on AHB, which also fixes the existing call in > ath11k_core_reset(). I have not managed to trigger a CE-side crash on > its own, so if you would rather see that split out or dropped, say so. > > Changes in v2 (no functional change, review comments from Jeff on 2/2): > - separate the ath-specific Tested-on tag from the upstream tags with a > blank line > - use the standard kernel block comment style, with /* on its own line > > v1: https://lore.kernel.org/ath11k/20260725141757.1316877-1-julius@bairaktaris.de/ > > Julius Bairaktaris (2): > wifi: ath11k: implement CE interrupt enable/disable for AHB > wifi: ath11k: disable interrupts during firmware crash recovery > > drivers/net/wireless/ath/ath11k/ahb.c | 9 ++++++++- > drivers/net/wireless/ath/ath11k/core.c | 10 ++++++++++ > 2 files changed, 18 insertions(+), 1 deletion(-) > Reviewed-by: Rameshkumar Sundaram <rameshkumar.sundaram@oss.qualcomm.com> ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH ath-next v2 0/2] wifi: ath11k: fix SoC reboot on firmware crash on AHB 2026-07-26 22:19 [PATCH ath-next v2 0/2] wifi: ath11k: fix SoC reboot on firmware crash on AHB Julius Bairaktaris ` (4 preceding siblings ...) 2026-08-05 11:13 ` Rameshkumar Sundaram @ 2026-09-03 19:02 ` Jeff Johnson 5 siblings, 0 replies; 15+ messages in thread From: Jeff Johnson @ 2026-09-03 19:02 UTC (permalink / raw) To: jjohnson, Julius Bairaktaris Cc: ath11k, linux-wireless, linux-kernel, baochen.qiang, vasanthakumar.thiagarajan, rameshkumar.sundaram On Mon, 27 Jul 2026 00:19:06 +0200, Julius Bairaktaris wrote: > On IPQ8074 every firmware assert takes the whole SoC down. The DP NAPI > keeps polling while ath11k_core_reconfigure_on_crash() frees the data > path underneath it, and dereferences a ring the teardown has already > cleared. > > The interrupts used to be disabled at the top of that function. > commit d455e805de70 ("wifi: ath11k: rearrange IRQ enable/disable in reset path") > moved the disable into ath11k_core_reset(), which AHB parts never reach > on a real firmware crash: reset_work is queued only from mhi.c and from > the debugfs hw-restart handler. Patch 2 puts the disable back on the > crash path. Patch 1 is a prerequisite - the CE half of the quiesce is a > no-op on AHB today because the bus never implemented the hif ops. > > [...] Applied, thanks! [1/2] wifi: ath11k: implement CE interrupt enable/disable for AHB commit: a7ab5c835e4253b6577e4137367c05bfddd79fa2 [2/2] wifi: ath11k: disable interrupts during firmware crash recovery commit: f7a74e131d3f0de04335dbe278bfb82bdafcdb3e Best regards, -- Jeff Johnson <jeff.johnson@oss.qualcomm.com> ^ permalink raw reply [flat|nested] 15+ messages in thread
end of thread, other threads:[~2026-09-21 6:33 UTC | newest]
Thread overview: 15+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2026-07-26 22:19 [PATCH ath-next v2 0/2] wifi: ath11k: fix SoC reboot on firmware crash on AHB Julius Bairaktaris
2026-07-26 22:19 ` [PATCH ath-next v2 1/2] wifi: ath11k: implement CE interrupt enable/disable for AHB Julius Bairaktaris
2026-07-26 22:19 ` [PATCH ath-next v2 2/2] wifi: ath11k: disable interrupts during firmware crash recovery Julius Bairaktaris
[not found] ` <CGME20260911075315eucas1p1b4ffb1f57ef187e0a055072ccc0983e3@eucas1p1.samsung.com>
2026-09-11 7:53 ` Marek Szyprowski
2026-09-11 16:54 ` Jeff Johnson
2026-09-14 6:32 ` Baochen Qiang
2026-09-14 6:47 ` Julius Bairaktaris
2026-09-14 7:22 ` Marek Szyprowski
2026-09-20 16:42 ` Julius Bairaktaris
2026-09-21 3:17 ` Baochen Qiang
2026-09-21 6:32 ` Julius Bairaktaris
2026-07-31 3:07 ` [PATCH ath-next v2 0/2] wifi: ath11k: fix SoC reboot on firmware crash on AHB Baochen Qiang
2026-08-05 10:48 ` Julius Bairaktaris
2026-08-05 11:13 ` Rameshkumar Sundaram
2026-09-03 19:02 ` Jeff Johnson
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®