clear the interface stats in host for set and clear commands

Host collects the following stats to provide them to the
llstats get request.
1. mgmtRx
2. rssiData
3. rxMcast
4. rxMpdu
5. rxAmpdu
6. txMcast

Clear the same when host receives corresponding clear request.

Firmware collects txMpdu stats, host need not to collect the same.

Change-Id: Iffd06d45622b386c79da5734c97c8a600468a6bb
CRs-Fixed: 751709
diff --git a/CORE/HDD/src/wlan_hdd_cfg80211.c b/CORE/HDD/src/wlan_hdd_cfg80211.c
index a3bdfd8..61f999f 100644
--- a/CORE/HDD/src/wlan_hdd_cfg80211.c
+++ b/CORE/HDD/src/wlan_hdd_cfg80211.c
@@ -866,44 +866,40 @@
 
             pWifiIfaceStat->mgmtRx = pWifiIfaceStat->beaconRx +
                 pWifiIfaceStatTL->mgmtRx;
-            pWifiIfaceStat->mgmtActionRx = pWifiIfaceStatTL->mgmtActionRx;
-            pWifiIfaceStat->mgmtActionTx = pWifiIfaceStatTL->mgmtActionTx;
             pWifiIfaceStat->rssiData = pWifiIfaceStatTL->rssiData;
 
-            vos_mem_copy(
-                  (void *) &pWifiIfaceStat->AccessclassStats[WIFI_AC_VO],
-                  (void *) &pWifiIfaceStatTL->accessCategoryStats[WLANTL_AC_VO],
-                  sizeof(WLANTL_AccessCategoryStatsType));
+            pWifiIfaceStat->AccessclassStats[WIFI_AC_VO].rxMcast
+                = pWifiIfaceStatTL->accessCategoryStats[WLANTL_AC_VO].rxMcast;
+            pWifiIfaceStat->AccessclassStats[WIFI_AC_VI].rxMcast
+                = pWifiIfaceStatTL->accessCategoryStats[WLANTL_AC_VI].rxMcast;
+            pWifiIfaceStat->AccessclassStats[WIFI_AC_BE].rxMcast
+                = pWifiIfaceStatTL->accessCategoryStats[WLANTL_AC_BE].rxMcast;
+            pWifiIfaceStat->AccessclassStats[WIFI_AC_BK].rxMcast
+                = pWifiIfaceStatTL->accessCategoryStats[WLANTL_AC_BK].rxMcast;
 
-            vos_mem_copy(
-                  (void *) &pWifiIfaceStat->AccessclassStats[WIFI_AC_VI],
-                  (void *) &pWifiIfaceStatTL->accessCategoryStats[WLANTL_AC_VI],
-                  sizeof(WLANTL_AccessCategoryStatsType));
+            pWifiIfaceStat->AccessclassStats[WIFI_AC_VO].rxMpdu
+                = pWifiIfaceStatTL->accessCategoryStats[WLANTL_AC_VO].rxMpdu;
+            pWifiIfaceStat->AccessclassStats[WIFI_AC_VI].rxMpdu
+                = pWifiIfaceStatTL->accessCategoryStats[WLANTL_AC_VI].rxMpdu;
+            pWifiIfaceStat->AccessclassStats[WIFI_AC_BE].rxMpdu
+                = pWifiIfaceStatTL->accessCategoryStats[WLANTL_AC_BE].rxMpdu;
+            pWifiIfaceStat->AccessclassStats[WIFI_AC_BK].rxMpdu
+                = pWifiIfaceStatTL->accessCategoryStats[WLANTL_AC_BK].rxMpdu;
 
-            vos_mem_copy(
-                  (void *) &pWifiIfaceStat->AccessclassStats[WIFI_AC_BE],
-                  (void *) &pWifiIfaceStatTL->accessCategoryStats[WLANTL_AC_BE],
-                  sizeof(WLANTL_AccessCategoryStatsType));
-
-            vos_mem_copy(
-                  (void *) &pWifiIfaceStat->AccessclassStats[WIFI_AC_BK],
-                  (void *) &pWifiIfaceStatTL->accessCategoryStats[WLANTL_AC_BK],
-                  sizeof(WLANTL_AccessCategoryStatsType));
+            pWifiIfaceStat->AccessclassStats[WIFI_AC_VO].rxAmpdu
+                = pWifiIfaceStatTL->accessCategoryStats[WLANTL_AC_VO].rxAmpdu;
+            pWifiIfaceStat->AccessclassStats[WIFI_AC_VI].rxAmpdu
+                = pWifiIfaceStatTL->accessCategoryStats[WLANTL_AC_VI].rxAmpdu;
+            pWifiIfaceStat->AccessclassStats[WIFI_AC_BE].rxAmpdu
+                = pWifiIfaceStatTL->accessCategoryStats[WLANTL_AC_BE].rxAmpdu;
+            pWifiIfaceStat->AccessclassStats[WIFI_AC_BK].rxAmpdu
+                = pWifiIfaceStatTL->accessCategoryStats[WLANTL_AC_BK].rxAmpdu;
         }
         else
         {
             hddLog(VOS_TRACE_LEVEL_ERROR, FL("Error in getting stats from TL"));
         }
 
