diff options
author | Vladimir Kondratiev <qca_vkondrat@qca.qualcomm.com> | 2013-03-13 08:12:46 -0400 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2013-03-13 14:23:04 -0400 |
commit | de70ab87b1e4ba1669638381b80f2d90ea09576c (patch) | |
tree | 19e5ec53b749d69c3c578581eb8adb900956a2c4 /drivers/net/wireless/ath/wil6210 | |
parent | 102b1d99e555ddaddcc1bd7b0a976909c75aefc2 (diff) |
wil6210: fix FW error notification
user space get notified through kobject_uevent_env(), that might sleep and thus
should run in thread context.
Move user space notification to the thread handler, while mark FW is non-functional
right in the hard IRQ.
Signed-off-by: Vladimir Kondratiev <qca_vkondrat@qca.qualcomm.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net/wireless/ath/wil6210')
-rw-r--r-- | drivers/net/wireless/ath/wil6210/interrupt.c | 14 |
1 files changed, 11 insertions, 3 deletions
diff --git a/drivers/net/wireless/ath/wil6210/interrupt.c b/drivers/net/wireless/ath/wil6210/interrupt.c index dc97e7b2609c..de9b971ea159 100644 --- a/drivers/net/wireless/ath/wil6210/interrupt.c +++ b/drivers/net/wireless/ath/wil6210/interrupt.c | |||
@@ -257,10 +257,13 @@ static irqreturn_t wil6210_irq_misc(int irq, void *cookie) | |||
257 | wil6210_mask_irq_misc(wil); | 257 | wil6210_mask_irq_misc(wil); |
258 | 258 | ||
259 | if (isr & ISR_MISC_FW_ERROR) { | 259 | if (isr & ISR_MISC_FW_ERROR) { |
260 | wil_dbg_irq(wil, "IRQ: Firmware error\n"); | 260 | wil_err(wil, "Firmware error detected\n"); |
261 | clear_bit(wil_status_fwready, &wil->status); | 261 | clear_bit(wil_status_fwready, &wil->status); |
262 | wil_notify_fw_error(wil); | 262 | /* |
263 | isr &= ~ISR_MISC_FW_ERROR; | 263 | * do not clear @isr here - we do 2-nd part in thread |
264 | * there, user space get notified, and it should be done | ||
265 | * in non-atomic context | ||
266 | */ | ||
264 | } | 267 | } |
265 | 268 | ||
266 | if (isr & ISR_MISC_FW_READY) { | 269 | if (isr & ISR_MISC_FW_READY) { |
@@ -289,6 +292,11 @@ static irqreturn_t wil6210_irq_misc_thread(int irq, void *cookie) | |||
289 | 292 | ||
290 | wil_dbg_irq(wil, "Thread ISR MISC 0x%08x\n", isr); | 293 | wil_dbg_irq(wil, "Thread ISR MISC 0x%08x\n", isr); |
291 | 294 | ||
295 | if (isr & ISR_MISC_FW_ERROR) { | ||
296 | wil_notify_fw_error(wil); | ||
297 | isr &= ~ISR_MISC_FW_ERROR; | ||
298 | } | ||
299 | |||
292 | if (isr & ISR_MISC_MBOX_EVT) { | 300 | if (isr & ISR_MISC_MBOX_EVT) { |
293 | wil_dbg_irq(wil, "MBOX event\n"); | 301 | wil_dbg_irq(wil, "MBOX event\n"); |
294 | wmi_recv_cmd(wil); | 302 | wmi_recv_cmd(wil); |