wlan: Memory leak fix in WDA/WDI

If there are back to back req from UMAC, some gets buffered in
WDI Q. After deQ if the req fails, there is no way to notify
WDA, hence the memory leak. The fix is to address this scenario.

Change-Id: Iefa41c8a7e7f6a9550591aa325768d2d930173b9
CRs-fixed: 455843
diff --git a/CORE/WDA/src/wlan_qct_wda.c b/CORE/WDA/src/wlan_qct_wda.c
index a048351..a2499c2 100644
--- a/CORE/WDA/src/wlan_qct_wda.c
+++ b/CORE/WDA/src/wlan_qct_wda.c
@@ -11527,10 +11527,10 @@
    return CONVERT_WDI2VOS_STATUS(status) ;
 }
 /*
- * FUNCTION: WDA_ReceiveFilterSetFilterReqCallback
+ * FUNCTION: WDA_ReceiveFilterSetFilterRespCallback
  * 
  */ 
-void WDA_ReceiveFilterSetFilterReqCallback( 
+void WDA_ReceiveFilterSetFilterRespCallback(
                         WDI_SetRcvPktFilterRspParamsType *pwdiSetRcvPktFilterRspInfo, 
                         void * pUserData)
 {
@@ -11551,9 +11551,41 @@
    vos_mem_free(pWdaParams) ;
    //print a msg, nothing else to do
    VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
-              "WDA_ReceiveFilterSetFilterReqCallback invoked " );
+              "WDA_ReceiveFilterSetFilterRespCallback invoked " );
    return ;
 }
+
+/*
+ * FUNCTION: WDA_ReqCallback
+ *
+ */
+void WDA_ReqCallback(WDI_Status   wdiStatus,
+                     void*        pUserData)
+{
+   tWDA_ReqParams        *pWdaParams = (tWDA_ReqParams *)pUserData;
+
+   VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
+             "<------ %s, wdiStatus: %d",
+              __func__, wdiStatus);
+
+   if (NULL == pWdaParams)
+   {
+      VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
+              "%s: Invalid pWdaParams pointer", __func__);
+      VOS_ASSERT(0);
+      return;
+   }
+
+   if (IS_WDI_STATUS_FAILURE(wdiStatus))
+   {
+         vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
+         vos_mem_free(pWdaParams->wdaMsgParam);
+         vos_mem_free(pWdaParams);
+   }
+
+   return;
+}
+
 /*
  * FUNCTION: WDA_ProcessReceiveFilterSetFilterReq
  * Request to WDI to set Receive Filters
@@ -11648,14 +11680,15 @@
                  pwdiSetRcvPktFilterReqParamsType->
                          wdiPktFilterCfg.paramsData[i].dataMask[5]);
    }
-   pwdiSetRcvPktFilterReqParamsType->wdiReqStatusCB = NULL;
+   pwdiSetRcvPktFilterReqParamsType->wdiReqStatusCB = WDA_ReqCallback;
+   pwdiSetRcvPktFilterReqParamsType->pUserData = pWdaParams;
    /* Store Params pass it to WDI */
    pWdaParams->wdaWdiApiMsgParam = (void *)pwdiSetRcvPktFilterReqParamsType;
    pWdaParams->pWdaContext = pWDA;
    /* Store param pointer as passed in by caller */
    pWdaParams->wdaMsgParam = pRcvPktFilterCfg;
    status = WDI_ReceiveFilterSetFilterReq(pwdiSetRcvPktFilterReqParamsType,
-           (WDI_ReceiveFilterSetFilterCb)WDA_ReceiveFilterSetFilterReqCallback,
+           (WDI_ReceiveFilterSetFilterCb)WDA_ReceiveFilterSetFilterRespCallback,
            pWdaParams);
    if(IS_WDI_STATUS_FAILURE(status))
    {
@@ -11790,10 +11823,10 @@
    return CONVERT_WDI2VOS_STATUS(status) ;
 }
 /*
- * FUNCTION: WDA_ReceiveFilterSetFilterReqCallback
+ * FUNCTION: WDA_ReceiveFilterClearFilterRespCallback
  * 
  */ 
-void WDA_ReceiveFilterClearFilterReqCallback(   
+void WDA_ReceiveFilterClearFilterRespCallback(
                         WDI_RcvFltPktClearRspParamsType *pwdiRcvFltPktClearRspParamsType, 
                         void * pUserData)
 {
@@ -11814,7 +11847,7 @@
    vos_mem_free(pWdaParams) ;
    //print a msg, nothing else to do
    VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
-              "WDA_ReceiveFilterClearFilterReqCallback invoked " );
+              "WDA_ReceiveFilterClearFilterRespCallback invoked " );
    return ;
 }
 /*
@@ -11853,14 +11886,15 @@
    vos_mem_copy(pwdiRcvFltPktClearReqParamsType->filterClearParam.bssId,
                          pRcvFltPktClearParam->bssId, sizeof(wpt_macAddr));
 
-   pwdiRcvFltPktClearReqParamsType->wdiReqStatusCB = NULL;
+   pwdiRcvFltPktClearReqParamsType->wdiReqStatusCB = WDA_ReqCallback;
+   pwdiRcvFltPktClearReqParamsType->pUserData = pWdaParams;
    /* Store Params pass it to WDI */
    pWdaParams->wdaWdiApiMsgParam = (void *)pwdiRcvFltPktClearReqParamsType;
    pWdaParams->pWdaContext = pWDA;
    /* Store param pointer as passed in by caller */
    pWdaParams->wdaMsgParam = pRcvFltPktClearParam;
    status = WDI_ReceiveFilterClearFilterReq(pwdiRcvFltPktClearReqParamsType,
-       (WDI_ReceiveFilterClearFilterCb)WDA_ReceiveFilterClearFilterReqCallback,
+       (WDI_ReceiveFilterClearFilterCb)WDA_ReceiveFilterClearFilterRespCallback,
        pWdaParams);
    if(IS_WDI_STATUS_FAILURE(status))
    {