]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
wifi: iwlwifi: mld: Revert "wifi: iwlwifi: mld: allow EMLSR with 2.4 GHz when BT...
authorMiri Korenblit <miriam.rachel.korenblit@intel.com>
Fri, 11 Jul 2025 15:34:25 +0000 (18:34 +0300)
committerMiri Korenblit <miriam.rachel.korenblit@intel.com>
Mon, 14 Jul 2025 16:36:13 +0000 (19:36 +0300)
Due to a hw bug, this feature won't be enabled. Revert its
implementation.
This reverts commit 37808a3788fd ("wifi: iwlwifi: mld: allow EMLSR with
2.4 GHz when BT is ON")

Reviewed-by: Johannes Berg <johannes.berg@intel.com>
Signed-off-by: Miri Korenblit <miriam.rachel.korenblit@intel.com>
Link: https://patch.msgid.link/20250711183056.57755ac3f39d.I63ae0ee3e6cdc9b11175ad15927aaad3b8f8f47a@changeid
drivers/net/wireless/intel/iwlwifi/mld/coex.c
drivers/net/wireless/intel/iwlwifi/mld/mld.h
drivers/net/wireless/intel/iwlwifi/mld/mlo.c
drivers/net/wireless/intel/iwlwifi/mld/tests/link-selection.c

index 32c727b3b391a0d74f3aeb88a14394a7e23c2643..5f262bd43f21d5882309817592616ac21eb2fb26 100644 (file)
@@ -24,13 +24,17 @@ int iwl_mld_send_bt_init_conf(struct iwl_mld *mld)
 void iwl_mld_handle_bt_coex_notif(struct iwl_mld *mld,
                                  struct iwl_rx_packet *pkt)
 {
-       const struct iwl_bt_coex_profile_notif *notif = (const void *)pkt->data;
+       const struct iwl_bt_coex_profile_notif *notif = (void *)pkt->data;
        const struct iwl_bt_coex_profile_notif zero_notif = {};
        /* zeroed structure means that BT is OFF */
        bool bt_is_active = memcmp(notif, &zero_notif, sizeof(*notif));
 
-       mld->last_bt_notif = *notif;
+       if (bt_is_active == mld->bt_is_active)
+               return;
+
        IWL_DEBUG_INFO(mld, "BT was turned %s\n", bt_is_active ? "ON" : "OFF");
 
+       mld->bt_is_active = bt_is_active;
+
        iwl_mld_emlsr_check_bt(mld);
 }
index a9e59378f14271bcec4c222ef84ba64d2256a6d7..8bc4749599cad03679f13b69584254a84d4e31c9 100644 (file)
  *     cleanup using iwl_mld_free_internal_sta
  * @netdetect: indicates the FW is in suspend mode with netdetect configured
  * @p2p_device_vif: points to the p2p device vif if exists
+ * @bt_is_active: indicates that BT is active
  * @dev: pointer to device struct. For printing purposes
  * @trans: pointer to the transport layer
  * @cfg: pointer to the device configuration
  * @ptp_data: data of the PTP clock
  * @time_sync: time sync data.
  * @ftm_initiator: FTM initiator data
- * @last_bt_notif: last received BT Coex notif
  */
 struct iwl_mld {
        /* Add here fields that need clean up on restart */
@@ -214,7 +214,7 @@ struct iwl_mld {
                bool netdetect;
 #endif /* CONFIG_PM_SLEEP */
                struct ieee80211_vif *p2p_device_vif;
-               struct iwl_bt_coex_profile_notif last_bt_notif;
+               bool bt_is_active;
        );
        struct ieee80211_link_sta __rcu *fw_id_to_link_sta[IWL_STATION_COUNT_MAX];
        /* And here fields that survive a fw restart */
index d002d2772a1da15ac1d9aaefbd653ba2dd6a7317..e57f5388fe772d10c044d74760f33cbbb3e13421 100644 (file)
@@ -689,40 +689,6 @@ s8 iwl_mld_get_emlsr_rssi_thresh(struct iwl_mld *mld,
 #undef RSSI_THRESHOLD
 }
 
-#define IWL_MLD_BT_COEX_DISABLE_EMLSR_RSSI_THRESH      -69
-#define IWL_MLD_BT_COEX_ENABLE_EMLSR_RSSI_THRESH       -63
-#define IWL_MLD_BT_COEX_WIFI_LOSS_THRESH               7
-
-static bool
-iwl_mld_bt_allows_emlsr(struct iwl_mld *mld, struct ieee80211_bss_conf *link,
-                       bool check_entry)
-{
-       int bt_penalty, rssi_thresh;
-       s32 link_rssi;
-
-       if (WARN_ON_ONCE(!link->bss))
-               return false;
-
-       link_rssi = MBM_TO_DBM(link->bss->signal);
-       rssi_thresh = check_entry ?
-                     IWL_MLD_BT_COEX_ENABLE_EMLSR_RSSI_THRESH :
-                     IWL_MLD_BT_COEX_DISABLE_EMLSR_RSSI_THRESH;
-       /* No valid RSSI - force to take low rssi */
-       if (!link_rssi)
-               link_rssi = rssi_thresh - 1;
-
-       if (link_rssi > rssi_thresh)
-               bt_penalty = max(mld->last_bt_notif.wifi_loss_mid_high_rssi[PHY_BAND_24][0],
-                                mld->last_bt_notif.wifi_loss_mid_high_rssi[PHY_BAND_24][1]);
-       else
-               bt_penalty = max(mld->last_bt_notif.wifi_loss_low_rssi[PHY_BAND_24][0],
-                                mld->last_bt_notif.wifi_loss_low_rssi[PHY_BAND_24][1]);
-
-       IWL_DEBUG_EHT(mld, "BT penalty for link-id %0X is %d\n",
-                     link->link_id, bt_penalty);
-       return bt_penalty < IWL_MLD_BT_COEX_WIFI_LOSS_THRESH;
-}
-
 static u32
 iwl_mld_emlsr_disallowed_with_link(struct iwl_mld *mld,
                                   struct ieee80211_vif *vif,
@@ -737,8 +703,7 @@ iwl_mld_emlsr_disallowed_with_link(struct iwl_mld *mld,
        if (WARN_ON_ONCE(!conf))
                return IWL_MLD_EMLSR_EXIT_INVALID;
 
-       if (link->chandef->chan->band == NL80211_BAND_2GHZ &&
-           !iwl_mld_bt_allows_emlsr(mld, conf, true))
+       if (link->chandef->chan->band == NL80211_BAND_2GHZ && mld->bt_is_active)
                ret |= IWL_MLD_EMLSR_EXIT_BT_COEX;
 
        if (link->signal <
@@ -1076,41 +1041,30 @@ static void iwl_mld_emlsr_check_bt_iter(void *_data, u8 *mac,
                                        struct ieee80211_vif *vif)
 {
        struct iwl_mld_vif *mld_vif = iwl_mld_vif_from_mac80211(vif);
-       const struct iwl_bt_coex_profile_notif zero_notif = {};
        struct iwl_mld *mld = mld_vif->mld;
        struct ieee80211_bss_conf *link;
        unsigned int link_id;
-       const struct iwl_bt_coex_profile_notif *notif = &mld->last_bt_notif;
 
        if (!iwl_mld_vif_has_emlsr_cap(vif))
                return;
 
-       /* zeroed structure means that BT is OFF */
-       if (!memcmp(notif, &zero_notif, sizeof(*notif))) {
+       if (!mld->bt_is_active) {
                iwl_mld_retry_emlsr(mld, vif);
                return;
        }
 
-       for_each_vif_active_link(vif, link, link_id) {
-               bool emlsr_active, emlsr_allowed;
+       /* BT is turned ON but we are not in EMLSR, nothing to do */
+       if (!iwl_mld_emlsr_active(vif))
+               return;
 
-               if (WARN_ON(!link->chanreq.oper.chan))
-                       continue;
+       /* In EMLSR and BT is turned ON */
 
-               if (link->chanreq.oper.chan->band != NL80211_BAND_2GHZ)
+       for_each_vif_active_link(vif, link, link_id) {
+               if (WARN_ON(!link->chanreq.oper.chan))
                        continue;
 
-               emlsr_active = iwl_mld_emlsr_active(vif);
-               emlsr_allowed = iwl_mld_bt_allows_emlsr(mld, link,
-                                                       !emlsr_active);
-               if (emlsr_allowed && !emlsr_active) {
-                       iwl_mld_retry_emlsr(mld, vif);
-                       return;
-               }
-
-               if (!emlsr_allowed && emlsr_active) {
-                       iwl_mld_exit_emlsr(mld, vif,
-                                          IWL_MLD_EMLSR_EXIT_BT_COEX,
+               if (link->chanreq.oper.chan->band == NL80211_BAND_2GHZ) {
+                       iwl_mld_exit_emlsr(mld, vif, IWL_MLD_EMLSR_EXIT_BT_COEX,
                                           iwl_mld_get_primary_link(vif));
                        return;
                }
index 94a037bec1fa8595f484e0daf53f5338938e468f..766c24db36137b93294abf98cd60c69ee6828e60 100644 (file)
@@ -287,7 +287,6 @@ static void test_iwl_mld_link_pair_allows_emlsr(struct kunit *test)
        const struct link_pair_case *params = test->param_value;
        struct iwl_mld *mld = test->priv;
        struct ieee80211_vif *vif;
-       struct ieee80211_bss_conf *link;
        /* link A is the primary and link B is the secondary */
        struct iwl_mld_link_sel_data a = {
                .chandef = params->chandef_a,
@@ -311,11 +310,6 @@ static void test_iwl_mld_link_pair_allows_emlsr(struct kunit *test)
 
        wiphy_lock(mld->wiphy);
 
-       link = wiphy_dereference(mld->wiphy, vif->link_conf[a.link_id]);
-       KUNIT_ALLOC_AND_ASSERT(test, link->bss);
-       link = wiphy_dereference(mld->wiphy, vif->link_conf[b.link_id]);
-       KUNIT_ALLOC_AND_ASSERT(test, link->bss);
-
        /* Simulate channel load */
        if (params->primary_link_active) {
                struct iwl_mld_phy *phy =