wifi: iwlwifi: mld: start AP with the correct bandwidth
authorAvraham Stern <avraham.stern@intel.com>
Wed, 30 Apr 2025 12:57:24 +0000 (15:57 +0300)
committerMiri Korenblit <miriam.rachel.korenblit@intel.com>
Tue, 6 May 2025 19:22:11 +0000 (22:22 +0300)
When a channel context is added, it is still not assigned to the link
and the link is not yet active. As a result, the channel context
min_def is used when the AP is started, even when the full bandwidth
should be used.
Fix it by updating the PHY channel context when the link is already
active so the full bandwidth is used when needed.

Signed-off-by: Avraham Stern <avraham.stern@intel.com>
Signed-off-by: Miri Korenblit <miriam.rachel.korenblit@intel.com>
Link: https://patch.msgid.link/20250430155443.30b043b10fb1.I62c2aa58687e4796b759fa68132122119a337b49@changeid
drivers/net/wireless/intel/iwlwifi/mld/ap.c
drivers/net/wireless/intel/iwlwifi/mld/mac80211.c
drivers/net/wireless/intel/iwlwifi/mld/phy.c
drivers/net/wireless/intel/iwlwifi/mld/phy.h

index 571eabd0b511f45d6658b0722713313b6ef6fce9..26511b49d89af74f6790e0e4eefb365f05cc9fde 100644 (file)
@@ -11,6 +11,7 @@
 #include "tx.h"
 #include "power.h"
 #include "key.h"
+#include "phy.h"
 #include "iwl-utils.h"
 
 #include "fw/api/sta.h"
@@ -269,6 +270,7 @@ int iwl_mld_start_ap_ibss(struct ieee80211_hw *hw,
 {
        struct iwl_mld *mld = IWL_MAC80211_GET_MLD(hw);
        struct iwl_mld_vif *mld_vif = iwl_mld_vif_from_mac80211(vif);
+       struct ieee80211_chanctx_conf *ctx;
        int ret;
 
        if (vif->type == NL80211_IFTYPE_AP)
@@ -314,6 +316,13 @@ int iwl_mld_start_ap_ibss(struct ieee80211_hw *hw,
                return iwl_mld_mac_fw_action(mld, mld->p2p_device_vif,
                                             FW_CTXT_ACTION_MODIFY);
 
+       /* When the channel context was added, the link is not yet active, so
+        * min_def is always used. Update the PHY again here in case def should
+        * actually be used.
+        */
+       ctx = wiphy_dereference(mld->wiphy, link->chanctx_conf);
+       iwl_mld_update_phy_chandef(mld, ctx);
+
        return 0;
 rm_bcast:
        iwl_mld_remove_bcast_sta(mld, vif, link);
index b64e3f290e71e0eb58f911f2cb33ab24c02e1101..e06cf72b2de58b4fdebc443a5f6263facaf59ecd 100644 (file)
@@ -887,9 +887,8 @@ void iwl_mld_change_chanctx(struct ieee80211_hw *hw,
                        return;
        }
 update:
-       phy->chandef = *chandef;
 
-       iwl_mld_phy_fw_action(mld, ctx, FW_CTXT_ACTION_MODIFY);
+       iwl_mld_update_phy_chandef(mld, ctx);
 }
 
 static u8
index 2345fe5c3291528bb5ea82f5d62dd2d1f736c15e..3a80ee5e1cb38c7efee22aa14fb0e2c14d12139b 100644 (file)
@@ -182,3 +182,14 @@ int iwl_mld_send_phy_cfg_cmd(struct iwl_mld *mld)
 
        return iwl_mld_send_cmd_pdu(mld, PHY_CONFIGURATION_CMD, &cmd);
 }
+
+void iwl_mld_update_phy_chandef(struct iwl_mld *mld,
+                               struct ieee80211_chanctx_conf *ctx)
+{
+       struct iwl_mld_phy *phy = iwl_mld_phy_from_mac80211(ctx);
+       struct cfg80211_chan_def *chandef =
+               iwl_mld_get_chandef_from_chanctx(mld, ctx);
+
+       phy->chandef = *chandef;
+       iwl_mld_phy_fw_action(mld, ctx, FW_CTXT_ACTION_MODIFY);
+}
index 563e309deb0a0e46ffbe908bda249218716f31da..0deaf179f07ccc3dae7d870a072f5b9cbfd78c1f 100644 (file)
@@ -54,4 +54,7 @@ u8 iwl_mld_get_fw_ctrl_pos(const struct cfg80211_chan_def *chandef);
 
 int iwl_mld_send_phy_cfg_cmd(struct iwl_mld *mld);
 
+void iwl_mld_update_phy_chandef(struct iwl_mld *mld,
+                               struct ieee80211_chanctx_conf *ctx);
+
 #endif /* __iwl_mld_phy_h__ */