wifi: iwlwifi: pass ESR parameters to the firmware
authorEmmanuel Grumbach <emmanuel.grumbach@intel.com>
Mon, 12 Jun 2023 15:51:14 +0000 (18:51 +0300)
committerJohannes Berg <johannes.berg@intel.com>
Wed, 14 Jun 2023 10:32:18 +0000 (12:32 +0200)
The firmware needs to know the esr_transtition_timeout to time the
transition between EMLSR and single radio with the AP.
Add the EMLSR support bit to the wiphy extended capabilities so that
it'll be sent in our association request frame. There are some
limitations in the implementation so we cannot use zero
padding/transition delay; fill the correct values.

Also, feed the medium_synchronization delay to the firmware.

Signed-off-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
Signed-off-by: Gregory Greenman <gregory.greenman@intel.com>
Link: https://lore.kernel.org/r/20230612184434.09fa06820d03.Ie9a9fd37d4948f8c5dd91161de254184b1a093c0@changeid
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
drivers/net/wireless/intel/iwlwifi/fw/api/mac-cfg.h
drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c
drivers/net/wireless/intel/iwlwifi/mvm/mld-mac.c

index a4cb24934a01a963b2cb5f3b9cd239bdb92a5300..184db5a6f06f1e03b8de662a4c10144c2ce009ec 100644 (file)
@@ -236,7 +236,7 @@ struct iwl_mac_low_latency_cmd {
  *     Available only from version 2 of the command.
  *     This values comes from the EMLSR transition delay in the EML
  *     Capabilities subfield.
- * @reserved: alignment
+ * @medium_sync_delay: the value as it appeasr in P802.11be_D2.2 Figure 9-1002j.
  * @assoc_id: unique ID assigned by the AP during association
  * @reserved1: alignment
  * @data_policy: see &enum iwl_mac_data_policy
@@ -247,7 +247,7 @@ struct iwl_mac_low_latency_cmd {
 struct iwl_mac_client_data {
        u8 is_assoc;
        u8 esr_transition_timeout;
-       __le16 reserved;
+       __le16 medium_sync_delay;
 
        __le16 assoc_id;
        __le16 reserved1;
index 96577dcc22b7ad1199f49281a89caffda8c7e6c9..f7e2ca7eebf0ed23ece9f4e906ab9457870248bd 100644 (file)
@@ -245,12 +245,21 @@ static const u8 tm_if_types_ext_capa_sta[] = {
 /* Additional interface types for which extended capabilities are
  * specified separately
  */
+
+#define IWL_MVM_EMLSR_CAPA     (IEEE80211_EML_CAP_EMLSR_SUPP | \
+                                IEEE80211_EML_CAP_EMLSR_PADDING_DELAY_32US << \
+                                       __bf_shf(IEEE80211_EML_CAP_EMLSR_PADDING_DELAY) | \
+                                IEEE80211_EML_CAP_EMLSR_TRANSITION_DELAY_64US << \
+                                       __bf_shf(IEEE80211_EML_CAP_EMLSR_TRANSITION_DELAY))
+
 static const struct wiphy_iftype_ext_capab add_iftypes_ext_capa[] = {
        {
                .iftype = NL80211_IFTYPE_STATION,
                .extended_capabilities = he_if_types_ext_capa_sta,
                .extended_capabilities_mask = he_if_types_ext_capa_sta,
                .extended_capabilities_len = sizeof(he_if_types_ext_capa_sta),
+               /* relevant only if EHT is supported */
+               .eml_capabilities = IWL_MVM_EMLSR_CAPA,
        },
        {
                .iftype = NL80211_IFTYPE_STATION,
@@ -258,7 +267,7 @@ static const struct wiphy_iftype_ext_capab add_iftypes_ext_capa[] = {
                .extended_capabilities_mask = tm_if_types_ext_capa_sta,
                .extended_capabilities_len = sizeof(tm_if_types_ext_capa_sta),
                /* relevant only if EHT is supported */
-               .eml_capabilities = IEEE80211_EML_CAP_EMLSR_SUPP,
+               .eml_capabilities = IWL_MVM_EMLSR_CAPA,
        },
 };
 
index 99bf71a2b69056330659729d2cae738b4cb74675..0ff99deb0ae7df5e33b1224a5f37b8bce88fce3b 100644 (file)
@@ -96,6 +96,7 @@ static int iwl_mvm_mld_mac_ctxt_cmd_sta(struct iwl_mvm *mvm,
                                        u32 action, bool force_assoc_off)
 {
        struct iwl_mac_config_cmd cmd = {};
+       u16 esr_transition_timeout;
 
        WARN_ON(vif->type != NL80211_IFTYPE_STATION);
 
@@ -133,6 +134,17 @@ static int iwl_mvm_mld_mac_ctxt_cmd_sta(struct iwl_mvm *mvm,
        }
 
        cmd.client.assoc_id = cpu_to_le16(vif->cfg.aid);
+       if (ieee80211_vif_is_mld(vif)) {
+               esr_transition_timeout =
+                       u16_get_bits(vif->cfg.eml_cap,
+                                    IEEE80211_EML_CAP_TRANSITION_TIMEOUT);
+
+               cmd.client.esr_transition_timeout =
+                       min_t(u16, IEEE80211_EML_CAP_TRANSITION_TIMEOUT_128TU,
+                             esr_transition_timeout);
+               cmd.client.medium_sync_delay =
+                       cpu_to_le16(vif->cfg.eml_med_sync_delay);
+       }
 
        if (vif->probe_req_reg && vif->cfg.assoc && vif->p2p)
                cmd.filter_flags |= cpu_to_le32(MAC_CFG_FILTER_ACCEPT_PROBE_REQ);