wlan: Fix Magic packet and pattern matching for Wowl

Enable handling of wakeup events from firmware during
wowl and also fix some initialization issues in the
WoWl message being sent to FW.

Change-Id: I336d007694efb868c6b3397c83b0f095cfafb7b1
CRs-Fixed: 506538, 510723
diff --git a/CORE/HDD/src/wlan_hdd_wowl.c b/CORE/HDD/src/wlan_hdd_wowl.c
index e783033..05d2f5d 100644
--- a/CORE/HDD/src/wlan_hdd_wowl.c
+++ b/CORE/HDD/src/wlan_hdd_wowl.c
@@ -95,10 +95,20 @@
 
 static void hdd_wowl_callback( void *pContext, eHalStatus halStatus )
 {
-  VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO, 
-    "%s: Return code = (%ld)\n", __func__, halStatus );
+  VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
+      "%s: Return code = (%ld)\n", __func__, halStatus );
 }
 
+#ifdef WLAN_WAKEUP_EVENTS
+static void hdd_wowl_wakeIndication_callback( void *pContext,
+    tpSirWakeReasonInd pWakeReasonInd )
+{
+  VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO, "%s: Wake Reason %d",
+      __func__, pWakeReasonInd->ulReason );
+  hdd_exit_wowl((hdd_adapter_t *)pContext);
+}
+#endif
+
 static void dump_hdd_wowl_ptrn(tSirWowlAddBcastPtrn *ptrn)
 {
   int i;
@@ -361,7 +371,12 @@
 
   // Request to put Libra into WoWL
   halStatus = sme_EnterWowl( hHal, hdd_wowl_callback, 
-                             pAdapter, &wowParams, pAdapter->sessionId);
+                             pAdapter,
+#ifdef WLAN_WAKEUP_EVENTS
+                             hdd_wowl_wakeIndication_callback,
+                             pAdapter,
+#endif // WLAN_WAKEUP_EVENTS
+                             &wowParams, pAdapter->sessionId);
 
   if ( !HAL_STATUS_SUCCESS( halStatus ) )
   {
diff --git a/CORE/SME/src/pmc/pmcApi.c b/CORE/SME/src/pmc/pmcApi.c
index 293378c..e898974 100644
--- a/CORE/SME/src/pmc/pmcApi.c
+++ b/CORE/SME/src/pmc/pmcApi.c
@@ -2190,29 +2190,23 @@
            pmcGetPmcStateStr(pMac->pmc.pmcState));
         return eHAL_STATUS_FAILURE;
     }
+
     if( pMac->pmc.pmcState == IMPS || pMac->pmc.pmcState == REQUEST_IMPS )
     {
-        eHalStatus status;
-        vos_mem_copy(pattern->bssId, pSession->connectedProfile.bssid, sizeof(tSirMacAddr));
-        //Wake up the chip first
-        status = pmcDeferMsg( pMac, eWNI_PMC_WOWL_ADD_BCAST_PTRN, 
-                                    pattern, sizeof(tSirWowlAddBcastPtrn) );
-
-        if( eHAL_STATUS_PMC_PENDING == status )
-        {
-            return eHAL_STATUS_SUCCESS;
-        }
-        else 
-        {
-            //either fail or already in full power
-            if( !HAL_STATUS_SUCCESS( status ) )
-            {
-                return ( status );
-            }
-            //else let it through because it is in full power state
-        }
+        smsLog(pMac, LOGE, FL("Cannot add WoWL Pattern as chip is in %s state"),
+           pmcGetPmcStateStr(pMac->pmc.pmcState));
+        return eHAL_STATUS_FAILURE;
     }
 
