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);