wifi: iwlwifi: mld: Revert "wifi: iwlwifi: mld: allow EMLSR with 2.4 GHz when BT is ON"

Due to a hw bug, this feature won't be enabled. Revert its
implementation.
This reverts commit 37808a3788 ("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
This commit is contained in:
Miri Korenblit
2025-07-11 18:34:25 +03:00
parent 0ce92d548b
commit 7cc5f89bfb
4 changed files with 18 additions and 66 deletions

View 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);
}

View File

@@ -127,6 +127,7 @@
* 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
@@ -189,7 +190,6 @@
* @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 */

View 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;
/* In EMLSR and BT is turned ON */
for_each_vif_active_link(vif, link, link_id) {
if (WARN_ON(!link->chanreq.oper.chan))
continue;
if (link->chanreq.oper.chan->band != NL80211_BAND_2GHZ)
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;
}

View 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 =