wifi: iwlwifi: mvm: calculate EMLSR mode after connection
authorMiri Korenblit <miriam.rachel.korenblit@intel.com>
Tue, 16 Apr 2024 10:53:59 +0000 (13:53 +0300)
committerJohannes Berg <johannes.berg@intel.com>
Fri, 19 Apr 2024 08:16:32 +0000 (10:16 +0200)
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>
drivers/net/wireless/intel/iwlwifi/mvm/coex.c
drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c
drivers/net/wireless/intel/iwlwifi/mvm/mld-mac80211.c
drivers/net/wireless/intel/iwlwifi/mvm/mvm.h
drivers/net/wireless/intel/iwlwifi/mvm/rx.c

index 41afd5d50d812e4abac0f7e3d8181550dbc9a748..f31752bcd2a274f3f94afdce5dad007741368c00 100644 (file)
@@ -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;
index ac7d986d9cd797639f702893c4e202d42747ecaa..0791dac086e1993b2a0324d63982c4f8fb2297c2 100644 (file)
@@ -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
                 */
index bcf2fd23300ffe23d15ed7bb7773a1bc58b70397..25d98ea6db4497acf96c0a9a7c2307289ae0f1e7 100644 (file)
@@ -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;
index c477978d8fa3f63914532e5a18b72081911f2287..77786c1a7528146ecb0501bbb8d54fdd388e5f7a 100644 (file)
@@ -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
index f8f57e191c59691d564e21e1e76d774a67046a15..4f578f3e7e74b29d32902037ddca57ef438bcb26 100644 (file)
@@ -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