wlan: Add query mode support for frame logging
Add support for query mode which triggers dump of last
received mgmt packets buffered in HW. Three types of Query are
supported:
1. Clear
2. Send
3. Send and Clear
Change-Id: Ic2089ec969d3995339339cd3f9d71cefc29dc8e3
CRs-Fixed: 808160
diff --git a/CORE/HDD/inc/wlan_hdd_main.h b/CORE/HDD/inc/wlan_hdd_main.h
index 118153c..a5c0301 100644
--- a/CORE/HDD/inc/wlan_hdd_main.h
+++ b/CORE/HDD/inc/wlan_hdd_main.h
@@ -103,6 +103,7 @@
/** Maximum time(ms)to wait for disconnect to complete **/
#define WLAN_WAIT_TIME_DISCONNECT 2000
#define WLAN_WAIT_TIME_STATS 800
+#define WLAN_WAIT_TIME_FRAME_LOG 2000
#define WLAN_WAIT_TIME_POWER 800
#define WLAN_WAIT_TIME_COUNTRY 1000
#define WLAN_WAIT_TIME_CHANNEL_UPDATE 600
@@ -272,6 +273,13 @@
unsigned int magic;
};
+struct getFrameLogCtx
+{
+ struct completion completion;
+ hdd_adapter_t *pAdapter;
+ unsigned int magic;
+};
+
extern spinlock_t hdd_context_lock;
#define STATS_CONTEXT_MAGIC 0x53544154 //STAT
@@ -280,6 +288,7 @@
#define SNR_CONTEXT_MAGIC 0x534E5200 //SNR
#define BCN_MISS_RATE_CONTEXT_MAGIC 0x513F5753
#define FW_STATS_CONTEXT_MAGIC 0x5022474E //FW STATS
+#define GET_FRAME_LOG_MAGIC 0x464c4f47 //FLOG
/*
* Driver miracast parameters 0-Disabled
diff --git a/CORE/HDD/src/wlan_hdd_wext.c b/CORE/HDD/src/wlan_hdd_wext.c
index 62d77c4..69f8902 100644
--- a/CORE/HDD/src/wlan_hdd_wext.c
+++ b/CORE/HDD/src/wlan_hdd_wext.c
@@ -382,6 +382,12 @@
MCC_TOO_CLOSE_MARGIN_CFG_PARAM,
};
+enum
+{
+ WLAN_HDD_GET_FRAME_LOG_CMD_CLEAR = 1<<0,
+ WLAN_HDD_GET_FRAME_LOG_CMD_SEND_AND_CLEAR = 1<<1,
+};
+
int hdd_validate_mcc_config(hdd_adapter_t *pAdapter, v_UINT_t staId,
v_UINT_t arg1, v_UINT_t arg2, v_UINT_t arg3);
@@ -892,6 +898,119 @@
return VOS_STATUS_SUCCESS;
}
+static void hdd_GetFrameLogCB( void *pContext )
+{
+ struct getFrameLogCtx *pGetFrameLogCtx;
+ hdd_adapter_t *pAdapter;
+
+ if (NULL == pContext)
+ {
+ hddLog(VOS_TRACE_LEVEL_ERROR,
+ "%s: Bad param, pContext [%p]", __func__, pContext);
+ return;
+ }
+
+ pGetFrameLogCtx = pContext;
+ pAdapter = pGetFrameLogCtx->pAdapter;
+
+ /* there is a race condition that exists between this callback
+ function and the caller since the caller could time out either
+ before or while this code is executing. we use a spinlock to
+ serialize these actions */
+ spin_lock(&hdd_context_lock);
+
+ if (GET_FRAME_LOG_MAGIC != pGetFrameLogCtx->magic)
+ {
+ /* the caller presumably timed out so there is nothing we can do */
+ spin_unlock(&hdd_context_lock);
+ hddLog(VOS_TRACE_LEVEL_ERROR,
+ "%s: Invalid context, pAdapter [%p] magic [%08x]",
+ __func__, pAdapter, pGetFrameLogCtx->magic);
+ return;
+ }
+
+ /* context is valid so caller is still waiting */
+
+ /* paranoia: invalidate the magic */
+ pGetFrameLogCtx->magic = 0;
+
+ /* notify the caller */
+ complete(&pGetFrameLogCtx->completion);
+
+ /* serialization is complete */
+ spin_unlock(&hdd_context_lock);
+}
+
+/**---------------------------------------------------------------------------
+
+ \brief wlan_hdd_get_frame_logs() -
+
+ This function use to get Frames log.
+
+ \param - pAdapter Pointer to the adapter.
+ flag - Specify type of request. Clear and Send request are
+ supported.
+
+ \return - none
+
+ --------------------------------------------------------------------------*/
+VOS_STATUS wlan_hdd_get_frame_logs(hdd_adapter_t *pAdapter, v_U8_t flag)
+{
+ struct getFrameLogCtx context;
+ hdd_context_t *pHddCtx;
+ eHalStatus hstatus;
+ long lrc;
+
+ if (NULL == pAdapter)
+ {
+ hddLog(VOS_TRACE_LEVEL_WARN,
+ "%s: Invalid context, pAdapter", __func__);
+ return VOS_STATUS_E_FAULT;
+ }
+
+ pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
+ if (!pHddCtx->mgmt_frame_logging)
+ {
+ hddLog(VOS_TRACE_LEVEL_ERROR,"%s: Frame Logging not init!", __func__);
+ return VOS_STATUS_E_AGAIN;
+ }
+
+ if (flag != WLAN_HDD_GET_FRAME_LOG_CMD_CLEAR &&
+ flag != WLAN_HDD_GET_FRAME_LOG_CMD_SEND_AND_CLEAR)
+ {
+ hddLog(VOS_TRACE_LEVEL_ERROR,"%s: Incorrect getFrame params!", __func__);
+ return VOS_STATUS_E_INVAL;
+ }
+
+ init_completion(&context.completion);
+ context.pAdapter = pAdapter;
+ context.magic = GET_FRAME_LOG_MAGIC;
+
+ hstatus = sme_GetFramesLog(pHddCtx->hHal, hdd_GetFrameLogCB,
+ flag, &context);
+ if (eHAL_STATUS_SUCCESS != hstatus)
+ {
+ hddLog(VOS_TRACE_LEVEL_ERROR,"%s: Unable to get Frame Logs", __func__);
+ }
+ else
+ {
+ /* request was sent -- wait for the response */
+ lrc = wait_for_completion_interruptible_timeout(&context.completion,
+ msecs_to_jiffies(WLAN_WAIT_TIME_FRAME_LOG));
+ if (lrc <= 0)
+ {
+ hddLog(VOS_TRACE_LEVEL_ERROR, "%s: SME %s while fetching Frame logs",
+ __func__, (0 == lrc) ? "timeout" : "interrupt");
+ }
+ }
+
+ spin_lock(&hdd_context_lock);
+ context.magic = 0;
+ spin_unlock(&hdd_context_lock);
+
+ return VOS_STATUS_SUCCESS;
+}
+
VOS_STATUS wlan_hdd_get_snr(hdd_adapter_t *pAdapter, v_S7_t *snr)
{
struct statsContext context;
diff --git a/CORE/MAC/inc/sirApi.h b/CORE/MAC/inc/sirApi.h
index 2f8f620..a392c0f 100644
--- a/CORE/MAC/inc/sirApi.h
+++ b/CORE/MAC/inc/sirApi.h
@@ -176,6 +176,7 @@
enum {
SIR_BOOT_MODULE_ID = 1,
SIR_HAL_MODULE_ID = 0x10,
+ SIR_HAL_EXT_MODULE_ID = 0x11,
SIR_CFG_MODULE_ID = 0x12,
SIR_LIM_MODULE_ID,
SIR_ARQ_MODULE_ID,
@@ -3715,6 +3716,18 @@
typedef void(*MgmtLoggingInitReqCb)(void *mgmtlogInitCbContext,
VOS_STATUS status);
+typedef void ( *tGetFrameLogCallback) (void *pContext);
+
+typedef struct sAniGetFrameLogReq
+{
+ tANI_U16 msgType;
+ tANI_U16 msgLen;
+ tGetFrameLogCallback getFramelogCallback;
+ void *pDevContext; //device context
+ tANI_U8 getFrameLogCmdFlag;
+ tANI_U32 rspStatus;
+} tAniGetFrameLogReq, *tpAniGetFrameLogReq;
+
typedef struct sSirMgmtLoggingInitParam
{
diff --git a/CORE/MAC/src/include/sirParams.h b/CORE/MAC/src/include/sirParams.h
index bbd0a75..fd9d24f 100644
--- a/CORE/MAC/src/include/sirParams.h
+++ b/CORE/MAC/src/include/sirParams.h
@@ -333,6 +333,7 @@
// HAL message types
#define SIR_HAL_MSG_TYPES_BEGIN (SIR_HAL_MODULE_ID << 8)
+#define SIR_HAL_EXT_MSG_TYPES_BEGIN (SIR_HAL_EXT_MODULE_ID << 8)
#define SIR_HAL_ITC_MSG_TYPES_BEGIN (SIR_HAL_MSG_TYPES_BEGIN+0x20)
#define SIR_HAL_RADAR_DETECTED_IND SIR_HAL_ITC_MSG_TYPES_BEGIN
#define SIR_HAL_WDT_KAM_RSP (SIR_HAL_ITC_MSG_TYPES_BEGIN + 1)
@@ -704,6 +705,7 @@
#define SIR_HAL_ENCRYPT_MSG_RSP (SIR_HAL_ITC_MSG_TYPES_BEGIN + 264)
#define SIR_HAL_MGMT_LOGGING_INIT_REQ (SIR_HAL_ITC_MSG_TYPES_BEGIN + 265)
+#define SIR_HAL_GET_FRAME_LOG_REQ (SIR_HAL_ITC_MSG_TYPES_BEGIN + 266)
#define SIR_HAL_MSG_TYPES_END (SIR_HAL_MSG_TYPES_BEGIN + 0x1FF)
// CFG message types
diff --git a/CORE/SME/inc/smeInside.h b/CORE/SME/inc/smeInside.h
index ecfd1b6..cc2cdbd 100644
--- a/CORE/SME/inc/smeInside.h
+++ b/CORE/SME/inc/smeInside.h
@@ -228,6 +228,7 @@
#endif
tSirPNOScanReq pnoInfo;
tSirSpoofMacAddrReq macAddrSpoofCmd;
+ tAniGetFrameLogReq getFramelogCmd;
}u;
}tSmeCmd;
@@ -283,6 +284,7 @@
eHalStatus csrProcessDelStaSessionCommand( tpAniSirGlobal pMac, tSmeCmd *pCommand );
eHalStatus csrProcessMacAddrSpoofCommand( tpAniSirGlobal pMac, tSmeCmd *pCommand );
eHalStatus csrProcessDelStaSessionRsp( tpAniSirGlobal pMac, tANI_U8 *pMsg);
+eHalStatus csrProcessGetFrameLogCommand( tpAniSirGlobal pMac, tSmeCmd *pCommand );
#ifdef WLAN_NS_OFFLOAD
/* ---------------------------------------------------------------------------
diff --git a/CORE/SME/inc/smeInternal.h b/CORE/SME/inc/smeInternal.h
index 5466a92..c291b18 100644
--- a/CORE/SME/inc/smeInternal.h
+++ b/CORE/SME/inc/smeInternal.h
@@ -73,6 +73,7 @@
eSmeCommandDelStaSession,
eSmeCommandPnoReq,
eSmeCommandMacSpoofRequest,
+ eSmeCommandGetFrameLogRequest,
#ifdef FEATURE_WLAN_TDLS
//eSmeTdlsCommandMask = 0x80000, //To identify TDLS commands <TODO>
//These can be considered as csr commands.
diff --git a/CORE/SME/inc/sme_Api.h b/CORE/SME/inc/sme_Api.h
index ce32576..11ccd63 100644
--- a/CORE/SME/inc/sme_Api.h
+++ b/CORE/SME/inc/sme_Api.h
@@ -2131,7 +2131,18 @@
-------------------------------------------------------------------------------*/
eHalStatus sme_DeregisterMgmtFrame(tHalHandle hHal, tANI_U8 sessionId,
tANI_U16 frameType, tANI_U8* matchData, tANI_U16 matchLen);
-
+/* ---------------------------------------------------------------------------
+ \fn sme_GetFramesLog
+ \brief a wrapper function that client calls to register a callback to get
+ mgmt frames logged
+ \param callback - SME sends back the context using the callback
+ \param flag - flag tells to clear OR send the frame log buffer
+ \param pContext - user context to be passed back along with the callback
+ \return eHalStatus
+ ---------------------------------------------------------------------------*/
+eHalStatus sme_GetFramesLog(tHalHandle hHal,
+ tGetFrameLogCallback callback,
+ tANI_U8 flag, void *pContext);
/* ---------------------------------------------------------------------------
\fn sme_InitMgmtFrameLogging
diff --git a/CORE/SME/src/csr/csrUtil.c b/CORE/SME/src/csr/csrUtil.c
index 329b0d5..4c7bb16 100644
--- a/CORE/SME/src/csr/csrUtil.c
+++ b/CORE/SME/src/csr/csrUtil.c
@@ -2056,8 +2056,39 @@
return (status);
}
+eHalStatus csrProcessGetFrameLogCommand( tpAniSirGlobal pMac,
+ tSmeCmd *pCommand )
+{
+ tAniGetFrameLogReq *pMsg;
+ tANI_U16 msgLen;
+ eHalStatus status = eHAL_STATUS_FAILURE;
+ msgLen = sizeof(tAniGetFrameLogReq);
+ if ( NULL == pCommand )
+ {
+ smsLog( pMac, LOGE, FL("cannot process. cmd is null") );
+ return eHAL_STATUS_FAILURE;
+ }
+
+ pMsg = vos_mem_malloc(msgLen);
+ if ( NULL == pMsg )
+ {
+ smsLog( pMac, LOGE, FL("fail to allocate memory") );
+ return eHAL_STATUS_FAILURE;
+ }
+
+ pMsg->msgType= pal_cpu_to_be16((tANI_U16)WDA_GET_FRAME_LOG_REQ);
+ pMsg->msgLen= pal_cpu_to_be16(msgLen);
+
+ pMsg->pDevContext = pCommand->u.getFramelogCmd.pDevContext;
+ pMsg->getFramelogCallback= pCommand->u.getFramelogCmd.getFramelogCallback;
+ pMsg->getFrameLogCmdFlag = pCommand->u.getFramelogCmd.getFrameLogCmdFlag;
+
+ status = palSendMBMessage(pMac->hHdd, pMsg);
+
+ return( status );
+}
tANI_BOOLEAN csrIsNULLSSID( tANI_U8 *pBssSsid, tANI_U8 len )
{
diff --git a/CORE/SME/src/sme_common/sme_Api.c b/CORE/SME/src/sme_common/sme_Api.c
index b353d6b..98a2500 100644
--- a/CORE/SME/src/sme_common/sme_Api.c
+++ b/CORE/SME/src/sme_common/sme_Api.c
@@ -937,6 +937,18 @@
}
break;
+ case eSmeCommandGetFrameLogRequest:
+ csrLLUnlock( &pMac->sme.smeCmdActiveList );
+ csrProcessGetFrameLogCommand( pMac, pCommand );
+ //We need to re-run the command
+ fContinue = eANI_BOOLEAN_TRUE;
+ // No Rsp expected, free cmd from active list
+ if( csrLLRemoveEntry( &pMac->sme.smeCmdActiveList,
+ &pCommand->Link, LL_ACCESS_LOCK ) )
+ {
+ csrReleaseCommand( pMac, pCommand );
+ }
+ break;
#ifdef FEATURE_OEM_DATA_SUPPORT
case eSmeCommandOemDataReq:
@@ -7372,6 +7384,48 @@
}
/* ---------------------------------------------------------------------------
+ \fn sme_GetFramesLog
+ \brief a wrapper function that client calls to register a callback to get
+ mgmt frames logged
+ \param callback - SME sends back the context using the callback
+ \param flag - flag tells to clear OR send the frame log buffer
+ \param pContext - user context to be passed back along with the callback
+ \return eHalStatus
+ ---------------------------------------------------------------------------*/
+eHalStatus sme_GetFramesLog(tHalHandle hHal,
+ tGetFrameLogCallback callback,
+ tANI_U8 flag, void *pContext)
+{
+ tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
+ eHalStatus status = eHAL_STATUS_SUCCESS;
+ tSmeCmd *pGetFrameLogCmd;
+
+ pGetFrameLogCmd = csrGetCommandBuffer(pMac);
+ if (pGetFrameLogCmd)
+ {
+ pGetFrameLogCmd->command = eSmeCommandGetFrameLogRequest;
+ pGetFrameLogCmd->u.getFramelogCmd.pDevContext= pContext;
+ pGetFrameLogCmd->u.getFramelogCmd.getFramelogCallback= callback;
+ pGetFrameLogCmd->u.getFramelogCmd.getFrameLogCmdFlag= flag;
+
+ status = csrQueueSmeCommand(pMac, pGetFrameLogCmd, eANI_BOOLEAN_TRUE);
+ if ( !HAL_STATUS_SUCCESS( status ) )
+ {
+ smsLog( pMac, LOGE, FL("fail to send msg status = %d\n"), status );
+ csrReleaseCommandScan(pMac, pGetFrameLogCmd);
+ }
+ }
+ else
+ {
+ //log error
+ smsLog(pMac, LOGE, FL("can not obtain a common buffer\n"));
+ status = eHAL_STATUS_RESOURCES;
+ }
+
+ return (status);
+}
+
+/* ---------------------------------------------------------------------------
\fn sme_InitMgmtFrameLogging
diff --git a/CORE/SYS/legacy/src/utils/src/logApi.c b/CORE/SYS/legacy/src/utils/src/logApi.c
index d28ac35..04bae6c 100644
--- a/CORE/SYS/legacy/src/utils/src/logApi.c
+++ b/CORE/SYS/legacy/src/utils/src/logApi.c
@@ -164,6 +164,7 @@
switch(modId)
{
case SIR_HAL_MODULE_ID:
+ case SIR_HAL_EXT_MODULE_ID:
case SIR_PHY_MODULE_ID:
return VOS_MODULE_ID_WDA;
case SIR_PMM_MODULE_ID:
diff --git a/CORE/SYS/legacy/src/utils/src/logDump.c b/CORE/SYS/legacy/src/utils/src/logDump.c
index 51e088e..3e6b1f9 100644
--- a/CORE/SYS/legacy/src/utils/src/logDump.c
+++ b/CORE/SYS/legacy/src/utils/src/logDump.c
@@ -173,6 +173,7 @@
switch (i)
{
case SIR_HAL_MODULE_ID: p += log_sprintf( pMac, p, "HAL "); break;
+ case SIR_HAL_EXT_MODULE_ID: p += log_sprintf( pMac, p, "HAL "); break;
case SIR_CFG_MODULE_ID: p += log_sprintf( pMac, p, "CFG "); break;
case SIR_LIM_MODULE_ID: p += log_sprintf( pMac, p, "LIM "); break;
case SIR_ARQ_MODULE_ID: p += log_sprintf( pMac, p, "ARQ "); break;
diff --git a/CORE/WDA/inc/wlan_qct_wda.h b/CORE/WDA/inc/wlan_qct_wda.h
index 8d9be02..1197e55 100644
--- a/CORE/WDA/inc/wlan_qct_wda.h
+++ b/CORE/WDA/inc/wlan_qct_wda.h
@@ -905,6 +905,7 @@
#define WDA_TL_FLUSH_AC_RSP SIR_HAL_TL_FLUSH_AC_RSP
#define WDA_MSG_TYPES_BEGIN SIR_HAL_MSG_TYPES_BEGIN
+#define WDA_EXT_MSG_TYPES_BEGIN SIR_HAL_EXT_MSG_TYPES_BEGIN
#define WDA_ITC_MSG_TYPES_BEGIN SIR_HAL_ITC_MSG_TYPES_BEGIN
#define WDA_RADAR_DETECTED_IND SIR_HAL_RADAR_DETECTED_IND
#define WDA_WDT_KAM_RSP SIR_HAL_WDT_KAM_RSP
@@ -1274,6 +1275,7 @@
#define WDA_SPOOF_MAC_ADDR_RSP SIR_HAL_SPOOF_MAC_ADDR_RSP
#define WDA_MGMT_LOGGING_INIT_REQ SIR_HAL_MGMT_LOGGING_INIT_REQ
+#define WDA_GET_FRAME_LOG_REQ SIR_HAL_GET_FRAME_LOG_REQ
#define HAL_USE_BD_RATE2_FOR_MANAGEMENT_FRAME 0x40 // Bit 6 will be used to control BD rate for Management frames
diff --git a/CORE/WDA/src/wlan_qct_wda.c b/CORE/WDA/src/wlan_qct_wda.c
index 8efe026..bca3bfc 100644
--- a/CORE/WDA/src/wlan_qct_wda.c
+++ b/CORE/WDA/src/wlan_qct_wda.c
@@ -5077,6 +5077,74 @@
}
/*
+ * FUNCTION: WDA_GetFrameLogRspCallback
+ * recieves get frame log response from FW
+ */
+void WDA_GetFrameLogRspCallback(WDI_GetFrameLogRspParamType* wdiRsp,
+ void* pUserData)
+{
+ tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
+ tWDA_CbContext *pWDA = NULL;
+ tAniGetFrameLogReq *pGetFrameLogReqParams = NULL;
+
+ VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
+ "<------ Entering: %s " ,__func__);
+ if(NULL == pWdaParams)
+ {
+ VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
+ "%s: pWdaParams received NULL", __func__);
+ VOS_ASSERT(0) ;
+ return ;
+ }
+
+ pWDA = (tWDA_CbContext *) pWdaParams->pWdaContext;
+ if (NULL == pWDA)
+ {
+ VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
+ "%s:pWDA is NULL", __func__);
+ VOS_ASSERT(0);
+ vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
+ vos_mem_free(pWdaParams);
+ return ;
+ }
+
+ pGetFrameLogReqParams = (tAniGetFrameLogReq *)pWdaParams->wdaMsgParam;
+ if(NULL == pGetFrameLogReqParams)
+ {
+ VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
+ "%s: pGetFrameLogReqParams received NULL", __func__);
+ VOS_ASSERT(0);
+ vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
+ vos_mem_free(pWdaParams);
+ return;
+ }
+
+ pGetFrameLogReqParams->rspStatus = wdiRsp->wdiStatus;
+ if (wdiRsp->wdiStatus != WDI_STATUS_SUCCESS) {
+ VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
+ "%s:GetFrameLog with rsp status %d", __func__, wdiRsp->wdiStatus);
+ }
+
+ if(pGetFrameLogReqParams->getFramelogCallback)
+ {
+ pGetFrameLogReqParams->getFramelogCallback(
+ pGetFrameLogReqParams->pDevContext);
+ }
+ else
+ {
+ VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
+ "%s: pGetFrameLogReqParams callback is NULL", __func__);
+ }
+
+ /* free WDI command buffer only */
+ vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
+ vos_mem_free(pWdaParams->wdaMsgParam);
+ vos_mem_free(pWdaParams);
+
+ return ;
+
+}
+/*
* FUNCTION: WDA_MgmtLoggingInitRspCallback
* recieves Mgmt Logging init response from FW
*/
@@ -9488,6 +9556,73 @@
}
/*
+ * FUNCTION: WDA_ProcessGetFrameLogReq
+ * Request to WDI to get the Frame Log.
+ */
+VOS_STATUS WDA_ProcessGetFrameLogReq(tWDA_CbContext *pWDA,
+ tAniGetFrameLogReq *pGetFrameLog)
+{
+ VOS_STATUS status = VOS_STATUS_SUCCESS;
+ WDI_Status wstatus;
+ WDI_GetFrameLogReqInfoType *wdiGetFrameLogInfo;
+ tWDA_ReqParams *pWdaParams ;
+
+ /* Sanity Check*/
+ if(NULL == pGetFrameLog)
+ {
+ VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
+ "%s: pMgmtLoggingInitParam received NULL", __func__);
+ VOS_ASSERT(0) ;
+ return VOS_STATUS_E_FAULT;
+ }
+
+ wdiGetFrameLogInfo = (WDI_GetFrameLogReqInfoType *)vos_mem_malloc(
+ sizeof(WDI_GetFrameLogReqInfoType));
+ VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
+ "------> %s " ,__func__);
+
+ if(NULL == wdiGetFrameLogInfo)
+ {
+ VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
+ "%s: VOS MEM Alloc Failure", __func__);
+ VOS_ASSERT(0);
+ vos_mem_free(pGetFrameLog);
+ return VOS_STATUS_E_NOMEM;
+ }
+
+ 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);
+ vos_mem_free(wdiGetFrameLogInfo);
+ vos_mem_free(pGetFrameLog);
+ return VOS_STATUS_E_NOMEM;
+ }
+
+ wdiGetFrameLogInfo->flags = pGetFrameLog->getFrameLogCmdFlag;
+
+ pWdaParams->pWdaContext = pWDA;
+ pWdaParams->wdaMsgParam = pGetFrameLog;
+ pWdaParams->wdaWdiApiMsgParam = (void *)wdiGetFrameLogInfo;
+
+ wstatus = WDI_GetFrameLogReq(wdiGetFrameLogInfo,
+ (WDI_GetFrameLogRspCb)WDA_GetFrameLogRspCallback,
+ pWdaParams);
+ if(IS_WDI_STATUS_FAILURE(wstatus))
+ {
+ VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
+ "Failure in get frame log REQ WDI API, free all the memory" );
+ status = CONVERT_WDI2VOS_STATUS(wstatus);
+ vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
+ vos_mem_free(pWdaParams->wdaMsgParam);
+ vos_mem_free(pWdaParams);
+ }
+ return status;
+}
+
+/*
* FUNCTION: WDA_ProcessMgmtLoggingInitReq
*
*/
@@ -13431,6 +13566,12 @@
(tSirMgmtLoggingInitParam *)pMsg->bodyptr);
break;
}
+ case WDA_GET_FRAME_LOG_REQ:
+ {
+ WDA_ProcessGetFrameLogReq(pWDA,
+ (tAniGetFrameLogReq *)pMsg->bodyptr);
+ break;
+ }
case WDA_SET_HOST_OFFLOAD:
{
WDA_ProcessHostOffloadReq(pWDA, (tSirHostOffloadReq *)pMsg->bodyptr);
diff --git a/CORE/WDA/src/wlan_qct_wda_legacy.c b/CORE/WDA/src/wlan_qct_wda_legacy.c
index a472e39..176aabf 100644
--- a/CORE/WDA/src/wlan_qct_wda_legacy.c
+++ b/CORE/WDA/src/wlan_qct_wda_legacy.c
@@ -175,6 +175,7 @@
switch (msg.type & HAL_MMH_MB_MSG_TYPE_MASK)
{
case WDA_MSG_TYPES_BEGIN: // Posts a message to the HAL MsgQ
+ case WDA_EXT_MSG_TYPES_BEGIN:
wdaPostCtrlMsg(pMac, &msg);
break;
diff --git a/CORE/WDI/CP/inc/wlan_qct_wdi.h b/CORE/WDI/CP/inc/wlan_qct_wdi.h
index be5b426..91eea65 100644
--- a/CORE/WDI/CP/inc/wlan_qct_wdi.h
+++ b/CORE/WDI/CP/inc/wlan_qct_wdi.h
@@ -2650,6 +2650,14 @@
}WDI_SpoofMacAddrRspParamType;
/*---------------------------------------------------------------------------
+ WDI_GetFrameLogRspParamType
+---------------------------------------------------------------------------*/
+typedef struct
+{
+ /* wdi status */
+ wpt_uint32 wdiStatus;
+}WDI_GetFrameLogRspParamType;
+/*---------------------------------------------------------------------------
WDI_MgmtLoggingRspParamType
---------------------------------------------------------------------------*/
typedef struct
@@ -4038,6 +4046,11 @@
wpt_uint8 bufferMode;
}WDI_MgmtLoggingInitReqInfoType;
+typedef struct
+{
+ wpt_uint8 flags;
+}WDI_GetFrameLogReqInfoType;
+
/*---------------------------------------------------------------------------
WDI_BeaconFilterInfoType
Beacon Filtering data structures passed to WDA form UMAC
@@ -7939,6 +7952,8 @@
typedef void (*WDI_EncryptMsgRspCb)(wpt_uint8 status, void *pEventData, void* pUserData);
typedef void (*WDI_MgmtLoggingInitRspCb)(
WDI_MgmtLoggingRspParamType *wdiRsp, void *pUserData);
+typedef void (*WDI_GetFrameLogRspCb)(
+ WDI_GetFrameLogRspParamType *wdiRsp, void *pUserData);
/*========================================================================
* Function Declarations and Documentation
@@ -9367,6 +9382,36 @@
WDI_SetUapsdAcParamsCb wdiSetUapsdAcParamsCb,
void* pUserData
);
+/**
+ @brief WDI_GetFrameLogReq will be called when the upper
+ MAC wants to initialize frame logging. Upon the call of
+ this API the WLAN DAL will pack and send a HAL
+ Frame logging init request message to
+ the lower RIVA sub-system.
+
+ In state BUSY this request will be queued. Request won't
+ be allowed in any other state.
+
+
+ @param pwdiGetFrameLogReqInfo: the Frame Logging params
+ as specified by the Device Interface
+
+ wdiGetFrameLogReqCb: callback for passing back the
+ response of the frame logging init operation received
+ from the device
+
+ pUserData: user data will be passed back with the
+ callback
+
+ @return Result of the function call
+*/
+WDI_Status
+WDI_GetFrameLogReq
+(
+ WDI_GetFrameLogReqInfoType *pwdiGetFrameLogReqInfo,
+ WDI_GetFrameLogRspCb wdiGetFrameLogReqCb,
+ void* pUserData
+);
/**
@brief WDI_MgmtLoggingInitReq will be called when the upper
diff --git a/CORE/WDI/CP/inc/wlan_qct_wdi_i.h b/CORE/WDI/CP/inc/wlan_qct_wdi_i.h
index f3331c4..c1ac0c3 100644
--- a/CORE/WDI/CP/inc/wlan_qct_wdi_i.h
+++ b/CORE/WDI/CP/inc/wlan_qct_wdi_i.h
@@ -471,6 +471,7 @@
WDI_ENCRYPT_MSG_REQ = 103,
WDI_MGMT_LOGGING_INIT_REQ = 104,
+ WDI_GET_FRAME_LOG_REQ = 105,
WDI_MAX_REQ,
@@ -803,6 +804,7 @@
WDI_ENCRYPT_MSG_RSP = 103,
WDI_MGMT_LOGGING_INIT_RSP = 104,
+ WDI_GET_FRAME_LOG_RSP = 105,
/*-------------------------------------------------------------------------
Indications
!! Keep these last in the enum if possible
@@ -6108,6 +6110,19 @@
);
WDI_Status
+WDI_ProcessGetFrameLogRsp
+(
+ WDI_ControlBlockType* pWDICtx,
+ WDI_EventInfoType* pEventData
+);
+WDI_Status
+WDI_ProcessGetFrameLogReq
+(
+ WDI_ControlBlockType* pWDICtx,
+ WDI_EventInfoType* pEventData
+);
+
+WDI_Status
WDI_ProcessMgmtLoggingInitReq
(
WDI_ControlBlockType* pWDICtx,
diff --git a/CORE/WDI/CP/src/wlan_qct_wdi.c b/CORE/WDI/CP/src/wlan_qct_wdi.c
index 393319b..d2fba54 100644
--- a/CORE/WDI/CP/src/wlan_qct_wdi.c
+++ b/CORE/WDI/CP/src/wlan_qct_wdi.c
@@ -471,6 +471,7 @@
WDI_ProcessEncryptMsgReq, /* WDI_ENCRYPT_MSG_REQ*/
WDI_ProcessMgmtLoggingInitReq, /* WDI_MGMT_LOGGING_INIT_REQ*/
+ WDI_ProcessGetFrameLogReq, /* WDI_GET_FRAME_LOG_REQ*/
/*-------------------------------------------------------------------------
Indications
-------------------------------------------------------------------------*/
@@ -735,6 +736,7 @@
WDI_ProcessEncryptMsgRsp, /* WDI_ENCRYPT_MSG_RSP*/
WDI_ProcessMgmtFrameLoggingInitRsp, /* WDI_MGMT_LOGGING_INIT_RSP*/
+ WDI_ProcessGetFrameLogRsp, /* WDI_GET_FRAME_LOG_RSP*/
/*---------------------------------------------------------------------
Indications
@@ -1157,6 +1159,7 @@
CASE_RETURN_STRING( WDI_GET_FW_STATS_REQ);
CASE_RETURN_STRING( WDI_ENCRYPT_MSG_REQ);
CASE_RETURN_STRING( WDI_MGMT_LOGGING_INIT_REQ);
+ CASE_RETURN_STRING( WDI_GET_FRAME_LOG_REQ);
default:
return "Unknown WDI MessageId";
}
@@ -1291,6 +1294,7 @@
CASE_RETURN_STRING( WDI_GET_FW_STATS_RSP);
CASE_RETURN_STRING( WDI_ENCRYPT_MSG_RSP);
CASE_RETURN_STRING( WDI_MGMT_LOGGING_INIT_RSP);
+ CASE_RETURN_STRING( WDI_GET_FRAME_LOG_RSP);
default:
return "Unknown WDI MessageId";
}
@@ -4186,6 +4190,62 @@
}/*WDI_SetUapsdAcParamsReq*/
/**
+ @brief WDI_GetFrameLogReq will be called when the upper
+ MAC wants to initialize frame logging. Upon the call of
+ this API the WLAN DAL will pack and send a HAL
+ Frame logging init request message to
+ the lower RIVA sub-system.
+
+ In state BUSY this request will be queued. Request won't
+ be allowed in any other state.
+
+
+ @param pwdiGetFrameLogReqInfo: the Frame Logging params
+ as specified by the Device Interface
+
+ wdiGetFrameLogRspCb: callback for passing back the
+ response of the frame logging init operation received
+ from the device
+
+ pUserData: user data will be passed back with the
+ callback
+
+ @return Result of the function call
+*/
+WDI_Status
+WDI_GetFrameLogReq
+(
+ WDI_GetFrameLogReqInfoType *pwdiGetFrameLogReqInfo,
+ WDI_GetFrameLogRspCb wdiGetFrameLogRspCb,
+ 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;
+ }
+
+ /*------------------------------------------------------------------------
+ Fill in Event data and post to the Main FSM
+ ------------------------------------------------------------------------*/
+ wdiEventData.wdiRequest = WDI_GET_FRAME_LOG_REQ;
+ wdiEventData.pEventData = pwdiGetFrameLogReqInfo;
+ wdiEventData.uEventDataSize = sizeof(*pwdiGetFrameLogReqInfo);
+ wdiEventData.pCBfnc = wdiGetFrameLogRspCb;
+ wdiEventData.pUserData = pUserData;
+
+ return WDI_PostMainEvent(&gWDICb, WDI_REQUEST_EVENT, &wdiEventData);
+}
+/**
@brief WDI_MgmtLoggingInitReq will be called when the upper
MAC wants to initialize frame logging. Upon the call of
this API the WLAN DAL will pack and send a HAL
@@ -24044,6 +24104,8 @@
return WLAN_HAL_ENCRYPT_DATA_REQ;
case WDI_MGMT_LOGGING_INIT_REQ:
return WLAN_HAL_MGMT_LOGGING_INIT_REQ;
+ case WDI_GET_FRAME_LOG_REQ:
+ return WLAN_HAL_GET_FRAME_LOG_REQ;
default:
return WLAN_HAL_MSG_MAX;
@@ -24364,6 +24426,8 @@
return WDI_ENCRYPT_MSG_RSP;
case WLAN_HAL_MGMT_LOGGING_INIT_RSP:
return WDI_MGMT_LOGGING_INIT_RSP;
+ case WLAN_HAL_GET_FRAME_LOG_RSP:
+ return WDI_GET_FRAME_LOG_RSP;
default:
return eDRIVER_TYPE_MAX;
@@ -33823,6 +33887,132 @@
}
/**
+ @brief Process Get Frame Log Rsp function
+ (called when a response is being received over the bus from HAL)
+
+ @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_ProcessGetFrameLogRsp
+(
+ WDI_ControlBlockType* pWDICtx,
+ WDI_EventInfoType* pEventData
+)
+{
+ tGetFrameLogResp halRsp;
+ WDI_GetFrameLogRspCb wdiGetFrameLogRspCb;
+ WDI_GetFrameLogRspParamType wdiGetFrameLogRsp;
+
+ VOS_TRACE( VOS_MODULE_ID_WDI, VOS_TRACE_LEVEL_INFO,
+ "%s: %d Enter",__func__, __LINE__);
+
+ /*-------------------------------------------------------------------------
+ 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;
+ }
+
+ wdiGetFrameLogRspCb = (WDI_GetFrameLogRspCb)pWDICtx->pfncRspCB;
+
+ /*-------------------------------------------------------------------------
+ Extract response and send it to UMAC
+ -------------------------------------------------------------------------*/
+ wpalMemoryCopy( &halRsp,
+ pEventData->pEventData, sizeof(halRsp));
+
+ wdiGetFrameLogRsp.wdiStatus = WDI_HAL_2_WDI_STATUS(halRsp.status);
+
+ /*Notify UMAC*/
+ wdiGetFrameLogRspCb( &wdiGetFrameLogRsp, pWDICtx->pRspCBUserData );
+
+ return WDI_STATUS_SUCCESS;
+}
+/**
+ @brief Process MgmtLoggingInit Request
+
+ @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_ProcessGetFrameLogReq
+(
+ WDI_ControlBlockType* pWDICtx,
+ WDI_EventInfoType* pEventData
+)
+{
+ WDI_GetFrameLogReqInfoType* wdiGetFrameLogReq;
+ wpt_uint8* pSendBuffer = NULL;
+ wpt_uint16 usDataOffset = 0;
+ wpt_uint16 usSendSize = 0;
+ WDI_Status wdiStatus;
+ tGetFrameLogReqMsg halGetFrameLogReq;
+ WDI_MgmtLoggingInitRspCb wdiGetFrameLogRspCb;
+
+
+ VOS_TRACE( VOS_MODULE_ID_WDI, VOS_TRACE_LEVEL_INFO,
+ "%s: %d Enter",__func__, __LINE__);
+
+ /*-------------------------------------------------------------------------
+ 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;
+ }
+
+ wdiGetFrameLogReq = (WDI_GetFrameLogReqInfoType *)pEventData->pEventData;
+
+ /*-----------------------------------------------------------------------
+ Get message buffer
+ -----------------------------------------------------------------------*/
+ if (( WDI_STATUS_SUCCESS != WDI_GetMessageBuffer( pWDICtx,
+ WDI_GET_FRAME_LOG_REQ,
+ sizeof(halGetFrameLogReq.tGetFrameLogReqParams),
+ &pSendBuffer, &usDataOffset, &usSendSize))||
+ (usSendSize < (usDataOffset +
+ sizeof(halGetFrameLogReq.tGetFrameLogReqParams))))
+ {
+ WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_FATAL,
+ "Unable to get send buffer in GetFrameLog Req");
+ WDI_ASSERT(0);
+ return WDI_STATUS_E_FAILURE;
+ }
+
+ halGetFrameLogReq.tGetFrameLogReqParams.flags =
+ wdiGetFrameLogReq->flags;
+
+ wdiGetFrameLogRspCb = (WDI_MgmtLoggingInitRspCb)pEventData->pCBfnc;
+
+ wpalMemoryCopy( pSendBuffer+usDataOffset,
+ &halGetFrameLogReq.tGetFrameLogReqParams,
+ sizeof(halGetFrameLogReq.tGetFrameLogReqParams));
+
+ /*-------------------------------------------------------------------------
+ Send Suspend Request to HAL
+ ------------------------------------------------------------------------*/
+ wdiStatus = WDI_SendMsg( pWDICtx, pSendBuffer, usSendSize,
+ wdiGetFrameLogRspCb, pEventData->pUserData, WDI_GET_FRAME_LOG_RSP);
+
+ return wdiStatus;
+}
+/**
@brief Process MgmtFrame Logging Init Rsp function
(called when a response is being received over the bus from HAL)