wifi: iwlwifi: mvm: calculate EMLSR mode after connection
JIRA: https://issues.redhat.com/browse/RHEL-50013 commit 9c6921121961cc0cecccb95652be6d98116f854b Author: Miri Korenblit <miriam.rachel.korenblit@intel.com> Date: Tue Apr 16 13:53:59 2024 +0300 wifi: iwlwifi: mvm: calculate EMLSR mode after connection The function iwl_mvm_can_enter_esr() is (among others) calculating if EMLSR mode is disabled due to BT coex by calling iwl_mvm_bt_coex_calculate_esr_mode(), then stores the decision in mvmvif::esr_disable_reason. But there is no need to calculate this every time iwl_mvm_can_enter_esr is called. Fix this by calculating it once after authorization, and in iwl_mvm_can_enter_esr only check mvmvif::esr_disable_reason. Signed-off-by: Miri Korenblit <miriam.rachel.korenblit@intel.com> Link: https://msgid.link/20240416134215.a767e243366e.I3b32d36cda23f67dc103a28a9bdccb0039d22574@changeid Signed-off-by: Johannes Berg <johannes.berg@intel.com> Signed-off-by: Jose Ignacio Tornos Martinez <jtornosm@redhat.com>
This commit is contained in:
parent
56519ca483
commit
e27600c34a
|
@ -279,7 +279,7 @@ static void iwl_mvm_bt_coex_enable_esr(struct iwl_mvm *mvm,
|
|||
* This function receives the LB link id and checks if eSR should be
|
||||
* enabled or disabled (due to BT coex)
|
||||
*/
|
||||
bool
|
||||
static bool
|
||||
iwl_mvm_bt_coex_calculate_esr_mode(struct iwl_mvm *mvm,
|
||||
struct ieee80211_vif *vif,
|
||||
int link_id, int primary_link)
|
||||
|
@ -336,9 +336,9 @@ iwl_mvm_bt_coex_calculate_esr_mode(struct iwl_mvm *mvm,
|
|||
return wifi_loss_rate <= IWL_MVM_BT_COEX_WIFI_LOSS_THRESH;
|
||||
}
|
||||
|
||||
void iwl_mvm_bt_coex_update_vif_esr(struct iwl_mvm *mvm,
|
||||
struct ieee80211_vif *vif,
|
||||
int link_id)
|
||||
void iwl_mvm_bt_coex_update_link_esr(struct iwl_mvm *mvm,
|
||||
struct ieee80211_vif *vif,
|
||||
int link_id)
|
||||
{
|
||||
unsigned long usable_links = ieee80211_vif_usable_links(vif);
|
||||
int primary_link = iwl_mvm_mld_get_primary_link(mvm, vif,
|
||||
|
@ -400,7 +400,7 @@ static void iwl_mvm_bt_notif_per_link(struct iwl_mvm *mvm,
|
|||
return;
|
||||
}
|
||||
|
||||
iwl_mvm_bt_coex_update_vif_esr(mvm, vif, link_id);
|
||||
iwl_mvm_bt_coex_update_link_esr(mvm, vif, link_id);
|
||||
|
||||
if (fw_has_capa(&mvm->fw->ucode_capa, IWL_UCODE_TLV_CAPA_COEX_SCHEMA_2))
|
||||
min_ag_for_static_smps = BT_VERY_HIGH_TRAFFIC;
|
||||
|
|
|
@ -3842,6 +3842,24 @@ out:
|
|||
return callbacks->update_sta(mvm, vif, sta);
|
||||
}
|
||||
|
||||
static void iwl_mvm_bt_coex_update_vif_esr(struct iwl_mvm *mvm,
|
||||
struct ieee80211_vif *vif)
|
||||
{
|
||||
unsigned long usable_links = ieee80211_vif_usable_links(vif);
|
||||
u8 link_id;
|
||||
|
||||
for_each_set_bit(link_id, &usable_links, IEEE80211_MLD_MAX_NUM_LINKS) {
|
||||
struct ieee80211_bss_conf *link_conf =
|
||||
link_conf_dereference_protected(vif, link_id);
|
||||
|
||||
if (WARN_ON_ONCE(!link_conf))
|
||||
return;
|
||||
|
||||
if (link_conf->chanreq.oper.chan->band == NL80211_BAND_2GHZ)
|
||||
iwl_mvm_bt_coex_update_link_esr(mvm, vif, link_id);
|
||||
}
|
||||
}
|
||||
|
||||
static int
|
||||
iwl_mvm_sta_state_assoc_to_authorized(struct iwl_mvm *mvm,
|
||||
struct ieee80211_vif *vif,
|
||||
|
@ -3869,6 +3887,9 @@ iwl_mvm_sta_state_assoc_to_authorized(struct iwl_mvm *mvm,
|
|||
callbacks->mac_ctxt_changed(mvm, vif, false);
|
||||
iwl_mvm_mei_host_associated(mvm, vif, mvm_sta);
|
||||
|
||||
/* Calculate eSR mode due to BT coex */
|
||||
iwl_mvm_bt_coex_update_vif_esr(mvm, vif);
|
||||
|
||||
/* when client is authorized (AP station marked as such),
|
||||
* try to enable more links
|
||||
*/
|
||||
|
|
|
@ -1344,13 +1344,13 @@ static bool iwl_mvm_can_enter_esr(struct iwl_mvm *mvm,
|
|||
unsigned long desired_links)
|
||||
{
|
||||
struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif);
|
||||
int primary_link = iwl_mvm_mld_get_primary_link(mvm, vif,
|
||||
desired_links);
|
||||
u16 usable_links = ieee80211_vif_usable_links(vif);
|
||||
const struct wiphy_iftype_ext_capab *ext_capa;
|
||||
bool ret = true;
|
||||
int link_id;
|
||||
|
||||
if (primary_link < 0)
|
||||
if (!ieee80211_vif_is_mld(vif) || !vif->cfg.assoc ||
|
||||
hweight16(usable_links) <= 1)
|
||||
return false;
|
||||
|
||||
if (!(vif->cfg.eml_cap & IEEE80211_EML_CAP_EMLSR_SUPP))
|
||||
|
@ -1373,12 +1373,7 @@ static bool iwl_mvm_can_enter_esr(struct iwl_mvm *mvm,
|
|||
if (link_conf->chanreq.oper.chan->band != NL80211_BAND_2GHZ)
|
||||
continue;
|
||||
|
||||
ret = iwl_mvm_bt_coex_calculate_esr_mode(mvm, vif, link_id,
|
||||
primary_link);
|
||||
// Mark eSR as disabled for the next time
|
||||
if (!ret)
|
||||
mvmvif->esr_disable_reason |= IWL_MVM_ESR_DISABLE_COEX;
|
||||
break;
|
||||
return !(mvmvif->esr_disable_reason & IWL_MVM_ESR_DISABLE_COEX);
|
||||
}
|
||||
|
||||
return ret;
|
||||
|
|
|
@ -2155,12 +2155,9 @@ bool iwl_mvm_bt_coex_is_tpc_allowed(struct iwl_mvm *mvm,
|
|||
u8 iwl_mvm_bt_coex_get_single_ant_msk(struct iwl_mvm *mvm, u8 enabled_ants);
|
||||
u8 iwl_mvm_bt_coex_tx_prio(struct iwl_mvm *mvm, struct ieee80211_hdr *hdr,
|
||||
struct ieee80211_tx_info *info, u8 ac);
|
||||
bool iwl_mvm_bt_coex_calculate_esr_mode(struct iwl_mvm *mvm,
|
||||
struct ieee80211_vif *vif,
|
||||
int link_id, int primary_link);
|
||||
void iwl_mvm_bt_coex_update_vif_esr(struct iwl_mvm *mvm,
|
||||
struct ieee80211_vif *vif,
|
||||
int link_id);
|
||||
void iwl_mvm_bt_coex_update_link_esr(struct iwl_mvm *mvm,
|
||||
struct ieee80211_vif *vif,
|
||||
int link_id);
|
||||
|
||||
/* beacon filtering */
|
||||
#ifdef CONFIG_IWLWIFI_DEBUGFS
|
||||
|
|
|
@ -895,8 +895,8 @@ iwl_mvm_stat_iterator_all_links(struct iwl_mvm *mvm,
|
|||
|
||||
if (link_info->phy_ctxt &&
|
||||
link_info->phy_ctxt->channel->band == NL80211_BAND_2GHZ)
|
||||
iwl_mvm_bt_coex_update_vif_esr(mvm, bss_conf->vif,
|
||||
link_id);
|
||||
iwl_mvm_bt_coex_update_link_esr(mvm, bss_conf->vif,
|
||||
link_id);
|
||||
|
||||
/* make sure that beacon statistics don't go backwards with TCM
|
||||
* request to clear statistics
|
||||
|
|
Loading…
Reference in New Issue