wlan: WDA: Link Layer Statistics Implementation.
This commit introduces the link layer statistics implementation
in WDA/WDI layers.
Change-Id: I2ea3b3b4ac6be362507de4e1c19731de41362d5f
CRs-Fixed: 665003
diff --git a/CORE/MAC/src/include/sirParams.h b/CORE/MAC/src/include/sirParams.h
index 6002b4a..291403f 100644
--- a/CORE/MAC/src/include/sirParams.h
+++ b/CORE/MAC/src/include/sirParams.h
@@ -631,6 +631,13 @@
#define SIR_HAL_BCN_MISS_RATE_REQ (SIR_HAL_ITC_MSG_TYPES_BEGIN + 229)
+#ifdef WLAN_FEATURE_LINK_LAYER_STATS
+#define SIR_HAL_LL_STATS_CLEAR_REQ (SIR_HAL_ITC_MSG_TYPES_BEGIN + 232)
+#define SIR_HAL_LL_STATS_SET_REQ (SIR_HAL_ITC_MSG_TYPES_BEGIN + 233)
+#define SIR_HAL_LL_STATS_GET_REQ (SIR_HAL_ITC_MSG_TYPES_BEGIN + 234)
+#define SIR_HAL_LL_STATS_RESULTS_RSP (SIR_HAL_ITC_MSG_TYPES_BEGIN + 235)
+#endif
+
#define SIR_HAL_MSG_TYPES_END (SIR_HAL_MSG_TYPES_BEGIN + 0x1FF)
// CFG message types
#define SIR_CFG_MSG_TYPES_BEGIN (SIR_CFG_MODULE_ID << 8)
diff --git a/CORE/SME/inc/smeInternal.h b/CORE/SME/inc/smeInternal.h
index d12af0c..412493b 100644
--- a/CORE/SME/inc/smeInternal.h
+++ b/CORE/SME/inc/smeInternal.h
@@ -144,6 +144,14 @@
#ifdef FEATURE_WLAN_CH_AVOID
void (*pChAvoidNotificationCb) (void *pAdapter, void *indParam);
#endif /* FEATURE_WLAN_CH_AVOID */
+
+#ifdef WLAN_FEATURE_LINK_LAYER_STATS
+ /* HDD callback to be called after receiving Link Layer Stats Results IND from FW */
+ void(*pLinkLayerStatsIndCallback)(void *callbackContext,
+ int indType, void *pRsp);
+ void *pLinkLayerStatsCallbackContext;
+#endif
+
} tSmeStruct, *tpSmeStruct;
diff --git a/CORE/WDA/inc/wlan_qct_wda.h b/CORE/WDA/inc/wlan_qct_wda.h
index 9ebc910..24d71d9 100644
--- a/CORE/WDA/inc/wlan_qct_wda.h
+++ b/CORE/WDA/inc/wlan_qct_wda.h
@@ -1201,6 +1201,13 @@
#define WDA_GET_BCN_MISS_RATE_REQ SIR_HAL_BCN_MISS_RATE_REQ
+#ifdef WLAN_FEATURE_LINK_LAYER_STATS
+#define WDA_LINK_LAYER_STATS_CLEAR_REQ SIR_HAL_LL_STATS_CLEAR_REQ
+#define WDA_LINK_LAYER_STATS_SET_REQ SIR_HAL_LL_STATS_SET_REQ
+#define WDA_LINK_LAYER_STATS_GET_REQ SIR_HAL_LL_STATS_GET_REQ
+#define WDA_LINK_LAYER_STATS_RESULTS_RSP SIR_HAL_LL_STATS_RESULTS_RSP
+#endif /* WLAN_FEATURE_LINK_LAYER_STATS */
+
tSirRetStatus wdaPostCtrlMsg(tpAniSirGlobal pMac, tSirMsgQ *pMsg);
eHalStatus WDA_SetRegDomain(void * clientCtxt, v_REGDOMAIN_t regId,
@@ -1997,5 +2004,4 @@
===========================================================================*/
void WDA_SetEnableSSR(v_BOOL_t enableSSR);
-
#endif
diff --git a/CORE/WDA/src/wlan_qct_wda.c b/CORE/WDA/src/wlan_qct_wda.c
index bfd3045..b3d79a0 100644
--- a/CORE/WDA/src/wlan_qct_wda.c
+++ b/CORE/WDA/src/wlan_qct_wda.c
@@ -222,6 +222,17 @@
VOS_STATUS WDA_ProcessLPHBConfReq(tWDA_CbContext *pWDA,
tSirLPHBReq *pData);
#endif /* FEATURE_WLAN_LPHB */
+
+#ifdef WLAN_FEATURE_LINK_LAYER_STATS
+VOS_STATUS WDA_ProcessLLStatsSetReq(tWDA_CbContext *pWDA,
+ tSirLLStatsSetReq *wdaRequest);
+
+VOS_STATUS WDA_ProcessLLStatsGetReq(tWDA_CbContext *pWDA,
+ tSirLLStatsGetReq *wdaRequest);
+
+VOS_STATUS WDA_ProcessLLStatsClearReq(tWDA_CbContext *pWDA,
+ tSirLLStatsClearReq *wdaRequest);
+#endif /* WLAN_FEATURE_LINK_LAYER_STATS */
/*
* FUNCTION: WDA_open
* Allocate the WDA context
@@ -12531,6 +12542,23 @@
WDA_ProcessBtAmpEventReq(pWDA, (tSmeBtAmpEvent *)pMsg->bodyptr);
break;
}
+#ifdef WLAN_FEATURE_LINK_LAYER_STATS
+ case WDA_LINK_LAYER_STATS_SET_REQ:
+ {
+ WDA_ProcessLLStatsSetReq(pWDA, (tSirLLStatsSetReq *)pMsg->bodyptr);
+ break;
+ }
+ case WDA_LINK_LAYER_STATS_GET_REQ:
+ {
+ WDA_ProcessLLStatsGetReq(pWDA, (tSirLLStatsGetReq *)pMsg->bodyptr);
+ break;
+ }
+ case WDA_LINK_LAYER_STATS_CLEAR_REQ:
+ {
+ WDA_ProcessLLStatsClearReq(pWDA, (tSirLLStatsClearReq *)pMsg->bodyptr);
+ break;
+ }
+#endif /* WLAN_FEATURE_LINK_LAYER_STATS */
#ifdef WDA_UT
case WDA_WDI_EVENT_MSG:
{
@@ -13383,7 +13411,7 @@
"Received WDI_BATCHSCAN_RESULT_IND from FW");
/*sanity check*/
- if(NULL == pWDA)
+ if (NULL == pWDA)
{
VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
"%s:pWDA is NULL", __func__);
@@ -13467,6 +13495,62 @@
}
#endif /* FEATURE_WLAN_CH_AVOID */
+#ifdef WLAN_FEATURE_LINK_LAYER_STATS
+ case WDI_LL_STATS_RESULTS_IND:
+ {
+ void *pLinkLayerStatsInd;
+ void *pCallbackContext;
+ tpAniSirGlobal pMac;
+
+ VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
+ "Received WDI_LL_STATS_RESULTS_IND from FW");
+
+ /*sanity check*/
+ if (NULL == pWDA)
+ {
+ VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
+ "%s:pWDA is NULL", __func__);
+ VOS_ASSERT(0);
+ return;
+ }
+
+ pLinkLayerStatsInd =
+ (void *)wdiLowLevelInd->wdiIndicationData.pLinkLayerStatsResults;
+ if (NULL == pLinkLayerStatsInd)
+ {
+ VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
+ "%s:Link Layer Statistics from FW is null can't invoke HDD callback",
+ __func__);
+ VOS_ASSERT(0);
+ return;
+ }
+
+ pMac = (tpAniSirGlobal )VOS_GET_MAC_CTXT(pWDA->pVosContext);
+ if (NULL == pMac)
+ {
+ VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
+ "%s:pMac is NULL", __func__);
+ VOS_ASSERT(0);
+ return;
+ }
+
+ pCallbackContext = pMac->sme.pLinkLayerStatsCallbackContext;
+ /*call hdd callback with Link Layer Statistics*/
+ if (pMac->sme.pLinkLayerStatsIndCallback)
+ {
+ pMac->sme.pLinkLayerStatsIndCallback(pCallbackContext,
+ WDA_LINK_LAYER_STATS_RESULTS_RSP,
+ pLinkLayerStatsInd);
+ }
+ else
+ {
+ VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
+ "%s:HDD callback is null", __func__);
+ }
+ break;
+ }
+#endif /* WLAN_FEATURE_LINK_LAYER_STATS */
+
default:
{
/* TODO error */
@@ -15958,3 +16042,252 @@
}
vos_mem_free(pData);
}
+#ifdef WLAN_FEATURE_LINK_LAYER_STATS
+
+/*==========================================================================
+ FUNCTION WDA_LLStatsSetRspCallback
+
+ DESCRIPTION
+ API to process set link layer statistics response from FW
+
+ PARAMETERS
+ pRsp: Pointer to set link layer statistics response
+ pUserData: Pointer to user data
+
+ RETURN VALUE
+ NONE
+
+===========================================================================*/
+void WDA_LLStatsSetRspCallback(void *pEventData, void* pUserData)
+{
+ tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
+
+
+ if (NULL == pWdaParams)
+ {
+ VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
+ "%s: pWdaParams received NULL", __func__);
+ VOS_ASSERT(0) ;
+ return ;
+ }
+
+ /* Do not need to send notification to upper layer
+ * Just free allocated resources */
+ if (pWdaParams->wdaWdiApiMsgParam != NULL)
+ {
+ vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
+ }
+ if (pWdaParams->wdaMsgParam != NULL)
+ {
+ vos_mem_free(pWdaParams->wdaMsgParam);
+ }
+ vos_mem_free(pWdaParams) ;
+
+ return;
+}
+
+/*==========================================================================
+ FUNCTION WDA_ProcessLLStatsSetReq
+
+ DESCRIPTION
+ API to send Set Link Layer Stats request to WDI
+
+ PARAMETERS
+ pWDA: Pointer to WDA context
+ wdaRequest: Pointer to set Link Layer Stats req parameters
+===========================================================================*/
+VOS_STATUS WDA_ProcessLLStatsSetReq(tWDA_CbContext *pWDA,
+ tSirLLStatsSetReq *wdaRequest)
+{
+ WDI_Status status = WDI_STATUS_SUCCESS;
+ tWDA_ReqParams *pWdaParams;
+
+ pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams));
+ if (NULL == pWdaParams)
+ {
+ VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
+ "%s: VOS MEM Alloc Failure", __func__);
+ VOS_ASSERT(0);
+ return VOS_STATUS_E_NOMEM;
+ }
+ pWdaParams->pWdaContext = pWDA;
+ pWdaParams->wdaMsgParam = wdaRequest;
+ pWdaParams->wdaWdiApiMsgParam = NULL;
+
+ status = WDI_LLStatsSetReq((void *)wdaRequest,
+ (WDI_LLStatsSetRspCb)WDA_LLStatsSetRspCallback,
+ (void *)pWdaParams);
+ if (IS_WDI_STATUS_FAILURE(status))
+ {
+ VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
+ "Failure to request. Free all the memory " );
+ vos_mem_free(pWdaParams->wdaMsgParam);
+ vos_mem_free(pWdaParams);
+ }
+ return CONVERT_WDI2VOS_STATUS(status);
+}
+
+/*==========================================================================
+ FUNCTION WDA_LLStatsGetRspCallback
+
+ DESCRIPTION
+ API to process get link layer statistics response from FW
+
+ PARAMETERS
+ pRsp: Pointer to get link layer statistics response
+ pUserData: Pointer to user data
+
+ RETURN VALUE
+ NONE
+
+===========================================================================*/
+void WDA_LLStatsGetRspCallback(void *pEventData, void* pUserData)
+{
+ tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
+
+ if (NULL == pWdaParams)
+ {
+ VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
+ "%s: pWdaParams received NULL", __func__);
+ VOS_ASSERT(0) ;
+ return ;
+ }
+
+ /* Do not need to send notification to upper layer
+ * Just free allocated resources */
+ if (pWdaParams->wdaWdiApiMsgParam != NULL)
+ {
+ vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
+ }
+ if (pWdaParams->wdaMsgParam != NULL)
+ {
+ vos_mem_free(pWdaParams->wdaMsgParam);
+ }
+ vos_mem_free(pWdaParams) ;
+
+ return;
+}
+
+/*==========================================================================
+ FUNCTION WDA_ProcessLLStatsGetReq
+
+ DESCRIPTION
+ API to send Get Link Layer Stats request to WDI
+
+ PARAMETERS
+ pWDA: Pointer to WDA context
+ wdaRequest: Pointer to get Link Layer Stats req parameters
+===========================================================================*/
+VOS_STATUS WDA_ProcessLLStatsGetReq(tWDA_CbContext *pWDA,
+ tSirLLStatsGetReq *wdaRequest)
+{
+ WDI_Status status = WDI_STATUS_SUCCESS;
+ tWDA_ReqParams *pWdaParams;
+
+ pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams));
+ if (NULL == pWdaParams)
+ {
+ VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
+ "%s: VOS MEM Alloc Failure", __func__);
+ VOS_ASSERT(0);
+ return VOS_STATUS_E_NOMEM;
+ }
+ pWdaParams->pWdaContext = pWDA;
+ pWdaParams->wdaMsgParam = wdaRequest;
+ pWdaParams->wdaWdiApiMsgParam = NULL;
+
+ status = WDI_LLStatsGetReq((void *) wdaRequest,
+ (WDI_LLStatsGetRspCb)WDA_LLStatsGetRspCallback,
+ (void *)pWdaParams);
+ if (IS_WDI_STATUS_FAILURE(status))
+ {
+ VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
+ "Failure to request. Free all the memory " );
+ vos_mem_free(pWdaParams->wdaMsgParam);
+ vos_mem_free(pWdaParams);
+ }
+ return CONVERT_WDI2VOS_STATUS(status);
+}
+
+/*==========================================================================
+ FUNCTION WDA_LLStatsClearRspCallback
+
+ DESCRIPTION
+ API to process clear link layer statistics response from FW
+
+ PARAMETERS
+ pRsp: Pointer to clear link layer statistics response
+ pUserData: Pointer to user data
+
+ RETURN VALUE
+ NONE
+
+===========================================================================*/
+void WDA_LLStatsClearRspCallback(void *pEventData, void* pUserData)
+{
+ tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
+
+
+ if (NULL == pWdaParams)
+ {
+ VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
+ "%s: pWdaParams received NULL", __func__);
+ VOS_ASSERT(0) ;
+ return ;
+ }
+ /* Do not need to send notification to upper layer
+ * Just free allocated resources */
+ if (pWdaParams->wdaWdiApiMsgParam != NULL)
+ {
+ vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
+ }
+ if (pWdaParams->wdaMsgParam != NULL)
+ {
+ vos_mem_free(pWdaParams->wdaMsgParam);
+ }
+ vos_mem_free(pWdaParams) ;
+ return;
+}
+
+/*==========================================================================
+ FUNCTION WDA_ProcessLLStatsClearReq
+
+ DESCRIPTION
+ API to send Clear Link Layer Stats request to WDI
+
+ PARAMETERS
+ pWDA: Pointer to WDA context
+ wdaRequest: Pointer to earLink Layer Stats req
+===========================================================================*/
+VOS_STATUS WDA_ProcessLLStatsClearReq(tWDA_CbContext *pWDA,
+ tSirLLStatsClearReq *wdaRequest)
+{
+ WDI_Status status = WDI_STATUS_SUCCESS;
+ tWDA_ReqParams *pWdaParams;
+
+ pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams));
+ if (NULL == pWdaParams)
+ {
+ VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
+ "%s: VOS MEM Alloc Failure", __func__);
+ VOS_ASSERT(0);
+ return VOS_STATUS_E_NOMEM;
+ }
+ pWdaParams->pWdaContext = pWDA;
+ pWdaParams->wdaMsgParam = wdaRequest;
+ pWdaParams->wdaWdiApiMsgParam = NULL;
+
+ status = WDI_LLStatsClearReq((void *) wdaRequest,
+ (WDI_LLStatsClearRspCb)WDA_LLStatsClearRspCallback,
+ (void *)pWdaParams);
+ if (IS_WDI_STATUS_FAILURE(status))
+ {
+ VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
+ "Failure to request. Free all the memory " );
+ vos_mem_free(pWdaParams->wdaMsgParam);
+ vos_mem_free(pWdaParams);
+ }
+ return CONVERT_WDI2VOS_STATUS(status);
+}
+
+#endif /* WLAN_FEATURE_LINK_LAYER_STATS */
diff --git a/CORE/WDI/CP/inc/wlan_qct_wdi.h b/CORE/WDI/CP/inc/wlan_qct_wdi.h
index 539bfcd..45b2f79 100644
--- a/CORE/WDI/CP/inc/wlan_qct_wdi.h
+++ b/CORE/WDI/CP/inc/wlan_qct_wdi.h
@@ -402,6 +402,9 @@
#ifdef FEATURE_WLAN_CH_AVOID
WDI_CH_AVOID_IND,
#endif /* FEATURE_WLAN_CH_AVOID */
+#ifdef WLAN_FEATURE_LINK_LAYER_STATS
+ WDI_LL_STATS_RESULTS_IND,
+#endif
WDI_MAX_IND
}WDI_LowLevelIndEnumType;
@@ -881,6 +884,11 @@
#ifdef FEATURE_WLAN_CH_AVOID
WDI_ChAvoidIndType wdiChAvoidInd;
#endif /* FEATURE_WLAN_CH_AVOID */
+
+#ifdef WLAN_FEATURE_LINK_LAYER_STATS
+ /*Link Layer Statistics from FW*/
+ void *pLinkLayerStatsResults;
+#endif
} wdiIndicationData;
}WDI_LowLevelIndType;
@@ -5606,6 +5614,32 @@
void* pUserData;
} WDI_DelPeriodicTxPtrnParamsType;
+#ifdef WLAN_FEATURE_LINK_LAYER_STATS
+typedef struct
+{
+ wpt_uint32 reqId;
+ wpt_uint8 staId;
+ wpt_uint32 mpduSizeThreshold;
+ wpt_uint32 aggressiveStatisticsGathering;
+}WDI_LLStatsSetReqType;
+
+typedef struct
+{
+ wpt_uint32 reqId;
+ wpt_uint8 staId;
+ wpt_uint32 paramIdMask;
+}WDI_LLStatsGetReqType;
+
+typedef struct
+{
+ wpt_uint32 reqId;
+ wpt_uint8 staId;
+ wpt_uint32 statsClearReqMask;
+ wpt_uint8 stopReq;
+}WDI_LLStatsClearReqType;
+#endif /* WLAN_FEATURE_LINK_LAYER_STATS */
+
+
/*----------------------------------------------------------------------------
* WDI callback types
*--------------------------------------------------------------------------*/
@@ -7464,6 +7498,15 @@
typedef void (*WDI_GetBcnMissRateCb)(wpt_uint8 status, wpt_uint32 bcnMissRate,
void* pUserData);
+
+#ifdef WLAN_FEATURE_LINK_LAYER_STATS
+typedef void (*WDI_LLStatsSetRspCb)(void *pEventData,
+ void *pUserData);
+typedef void (*WDI_LLStatsGetRspCb)(void *pEventData,
+ void *pUserData);
+typedef void (*WDI_LLStatsClearRspCb)(void *pEventData,
+ void *pUserData);
+#endif /* WLAN_FEATURE_LINK_LAYER_STATS */
/*========================================================================
* Function Declarations and Documentation
==========================================================================*/
@@ -10527,6 +10570,59 @@
);
#endif /* FEATURE_WLAN_LPHB */
+#ifdef WLAN_FEATURE_LINK_LAYER_STATS
+/**
+ @brief WDI_LLStatsSetReq
+ This API is called to send set link layer stats request to FW
+
+ @param pwdiLLStatsSetReqParams : pointer to set link layer stats params
+ wdiLLStatsSetRspCb : set link layer stats response callback
+ usrData : Client context
+ @see
+ @return SUCCESS or FAIL
+*/
+WDI_Status WDI_LLStatsSetReq
+(
+ WDI_LLStatsSetReqType* pwdiLLStatsSetReqParams,
+ WDI_LLStatsSetRspCb wdiLLStatsSetRspCb,
+ void* pUserData
+);
+
+/**
+ @brief WDI_LLStatsGetReq
+ This API is called to send get link layer stats request in FW
+
+ @param pwdiLLStatsGetParams : pointer to get link layer stats params
+ wdiLLStatsGetRspCb : get link layer stats response callback
+ usrData : Client context
+ @see
+ @return SUCCESS or FAIL
+*/
+WDI_Status WDI_LLStatsGetReq
+(
+ WDI_LLStatsGetReqType* pwdiLLStatsGetReqParams,
+ WDI_LLStatsGetRspCb wdiLLStatsGetRspCb,
+ void* pUserData
+);
+
+/**
+ @brief WDI_LLStatsClearReq
+ This API is called to set clear link layer stats request in FW
+
+ @param pwdiLLStatsClearReqParams : pointer to clear link layer stats params
+ iwdiLLStatsClearRspCb : clear link layer stats response callback
+ usrData : Client context
+ @see
+ @return SUCCESS or FAIL
+*/
+WDI_Status WDI_LLStatsClearReq
+(
+ WDI_LLStatsClearReqType* pwdiLLStatsClearReqParams,
+ WDI_LLStatsClearRspCb wdiLLStatsClearRspCb,
+ void* pUserData
+);
+#endif /* WLAN_FEATURE_LINK_LAYER_STATS */
+
#ifdef FEATURE_WLAN_BATCH_SCAN
/**
@brief WDI_SetBatchScanReq
diff --git a/CORE/WDI/CP/inc/wlan_qct_wdi_i.h b/CORE/WDI/CP/inc/wlan_qct_wdi_i.h
index 316165c..efb5f9a 100644
--- a/CORE/WDI/CP/inc/wlan_qct_wdi_i.h
+++ b/CORE/WDI/CP/inc/wlan_qct_wdi_i.h
@@ -445,6 +445,12 @@
WDI_GET_BCN_MISS_RATE_REQ = 89,
+#ifdef WLAN_FEATURE_LINK_LAYER_STATS
+ WDI_LL_STATS_SET_REQ = 90,
+ WDI_LL_STATS_GET_REQ = 91,
+ WDI_LL_STATS_CLEAR_REQ = 92,
+#endif
+
WDI_MAX_REQ,
/*Send a suspend Indication down to HAL*/
@@ -752,6 +758,12 @@
WDI_CH_SWITCH_RESP_V1 = 88,
WDI_GET_BCN_MISS_RATE_RSP = 89,
+#ifdef WLAN_FEATURE_LINK_LAYER_STATS
+ WDI_LL_STATS_SET_RSP = 90,
+ WDI_LL_STATS_GET_RSP = 91,
+ WDI_LL_STATS_CLEAR_RSP = 92,
+#endif
+
/*-------------------------------------------------------------------------
Indications
!! Keep these last in the enum if possible
@@ -818,7 +830,9 @@
/* print register values indication from FW to Host */
WDI_PRINT_REG_INFO_IND = WDI_HAL_IND_MIN + 19,
-
+#ifdef WLAN_FEATURE_LINK_LAYER_STATS
+ WDI_HAL_LL_STATS_RESULTS_IND = WDI_HAL_IND_MIN + 20,
+#endif
WDI_MAX_RESP
}WDI_ResponseEnumType;
@@ -5761,6 +5775,57 @@
WDI_ControlBlockType* pWDICtx,
WDI_EventInfoType* pEventData
);
+#ifdef WLAN_FEATURE_LINK_LAYER_STATS
+WDI_Status
+WDI_ProcessLLStatsSetRsp
+(
+ WDI_ControlBlockType* pWDICtx,
+ WDI_EventInfoType* pEventData
+);
+
+WDI_Status
+WDI_ProcessLLStatsSetReq
+(
+ WDI_ControlBlockType* pWDICtx,
+ WDI_EventInfoType* pEventData
+);
+
+WDI_Status
+WDI_ProcessLLStatsGetRsp
+(
+ WDI_ControlBlockType* pWDICtx,
+ WDI_EventInfoType* pEventData
+);
+
+WDI_Status
+WDI_ProcessLLStatsGetReq
+(
+ WDI_ControlBlockType* pWDICtx,
+ WDI_EventInfoType* pEventData
+);
+
+WDI_Status
+WDI_ProcessLLStatsClearRsp
+(
+ WDI_ControlBlockType* pWDICtx,
+ WDI_EventInfoType* pEventData
+);
+
+WDI_Status
+WDI_ProcessLLStatsClearReq
+(
+ WDI_ControlBlockType* pWDICtx,
+ WDI_EventInfoType* pEventData
+);
+
+WDI_Status
+WDI_ProcessLinkLayerStatsResultsInd
+(
+ WDI_ControlBlockType* pWDICtx,
+ WDI_EventInfoType* pEventData
+);
+
+#endif /* WLAN_FEATURE_LINK_LAYER_STATS */
#endif /*WLAN_QCT_WDI_I_H*/
diff --git a/CORE/WDI/CP/src/wlan_qct_wdi.c b/CORE/WDI/CP/src/wlan_qct_wdi.c
index a839f05..bd579b0 100644
--- a/CORE/WDI/CP/src/wlan_qct_wdi.c
+++ b/CORE/WDI/CP/src/wlan_qct_wdi.c
@@ -409,6 +409,16 @@
WDI_ProcessUpdateChannelParamsReq, /* WDI_UPDATE_CHAN_REQ */
WDI_ProcessGetBcnMissRateReq, /* WDI_GET_BCN_MISS_RATE_REQ */
+
+#ifdef WLAN_FEATURE_LINK_LAYER_STATS
+ WDI_ProcessLLStatsSetReq, /* WDI_LL_STATS_SET_REQ */
+ WDI_ProcessLLStatsGetReq, /* WDI_LL_STATS_GET_REQ */
+ WDI_ProcessLLStatsClearReq, /* WDI_LL_STATS_CLEAR_REQ */
+#else
+ NULL,
+ NULL,
+ NULL,
+#endif
/*-------------------------------------------------------------------------
Indications
-------------------------------------------------------------------------*/
@@ -634,6 +644,16 @@
WDI_ProcessGetBcnMissRateRsp, /*WDI_GET_BCN_MISS_RATE_RSP*/
+
+#ifdef WLAN_FEATURE_LINK_LAYER_STATS
+ WDI_ProcessLLStatsSetRsp, /* WDI_LL_STATS_SET_RSP */
+ WDI_ProcessLLStatsGetRsp, /* WDI_LL_STATS_GET_RSP */
+ WDI_ProcessLLStatsClearRsp, /* WDI_LL_STATS_CLEAR_RSP */
+#else
+ NULL,
+ NULL,
+ NULL,
+#endif
/*---------------------------------------------------------------------
Indications
---------------------------------------------------------------------*/
@@ -693,7 +713,12 @@
NULL,
#endif /* FEATURE_WLAN_CH_AVOID */
- WDI_printRegInfo /* WDI_PRINT_REG_INFO_IND */
+ WDI_printRegInfo, /* WDI_PRINT_REG_INFO_IND */
+#ifdef WLAN_FEATURE_LINK_LAYER_STATS
+ WDI_ProcessLinkLayerStatsResultsInd, /* WDI_HAL_LL_STATS_RESULTS_IND */
+#else
+ NULL,
+#endif
};
@@ -1011,6 +1036,11 @@
CASE_RETURN_STRING(WDI_START_HT40_OBSS_SCAN_IND);
CASE_RETURN_STRING(WDI_STOP_HT40_OBSS_SCAN_IND);
CASE_RETURN_STRING(WDI_UPDATE_CHAN_REQ);
+#ifdef WLAN_FEATURE_LINK_LAYER_STATS
+ CASE_RETURN_STRING( WDI_LL_STATS_SET_REQ);
+ CASE_RETURN_STRING( WDI_LL_STATS_GET_REQ);
+ CASE_RETURN_STRING( WDI_LL_STATS_CLEAR_REQ);
+#endif
default:
return "Unknown WDI MessageId";
}
@@ -1119,6 +1149,11 @@
#endif
CASE_RETURN_STRING( WDI_UPDATE_CHAN_RESP);
CASE_RETURN_STRING( WDI_GET_BCN_MISS_RATE_RSP );
+#ifdef WLAN_FEATURE_LINK_LAYER_STATS
+ CASE_RETURN_STRING( WDI_LL_STATS_SET_RSP);
+ CASE_RETURN_STRING( WDI_LL_STATS_GET_RSP);
+ CASE_RETURN_STRING( WDI_LL_STATS_CLEAR_RSP);
+#endif
default:
return "Unknown WDI MessageId";
}
@@ -16996,6 +17031,100 @@
}/*WDI_ProcessAddTSpecRsp*/
+
+#ifdef WLAN_FEATURE_LINK_LAYER_STATS
+
+WDI_Status
+WDI_ProcessLLStatsSetRsp
+(
+ WDI_ControlBlockType* pWDICtx,
+ WDI_EventInfoType* pEventData
+)
+{
+ WDI_LLStatsSetRspCb wdiLLStatsSetRspCb;
+
+ WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_ERROR,
+ "%s: Enter ", __func__);
+ /*-------------------------------------------------------------------------
+ Sanity check
+ -------------------------------------------------------------------------*/
+ if (( NULL == pWDICtx ) || ( NULL == pEventData ) ||
+ ( NULL == pEventData->pEventData))
+ {
+ WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
+ "%s: Invalid parameters", __func__);
+ WDI_ASSERT(0);
+ return WDI_STATUS_E_FAILURE;
+ }
+
+ wdiLLStatsSetRspCb = (WDI_LLStatsSetRspCb)pWDICtx->pfncRspCB;
+
+ wdiLLStatsSetRspCb((void *) pEventData->pEventData, pWDICtx->pRspCBUserData);
+
+ return WDI_STATUS_SUCCESS;
+}
+
+WDI_Status
+WDI_ProcessLLStatsGetRsp
+(
+ WDI_ControlBlockType* pWDICtx,
+ WDI_EventInfoType* pEventData
+)
+{
+ WDI_LLStatsGetRspCb wdiLLStatsGetRspCb;
+
+ /*-------------------------------------------------------------------------
+ Sanity check
+ -------------------------------------------------------------------------*/
+ if (( NULL == pWDICtx ) || ( NULL == pEventData ) ||
+ ( NULL == pEventData->pEventData))
+ {
+ WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
+ "%s: Invalid parameters", __func__);
+ WDI_ASSERT(0);
+ return WDI_STATUS_E_FAILURE;
+ }
+ WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_ERROR,
+ "%s: Enter ", __func__);
+
+ wdiLLStatsGetRspCb = (WDI_LLStatsGetRspCb)pWDICtx->pfncRspCB;
+
+ wdiLLStatsGetRspCb((void *) pEventData->pEventData, pWDICtx->pRspCBUserData);
+
+ return WDI_STATUS_SUCCESS;
+}
+
+WDI_Status
+WDI_ProcessLLStatsClearRsp
+(
+ WDI_ControlBlockType* pWDICtx,
+ WDI_EventInfoType* pEventData
+)
+{
+ WDI_LLStatsClearRspCb wdiLLStatsClearRspCb;
+
+ /*-------------------------------------------------------------------------
+ Sanity check
+ -------------------------------------------------------------------------*/
+ if (( NULL == pWDICtx ) || ( NULL == pEventData ) ||
+ ( NULL == pEventData->pEventData))
+ {
+ WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
+ "%s: Invalid parameters", __func__);
+ WDI_ASSERT(0);
+ return WDI_STATUS_E_FAILURE;
+ }
+
+ WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_ERROR,
+ "%s: CLEAR RESPONSE CALL BACK", __func__);
+ wdiLLStatsClearRspCb = (WDI_LLStatsClearRspCb)pWDICtx->pfncRspCB;
+
+ wdiLLStatsClearRspCb((void *) pEventData->pEventData, pWDICtx->pRspCBUserData);
+
+ return WDI_STATUS_SUCCESS;
+}
+#endif /* WLAN_FEATURE_LINK_LAYER_STATS */
+
/**
@brief Process Del TSpec Rsp function (called when a response
is being received over the bus from HAL)
@@ -23307,6 +23436,15 @@
return WLAN_HAL_CH_SWITCH_V1_REQ;
case WDI_GET_BCN_MISS_RATE_REQ:
return WLAN_HAL_GET_BCN_MISS_RATE_REQ;
+
+#ifdef WLAN_FEATURE_LINK_LAYER_STATS
+ case WDI_LL_STATS_SET_REQ:
+ return WLAN_HAL_LL_SET_STATS_REQ;
+ case WDI_LL_STATS_GET_REQ:
+ return WLAN_HAL_LL_GET_STATS_REQ;
+ case WDI_LL_STATS_CLEAR_REQ:
+ return WLAN_HAL_LL_CLEAR_STATS_REQ;
+#endif
default:
return WLAN_HAL_MSG_MAX;
}
@@ -23574,6 +23712,16 @@
return WDI_PRINT_REG_INFO_IND;
case WLAN_HAL_GET_BCN_MISS_RATE_RSP:
return WDI_GET_BCN_MISS_RATE_RSP;
+#ifdef WLAN_FEATURE_LINK_LAYER_STATS
+ case WLAN_HAL_LL_SET_STATS_RSP:
+ return WDI_LL_STATS_SET_RSP;
+ case WLAN_HAL_LL_GET_STATS_RSP:
+ return WDI_LL_STATS_GET_RSP;
+ case WLAN_HAL_LL_CLEAR_STATS_RSP:
+ return WDI_LL_STATS_CLEAR_RSP;
+ case WLAN_HAL_LL_NOTIFY_STATS:
+ return WDI_HAL_LL_STATS_RESULTS_IND;
+#endif
default:
return eDRIVER_TYPE_MAX;
}
@@ -29476,18 +29624,18 @@
return WDI_STATUS_E_FAILURE;
}
- /*extract response and send it to UMAC*/
+ /* extract response and send it to UMAC */
pHalSetBatchScanRsp = (tHalBatchScanSetRspParam *)pEventData->pEventData;
pSetBatchScanRsp->nScansToBatch = pHalSetBatchScanRsp->supportedMscan;
- /*Notify UMAC*/
+ /* Notify UMAC */
wdiSetBatchScanCb(pSetBatchScanRsp, pWDICtx->pRspCBUserData);
wpalMemoryFree(pSetBatchScanRsp);
return WDI_STATUS_SUCCESS;
-}/*WDI_ProcessSetBatchScanRsp*/
+}/* WDI_ProcessSetBatchScanRsp */
/**
@brief Process batch scan result indication from FW
@@ -29509,7 +29657,7 @@
WDI_LowLevelIndType wdiInd;
/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
- /*sanity check*/
+ /* sanity check */
if (( NULL == pWDICtx ) || ( NULL == pEventData ) ||
( NULL == pEventData->pEventData))
{
@@ -29519,15 +29667,15 @@
return WDI_STATUS_E_FAILURE;
}
- /*extract response and send it to UMAC*/
+ /* extract response and send it to UMAC */
pBatchScanResultInd = (void *)pEventData->pEventData;
- /*Fill in the indication parameters*/
+ /* Fill in the indication parameters */
wdiInd.wdiIndicationType = WDI_BATCH_SCAN_RESULT_IND;
wdiInd.wdiIndicationData.pBatchScanResult = pBatchScanResultInd;
- /*Notify UMAC*/
+ /* Notify UMAC */
if (pWDICtx->wdiLowLevelIndCB)
{
pWDICtx->wdiLowLevelIndCB( &wdiInd, pWDICtx->pIndUserData );
@@ -29543,6 +29691,65 @@
return WDI_STATUS_SUCCESS;
} /*End of WDI_ProcessBatchScanResultInd*/
+#ifdef WLAN_FEATURE_LINK_LAYER_STATS
+/**
+ @brief Process Link Layer Statistics Result indication from FW
+
+ @param pWDICtx: pointer to the WLAN DAL context
+ pEventData: pointer to the event information structure
+
+ @see
+ @return Result of the function call
+*/
+WDI_Status
+WDI_ProcessLinkLayerStatsResultsInd
+(
+ WDI_ControlBlockType* pWDICtx,
+ WDI_EventInfoType* pEventData
+)
+{
+ void *pLinkLayerStatsInd;
+ WDI_LowLevelIndType wdiInd;
+ /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+
+ VOS_TRACE( VOS_MODULE_ID_WDI, VOS_TRACE_LEVEL_INFO,
+ "%s: Event RESULTS Indication", __func__);
+
+ /* sanity check */
+ if (( NULL == pWDICtx ) || ( NULL == pEventData ) ||
+ ( NULL == pEventData->pEventData))
+ {
+ WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_ERROR,
+ "%s: Invalid parameters", __func__);
+ WDI_ASSERT(0);
+ return WDI_STATUS_E_FAILURE;
+ }
+
+ /* extract response and send it to UMAC */
+ pLinkLayerStatsInd = (void *)pEventData->pEventData;
+
+ /* Fill in the indication parameters */
+ wdiInd.wdiIndicationType = WDI_LL_STATS_RESULTS_IND;
+
+ wdiInd.wdiIndicationData.pLinkLayerStatsResults = pLinkLayerStatsInd;
+
+ /* Notify UMAC */
+ if (pWDICtx->wdiLowLevelIndCB)
+ {
+ pWDICtx->wdiLowLevelIndCB( &wdiInd, pWDICtx->pIndUserData );
+ }
+ else
+ {
+ VOS_TRACE( VOS_MODULE_ID_WDI, VOS_TRACE_LEVEL_INFO,
+ "%s: WDILowLevelIndCb is null", __func__);
+ WDI_ASSERT(0);
+ return WDI_STATUS_E_FAILURE;
+ }
+
+ return WDI_STATUS_SUCCESS;
+} /* End of WDI_ProcessLinkLayerStatsResultsInd */
+#endif /* WLAN_FEATURE_LINK_LAYER_STATS */
+
/**
@brief WDI_ProcessSetBatchScanReq -
Set batch scan request to FW
@@ -30309,3 +30516,378 @@
return WDI_PostMainEvent(&gWDICb, WDI_REQUEST_EVENT, &wdiEventData);
}
+#ifdef WLAN_FEATURE_LINK_LAYER_STATS
+
+/**
+ @brief WDI_LLStatsSetReq
+ This API is called to set link layer stats request in FW
+
+ @param pwdiLLStatsSetReqParams : pointer to set link layer request params
+ wdiLLStatsSetRspCb : set link layer stats resp callback
+ usrData : Client context
+ @see
+ @return SUCCESS or FAIL
+*/
+WDI_Status
+WDI_LLStatsSetReq(WDI_LLStatsSetReqType* pwdiLLStatsSetReqParams,
+ WDI_LLStatsSetRspCb wdiLLStatsSetRspCb,
+ void* pUserData)
+{
+ WDI_EventInfoType wdiEventData;
+
+ /*------------------------------------------------------------------------
+ Sanity Check
+ ------------------------------------------------------------------------*/
+ if ( eWLAN_PAL_FALSE == gWDIInitialized )
+ {
+ VOS_TRACE( VOS_MODULE_ID_WDI, VOS_TRACE_LEVEL_ERROR,
+ "WDI API call before module is initialized - Fail request");
+
+ return WDI_STATUS_E_NOT_ALLOWED;
+ }
+
+ wdiEventData.wdiRequest = WDI_LL_STATS_SET_REQ;
+ wdiEventData.pEventData = pwdiLLStatsSetReqParams;
+ wdiEventData.uEventDataSize = sizeof(*pwdiLLStatsSetReqParams);
+ wdiEventData.pCBfnc = wdiLLStatsSetRspCb;
+ wdiEventData.pUserData = pUserData;
+
+ return WDI_PostMainEvent(&gWDICb, WDI_REQUEST_EVENT, &wdiEventData);
+}
+
+/**
+ @brief WDI_ProcessLLStatsSetReq -
+ Set Link Layer Stats request to FW
+
+ @param pWDICtx : wdi context
+ pEventData : indication data
+
+ @see
+ @return none
+*/
+WDI_Status
+WDI_ProcessLLStatsSetReq
+(
+ WDI_ControlBlockType* pWDICtx,
+ WDI_EventInfoType* pEventData
+)
+{
+ WDI_LLStatsSetReqType* pwdiLLStatsSetReqParams;
+ WDI_LLStatsSetRspCb wdiLLStatsSetCb;
+ wpt_uint8* pSendBuffer = NULL;
+ wpt_uint16 usSendSize = 0;
+ wpt_uint16 usDataOffset = 0;
+ tHalMacLlSetStatsReqParams halLLStatsSetParams;
+
+ if (( NULL == pEventData ) || ( NULL == pEventData->pEventData ) ||
+ ( NULL == pEventData->pCBfnc ))
+ {
+ WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
+ "%s: Invalid parameters", __func__);
+ WDI_ASSERT(0);
+ return WDI_STATUS_E_FAILURE;
+ }
+
+ pwdiLLStatsSetReqParams = (WDI_LLStatsSetReqType*)pEventData->pEventData;
+ wdiLLStatsSetCb = (WDI_LLStatsSetRspCb)pEventData->pCBfnc;
+
+ /*-----------------------------------------------------------------------
+ Get message buffer
+ ! TO DO : proper conversion into the HAL Message Request Format
+ -----------------------------------------------------------------------*/
+ if (( WDI_STATUS_SUCCESS != WDI_GetMessageBuffer(
+ pWDICtx,
+ WDI_LL_STATS_SET_REQ,
+ sizeof(tHalMacLlSetStatsReqParams),
+ &pSendBuffer, &usDataOffset,
+ &usSendSize))||
+ ( usSendSize < (usDataOffset + sizeof(halLLStatsSetParams) )))
+ {
+ WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
+ "Unable to get send buffer in %s %p %p %p", __func__,
+ pEventData, pwdiLLStatsSetReqParams, wdiLLStatsSetCb);
+ WDI_ASSERT(0);
+ return WDI_STATUS_E_FAILURE;
+ }
+
+
+
+ halLLStatsSetParams.req_id = pwdiLLStatsSetReqParams->reqId;
+ halLLStatsSetParams.sta_id = pwdiLLStatsSetReqParams->staId;
+ halLLStatsSetParams.mpdu_size_threshold =
+ pwdiLLStatsSetReqParams->mpduSizeThreshold;
+ halLLStatsSetParams.aggressive_statistics_gathering =
+ pwdiLLStatsSetReqParams->aggressiveStatisticsGathering;
+
+ VOS_TRACE( VOS_MODULE_ID_WDI, VOS_TRACE_LEVEL_INFO,
+ " halLLStatsSetParams.req_id = %u",
+ halLLStatsSetParams.req_id);
+ VOS_TRACE( VOS_MODULE_ID_WDI, VOS_TRACE_LEVEL_INFO,
+ " halLLStatsSetParams.sta_id = %u",
+ halLLStatsSetParams.sta_id);
+ VOS_TRACE( VOS_MODULE_ID_WDI, VOS_TRACE_LEVEL_INFO,
+ " halLLStatsSetParams.mpdu_size_threshold = %u",
+ halLLStatsSetParams.mpdu_size_threshold);
+ VOS_TRACE( VOS_MODULE_ID_WDI, VOS_TRACE_LEVEL_INFO,
+ " halLLStatsSetParams.aggressive_statistics_gathering = %u",
+ halLLStatsSetParams.aggressive_statistics_gathering);
+
+ wpalMemoryCopy(pSendBuffer+usDataOffset,
+ &halLLStatsSetParams,
+ sizeof(halLLStatsSetParams));
+
+ pWDICtx->pReqStatusUserData = pEventData->pUserData;
+
+ /*-------------------------------------------------------------------------
+ Send Clear Link Layer Stats Request to HAL
+ -------------------------------------------------------------------------*/
+ return WDI_SendMsg( pWDICtx, pSendBuffer, usSendSize,
+ wdiLLStatsSetCb, pEventData->pUserData,
+ WDI_LL_STATS_SET_RSP);
+}
+
+/**
+ @brief WDI_LLStatsGetReq
+ This API is called to get link layer stats request in FW
+
+ @param pwdiLLStatsGetReqParams : pointer to set link layer request params
+ wdiLLStatsGetRspCb : get link layer stats resp callback
+ usrData : Client context
+ @see
+ @return SUCCESS or FAIL
+*/
+WDI_Status
+WDI_LLStatsGetReq(WDI_LLStatsGetReqType* pwdiLLStatsGetReqParams,
+ WDI_LLStatsGetRspCb wdiLLStatsGetRspCb,
+ void* pUserData)
+{
+ WDI_EventInfoType wdiEventData;
+
+ /*------------------------------------------------------------------------
+ Sanity Check
+ ------------------------------------------------------------------------*/
+ if ( eWLAN_PAL_FALSE == gWDIInitialized )
+ {
+ WPAL_TRACE(eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_ERROR,
+ "WDI API call before module is initialized - Fail request");
+
+ return WDI_STATUS_E_NOT_ALLOWED;
+ }
+
+ wdiEventData.wdiRequest = WDI_LL_STATS_GET_REQ;
+ wdiEventData.pEventData = pwdiLLStatsGetReqParams;
+ wdiEventData.uEventDataSize = sizeof(*pwdiLLStatsGetReqParams);
+ wdiEventData.pCBfnc = wdiLLStatsGetRspCb;
+ wdiEventData.pUserData = pUserData;
+
+ return WDI_PostMainEvent(&gWDICb, WDI_REQUEST_EVENT, &wdiEventData);
+}
+
+/**
+ @brief WDI_ProcessLLStatsGetReq -
+ Get Link Layer Stats request to FW
+
+ @param pWDICtx : wdi context
+ pEventData : indication data
+
+ @see
+ @return none
+*/
+WDI_Status
+WDI_ProcessLLStatsGetReq
+(
+ WDI_ControlBlockType* pWDICtx,
+ WDI_EventInfoType* pEventData
+)
+{
+ WDI_LLStatsGetReqType* pwdiLLStatsGetReqParams;
+ WDI_LLStatsGetRspCb wdiLLStatsGetCb;
+ wpt_uint8* pSendBuffer = NULL;
+ wpt_uint16 usSendSize = 0;
+ wpt_uint16 usDataOffset = 0;
+ tHalMacLlGetStatsReqParams halLLStatsGetParams;
+
+ if (( NULL == pEventData ) || ( NULL == pEventData->pEventData ) ||
+ ( NULL == pEventData->pCBfnc ))
+ {
+ WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
+ "%s: Invalid parameters", __func__);
+ WDI_ASSERT(0);
+ return WDI_STATUS_E_FAILURE;
+ }
+
+ pwdiLLStatsGetReqParams = (WDI_LLStatsGetReqType*)pEventData->pEventData;
+ wdiLLStatsGetCb = (WDI_LLStatsGetRspCb)pEventData->pCBfnc;
+
+ /*-----------------------------------------------------------------------
+ Get message buffer
+ ! TO DO : proper conversion into the HAL Message Request Format
+ -----------------------------------------------------------------------*/
+ if (( WDI_STATUS_SUCCESS != WDI_GetMessageBuffer(
+ pWDICtx,
+ WDI_LL_STATS_GET_REQ,
+ sizeof(tHalMacLlGetStatsReqParams),
+ &pSendBuffer, &usDataOffset,
+ &usSendSize))||
+ ( usSendSize < (usDataOffset + sizeof(halLLStatsGetParams) )))
+ {
+ WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
+ "Unable to get send buffer in %s %p %p %p", __func__,
+ pEventData, pwdiLLStatsGetReqParams, wdiLLStatsGetCb);
+ WDI_ASSERT(0);
+ return WDI_STATUS_E_FAILURE;
+ }
+
+ halLLStatsGetParams.req_id = pwdiLLStatsGetReqParams->reqId;
+ halLLStatsGetParams.sta_id = pwdiLLStatsGetReqParams->staId;
+ halLLStatsGetParams.param_id_mask = pwdiLLStatsGetReqParams->paramIdMask;
+
+ VOS_TRACE( VOS_MODULE_ID_WDI, VOS_TRACE_LEVEL_INFO,
+ " halLLStatsGetParams.req_id = %u",
+ halLLStatsGetParams.req_id);
+ VOS_TRACE( VOS_MODULE_ID_WDI, VOS_TRACE_LEVEL_INFO,
+ " halLLStatsGetParams.staId = %u",
+ halLLStatsGetParams.sta_id);
+ VOS_TRACE( VOS_MODULE_ID_WDI, VOS_TRACE_LEVEL_INFO,
+ " halLLStatsGetParams.Mask = %u",
+ halLLStatsGetParams.param_id_mask);
+
+ wpalMemoryCopy(pSendBuffer+usDataOffset,
+ &halLLStatsGetParams,
+ sizeof(halLLStatsGetParams));
+
+ pWDICtx->pReqStatusUserData = pEventData->pUserData;
+
+ /*-------------------------------------------------------------------------
+ Send Clear Link Layer Stats Request to HAL
+ -------------------------------------------------------------------------*/
+ return WDI_SendMsg( pWDICtx, pSendBuffer, usSendSize,
+ wdiLLStatsGetCb, pEventData->pUserData,
+ WDI_LL_STATS_GET_RSP);
+}
+
+/**
+ @brief WDI_LLStatsClearReq
+ This API is called to clear link layer stats request in FW
+
+ @param pwdiLLStatsClearReqParams : pointer to clear link layer request params
+ wdiLLStatsSetRspCb : clear link layer stats resp callback
+ usrData : Client context
+ @see
+ @return SUCCESS or FAIL
+*/
+WDI_Status
+WDI_LLStatsClearReq(WDI_LLStatsClearReqType* pwdiLLStatsClearReqParams,
+ WDI_LLStatsClearRspCb wdiLLStatsClearRspCb,
+ void* pUserData)
+{
+ WDI_EventInfoType wdiEventData;
+
+ /*------------------------------------------------------------------------
+ Sanity Check
+ ------------------------------------------------------------------------*/
+ if ( eWLAN_PAL_FALSE == gWDIInitialized )
+ {
+ WPAL_TRACE(eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_ERROR,
+ "WDI API call before module is initialized - Fail request");
+
+ return WDI_STATUS_E_NOT_ALLOWED;
+ }
+
+ wdiEventData.wdiRequest = WDI_LL_STATS_CLEAR_REQ;
+ wdiEventData.pEventData = pwdiLLStatsClearReqParams;
+ wdiEventData.uEventDataSize = sizeof(*pwdiLLStatsClearReqParams);
+ wdiEventData.pCBfnc = wdiLLStatsClearRspCb;
+ wdiEventData.pUserData = pUserData;
+
+ WPAL_TRACE(eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_ERROR,
+ "%s:%d Enter", __func__, __LINE__);
+
+ return WDI_PostMainEvent(&gWDICb, WDI_REQUEST_EVENT, &wdiEventData);
+}
+
+/**
+ @brief WDI_ProcessLLStatsClearReq -
+ Clear Link Layer Stats request to FW
+
+ @param pWDICtx : wdi context
+ pEventData : indication data
+
+ @see
+ @return none
+*/
+WDI_Status
+WDI_ProcessLLStatsClearReq
+(
+ WDI_ControlBlockType* pWDICtx,
+ WDI_EventInfoType* pEventData
+)
+{
+ WDI_LLStatsClearReqType* pwdiLLStatsClearReqParams;
+ WDI_LLStatsClearRspCb wdiLLStatsClearCb;
+ wpt_uint8* pSendBuffer = NULL;
+ wpt_uint16 usSendSize = 0;
+ wpt_uint16 usDataOffset = 0;
+ tHalMacLlClearStatsReqParams halLLStatsClearParams;
+
+ if (( NULL == pEventData ) || ( NULL == pEventData->pEventData ) ||
+ ( NULL == pEventData->pCBfnc ))
+ {
+ WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
+ "%s: Invalid parameters", __func__);
+ WDI_ASSERT(0);
+ return WDI_STATUS_E_FAILURE;
+ }
+
+ pwdiLLStatsClearReqParams = (WDI_LLStatsClearReqType*)pEventData->pEventData;
+ wdiLLStatsClearCb = (WDI_LLStatsClearRspCb)pEventData->pCBfnc;
+
+ /*-----------------------------------------------------------------------
+ Get message buffer
+ ! TO DO : proper conversion into the HAL Message Request Format
+ -----------------------------------------------------------------------*/
+ if (( WDI_STATUS_SUCCESS != WDI_GetMessageBuffer(
+ pWDICtx,
+ WDI_LL_STATS_CLEAR_REQ,
+ sizeof(tHalMacLlClearStatsReqParams),
+ &pSendBuffer, &usDataOffset,
+ &usSendSize))||
+ ( usSendSize < (usDataOffset + sizeof(halLLStatsClearParams) )))
+ {
+ WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
+ "Unable to get send buffer in %s %p %p %p", __func__,
+ pEventData, pwdiLLStatsClearReqParams, wdiLLStatsClearCb);
+ WDI_ASSERT(0);
+ return WDI_STATUS_E_FAILURE;
+ }
+
+ halLLStatsClearParams.req_id = pwdiLLStatsClearReqParams->reqId;
+ halLLStatsClearParams.sta_id = pwdiLLStatsClearReqParams->staId;
+ halLLStatsClearParams.stats_clear_req_mask =
+ pwdiLLStatsClearReqParams->statsClearReqMask;
+ halLLStatsClearParams.stop_req = pwdiLLStatsClearReqParams->stopReq;
+
+ VOS_TRACE( VOS_MODULE_ID_WDI, VOS_TRACE_LEVEL_INFO,
+ "%s:HAL req_id = %d", __func__, halLLStatsClearParams.req_id);
+ VOS_TRACE( VOS_MODULE_ID_WDI, VOS_TRACE_LEVEL_INFO,
+ "%s: HAL sta_id = %d", __func__, halLLStatsClearParams.sta_id);
+ VOS_TRACE( VOS_MODULE_ID_WDI, VOS_TRACE_LEVEL_INFO,
+ "%s: HAL stats_clear_req_mask = 0x%X", __func__,
+ halLLStatsClearParams.stats_clear_req_mask);
+ VOS_TRACE( VOS_MODULE_ID_WDI, VOS_TRACE_LEVEL_INFO,
+ "%s: HAL stop_req = %d", __func__, halLLStatsClearParams.stop_req);
+
+ wpalMemoryCopy(pSendBuffer+usDataOffset,
+ &halLLStatsClearParams,
+ sizeof(halLLStatsClearParams));
+
+ pWDICtx->pReqStatusUserData = pEventData->pUserData;
+
+ /*-------------------------------------------------------------------------
+ Send Clear Link Layer Stats Request to HAL
+ -------------------------------------------------------------------------*/
+ return WDI_SendMsg( pWDICtx, pSendBuffer, usSendSize,
+ wdiLLStatsClearCb, pEventData->pUserData,
+ WDI_LL_STATS_CLEAR_RSP);
+}
+#endif /* WLAN_FEATURE_LINK_LAYER_STATS */