Merge "wlan: Send PNO command via SME queue"
diff --git a/CORE/HDD/src/wlan_hdd_early_suspend.c b/CORE/HDD/src/wlan_hdd_early_suspend.c
index 129257b..8c2d25a 100644
--- a/CORE/HDD/src/wlan_hdd_early_suspend.c
+++ b/CORE/HDD/src/wlan_hdd_early_suspend.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012-2014 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2012-2015 The Linux Foundation. All rights reserved.
  *
  * Previously licensed under the ISC license by Qualcomm Atheros, Inc.
  *
@@ -510,32 +510,40 @@
 {
     struct inet6_ifaddr *ifa = (struct inet6_ifaddr *)arg;
     struct net_device *ndev = ifa->idev->dev;
-    hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR(ndev);
+    hdd_adapter_list_node_t *pAdapterNode = NULL, *pNext = NULL;
     hdd_context_t *pHddCtx;
+    VOS_STATUS vos_status;
     int status;
 
-    if (pAdapter && pAdapter->dev == ndev &&
-          (pAdapter->device_mode == WLAN_HDD_INFRA_STATION ||
-           pAdapter->device_mode == WLAN_HDD_P2P_CLIENT))
+    pHddCtx = container_of(nb, hdd_context_t, ipv6_notifier);
+    status = wlan_hdd_validate_context(pHddCtx);
+    if (0 != status)
     {
-        pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
-        status = wlan_hdd_validate_context(pHddCtx);
-        if (0 != status)
-        {
-            hddLog(LOGE, FL("HDD context is invalid"));
-            return NOTIFY_DONE;
-        }
+        hddLog(LOGE, FL("HDD context is invalid"));
+        return NOTIFY_DONE;
+    }
 
-       if (pHddCtx->cfg_ini->nEnableSuspend ==
+    vos_status = hdd_get_front_adapter(pHddCtx, &pAdapterNode);
+    while (NULL != pAdapterNode && VOS_STATUS_SUCCESS == vos_status)
+    {
+        if (pAdapterNode->pAdapter && pAdapterNode->pAdapter->dev == ndev &&
+             (pAdapterNode->pAdapter->device_mode == WLAN_HDD_INFRA_STATION ||
+              pAdapterNode->pAdapter->device_mode == WLAN_HDD_P2P_CLIENT))
+        {
+            if (pHddCtx->cfg_ini->nEnableSuspend ==
                   WLAN_MAP_SUSPEND_TO_MCAST_BCAST_FILTER)
-       {
-           schedule_work(&pAdapter->ipv6NotifierWorkQueue);
-       }
-       else
-       {
-           hddLog(LOG1, FL("Not scheduling ipv6 wq nEnableSuspend = %d"),
-                            pHddCtx->cfg_ini->nEnableSuspend);
-       }
+            {
+                schedule_work(&pAdapterNode->pAdapter->ipv6NotifierWorkQueue);
+            }
+            else
+            {
+                hddLog(LOG1, FL("Not scheduling ipv6 wq nEnableSuspend = %d"),
+                             pHddCtx->cfg_ini->nEnableSuspend);
+            }
+            break;
+        }
+        vos_status = hdd_get_next_adapter(pHddCtx, pAdapterNode, &pNext);
+        pAdapterNode = pNext;
     }
 
     return NOTIFY_DONE;
@@ -969,47 +977,57 @@
     struct in_device *in_dev;
 
     struct net_device *ndev = ifa->ifa_dev->dev;
-    hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR(ndev);
+    hdd_adapter_list_node_t *pAdapterNode = NULL, *pNext = NULL;
     hdd_context_t *pHddCtx;
+    VOS_STATUS vos_status;
     int status;
 
-    if (pAdapter && pAdapter->dev == ndev &&
-         (pAdapter->device_mode == WLAN_HDD_INFRA_STATION ||
-          pAdapter->device_mode == WLAN_HDD_P2P_CLIENT))
+    pHddCtx = container_of(nb, hdd_context_t, ipv4_notifier);
+    status = wlan_hdd_validate_context(pHddCtx);
+    if (0 != status)
     {
-       pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
-       status = wlan_hdd_validate_context(pHddCtx);
-       if (0 != status)
-       {
-           hddLog(LOGE, FL("HDD context is invalid"));
-           return NOTIFY_DONE;
-       }
+        hddLog(LOGE, FL("HDD context is invalid"));
+        return NOTIFY_DONE;
+    }
 
-       if ((pHddCtx->cfg_ini->nEnableSuspend !=
+    vos_status = hdd_get_front_adapter(pHddCtx, &pAdapterNode);
+    while (NULL != pAdapterNode && VOS_STATUS_SUCCESS == vos_status)
+    {
+        if (pAdapterNode->pAdapter && pAdapterNode->pAdapter->dev == ndev &&
+             (pAdapterNode->pAdapter->device_mode == WLAN_HDD_INFRA_STATION ||
+              pAdapterNode->pAdapter->device_mode == WLAN_HDD_P2P_CLIENT))
+        {
+            if ((pHddCtx->cfg_ini->nEnableSuspend !=
                   WLAN_MAP_SUSPEND_TO_MCAST_BCAST_FILTER)
-           || (!pHddCtx->cfg_ini->fhostArpOffload))
-       {
-           hddLog(LOG1, FL("Offload not enabled MCBC=%d, ARPOffload=%d"),
-                          pHddCtx->cfg_ini->nEnableSuspend,
-                          pHddCtx->cfg_ini->fhostArpOffload);
-           return NOTIFY_DONE;
-       }
+               || (!pHddCtx->cfg_ini->fhostArpOffload))
+            {
+                hddLog(LOG1, FL("Offload not enabled MCBC=%d, ARPOffload=%d"),
+                              pHddCtx->cfg_ini->nEnableSuspend,
+                              pHddCtx->cfg_ini->fhostArpOffload);
+                return NOTIFY_DONE;
+            }
 
-       if ((in_dev = __in_dev_get_rtnl(pAdapter->dev)) != NULL)
-       {
-           for (ifap = &in_dev->ifa_list; (ifa = *ifap) != NULL;
-                   ifap = &ifa->ifa_next)
-           {
-               if (!strcmp(pAdapter->dev->name, ifa->ifa_label))
-               {
-                   break; /* found */
-               }
-           }
-       }
-       if(ifa && ifa->ifa_local)
-       {
-           schedule_work(&pAdapter->ipv4NotifierWorkQueue);
-       }
+            if ((in_dev =
+                  __in_dev_get_rtnl(pAdapterNode->pAdapter->dev)) != NULL)
+            {
+                for (ifap = &in_dev->ifa_list; (ifa = *ifap) != NULL;
+                       ifap = &ifa->ifa_next)
+                {
+                    if (!strcmp(pAdapterNode->pAdapter->dev->name,
+                          ifa->ifa_label))
+                    {
+                        break; /* found */
+                    }
+                }
+            }
+            if(ifa && ifa->ifa_local)
+            {
+                schedule_work(&pAdapterNode->pAdapter->ipv4NotifierWorkQueue);
+            }
+            break;
+        }
+        vos_status = hdd_get_next_adapter(pHddCtx, pAdapterNode, &pNext);
+        pAdapterNode = pNext;
     }
 
     return NOTIFY_DONE;
diff --git a/CORE/HDD/src/wlan_hdd_softap_tx_rx.c b/CORE/HDD/src/wlan_hdd_softap_tx_rx.c
index c761cd7..544860f 100644
--- a/CORE/HDD/src/wlan_hdd_softap_tx_rx.c
+++ b/CORE/HDD/src/wlan_hdd_softap_tx_rx.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012-2014 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2012-2015 The Linux Foundation. All rights reserved.
  *
  * Previously licensed under the ISC license by Qualcomm Atheros, Inc.
  *
@@ -782,8 +782,6 @@
    pAdapter->aTxQueueLimit[WLANTL_AC_VI] = HDD_SOFTAP_TX_VI_QUEUE_MAX_LEN;
    pAdapter->aTxQueueLimit[WLANTL_AC_VO] = HDD_SOFTAP_TX_VO_QUEUE_MAX_LEN;
 
-   spin_lock_init( &pSapCtx->staInfo_lock );
-
    for (STAId = 0; STAId < WLAN_MAX_STA_COUNT; STAId++)
    {
       vos_mem_zero(&pSapCtx->aStaInfo[STAId], sizeof(hdd_station_info_t));
diff --git a/CORE/SAP/src/sapModule.c b/CORE/SAP/src/sapModule.c
index b7d6e2d..9bd6a17 100644
--- a/CORE/SAP/src/sapModule.c
+++ b/CORE/SAP/src/sapModule.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012-2013 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2012-2015 The Linux Foundation. All rights reserved.
  *
  * Previously licensed under the ISC license by Qualcomm Atheros, Inc.
  *
@@ -259,7 +259,12 @@
         return VOS_STATUS_E_FAULT;
     }
 
-
+    if (!VOS_IS_STATUS_SUCCESS(vos_spin_lock_init(&pSapCtx->staInfo_lock)))
+    {
+        VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_ERROR,
+                 "WLANSAP_Start failed init staInfo_lock\n");
+        return VOS_STATUS_E_FAULT;
+    }
 
     return VOS_STATUS_SUCCESS;
 }/* WLANSAP_Start */
diff --git a/CORE/SME/src/sme_common/sme_Api.c b/CORE/SME/src/sme_common/sme_Api.c
index d22dc4c..a8985ef 100644
--- a/CORE/SME/src/sme_common/sme_Api.c
+++ b/CORE/SME/src/sme_common/sme_Api.c
@@ -458,6 +458,13 @@
         csrLLUnlock(&pMac->roam.roamCmdPendingList);
     }
 
+    if( pRetCmd )
+    {
+         vos_mem_set((tANI_U8 *)&pRetCmd->command, sizeof(pRetCmd->command), 0);
+         vos_mem_set((tANI_U8 *)&pRetCmd->sessionId, sizeof(pRetCmd->sessionId), 0);
+         vos_mem_set((tANI_U8 *)&pRetCmd->u, sizeof(pRetCmd->u), 0);
+    }
+
     return( pRetCmd );
 }