if (ret)
                return ret;
 
+       netif_stop_queue(vif->ndev);
+
+       ar->state = ATH6KL_STATE_SUSPENDING;
+
        /* Setup own IP addr for ARP agent. */
        in_dev = __in_dev_get_rtnl(vif->ndev);
        if (!in_dev)
        if (!vif)
                return -EIO;
 
+       ar->state = ATH6KL_STATE_RESUMING;
+
        ret = ath6kl_wmi_set_host_sleep_mode_cmd(ar->wmi, vif->fw_vif_idx,
                                                 ATH6KL_HOST_MODE_AWAKE);
-       return ret;
+       if (ret) {
+               ath6kl_warn("Failed to configure host sleep mode for "
+                           "wow resume: %d\n", ret);
+               ar->state = ATH6KL_STATE_WOW;
+               return ret;
+       }
+
+       ar->state = ATH6KL_STATE_ON;
+
+       netif_wake_queue(vif->ndev);
+
+       return 0;
 }
 
 int ath6kl_cfg80211_suspend(struct ath6kl *ar,
                            enum ath6kl_cfg_suspend_mode mode,
                            struct cfg80211_wowlan *wow)
 {
+       enum ath6kl_state prev_state;
        int ret;
 
        switch (mode) {
                /* Flush all non control pkts in TX path */
                ath6kl_tx_data_cleanup(ar);
 
+               prev_state = ar->state;
+
                ret = ath6kl_wow_suspend(ar, wow);
-               if (ret)
+               if (ret) {
+                       ar->state = prev_state;
                        return ret;
+               }
 
                ar->state = ATH6KL_STATE_WOW;
                break;
                        return ret;
                }
 
-               ar->state = ATH6KL_STATE_ON;
                break;
 
        case ATH6KL_STATE_DEEPSLEEP:
  */
 void ath6kl_check_wow_status(struct ath6kl *ar)
 {
+       if (ar->state == ATH6KL_STATE_SUSPENDING)
+               return;
+
        if (ar->state == ATH6KL_STATE_WOW)
                ath6kl_cfg80211_resume(ar);
 }
 
        int status = 0;
        struct ath6kl_cookie *cookie = NULL;
 
+       if (WARN_ON_ONCE(ar->state == ATH6KL_STATE_WOW))
+               return -EACCES;
+
        spin_lock_bh(&ar->lock);
 
        ath6kl_dbg(ATH6KL_DBG_WLAN_TX,
                return 0;
        }
 
+       if (WARN_ON_ONCE(ar->state != ATH6KL_STATE_ON)) {
+               dev_kfree_skb(skb);
+               return 0;
+       }
+
        if (!test_bit(WMI_READY, &ar->flag))
                goto fail_tx;