|
@@ -1948,6 +1948,10 @@ static int ath6kl_wow_suspend(struct ath6kl *ar, struct cfg80211_wowlan *wow)
|
|
|
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)
|
|
@@ -2026,15 +2030,29 @@ static int ath6kl_wow_resume(struct ath6kl *ar)
|
|
|
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) {
|
|
@@ -2045,9 +2063,13 @@ int ath6kl_cfg80211_suspend(struct ath6kl *ar,
|
|
|
/* 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;
|
|
@@ -2120,7 +2142,6 @@ int ath6kl_cfg80211_resume(struct ath6kl *ar)
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
- ar->state = ATH6KL_STATE_ON;
|
|
|
break;
|
|
|
|
|
|
case ATH6KL_STATE_DEEPSLEEP:
|
|
@@ -2194,6 +2215,9 @@ static int __ath6kl_cfg80211_resume(struct wiphy *wiphy)
|
|
|
*/
|
|
|
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);
|
|
|
}
|