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;
|
||||
}
|
||||
|
||||
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 */
|
||||
int iwl_mvm_mac_sta_state_common(struct ieee80211_hw *hw,
|
||||
struct ieee80211_vif *vif,
|
||||
@@ -4188,6 +4202,7 @@ int iwl_mvm_mac_sta_state_common(struct ieee80211_hw *hw,
|
||||
new_state == IEEE80211_STA_AUTHORIZED) {
|
||||
ret = iwl_mvm_sta_state_assoc_to_authorized(mvm, vif, sta,
|
||||
callbacks);
|
||||
iwl_mvm_smps_workaround(mvm, vif, true);
|
||||
} else if (old_state == IEEE80211_STA_AUTHORIZED &&
|
||||
new_state == IEEE80211_STA_ASSOC) {
|
||||
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
|
||||
/*
|
||||
* Copyright (C) 2022-2024 Intel Corporation
|
||||
* Copyright (C) 2022-2025 Intel Corporation
|
||||
*/
|
||||
#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) {
|
||||
iwl_mvm_smps_workaround(mvm, vif, false);
|
||||
ret = iwl_mvm_power_update_mac(mvm);
|
||||
if (ret)
|
||||
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_bss_conf *bss_conf,
|
||||
bool is_ap);
|
||||
|
||||
void iwl_mvm_smps_workaround(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
|
||||
bool update);
|
||||
#endif /* __IWL_MVM_H__ */
|
||||
|
||||
Reference in New Issue
Block a user