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
此提交包含在:
Vignesh Viswanathan
2018-07-30 12:57:18 +05:30
提交者 nshrivas
父節點 1e0e6db964
當前提交 f9a704c92a
共有 4 個檔案被更改,包括 114 行新增6 行删除

查看文件

@@ -92,6 +92,7 @@ enum action_oui_id {
ACTION_OUI_CCKM_1X1 = 2, ACTION_OUI_CCKM_1X1 = 2,
ACTION_OUI_ITO_ALTERNATE = 3, ACTION_OUI_ITO_ALTERNATE = 3,
ACTION_OUI_SWITCH_TO_11N_MODE = 4, ACTION_OUI_SWITCH_TO_11N_MODE = 4,
ACTION_OUI_CONNECT_1X1_WITH_1_CHAIN = 5,
ACTION_OUI_MAXIMUM_ID ACTION_OUI_MAXIMUM_ID
}; };

查看文件

@@ -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_NAME "gActionOUISwitchTo11nMode"
#define CFG_ACTION_OUI_SWITCH_TO_11N_MODE_DEFAULT "00904C 03 0418BF E0 21 40" #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 */ /* End of action oui inis */

查看文件

@@ -4632,6 +4632,13 @@ struct reg_table_entry g_registry_table[] = {
VAR_FLAGS_OPTIONAL, VAR_FLAGS_OPTIONAL,
(void *)CFG_ACTION_OUI_SWITCH_TO_11N_MODE_DEFAULT), (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, REG_VARIABLE(CFG_DTIM_1CHRX_ENABLE_NAME, WLAN_PARAM_Integer,
struct hdd_config, enable_dtim_1chrx, struct hdd_config, enable_dtim_1chrx,
VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT, 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_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 * hdd_cfg_print() - print the hdd configuration
* @iniTable: pointer to hdd context * @iniTable: pointer to hdd context
@@ -7181,6 +7227,8 @@ void hdd_cfg_print(struct hdd_context *hdd_ctx)
CFG_ROAM_FORCE_RSSI_TRIGGER_NAME, CFG_ROAM_FORCE_RSSI_TRIGGER_NAME,
hdd_ctx->config->roam_force_rssi_trigger); hdd_ctx->config->roam_force_rssi_trigger);
hdd_cfg_print_action_oui(hdd_ctx);
} }

查看文件

@@ -15442,17 +15442,16 @@ void csr_dump_vendor_ies(uint8_t *ie, uint16_t ie_len)
elem_len = ptr[1]; elem_len = ptr[1];
left -= 2; left -= 2;
if (elem_len > left) { if (elem_len > left) {
pe_err("Invalid IEs eid: %d elem_len: %d left: %d", sme_err("Invalid IEs eid: %d elem_len: %d left: %d",
elem_id, elem_len, left); elem_id, elem_len, left);
return; return;
} }
if (elem_id == SIR_MAC_EID_VENDOR) { 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_HEX_DUMP(QDF_MODULE_ID_PE,
QDF_TRACE_LEVEL_DEBUG, QDF_TRACE_LEVEL_DEBUG,
&ptr[2], elem_len); &ptr[2], elem_len);
} }
left -= elem_len; left -= elem_len;
ptr += (elem_len + 2); 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)) && SIR_MAC_VENDOR_AP_3_OUI_LEN, ie, ie_len)) &&
(wlan_get_vendor_ie_ptr_from_oui(SIR_MAC_VENDOR_AP_4_OUI, (wlan_get_vendor_ie_ptr_from_oui(SIR_MAC_VENDOR_AP_4_OUI,
SIR_MAC_VENDOR_AP_4_OUI_LEN, ie, ie_len))) { 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; ret = false;
} }
@@ -15700,6 +15699,22 @@ QDF_STATUS csr_send_join_req_msg(tpAniSirGlobal pMac, uint32_t sessionId,
pMac, (uint8_t *)pIes, ieLen); 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 && if (pMac->roam.configParam.is_force_1x1 &&
pMac->lteCoexAntShare && pMac->lteCoexAntShare &&
is_vendor_ap_present) { is_vendor_ap_present) {
@@ -15719,7 +15734,7 @@ QDF_STATUS csr_send_join_req_msg(tpAniSirGlobal pMac, uint32_t sessionId,
&vendor_ap_search_attr, &vendor_ap_search_attr,
ACTION_OUI_CCKM_1X1); ACTION_OUI_CCKM_1X1);
if (is_vendor_ap_present) { 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); pSession->sessionId);
wma_cli_set_command( wma_cli_set_command(
pSession->sessionId, pSession->sessionId,