wifi: iwlwifi: Add a new version for sta config command
authorYedidya Benshimol <yedidya.ben.shimol@intel.com>
Tue, 6 May 2025 19:40:50 +0000 (22:40 +0300)
committerMiri Korenblit <miriam.rachel.korenblit@intel.com>
Fri, 9 May 2025 12:36:06 +0000 (15:36 +0300)
Add a new version of sta configuration command
which includes these wifi8 features:

1. LDPC X2 CW size support indication
2. Indication if ICF frame is needed instead of RTS
3. support for MIC padding delays for protected control frames

Signed-off-by: Yedidya Benshimol <yedidya.ben.shimol@intel.com>
Link: https://patch.msgid.link/20250506194102.3407967-4-miriam.rachel.korenblit@intel.com
Signed-off-by: Miri Korenblit <miriam.rachel.korenblit@intel.com>
drivers/net/wireless/intel/iwlwifi/fw/api/mac-cfg.h
drivers/net/wireless/intel/iwlwifi/mld/sta.c
drivers/net/wireless/intel/iwlwifi/mvm/mld-sta.c

index 35a370918251639f67274b3e1cb4ba6ea8b5ff91..58690bb6577d56c163e166d34a8c2de79d3703bb 100644 (file)
@@ -588,6 +588,62 @@ enum iwl_fw_sta_type {
        STATION_TYPE_AUX,
 }; /* STATION_TYPE_E_VER_1 */
 
