wlcore: Fix BUG with clear completion on timeout
[ Upstream commit
4e651bad848955d88b29a568bfbfb4b831270e16 ]
We do not currently clear wl->elp_compl on ELP timeout and we have bogus
lingering pointer that wlcore_irq then will try to access after recovery
is done:
BUG: spinlock bad magic on CPU#1, irq/255-wl12xx/580
...
(spin_dump) from [<
c01b9344>] (do_raw_spin_lock+0xc8/0x124)
(do_raw_spin_lock) from [<
c09b3970>] (_raw_spin_lock_irqsave+0x68/0x74)
(_raw_spin_lock_irqsave) from [<
c01a02f0>] (complete+0x24/0x58)
(complete) from [<
bf572610>] (wlcore_irq+0x48/0x17c [wlcore])
(wlcore_irq [wlcore]) from [<
c01c5efc>] (irq_thread_fn+0x2c/0x64)
(irq_thread_fn) from [<
c01c623c>] (irq_thread+0x148/0x290)
(irq_thread) from [<
c016b4b0>] (kthread+0x160/0x17c)
(kthread) from [<
c01010b4>] (ret_from_fork+0x14/0x20)
...
After that the system will hang. Let's fix this by adding a flag for
recovery and moving the recovery work call to to the error handling
section.
And we want to set WL1271_FLAG_INTENDED_FW_RECOVERY and actually clear
it too in wl1271_recovery_work() and just downgrade the error to a
warning to prevent overly verbose output.
Cc: Eyal Reizer <eyalr@ti.com>
Signed-off-by: Tony Lindgren <tony@atomide.com>
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>