Browse Source

qcacld-3.0: Add support to configure HE +HTC support and OMI Tx

Add support to configure HE +HTC support in HE caps and HE OM
control transmission.

Change-Id: Ic3ad5952198472ecda79471a37ff527dfdbcdbf0
CRs-Fixed: 2359376
Kiran Kumar Lokere 6 years ago
parent
commit
acd107d0a6
4 changed files with 276 additions and 101 deletions
  1. 75 11
      core/hdd/src/wlan_hdd_cfg80211.c
  2. 3 0
      core/mac/inc/ani_global.h
  3. 66 16
      core/sme/inc/sme_api.h
  4. 132 74
      core/sme/src/common/sme_api.c

+ 75 - 11
core/hdd/src/wlan_hdd_cfg80211.c

@@ -5297,6 +5297,14 @@ wlan_hdd_wifi_config_policy[QCA_WLAN_VENDOR_ATTR_CONFIG_MAX + 1] = {
 
 };
 
+static const struct nla_policy
+qca_wlan_vendor_attr_he_omi_tx_policy [QCA_WLAN_VENDOR_ATTR_HE_OMI_MAX + 1] = {
+	[QCA_WLAN_VENDOR_ATTR_HE_OMI_RX_NSS] =       {.type = NLA_U8 },
+	[QCA_WLAN_VENDOR_ATTR_HE_OMI_CH_BW] =        {.type = NLA_U8 },
+	[QCA_WLAN_VENDOR_ATTR_HE_OMI_ULMU_DISABLE] = {.type = NLA_U8 },
+	[QCA_WLAN_VENDOR_ATTR_HE_OMI_TX_NSTS] =      {.type = NLA_U8 },
+};
+
 static const struct nla_policy
 wlan_hdd_wifi_test_config_policy[
 	QCA_WLAN_VENDOR_ATTR_WIFI_TEST_CONFIG_MAX + 1] = {
@@ -5344,6 +5352,10 @@ wlan_hdd_wifi_test_config_policy[
 			.type = NLA_FLAG},
 		[QCA_WLAN_VENDOR_ATTR_WIFI_TEST_CONFIG_HE_TX_SUPPDU] = {
 			.type = NLA_U8},
+		[QCA_WLAN_VENDOR_ATTR_WIFI_TEST_CONFIG_HE_HTC_HE_SUPP] = {
+			.type = NLA_U8},
+		[QCA_WLAN_VENDOR_ATTR_WIFI_TEST_CONFIG_HE_OMI_TX] = {
+			.type = NLA_NESTED},
 		[QCA_WLAN_VENDOR_ATTR_WIFI_TEST_CONFIG_HE_ACTION_TX_TB_PPDU] = {
 			.type = NLA_U8},
 };
@@ -7039,19 +7051,62 @@ __wlan_hdd_cfg80211_set_wifi_test_config(struct wiphy *wiphy,
 						     cfg_val);
 	}
 
