wifi: iwlwifi: w/a FW SMPS mode selection
[ Upstream commit b2e709805ce955f80803b7cab3421813c79e1df4 ] The FW is now responsible of determining the SMPS mode. If the user disabled power save in a certain vif, we send the vif-level power command to clear out the POWER_FLAGS_POWER_MANAGEMENT_ENA_MSK bit for that vif. But erroneously, the FW checks DEVICE_POWER_FLAGS_POWER_SAVE_ENA_MSK in the device-level command to determine the SMPS mode. To W/A this, send also the device-level command when the power save of a vif changes, and disable power save if there is any vif that has power save disabled. Signed-off-by: Daniel Gabay <daniel.gabay@intel.com> Signed-off-by: Miri Korenblit <miriam.rachel.korenblit@intel.com> Link: https://patch.msgid.link/20250308231427.7bf205efa027.I2c793ff1fc2a6779a95faaee1ded348100fd97f1@changeid Signed-off-by: Johannes Berg <johannes.berg@intel.com> Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
0446d34a85
commit
1c55feb638
@@ -4096,6 +4096,20 @@ iwl_mvm_sta_state_authorized_to_assoc(struct iwl_mvm *mvm,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void iwl_mvm_smps_workaround(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
|
||||||
|
bool update)
|
||||||
|
{
|
||||||
|
struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif);
|
||||||
|
|
||||||
|
if (!iwl_mvm_has_rlc_offload(mvm))
|
||||||
|
return;
|
||||||
|
|
||||||
|
mvmvif->ps_disabled = !vif->cfg.ps;
|
||||||
|
|
||||||
|
if (update)
|
||||||
|
iwl_mvm_power_update_mac(mvm);
|
||||||
|
}
|
||||||
|
|
||||||
/* Common part for MLD and non-MLD modes */
|
/* Common part for MLD and non-MLD modes */
|
||||||
int iwl_mvm_mac_sta_state_common(struct ieee80211_hw *hw,
|
int iwl_mvm_mac_sta_state_common(struct ieee80211_hw *hw,
|
||||||
struct ieee80211_vif *vif,
|
struct ieee80211_vif *vif,
|
||||||
@@ -4188,6 +4202,7 @@ int iwl_mvm_mac_sta_state_common(struct ieee80211_hw *hw,
|
|||||||
new_state == IEEE80211_STA_AUTHORIZED) {
|
new_state == IEEE80211_STA_AUTHORIZED) {
|
||||||
ret = iwl_mvm_sta_state_assoc_to_authorized(mvm, vif, sta,
|
ret = iwl_mvm_sta_state_assoc_to_authorized(mvm, vif, sta,
|
||||||
callbacks);
|
callbacks);
|
||||||
|
iwl_mvm_smps_workaround(mvm, vif, true);
|
||||||
} else if (old_state == IEEE80211_STA_AUTHORIZED &&
|
} else if (old_state == IEEE80211_STA_AUTHORIZED &&
|
||||||
new_state == IEEE80211_STA_ASSOC) {
|
new_state == IEEE80211_STA_ASSOC) {
|
||||||
ret = iwl_mvm_sta_state_authorized_to_assoc(mvm, vif, sta,
|
ret = iwl_mvm_sta_state_authorized_to_assoc(mvm, vif, sta,
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
|
// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
|
||||||
/*
|
/*
|
||||||
* Copyright (C) 2022-2024 Intel Corporation
|
* Copyright (C) 2022-2025 Intel Corporation
|
||||||
*/
|
*/
|
||||||
#include "mvm.h"
|
#include "mvm.h"
|
||||||
|
|
||||||
@@ -961,6 +961,7 @@ static void iwl_mvm_mld_vif_cfg_changed_station(struct iwl_mvm *mvm,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (changes & BSS_CHANGED_PS) {
|
if (changes & BSS_CHANGED_PS) {
|
||||||
|
iwl_mvm_smps_workaround(mvm, vif, false);
|
||||||
ret = iwl_mvm_power_update_mac(mvm);
|
ret = iwl_mvm_power_update_mac(mvm);
|
||||||
if (ret)
|
if (ret)
|
||||||
IWL_ERR(mvm, "failed to update power mode\n");
|
IWL_ERR(mvm, "failed to update power mode\n");
|
||||||
|
|||||||
@@ -3042,4 +3042,7 @@ iwl_mvm_send_ap_tx_power_constraint_cmd(struct iwl_mvm *mvm,
|
|||||||
struct ieee80211_vif *vif,
|
struct ieee80211_vif *vif,
|
||||||
struct ieee80211_bss_conf *bss_conf,
|
struct ieee80211_bss_conf *bss_conf,
|
||||||
bool is_ap);
|
bool is_ap);
|
||||||
|
|
||||||
|
void iwl_mvm_smps_workaround(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
|
||||||
|
bool update);
|
||||||
#endif /* __IWL_MVM_H__ */
|
#endif /* __IWL_MVM_H__ */
|
||||||
|
|||||||
Reference in New Issue
Block a user