|
@@ -112,46 +112,45 @@ static void rrm_indicate_neighbor_report_result(struct mac_context *mac,
|
|
|
void *callbackContext;
|
|
|
|
|
|
/* Reset the neighbor response pending status */
|
|
|
- mac->rrm.rrmSmeContext.neighborReqControlInfo.isNeighborRspPending =
|
|
|
- false;
|
|
|
+ mac->rrm.rrmSmeContext[DEFAULT_RRM_IDX].
|
|
|
+ neighborReqControlInfo.isNeighborRspPending = false;
|
|
|
|
|
|
/* Stop the timer if it is already running.
|
|
|
* The timer should be running only in the SUCCESS case.
|
|
|
*/
|
|
|
if (QDF_TIMER_STATE_RUNNING ==
|
|
|
- qdf_mc_timer_get_current_state(&mac->rrm.rrmSmeContext.
|
|
|
+ qdf_mc_timer_get_current_state(&mac->rrm.rrmSmeContext[DEFAULT_RRM_IDX].
|
|
|
neighborReqControlInfo.
|
|
|
neighborRspWaitTimer)) {
|
|
|
sme_debug("No entry in neighbor report cache");
|
|
|
- qdf_mc_timer_stop(&mac->rrm.rrmSmeContext.
|
|
|
+ qdf_mc_timer_stop(&mac->rrm.rrmSmeContext[DEFAULT_RRM_IDX].
|
|
|
neighborReqControlInfo.neighborRspWaitTimer);
|
|
|
}
|
|
|
callback =
|
|
|
- mac->rrm.rrmSmeContext.neighborReqControlInfo.
|
|
|
+ mac->rrm.rrmSmeContext[DEFAULT_RRM_IDX].neighborReqControlInfo.
|
|
|
neighborRspCallbackInfo.neighborRspCallback;
|
|
|
callbackContext =
|
|
|
- mac->rrm.rrmSmeContext.neighborReqControlInfo.
|
|
|
+ mac->rrm.rrmSmeContext[DEFAULT_RRM_IDX].neighborReqControlInfo.
|
|
|
neighborRspCallbackInfo.neighborRspCallbackContext;
|
|
|
|
|
|
/* Reset the callback and the callback context before calling the
|
|
|
* callback. It is very likely that there may be a registration in
|
|
|
* callback itself.
|
|
|
*/
|
|
|
- mac->rrm.rrmSmeContext.neighborReqControlInfo.neighborRspCallbackInfo.
|
|
|
- neighborRspCallback = NULL;
|
|
|
- mac->rrm.rrmSmeContext.neighborReqControlInfo.neighborRspCallbackInfo.
|
|
|
- neighborRspCallbackContext = NULL;
|
|
|
+ mac->rrm.rrmSmeContext[DEFAULT_RRM_IDX].neighborReqControlInfo.
|
|
|
+ neighborRspCallbackInfo.neighborRspCallback = NULL;
|
|
|
+ mac->rrm.rrmSmeContext[DEFAULT_RRM_IDX].neighborReqControlInfo.
|
|
|
+ neighborRspCallbackInfo.neighborRspCallbackContext = NULL;
|
|
|
|
|
|
/* Call the callback with the status received from caller */
|
|
|
if (callback)
|
|
|
callback(callbackContext, qdf_status);
|
|
|
-
|
|
|
-
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* sme_RrmBeaconReportXmitInd () - Send beacon report
|
|
|
* @mac_ctx Pointer to mac context
|
|
|
+ * @measurement_index: Measurement index
|
|
|
* @result_arr scan results
|
|
|
* @msrmnt_status flag to indicate that the measurement is done.
|
|
|
* @bss_count bss count
|
|
@@ -163,8 +162,8 @@ static void rrm_indicate_neighbor_report_result(struct mac_context *mac,
|
|
|
|
|
|
static QDF_STATUS
|
|
|
sme_rrm_send_beacon_report_xmit_ind(struct mac_context *mac_ctx,
|
|
|
- tCsrScanResultInfo **result_arr, uint8_t msrmnt_status,
|
|
|
- uint8_t bss_count)
|
|
|
+ uint8_t measurement_index, tCsrScanResultInfo **result_arr,
|
|
|
+ uint8_t msrmnt_status, uint8_t bss_count)
|
|
|
{
|
|
|
struct bss_description *bss_desc = NULL;
|
|
|
tpSirBeaconReportXmitInd beacon_rep;
|
|
@@ -173,7 +172,8 @@ sme_rrm_send_beacon_report_xmit_ind(struct mac_context *mac_ctx,
|
|
|
uint8_t i = 0, j = 0, counter = 0;
|
|
|
tCsrScanResultInfo *cur_result = NULL;
|
|
|
QDF_STATUS status = QDF_STATUS_E_FAILURE;
|
|
|
- tpRrmSMEContext rrm_ctx = &mac_ctx->rrm.rrmSmeContext;
|
|
|
+ tpRrmSMEContext rrm_ctx =
|
|
|
+ &mac_ctx->rrm.rrmSmeContext[measurement_index];
|
|
|
struct bss_description *tmp_bss_desc[SIR_BCN_REPORT_MAX_BSS_DESC] = {0};
|
|
|
|
|
|
if (!result_arr && !msrmnt_status) {
|
|
@@ -192,6 +192,7 @@ sme_rrm_send_beacon_report_xmit_ind(struct mac_context *mac_ctx,
|
|
|
|
|
|
beacon_rep->messageType = eWNI_SME_BEACON_REPORT_RESP_XMIT_IND;
|
|
|
beacon_rep->length = length;
|
|
|
+ beacon_rep->measurement_idx = measurement_index;
|
|
|
beacon_rep->uDialogToken = rrm_ctx->token;
|
|
|
beacon_rep->duration = rrm_ctx->duration[0];
|
|
|
beacon_rep->regClass = rrm_ctx->regClass;
|
|
@@ -253,6 +254,7 @@ sme_rrm_send_beacon_report_xmit_ind(struct mac_context *mac_ctx,
|
|
|
/**
|
|
|
* sme_ese_send_beacon_req_scan_results () - Send beacon report
|
|
|
* @mac_ctx: Pointer to mac context
|
|
|
+ * @measurement_index: Measurement request index
|
|
|
* @session_id: session id
|
|
|
* @freq: channel frequency
|
|
|
* @result_arr: scan results
|
|
@@ -268,8 +270,9 @@ sme_rrm_send_beacon_report_xmit_ind(struct mac_context *mac_ctx,
|
|
|
* Return: status
|
|
|
*/
|
|
|
static QDF_STATUS sme_ese_send_beacon_req_scan_results(
|
|
|
- struct mac_context *mac_ctx, uint32_t session_id,
|
|
|
- uint32_t freq, tCsrScanResultInfo **result_arr,
|
|
|
+ struct mac_context *mac_ctx, uint8_t measurement_index,
|
|
|
+ uint32_t session_id, uint32_t freq,
|
|
|
+ tCsrScanResultInfo **result_arr,
|
|
|
uint8_t msrmnt_status, uint8_t bss_count)
|
|
|
{
|
|
|
QDF_STATUS status = QDF_STATUS_E_FAILURE;
|
|
@@ -279,7 +282,8 @@ static QDF_STATUS sme_ese_send_beacon_req_scan_results(
|
|
|
uint32_t out_ie_len = 0;
|
|
|
uint8_t bss_counter = 0;
|
|
|
tCsrScanResultInfo *cur_result = NULL;
|
|
|
- tpRrmSMEContext rrm_ctx = &mac_ctx->rrm.rrmSmeContext;
|
|
|
+ tpRrmSMEContext rrm_ctx =
|
|
|
+ &mac_ctx->rrm.rrmSmeContext[measurement_index];
|
|
|
struct csr_roam_info *roam_info;
|
|
|
struct ese_bcn_report_rsp bcn_rpt_rsp;
|
|
|
struct ese_bcn_report_rsp *bcn_report = &bcn_rpt_rsp;
|
|
@@ -419,6 +423,7 @@ void sme_reset_ese_bcn_req_in_progress(tpRrmSMEContext sme_rrm_ctx)
|
|
|
/**
|
|
|
* sme_rrm_send_scan_result() - to get scan result and send the beacon report
|
|
|
* @mac_ctx: pointer to mac context
|
|
|
+ * @measurement_index: Measurement request number
|
|
|
* @num_chan: number of channels
|
|
|
* @freq_list: list of channel frequencies to fetch the result from
|
|
|
* @measurementdone: Flag to indicate measurement done or no
|
|
@@ -429,6 +434,7 @@ void sme_reset_ese_bcn_req_in_progress(tpRrmSMEContext sme_rrm_ctx)
|
|
|
* Return: QDF_STATUS
|
|
|
*/
|
|
|
static QDF_STATUS sme_rrm_send_scan_result(struct mac_context *mac_ctx,
|
|
|
+ uint8_t measurement_index,
|
|
|
uint8_t num_chan,
|
|
|
uint32_t *freq_list,
|
|
|
uint8_t measurementdone)
|
|
@@ -441,7 +447,8 @@ static QDF_STATUS sme_rrm_send_scan_result(struct mac_context *mac_ctx,
|
|
|
struct scan_result_list *result_list;
|
|
|
QDF_STATUS status;
|
|
|
uint8_t num_scan_results, counter = 0;
|
|
|
- tpRrmSMEContext rrm_ctx = &mac_ctx->rrm.rrmSmeContext;
|
|
|
+ tpRrmSMEContext rrm_ctx =
|
|
|
+ &mac_ctx->rrm.rrmSmeContext[measurement_index];
|
|
|
uint32_t session_id;
|
|
|
struct csr_roam_info *roam_info = NULL;
|
|
|
tSirScanType scan_type;
|
|
@@ -511,12 +518,14 @@ static QDF_STATUS sme_rrm_send_scan_result(struct mac_context *mac_ctx,
|
|
|
#ifdef FEATURE_WLAN_ESE
|
|
|
if (eRRM_MSG_SOURCE_ESE_UPLOAD == rrm_ctx->msgSource)
|
|
|
status = sme_ese_send_beacon_req_scan_results(mac_ctx,
|
|
|
- session_id, freq_list[0],
|
|
|
- NULL, measurementdone, 0);
|
|
|
+ measurement_index, session_id,
|
|
|
+ freq_list[0], NULL,
|
|
|
+ measurementdone, 0);
|
|
|
else
|
|
|
#endif /* FEATURE_WLAN_ESE */
|
|
|
status = sme_rrm_send_beacon_report_xmit_ind(mac_ctx,
|
|
|
- NULL, measurementdone, 0);
|
|
|
+ measurement_index, NULL,
|
|
|
+ measurementdone, 0);
|
|
|
return status;
|
|
|
}
|
|
|
scan_results = sme_scan_result_get_first(mac_handle, result_handle);
|
|
@@ -524,14 +533,13 @@ static QDF_STATUS sme_rrm_send_scan_result(struct mac_context *mac_ctx,
|
|
|
#ifdef FEATURE_WLAN_ESE
|
|
|
if (eRRM_MSG_SOURCE_ESE_UPLOAD == rrm_ctx->msgSource) {
|
|
|
status = sme_ese_send_beacon_req_scan_results(mac_ctx,
|
|
|
- session_id,
|
|
|
- freq_list[0],
|
|
|
- NULL,
|
|
|
- measurementdone,
|
|
|
- 0);
|
|
|
+ measurement_index, session_id,
|
|
|
+ freq_list[0], NULL,
|
|
|
+ measurementdone, 0);
|
|
|
} else
|
|
|
#endif /* FEATURE_WLAN_ESE */
|
|
|
status = sme_rrm_send_beacon_report_xmit_ind(mac_ctx,
|
|
|
+ measurement_index,
|
|
|
NULL, measurementdone, 0);
|
|
|
}
|
|
|
|
|
@@ -621,14 +629,14 @@ static QDF_STATUS sme_rrm_send_scan_result(struct mac_context *mac_ctx,
|
|
|
#ifdef FEATURE_WLAN_ESE
|
|
|
if (eRRM_MSG_SOURCE_ESE_UPLOAD == rrm_ctx->msgSource)
|
|
|
status = sme_ese_send_beacon_req_scan_results(mac_ctx,
|
|
|
- session_id, freq_list[0],
|
|
|
- scanresults_arr, measurementdone,
|
|
|
- counter);
|
|
|
+ measurement_index, session_id,
|
|
|
+ freq_list[0], scanresults_arr,
|
|
|
+ measurementdone, counter);
|
|
|
else
|
|
|
#endif /* FEATURE_WLAN_ESE */
|
|
|
status = sme_rrm_send_beacon_report_xmit_ind(mac_ctx,
|
|
|
- scanresults_arr, measurementdone,
|
|
|
- counter);
|
|
|
+ measurement_index, scanresults_arr,
|
|
|
+ measurementdone, counter);
|
|
|
}
|
|
|
|
|
|
rrm_send_scan_results_done:
|
|
@@ -644,6 +652,7 @@ rrm_send_scan_results_done:
|
|
|
/**
|
|
|
* sme_rrm_scan_request_callback() -Sends the beacon report xmit to PE
|
|
|
* @mac_handle: Opaque handle to the MAC context
|
|
|
+ * @pSmeRrmContext: SME rrm context for measurement request
|
|
|
* @sessionId: session id
|
|
|
* @scanId: Scan ID.
|
|
|
* @status: CSR Status.
|
|
@@ -654,14 +663,13 @@ rrm_send_scan_results_done:
|
|
|
*
|
|
|
* Return : 0 for success, non zero for failure
|
|
|
*/
|
|
|
-static QDF_STATUS sme_rrm_scan_request_callback(mac_handle_t mac_handle,
|
|
|
+static QDF_STATUS sme_rrm_scan_request_callback(struct mac_context *mac,
|
|
|
+ tpRrmSMEContext pSmeRrmContext,
|
|
|
uint8_t sessionId,
|
|
|
uint32_t scanId,
|
|
|
eCsrScanStatus status)
|
|
|
{
|
|
|
uint16_t interval;
|
|
|
- struct mac_context *mac = MAC_CONTEXT(mac_handle);
|
|
|
- tpRrmSMEContext pSmeRrmContext = &mac->rrm.rrmSmeContext;
|
|
|
uint32_t time_tick;
|
|
|
QDF_STATUS qdf_status;
|
|
|
uint32_t session_id;
|
|
@@ -685,10 +693,41 @@ static QDF_STATUS sme_rrm_scan_request_callback(mac_handle_t mac_handle,
|
|
|
* within randomization interval.
|
|
|
*/
|
|
|
freq_list = pSmeRrmContext->channelList.freq_list;
|
|
|
+ if (!freq_list) {
|
|
|
+ sme_err("[802.11 RRM]: Global freq list is null");
|
|
|
+ pSmeRrmContext->channelList.numOfChannels = 0;
|
|
|
+ sme_reset_ese_bcn_req_in_progress(pSmeRrmContext);
|
|
|
+ return QDF_STATUS_E_FAILURE;
|
|
|
+ }
|
|
|
+
|
|
|
ch_idx = pSmeRrmContext->currentIndex;
|
|
|
num_chan = pSmeRrmContext->channelList.numOfChannels;
|
|
|
if (((ch_idx + 1) < num_chan) && valid_result) {
|
|
|
- sme_rrm_send_scan_result(mac, 1, &freq_list[ch_idx], false);
|
|
|
+ if (QDF_TIMER_STATE_RUNNING ==
|
|
|
+ qdf_mc_timer_get_current_state(
|
|
|
+ &pSmeRrmContext->IterMeasTimer)) {
|
|
|
+ /*
|
|
|
+ * Measurement random timer is already running, this
|
|
|
+ * should not happen because the driver doesn't support
|
|
|
+ * multiple measurements simultaneously. Also for
|
|
|
+ * multiple measurements on a single report, the
|
|
|
+ * channels in op class should be appended to the global
|
|
|
+ * frequency list
|
|
|
+ */
|
|
|
+ sme_err("[802.11 RRM]: meas timer is already running");
|
|
|
+ sme_rrm_send_scan_result(mac,
|
|
|
+ pSmeRrmContext->measurement_idx,
|
|
|
+ 1, &freq_list[ch_idx], true);
|
|
|
+ qdf_mem_free(pSmeRrmContext->channelList.freq_list);
|
|
|
+ pSmeRrmContext->channelList.freq_list = NULL;
|
|
|
+ pSmeRrmContext->channelList.numOfChannels = 0;
|
|
|
+ sme_reset_ese_bcn_req_in_progress(pSmeRrmContext);
|
|
|
+ return QDF_STATUS_E_FAILURE;
|
|
|
+ }
|
|
|
+
|
|
|
+ sme_rrm_send_scan_result(mac, pSmeRrmContext->measurement_idx,
|
|
|
+ 1, &freq_list[ch_idx], false);
|
|
|
+
|
|
|
/* Advance the current index. */
|
|
|
pSmeRrmContext->currentIndex++;
|
|
|
/* start the timer to issue next request. */
|
|
@@ -705,6 +744,7 @@ static QDF_STATUS sme_rrm_scan_request_callback(mac_handle_t mac_handle,
|
|
|
if (QDF_IS_STATUS_ERROR(qdf_status)) {
|
|
|
qdf_mem_free(pSmeRrmContext->channelList.freq_list);
|
|
|
pSmeRrmContext->channelList.freq_list = NULL;
|
|
|
+ pSmeRrmContext->channelList.numOfChannels = 0;
|
|
|
sme_reset_ese_bcn_req_in_progress(pSmeRrmContext);
|
|
|
}
|
|
|
|
|
@@ -712,9 +752,11 @@ static QDF_STATUS sme_rrm_scan_request_callback(mac_handle_t mac_handle,
|
|
|
/* Done with the measurement. Clean up all context and send a
|
|
|
* message to PE with measurement done flag set.
|
|
|
*/
|
|
|
- sme_rrm_send_scan_result(mac, 1, &freq_list[ch_idx], true);
|
|
|
+ sme_rrm_send_scan_result(mac, pSmeRrmContext->measurement_idx,
|
|
|
+ 1, &freq_list[ch_idx], true);
|
|
|
qdf_mem_free(pSmeRrmContext->channelList.freq_list);
|
|
|
pSmeRrmContext->channelList.freq_list = NULL;
|
|
|
+ pSmeRrmContext->channelList.numOfChannels = 0;
|
|
|
sme_reset_ese_bcn_req_in_progress(pSmeRrmContext);
|
|
|
}
|
|
|
|
|
@@ -724,21 +766,22 @@ static QDF_STATUS sme_rrm_scan_request_callback(mac_handle_t mac_handle,
|
|
|
static void sme_rrm_scan_event_callback(struct wlan_objmgr_vdev *vdev,
|
|
|
struct scan_event *event, void *arg)
|
|
|
{
|
|
|
+ struct mac_context *mac_ctx;
|
|
|
uint32_t scan_id;
|
|
|
- uint8_t session_id;
|
|
|
+ uint8_t session_id, i;
|
|
|
eCsrScanStatus scan_status = eCSR_SCAN_FAILURE;
|
|
|
- mac_handle_t mac_handle;
|
|
|
bool success = false;
|
|
|
+ tpRrmSMEContext smerrmctx;
|
|
|
|
|
|
- session_id = wlan_vdev_get_id(vdev);
|
|
|
- scan_id = event->scan_id;
|
|
|
- mac_handle = cds_get_context(QDF_MODULE_ID_SME);
|
|
|
- if (!mac_handle) {
|
|
|
- QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_FATAL,
|
|
|
- FL("invalid h_hal"));
|
|
|
+ mac_ctx = (struct mac_context *)arg;
|
|
|
+ if (!mac_ctx) {
|
|
|
+ sme_err("invalid mac_ctx");
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
+ session_id = wlan_vdev_get_id(vdev);
|
|
|
+ scan_id = event->scan_id;
|
|
|
+
|
|
|
qdf_mtrace(QDF_MODULE_ID_SCAN, QDF_MODULE_ID_SME, event->type,
|
|
|
event->vdev_id, event->scan_id);
|
|
|
|
|
@@ -748,11 +791,21 @@ static void sme_rrm_scan_event_callback(struct wlan_objmgr_vdev *vdev,
|
|
|
if (success)
|
|
|
scan_status = eCSR_SCAN_SUCCESS;
|
|
|
|
|
|
- sme_rrm_scan_request_callback(mac_handle, session_id,
|
|
|
+ for (i = 0; i < MAX_MEASUREMENT_REQUEST; i++) {
|
|
|
+ smerrmctx = &mac_ctx->rrm.rrmSmeContext[i];
|
|
|
+ if (smerrmctx->scan_id == scan_id)
|
|
|
+ break;
|
|
|
+
|
|
|
+ if (i == (MAX_MEASUREMENT_REQUEST - 1))
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ sme_debug("Scan completed for scan_id:%d measurement_idx:%d",
|
|
|
+ scan_id, smerrmctx->measurement_idx);
|
|
|
+ sme_rrm_scan_request_callback(mac_ctx, smerrmctx, session_id,
|
|
|
scan_id, scan_status);
|
|
|
}
|
|
|
|
|
|
-
|
|
|
/**
|
|
|
* sme_rrm_issue_scan_req() - To issue rrm scan request
|
|
|
* @mac_ctx: pointer to mac context
|
|
@@ -761,10 +814,11 @@ static void sme_rrm_scan_event_callback(struct wlan_objmgr_vdev *vdev,
|
|
|
*
|
|
|
* Return: QDF_STATUS
|
|
|
*/
|
|
|
-static QDF_STATUS sme_rrm_issue_scan_req(struct mac_context *mac_ctx)
|
|
|
+static QDF_STATUS
|
|
|
+sme_rrm_issue_scan_req(struct mac_context *mac_ctx, uint8_t idx)
|
|
|
{
|
|
|
QDF_STATUS status = QDF_STATUS_SUCCESS;
|
|
|
- tpRrmSMEContext sme_rrm_ctx = &mac_ctx->rrm.rrmSmeContext;
|
|
|
+ tpRrmSMEContext sme_rrm_ctx = &mac_ctx->rrm.rrmSmeContext[idx];
|
|
|
uint32_t session_id;
|
|
|
tSirScanType scan_type;
|
|
|
uint8_t ch_idx;
|
|
@@ -781,7 +835,8 @@ static QDF_STATUS sme_rrm_issue_scan_req(struct mac_context *mac_ctx)
|
|
|
|
|
|
if ((sme_rrm_ctx->currentIndex) >=
|
|
|
sme_rrm_ctx->channelList.numOfChannels) {
|
|
|
- sme_rrm_send_beacon_report_xmit_ind(mac_ctx, NULL, true, 0);
|
|
|
+ sme_rrm_send_beacon_report_xmit_ind(mac_ctx, idx, NULL,
|
|
|
+ true, 0);
|
|
|
sme_debug("done with the complete ch lt. finish and fee now");
|
|
|
goto free_ch_lst;
|
|
|
}
|
|
@@ -818,6 +873,10 @@ static QDF_STATUS sme_rrm_issue_scan_req(struct mac_context *mac_ctx)
|
|
|
}
|
|
|
ucfg_scan_init_default_params(vdev, req);
|
|
|
req->scan_req.scan_id = ucfg_scan_get_scan_id(mac_ctx->psoc);
|
|
|
+ sme_rrm_ctx->scan_id = req->scan_req.scan_id;
|
|
|
+
|
|
|
+ sme_debug("RRM_SCN: rrm_idx:%d scan_id:%d",
|
|
|
+ sme_rrm_ctx->measurement_idx, sme_rrm_ctx->scan_id);
|
|
|
req->scan_req.scan_f_passive =
|
|
|
(scan_type == eSIR_ACTIVE_SCAN) ? false : true;
|
|
|
req->scan_req.vdev_id = wlan_vdev_get_id(vdev);
|
|
@@ -924,11 +983,11 @@ static QDF_STATUS sme_rrm_issue_scan_req(struct mac_context *mac_ctx)
|
|
|
freq_list = sme_rrm_ctx->channelList.freq_list;
|
|
|
ch_idx = sme_rrm_ctx->currentIndex;
|
|
|
if ((ch_idx + 1) < sme_rrm_ctx->channelList.numOfChannels) {
|
|
|
- sme_rrm_send_scan_result(mac_ctx, 1,
|
|
|
+ sme_rrm_send_scan_result(mac_ctx, idx, 1,
|
|
|
&freq_list[ch_idx], false);
|
|
|
/* Advance the current index. */
|
|
|
sme_rrm_ctx->currentIndex++;
|
|
|
- sme_rrm_issue_scan_req(mac_ctx);
|
|
|
+ sme_rrm_issue_scan_req(mac_ctx, idx);
|
|
|
#ifdef FEATURE_WLAN_ESE
|
|
|
sme_rrm_ctx->eseBcnReqInProgress = false;
|
|
|
#endif
|
|
@@ -938,7 +997,7 @@ static QDF_STATUS sme_rrm_issue_scan_req(struct mac_context *mac_ctx)
|
|
|
* Done with the measurement. Clean up all context and
|
|
|
* send a message to PE with measurement done flag set.
|
|
|
*/
|
|
|
- sme_rrm_send_scan_result(mac_ctx, 1,
|
|
|
+ sme_rrm_send_scan_result(mac_ctx, idx, 1,
|
|
|
&freq_list[ch_idx], true);
|
|
|
goto free_ch_lst;
|
|
|
}
|
|
@@ -951,7 +1010,7 @@ static QDF_STATUS sme_rrm_issue_scan_req(struct mac_context *mac_ctx)
|
|
|
* and PE will not handle subsequent Beacon requests
|
|
|
*/
|
|
|
send_ind:
|
|
|
- sme_rrm_send_beacon_report_xmit_ind(mac_ctx, NULL, true, 0);
|
|
|
+ sme_rrm_send_beacon_report_xmit_ind(mac_ctx, idx, NULL, true, 0);
|
|
|
free_ch_lst:
|
|
|
qdf_mem_free(sme_rrm_ctx->channelList.freq_list);
|
|
|
sme_rrm_ctx->channelList.freq_list = NULL;
|
|
@@ -1023,7 +1082,7 @@ QDF_STATUS sme_rrm_process_beacon_report_req_ind(struct mac_context *mac,
|
|
|
void *msg_buf)
|
|
|
{
|
|
|
tpSirBeaconReportReqInd beacon_req = (tpSirBeaconReportReqInd)msg_buf;
|
|
|
- tpRrmSMEContext sme_rrm_ctx = &mac->rrm.rrmSmeContext;
|
|
|
+ tpRrmSMEContext sme_rrm_ctx;
|
|
|
uint32_t len = 0, i = 0;
|
|
|
uint8_t country[WNI_CFG_COUNTRY_CODE_LEN];
|
|
|
uint32_t session_id;
|
|
@@ -1034,6 +1093,8 @@ QDF_STATUS sme_rrm_process_beacon_report_req_ind(struct mac_context *mac,
|
|
|
uint32_t *rrm_freq_list;
|
|
|
uint32_t bcn_chan_freq;
|
|
|
|
|
|
+ sme_rrm_ctx = &mac->rrm.rrmSmeContext[beacon_req->measurement_idx];
|
|
|
+
|
|
|
status = csr_roam_get_session_id_from_bssid(mac, (struct qdf_mac_addr *)
|
|
|
beacon_req->bssId,
|
|
|
&session_id);
|
|
@@ -1056,7 +1117,8 @@ QDF_STATUS sme_rrm_process_beacon_report_req_ind(struct mac_context *mac,
|
|
|
else
|
|
|
country[2] = OP_CLASS_GLOBAL;
|
|
|
|
|
|
- sme_debug("Request Reg class %d, AP's country code %c%c 0x%x, channel = %d",
|
|
|
+ sme_debug("RRM_SCN: Index:%d Request Reg class %d, AP's country code %c%c 0x%x, channel = %d",
|
|
|
+ beacon_req->measurement_idx,
|
|
|
beacon_req->channel_info.reg_class,
|
|
|
country[0], country[1], country[2],
|
|
|
beacon_req->channel_info.chan_num);
|
|
@@ -1172,7 +1234,7 @@ QDF_STATUS sme_rrm_process_beacon_report_req_ind(struct mac_context *mac,
|
|
|
sme_rrm_ctx->regClass = beacon_req->channel_info.reg_class;
|
|
|
sme_rrm_ctx->randnIntvl =
|
|
|
QDF_MAX(beacon_req->randomizationInterval,
|
|
|
- sme_rrm_ctx->rrmConfig.max_randn_interval);
|
|
|
+ mac->rrm.rrmConfig.max_randn_interval);
|
|
|
sme_rrm_ctx->currentIndex = 0;
|
|
|
sme_rrm_ctx->msgSource = beacon_req->msgSource;
|
|
|
qdf_mem_copy((uint8_t *)&sme_rrm_ctx->measMode,
|
|
@@ -1188,7 +1250,7 @@ QDF_STATUS sme_rrm_process_beacon_report_req_ind(struct mac_context *mac,
|
|
|
sme_rrm_ctx->duration[0],
|
|
|
sme_rrm_get_meas_mode_string(sme_rrm_ctx->measMode[0]));
|
|
|
|
|
|
- return sme_rrm_issue_scan_req(mac);
|
|
|
+ return sme_rrm_issue_scan_req(mac, beacon_req->measurement_idx);
|
|
|
|
|
|
cleanup:
|
|
|
if (beacon_req->msgSource == eRRM_MSG_SOURCE_11K) {
|
|
@@ -1199,7 +1261,8 @@ cleanup:
|
|
|
/* copy measurement bssid */
|
|
|
qdf_mem_copy(sme_rrm_ctx->bssId, beacon_req->macaddrBssid,
|
|
|
sizeof(tSirMacAddr));
|
|
|
- sme_rrm_send_beacon_report_xmit_ind(mac, NULL, true, 0);
|
|
|
+ sme_rrm_send_beacon_report_xmit_ind(mac,
|
|
|
+ sme_rrm_ctx->measurement_idx, NULL, true, 0);
|
|
|
}
|
|
|
|
|
|
return status;
|
|
@@ -1234,7 +1297,7 @@ QDF_STATUS sme_rrm_neighbor_report_request(struct mac_context *mac, uint8_t
|
|
|
|
|
|
/* If already a report is pending, return failure */
|
|
|
if (true ==
|
|
|
- mac->rrm.rrmSmeContext.neighborReqControlInfo.
|
|
|
+ mac->rrm.rrmSmeContext[0].neighborReqControlInfo.
|
|
|
isNeighborRspPending) {
|
|
|
sme_err("Neighbor request already pending.. Not allowed");
|
|
|
return QDF_STATUS_E_AGAIN;
|
|
@@ -1245,7 +1308,7 @@ QDF_STATUS sme_rrm_neighbor_report_request(struct mac_context *mac, uint8_t
|
|
|
return QDF_STATUS_E_NOMEM;
|
|
|
|
|
|
rrm_ll_purge_neighbor_cache(mac,
|
|
|
- &mac->rrm.rrmSmeContext.neighborReportCache);
|
|
|
+ &mac->rrm.rrmSmeContext[0].neighborReportCache);
|
|
|
|
|
|
pMsg->messageType = eWNI_SME_NEIGHBOR_REPORT_REQ_IND;
|
|
|
pMsg->length = sizeof(tSirNeighborReportReqInd);
|
|
@@ -1261,16 +1324,17 @@ QDF_STATUS sme_rrm_neighbor_report_request(struct mac_context *mac, uint8_t
|
|
|
/* Neighbor report request message sent successfully to PE.
|
|
|
* Now register the callbacks
|
|
|
*/
|
|
|
- mac->rrm.rrmSmeContext.neighborReqControlInfo.neighborRspCallbackInfo.
|
|
|
- neighborRspCallback = callbackInfo->neighborRspCallback;
|
|
|
- mac->rrm.rrmSmeContext.neighborReqControlInfo.neighborRspCallbackInfo.
|
|
|
- neighborRspCallbackContext =
|
|
|
- callbackInfo->neighborRspCallbackContext;
|
|
|
- mac->rrm.rrmSmeContext.neighborReqControlInfo.isNeighborRspPending =
|
|
|
+ mac->rrm.rrmSmeContext[0].neighborReqControlInfo.
|
|
|
+ neighborRspCallbackInfo.neighborRspCallback =
|
|
|
+ callbackInfo->neighborRspCallback;
|
|
|
+ mac->rrm.rrmSmeContext[0].neighborReqControlInfo.
|
|
|
+ neighborRspCallbackInfo.neighborRspCallbackContext =
|
|
|
+ callbackInfo->neighborRspCallbackContext;
|
|
|
+ mac->rrm.rrmSmeContext[0].neighborReqControlInfo.isNeighborRspPending =
|
|
|
true;
|
|
|
|
|
|
/* Start neighbor response wait timer now */
|
|
|
- qdf_mc_timer_start(&mac->rrm.rrmSmeContext.neighborReqControlInfo.
|
|
|
+ qdf_mc_timer_start(&mac->rrm.rrmSmeContext[0].neighborReqControlInfo.
|
|
|
neighborRspWaitTimer, callbackInfo->timeout);
|
|
|
|
|
|
return QDF_STATUS_SUCCESS;
|
|
@@ -1363,7 +1427,9 @@ check_11r_assoc:
|
|
|
|
|
|
/**
|
|
|
* rrm_store_neighbor_rpt_by_roam_score()-store Neighbor BSS descriptor
|
|
|
+ * @mac: Pointer to mac context
|
|
|
* @pNeighborReportDesc - Neighbor BSS Descriptor node to be stored in cache
|
|
|
+ * @index: RRM sme context index
|
|
|
*
|
|
|
* This API is called to store a given
|
|
|
* Neighbor BSS descriptor to the neighbor cache. This function
|
|
@@ -1373,9 +1439,10 @@ check_11r_assoc:
|
|
|
* Return: void.
|
|
|
*/
|
|
|
static void rrm_store_neighbor_rpt_by_roam_score(struct mac_context *mac,
|
|
|
- tpRrmNeighborReportDesc pNeighborReportDesc)
|
|
|
+ tpRrmNeighborReportDesc pNeighborReportDesc,
|
|
|
+ uint8_t index)
|
|
|
{
|
|
|
- tpRrmSMEContext pSmeRrmContext = &mac->rrm.rrmSmeContext;
|
|
|
+ tpRrmSMEContext pSmeRrmContext = &mac->rrm.rrmSmeContext[0];
|
|
|
tListElem *pEntry;
|
|
|
tRrmNeighborReportDesc *pTempNeighborReportDesc;
|
|
|
|
|
@@ -1451,11 +1518,11 @@ static QDF_STATUS sme_rrm_process_neighbor_report(struct mac_context *mac,
|
|
|
QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
|
|
|
|
|
|
/* Purge the cache on reception of unsolicited neighbor report */
|
|
|
- if (!mac->rrm.rrmSmeContext.neighborReqControlInfo.
|
|
|
- isNeighborRspPending)
|
|
|
+ if (!mac->rrm.rrmSmeContext[neighbor_rpt->measurement_idx].
|
|
|
+ neighborReqControlInfo.isNeighborRspPending)
|
|
|
rrm_ll_purge_neighbor_cache(mac,
|
|
|
- &mac->rrm.rrmSmeContext.
|
|
|
- neighborReportCache);
|
|
|
+ &mac->rrm.rrmSmeContext[neighbor_rpt->measurement_idx].
|
|
|
+ neighborReportCache);
|
|
|
|
|
|
for (i = 0; i < neighbor_rpt->numNeighborReports; i++) {
|
|
|
neighbor_rpt_desc =
|
|
@@ -1485,8 +1552,9 @@ static QDF_STATUS sme_rrm_process_neighbor_report(struct mac_context *mac,
|
|
|
rrm_calculate_neighbor_ap_roam_score(mac, neighbor_rpt_desc);
|
|
|
|
|
|
if (neighbor_rpt_desc->roamScore > 0) {
|
|
|
- rrm_store_neighbor_rpt_by_roam_score(mac,
|
|
|
- neighbor_rpt_desc);
|
|
|
+ rrm_store_neighbor_rpt_by_roam_score(
|
|
|
+ mac, neighbor_rpt_desc,
|
|
|
+ neighbor_rpt->measurement_idx);
|
|
|
} else {
|
|
|
sme_err("Roam score of BSSID " QDF_MAC_ADDR_STR
|
|
|
" is 0, Ignoring..",
|
|
@@ -1501,7 +1569,9 @@ static QDF_STATUS sme_rrm_process_neighbor_report(struct mac_context *mac,
|
|
|
}
|
|
|
end:
|
|
|
|
|
|
- if (!csr_ll_count(&mac->rrm.rrmSmeContext.neighborReportCache))
|
|
|
+ if (!csr_ll_count(
|
|
|
+ &mac->rrm.rrmSmeContext[neighbor_rpt->measurement_idx].
|
|
|
+ neighborReportCache))
|
|
|
qdf_status = QDF_STATUS_E_FAILURE;
|
|
|
|
|
|
rrm_indicate_neighbor_report_result(mac, qdf_status);
|
|
@@ -1554,14 +1624,24 @@ QDF_STATUS sme_rrm_msg_processor(struct mac_context *mac, uint16_t msg_type,
|
|
|
*
|
|
|
* Return: NULL
|
|
|
*/
|
|
|
-static void rrm_iter_meas_timer_handle(void *userData)
|
|
|
+static void rrm_iter_meas_timer_handle(void *data)
|
|
|
{
|
|
|
- struct mac_context *mac = (struct mac_context *) userData;
|
|
|
+ struct mac_context *mac;
|
|
|
+ mac_handle_t mac_handle = cds_get_context(QDF_MODULE_ID_SME);
|
|
|
+ tpRrmSMEContext sme_rrm_ctx = (tpRrmSMEContext)data;
|
|
|
+
|
|
|
+ mac = MAC_CONTEXT(mac_handle);
|
|
|
+ if (!mac) {
|
|
|
+ sme_err("Mac ctx is NULL");
|
|
|
+ return;
|
|
|
+ }
|
|
|
|
|
|
sme_debug("Randomization timer expired...send on next channel");
|
|
|
+
|
|
|
/* Issue a scan req for next channel. */
|
|
|
- sme_rrm_issue_scan_req(mac);
|
|
|
+ sme_rrm_issue_scan_req(mac, sme_rrm_ctx->measurement_idx);
|
|
|
}
|
|
|
+
|
|
|
/**
|
|
|
* rrm_neighbor_rsp_timeout_handler() - Timer handler to handlet the timeout
|
|
|
* @mac - The handle returned by mac_open.
|
|
@@ -1587,12 +1667,12 @@ static void rrm_neighbor_rsp_timeout_handler(void *userData)
|
|
|
*/
|
|
|
static void rrm_change_default_config_param(struct mac_context *mac)
|
|
|
{
|
|
|
- mac->rrm.rrmSmeContext.rrmConfig.rrm_enabled =
|
|
|
+ mac->rrm.rrmConfig.rrm_enabled =
|
|
|
mac->mlme_cfg->rrm_config.rrm_enabled;
|
|
|
- mac->rrm.rrmSmeContext.rrmConfig.max_randn_interval =
|
|
|
+ mac->rrm.rrmConfig.max_randn_interval =
|
|
|
mac->mlme_cfg->rrm_config.rrm_rand_interval;
|
|
|
|
|
|
- qdf_mem_copy(&mac->rrm.rrmSmeContext.rrmConfig.rm_capability,
|
|
|
+ qdf_mem_copy(&mac->rrm.rrmConfig.rm_capability,
|
|
|
&mac->mlme_cfg->rrm_config.rm_capability,
|
|
|
RMENABLEDCAP_MAX_LEN);
|
|
|
}
|
|
@@ -1609,38 +1689,46 @@ QDF_STATUS rrm_open(struct mac_context *mac)
|
|
|
{
|
|
|
|
|
|
QDF_STATUS qdf_status;
|
|
|
- tpRrmSMEContext pSmeRrmContext = &mac->rrm.rrmSmeContext;
|
|
|
+ tpRrmSMEContext pSmeRrmContext;
|
|
|
QDF_STATUS qdf_ret_status = QDF_STATUS_SUCCESS;
|
|
|
+ uint8_t i;
|
|
|
|
|
|
- pSmeRrmContext->rrmConfig.max_randn_interval = 50; /* ms */
|
|
|
+ mac->rrm.rrmConfig.max_randn_interval = 50; /* ms */
|
|
|
|
|
|
- qdf_status = qdf_mc_timer_init(&pSmeRrmContext->IterMeasTimer,
|
|
|
- QDF_TIMER_TYPE_SW,
|
|
|
- rrm_iter_meas_timer_handle,
|
|
|
- (void *)mac);
|
|
|
+ for (i = 0; i < MAX_MEASUREMENT_REQUEST; i++) {
|
|
|
+ pSmeRrmContext = &mac->rrm.rrmSmeContext[i];
|
|
|
|
|
|
- if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
|
|
|
- sme_err("Fail to init measurement timer");
|
|
|
- return QDF_STATUS_E_FAILURE;
|
|
|
- }
|
|
|
+ qdf_status = qdf_mc_timer_init(&pSmeRrmContext->IterMeasTimer,
|
|
|
+ QDF_TIMER_TYPE_SW,
|
|
|
+ rrm_iter_meas_timer_handle,
|
|
|
+ (void *)pSmeRrmContext);
|
|
|
|
|
|
- qdf_status =
|
|
|
- qdf_mc_timer_init(&pSmeRrmContext->neighborReqControlInfo.
|
|
|
- neighborRspWaitTimer, QDF_TIMER_TYPE_SW,
|
|
|
- rrm_neighbor_rsp_timeout_handler,
|
|
|
- (void *)mac);
|
|
|
+ if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
|
|
|
+ sme_err("Fail to init measurement timer");
|
|
|
+ return QDF_STATUS_E_FAILURE;
|
|
|
+ }
|
|
|
|
|
|
- if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
|
|
|
- sme_err("Fail to init neighbor rsp wait timer");
|
|
|
- return QDF_STATUS_E_FAILURE;
|
|
|
- }
|
|
|
+ qdf_status =
|
|
|
+ qdf_mc_timer_init(&pSmeRrmContext->neighborReqControlInfo.
|
|
|
+ neighborRspWaitTimer, QDF_TIMER_TYPE_SW,
|
|
|
+ rrm_neighbor_rsp_timeout_handler,
|
|
|
+ (void *)mac);
|
|
|
|
|
|
- pSmeRrmContext->neighborReqControlInfo.isNeighborRspPending = false;
|
|
|
+ if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
|
|
|
+ sme_err("Fail to init neighbor rsp wait timer");
|
|
|
+ return QDF_STATUS_E_FAILURE;
|
|
|
+ }
|
|
|
|
|
|
- qdf_ret_status = csr_ll_open(&pSmeRrmContext->neighborReportCache);
|
|
|
- if (QDF_STATUS_SUCCESS != qdf_ret_status) {
|
|
|
- sme_err("Fail to open neighbor cache result");
|
|
|
- return QDF_STATUS_E_FAILURE;
|
|
|
+ pSmeRrmContext->measurement_idx = i;
|
|
|
+ pSmeRrmContext->neighborReqControlInfo.isNeighborRspPending =
|
|
|
+ false;
|
|
|
+
|
|
|
+ qdf_ret_status =
|
|
|
+ csr_ll_open(&pSmeRrmContext->neighborReportCache);
|
|
|
+ if (QDF_STATUS_SUCCESS != qdf_ret_status) {
|
|
|
+ sme_err("Fail to open neighbor cache result");
|
|
|
+ return QDF_STATUS_E_FAILURE;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
rrm_change_default_config_param(mac);
|
|
@@ -1661,81 +1749,93 @@ QDF_STATUS rrm_open(struct mac_context *mac)
|
|
|
|
|
|
QDF_STATUS rrm_close(struct mac_context *mac)
|
|
|
{
|
|
|
-
|
|
|
QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
|
|
|
- tpRrmSMEContext pSmeRrmContext = &mac->rrm.rrmSmeContext;
|
|
|
-
|
|
|
- if (QDF_TIMER_STATE_RUNNING ==
|
|
|
- qdf_mc_timer_get_current_state(&pSmeRrmContext->IterMeasTimer)) {
|
|
|
- qdf_status = qdf_mc_timer_stop(&pSmeRrmContext->IterMeasTimer);
|
|
|
- if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
|
|
|
- QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
|
|
|
- FL("Timer stop fail"));
|
|
|
+ tpRrmSMEContext pSmeRrmContext;
|
|
|
+ uint8_t i;
|
|
|
+
|
|
|
+ for (i = 0; i < MAX_MEASUREMENT_REQUEST; i++) {
|
|
|
+ pSmeRrmContext = &mac->rrm.rrmSmeContext[i];
|
|
|
+ if (QDF_TIMER_STATE_RUNNING ==
|
|
|
+ qdf_mc_timer_get_current_state(
|
|
|
+ &pSmeRrmContext->IterMeasTimer)) {
|
|
|
+ qdf_status = qdf_mc_timer_stop(
|
|
|
+ &pSmeRrmContext->IterMeasTimer);
|
|
|
+ if (QDF_IS_STATUS_ERROR(qdf_status))
|
|
|
+ sme_err("Timer stop fail");
|
|
|
}
|
|
|
- }
|
|
|
|
|
|
- if (pSmeRrmContext->channelList.freq_list) {
|
|
|
- qdf_mem_free(pSmeRrmContext->channelList.freq_list);
|
|
|
- pSmeRrmContext->channelList.freq_list = NULL;
|
|
|
- pSmeRrmContext->channelList.numOfChannels = 0;
|
|
|
- }
|
|
|
-
|
|
|
- qdf_status = qdf_mc_timer_destroy(&pSmeRrmContext->IterMeasTimer);
|
|
|
- if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
|
|
|
-
|
|
|
- QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
|
|
|
- FL("Fail to destroy timer"));
|
|
|
-
|
|
|
- }
|
|
|
+ if (pSmeRrmContext->channelList.freq_list) {
|
|
|
+ qdf_mem_free(pSmeRrmContext->channelList.freq_list);
|
|
|
+ pSmeRrmContext->channelList.freq_list = NULL;
|
|
|
+ pSmeRrmContext->channelList.numOfChannels = 0;
|
|
|
+ }
|
|
|
|
|
|
- if (QDF_TIMER_STATE_RUNNING ==
|
|
|
- qdf_mc_timer_get_current_state(&pSmeRrmContext->
|
|
|
- neighborReqControlInfo.
|
|
|
- neighborRspWaitTimer)) {
|
|
|
- qdf_status = qdf_mc_timer_stop(&pSmeRrmContext->
|
|
|
- neighborReqControlInfo.
|
|
|
- neighborRspWaitTimer);
|
|
|
- if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
|
|
|
- QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
|
|
|
- FL("Timer stop fail"));
|
|
|
+ qdf_status =
|
|
|
+ qdf_mc_timer_destroy(&pSmeRrmContext->IterMeasTimer);
|
|
|
+ if (QDF_IS_STATUS_ERROR(qdf_status))
|
|
|
+ sme_err("Fail to destroy timer");
|
|
|
+
|
|
|
+ if (QDF_TIMER_STATE_RUNNING ==
|
|
|
+ qdf_mc_timer_get_current_state(&pSmeRrmContext->
|
|
|
+ neighborReqControlInfo.
|
|
|
+ neighborRspWaitTimer)) {
|
|
|
+ qdf_status = qdf_mc_timer_stop(&pSmeRrmContext->
|
|
|
+ neighborReqControlInfo.
|
|
|
+ neighborRspWaitTimer);
|
|
|
+ if (QDF_IS_STATUS_ERROR(qdf_status))
|
|
|
+ sme_err("Timer stop fail");
|
|
|
}
|
|
|
- }
|
|
|
|
|
|
- qdf_status =
|
|
|
- qdf_mc_timer_destroy(&pSmeRrmContext->neighborReqControlInfo.
|
|
|
- neighborRspWaitTimer);
|
|
|
- if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
|
|
|
- QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
|
|
|
- FL("Fail to destroy timer"));
|
|
|
+ qdf_status = qdf_mc_timer_destroy(
|
|
|
+ &pSmeRrmContext->neighborReqControlInfo.
|
|
|
+ neighborRspWaitTimer);
|
|
|
+ if (!QDF_IS_STATUS_SUCCESS(qdf_status))
|
|
|
+ sme_err("Fail to destroy timer");
|
|
|
|
|
|
+ rrm_ll_purge_neighbor_cache(
|
|
|
+ mac, &pSmeRrmContext->neighborReportCache);
|
|
|
+ csr_ll_close(&pSmeRrmContext->neighborReportCache);
|
|
|
}
|
|
|
|
|
|
- rrm_ll_purge_neighbor_cache(mac, &pSmeRrmContext->neighborReportCache);
|
|
|
-
|
|
|
- csr_ll_close(&pSmeRrmContext->neighborReportCache);
|
|
|
-
|
|
|
return qdf_status;
|
|
|
|
|
|
}
|
|
|
|
|
|
QDF_STATUS rrm_start(struct mac_context *mac_ctx)
|
|
|
{
|
|
|
- tpRrmSMEContext smerrmctx = &mac_ctx->rrm.rrmSmeContext;
|
|
|
+ tpRrmSMEContext smerrmctx;
|
|
|
+ wlan_scan_requester req_id;
|
|
|
+ uint8_t i;
|
|
|
+
|
|
|
|
|
|
/* Register with scan component */
|
|
|
- smerrmctx->req_id = ucfg_scan_register_requester(mac_ctx->psoc,
|
|
|
- "RRM",
|
|
|
- sme_rrm_scan_event_callback,
|
|
|
- smerrmctx);
|
|
|
+ req_id = ucfg_scan_register_requester(mac_ctx->psoc,
|
|
|
+ "RRM",
|
|
|
+ sme_rrm_scan_event_callback,
|
|
|
+ mac_ctx);
|
|
|
+
|
|
|
+ for (i = 0; i < MAX_MEASUREMENT_REQUEST; i++) {
|
|
|
+ smerrmctx = &mac_ctx->rrm.rrmSmeContext[i];
|
|
|
+ smerrmctx->req_id = req_id;
|
|
|
+ }
|
|
|
|
|
|
return QDF_STATUS_SUCCESS;
|
|
|
}
|
|
|
|
|
|
QDF_STATUS rrm_stop(struct mac_context *mac_ctx)
|
|
|
{
|
|
|
- tpRrmSMEContext smerrmctx = &mac_ctx->rrm.rrmSmeContext;
|
|
|
+ tpRrmSMEContext smerrmctx;
|
|
|
+ wlan_scan_requester req_id;
|
|
|
+ uint8_t i;
|
|
|
+
|
|
|
+ for (i = 0; i < MAX_MEASUREMENT_REQUEST; i++) {
|
|
|
+ smerrmctx = &mac_ctx->rrm.rrmSmeContext[i];
|
|
|
+ req_id = smerrmctx->req_id;
|
|
|
+ smerrmctx->req_id = 0;
|
|
|
+ }
|
|
|
|
|
|
- ucfg_scan_unregister_requester(mac_ctx->psoc, smerrmctx->req_id);
|
|
|
+ ucfg_scan_unregister_requester(mac_ctx->psoc,
|
|
|
+ req_id);
|
|
|
|
|
|
return QDF_STATUS_SUCCESS;
|
|
|
}
|