wlan: Refactoring IBSS data path.

Added init/deinit tx/rx api for IBSS network.
Added support to register specific hard start xmit
API explicitly for IBSS and also call IBSS specific
init API in __wlan_hdd_cfg80211_change_iface when
interface is adhoc type. Also added snapshot of IBSS
queues in hdd_wmm_tx_snapshot.

Change-Id: Id7f7544d3062ea5242c04b5b0d4a4b2f1f806515
CRs-Fixed: 785358
diff --git a/CORE/HDD/src/wlan_hdd_assoc.c b/CORE/HDD/src/wlan_hdd_assoc.c
index 10437c4..e76c2c1 100644
--- a/CORE/HDD/src/wlan_hdd_assoc.c
+++ b/CORE/HDD/src/wlan_hdd_assoc.c
@@ -745,6 +745,10 @@
 
 VOS_STATUS hdd_ibss_deinit_tx_rx_sta ( hdd_adapter_t *pAdapter, v_U8_t STAId )
 {
+   v_U8_t ac;
+   /**Track whether OS TX queue has been disabled.*/
+   v_BOOL_t txSuspended[NUM_TX_QUEUES];
+   v_U8_t tlAC;
    v_U8_t i;
    hdd_station_ctx_t *pHddStaCtx = WLAN_HDD_GET_STATION_CTX_PTR(pAdapter);
    hdd_ibss_peer_info_t *pPeerInfo;
@@ -755,6 +759,7 @@
                    "%s: HDD station context NULL ",__func__);
         return VOS_STATUS_E_FAILURE;
    }
+
    pPeerInfo = &pHddStaCtx->ibss_peer_info;
    if (FALSE == pPeerInfo->ibssStaInfo[STAId].isUsed)
    {
@@ -764,8 +769,33 @@
    }
 
    hdd_flush_ibss_tx_queues(pAdapter, STAId);
+
+   for (ac = HDD_LINUX_AC_VO; ac <= HDD_LINUX_AC_BK; ac++)
+   {
+      tlAC = hdd_QdiscAcToTlAC[ac];
+      txSuspended[ac] = pPeerInfo->ibssStaInfo[STAId].txSuspended[tlAC];
+   }
+
    vos_mem_zero(&pPeerInfo->ibssStaInfo[STAId], sizeof(hdd_ibss_station_info_t));
 
+   /* re-init hdd list, since netdev can still open adapter until
+    * driver gets unloaded
+    */
+   for (i = 0; i < NUM_TX_QUEUES; i ++)
+   {
+      hdd_list_init(&pPeerInfo->ibssStaInfo[STAId].wmm_tx_queue[i],
+                    HDD_TX_QUEUE_MAX_LEN);
+   }
+
+   for (ac = HDD_LINUX_AC_VO; ac <= HDD_LINUX_AC_BK; ac++)
+   {
+      if (txSuspended[ac])
+      {
+         VOS_TRACE( VOS_MODULE_ID_HDD_DATA, VOS_TRACE_LEVEL_INFO,
+                    "%s: TX queue re-enabled", __func__);
+         netif_wake_subqueue(pAdapter->dev, ac);
+      }
+   }
    return VOS_STATUS_SUCCESS;
 }