aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/ath/wil6210
diff options
context:
space:
mode:
authorVladimir Kondratiev <qca_vkondrat@qca.qualcomm.com>2013-03-13 08:12:46 -0400
committerJohn W. Linville <linville@tuxdriver.com>2013-03-13 14:23:04 -0400
commitde70ab87b1e4ba1669638381b80f2d90ea09576c (patch)
tree19e5ec53b749d69c3c578581eb8adb900956a2c4 /drivers/net/wireless/ath/wil6210
parent102b1d99e555ddaddcc1bd7b0a976909c75aefc2 (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.c14
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);