From f9a704c92ae226b8a7ab769fda7255482c40feae Mon Sep 17 00:00:00 2001 From: Vignesh Viswanathan Date: Mon, 30 Jul 2018 12:57:18 +0530 Subject: [PATCH] qcacld-3.0: Add support for 1x1 connect with 1 Tx/Rx Chain action OUI Add support for new 1x1 connect with 1 Tx/Rx Chain action OUI to be parsed and sent to the FW. From host during connection, the behaviour is same as existing connect 1x1 action OUI where nss is sent to 1 to the FW, but the FW takes the decision to use only one Tx/Rx chain based on the OUIs defined in the new action ID. Change-Id: Ia464209043dc73bcc71577c43b28fbe13e780c23 CRs-Fixed: 2264326 --- .../inc/wlan_action_oui_public_struct.h | 1 + core/hdd/inc/wlan_hdd_cfg.h | 44 +++++++++++++++++ core/hdd/src/wlan_hdd_cfg.c | 48 +++++++++++++++++++ core/sme/src/csr/csr_api_roam.c | 27 ++++++++--- 4 files changed, 114 insertions(+), 6 deletions(-) diff --git a/components/action_oui/dispatcher/inc/wlan_action_oui_public_struct.h b/components/action_oui/dispatcher/inc/wlan_action_oui_public_struct.h index 5d19fefc6667..6056b765c63c 100644 --- a/components/action_oui/dispatcher/inc/wlan_action_oui_public_struct.h +++ b/components/action_oui/dispatcher/inc/wlan_action_oui_public_struct.h @@ -92,6 +92,7 @@ enum action_oui_id { ACTION_OUI_CCKM_1X1 = 2, ACTION_OUI_ITO_ALTERNATE = 3, ACTION_OUI_SWITCH_TO_11N_MODE = 4, + ACTION_OUI_CONNECT_1X1_WITH_1_CHAIN = 5, ACTION_OUI_MAXIMUM_ID }; diff --git a/core/hdd/inc/wlan_hdd_cfg.h b/core/hdd/inc/wlan_hdd_cfg.h index 14b864fe5a18..7ed8fcbc8557 100644 --- a/core/hdd/inc/wlan_hdd_cfg.h +++ b/core/hdd/inc/wlan_hdd_cfg.h @@ -13795,6 +13795,50 @@ enum hdd_external_acs_policy { #define CFG_ACTION_OUI_SWITCH_TO_11N_MODE_NAME "gActionOUISwitchTo11nMode" #define CFG_ACTION_OUI_SWITCH_TO_11N_MODE_DEFAULT "00904C 03 0418BF E0 21 40" +/* + * + * gActionOUIConnect1x1with1TxRxChain - Used to specify action OUIs for + * 1x1 connection with one Tx/Rx Chain + * @Default: + * Note: User should strictly add new action OUIs at the end of this + * default value. + * + * Default OUIs: (All values in Hex) + * OUI 1 : 001018 + * OUI data Len : 06 + * OUI Data : 02FFF0040000 + * OUI data Mask: BC - 10111100 + * Info Mask : 21 - Check for Band + * Capabilities: 40 - Band == 2G + * + * OUI 2 : 001018 + * OUI data Len : 06 + * OUI Data : 02FFF0050000 + * OUI data Mask: BC - 10111100 + * Info Mask : 21 - Check for Band + * Capabilities: 40 - Band == 2G + * + * OUI 3 : 001018 + * OUI data Len : 06 + * OUI Data : 02FFF4050000 + * OUI data Mask: BC - 10111100 + * Info Mask : 21 - Check for Band + * Capabilities: 40 - Band == 2G + * + * This ini is used to specify the AP OUIs with which only 1x1 connection + * with one Tx/Rx Chain is allowed. + * + * Related: gEnableActionOUI + * + * Supported Feature: Action OUIs + * + * Usage: External + * + * + */ +#define CFG_ACTION_OUI_CONNECT_1X1_WITH_1_CHAIN_NAME "gActionOUIConnect1x1with1TxRxChain" +#define CFG_ACTION_OUI_CONNECT_1X1_WITH_1_CHAIN_DEFAULT "001018 06 02FFF0040000 BC 21 40 001018 06 02FFF0050000 BC 21 40 001018 06 02FFF4050000 BC 21 40" + /* End of action oui inis */ diff --git a/core/hdd/src/wlan_hdd_cfg.c b/core/hdd/src/wlan_hdd_cfg.c index d7c566142515..1f202b46709f 100644 --- a/core/hdd/src/wlan_hdd_cfg.c +++ b/core/hdd/src/wlan_hdd_cfg.c @@ -4632,6 +4632,13 @@ struct reg_table_entry g_registry_table[] = { VAR_FLAGS_OPTIONAL, (void *)CFG_ACTION_OUI_SWITCH_TO_11N_MODE_DEFAULT), + REG_VARIABLE_STRING(CFG_ACTION_OUI_CONNECT_1X1_WITH_1_CHAIN_NAME, + WLAN_PARAM_String, + struct hdd_config, action_oui_str[5], + VAR_FLAGS_OPTIONAL, + (void *) + CFG_ACTION_OUI_CONNECT_1X1_WITH_1_CHAIN_DEFAULT), + REG_VARIABLE(CFG_DTIM_1CHRX_ENABLE_NAME, WLAN_PARAM_Integer, struct hdd_config, enable_dtim_1chrx, VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT, @@ -6258,6 +6265,45 @@ void hdd_cfg_print_11k_offload_params(struct hdd_context *hdd_ctx) hdd_ctx->config->neighbor_report_offload_max_req_cap); } +/** + * hdd_cfg_print_action_oui() - print the action OUI configurations + * @hdd_ctx: pointer to the HDD context + * + * Return: None + */ +static void hdd_cfg_print_action_oui(struct hdd_context *hdd_ctx) +{ + struct hdd_config *config = hdd_ctx->config; + + hdd_debug("Name = [%s] value = [%u]", + CFG_ENABLE_ACTION_OUI, + config->action_oui_enable); + + hdd_debug("Name = [%s] value = [%s]", + CFG_ACTION_OUI_CONNECT_1X1_NAME, + config->action_oui_str[ACTION_OUI_CONNECT_1X1]); + + hdd_debug("Name = [%s] value = [%s]", + CFG_ACTION_OUI_ITO_EXTENSION_NAME, + config->action_oui_str[ACTION_OUI_ITO_EXTENSION]); + + hdd_debug("Name = [%s] value = [%s]", + CFG_ACTION_OUI_CCKM_1X1_NAME, + config->action_oui_str[ACTION_OUI_CCKM_1X1]); + + hdd_debug("Name = [%s] value = [%s]", + CFG_ACTION_OUI_ITO_ALTERNATE_NAME, + config->action_oui_str[ACTION_OUI_ITO_ALTERNATE]); + + hdd_debug("Name = [%s] value = [%s]", + CFG_ACTION_OUI_SWITCH_TO_11N_MODE_NAME, + config->action_oui_str[ACTION_OUI_SWITCH_TO_11N_MODE]); + + hdd_debug("Name = [%s] value = [%s]", + CFG_ACTION_OUI_CONNECT_1X1_WITH_1_CHAIN_NAME, + config->action_oui_str[ACTION_OUI_CONNECT_1X1_WITH_1_CHAIN]); +} + /** * hdd_cfg_print() - print the hdd configuration * @iniTable: pointer to hdd context @@ -7181,6 +7227,8 @@ void hdd_cfg_print(struct hdd_context *hdd_ctx) CFG_ROAM_FORCE_RSSI_TRIGGER_NAME, hdd_ctx->config->roam_force_rssi_trigger); + hdd_cfg_print_action_oui(hdd_ctx); + } diff --git a/core/sme/src/csr/csr_api_roam.c b/core/sme/src/csr/csr_api_roam.c index 5415d86571b2..4ceda0064f57 100644 --- a/core/sme/src/csr/csr_api_roam.c +++ b/core/sme/src/csr/csr_api_roam.c @@ -15442,17 +15442,16 @@ void csr_dump_vendor_ies(uint8_t *ie, uint16_t ie_len) elem_len = ptr[1]; left -= 2; if (elem_len > left) { - pe_err("Invalid IEs eid: %d elem_len: %d left: %d", - elem_id, elem_len, left); + sme_err("Invalid IEs eid: %d elem_len: %d left: %d", + elem_id, elem_len, left); return; } if (elem_id == SIR_MAC_EID_VENDOR) { - pe_debug("Dumping Vendor IE of len %d", elem_len); + sme_debug("Dumping Vendor IE of len %d", elem_len); QDF_TRACE_HEX_DUMP(QDF_MODULE_ID_PE, QDF_TRACE_LEVEL_DEBUG, &ptr[2], elem_len); } - left -= elem_len; ptr += (elem_len + 2); } @@ -15481,7 +15480,7 @@ csr_check_vendor_ap_3_present(tpAniSirGlobal mac_ctx, uint8_t *ie, SIR_MAC_VENDOR_AP_3_OUI_LEN, ie, ie_len)) && (wlan_get_vendor_ie_ptr_from_oui(SIR_MAC_VENDOR_AP_4_OUI, SIR_MAC_VENDOR_AP_4_OUI_LEN, ie, ie_len))) { - pe_debug("Vendor OUI 3 and Vendor OUI 4 found"); + sme_debug("Vendor OUI 3 and Vendor OUI 4 found"); ret = false; } @@ -15700,6 +15699,22 @@ QDF_STATUS csr_send_join_req_msg(tpAniSirGlobal pMac, uint32_t sessionId, pMac, (uint8_t *)pIes, ieLen); } + /* + * For WMI_ACTION_OUI_CONNECT_1x1_WITH_1_CHAIN, the host + * sends the NSS as 1 to the FW and the FW then decides + * after receiving the first beacon after connection to + * switch to 1 Tx/Rx Chain. + */ + + if (!is_vendor_ap_present) { + is_vendor_ap_present = + ucfg_action_oui_search(pMac->psoc, + &vendor_ap_search_attr, + ACTION_OUI_CONNECT_1X1_WITH_1_CHAIN); + if (is_vendor_ap_present) + sme_debug("1x1 with 1 Chain AP"); + } + if (pMac->roam.configParam.is_force_1x1 && pMac->lteCoexAntShare && is_vendor_ap_present) { @@ -15719,7 +15734,7 @@ QDF_STATUS csr_send_join_req_msg(tpAniSirGlobal pMac, uint32_t sessionId, &vendor_ap_search_attr, ACTION_OUI_CCKM_1X1); if (is_vendor_ap_present) { - pe_debug("vdev: %d WMI_VDEV_PARAM_ABG_MODE_TX_CHAIN_NUM 1", + sme_debug("vdev: %d WMI_VDEV_PARAM_ABG_MODE_TX_CHAIN_NUM 1", pSession->sessionId); wma_cli_set_command( pSession->sessionId,