ath6kl_tx_data_cleanup(ar);
 
                ret = ath6kl_wow_suspend(ar, wow);
-               if (ret) {
-                       ath6kl_err("wow suspend failed: %d\n", ret);
+               if (ret)
                        return ret;
-               }
+
                ar->state = ATH6KL_STATE_WOW;
                break;
 
 
 
 unsigned int debug_mask;
 static unsigned int suspend_mode;
+static unsigned int wow_mode;
 static unsigned int uart_debug;
 static unsigned int ath6kl_p2p;
 static unsigned int testmode;
 
 module_param(debug_mask, uint, 0644);
 module_param(suspend_mode, uint, 0644);
+module_param(wow_mode, uint, 0644);
 module_param(uart_debug, uint, 0644);
 module_param(ath6kl_p2p, uint, 0644);
 module_param(testmode, uint, 0644);
        else
                ar->suspend_mode = 0;
 
+       if (suspend_mode == WLAN_POWER_STATE_WOW &&
+           (wow_mode == WLAN_POWER_STATE_CUT_PWR ||
+            wow_mode == WLAN_POWER_STATE_DEEP_SLEEP))
+               ar->wow_suspend_mode = wow_mode;
+       else
+               ar->wow_suspend_mode = 0;
+
        if (uart_debug)
                ar->conf_flags |= ATH6KL_CONF_UART_DEBUG;
 
 
        struct ath6kl_sdio *ar_sdio = ath6kl_sdio_priv(ar);
        struct sdio_func *func = ar_sdio->func;
        mmc_pm_flag_t flags;
+       bool try_deepsleep = false;
        int ret;
 
        if (ar->state == ATH6KL_STATE_SCHED_SCAN) {
                        goto cut_pwr;
 
                ret = ath6kl_cfg80211_suspend(ar, ATH6KL_CFG_SUSPEND_WOW, wow);
-               if (ret)
-                       goto cut_pwr;
-
-               return 0;
+               if (ret && ret != -ENOTCONN)
+                       ath6kl_err("wow suspend failed: %d\n", ret);
+
+               if (ret && (!ar->wow_suspend_mode ||
+                   ar->wow_suspend_mode == WLAN_POWER_STATE_DEEP_SLEEP))
+                               try_deepsleep = true;
+               else if (ret &&
+                        ar->wow_suspend_mode == WLAN_POWER_STATE_CUT_PWR)
+                               goto cut_pwr;
+               if (!ret)
+                       return 0;
        }
 
        if (ar->suspend_mode == WLAN_POWER_STATE_DEEP_SLEEP ||
-           !ar->suspend_mode) {
+           !ar->suspend_mode || try_deepsleep) {
 
                flags = sdio_get_host_pm_caps(func);
                if (!(flags & MMC_PM_KEEP_POWER))