qcacld-3.0: get statistics code path cleanup

HDD always sets periodicity=0 and cache=false so all logic
that exists to support these options can be removed from SME/CSR.

Change-Id: Ica9848badd09d14f50c44998ce830568e2b76024
CRs-Fixed: 2063484
This commit is contained in:
Naveen Rawat 2017-06-16 14:19:19 -07:00
commit d0ca44133d
5 changed files with 33 additions and 501 deletions

View file

@ -5006,8 +5006,7 @@ static int __iw_get_bitrate(struct net_device *dev,
SME_SUMMARY_STATS |
SME_GLOBAL_CLASSA_STATS |
SME_GLOBAL_CLASSD_STATS,
hdd_statistics_cb, 0,
false,
hdd_statistics_cb,
pHddStaCtx->conn_info.staId[0],
pAdapter, pAdapter->sessionId);
@ -6165,8 +6164,6 @@ QDF_STATUS wlan_hdd_get_class_astats(hdd_adapter_t *pAdapter)
hstatus = sme_get_statistics(WLAN_HDD_GET_HAL_CTX(pAdapter),
eCSR_HDD, SME_GLOBAL_CLASSA_STATS,
hdd_get_class_a_statistics_cb,
0, /* not periodic */
false, /* non-cached results */
pHddStaCtx->conn_info.staId[0],
cookie, pAdapter->sessionId);
if (QDF_STATUS_SUCCESS != hstatus) {
@ -6283,8 +6280,6 @@ QDF_STATUS wlan_hdd_get_station_stats(hdd_adapter_t *pAdapter)
SME_GLOBAL_CLASSA_STATS |
SME_PER_CHAIN_RSSI_STATS,
hdd_get_station_statistics_cb,
0, /* not periodic */
false, /* non-cached results */
pHddStaCtx->conn_info.staId[0],
cookie,
pAdapter->sessionId);
@ -11930,7 +11925,7 @@ static int __iw_get_statistics(struct net_device *dev,
SME_SUMMARY_STATS |
SME_GLOBAL_CLASSA_STATS |
SME_GLOBAL_CLASSD_STATS,
hdd_statistics_cb, 0, false,
hdd_statistics_cb,
(WLAN_HDD_GET_STATION_CTX_PTR
(pAdapter))->conn_info.staId[0],
pAdapter, pAdapter->sessionId);
@ -11954,7 +11949,7 @@ static int __iw_get_statistics(struct net_device *dev,
SME_SUMMARY_STATS |
SME_GLOBAL_CLASSA_STATS |
SME_GLOBAL_CLASSD_STATS,
NULL, 0, false,
NULL,
(WLAN_HDD_GET_STATION_CTX_PTR
(pAdapter))->conn_info.
staId[0], pAdapter,

View file

@ -768,24 +768,17 @@ typedef struct tagCsrLinkQualityIndInfo {
typedef struct tagCsrPeStatsReqInfo {
tListElem link; /* list links */
uint32_t statsMask;
uint32_t periodicity;
bool rspPending;
qdf_mc_timer_t hPeStatsTimer;
bool timerRunning;
uint8_t staId;
uint8_t numClient;
tpAniSirGlobal pMac;
/* To remember if the peStats timer is stopped successfully or not */
bool timerStopFailed;
uint8_t sessionId;
} tCsrPeStatsReqInfo;
typedef struct tagCsrStatsClientReqInfo {
tListElem link; /* list links */
eCsrStatsRequesterType requesterId;
tCsrStatsCallback callback;
uint32_t periodicity;
void *pContext;
uint32_t statsMask;
tCsrPeStatsReqInfo *pPeStaEntry;
@ -797,9 +790,6 @@ typedef struct tagCsrStatsClientReqInfo {
} tCsrStatsClientReqInfo;
typedef struct tagCsrTlStatsReqInfo {
uint32_t periodicity;
bool timerRunning;
qdf_mc_timer_t hTlStatsTimer;
uint8_t numClient;
} tCsrTlStatsReqInfo;
@ -1209,8 +1199,7 @@ bool csr_is_conn_state_connected_infra_ap(tpAniSirGlobal pMac,
QDF_STATUS csr_get_statistics(tpAniSirGlobal pMac,
eCsrStatsRequesterType requesterId,
uint32_t statsMask, tCsrStatsCallback callback,
uint32_t periodicity, bool cache, uint8_t staId,
void *pContext, uint8_t sessionId);
uint8_t staId, void *pContext, uint8_t sessionId);
QDF_STATUS csr_get_rssi(tpAniSirGlobal pMac, tCsrRssiCallback callback,
uint8_t staId, struct qdf_mac_addr bssId, int8_t lastRSSI,
void *pContext, void *p_cds_context);

View file

@ -348,8 +348,7 @@ QDF_STATUS sme_get_config_param(tHalHandle hHal, tSmeConfigParams *pParam);
QDF_STATUS sme_get_statistics(tHalHandle hHal,
eCsrStatsRequesterType requesterId,
uint32_t statsMask, tCsrStatsCallback callback,
uint32_t periodicity, bool cache, uint8_t staId,
void *pContext, uint8_t sessionId);
uint8_t staId, void *pContext, uint8_t sessionId);
QDF_STATUS sme_get_rssi(tHalHandle hHal,
tCsrRssiCallback callback,
uint8_t staId, struct qdf_mac_addr bssId, int8_t lastRSSI,

View file

@ -4904,9 +4904,6 @@ QDF_STATUS sme_get_snr(tHalHandle hHal,
\param statsMask - The different category/categories of stats requester
is looking for
\param callback - SME sends back the requested stats using the callback
\param periodicity - If requester needs periodic update in millisec, 0 means
it's an one time request
\param cache - If requester is happy with cached stats
\param staId - The station ID for which the stats is requested for
\param pContext - user context to be passed back along with the callback
\param sessionId - sme session interface
@ -4915,20 +4912,16 @@ QDF_STATUS sme_get_snr(tHalHandle hHal,
QDF_STATUS sme_get_statistics(tHalHandle hHal,
eCsrStatsRequesterType requesterId,
uint32_t statsMask, tCsrStatsCallback callback,
uint32_t periodicity, bool cache, uint8_t staId,
void *pContext, uint8_t sessionId)
uint8_t staId, void *pContext, uint8_t sessionId)
{
QDF_STATUS status = QDF_STATUS_E_FAILURE;
tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
MTRACE(qdf_trace(QDF_MODULE_ID_SME,
TRACE_CODE_SME_RX_HDD_GET_STATS, NO_SESSION,
periodicity));
status = sme_acquire_global_lock(&pMac->sme);
if (QDF_IS_STATUS_SUCCESS(status)) {
status =
csr_get_statistics(pMac, requesterId, statsMask, callback,
periodicity, cache, staId, pContext,
csr_get_statistics(pMac, requesterId, statsMask,
callback, staId, pContext,
sessionId);
sme_release_global_lock(&pMac->sme);
}

View file

@ -246,18 +246,9 @@ tCsrStatsClientReqInfo *csr_roam_insert_entry_into_list(tpAniSirGlobal pMac,
tDblLinkList *pStaList,
tCsrStatsClientReqInfo *
pStaEntry);
static void csr_roam_stats_client_timer_handler(void *pv);
tCsrPeStatsReqInfo *csr_roam_check_pe_stats_req_list(tpAniSirGlobal pMac,
uint32_t statsMask,
uint32_t periodicity,
bool *pFound,
uint8_t staId,
uint8_t sessionId);
static void csr_roam_report_statistics(tpAniSirGlobal pMac, uint32_t statsMask,
tCsrStatsCallback callback, uint8_t staId,
void *pContext);
static void csr_roam_tl_stats_timer_handler(void *pv);
static void csr_roam_pe_stats_timer_handler(void *pv);
tListElem *csr_roam_check_client_req_list(tpAniSirGlobal pMac,
uint32_t statsMask);
static void csr_roam_remove_entry_from_pe_stats_req_list(tpAniSirGlobal pMac,
@ -897,8 +888,6 @@ QDF_STATUS csr_start(tpAniSirGlobal pMac)
for (i = 0; i < CSR_ROAM_SESSION_MAX; i++)
status = csr_neighbor_roam_init(pMac, i);
pMac->roam.tlStatsReqInfo.numClient = 0;
pMac->roam.tlStatsReqInfo.periodicity = 0;
pMac->roam.tlStatsReqInfo.timerRunning = false;
/* init the link quality indication also */
pMac->roam.vccLinkQuality = eCSR_ROAM_LINK_QUAL_MIN_IND;
if (!QDF_IS_STATUS_SUCCESS(status)) {
@ -1083,13 +1072,6 @@ static QDF_STATUS csr_roam_open(tpAniSirGlobal pMac)
sme_err("cannot allocate memory for packetdump timer");
break;
}
status = qdf_mc_timer_init(&pMac->roam.tlStatsReqInfo.
hTlStatsTimer, QDF_TIMER_TYPE_SW,
csr_roam_tl_stats_timer_handler, pMac);
if (!QDF_IS_STATUS_SUCCESS(status)) {
sme_err("cannot allocate memory for summary Statistics timer");
return QDF_STATUS_E_FAILURE;
}
} while (0);
return status;
}
@ -1103,8 +1085,6 @@ static QDF_STATUS csr_roam_close(tpAniSirGlobal pMac)
qdf_mc_timer_stop(&pMac->roam.hTimerWaitForKey);
qdf_mc_timer_destroy(&pMac->roam.hTimerWaitForKey);
qdf_mc_timer_stop(&pMac->roam.tlStatsReqInfo.hTlStatsTimer);
qdf_mc_timer_destroy(&pMac->roam.tlStatsReqInfo.hTlStatsTimer);
qdf_mc_timer_stop(&pMac->roam.packetdump_timer);
qdf_mc_timer_destroy(&pMac->roam.packetdump_timer);
return QDF_STATUS_SUCCESS;
@ -16135,109 +16115,6 @@ static void csr_roam_link_down(tpAniSirGlobal pMac, uint32_t sessionId)
}
static void csr_roam_tl_stats_timer_handler(void *pv)
{
tpAniSirGlobal pMac = PMAC_STRUCT(pv);
QDF_STATUS status;
pMac->roam.tlStatsReqInfo.timerRunning = false;
sme_debug("TL stat timer is no-op. It needs to support multiple stations");
if (!pMac->roam.tlStatsReqInfo.timerRunning) {
if (pMac->roam.tlStatsReqInfo.periodicity) {
/* start timer */
status =
qdf_mc_timer_start(&pMac->roam.tlStatsReqInfo.
hTlStatsTimer,
pMac->roam.tlStatsReqInfo.
periodicity);
if (!QDF_IS_STATUS_SUCCESS(status)) {
sme_err("csr_roam_tl_stats_timer_handler:cannot start TlStatsTimer timer");
return;
}
pMac->roam.tlStatsReqInfo.timerRunning = true;
}
}
}
static void csr_roam_pe_stats_timer_handler(void *pv)
{
tCsrPeStatsReqInfo *pPeStatsReqListEntry = (tCsrPeStatsReqInfo *) pv;
QDF_STATUS status;
tpAniSirGlobal pMac = pPeStatsReqListEntry->pMac;
QDF_STATUS qdf_status;
pPeStatsReqListEntry->timerRunning = false;
if (pPeStatsReqListEntry->timerStopFailed == true) {
/* If we entered here, meaning the timer could not be
* successfully stopped in
* csr_roam_remove_entry_from_pe_stats_req_list().
* So do it here.
* Destroy the timer
*/
qdf_status = qdf_mc_timer_destroy(&pPeStatsReqListEntry->
hPeStatsTimer);
if (!QDF_IS_STATUS_SUCCESS(qdf_status))
sme_err("csr_roam_pe_stats_timer_handler:failed to destroy hPeStatsTimer timer");
/* Free the entry */
qdf_mem_free(pPeStatsReqListEntry);
pPeStatsReqListEntry = NULL;
} else {
if (!pPeStatsReqListEntry->rspPending) {
status = csr_send_mb_stats_req_msg(pMac,
pPeStatsReqListEntry->
statsMask & ~(1 <<
eCsrGlobalClassDStats),
pPeStatsReqListEntry->staId,
pPeStatsReqListEntry->
sessionId);
if (!QDF_IS_STATUS_SUCCESS(status))
sme_err("csr_roam_pe_stats_timer_handler:failed to send down stats req to PE");
else
pPeStatsReqListEntry->rspPending = true;
}
/* send down a req */
if (pPeStatsReqListEntry->periodicity &&
(QDF_TIMER_STATE_STOPPED ==
qdf_mc_timer_get_current_state(&pPeStatsReqListEntry->
hPeStatsTimer))) {
if (pPeStatsReqListEntry->periodicity <
pMac->roam.configParam.
statsReqPeriodicityInPS) {
pPeStatsReqListEntry->periodicity =
pMac->roam.configParam.
statsReqPeriodicityInPS;
}
/* start timer */
qdf_status =
qdf_mc_timer_start(&pPeStatsReqListEntry->
hPeStatsTimer,
pPeStatsReqListEntry->
periodicity);
if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
sme_err("csr_roam_pe_stats_timer_handler:cannot start hPeStatsTimer timer");
return;
}
pPeStatsReqListEntry->timerRunning = true;
}
}
}
static void csr_roam_stats_client_timer_handler(void *pv)
{
tCsrStatsClientReqInfo *pStaEntry = (tCsrStatsClientReqInfo *) pv;
if (QDF_TIMER_STATE_STOPPED ==
qdf_mc_timer_get_current_state(&pStaEntry->timer)) {
QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
"roam stats client timer is stopped");
}
}
QDF_STATUS csr_send_mb_stats_req_msg(tpAniSirGlobal pMac, uint32_t statsMask,
uint8_t staId, uint8_t sessionId)
{
@ -16447,8 +16324,6 @@ tListElem *csr_roam_checkn_update_client_req_list(tpAniSirGlobal pMac,
if ((pTempStaEntry->requesterId == pStaEntry->requesterId)
&& (pTempStaEntry->statsMask == pStaEntry->statsMask)) {
if (update) {
pTempStaEntry->periodicity =
pStaEntry->periodicity;
pTempStaEntry->callback = pStaEntry->callback;
pTempStaEntry->pContext = pStaEntry->pContext;
}
@ -16494,8 +16369,9 @@ tCsrStatsClientReqInfo *csr_roam_insert_entry_into_list(tpAniSirGlobal pMac,
pStaEntry)
{
tCsrStatsClientReqInfo *pNewStaEntry = NULL;
/* if same entity requested for same set of stats with different
* periodicity & callback update it
/*
* if same entity requested for same set of stats with different
* callback update it
*/
if (NULL == csr_roam_checkn_update_client_req_list(pMac, pStaEntry,
true)) {
@ -16508,7 +16384,6 @@ tCsrStatsClientReqInfo *csr_roam_insert_entry_into_list(tpAniSirGlobal pMac,
pNewStaEntry->callback = pStaEntry->callback;
pNewStaEntry->pContext = pStaEntry->pContext;
pNewStaEntry->periodicity = pStaEntry->periodicity;
pNewStaEntry->requesterId = pStaEntry->requesterId;
pNewStaEntry->statsMask = pStaEntry->statsMask;
pNewStaEntry->pPeStaEntry = pStaEntry->pPeStaEntry;
@ -16522,34 +16397,6 @@ tCsrStatsClientReqInfo *csr_roam_insert_entry_into_list(tpAniSirGlobal pMac,
return pNewStaEntry;
}
static
tCsrPeStatsReqInfo *csr_roam_insert_entry_into_pe_stats_req_list(
tpAniSirGlobal pMac,
tDblLinkList *pStaList,
tCsrPeStatsReqInfo *
pStaEntry)
{
tCsrPeStatsReqInfo *pNewStaEntry = NULL;
pNewStaEntry = qdf_mem_malloc(sizeof(tCsrPeStatsReqInfo));
if (NULL == pNewStaEntry) {
sme_err("couldn't allocate memory for the entry");
return NULL;
}
pNewStaEntry->hPeStatsTimer = pStaEntry->hPeStatsTimer;
pNewStaEntry->numClient = pStaEntry->numClient;
pNewStaEntry->periodicity = pStaEntry->periodicity;
pNewStaEntry->statsMask = pStaEntry->statsMask;
pNewStaEntry->pMac = pStaEntry->pMac;
pNewStaEntry->staId = pStaEntry->staId;
pNewStaEntry->timerRunning = pStaEntry->timerRunning;
pNewStaEntry->rspPending = pStaEntry->rspPending;
csr_ll_insert_tail(pStaList, &pNewStaEntry->link, LL_ACCESS_LOCK);
return pNewStaEntry;
}
QDF_STATUS csr_get_rssi(tpAniSirGlobal pMac,
tCsrRssiCallback callback,
uint8_t staId,
@ -16671,19 +16518,6 @@ csr_deregister_client_request(tpAniSirGlobal mac_ctx,
}
/* check if we need to stop the tl stats timer too */
mac_ctx->roam.tlStatsReqInfo.numClient--;
if (!mac_ctx->roam.tlStatsReqInfo.numClient) {
if (mac_ctx->roam.tlStatsReqInfo.timerRunning) {
status = qdf_mc_timer_stop(
&mac_ctx->roam.tlStatsReqInfo.hTlStatsTimer);
if (!QDF_IS_STATUS_SUCCESS(status)) {
sme_err(
"cannot stop TlStatsTimer timer");
return status;
}
}
mac_ctx->roam.tlStatsReqInfo.periodicity = 0;
mac_ctx->roam.tlStatsReqInfo.timerRunning = false;
}
qdf_mc_timer_stop(&ptr_sta_entry->timer);
/* Destroy the qdf timer... */
status = qdf_mc_timer_destroy(&ptr_sta_entry->timer);
@ -16699,16 +16533,13 @@ csr_deregister_client_request(tpAniSirGlobal mac_ctx,
* csr_insert_stats_request_to_list() - inserts request to existing list
* @mac_ctx: mac global context
* @sta_entry: stats request entry
* @periodicity: periodicity of stats
*
* Return: status of operation
*/
static QDF_STATUS
csr_insert_stats_request_to_list(tpAniSirGlobal mac_ctx,
tCsrStatsClientReqInfo *sta_entry,
uint32_t periodicity)
tCsrStatsClientReqInfo *sta_entry)
{
QDF_STATUS status = QDF_STATUS_SUCCESS;
tCsrStatsClientReqInfo *ptr_sta_entry = csr_roam_insert_entry_into_list(
mac_ctx, &mac_ctx->roam.statsClientReqList,
sta_entry);
@ -16716,79 +16547,6 @@ csr_insert_stats_request_to_list(tpAniSirGlobal mac_ctx,
sme_err("Failed to insert req in statsClientReqList");
return QDF_STATUS_E_FAILURE;
}
/* Init & start timer if needed */
ptr_sta_entry->periodicity = periodicity;
if (ptr_sta_entry->periodicity) {
status = qdf_mc_timer_init(&ptr_sta_entry->timer,
QDF_TIMER_TYPE_SW,
csr_roam_stats_client_timer_handler,
ptr_sta_entry);
if (!QDF_IS_STATUS_SUCCESS(status)) {
sme_err("cannot init StatsClient timer");
return QDF_STATUS_E_FAILURE;
}
status = qdf_mc_timer_start(&ptr_sta_entry->timer,
ptr_sta_entry->periodicity);
if (!QDF_IS_STATUS_SUCCESS(status)) {
sme_err("cannot start StatsClient timer");
return QDF_STATUS_E_FAILURE;
}
}
return status;
}
/**
* csr_get_statistics_from_tl() - fetch stats from tl layer
* @mac_ctx: mac global context
* @cache: indicate if cached stats are required
* @staId: station id
* @periodicity: periodicity of stats
*
* Return: status of operation
*/
static QDF_STATUS
csr_get_statistics_from_tl(tpAniSirGlobal mac_ctx,
bool cache,
uint8_t staId,
uint32_t periodicity)
{
QDF_STATUS status;
if (cache && mac_ctx->roam.tlStatsReqInfo.numClient) {
sme_err("Looking for cached stats from TL");
mac_ctx->roam.tlStatsReqInfo.numClient++;
return QDF_STATUS_SUCCESS;
}
/* update periodicity */
if (mac_ctx->roam.tlStatsReqInfo.periodicity)
mac_ctx->roam.tlStatsReqInfo.periodicity =
QDF_MIN(periodicity,
mac_ctx->roam.tlStatsReqInfo.periodicity);
else
mac_ctx->roam.tlStatsReqInfo.periodicity = periodicity;
if (mac_ctx->roam.tlStatsReqInfo.periodicity
< CSR_MIN_TL_STAT_QUERY_PERIOD) {
mac_ctx->roam.tlStatsReqInfo.periodicity =
CSR_MIN_TL_STAT_QUERY_PERIOD;
}
if (!mac_ctx->roam.tlStatsReqInfo.timerRunning) {
if (mac_ctx->roam.tlStatsReqInfo.periodicity) {
/* start timer */
status = qdf_mc_timer_start(
&mac_ctx->roam.tlStatsReqInfo.hTlStatsTimer,
mac_ctx->roam.tlStatsReqInfo.periodicity);
if (!QDF_IS_STATUS_SUCCESS(status)) {
sme_err("cannot start TlStatsTimer timer");
return QDF_STATUS_E_FAILURE;
}
mac_ctx->roam.tlStatsReqInfo.timerRunning = true;
}
}
mac_ctx->roam.tlStatsReqInfo.numClient++;
return QDF_STATUS_SUCCESS;
}
@ -16796,15 +16554,11 @@ QDF_STATUS csr_get_statistics(tpAniSirGlobal pMac,
eCsrStatsRequesterType requesterId,
uint32_t statsMask,
tCsrStatsCallback callback,
uint32_t periodicity,
bool cache,
uint8_t staId,
void *pContext,
uint8_t sessionId)
{
tCsrStatsClientReqInfo staEntry;
tCsrPeStatsReqInfo *pPeStaEntry = NULL;
bool found = false;
QDF_STATUS status = QDF_STATUS_SUCCESS;
bool insertInClientList = false;
uint32_t temp_mask = 0;
@ -16828,77 +16582,38 @@ QDF_STATUS csr_get_statistics(tpAniSirGlobal pMac,
if ((statsMask) && (!callback))
return csr_deregister_client_request(pMac, &staEntry);
if (cache && !periodicity) {
/* return the cached stats */
csr_roam_report_statistics(pMac, statsMask, callback, staId,
pContext);
return QDF_STATUS_SUCCESS;
}
/* add the request in the client req list */
staEntry.callback = callback;
staEntry.pContext = pContext;
staEntry.periodicity = periodicity;
staEntry.pPeStaEntry = NULL;
staEntry.staId = staId;
staEntry.pMac = pMac;
staEntry.timerExpired = false;
staEntry.sessionId = sessionId;
/* if periodic report requested with non cached result from PE/TL */
if (periodicity) {
/* if looking for stats from PE */
temp_mask = statsMask & ~(1 << eCsrGlobalClassDStats);
if (temp_mask) {
/* check if same req made already & waiting for rsp */
pPeStaEntry = csr_roam_check_pe_stats_req_list(pMac,
temp_mask, periodicity, &found,
staId, sessionId);
if (!pPeStaEntry)
/* bail out, maxed out on num of req for PE */
return QDF_STATUS_E_FAILURE;
staEntry.pPeStaEntry = pPeStaEntry;
}
temp_mask = statsMask & ~(1 << eCsrGlobalClassDStats);
if (temp_mask) {
/* send down a req */
status = csr_send_mb_stats_req_msg(pMac,
temp_mask, staId, sessionId);
if (!QDF_IS_STATUS_SUCCESS(status))
sme_err("failed to send down stats req");
/*
* request stats from TL rightaway if requested by client,
* update tlStatsReqInfo if needed
* so that when the stats rsp comes back from PE we
* respond to upper layer right away
*/
temp_mask = statsMask & (1 << eCsrGlobalClassDStats);
if (temp_mask) {
status = csr_get_statistics_from_tl(pMac, cache, staId,
periodicity);
if (!QDF_IS_STATUS_SUCCESS(status))
return status;
}
staEntry.timerExpired = true;
insertInClientList = true;
}
/* if one time report requested with non cached result from PE/TL */
else if (!cache && !periodicity) {
temp_mask = statsMask & ~(1 << eCsrGlobalClassDStats);
if (temp_mask) {
/* send down a req */
status = csr_send_mb_stats_req_msg(pMac,
temp_mask, staId, sessionId);
if (!QDF_IS_STATUS_SUCCESS(status))
sme_err(
"failed to send down stats req");
/*
* so that when the stats rsp comes back from PE we
* respond to upper layer right away
*/
staEntry.timerExpired = true;
insertInClientList = true;
}
/* if looking for stats from TL only */
if (!insertInClientList) {
/* return the stats */
csr_roam_report_statistics(pMac, statsMask, callback,
staId, pContext);
return QDF_STATUS_SUCCESS;
}
/* if looking for stats from TL only */
if (!insertInClientList) {
/* return the stats */
csr_roam_report_statistics(pMac, statsMask, callback,
staId, pContext);
return QDF_STATUS_SUCCESS;
}
if (insertInClientList)
return csr_insert_stats_request_to_list(pMac, &staEntry,
periodicity);
return csr_insert_stats_request_to_list(pMac, &staEntry);
return QDF_STATUS_SUCCESS;
}
@ -18168,102 +17883,6 @@ QDF_STATUS csr_roam_offload_scan_rsp_hdlr(tpAniSirGlobal pMac,
}
#endif
tCsrPeStatsReqInfo *csr_roam_check_pe_stats_req_list(tpAniSirGlobal pMac,
uint32_t statsMask,
uint32_t periodicity,
bool *pFound,
uint8_t staId,
uint8_t sessionId)
{
bool found = false;
QDF_STATUS status = QDF_STATUS_SUCCESS;
tCsrPeStatsReqInfo staEntry;
tCsrPeStatsReqInfo *pTempStaEntry = NULL;
tListElem *pStaEntry = NULL;
QDF_STATUS qdf_status;
*pFound = false;
pStaEntry = csr_roam_find_in_pe_stats_req_list(pMac, statsMask);
if (pStaEntry) {
pTempStaEntry =
GET_BASE_ADDR(pStaEntry, tCsrPeStatsReqInfo, link);
if (pTempStaEntry->periodicity) {
pTempStaEntry->periodicity =
QDF_MIN(periodicity,
pTempStaEntry->periodicity);
} else {
pTempStaEntry->periodicity = periodicity;
}
pTempStaEntry->numClient++;
found = true;
} else {
qdf_mem_set(&staEntry, sizeof(tCsrPeStatsReqInfo), 0);
staEntry.numClient = 1;
staEntry.periodicity = periodicity;
staEntry.pMac = pMac;
staEntry.rspPending = false;
staEntry.staId = staId;
staEntry.statsMask = statsMask;
staEntry.timerRunning = false;
staEntry.sessionId = sessionId;
pTempStaEntry = csr_roam_insert_entry_into_pe_stats_req_list(
pMac,
&pMac->roam.
peStatsReqList,
&staEntry);
if (!pTempStaEntry) {
sme_err(
"Failed to insert req in peStatsReqList");
return NULL;
}
}
pTempStaEntry->periodicity =
pMac->roam.configParam.statsReqPeriodicityInPS;
if (!pTempStaEntry->timerRunning) {
/* send down a req in case of one time req, for periodic ones
* wait for timer to expire
*/
if (!pTempStaEntry->rspPending && !pTempStaEntry->periodicity) {
status = csr_send_mb_stats_req_msg(pMac,
statsMask & ~(1 <<
eCsrGlobalClassDStats),
staId, sessionId);
if (!QDF_IS_STATUS_SUCCESS(status))
sme_err("csr_roam_check_pe_stats_req_list:failed to send down stats req to PE");
else
pTempStaEntry->rspPending = true;
}
if (pTempStaEntry->periodicity) {
if (!found) {
qdf_status = qdf_mc_timer_init(&pTempStaEntry->
hPeStatsTimer,
QDF_TIMER_TYPE_SW,
csr_roam_pe_stats_timer_handler,
pTempStaEntry);
if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
sme_err("csr_roam_check_pe_stats_req_list:cannot init hPeStatsTimer timer");
return NULL;
}
}
/* start timer */
sme_debug("csr_roam_check_pe_stats_req_list:peStatsTimer period %d",
pTempStaEntry->periodicity);
qdf_status = qdf_mc_timer_start(&pTempStaEntry->
hPeStatsTimer,
pTempStaEntry->periodicity);
if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
sme_err("csr_roam_check_pe_stats_req_list:cannot start hPeStatsTimer timer");
return NULL;
}
pTempStaEntry->timerRunning = true;
}
}
*pFound = found;
return pTempStaEntry;
}
/* pStaEntry is no longer invalid upon the return of this function. */
static void csr_roam_remove_stat_list_entry(tpAniSirGlobal pMac,
tListElem *pEntry)
@ -18281,7 +17900,6 @@ static void csr_roam_remove_entry_from_pe_stats_req_list(tpAniSirGlobal pMac,
{
tListElem *pEntry;
tCsrPeStatsReqInfo *pTempStaEntry;
QDF_STATUS qdf_status;
pEntry = csr_ll_peek_head(&pMac->roam.peStatsReqList, LL_ACCESS_LOCK);
if (!pEntry) {
@ -18298,42 +17916,10 @@ static void csr_roam_remove_entry_from_pe_stats_req_list(tpAniSirGlobal pMac,
continue;
}
sme_debug("Match found");
if (pTempStaEntry->timerRunning) {
qdf_status = qdf_mc_timer_stop(
&pTempStaEntry->hPeStatsTimer);
/*
* If we are not able to stop the timer here, just
* remove the entry from the linked list. Destroy the
* timer object and free the memory in the timer CB
*/
if (qdf_status == QDF_STATUS_SUCCESS) {
/* the timer is successfully stopped */
pTempStaEntry->timerRunning = false;
/* Destroy the timer */
qdf_status = qdf_mc_timer_destroy(
&pTempStaEntry->hPeStatsTimer);
} else {
/*
* the timer could not be stopped. Hence destroy
* and free the memory for the PE stat entry in
* the timer CB.
*/
pTempStaEntry->timerStopFailed = true;
}
if (!QDF_IS_STATUS_SUCCESS(qdf_status))
sme_err("failed to stop/destroy timer");
}
if (csr_ll_remove_entry(&pMac->roam.peStatsReqList, pEntry,
LL_ACCESS_LOCK)) {
/*
* Only free the memory if we could stop the timer
* successfully
*/
if (!pTempStaEntry->timerStopFailed) {
qdf_mem_free(pTempStaEntry);
pTempStaEntry = NULL;
}
qdf_mem_free(pTempStaEntry);
pTempStaEntry = NULL;
break;
}
pEntry = csr_ll_next(&pMac->roam.peStatsReqList, pEntry,
@ -18417,7 +18003,6 @@ static QDF_STATUS csr_roam_dereg_statistics_req(tpAniSirGlobal pMac)
tListElem *pPrevEntry = NULL;
tCsrStatsClientReqInfo *pTempStaEntry = NULL;
QDF_STATUS status = QDF_STATUS_SUCCESS;
QDF_STATUS qdf_status;
pEntry = csr_ll_peek_head(&pMac->roam.statsClientReqList,
LL_ACCESS_LOCK);
@ -18456,38 +18041,9 @@ static QDF_STATUS csr_roam_dereg_statistics_req(tpAniSirGlobal pMac)
}
/* check if we need to stop the tl stats timer too */
pMac->roam.tlStatsReqInfo.numClient--;
if (!pMac->roam.tlStatsReqInfo.numClient) {
if (pMac->roam.tlStatsReqInfo.timerRunning) {
status =
qdf_mc_timer_stop(&pMac->roam.
tlStatsReqInfo.
hTlStatsTimer);
if (!QDF_IS_STATUS_SUCCESS(status))
sme_err("csr_roam_dereg_statistics_req:cannot stop TlStatsTimer timer");
/* we will continue */
}
pMac->roam.tlStatsReqInfo.periodicity = 0;
pMac->roam.tlStatsReqInfo.timerRunning = false;
}
if (pTempStaEntry->periodicity) {
/* While creating StaEntry in csr_get_statistics,
* Initializing and starting timer only when periodicity
* is set. So Stop and Destroy timer only when
* periodicity is set.
*/
qdf_mc_timer_stop(&pTempStaEntry->timer);
/* Destroy the qdf timer... */
qdf_status =
qdf_mc_timer_destroy(&pTempStaEntry->timer);
if (!QDF_IS_STATUS_SUCCESS(qdf_status))
sme_err("csr_roam_dereg_statistics_req:failed to destroy Client req timer");
}
pPrevEntry = pEntry;
pEntry =
csr_ll_next(&pMac->roam.statsClientReqList, pEntry,
LL_ACCESS_NOLOCK);
pEntry = csr_ll_next(&pMac->roam.statsClientReqList, pEntry,
LL_ACCESS_NOLOCK);
}
/* the last one */
if (pPrevEntry) {