summaryrefslogtreecommitdiff
path: root/core/sme/src/csr/csr_api_roam.c
diff options
context:
space:
mode:
authorSrinivas Girigowda <sgirigow@codeaurora.org>2018-02-13 21:41:06 -0800
committerSrinivas Girigowda <sgirigow@codeaurora.org>2018-02-21 11:30:40 -0800
commit498874f66d5b453f1ebd14c81b7a1d6a6ce4fac9 (patch)
tree4da31f8f334cee8623b08b3656cff832fb330078 /core/sme/src/csr/csr_api_roam.c
parent6e0d137b04b01665dc5a27076d62735e9dd938d8 (diff)
downloadqcacld-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.c233
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,