wifi: iwlwifi: mvm: exit EMLSR if both links are missing beacons
authorEmmanuel Grumbach <emmanuel.grumbach@intel.com>
Thu, 8 Aug 2024 20:22:41 +0000 (23:22 +0300)
committerJohannes Berg <johannes.berg@intel.com>
Tue, 27 Aug 2024 08:28:54 +0000 (10:28 +0200)
If both links are missing 5 beacons, we need to exit EMLSR, if only one
link misses beacons, we need to wait until 11 beacons are missed.

Signed-off-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
Signed-off-by: Miri Korenblit <miriam.rachel.korenblit@intel.com>
Link: https://patch.msgid.link/20240808232017.b7785943a4fe.I70a459c5e7db85f398d5795ba83bb15f65d6bf9d@changeid
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
drivers/net/wireless/intel/iwlwifi/mvm/constants.h
drivers/net/wireless/intel/iwlwifi/mvm/mac-ctxt.c

index 8f63cbe9e50daa5b5d91bd7724a11910604b5149..ddf484027d4fe6804bb90489ed60acbca60b1495 100644 (file)
@@ -16,6 +16,8 @@
 #define IWL_MVM_BT_COEX_WIFI_LOSS_THRESH       0
 #define IWL_MVM_TRIGGER_LINK_SEL_TIME_SEC      30
 #define IWL_MVM_TPT_COUNT_WINDOW_SEC           5
+#define IWL_MVM_BCN_LOSS_EXIT_ESR_THRESH_2_LINKS       5
+#define IWL_MVM_BCN_LOSS_EXIT_ESR_THRESH       11
 
 #define IWL_MVM_DEFAULT_PS_TX_DATA_TIMEOUT     (100 * USEC_PER_MSEC)
 #define IWL_MVM_DEFAULT_PS_RX_DATA_TIMEOUT     (100 * USEC_PER_MSEC)
 #define IWL_MVM_6GHZ_PASSIVE_SCAN_ASSOC_TIMEOUT 60   /* in seconds */
 #define IWL_MVM_MIN_BEACON_INTERVAL_TU         16
 #define IWL_MVM_AUTO_EML_ENABLE                 true
-#define IWL_MVM_MISSED_BEACONS_EXIT_ESR_THRESH 7
 
 #define IWL_MVM_HIGH_RSSI_THRESH_20MHZ         -67
 #define IWL_MVM_LOW_RSSI_THRESH_20MHZ          -71
index 4a8f50f8bb79befe53efbb4bf77d30c431c0b36a..bb864ec2e22a2a811a4fd3878320f6737f808b9d 100644 (file)
@@ -1664,10 +1664,27 @@ iwl_mvm_handle_missed_beacons_notif(struct iwl_mvm *mvm,
                                 "missed_beacons:%d, missed_beacons_since_rx:%d\n",
                                 rx_missed_bcon, rx_missed_bcon_since_rx);
                }
-       } else if (rx_missed_bcon >= IWL_MVM_MISSED_BEACONS_EXIT_ESR_THRESH &&
-                  link_id >= 0 && hweight16(vif->active_links) > 1) {
-               iwl_mvm_exit_esr(mvm, vif, IWL_MVM_ESR_EXIT_MISSED_BEACON,
-                                iwl_mvm_get_other_link(vif, link_id));
+       } else if (link_id >= 0 && hweight16(vif->active_links) > 1) {
+               u32 scnd_lnk_bcn_lost = 0;
+
+               if (notif_ver >= 5 &&
+                   !IWL_FW_CHECK(mvm,
+                                 le32_to_cpu(mb->other_link_id) == IWL_MVM_FW_LINK_ID_INVALID,
+                                 "No data for other link id but we are in EMLSR active_links: 0x%x\n",
+                                 vif->active_links))
+                       scnd_lnk_bcn_lost =
+                               le32_to_cpu(mb->consec_missed_beacons_other_link);
+
+               /* Exit EMLSR if we lost more than
+                * IWL_MVM_MISSED_BEACONS_EXIT_ESR_THRESH beacons on boths links
+                * OR more than IWL_MVM_BCN_LOSS_EXIT_ESR_THRESH on any link.
+                */
+               if ((rx_missed_bcon >= IWL_MVM_BCN_LOSS_EXIT_ESR_THRESH_2_LINKS &&
+                    scnd_lnk_bcn_lost >= IWL_MVM_BCN_LOSS_EXIT_ESR_THRESH_2_LINKS) ||
+                   rx_missed_bcon >= IWL_MVM_BCN_LOSS_EXIT_ESR_THRESH)
+                       iwl_mvm_exit_esr(mvm, vif,
+                                        IWL_MVM_ESR_EXIT_MISSED_BEACON,
+                                        iwl_mvm_get_primary_link(vif));
        } else if (rx_missed_bcon_since_rx > IWL_MVM_MISSED_BEACONS_THRESHOLD) {
                if (!iwl_mvm_has_new_tx_api(mvm))
                        ieee80211_beacon_loss(vif);