-	cmd_id = QCA_WLAN_VENDOR_ATTR_WIFI_TEST_CONFIG_HE_OM_CTRL_BW;
+	cmd_id = QCA_WLAN_VENDOR_ATTR_WIFI_TEST_CONFIG_HE_OMI_TX;
 	if (tb[cmd_id]) {
-		cfg_val = nla_get_u8(tb[cmd_id]);
-		ret_val = sme_send_he_om_ctrl_bw_update(hdd_ctx->mac_handle,
+		struct nlattr *tb2[QCA_WLAN_VENDOR_ATTR_HE_OMI_MAX + 1];
+		struct nlattr *curr_attr;
+		int tmp, rc;
+		nla_for_each_nested(curr_attr, tb[cmd_id], tmp) {
+			rc = wlan_cfg80211_nla_parse(
+					tb2, QCA_WLAN_VENDOR_ATTR_HE_OMI_MAX,
+					nla_data(curr_attr),
+					nla_len(curr_attr),
+					qca_wlan_vendor_attr_he_omi_tx_policy);
+			if (rc) {
+				hdd_err("Invalid ATTR");
+				goto send_err;
+			}
+			cmd_id = QCA_WLAN_VENDOR_ATTR_HE_OMI_CH_BW;
+			if (tb2[cmd_id]) {
+				cfg_val = nla_get_u8(tb2[cmd_id]);
+				ret_val = sme_set_he_om_ctrl_param(
+							hdd_ctx->mac_handle,
 							adapter->vdev_id,
-							cfg_val);
-	}
-	cmd_id = QCA_WLAN_VENDOR_ATTR_WIFI_TEST_CONFIG_HE_OM_CTRL_NSS;
-	if (tb[cmd_id]) {
-		cfg_val = nla_get_u8(tb[cmd_id]);
-		ret_val = sme_send_he_om_ctrl_nss_update(hdd_ctx->mac_handle,
-							 adapter->vdev_id,
-							 cfg_val);
+							cmd_id, cfg_val);
+			}
+			cmd_id = QCA_WLAN_VENDOR_ATTR_HE_OMI_RX_NSS;
+			if (tb2[cmd_id]) {
+				cfg_val = nla_get_u8(tb2[cmd_id]);
+				ret_val = sme_set_he_om_ctrl_param(
+							hdd_ctx->mac_handle,
+							adapter->vdev_id,
+							cmd_id, cfg_val);
+			}
+
+			cmd_id = QCA_WLAN_VENDOR_ATTR_HE_OMI_ULMU_DISABLE;
+			if (tb2[cmd_id]) {
+				cfg_val = nla_get_u8(tb2[cmd_id]);
+				ret_val = sme_set_he_om_ctrl_param(
+							hdd_ctx->mac_handle,
+							adapter->vdev_id,
+							cmd_id, cfg_val);
+			}
+
+			cmd_id = QCA_WLAN_VENDOR_ATTR_HE_OMI_TX_NSTS;
+			if (tb2[cmd_id]) {
+				cfg_val = nla_get_u8(tb2[cmd_id]);
+				ret_val = sme_set_he_om_ctrl_param(
+							hdd_ctx->mac_handle,
+							adapter->vdev_id,
+							cmd_id, cfg_val);
+			}
+		}
+		if (ret_val) {
+			sme_reset_he_om_ctrl(hdd_ctx->mac_handle);
+			goto send_err;
+		}
+		ret_val = sme_send_he_om_ctrl_update(hdd_ctx->mac_handle,
+						     adapter->vdev_id);
 	}
 
 	if (tb[QCA_WLAN_VENDOR_ATTR_WIFI_TEST_CONFIG_CLEAR_HE_OM_CTRL_CONFIG])
@@ -7067,6 +7122,15 @@ __wlan_hdd_cfg80211_set_wifi_test_config(struct wiphy *wiphy,
 			sme_config_su_ppdu_queue(adapter->vdev_id, false);
 	}
 
