mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-12-28 11:18:45 +07:00
wil6210: restore power save state after internal FW reset
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>
This commit is contained in:
parent
82e9f64655
commit
8b068c032a
@ -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 = {
|
||||
|
@ -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) {
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user