WiFi-HAL: Process Rx events only if it carries Rx descriptor

Process only relevant Rx events coming from driver/firmware to
generate Rx per packet stats.

Change-Id: I3e3aa309f0cfee828f8075a78f8ff47f1f6da37a
diff --git a/qcwcn/wifi_hal/pkt_stats.h b/qcwcn/wifi_hal/pkt_stats.h
index 4b5f988..03a8abd 100644
--- a/qcwcn/wifi_hal/pkt_stats.h
+++ b/qcwcn/wifi_hal/pkt_stats.h
@@ -48,6 +48,29 @@
 #define INVALID_RSSI 255
 #define EVENT_RX_PEERINFO_SIZE 64
 
+#define PKT_INFO_FLG_TX_LOCAL_S          0x1
+#define PKT_INFO_FLG_RX_HOST_RXD         0x2
+#define PKT_INFO_FLG_TX_REMOTE_S         0x4
+#define PKT_INFO_FLG_RX_LOCAL_S          0x8
+#define PKT_INFO_FLG_RX_REMOTE_S         0x10
+#define PKT_INFO_FLG_RX_LOCAL_DISCARD_S  0x20
+#define PKT_INFO_FLG_RX_REMOTE_DISCARD_S 0x40
+#define PKT_INFO_FLG_RX_REORDER_STORE_S  0x80
+#define PKT_INFO_FLG_RX_REORDER_DROP_S   0x100
+#define PKT_INFO_FLG_RX_PEER_INFO_S      0x200
+#define PKT_INFO_FLG_UNKNOWN_S           0x400
+
+/* MASK value of flags based on RX_STAT content.
+ * These are the events that carry Rx decriptor
+ */
+#define PKT_INFO_FLG_RX_RXDESC_MASK \
+        (PKT_INFO_FLG_RX_HOST_RXD | \
+         PKT_INFO_FLG_RX_LOCAL_S | \
+         PKT_INFO_FLG_RX_REMOTE_S | \
+         PKT_INFO_FLG_RX_LOCAL_DISCARD_S | \
+         PKT_INFO_FLG_RX_REMOTE_DISCARD_S | \
+         PKT_INFO_FLG_RX_REORDER_STORE_S)
+
 /* Format of the packet stats event*/
 typedef struct {
     u16 flags;
diff --git a/qcwcn/wifi_hal/wifilogger_diag.cpp b/qcwcn/wifi_hal/wifilogger_diag.cpp
index 447d67c..5cf7a9c 100644
--- a/qcwcn/wifi_hal/wifilogger_diag.cpp
+++ b/qcwcn/wifi_hal/wifilogger_diag.cpp
@@ -1552,14 +1552,23 @@
     return status;
 }
 
-static wifi_error parse_stats_record(hal_info *info, u8 *buf, u16 record_type,
-                              u16 record_len)
+static wifi_error parse_stats_record(hal_info *info,
+                                     wh_pktlog_hdr_t *pkt_stats_header)
 {
     wifi_error status;
-    if (record_type == PKTLOG_TYPE_RX_STAT) {
-        status = parse_rx_stats(info, buf, record_len);
+    if (pkt_stats_header->log_type == PKTLOG_TYPE_RX_STAT) {
+        /* Ignore the event if it doesn't carry RX descriptor */
+        if (pkt_stats_header->flags & PKT_INFO_FLG_RX_RXDESC_MASK)
+            status = parse_rx_stats(info,
+                                    (u8 *)(pkt_stats_header + 1),
+                                    pkt_stats_header->size);
+        else
+            status = WIFI_SUCCESS;
     } else {
-        status = parse_tx_stats(info, buf, record_len, record_type);
+        status = parse_tx_stats(info,
+                                (u8 *)(pkt_stats_header + 1),
+                                pkt_stats_header->size,
+                                pkt_stats_header->log_type);
     }
     return status;
 }
@@ -1581,10 +1590,7 @@
             status = WIFI_ERROR_INVALID_ARGS;
             break;
         }
-        status = parse_stats_record(info,
-                                    (u8 *)(pkt_stats_header + 1),
-                                    pkt_stats_header->log_type,
-                                    pkt_stats_header->size);
+        status = parse_stats_record(info, pkt_stats_header);
         if (status != WIFI_SUCCESS) {
             ALOGE("Failed to parse the stats type : %d",
                   pkt_stats_header->log_type);