diff mbox series

wifi: ath10k: Fix unbalanced IRQ enabling

Message ID 20250522120954.605722-1-loic.poulain@oss.qualcomm.com
State New
Headers show
Series wifi: ath10k: Fix unbalanced IRQ enabling | expand

Commit Message

Loic Poulain May 22, 2025, 12:09 p.m. UTC
When the firmware goes down, both RECOVERY and CRASH_FLUSH flags are set,
triggering a full recovery sequence once the firmware is back up. This
includes stopping and restarting the SNOC interface.

However, this sequence leads to an Unbalanced IRQ warning:

------------[ cut here ]------------
Unbalanced enable for IRQ 112
WARNING: CPU: 2 PID: 120 at kernel/irq/manage.c:792 __enable_irq+0x4c/0x7c
CPU: 2 UID: 0 PID: 120 Comm: kworker/2:4 Not tainted [...] #234 PREEMPT
Hardware name: Qualcomm Technologies, Inc. Robotics RB1 (DT)
Workqueue: events_freezable ieee80211_restart_work
pstate: 600000c5 (nZCv daIF -PAN -UAO -TCO -DIT -SSBS BTYPE=--)
pc : __enable_irq+0x4c/0x7c
lr : __enable_irq+0x4c/0x7c
sp : ffff800081b3bab0
[...]
Call trace:
 __enable_irq+0x4c/0x7c (P)
 enable_irq+0x48/0x9c
 ath10k_snoc_hif_start+0x6c/0x13c
 ath10k_core_start+0x360/0x1344
 ath10k_start+0x100/0x8fc
 drv_start+0x34/0x58
 ieee80211_reconfig+0xf4/0xfc0
 ieee80211_restart_work+0x110/0x17c
 process_one_work+0x150/0x294
 worker_thread+0x2dc/0x3dc
 kthread+0x130/0x204
 ret_from_fork+0x10/0x20
---

This can be reproduced by restarting rmtfs or triggering remoteproc restart
via sysfs.

The root cause is that IRQs are not disabled during SNOC stop in recovery
scenarios, but are unconditionally re-enabled during SNOC start, leading to
an imbalance.

Fix this by skipping IRQ re-enablement in `ath10k_snoc_hif_start()` if a
firmware recovery is in progress, restoring IRQ state symmetry.

Fixes: 0e622f67e041 ("ath10k: add support for WCN3990 firmware crash recovery")
Signed-off-by: Loic Poulain <loic.poulain@oss.qualcomm.com>
---
 drivers/net/wireless/ath/ath10k/snoc.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)
diff mbox series

Patch

diff --git a/drivers/net/wireless/ath/ath10k/snoc.c b/drivers/net/wireless/ath/ath10k/snoc.c
index 866bad2db334..e15e1ab30458 100644
--- a/drivers/net/wireless/ath/ath10k/snoc.c
+++ b/drivers/net/wireless/ath/ath10k/snoc.c
@@ -937,7 +937,8 @@  static int ath10k_snoc_hif_start(struct ath10k *ar)
 
 	dev_set_threaded(ar->napi_dev, true);
 	ath10k_core_napi_enable(ar);
-	ath10k_snoc_irq_enable(ar);
+	if (!test_bit(ATH10K_SNOC_FLAG_RECOVERY, &ar_snoc->flags))
+		ath10k_snoc_irq_enable(ar);
 	ath10k_snoc_rx_post(ar);
 
 	clear_bit(ATH10K_SNOC_FLAG_RECOVERY, &ar_snoc->flags);