+/**
+ * struct iwl_sta_cfg_cmd_v1 - cmd structure to add a peer sta to the uCode's
+ *     station table
+ * ( STA_CONFIG_CMD = 0xA )
+ *
+ * @sta_id: index of station in uCode's station table
+ * @link_id: the id of the link that is used to communicate with this sta
+ * @peer_mld_address: the peers mld address
+ * @reserved_for_peer_mld_address: reserved
+ * @peer_link_address: the address of the link that is used to communicate
+ *     with this sta
+ * @reserved_for_peer_link_address: reserved
+ * @station_type: type of this station. See &enum iwl_fw_sta_type
+ * @assoc_id: for GO only
+ * @beamform_flags: beam forming controls
+ * @mfp: indicates whether the STA uses management frame protection or not.
+ * @mimo: indicates whether the sta uses mimo or not
+ * @mimo_protection: indicates whether the sta uses mimo protection or not
+ * @ack_enabled: indicates that the AP supports receiving ACK-
+ *     enabled AGG, i.e. both BACK and non-BACK frames in a single AGG
+ * @trig_rnd_alloc: indicates that trigger based random allocation
+ *     is enabled according to UORA element existence
+ * @tx_ampdu_spacing: minimum A-MPDU spacing:
+ *     4 - 2us density, 5 - 4us density, 6 - 8us density, 7 - 16us density
+ * @tx_ampdu_max_size: maximum A-MPDU length: 0 - 8K, 1 - 16K, 2 - 32K,
+ *     3 - 64K, 4 - 128K, 5 - 256K, 6 - 512K, 7 - 1024K.
+ * @sp_length: the size of the SP in actual number of frames
+ * @uapsd_acs:  4 LS bits are trigger enabled ACs, 4 MS bits are the deliver
+ *     enabled ACs.
+ * @pkt_ext: optional, exists according to PPE-present bit in the HE/EHT-PHY
+ *     capa
+ * @htc_flags: which features are supported in HTC
+ */
+struct iwl_sta_cfg_cmd_v1 {
+       __le32 sta_id;
+       __le32 link_id;
+       u8 peer_mld_address[ETH_ALEN];
+       __le16 reserved_for_peer_mld_address;
+       u8 peer_link_address[ETH_ALEN];
+       __le16 reserved_for_peer_link_address;
+       __le32 station_type;
+       __le32 assoc_id;
+       __le32 beamform_flags;
+       __le32 mfp;
+       __le32 mimo;
+       __le32 mimo_protection;
+       __le32 ack_enabled;
+       __le32 trig_rnd_alloc;
+       __le32 tx_ampdu_spacing;
+       __le32 tx_ampdu_max_size;
+       __le32 sp_length;
+       __le32 uapsd_acs;
+       struct iwl_he_pkt_ext_v2 pkt_ext;
+       __le32 htc_flags;
+} __packed; /* STA_CMD_API_S_VER_1 */
+
 /**
  * struct iwl_sta_cfg_cmd - cmd structure to add a peer sta to the uCode's
  *     station table
@@ -620,6 +676,14 @@ enum iwl_fw_sta_type {
  * @pkt_ext: optional, exists according to PPE-present bit in the HE/EHT-PHY
  *     capa
  * @htc_flags: which features are supported in HTC
+ * @use_ldpc_x2_cw: Indicates whether to use LDPC with double CW
+ * @use_icf: Indicates whether to use ICF instead of RTS
+ * @dps_pad_time: DPS (Dynamic Power Save) padding delay resolution to ensure
+ *     proper timing alignment
+ * @dps_trans_delay: DPS minimal time that takes the peer to return to low power
+ * @mic_prep_pad_delay: MIC prep time padding
+ * @mic_compute_pad_delay: MIC compute time padding
+ * @reserved: Reserved for alignment
  */
 struct iwl_sta_cfg_cmd {
        __le32 sta_id;
@@ -642,7 +706,14 @@ struct iwl_sta_cfg_cmd {
        __le32 uapsd_acs;
        struct iwl_he_pkt_ext_v2 pkt_ext;
        __le32 htc_flags;
-} __packed; /* STA_CMD_API_S_VER_1 */
+       u8 use_ldpc_x2_cw;
+       u8 use_icf;
+       u8 dps_pad_time;
+       u8 dps_trans_delay;
+       u8 mic_prep_pad_delay;
+       u8 mic_compute_pad_delay;
+       u8 reserved[2];
+} __packed; /* STA_CMD_API_S_VER_2 */
 
 /**
  * struct iwl_aux_sta_cmd - command for AUX STA configuration
index b91f53341cdf9eded022e9aca65e9042d762be79..bddeb557fd5bf4acb054e2409f4bd6f50ab5fe88 100644 (file)
@@ -401,9 +401,11 @@ static u32 iwl_mld_get_htc_flags(struct ieee80211_link_sta *link_sta)
 static int iwl_mld_send_sta_cmd(struct iwl_mld *mld,
                                const struct iwl_sta_cfg_cmd *cmd)
 {
-       int ret = iwl_mld_send_cmd_pdu(mld,
-                                      WIDE_ID(MAC_CONF_GROUP, STA_CONFIG_CMD),
-                                      cmd);
+       u32 cmd_id = WIDE_ID(MAC_CONF_GROUP, STA_CONFIG_CMD);
+       int cmd_len = iwl_fw_lookup_cmd_ver(mld->fw, cmd_id, 0) > 1 ?
+                     sizeof(*cmd) :
+                     sizeof(struct iwl_sta_cfg_cmd_v1);
+       int ret = iwl_mld_send_cmd_pdu(mld, cmd_id, cmd, cmd_len);
        if (ret)
                IWL_ERR(mld, "STA_CONFIG_CMD send failed, ret=0x%x\n", ret);
        return ret;
index 9dd6700411370fda04b15c3cb28435d6f40136b8..8f275397fddf0ab4a19b78bec0527e7a4b729a22 100644 (file)
@@ -1,6 +1,6 @@
 // SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
 /*
- * Copyright (C) 2022-2024 Intel Corporation
+ * Copyright (C) 2022-2025 Intel Corporation
  */
 #include "mvm.h"
 #include "time-sync.h"
@@ -48,9 +48,13 @@ u32 iwl_mvm_sta_fw_id_mask(struct iwl_mvm *mvm, struct ieee80211_sta *sta,
 static int iwl_mvm_mld_send_sta_cmd(struct iwl_mvm *mvm,
                                    struct iwl_sta_cfg_cmd *cmd)
 {
+       u32 cmd_id = WIDE_ID(MAC_CONF_GROUP, STA_CONFIG_CMD);
+       int cmd_len = iwl_fw_lookup_cmd_ver(mvm->fw, cmd_id, 0) > 1 ?
+                     sizeof(*cmd) :
+                     sizeof(struct iwl_sta_cfg_cmd_v1);
        int ret = iwl_mvm_send_cmd_pdu(mvm,
                                       WIDE_ID(MAC_CONF_GROUP, STA_CONFIG_CMD),
-                                      0, sizeof(*cmd), cmd);
+                                      0, cmd_len, cmd);
        if (ret)
                IWL_ERR(mvm, "STA_CONFIG_CMD send failed, ret=0x%x\n", ret);
        return ret;