wil6210: protect against sporadic interrupt during suspend flow
authorMaya Erez <qca_merez@qca.qualcomm.com>
Wed, 5 Apr 2017 11:58:09 +0000 (14:58 +0300)
committerKalle Valo <kvalo@qca.qualcomm.com>
Thu, 13 Apr 2017 12:46:02 +0000 (15:46 +0300)
During the suspend flow, wil6210 HW can send sporadic interrupts,
while PCIe bus is not operational.
To prevent that, keep the interrupts disabled during the suspend
flow and re-enable them only after PCIe enablement in resume.

Signed-off-by: Maya Erez <qca_merez@qca.qualcomm.com>
Signed-off-by: Kalle Valo <kvalo@qca.qualcomm.com>
drivers/net/wireless/ath/wil6210/pm.c

index a0acb2d..7260bef 100644 (file)
@@ -80,12 +80,20 @@ int wil_suspend(struct wil6210_priv *wil, bool is_runtime)
                }
        }
 
-       if (wil->platform_ops.suspend)
+       /* Disable PCIe IRQ to prevent sporadic IRQs when PCIe is suspending */
+       wil_dbg_pm(wil, "Disabling PCIe IRQ before suspending\n");
+       wil_disable_irq(wil);
+
+       if (wil->platform_ops.suspend) {
                rc = wil->platform_ops.suspend(wil->platform_handle);
+               if (rc)
+                       wil_enable_irq(wil);
+       }
 
 out:
        wil_dbg_pm(wil, "suspend: %s => %d\n",
                   is_runtime ? "runtime" : "system", rc);
+
        return rc;
 }
 
@@ -104,6 +112,9 @@ int wil_resume(struct wil6210_priv *wil, bool is_runtime)
                }
        }
 
+       wil_dbg_pm(wil, "Enabling PCIe IRQ\n");
+       wil_enable_irq(wil);
+
        /* if netif up, bring hardware up
         * During open(), IFF_UP set after actual device method
         * invocation. This prevent recursive call to wil_up()