iwlwifi: sleep for at least 10 seconds
authorJohannes Berg <johannes.berg@intel.com>
Fri, 15 Feb 2013 10:00:58 +0000 (11:00 +0100)
committerJohannes Berg <johannes.berg@intel.com>
Wed, 3 Apr 2013 20:49:52 +0000 (22:49 +0200)
Many platforms have issues processing a wakeup signal
while they're still suspending, and will ignore it.
Since our device thinks it woke the platform, and the
platform ignored the signal, it will sleep without
WoWLAN being enabled as the device disables WoWLAN
when having woken the platform.

Resolve this by making the device wait for 10 seconds
after getting the suspend signal before waking up the
platform.

Reviewed-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
drivers/net/wireless/iwlwifi/dvm/lib.c
drivers/net/wireless/iwlwifi/mvm/d3.c

index cddf77c..f2aeb1a 100644 (file)
@@ -1084,7 +1084,14 @@ int iwlagn_suspend(struct iwl_priv *priv, struct cfg80211_wowlan *wowlan)
        struct iwl_rxon_context *ctx = &priv->contexts[IWL_RXON_CTX_BSS];
        struct iwlagn_wowlan_kek_kck_material_cmd kek_kck_cmd;
        struct iwlagn_wowlan_tkip_params_cmd tkip_cmd = {};
-       struct iwlagn_d3_config_cmd d3_cfg_cmd = {};
+       struct iwlagn_d3_config_cmd d3_cfg_cmd = {
+               /*
+                * Program the minimum sleep time to 10 seconds, as many
+                * platforms have issues processing a wakeup signal while
+                * still being in the process of suspending.
+                */
+               .min_sleep_time = cpu_to_le32(10 * 1000 * 1000),
+       };
        struct wowlan_key_data key_data = {
                .ctx = ctx,
                .bssid = ctx->active.bssid_addr,
index bf087ab..16bbdcc 100644 (file)
@@ -769,7 +769,14 @@ int iwl_mvm_suspend(struct ieee80211_hw *hw, struct cfg80211_wowlan *wowlan)
        struct iwl_wowlan_config_cmd wowlan_config_cmd = {};
        struct iwl_wowlan_kek_kck_material_cmd kek_kck_cmd = {};
        struct iwl_wowlan_tkip_params_cmd tkip_cmd = {};
-       struct iwl_d3_manager_config d3_cfg_cmd = {};
+       struct iwl_d3_manager_config d3_cfg_cmd = {
+               /*
+                * Program the minimum sleep time to 10 seconds, as many
+                * platforms have issues processing a wakeup signal while
+                * still being in the process of suspending.
+                */
+               .min_sleep_time = cpu_to_le32(10 * 1000 * 1000),
+       };
        struct wowlan_key_data key_data = {
                .use_rsc_tsc = false,
                .tkip = &tkip_cmd,