-        pWifiIfaceStat->AccessclassStats[WIFI_AC_VO].txMpdu =
-            pAdapter->hdd_stats.hddTxRxStats.txFetchedAC[WLANTL_AC_VO];
-        pWifiIfaceStat->AccessclassStats[WIFI_AC_VI].txMpdu =
-            pAdapter->hdd_stats.hddTxRxStats.txFetchedAC[WLANTL_AC_VI];
-        pWifiIfaceStat->AccessclassStats[WIFI_AC_BE].txMpdu =
-            pAdapter->hdd_stats.hddTxRxStats.txFetchedAC[WLANTL_AC_BE];
-        pWifiIfaceStat->AccessclassStats[WIFI_AC_BK].txMpdu =
-            pAdapter->hdd_stats.hddTxRxStats.txFetchedAC[WLANTL_AC_BK];
-
         pWifiIfaceStat->AccessclassStats[WIFI_AC_VO].txMcast =
             pAdapter->hdd_stats.hddTxRxStats.txMcast[WLANTL_AC_VO];
         pWifiIfaceStat->AccessclassStats[WIFI_AC_VI].txMcast =
@@ -1631,6 +1627,7 @@
     struct net_device *dev = wdev->netdev;
     hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR(dev);
     hdd_context_t *pHddCtx = wiphy_priv(wiphy);
+    hdd_station_ctx_t *pHddStaCtx;
 
     status = wlan_hdd_validate_context(pHddCtx);
     if (0 != status)
@@ -1709,6 +1706,22 @@
         return -EINVAL;
 
     }
+
+    pHddStaCtx = WLAN_HDD_GET_STATION_CTX_PTR(pAdapter);
+    if (VOS_STATUS_SUCCESS !=
+        WLANTL_ClearInterfaceStats((WLAN_HDD_GET_CTX(pAdapter))->pvosContext,
+        pHddStaCtx->conn_info.staId[0], WIFI_STATS_IFACE))
+    {
+        hddLog(VOS_TRACE_LEVEL_ERROR, "%s:"
+                "WLANTL_ClearInterfaceStats Failed", __func__);
+        return -EINVAL;
+    }
+
+    pAdapter->hdd_stats.hddTxRxStats.txMcast[WLANTL_AC_VO] = 0;
+    pAdapter->hdd_stats.hddTxRxStats.txMcast[WLANTL_AC_VI] = 0;
+    pAdapter->hdd_stats.hddTxRxStats.txMcast[WLANTL_AC_BE] = 0;
+    pAdapter->hdd_stats.hddTxRxStats.txMcast[WLANTL_AC_BK] = 0;
+
     if (eHAL_STATUS_SUCCESS != sme_LLStatsSetReq( pHddCtx->hHal,
                                             &linkLayerStatsSetReq))
     {
@@ -1936,6 +1949,25 @@
                                                      &linkLayerStatsClearReq))
     {
         struct sk_buff *temp_skbuff;
+        hdd_station_ctx_t *pHddStaCtx;
+
+        pHddStaCtx = WLAN_HDD_GET_STATION_CTX_PTR(pAdapter);
+        if (VOS_STATUS_SUCCESS !=
+           WLANTL_ClearInterfaceStats((WLAN_HDD_GET_CTX(pAdapter))->pvosContext,
+           pHddStaCtx->conn_info.staId[0], statsClearReqMask))
+        {
+            hddLog(VOS_TRACE_LEVEL_ERROR, "%s:"
+                    "WLANTL_ClearInterfaceStats Failed", __func__);
+            return -EINVAL;
+        }
+        if ((statsClearReqMask & WIFI_STATS_IFACE_AC) ||
+                (statsClearReqMask & WIFI_STATS_IFACE)) {
+            pAdapter->hdd_stats.hddTxRxStats.txMcast[WLANTL_AC_VO] = 0;
+            pAdapter->hdd_stats.hddTxRxStats.txMcast[WLANTL_AC_VI] = 0;
+            pAdapter->hdd_stats.hddTxRxStats.txMcast[WLANTL_AC_BE] = 0;
+            pAdapter->hdd_stats.hddTxRxStats.txMcast[WLANTL_AC_BK] = 0;
+        }
+
         temp_skbuff = cfg80211_vendor_cmd_alloc_reply_skb(wiphy,
                                 2 * sizeof(u32) +
                             NLMSG_HDRLEN);