From 66d09c4150ca8e56cac33958c67682e89cc828e5 Mon Sep 17 00:00:00 2001 From: Sandeep Puligilla Date: Wed, 6 Sep 2017 17:10:27 -0700 Subject: [PATCH] qcacld-3.0: Add RRM scan changes Add RRM scan changes according to new scan component. Change-Id: Ib8e90a3f54c173cf478164aeef90f8f825984ce2 CRs-Fixed: 2113507 --- core/sme/inc/sme_rrm_api.h | 18 ++++ core/sme/inc/sme_rrm_internal.h | 3 +- core/sme/src/common/sme_api.c | 14 ++- core/sme/src/rrm/sme_rrm.c | 163 ++++++++++++++++++++++---------- 4 files changed, 143 insertions(+), 55 deletions(-) diff --git a/core/sme/inc/sme_rrm_api.h b/core/sme/inc/sme_rrm_api.h index 78820dc0923d..b4f057aee0ee 100644 --- a/core/sme/inc/sme_rrm_api.h +++ b/core/sme/inc/sme_rrm_api.h @@ -58,4 +58,22 @@ QDF_STATUS sme_rrm_neighbor_report_request(tpAniSirGlobal pMac, QDF_STATUS sme_rrm_process_beacon_report_req_ind(tpAniSirGlobal pMac, void *pMsgBuf); +/** + * rrm_start() - start the RRM module + * @mac_ctx: The handle returned by mac_open. + * + * Return: QDF_STATUS + * QDF_STATUS_SUCCESS success + */ +QDF_STATUS rrm_start(tpAniSirGlobal mac_ctx); + +/** + * rrm_stop() - stop the RRM module + * @mac_ctx: The handle returned by mac_open. + * + * Return: QDF_STATUS + * QDF_STATUS_SUCCESS success + */ +QDF_STATUS rrm_stop(tpAniSirGlobal mac_ctx); + #endif diff --git a/core/sme/inc/sme_rrm_internal.h b/core/sme/inc/sme_rrm_internal.h index d172894acb3f..91da47cf32cf 100644 --- a/core/sme/inc/sme_rrm_internal.h +++ b/core/sme/inc/sme_rrm_internal.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011-2012, 2014-2016 The Linux Foundation. All rights reserved. + * Copyright (c) 2011-2012, 2014-2017 The Linux Foundation. All rights reserved. * * Previously licensed under the ISC license by Qualcomm Atheros, Inc. * @@ -93,6 +93,7 @@ typedef struct sRrmSMEContext { bool eseBcnReqInProgress; #endif /* FEATURE_WLAN_ESE */ tRrmMsgReqSource msgSource; + wlan_scan_requester req_id; } tRrmSMEContext, *tpRrmSMEContext; typedef struct sRrmNeighborReq { diff --git a/core/sme/src/common/sme_api.c b/core/sme/src/common/sme_api.c index 4672897d3583..6d18b740b6fe 100644 --- a/core/sme/src/common/sme_api.c +++ b/core/sme/src/common/sme_api.c @@ -1299,8 +1299,14 @@ QDF_STATUS sme_start(tHalHandle hHal) break; } pMac->sme.state = SME_STATE_START; - } while (0); + /* START RRM */ + status = rrm_start(pMac); + if (!QDF_IS_STATUS_SUCCESS(status)) { + sme_err("Failed to start RRM"); + break; + } + } while (0); return status; } @@ -2662,12 +2668,16 @@ QDF_STATUS sme_stop(tHalHandle hHal, tHalStopType stopType) p2p_stop(hHal); + status = rrm_stop(pMac); + if (!QDF_IS_STATUS_SUCCESS(status)) { + sme_err("rrm_stop failed with status: %d", status); + } + status = csr_stop(pMac, stopType); if (!QDF_IS_STATUS_SUCCESS(status)) { sme_err("csr_stop failed with status: %d", status); fail_status = status; } - purge_sme_cmd_list(pMac); if (!QDF_IS_STATUS_SUCCESS(fail_status)) diff --git a/core/sme/src/rrm/sme_rrm.c b/core/sme/src/rrm/sme_rrm.c index eaadf91ece53..9fbf3eabe068 100644 --- a/core/sme/src/rrm/sme_rrm.c +++ b/core/sme/src/rrm/sme_rrm.c @@ -44,6 +44,7 @@ #include "csr_inside_api.h" #include "rrm_global.h" +#include /* Roam score for a neighbor AP will be calculated based on the below * definitions. The calculated roam score will be used to select the @@ -569,12 +570,13 @@ rrm_send_scan_results_done: return status; } + /** * sme_rrm_scan_request_callback() -Sends the beacon report xmit to PE - * @halHandle - Pointer to the Hal Handle. - * @pContext - Pointer to the data context. - * @scanId - Scan ID. - * @status - CSR Status. + * @halHandle: Pointer to the Hal Handle. + * @sessionId: session id + * @scanId: Scan ID. + * @status: CSR Status. * * The sme module calls this callback function once it finish the scan request * and this function send the beacon report xmit to PE and starts a timer of @@ -582,14 +584,11 @@ rrm_send_scan_results_done: * * Return : 0 for success, non zero for failure */ - static QDF_STATUS sme_rrm_scan_request_callback(tHalHandle halHandle, - void *pContext, uint8_t sessionId, uint32_t scanId, eCsrScanStatus status) { - uint16_t interval; tpAniSirGlobal pMac = (tpAniSirGlobal) halHandle; tpRrmSMEContext pSmeRrmContext = &pMac->rrm.rrmSmeContext; @@ -636,6 +635,43 @@ static QDF_STATUS sme_rrm_scan_request_callback(tHalHandle halHandle, return QDF_STATUS_SUCCESS; } +static void sme_rrm_scan_event_callback(struct wlan_objmgr_vdev *vdev, + struct scan_event *event, void *arg) +{ + uint32_t scan_id; + uint8_t session_id; + eCsrScanStatus scan_status = eCSR_SCAN_FAILURE; + tHalHandle hal_handle; + + session_id = wlan_vdev_get_id(vdev); + scan_id = event->scan_id; + hal_handle = cds_get_context(QDF_MODULE_ID_SME); + if (!hal_handle) { + QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_FATAL, + FL("invalid h_hal")); + return; + } + if ((event->type != SCAN_EVENT_TYPE_COMPLETED) && + (event->type != SCAN_EVENT_TYPE_DEQUEUED) && + (event->type != SCAN_EVENT_TYPE_START_FAILED)) + return; + + if ((event->type == SCAN_EVENT_TYPE_COMPLETED) && + ((event->reason == SCAN_REASON_CANCELLED) || + (event->reason == SCAN_REASON_TIMEDOUT) || + (event->reason == SCAN_REASON_INTERNAL_FAILURE))) + scan_status = eCSR_SCAN_FAILURE; + else if ((event->type == SCAN_EVENT_TYPE_COMPLETED) && + (event->reason == SCAN_REASON_COMPLETED)) + scan_status = eCSR_SCAN_SUCCESS; + else + return; + + sme_rrm_scan_request_callback(hal_handle, session_id, + scan_id, scan_status); +} + + /** * sme_rrm_issue_scan_req() - To issue rrm scan request * @mac_ctx: pointer to mac context @@ -646,14 +682,14 @@ static QDF_STATUS sme_rrm_scan_request_callback(tHalHandle halHandle, */ static QDF_STATUS sme_rrm_issue_scan_req(tpAniSirGlobal mac_ctx) { - /* Issue scan request. */ - tCsrScanRequest scan_req; QDF_STATUS status = QDF_STATUS_SUCCESS; tpRrmSMEContext sme_rrm_ctx = &mac_ctx->rrm.rrmSmeContext; uint32_t session_id; uint32_t max_chan_time; tSirScanType scan_type; uint64_t current_time; + struct scan_start_request *req; + struct wlan_objmgr_vdev *vdev; status = csr_roam_get_session_id_from_bssid(mac_ctx, &sme_rrm_ctx->sessionBssId, &session_id); @@ -674,42 +710,50 @@ static QDF_STATUS sme_rrm_issue_scan_req(tpAniSirGlobal mac_ctx) if ((eSIR_ACTIVE_SCAN == scan_type) || (eSIR_PASSIVE_SCAN == scan_type)) { - qdf_mem_zero(&scan_req, sizeof(scan_req)); - /* set scan_type, active or passive */ - scan_req.bcnRptReqScan = true; - scan_req.scanType = scan_type; - qdf_mem_copy(&scan_req.bssid.bytes, sme_rrm_ctx->bssId, + req = qdf_mem_malloc(sizeof(*req)); + if (!req) { + sme_debug("Failed to allocate memory"); + return QDF_STATUS_E_NOMEM; + } + vdev = wlan_objmgr_get_vdev_by_id_from_psoc( + mac_ctx->psoc, + session_id, + WLAN_LEGACY_SME_ID); + if (!vdev) { + sme_err("VDEV is null %d", session_id); + return QDF_STATUS_E_INVAL; + } + ucfg_scan_init_default_params(vdev, req); + req->scan_req.dwell_time_active = 0; + req->scan_req.scan_id = ucfg_scan_get_scan_id(mac_ctx->psoc); + req->scan_req.vdev_id = wlan_vdev_get_id(vdev); + req->scan_req.scan_req_id = sme_rrm_ctx->req_id; + qdf_mem_copy(&req->scan_req.bssid_list[0], sme_rrm_ctx->bssId, QDF_MAC_ADDR_SIZE); + req->scan_req.num_bssid = 1; if (sme_rrm_ctx->ssId.length) { - scan_req.SSIDs.numOfSSIDs = 1; - scan_req.SSIDs.SSIDList = - (tCsrSSIDInfo *)qdf_mem_malloc( - sizeof(tCsrSSIDInfo)); - if (NULL == scan_req.SSIDs.SSIDList) { - sme_err("qdf_mem_malloc failed"); - return QDF_STATUS_E_NOMEM; - } - scan_req.SSIDs.SSIDList->SSID.length = - sme_rrm_ctx->ssId.length; - qdf_mem_copy(scan_req.SSIDs.SSIDList->SSID.ssId, + req->scan_req.num_ssids = 1; + qdf_mem_copy(&req->scan_req.ssid[0], sme_rrm_ctx->ssId.ssId, sme_rrm_ctx->ssId.length); + req->scan_req.ssid[0].length = sme_rrm_ctx->ssId.length; } /* * set min and max channel time * sme_rrm_ctx->duration; Dont use min timeout. */ - scan_req.minChnTime = 0; if (eRRM_MSG_SOURCE_ESE_UPLOAD == sme_rrm_ctx->msgSource || eRRM_MSG_SOURCE_LEGACY_ESE == sme_rrm_ctx->msgSource) - scan_req.maxChnTime = sme_rrm_ctx->duration[ + req->scan_req.dwell_time_active = sme_rrm_ctx->duration[ sme_rrm_ctx->currentIndex]; else - scan_req.maxChnTime = sme_rrm_ctx->duration[0]; + req->scan_req.dwell_time_active = + sme_rrm_ctx->duration[0]; - sme_debug(FL("Scan Type(%d) Max Dwell Time(%d)"), - scan_req.scanType, scan_req.maxChnTime); + sme_debug("Scan Type(%d) Max Dwell Time(%d)", + scan_type, + req->scan_req.dwell_time_active); /* * Use gPassive/gActiveMaxChannelTime if maxChanTime is less * than default. @@ -721,8 +765,8 @@ static QDF_STATUS sme_rrm_issue_scan_req(tpAniSirGlobal mac_ctx) max_chan_time = mac_ctx->roam.configParam.nPassiveMaxChnTime; - if (scan_req.maxChnTime < max_chan_time) { - scan_req.maxChnTime = max_chan_time; + if (req->scan_req.dwell_time_active < max_chan_time) { + req->scan_req.dwell_time_active = max_chan_time; sme_debug("Setting default max %d ChanTime", max_chan_time); } @@ -743,32 +787,26 @@ static QDF_STATUS sme_rrm_issue_scan_req(tpAniSirGlobal mac_ctx) sme_rrm_ctx->channelList.numOfChannels); if ((abs(current_time - rrm_scan_timer) > 1000) && (sme_rrm_ctx->channelList.numOfChannels == 1)) { - scan_req.restTime = 1; - scan_req.min_rest_time = 1; - scan_req.idle_time = 1; + req->scan_req.max_rest_time = 1; + req->scan_req.min_rest_time = 1; + req->scan_req.idle_time = 1; } rrm_scan_timer = (uint64_t)qdf_mc_timer_get_system_time(); - /* set BSSType to default type */ - scan_req.BSSType = eCSR_BSS_TYPE_ANY; - /*Scan all the channels */ - scan_req.ChannelInfo.numOfChannels = 1; - scan_req.ChannelInfo.ChannelList = - &sme_rrm_ctx->channelList.ChannelList[ - sme_rrm_ctx->currentIndex]; - sme_debug(FL("Duration %d On channel %d "), - scan_req.maxChnTime, - sme_rrm_ctx->channelList.ChannelList[ - sme_rrm_ctx->currentIndex]); /* set requestType to full scan */ - scan_req.requestType = eCSR_SCAN_REQUEST_FULL_SCAN; - status = sme_scan_request(mac_ctx, (uint8_t) session_id, - &scan_req, - &sme_rrm_scan_request_callback, NULL); - if (sme_rrm_ctx->ssId.length) - qdf_mem_free(scan_req.SSIDs.SSIDList); + + req->scan_req.num_chan = 1; + req->scan_req.chan_list[0] = + sme_rrm_ctx->channelList.ChannelList[ + sme_rrm_ctx->currentIndex]; + sme_debug("Duration %d On channel %d ", + req->scan_req.dwell_time_active, + sme_rrm_ctx->channelList.ChannelList[ + sme_rrm_ctx->currentIndex]); + status = ucfg_scan_start(req); + wlan_objmgr_vdev_release_ref(vdev, WLAN_LEGACY_SME_ID); } else if (eSIR_BEACON_TABLE == scan_type) { /* * In beacon table mode, scan results are taken directly from @@ -1456,3 +1494,24 @@ QDF_STATUS rrm_change_default_config_param(tpAniSirGlobal pMac, return QDF_STATUS_SUCCESS; } +QDF_STATUS rrm_start(tpAniSirGlobal mac_ctx) +{ + tpRrmSMEContext smerrmctx = &mac_ctx->rrm.rrmSmeContext; + + /* Register with scan component */ + smerrmctx->req_id = ucfg_scan_register_requester(mac_ctx->psoc, + "RRM", + sme_rrm_scan_event_callback, + smerrmctx); + + return QDF_STATUS_SUCCESS; +} + +QDF_STATUS rrm_stop(tpAniSirGlobal mac_ctx) +{ + tpRrmSMEContext smerrmctx = &mac_ctx->rrm.rrmSmeContext; + + ucfg_scan_unregister_requester(mac_ctx->psoc, smerrmctx->req_id); + + return QDF_STATUS_SUCCESS; +}