From 0e255175b67dd4aa7ba314fef43e77c3646fdddf Mon Sep 17 00:00:00 2001 From: Kiran Kumar Lokere Date: Fri, 30 Mar 2018 18:54:25 -0700 Subject: [PATCH] qcacld-3.0: Add configuration support for VHT20 MCS9 Add user configuration to enable/disable the MCS9 in VHT20 operation. Change-Id: I1bf1156dbeb51a7850ef5a5b66295ecc0d007542 CRs-Fixed: 2217038 --- core/hdd/inc/wlan_hdd_cfg.h | 22 +++++++++++++++++++ core/hdd/src/wlan_hdd_cfg.c | 8 +++++++ core/mac/src/include/parser_api.h | 8 +++++++ core/mac/src/pe/lim/lim_assoc_utils.c | 19 ++++++++++++++++ .../src/sys/legacy/src/utils/src/parser_api.c | 19 ++++++++++++++++ core/sme/inc/csr_api.h | 1 + core/sme/inc/csr_internal.h | 1 + core/sme/src/csr/csr_api_roam.c | 3 +++ 8 files changed, 81 insertions(+) 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;