diff --git a/core/hdd/inc/wlan_hdd_cfg.h b/core/hdd/inc/wlan_hdd_cfg.h
index dbafb3f40096..98747977b359 100644
--- a/core/hdd/inc/wlan_hdd_cfg.h
+++ b/core/hdd/inc/wlan_hdd_cfg.h
@@ -5089,6 +5089,27 @@ enum hdd_link_speed_rpt_type {
#define CFG_VHT_ENABLE_TX_MCS2x2_8_9_MAX (2)
#define CFG_VHT_ENABLE_TX_MCS2x2_8_9_DEFAULT (0)
+/*
+ *
+ * enable_vht20_mcs9 - Enables VHT MCS9 in 20M BW operation
+ * @Min: 0
+ * @Max: 1
+ * @Default: 1
+ *
+ * Related: NA
+ *
+ * Supported Feature: 11AC
+ *
+ * Usage: External
+ *
+ *
+ */
+
+#define CFG_ENABLE_VHT20_MCS9 "enable_vht20_mcs9"
+#define CFG_ENABLE_VHT20_MCS9_MIN (0)
+#define CFG_ENABLE_VHT20_MCS9_MAX (1)
+#define CFG_ENABLE_VHT20_MCS9_DEFAULT (1)
+
/*
*
* gEnable2x2 - Enables/disables VHT Tx/Rx MCS values for 2x2
@@ -14678,6 +14699,7 @@ struct hdd_config {
bool enableTxBF;
bool enable_subfee_vendor_vhtie;
bool enable_txbf_sap_mode;
+ bool enable_vht20_mcs9;
uint8_t txBFCsnValue;
bool enable_su_tx_bformer;
uint8_t vhtRxMCS2x2;
diff --git a/core/hdd/src/wlan_hdd_cfg.c b/core/hdd/src/wlan_hdd_cfg.c
index cccfaf333475..d55e9dd85b4d 100644
--- a/core/hdd/src/wlan_hdd_cfg.c
+++ b/core/hdd/src/wlan_hdd_cfg.c
@@ -2128,6 +2128,13 @@ struct reg_table_entry g_registry_table[] = {
CFG_VHT_ENABLE_TX_MCS2x2_8_9_MIN,
CFG_VHT_ENABLE_TX_MCS2x2_8_9_MAX),
+ REG_VARIABLE(CFG_ENABLE_VHT20_MCS9, WLAN_PARAM_Integer,
+ struct hdd_config, enable_vht20_mcs9,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK,
+ CFG_ENABLE_VHT20_MCS9_DEFAULT,
+ CFG_ENABLE_VHT20_MCS9_MIN,
+ CFG_ENABLE_VHT20_MCS9_MAX),
+
REG_VARIABLE(CFG_VHT_ENABLE_2x2_CAP_FEATURE, WLAN_PARAM_Integer,
struct hdd_config, enable2x2,
VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
@@ -9067,6 +9074,7 @@ QDF_STATUS hdd_set_sme_config(struct hdd_context *hdd_ctx)
smeConfig->csrConfig.enable_rx_ldpc = pConfig->enable_rx_ldpc;
smeConfig->csrConfig.disable_high_ht_mcs_2x2 =
pConfig->disable_high_ht_mcs_2x2;
+ smeConfig->csrConfig.enable_vht20_mcs9 = pConfig->enable_vht20_mcs9;
#ifdef FEATURE_WLAN_MCC_TO_SCC_SWITCH
smeConfig->csrConfig.cc_switch_mode = pConfig->WlanMccToSccSwitchMode;
#endif
diff --git a/core/mac/src/include/parser_api.h b/core/mac/src/include/parser_api.h
index acd84527b227..3e1d71ba817f 100644
--- a/core/mac/src/include/parser_api.h
+++ b/core/mac/src/include/parser_api.h
@@ -54,6 +54,14 @@
#define IS_5G_CH(__chNum) ((__chNum >= 36) && (__chNum <= 165))
#define IS_2X2_CHAIN(__chain) ((__chain & 0x3) == 0x3)
#define DISABLE_NSS2_MCS 0xC
+#define VHT_1x1_MCS9_MAP 0x2
+#define VHT_2x2_MCS9_MAP 0xA
+#define VHT_1x1_MCS8_VAL 0xFFFD
+#define VHT_2x2_MCS8_VAL 0xFFF5
+#define VHT_1x1_MCS_MASK 0x3
+#define VHT_2x2_MCS_MASK 0xF
+#define DISABLE_VHT_MCS_9(mcs, nss) \
+ (mcs = (nss > 1) ? VHT_2x2_MCS8_VAL : VHT_1x1_MCS8_VAL)
#define NSS_1x1_MODE 1
#define NSS_2x2_MODE 2
diff --git a/core/mac/src/pe/lim/lim_assoc_utils.c b/core/mac/src/pe/lim/lim_assoc_utils.c
index afb22a2cc0b8..4cf31679a8e7 100644
--- a/core/mac/src/pe/lim/lim_assoc_utils.c
+++ b/core/mac/src/pe/lim/lim_assoc_utils.c
@@ -1397,6 +1397,25 @@ tSirRetStatus lim_populate_vht_mcs_set(tpAniSirGlobal mac_ctx,
VHT_TX_HIGHEST_SUPPORTED_DATA_RATE_1_1;
rates->vhtRxHighestDataRate =
VHT_RX_HIGHEST_SUPPORTED_DATA_RATE_1_1;
+ if (!session_entry->ch_width &&
+ !mac_ctx->roam.configParam.enable_vht20_mcs9 &&
+ ((rates->vhtRxMCSMap & VHT_1x1_MCS_MASK) ==
+ VHT_1x1_MCS9_MAP)) {
+ DISABLE_VHT_MCS_9(rates->vhtRxMCSMap,
+ NSS_1x1_MODE);
+ DISABLE_VHT_MCS_9(rates->vhtTxMCSMap,
+ NSS_1x1_MODE);
+ }
+ } else {
+ if (!session_entry->ch_width &&
+ !mac_ctx->roam.configParam.enable_vht20_mcs9 &&
+ ((rates->vhtRxMCSMap & VHT_2x2_MCS_MASK) ==
+ VHT_2x2_MCS9_MAP)) {
+ DISABLE_VHT_MCS_9(rates->vhtRxMCSMap,
+ NSS_2x2_MODE);
+ DISABLE_VHT_MCS_9(rates->vhtTxMCSMap,
+ NSS_2x2_MODE);
+ }
}
if ((peer_vht_caps == NULL) || (!peer_vht_caps->present))
diff --git a/core/mac/src/sys/legacy/src/utils/src/parser_api.c b/core/mac/src/sys/legacy/src/utils/src/parser_api.c
index 12958f2d3583..baa1bd3b854e 100644
--- a/core/mac/src/sys/legacy/src/utils/src/parser_api.c
+++ b/core/mac/src/sys/legacy/src/utils/src/parser_api.c
@@ -1071,6 +1071,25 @@ populate_dot11f_vht_caps(tpAniSirGlobal pMac,
VHT_TX_HIGHEST_SUPPORTED_DATA_RATE_1_1;
pDot11f->rxHighSupDataRate =
VHT_RX_HIGHEST_SUPPORTED_DATA_RATE_1_1;
+ if (!psessionEntry->ch_width &&
+ !pMac->roam.configParam.enable_vht20_mcs9 &&
+ ((pDot11f->txMCSMap & VHT_1x1_MCS_MASK) ==
+ VHT_1x1_MCS9_MAP)) {
+ DISABLE_VHT_MCS_9(pDot11f->txMCSMap,
+ NSS_1x1_MODE);
+ DISABLE_VHT_MCS_9(pDot11f->rxMCSMap,
+ NSS_1x1_MODE);
+ }
+ } else {
+ if (!psessionEntry->ch_width &&
+ !pMac->roam.configParam.enable_vht20_mcs9 &&
+ ((pDot11f->txMCSMap & VHT_2x2_MCS_MASK) ==
+ VHT_2x2_MCS9_MAP)) {
+ DISABLE_VHT_MCS_9(pDot11f->txMCSMap,
+ NSS_2x2_MODE);
+ DISABLE_VHT_MCS_9(pDot11f->rxMCSMap,
+ NSS_2x2_MODE);
+ }
}
}
lim_log_vht_cap(pMac, pDot11f);
diff --git a/core/sme/inc/csr_api.h b/core/sme/inc/csr_api.h
index ffb5bef3bcfb..e09c4c5835be 100644
--- a/core/sme/inc/csr_api.h
+++ b/core/sme/inc/csr_api.h
@@ -1222,6 +1222,7 @@ typedef struct tagCsrConfigParam {
uint8_t enable_tx_ldpc;
uint8_t enable_rx_ldpc;
uint8_t disable_high_ht_mcs_2x2;
+ bool enable_vht20_mcs9;
uint8_t max_amsdu_num;
uint8_t nSelect5GHzMargin;
uint8_t isCoalesingInIBSSAllowed;
diff --git a/core/sme/inc/csr_internal.h b/core/sme/inc/csr_internal.h
index c52f0a312eaa..c0b56d83650f 100644
--- a/core/sme/inc/csr_internal.h
+++ b/core/sme/inc/csr_internal.h
@@ -528,6 +528,7 @@ struct csr_config {
uint32_t nVhtChannelWidth;
bool enable_subfee_vendor_vhtie;
uint8_t enable_txbf_sap_mode;
+ bool enable_vht20_mcs9;
uint8_t enable2x2;
bool enableVhtFor24GHz;
uint8_t enableVhtpAid;
diff --git a/core/sme/src/csr/csr_api_roam.c b/core/sme/src/csr/csr_api_roam.c
index 3fe3061ef3ff..be93718202bd 100644
--- a/core/sme/src/csr/csr_api_roam.c
+++ b/core/sme/src/csr/csr_api_roam.c
@@ -2928,6 +2928,8 @@ QDF_STATUS csr_change_default_config_param(tpAniSirGlobal pMac,
pParam->enable_subfee_vendor_vhtie;
pMac->roam.configParam.enable_txbf_sap_mode =
pParam->enable_txbf_sap_mode;
+ pMac->roam.configParam.enable_vht20_mcs9 =
+ pParam->enable_vht20_mcs9;
pMac->roam.configParam.enable2x2 = pParam->enable2x2;
pMac->roam.configParam.enableVhtFor24GHz =
pParam->enableVhtFor24GHz;
@@ -3250,6 +3252,7 @@ QDF_STATUS csr_get_config_param(tpAniSirGlobal pMac, tCsrConfigParam *pParam)
cfg_params->enable_subfee_vendor_vhtie;
pParam->enable_txbf_sap_mode =
cfg_params->enable_txbf_sap_mode;
+ pParam->enable_vht20_mcs9 = cfg_params->enable_vht20_mcs9;
pParam->enableVhtFor24GHz = cfg_params->enableVhtFor24GHz;
pParam->ignore_peer_erp_info = cfg_params->ignore_peer_erp_info;
pParam->enable2x2 = cfg_params->enable2x2;