Commit b1873300 authored by Luciano Coelho's avatar Luciano Coelho Committed by Emmanuel Grumbach

iwlwifi: mvm: re-enable ps when monitor interfaces are removed

If a monitor interface is added and then removed, we don't reset the
mvm->ps_disabled flag, so we never re-enable power saving.  Fix that
and rearrange the code a bit.

Additionally, fix a small indentation mistake in the
iwl_mvm_power_set_pm() function declaration.
Signed-off-by: default avatarLuciano Coelho <luciano.coelho@intel.com>
Reviewed-by: default avatarJohannes Berg <johannes.berg@intel.com>
Signed-off-by: default avatarEmmanuel Grumbach <emmanuel.grumbach@intel.com>
parent 228670b2
...@@ -776,6 +776,7 @@ static void iwl_mvm_restart_cleanup(struct iwl_mvm *mvm) ...@@ -776,6 +776,7 @@ static void iwl_mvm_restart_cleanup(struct iwl_mvm *mvm)
iwl_trans_stop_device(mvm->trans); iwl_trans_stop_device(mvm->trans);
mvm->scan_status = IWL_MVM_SCAN_NONE; mvm->scan_status = IWL_MVM_SCAN_NONE;
mvm->ps_disabled = false;
/* just in case one was running */ /* just in case one was running */
ieee80211_remain_on_channel_expired(mvm->hw); ieee80211_remain_on_channel_expired(mvm->hw);
......
...@@ -566,8 +566,7 @@ static void iwl_mvm_power_iterator(void *_data, u8 *mac, ...@@ -566,8 +566,7 @@ static void iwl_mvm_power_iterator(void *_data, u8 *mac,
} }
} }
static void static void iwl_mvm_power_set_pm(struct iwl_mvm *mvm,
iwl_mvm_power_set_pm(struct iwl_mvm *mvm,
struct iwl_power_vifs *vifs) struct iwl_power_vifs *vifs)
{ {
struct iwl_mvm_vif *bss_mvmvif = NULL; struct iwl_mvm_vif *bss_mvmvif = NULL;
...@@ -830,7 +829,7 @@ int iwl_mvm_power_update_mac(struct iwl_mvm *mvm) ...@@ -830,7 +829,7 @@ int iwl_mvm_power_update_mac(struct iwl_mvm *mvm)
struct iwl_power_vifs vifs = { struct iwl_power_vifs vifs = {
.mvm = mvm, .mvm = mvm,
}; };
bool ba_enable; bool ba_enable, disable_ps;
int ret; int ret;
lockdep_assert_held(&mvm->mutex); lockdep_assert_held(&mvm->mutex);
...@@ -838,15 +837,18 @@ int iwl_mvm_power_update_mac(struct iwl_mvm *mvm) ...@@ -838,15 +837,18 @@ int iwl_mvm_power_update_mac(struct iwl_mvm *mvm)
iwl_mvm_power_set_pm(mvm, &vifs); iwl_mvm_power_set_pm(mvm, &vifs);
/* disable PS if CAM */ /* disable PS if CAM */
if (iwlmvm_mod_params.power_scheme == IWL_POWER_SCHEME_CAM) { disable_ps = (iwlmvm_mod_params.power_scheme == IWL_POWER_SCHEME_CAM);
mvm->ps_disabled = true; /* ...or if there is an active monitor vif */
} else { disable_ps |= (vifs.monitor_vif && vifs.monitor_active);
/* don't update device power state unless we add / remove monitor */
if (vifs.monitor_vif) { /* update device power state if it has changed */
if (vifs.monitor_active) if (mvm->ps_disabled != disable_ps) {
mvm->ps_disabled = true; bool old_ps_disabled = mvm->ps_disabled;
mvm->ps_disabled = disable_ps;
ret = iwl_mvm_power_update_device(mvm); ret = iwl_mvm_power_update_device(mvm);
if (ret) if (ret) {
mvm->ps_disabled = old_ps_disabled;
return ret; return ret;
} }
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment