Message ID | 20250522120954.605722-1-loic.poulain@oss.qualcomm.com |
---|---|
State | New |
Headers | show |
Series | wifi: ath10k: Fix unbalanced IRQ enabling | expand |
On 5/22/2025 5:09 AM, Loic Poulain wrote: > 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 causes git to chop the description at this point, which also chops the tags, so remove it. > > 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 ++- My Qualcomm copyright checker flags: * drivers/net/wireless/ath/ath10k/snoc.c no QuIC copyright > 1 file changed, 2 insertions(+), 1 deletion(-) > > 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);
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);
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(-)