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) {
 
        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);