wil_dbg_pm(wil, "suspend: %s\n", is_runtime ? "runtime" : "system");
 
+       if (test_bit(wil_status_suspended, wil->status)) {
+               wil_dbg_pm(wil, "trying to suspend while suspended\n");
+               return 0;
+       }
+
        /* if netif up, hardware is alive, shut it down */
        if (ndev->flags & IFF_UP) {
                rc = wil_down(wil);
 
        if (wil->platform_ops.suspend) {
                rc = wil->platform_ops.suspend(wil->platform_handle);
-               if (rc)
+               if (rc) {
                        wil_enable_irq(wil);
+                       goto out;
+               }
        }
 
+       set_bit(wil_status_suspended, wil->status);
+
 out:
        wil_dbg_pm(wil, "suspend: %s => %d\n",
                   is_runtime ? "runtime" : "system", rc);
 
        /* if netif up, bring hardware up
         * During open(), IFF_UP set after actual device method
-        * invocation. This prevent recursive call to wil_up()
+        * invocation. This prevent recursive call to wil_up().
+        * wil_status_suspended will be cleared in wil_reset
         */
        if (ndev->flags & IFF_UP)
                rc = wil_up(wil);
+       else
+               clear_bit(wil_status_suspended, wil->status);
 
 out:
        wil_dbg_pm(wil, "resume: %s => %d\n",
 
        wil_status_irqen, /* FIXME: interrupts enabled - for debug */
        wil_status_napi_en, /* NAPI enabled protected by wil->mutex */
        wil_status_resetting, /* reset in progress */
+       wil_status_suspended, /* suspend completed, device is suspended */
        wil_status_last /* keep last */
 };