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 */