wil6210: restore power save state after internal FW reset
authorLazar Alexei <qca_ailizaro@qca.qualcomm.com>
Wed, 5 Apr 2017 11:58:05 +0000 (14:58 +0300)
committerKalle Valo <kvalo@qca.qualcomm.com>
Thu, 13 Apr 2017 12:45:43 +0000 (15:45 +0300)
The power save profile is set to default state in case of FW reset,
regardless of the state before the reset took place.
Fix this by saving the current power save profile and restore it
in case of FW reset.

Signed-off-by: Lazar Alexei <qca_ailizaro@qca.qualcomm.com>
Signed-off-by: Maya Erez <qca_merez@qca.qualcomm.com>
Signed-off-by: Kalle Valo <kvalo@qca.qualcomm.com>
drivers/net/wireless/ath/wil6210/cfg80211.c
drivers/net/wireless/ath/wil6210/main.c
drivers/net/wireless/ath/wil6210/wil6210.h

index 1981ec2e0186e2835fd7a5b1218aae6fe313ca55..474ab8070c00237688142d43c835614e5c15e5c9 100644 (file)
@@ -1563,12 +1563,6 @@ static int wil_cfg80211_set_power_mgmt(struct wiphy *wiphy,
 {
        struct wil6210_priv *wil = wiphy_to_wil(wiphy);
        enum wmi_ps_profile_type ps_profile;
-       int rc;
-
-       if (!test_bit(WMI_FW_CAPABILITY_PS_CONFIG, wil->fw_capabilities)) {
-               wil_err(wil, "set_power_mgmt not supported\n");
-               return -EOPNOTSUPP;
-       }
 
        wil_dbg_misc(wil, "enabled=%d, timeout=%d\n",
                     enabled, timeout);
@@ -1578,11 +1572,7 @@ static int wil_cfg80211_set_power_mgmt(struct wiphy *wiphy,
        else
                ps_profile = WMI_PS_PROFILE_TYPE_PS_DISABLED;
 
-       rc  = wmi_ps_dev_profile_cfg(wil, ps_profile);
-       if (rc)
-               wil_err(wil, "wmi_ps_dev_profile_cfg failed (%d)\n", rc);
-
-       return rc;
+       return wil_ps_update(wil, ps_profile);
 }
 
 static const struct cfg80211_ops wil_cfg80211_ops = {
index 7e72096d738a9a54d1197efa5ad057b51f0fee5a..9aa81ce895b3ec5de71a0b1e465031f46db0b06e 100644 (file)
@@ -576,6 +576,9 @@ int wil_priv_init(struct wil6210_priv *wil)
 
        if (rx_ring_overflow_thrsh == WIL6210_RX_HIGH_TRSH_INIT)
                rx_ring_overflow_thrsh = WIL6210_RX_HIGH_TRSH_DEFAULT;
+
+       wil->ps_profile =  WMI_PS_PROFILE_TYPE_DEFAULT;
+
        return 0;
 
 out_wmi_wq:
@@ -903,6 +906,24 @@ void wil_abort_scan(struct wil6210_priv *wil, bool sync)
        }
 }
 
+int wil_ps_update(struct wil6210_priv *wil, enum wmi_ps_profile_type ps_profile)
+{
+       int rc;
+
+       if (!test_bit(WMI_FW_CAPABILITY_PS_CONFIG, wil->fw_capabilities)) {
+               wil_err(wil, "set_power_mgmt not supported\n");
+               return -EOPNOTSUPP;
+       }
+
+       rc  = wmi_ps_dev_profile_cfg(wil, ps_profile);
+       if (rc)
+               wil_err(wil, "wmi_ps_dev_profile_cfg failed (%d)\n", rc);
+       else
+               wil->ps_profile = ps_profile;
+
+       return rc;
+}
+
 /*
  * We reset all the structures, and we reset the UMAC.
  * After calling this routine, you're expected to reload
@@ -1033,6 +1054,9 @@ int wil_reset(struct wil6210_priv *wil, bool load_fw)
                        return rc;
                }
 
+               if (wil->ps_profile != WMI_PS_PROFILE_TYPE_DEFAULT)
+                       wil_ps_update(wil, wil->ps_profile);
+
                wil_collect_fw_info(wil);
 
                if (wil->platform_ops.notify) {
index fee18916b713bdefe01db023d1756d6ead8c8da0..9cedc2d642bab2329708e7b39601e1c57e3bed35 100644 (file)
@@ -691,6 +691,8 @@ struct wil6210_priv {
        /* High Access Latency Policy voting */
        struct wil_halp halp;
 
+       enum wmi_ps_profile_type ps_profile;
+
 #ifdef CONFIG_PM
 #ifdef CONFIG_PM_SLEEP
        struct notifier_block pm_notify;
@@ -812,6 +814,8 @@ int wil_if_add(struct wil6210_priv *wil);
 void wil_if_remove(struct wil6210_priv *wil);
 int wil_priv_init(struct wil6210_priv *wil);
 void wil_priv_deinit(struct wil6210_priv *wil);
+int wil_ps_update(struct wil6210_priv *wil,
+                 enum wmi_ps_profile_type ps_profile);
 int wil_reset(struct wil6210_priv *wil, bool no_fw);
 void wil_fw_error_recovery(struct wil6210_priv *wil);
 void wil_set_recovery_state(struct wil6210_priv *wil, int state);