Commit 9c692112 authored by Miri Korenblit's avatar Miri Korenblit Committed by Johannes Berg
Browse files

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: default avatarMiri Korenblit <miriam.rachel.korenblit@intel.com>
Link: https://msgid.link/20240416134215.a767e243366e.I3b32d36cda23f67dc103a28a9bdccb0039d22574@changeid


Signed-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
parent 2887af4d
Loading
Loading
Loading
Loading
+5 −5
Original line number Diff line number Diff line
@@ -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,7 +336,7 @@ 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,
void iwl_mvm_bt_coex_update_link_esr(struct iwl_mvm *mvm,
				     struct ieee80211_vif *vif,
				     int link_id)
{
@@ -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;
+21 −0
Original line number Diff line number Diff line
@@ -3842,6 +3842,24 @@ iwl_mvm_sta_state_auth_to_assoc(struct ieee80211_hw *hw,
	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
		 */
+4 −9
Original line number Diff line number Diff line
@@ -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;
+3 −6
Original line number Diff line number Diff line
@@ -2155,10 +2155,7 @@ 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,
void iwl_mvm_bt_coex_update_link_esr(struct iwl_mvm *mvm,
				     struct ieee80211_vif *vif,
				     int link_id);

+2 −2
Original line number Diff line number Diff line
@@ -895,7 +895,7 @@ 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,
			iwl_mvm_bt_coex_update_link_esr(mvm, bss_conf->vif,
							link_id);

		/* make sure that beacon statistics don't go backwards with TCM