wil6210: fix FW error notification
authorVladimir Kondratiev <qca_vkondrat@qca.qualcomm.com>
Wed, 13 Mar 2013 12:12:46 +0000 (14:12 +0200)
committerJohn W. Linville <linville@tuxdriver.com>
Wed, 13 Mar 2013 18:23:04 +0000 (14:23 -0400)
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>
drivers/net/wireless/ath/wil6210/interrupt.c

index dc97e7b2609cb84c00d8954ba067aab60b2b5a0a..de9b971ea159a71d4b336cfe0c5e008db33ceaf2 100644 (file)
@@ -257,10 +257,13 @@ static irqreturn_t wil6210_irq_misc(int irq, void *cookie)
        wil6210_mask_irq_misc(wil);
 
        if (isr & ISR_MISC_FW_ERROR) {
-               wil_dbg_irq(wil, "IRQ: Firmware error\n");
+               wil_err(wil, "Firmware error detected\n");
                clear_bit(wil_status_fwready, &wil->status);
-               wil_notify_fw_error(wil);
-               isr &= ~ISR_MISC_FW_ERROR;
+               /*
+                * do not clear @isr here - we do 2-nd part in thread
+                * there, user space get notified, and it should be done
+                * in non-atomic context
+                */
        }
 
        if (isr & ISR_MISC_FW_READY) {
@@ -289,6 +292,11 @@ static irqreturn_t wil6210_irq_misc_thread(int irq, void *cookie)
 
        wil_dbg_irq(wil, "Thread ISR MISC 0x%08x\n", isr);
 
+       if (isr & ISR_MISC_FW_ERROR) {
+               wil_notify_fw_error(wil);
+               isr &= ~ISR_MISC_FW_ERROR;
+       }
+
        if (isr & ISR_MISC_MBOX_EVT) {
                wil_dbg_irq(wil, "MBOX event\n");
                wmi_recv_cmd(wil);