wlan: serialize ula callback initialization

Serialize ULA callback initialization between
MC Thread and TX Thread to avoid race condition.

CRs-Fixed: 806914
Change-Id: I6c53339f40225b165a57f197a61dfe128b07da5f
diff --git a/CORE/HDD/src/wlan_hdd_wext.c b/CORE/HDD/src/wlan_hdd_wext.c
index e6cb53b..632c6d6 100644
--- a/CORE/HDD/src/wlan_hdd_wext.c
+++ b/CORE/HDD/src/wlan_hdd_wext.c
@@ -1277,10 +1277,10 @@
 {
     hdd_adapter_t *pAdapter = (hdd_adapter_t*)callbackContext;
 
-    if (WLAN_HDD_ADAPTER_MAGIC != pAdapter->magic)
+    if ( (pAdapter == NULL) || (WLAN_HDD_ADAPTER_MAGIC != pAdapter->magic))
     {
         VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
-                  "%s: Invalid pAdapter magic", __func__);
+                  "%s: Invalid pAdapter magic/ pAdapter is NULL", __func__);
     }
     else
     {
diff --git a/CORE/TL/src/wlan_qct_tl.c b/CORE/TL/src/wlan_qct_tl.c
index 3378207..3b9761a 100644
--- a/CORE/TL/src/wlan_qct_tl.c
+++ b/CORE/TL/src/wlan_qct_tl.c
@@ -1150,17 +1150,37 @@
     return VOS_STATUS_E_FAILURE;
   }
 
+  if (!VOS_IS_STATUS_SUCCESS(vos_lock_acquire(&(pClientSTA->ulaLock))))
+  {
+        TLLOGE(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,
+                "%s Get ULA Lock Fail", __func__));
+        return VOS_STATUS_E_FAILURE;
+  }
+
   if (pClientSTA->isEapolM4Transmitted ||
       pClientSTA->tlState == WLANTL_STA_AUTHENTICATED)
   {
     TLLOGE(VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_INFO,
            "WLAN TL: M4 is already received on %s", __func__));
+    if (!VOS_IS_STATUS_SUCCESS(vos_lock_release(&(pClientSTA->ulaLock))))
+    {
+        TLLOGE(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,
+                "%s Release ULA Lock Fail", __func__));
+        return VOS_STATUS_E_FAILURE;
+    }
     return VOS_STATUS_E_ALREADY;
   }
 
   pClientSTA->pfnSTAUlaComplete = (WLANTL_STAUlaCompleteCBType) callbackRoutine;
   pClientSTA->pUlaCBCtx = callbackContext;
 
+  if (!VOS_IS_STATUS_SUCCESS(vos_lock_release(&(pClientSTA->ulaLock))))
+  {
+        TLLOGE(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,
+                "%s Release ULA Lock Fail", __func__));
+        return VOS_STATUS_E_FAILURE;
+  }
+
   return VOS_STATUS_SUCCESS;
 }
 
@@ -1308,6 +1328,7 @@
   pClientSTA->wSTADesc.ucSTAId  = pwSTADescType->ucSTAId;
   pClientSTA->ptkInstalled = 0;
   pClientSTA->isEapolM4Transmitted = 0;
+  vos_lock_init(&pClientSTA->ulaLock);
 
   TLLOG2(VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_INFO_HIGH,
              "WLAN TL:Registering STA Client ID: %d with UC %d and BC %d", 
@@ -1601,6 +1622,8 @@
      vos_lock_destroy(&pTLCb->atlSTAClients[ucSTAId]->atlBAReorderInfo[ucIndex].reorderLock);
   }
 
+  /* delete ulaLock*/
+  vos_lock_destroy(&pTLCb->atlSTAClients[ucSTAId]->ulaLock);
 #ifdef FEATURE_WLAN_TDLS
   /* decrement ucTdlsPeerCount only if it is non-zero */  
   if(WLAN_STA_TDLS == pTLCb->atlSTAClients[ucSTAId]->wSTADesc.wSTAType
@@ -7655,11 +7678,25 @@
   // call ULA complete once M4 BD is filled.
   if (tlMetaInfo.ucEapolSubType == EAPOL_M4)
   {
+     if (!VOS_IS_STATUS_SUCCESS(vos_lock_acquire(&(pClientSTA->ulaLock))))
+     {
+        TLLOGE(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,
+                "%s Get ULA Lock Fail", __func__));
+        return VOS_STATUS_E_FAILURE;
+     }
+
      pClientSTA->isEapolM4Transmitted = 1;
      if (pClientSTA->pfnSTAUlaComplete)
          pClientSTA->pfnSTAUlaComplete(pClientSTA->pUlaCBCtx);
      pClientSTA->pfnSTAUlaComplete = NULL;
      pClientSTA->pUlaCBCtx = NULL;
+
+     if (!VOS_IS_STATUS_SUCCESS(vos_lock_release(&(pClientSTA->ulaLock))))
+     {
+        TLLOGE(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,
+                "%s Release ULA Lock Fail", __func__));
+        return VOS_STATUS_E_FAILURE;
+     }
   }
 
   /*-----------------------------------------------------------------------
diff --git a/CORE/TL/src/wlan_qct_tli.h b/CORE/TL/src/wlan_qct_tli.h
index 93794d2..07852da 100644
--- a/CORE/TL/src/wlan_qct_tli.h
+++ b/CORE/TL/src/wlan_qct_tli.h
@@ -688,6 +688,7 @@
 
   /* Flag to check EAPOL 4/4 recevied by TL*/
   v_U8_t isEapolM4Transmitted;
+  vos_lock_t ulaLock;
 
   v_U32_t       linkCapacity;