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
This commit is contained in:
Vignesh Viswanathan 2018-07-30 12:57:18 +05:30 • committed by nshrivas
commit f9a704c92a
4 changed files with 114 additions and 6 deletions

View file

@ -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
};

View file

@ -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"
/*
* <ini>
* 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
*
* </ini>
*/
#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 */

View file

@ -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);
}

View file

@ -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,