diff options
author | Srinivas Girigowda <sgirigow@codeaurora.org> | 2018-02-13 21:41:06 -0800 |
---|---|---|
committer | Srinivas Girigowda <sgirigow@codeaurora.org> | 2018-02-21 11:30:40 -0800 |
commit | 498874f66d5b453f1ebd14c81b7a1d6a6ce4fac9 (patch) | |
tree | 4da31f8f334cee8623b08b3656cff832fb330078 /core/sme/src/csr/csr_api_roam.c | |
parent | 6e0d137b04b01665dc5a27076d62735e9dd938d8 (diff) | |
download | qcacld-498874f66d5b453f1ebd14c81b7a1d6a6ce4fac9.tar.gz |
qcacld-3.0: WLAN upgrade to 5.1.1.47F.1
6848dd2 qcacld-3.0: Enhance logging levels for some SAP ACS messages
4eaad9c qcacld-3.0: Do 11ac override only if channel list has 5Ghz channel(s)
636c306 qcacld-3.0: Assign acs_cfg->end_ch before use
3c52a40 qcacld-3.0: Support NDP Confirm with channel info and Schedule Update
072110f qcacld-3.0: Enable channel 12 and 13 in world mode
8ed6af2 qcacld-3.0: Add channels 5735-5835 to the world mode
5d122cf qcacld: Modify defualt world rules
63e10f7 qcacld-3.0: WLAN upgrade to 5.1.1.47F
Bug: 73290698
Change-Id: I0e405a517636b5546eca0faa9fe48cb055bbfc54
Signed-off-by: Srinivas Girigowda <sgirigow@codeaurora.org>
Diffstat (limited to 'core/sme/src/csr/csr_api_roam.c')
-rw-r--r-- | core/sme/src/csr/csr_api_roam.c | 233 |
1 files changed, 227 insertions, 6 deletions
diff --git a/core/sme/src/csr/csr_api_roam.c b/core/sme/src/csr/csr_api_roam.c index 08aeaca46d..d8319cfdf7 100644 --- a/core/sme/src/csr/csr_api_roam.c +++ b/core/sme/src/csr/csr_api_roam.c @@ -109,6 +109,12 @@ #define MAWC_ROAM_RSSI_HIGH_ADJUST_DEFAULT 5 #define MAWC_ROAM_RSSI_LOW_ADJUST_DEFAULT 5 +/* + * Neighbor report offload needs to send 0xFFFFFFFF if a particular + * parameter is disabled from the ini + */ +#define NEIGHBOR_REPORT_PARAM_INVALID (0xFFFFFFFFU) + /* Static Type declarations */ static tCsrRoamSession csr_roam_roam_session[CSR_ROAM_SESSION_MAX]; @@ -2387,6 +2393,40 @@ uint32_t csr_convert_phy_cb_state_to_ini_value(ePhyChanBondState phyCbState) return cbIniValue; } +/** + * csr_set_11k_offload_config_param() - Update 11k neighbor report config + * + * @csr_config: pointer to csr_config in MAC context + * @pParam: pointer to config params from HDD + * + * Return: none + */ +static +void csr_set_11k_offload_config_param(tCsrConfig *csr_config, + tCsrConfigParam *param) +{ + csr_config->offload_11k_enable_bitmask = + param->offload_11k_enable_bitmask; + csr_config->neighbor_report_offload.params_bitmask = + param->neighbor_report_offload.params_bitmask; + csr_config->neighbor_report_offload.time_offset = + param->neighbor_report_offload.time_offset; + csr_config->neighbor_report_offload.low_rssi_offset = + param->neighbor_report_offload.low_rssi_offset; + csr_config->neighbor_report_offload.bmiss_count_trigger = + param->neighbor_report_offload.bmiss_count_trigger; + csr_config->neighbor_report_offload.per_threshold_offset = + param->neighbor_report_offload.per_threshold_offset; + csr_config->neighbor_report_offload. + neighbor_report_cache_timeout = + param->neighbor_report_offload. + neighbor_report_cache_timeout; + csr_config->neighbor_report_offload. + max_neighbor_report_req_cap = + param->neighbor_report_offload. + max_neighbor_report_req_cap; +} + QDF_STATUS csr_change_default_config_param(tpAniSirGlobal pMac, tCsrConfigParam *pParam) { @@ -2708,6 +2748,8 @@ QDF_STATUS csr_change_default_config_param(tpAniSirGlobal pMac, pMac->roam.configParam.nVhtChannelWidth = pParam->nVhtChannelWidth; + pMac->roam.configParam.enable_subfee_vendor_vhtie = + pParam->enable_subfee_vendor_vhtie; pMac->roam.configParam.enable_txbf_sap_mode = pParam->enable_txbf_sap_mode; pMac->roam.configParam.enable2x2 = pParam->enable2x2; @@ -2911,10 +2953,44 @@ QDF_STATUS csr_change_default_config_param(tpAniSirGlobal pMac, &pParam->bss_score_params, sizeof(struct sir_score_config)); + csr_set_11k_offload_config_param(&pMac->roam.configParam, + pParam); } return status; } +/** + * csr_get_11k_offload_config_param() - Get 11k neighbor report config + * + * @csr_config: pointer to csr_config in MAC context + * @pParam: pointer to config params from HDD + * + * Return: none + */ +static +void csr_get_11k_offload_config_param(tCsrConfig *csr_config, + tCsrConfigParam *param) +{ + param->offload_11k_enable_bitmask = + csr_config->offload_11k_enable_bitmask; + param->neighbor_report_offload.params_bitmask = + csr_config->neighbor_report_offload.params_bitmask; + param->neighbor_report_offload.time_offset = + csr_config->neighbor_report_offload.time_offset; + param->neighbor_report_offload.low_rssi_offset = + csr_config->neighbor_report_offload.low_rssi_offset; + param->neighbor_report_offload.bmiss_count_trigger = + csr_config->neighbor_report_offload.bmiss_count_trigger; + param->neighbor_report_offload.per_threshold_offset = + csr_config->neighbor_report_offload.per_threshold_offset; + param->neighbor_report_offload.neighbor_report_cache_timeout = + csr_config->neighbor_report_offload. + neighbor_report_cache_timeout; + param->neighbor_report_offload.max_neighbor_report_req_cap = + csr_config->neighbor_report_offload. + max_neighbor_report_req_cap; +} + QDF_STATUS csr_get_config_param(tpAniSirGlobal pMac, tCsrConfigParam *pParam) { int i; @@ -2986,6 +3062,8 @@ QDF_STATUS csr_get_config_param(tpAniSirGlobal pMac, tCsrConfigParam *pParam) &cfg_params->neighborRoamConfig, sizeof(tCsrNeighborRoamConfigParams)); pParam->nVhtChannelWidth = cfg_params->nVhtChannelWidth; + pParam->enable_subfee_vendor_vhtie = + cfg_params->enable_subfee_vendor_vhtie; pParam->enable_txbf_sap_mode = cfg_params->enable_txbf_sap_mode; pParam->enableVhtFor24GHz = cfg_params->enableVhtFor24GHz; @@ -3188,6 +3266,8 @@ QDF_STATUS csr_get_config_param(tpAniSirGlobal pMac, tCsrConfigParam *pParam) &pMac->roam.configParam.bss_score_params, sizeof(struct sir_score_config)); + csr_get_11k_offload_config_param(&pMac->roam.configParam, pParam); + return QDF_STATUS_SUCCESS; } @@ -3757,8 +3837,6 @@ QDF_STATUS csr_roam_call_callback(tpAniSirGlobal pMac, uint32_t sessionId, return QDF_STATUS_E_FAILURE; } - sme_debug("Received RoamCmdStatus %d with Roam Result %d", u1, u2); - if (eCSR_ROAM_ASSOCIATION_COMPLETION == u1 && eCSR_ROAM_RESULT_ASSOCIATED == u2 && pRoamInfo) { sme_debug("Assoc complete result: %d status: %d reason: %d", @@ -18668,6 +18746,143 @@ csr_create_roam_scan_offload_request(tpAniSirGlobal mac_ctx, #endif return req_buf; } + +/** + * csr_update_11k_offload_params - Update 11K offload params + * @mac_ctx: MAC context + * @session: Pointer to the CSR Roam Session + * @req_buffer: Pointer to the RSO Request buffer + * + * API to update 11k offload params to Roam Scan Offload request buffer + * + * Return: none + */ +static void csr_update_11k_offload_params(tpAniSirGlobal mac_ctx, + tCsrRoamSession *session, + tSirRoamOffloadScanReq *req_buffer) +{ + struct wmi_11k_offload_params *params = &req_buffer->offload_11k_params; + tCsrConfig *csr_config = &mac_ctx->roam.configParam; + struct csr_neighbor_report_offload_params *neighbor_report_offload = + &csr_config->neighbor_report_offload; + + params->vdev_id = session->sessionId; + params->offload_11k_bitmask = csr_config->offload_11k_enable_bitmask; + + /* + * If none of the parameters are enabled, then set the + * offload_11k_bitmask to 0, so that we don't send the command + * to the FW and drop it in WMA + */ + if ((neighbor_report_offload->params_bitmask & + NEIGHBOR_REPORT_PARAMS_ALL) == 0) { + sme_err("No valid neighbor report offload params %x", + neighbor_report_offload->params_bitmask); + params->offload_11k_bitmask = 0; + } + + /* + * First initialize all params to NEIGHBOR_REPORT_PARAM_INVALID + * Then set the values that are enabled + */ + params->neighbor_report_params.time_offset = + NEIGHBOR_REPORT_PARAM_INVALID; + params->neighbor_report_params.low_rssi_offset = + NEIGHBOR_REPORT_PARAM_INVALID; + params->neighbor_report_params.bmiss_count_trigger = + NEIGHBOR_REPORT_PARAM_INVALID; + params->neighbor_report_params.per_threshold_offset = + NEIGHBOR_REPORT_PARAM_INVALID; + params->neighbor_report_params.neighbor_report_cache_timeout = + NEIGHBOR_REPORT_PARAM_INVALID; + params->neighbor_report_params.max_neighbor_report_req_cap = + NEIGHBOR_REPORT_PARAM_INVALID; + + if (neighbor_report_offload->params_bitmask & + NEIGHBOR_REPORT_PARAMS_TIME_OFFSET) + params->neighbor_report_params.time_offset = + neighbor_report_offload->time_offset; + + if (neighbor_report_offload->params_bitmask & + NEIGHBOR_REPORT_PARAMS_LOW_RSSI_OFFSET) + params->neighbor_report_params.low_rssi_offset = + neighbor_report_offload->low_rssi_offset; + + if (neighbor_report_offload->params_bitmask & + NEIGHBOR_REPORT_PARAMS_BMISS_COUNT_TRIGGER) + params->neighbor_report_params.bmiss_count_trigger = + neighbor_report_offload->bmiss_count_trigger; + + if (neighbor_report_offload->params_bitmask & + NEIGHBOR_REPORT_PARAMS_PER_THRESHOLD_OFFSET) + params->neighbor_report_params.per_threshold_offset = + neighbor_report_offload->per_threshold_offset; + + if (neighbor_report_offload->params_bitmask & + NEIGHBOR_REPORT_PARAMS_CACHE_TIMEOUT) + params->neighbor_report_params.neighbor_report_cache_timeout = + neighbor_report_offload->neighbor_report_cache_timeout; + + if (neighbor_report_offload->params_bitmask & + NEIGHBOR_REPORT_PARAMS_MAX_REQ_CAP) + params->neighbor_report_params.max_neighbor_report_req_cap = + neighbor_report_offload->max_neighbor_report_req_cap; + + params->neighbor_report_params.ssid.length = + session->connectedProfile.SSID.length; + qdf_mem_copy(params->neighbor_report_params.ssid.mac_ssid, + session->connectedProfile.SSID.ssId, + session->connectedProfile.SSID.length); + + sme_debug("Updated 11k offload params to RSO"); +} + +QDF_STATUS csr_invoke_neighbor_report_request(uint8_t session_id, + struct sRrmNeighborReq *neighbor_report_req, + bool send_resp_to_host) +{ + struct wmi_invoke_neighbor_report_params *invoke_params; + cds_msg_t msg = {0}; + + if (!neighbor_report_req) { + sme_err("Invalid params"); + return QDF_STATUS_E_INVAL; + } + + invoke_params = qdf_mem_malloc(sizeof(*invoke_params)); + if (!invoke_params) { + sme_err("Memory allocation failure"); + return QDF_STATUS_E_NOMEM; + } + + invoke_params->vdev_id = session_id; + invoke_params->send_resp_to_host = send_resp_to_host; + + if (!neighbor_report_req->no_ssid) { + invoke_params->ssid.length = neighbor_report_req->ssid.length; + qdf_mem_copy(invoke_params->ssid.mac_ssid, + neighbor_report_req->ssid.ssId, + neighbor_report_req->ssid.length); + } else { + invoke_params->ssid.length = 0; + } + + sme_debug("Sending SIR_HAL_INVOKE_NEIGHBOR_REPORT"); + + msg.type = SIR_HAL_INVOKE_NEIGHBOR_REPORT; + msg.reserved = 0; + msg.bodyptr = invoke_params; + + if (QDF_STATUS_SUCCESS != + cds_mq_post_message(QDF_MODULE_ID_WMA, &msg)) { + sme_err("Not able to post message to WMA"); + qdf_mem_free(invoke_params); + return QDF_STATUS_E_FAILURE; + } + + return QDF_STATUS_SUCCESS; +} + /** * check_allowed_ssid_list() - Check the WhiteList * @req_buffer: Buffer which contains the connected profile SSID. @@ -19580,6 +19795,9 @@ csr_roam_offload_scan(tpAniSirGlobal mac_ctx, uint8_t session_id, csr_update_driver_assoc_ies(mac_ctx, session, req_buf); csr_update_fils_params_rso(mac_ctx, session, req_buf); csr_update_score_params(mac_ctx, req_buf); + if (reason == REASON_CTX_INIT) + csr_update_11k_offload_params(mac_ctx, session, + req_buf); } QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG, @@ -21372,6 +21590,13 @@ static QDF_STATUS csr_process_roam_sync_callback(tpAniSirGlobal mac_ctx, ROAMING_OFFLOAD_TIMER_START); csr_roam_call_callback(mac_ctx, session_id, NULL, 0, eCSR_ROAM_START, eCSR_ROAM_RESULT_SUCCESS); + /* + * Inform HDD about roam start using above callback + * which will take care of blocking incoming scan + * requests during roaming and then call the below + * API to cancel all the active scans. + */ + csr_scan_abort_mac_scan_not_for_connect(mac_ctx, session_id); return status; case SIR_ROAMING_ABORT: csr_roam_roaming_offload_timer_action(mac_ctx, @@ -21384,10 +21609,6 @@ static QDF_STATUS csr_process_roam_sync_callback(tpAniSirGlobal mac_ctx, eCSR_ROAM_NAPI_OFF, eCSR_ROAM_RESULT_SUCCESS); return status; case SIR_ROAMING_INVOKE_FAIL: - csr_roam_call_callback(mac_ctx, session_id, NULL, 0, - eCSR_ROAM_ASSOCIATION_FAILURE, - eCSR_ROAM_RESULT_INVOKE_FAILED); - /* Userspace roam request failed, disconnect with current AP */ sme_debug("LFR3: roam invoke from user-space fail, dis cur AP"); csr_roam_disconnect(mac_ctx, session_id, |