+    if( !csrIsConnStateConnected(pMac, sessionId) )
+    {
+        smsLog(pMac, LOGE, FL("Cannot add WoWL Pattern session in %d state"),
+           pSession->connectState);
+        return eHAL_STATUS_FAILURE;
+    }
+
+    vos_mem_copy(pattern->bssId, pSession->connectedProfile.bssid, sizeof(tSirMacAddr));
+
     if (pmcSendMessage(hHal, eWNI_PMC_WOWL_ADD_BCAST_PTRN, pattern, sizeof(tSirWowlAddBcastPtrn))
         != eHAL_STATUS_SUCCESS)
     {
@@ -2382,9 +2376,6 @@
        return eHAL_STATUS_FAILURE;
    }
 
-   vos_mem_copy(wowlEnterParams->bssId, pSession->connectedProfile.bssid, 
-               sizeof(tSirMacAddr));
-
    if( !PMC_IS_READY(pMac) )
    {
        smsLog(pMac, LOGE, FL("Requesting WoWL when PMC not ready"));
@@ -2431,6 +2422,9 @@
       return eHAL_STATUS_FAILURE;
    }
 
+   vos_mem_copy(wowlEnterParams->bssId, pSession->connectedProfile.bssid,
+               sizeof(tSirMacAddr));
+
    // To avoid race condition, set callback routines before sending message.
    /* cache the WOWL information */
    pMac->pmc.wowlEnterParams = *wowlEnterParams;
diff --git a/CORE/WDA/src/wlan_qct_wda.c b/CORE/WDA/src/wlan_qct_wda.c
index 1dfd270..e4b8c36 100644
--- a/CORE/WDA/src/wlan_qct_wda.c
+++ b/CORE/WDA/src/wlan_qct_wda.c
@@ -9098,6 +9098,9 @@
       vos_mem_free(wdiWowlEnterInfo);
       return VOS_STATUS_E_NOMEM;
    }
+
+   vos_mem_zero(pWdaParams, sizeof(tWDA_ReqParams));
+
    vos_mem_copy(wdiWowlEnterInfo->wdiWowlEnterInfo.magicPtrn,
                 pWowlEnterParams->magicPtrn,
                 sizeof(tSirMacAddr));
diff --git a/CORE/WDI/CP/src/wlan_qct_wdi.c b/CORE/WDI/CP/src/wlan_qct_wdi.c
index ca840d4..148f63e 100644
--- a/CORE/WDI/CP/src/wlan_qct_wdi.c
+++ b/CORE/WDI/CP/src/wlan_qct_wdi.c
@@ -13976,6 +13976,8 @@
       return WDI_STATUS_E_FAILURE;
    }
 
+   wpalMemoryZero(&wowlEnterReq, sizeof(tHalWowlEnterParams));
+
    wowlEnterReq.ucMagicPktEnable =
       pwdiWowlEnterParams->wdiWowlEnterInfo.ucMagicPktEnable;
    wowlEnterReq.ucPatternFilteringEnable =
diff --git a/Kbuild b/Kbuild
index f96c63e..7cf25f3 100644
--- a/Kbuild
+++ b/Kbuild
@@ -518,10 +518,11 @@
 		-DWLAN_ENABLE_AGEIE_ON_SCAN_RESULTS \
 		-DWLANTL_DEBUG\
 		-DWLAN_ACTIVEMODE_OFFLOAD_FEATURE \
-        	-DWLAN_FEATURE_HOLD_RX_WAKELOCK \
+		-DWLAN_FEATURE_HOLD_RX_WAKELOCK \
 		-DWLAN_SOFTAP_VSTA_FEATURE \
-                -DWLAN_FEATURE_ROAM_SCAN_OFFLOAD \
-                -DWLAN_FEATURE_GTK_OFFLOAD
+		-DWLAN_FEATURE_ROAM_SCAN_OFFLOAD \
+		-DWLAN_FEATURE_GTK_OFFLOAD \
+		-DWLAN_WAKEUP_EVENTS
 
 ifneq ($(CONFIG_PRONTO_WLAN),)
 CDEFINES += -DWCN_PRONTO