+	cmd_id = QCA_WLAN_VENDOR_ATTR_WIFI_TEST_CONFIG_HE_HTC_HE_SUPP;
+	if (tb[cmd_id]) {
+		cfg_val = nla_get_u8(tb[cmd_id]);
+		hdd_debug("Configure +HTC_HE support %d", cfg_val);
+		sme_update_he_htc_he_supp(hdd_ctx->mac_handle,
+					  adapter->vdev_id,
+					  (cfg_val ? true : false));
+	}
+
 	cmd_id = QCA_WLAN_VENDOR_ATTR_WIFI_TEST_CONFIG_HE_ACTION_TX_TB_PPDU;
 	if (tb[cmd_id]) {
 		cfg_val = nla_get_u8(tb[cmd_id]);

+ 3 - 0
core/mac/inc/ani_global.h

@@ -817,6 +817,9 @@ struct mac_context {
 	uint8_t he_om_ctrl_cfg_bw;
 	bool he_om_ctrl_cfg_nss_set;
 	uint8_t he_om_ctrl_cfg_nss;
+	bool he_om_ctrl_cfg_ul_mu_dis;
+	bool he_om_ctrl_cfg_tx_nsts_set;
+	uint8_t he_om_ctrl_cfg_tx_nsts;
 #ifdef WLAN_FEATURE_11AX
 	tDot11fIEhe_cap he_cap_2g;
 	tDot11fIEhe_cap he_cap_5g;

+ 66 - 16
core/sme/inc/sme_api.h

@@ -42,6 +42,7 @@
 #include "sir_types.h"
 #include "scheduler_api.h"
 #include "wlan_serialization_legacy_api.h"
+#include <qca_vendor.h>
 
 /*--------------------------------------------------------------------------
   Preprocessor definitions and constants
@@ -2691,13 +2692,21 @@ int sme_update_he_trigger_frm_mac_pad(mac_handle_t mac_handle,
 int sme_update_he_om_ctrl_supp(mac_handle_t mac_handle, uint8_t session_id,
 			       uint8_t cfg_val);
 
-#define NUM_OM_CTRL_UPDATE_CFG_PARAMS 7
-#define OM_CTRL_CMD_MAC_BITS31 1
-#define OM_CTRL_CMD_MAC_BITS47 2
-#define OM_CTRL_CMD_RX_NSS 3
-#define OM_CTRL_CMD_BW 4
-#define OM_CTRL_CMD_ULMU 5
-#define OM_CTRL_CMD_TX_NSS 6
+#define A_CTRL_ID_OMI 0x1
+struct omi_ctrl_tx {
+	uint32_t omi_in_vht:1;
+	uint32_t omi_in_he:1;
+	uint32_t a_ctrl_id:4;
+	uint32_t rx_nss:3;
+	uint32_t ch_bw:2;
+	uint32_t ul_mu_dis:1;
+	uint32_t tx_nsts:3;
+	uint32_t er_su_dis:1;
+	uint32_t dl_mu_mimo_resound:1;
+	uint32_t ul_mu_data_dis:1;
+	uint32_t reserved:14;
+};
+
 int sme_send_he_om_ctrl_bw_update(mac_handle_t mac_handle, uint8_t session_id,
 				  uint8_t cfg_val);
 
@@ -2716,6 +2725,29 @@ void sme_reset_he_om_ctrl(mac_handle_t mac_handle);
  */
 int sme_config_action_tx_in_tb_ppdu(mac_handle_t mac_handle, uint8_t session_id,
 				    uint8_t cfg_val);
+
+/**
+ * sme_send_he_om_ctrl_update() - Send HE OM ctrl Tx cmd to FW
+ * @mac_handle: Pointer to mac handle
+ * @session_id: SME session id
+ *
+ * Return: 0 on success else err code
+ */
+int sme_send_he_om_ctrl_update(mac_handle_t mac_handle, uint8_t session_id);
+
+/**
+ * sme_set_he_om_ctrl_param() - Update HE OM control params for OMI Tx
+ * @mac_handle: Pointer to mac handle
+ * @session_id: SME session id
+ * @param: HE om control parameter
+ * @cfg_val: HE OM control parameter config value
+ *
+ * Return: 0 on success else err code
+ */
+int sme_set_he_om_ctrl_param(mac_handle_t mac_handle, uint8_t session_id,
+			     enum qca_wlan_vendor_attr_he_omi_tx param,
+			     uint8_t cfg_val);
+
 /**
  * sme_set_usr_cfg_mu_edca() - sets the user cfg MU EDCA params flag
  * @mac_handle: Opaque handle to the global MAC context
@@ -2733,6 +2765,17 @@ void sme_set_usr_cfg_mu_edca(mac_handle_t mac_handle, bool val);
  */
 void sme_set_he_mu_edca_def_cfg(mac_handle_t mac_handle);
 
+/**
+ * sme_update_he_htc_he_supp() - Update +HTC-HE support in HE capabilities
+ * @mac_handle: Pointer to mac handle
+ * @session_id: SME session id
+ * @cfg_val: config setting
+ *
+ * Return: 0 on success else err code
+ */
+int sme_update_he_htc_he_supp(mac_handle_t mac_handle, uint8_t session_id,
+			      bool cfg_val);
+
 /**
  * sme_update_mu_edca_params() - updates MU EDCA params values
  * @mac_handle: Opaque handle to the global MAC context
@@ -2824,16 +2867,11 @@ static inline int sme_update_he_om_ctrl_supp(mac_handle_t mac_handle,
 	return 0;
 }
 
-static inline int sme_send_he_om_ctrl_bw_update(mac_handle_t mac_handle,
-						uint8_t session_id,
-						uint8_t cfg_val)
-{
-	return 0;
-}
 
-static inline int sme_send_he_om_ctrl_nss_update(mac_handle_t mac_handle,
-						 uint8_t session_id,
-						 uint8_t cfg_val)
+static inline int
+sme_set_he_om_ctrl_param(mac_handle_t mac_handle, uint8_t session_id,
+			 enum qca_wlan_vendor_attr_he_omi_tx param,
+			 uint8_t cfg_val)
 {
 	return 0;
 }
@@ -2849,6 +2887,18 @@ static inline int sme_config_action_tx_in_tb_ppdu(mac_handle_t mac_handle,
 	return 0;
 }
 
+static inline int sme_update_he_htc_he_supp(mac_handle_t mac_handle,
+					    uint8_t session_id,
+					    bool cfg_val)
+{
+	return 0;
+}
+
+static inline int
+sme_send_he_om_ctrl_update(mac_handle_t mac_handle, uint8_t session_id)
+{
+	return 0;
+}
 static inline void sme_set_usr_cfg_mu_edca(mac_handle_t mac_handle, bool val)
 {
 }

+ 132 - 74
core/sme/src/common/sme_api.c

@@ -54,7 +54,6 @@
 #include "ol_txrx.h"
 #include "wifi_pos_api.h"
 #include "net/cfg80211.h"
-#include <qca_vendor.h>
 #include <wlan_spectral_utils_api.h>
 #include "wlan_mlme_public_struct.h"
 #include "wlan_mlme_main.h"
@@ -11387,103 +11386,159 @@ int sme_update_he_om_ctrl_supp(mac_handle_t mac_handle, uint8_t session_id,
 	return 0;
 }
 
-int sme_send_he_om_ctrl_bw_update(mac_handle_t mac_handle, uint8_t session_id,
-				  uint8_t cfg_val)
+int sme_update_he_htc_he_supp(mac_handle_t mac_handle, uint8_t session_id,
+			      bool cfg_val)
 {
-	uint32_t om_ctrl_cmd[NUM_OM_CTRL_UPDATE_CFG_PARAMS] = {0};
-	QDF_STATUS status;
+
 	struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
-	struct csr_roam_session *session = CSR_GET_SESSION(mac_ctx, session_id);
+	struct csr_roam_session *session;
+
+	session = CSR_GET_SESSION(mac_ctx, session_id);
 
 	if (!session) {
-		sme_err("Session does not exist, Session_id: %d", session_id);
+		sme_err("No session for id %d", session_id);
 		return -EINVAL;
 	}
+
+	mac_ctx->mlme_cfg->he_caps.dot11_he_cap.htc_he = cfg_val;
+	csr_update_session_he_cap(mac_ctx, session);
+
+	return 0;
+}
+
+static QDF_STATUS
+sme_validate_session_for_cap_update(struct mac_context *mac_ctx,
+				    uint8_t session_id,
+				    struct csr_roam_session *session)
+{
+	if (!session) {
+		sme_err("Session does not exist, Session_id: %d", session_id);
+		return QDF_STATUS_E_INVAL;
+	}
 	if (!csr_is_conn_state_connected_infra(mac_ctx, session_id)) {
 		sme_info("STA is not connected, Session_id: %d", session_id);
-		return -EINVAL;
-	}
-	if (cfg_val > session->connectedProfile.vht_channel_width) {
-		sme_info("OM ctrl BW %d is greater than connected BW %d",
-			  cfg_val, session->connectedProfile.vht_channel_width);
-		return -EINVAL;
+		return QDF_STATUS_E_INVAL;
 	}
-	mac_ctx->he_om_ctrl_cfg_bw_set = true;
-	mac_ctx->he_om_ctrl_cfg_bw = cfg_val;
-	om_ctrl_cmd[0] = 1;
-	qdf_mem_copy((void *)&om_ctrl_cmd[OM_CTRL_CMD_MAC_BITS31],
-		     (void *)session->connectedProfile.bssid.bytes,
-		     sizeof(uint32_t));
-	qdf_mem_copy((void *)&om_ctrl_cmd[OM_CTRL_CMD_MAC_BITS47],
-		     (void *)&session->connectedProfile.bssid.bytes[4],
-		     sizeof(uint16_t));
-	if (mac_ctx->he_om_ctrl_cfg_nss_set) {
-		om_ctrl_cmd[OM_CTRL_CMD_RX_NSS] =
-			mac_ctx->he_om_ctrl_cfg_nss - 1;
-		om_ctrl_cmd[OM_CTRL_CMD_TX_NSS] =
-			mac_ctx->he_om_ctrl_cfg_nss - 1;
-	} else {
-		om_ctrl_cmd[OM_CTRL_CMD_RX_NSS] = session->nss - 1;
-		om_ctrl_cmd[OM_CTRL_CMD_TX_NSS] = session->nss - 1;
+
+	return QDF_STATUS_SUCCESS;
+}
+
+int sme_send_he_om_ctrl_update(mac_handle_t mac_handle, uint8_t session_id)
+{
+	QDF_STATUS status = QDF_STATUS_SUCCESS;
+	struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
+	struct omi_ctrl_tx omi_data = {0};
+	void *wma_handle;
+	struct csr_roam_session *session = CSR_GET_SESSION(mac_ctx, session_id);
+	uint32_t param_val = 0;
+
+	wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
+	if (!wma_handle) {
+		sme_err("wma handle is NULL");
+		return -EIO;
 	}
-	om_ctrl_cmd[OM_CTRL_CMD_BW] = cfg_val;
-	om_ctrl_cmd[OM_CTRL_CMD_ULMU] = 1;
-	status = wma_form_unit_test_cmd_and_send(session_id, 13, 7,
-						 om_ctrl_cmd);
+
+	status = sme_validate_session_for_cap_update(mac_ctx, session_id,
+						     session);
+	if (QDF_IS_STATUS_ERROR(status))
+		return -EINVAL;
+
+	omi_data.a_ctrl_id = A_CTRL_ID_OMI;
+
+	if (mac_ctx->he_om_ctrl_cfg_nss_set)
+		omi_data.rx_nss = mac_ctx->he_om_ctrl_cfg_nss;
+	else
+		omi_data.rx_nss = session->nss - 1;
+
+	if (mac_ctx->he_om_ctrl_cfg_tx_nsts_set)
+		omi_data.tx_nsts = mac_ctx->he_om_ctrl_cfg_tx_nsts;
+	else
+		omi_data.tx_nsts = session->nss - 1;
+
+	if (mac_ctx->he_om_ctrl_cfg_bw_set)
+		omi_data.ch_bw = mac_ctx->he_om_ctrl_cfg_bw;
+	else
+		omi_data.ch_bw = session->connectedProfile.vht_channel_width;
+
+	omi_data.ul_mu_dis = mac_ctx->he_om_ctrl_cfg_ul_mu_dis;
+	omi_data.omi_in_vht = 0x1;
+	omi_data.omi_in_he = 0x1;
+
+	sme_info("OMI: BW %d TxNSTS %d RxNSS %d ULMU %d, OMI_VHT %d, OMI_HE %d",
+		 omi_data.ch_bw, omi_data.tx_nsts, omi_data.rx_nss,
+		 omi_data.ul_mu_dis, omi_data.omi_in_vht, omi_data.omi_in_he);
+	qdf_mem_copy(&param_val, &omi_data, sizeof(omi_data));
+	sme_debug("param val %08X, bssid:"MAC_ADDRESS_STR, param_val,
+		  MAC_ADDR_ARRAY(session->connectedProfile.bssid.bytes));
+	status = wma_set_peer_param(wma_handle,
+				    session->connectedProfile.bssid.bytes,
+				    WMI_PEER_PARAM_XMIT_OMI,
+				    param_val, session_id);
 	if (QDF_STATUS_SUCCESS != status) {
-		sme_err("send_unit_test_cmd returned %d", status);
+		sme_err("set_peer_param_cmd returned %d", status);
 		return -EIO;
 	}
 
 	return 0;
 }
 
-int sme_send_he_om_ctrl_nss_update(mac_handle_t mac_handle, uint8_t session_id,
-				   uint8_t cfg_val)
+int sme_set_he_om_ctrl_param(mac_handle_t mac_handle, uint8_t session_id,
+			     enum qca_wlan_vendor_attr_he_omi_tx param,
+			     uint8_t cfg_val)
 {
-	uint32_t om_ctrl_cmd[NUM_OM_CTRL_UPDATE_CFG_PARAMS] = {0};
 	QDF_STATUS status;
 	struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
 	struct csr_roam_session *session = CSR_GET_SESSION(mac_ctx, session_id);
 
-	if (!session) {
-		sme_err("Session does not exist, Session_id: %d", session_id);
-		return -EINVAL;
-	}
-	if (!csr_is_conn_state_connected_infra(mac_ctx, session_id)) {
-		sme_info("STA not in connected state Session_id: %d",
-			 session_id);
-		return -EINVAL;
-	}
-	if (cfg_val > session->nss) {
-		sme_info("OM ctrl Nss %d is greater than connected Nss %d",
-			 cfg_val, session->nss);
+	status = sme_validate_session_for_cap_update(mac_ctx, session_id,
+						     session);
+	if (QDF_IS_STATUS_ERROR(status))
 		return -EINVAL;
-	}
-	mac_ctx->he_om_ctrl_cfg_nss_set = true;
-	mac_ctx->he_om_ctrl_cfg_nss = cfg_val;
-	om_ctrl_cmd[0] = 1;
-	qdf_mem_copy((void *)&om_ctrl_cmd[OM_CTRL_CMD_MAC_BITS31],
-		     (void *)session->connectedProfile.bssid.bytes,
-		     sizeof(uint32_t));
-	qdf_mem_copy((void *)&om_ctrl_cmd[OM_CTRL_CMD_MAC_BITS47],
-		     (void *)&session->connectedProfile.bssid.bytes[4],
-		     sizeof(uint16_t));
 
-	if (mac_ctx->he_om_ctrl_cfg_bw_set)
-		om_ctrl_cmd[OM_CTRL_CMD_BW] = mac_ctx->he_om_ctrl_cfg_bw;
-	else
-		om_ctrl_cmd[OM_CTRL_CMD_BW] =
-			session->connectedProfile.vht_channel_width;
-
-	om_ctrl_cmd[OM_CTRL_CMD_RX_NSS] = cfg_val - 1;
-	om_ctrl_cmd[OM_CTRL_CMD_TX_NSS] = cfg_val - 1;
-	om_ctrl_cmd[OM_CTRL_CMD_ULMU] = 1;
-	status = wma_form_unit_test_cmd_and_send(session_id, 13, 7,
-						 om_ctrl_cmd);
-	if (QDF_STATUS_SUCCESS != status) {
-		sme_err("send_unit_test_cmd returned %d", status);
-		return -EIO;
+	switch(param) {
+		case QCA_WLAN_VENDOR_ATTR_HE_OMI_ULMU_DISABLE:
+			sme_debug("Set OM ctrl UL MU dis to %d", cfg_val);
+			mac_ctx->he_om_ctrl_cfg_ul_mu_dis = cfg_val;
+			break;
+		case QCA_WLAN_VENDOR_ATTR_HE_OMI_RX_NSS:
+			if ((cfg_val + 1)  > session->nss) {
+				sme_debug("OMI Nss %d is > connected Nss %d",
+					  cfg_val, session->nss);
+				mac_ctx->he_om_ctrl_cfg_nss_set = false;
+				return 0;
+			}
+			sme_debug("Set OM ctrl Rx Nss cfg to %d", cfg_val);
+			mac_ctx->he_om_ctrl_cfg_nss_set = true;
+			mac_ctx->he_om_ctrl_cfg_nss = cfg_val;
+			break;
+		case QCA_WLAN_VENDOR_ATTR_HE_OMI_CH_BW:
+			if (cfg_val >
+			    session->connectedProfile.vht_channel_width) {
+				sme_info("OMI BW %d is > connected BW %d",
+					 cfg_val,
+					 session->connectedProfile.
+					 vht_channel_width);
+				mac_ctx->he_om_ctrl_cfg_bw_set = false;
+				return 0;
+			}
+			sme_debug("Set OM ctrl BW cfg to %d", cfg_val);
+			mac_ctx->he_om_ctrl_cfg_bw_set = true;
+			mac_ctx->he_om_ctrl_cfg_bw = cfg_val;
+			break;
+		case QCA_WLAN_VENDOR_ATTR_HE_OMI_TX_NSTS:
+			if ((cfg_val + 1) > session->nss) {
+				sme_debug("OMI NSTS %d is > connected Nss %d",
+					  cfg_val, session->nss);
+				mac_ctx->he_om_ctrl_cfg_tx_nsts_set = false;
+				return 0;
+			}
+			sme_debug("Set OM ctrl tx nsts cfg to %d", cfg_val);
+			mac_ctx->he_om_ctrl_cfg_tx_nsts_set = true;
+			mac_ctx->he_om_ctrl_cfg_tx_nsts = cfg_val;
+			break;
+		default:
+			sme_debug("Invalid OMI param %d", param);
+			return -EINVAL;
 	}
 
 	return 0;
@@ -11497,6 +11552,9 @@ void sme_reset_he_om_ctrl(mac_handle_t mac_handle)
 	mac_ctx->he_om_ctrl_cfg_nss_set = false;
 	mac_ctx->he_om_ctrl_cfg_bw = 0;
 	mac_ctx->he_om_ctrl_cfg_nss = 0;
+	mac_ctx->he_om_ctrl_cfg_ul_mu_dis = false;
+	mac_ctx->he_om_ctrl_cfg_tx_nsts_set = false;
+	mac_ctx->he_om_ctrl_cfg_tx_nsts = 0;
 }
 
 int sme_config_action_tx_in_tb_ppdu(mac_handle_t mac_handle, uint8_t session_id,