summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRajeev Kumar <rajekuma@qca.qualcomm.com>2015-08-25 16:58:33 -0700
committerAnjaneedevi Kapparapu <akappa@codeaurora.org>2015-08-26 15:58:16 +0530
commit25a6aa4d366aa8d2ff17fc053db18a4663bec2d2 (patch)
tree36726e0d73627bdb2df907f89951dd9757135ad1
parent0500d88ba99bba370f05ba4437936ec553279fbb (diff)
qcacld: Add debug counters to track pattern match wake ups
Add debug counters to track pattern match wake ups Change-Id: Ibba96352773390375dc691868713cef7f50d47d0 CRs-Fixed: 896615
-rw-r--r--CORE/SERVICES/WMA/wma.c91
-rw-r--r--CORE/SERVICES/WMA/wma.h24
2 files changed, 115 insertions, 0 deletions
diff --git a/CORE/SERVICES/WMA/wma.c b/CORE/SERVICES/WMA/wma.c
index 76d8579d97a4..66320e4743af 100644
--- a/CORE/SERVICES/WMA/wma.c
+++ b/CORE/SERVICES/WMA/wma.c
@@ -18776,6 +18776,94 @@ static void wma_extscan_wow_event_callback(void *handle, void *event,
}
#endif
+/**
+ * wma_wow_wake_up_stats_display() - display wow wake up stats
+ * @wma: Pointer to wma handle
+ *
+ * Return: none
+ */
+static void wma_wow_wake_up_stats_display(tp_wma_handle wma)
+{
+ WMA_LOGA("ucast %d bcast %d ipv4_mcast %d ipv6_mcast %d ipv6_mcast_ra %d ipv6_mcast_ns %d ipv6_mcast_na %d",
+ wma->wow_ucast_wake_up_count,
+ wma->wow_bcast_wake_up_count,
+ wma->wow_ipv4_mcast_wake_up_count,
+ wma->wow_ipv6_mcast_wake_up_count,
+ wma->wow_ipv6_mcast_ra_stats,
+ wma->wow_ipv6_mcast_ns_stats,
+ wma->wow_ipv6_mcast_na_stats);
+
+ return;
+}
+
+/**
+ * wma_wow_ipv6_mcast_stats() - ipv6 mcast wake up stats
+ * @wma: Pointer to wma handle
+ * @data: Pointer to pattern match data
+ *
+ * Return: none
+ */
+static void wma_wow_ipv6_mcast_stats(tp_wma_handle wma, uint8_t *data)
+{
+ static const uint8_t ipv6_mcast[] = {0x86, 0xDD};
+
+ if (!memcmp(ipv6_mcast, (data + WMA_ETHER_TYPE_OFFSET),
+ sizeof(ipv6_mcast))) {
+ if (WMA_ICMP_V6_HEADER_TYPE ==
+ *(data + WMA_ICMP_V6_HEADER_OFFSET)) {
+ if (WMA_ICMP_V6_RA_TYPE ==
+ *(data + WMA_ICMP_V6_TYPE_OFFSET))
+ wma->wow_ipv6_mcast_ra_stats++;
+ else if (WMA_ICMP_V6_NS_TYPE ==
+ *(data + WMA_ICMP_V6_TYPE_OFFSET))
+ wma->wow_ipv6_mcast_ns_stats++;
+ else if (WMA_ICMP_V6_NA_TYPE ==
+ *(data + WMA_ICMP_V6_TYPE_OFFSET))
+ wma->wow_ipv6_mcast_na_stats++;
+ else
+ WMA_LOGA("ICMP V6 type : 0x%x",
+ *(data + WMA_ICMP_V6_TYPE_OFFSET));
+ } else {
+ WMA_LOGA("ICMP_V6 header 0x%x",
+ *(data + WMA_ICMP_V6_HEADER_OFFSET));
+ }
+ } else {
+ WMA_LOGA("Ethertype x%x:0x%x",
+ *(data + WMA_ETHER_TYPE_OFFSET),
+ *(data + WMA_ETHER_TYPE_OFFSET + 1));
+ }
+
+ return;
+}
+
+/**
+ * wma_wow_wake_up_stats() - maintain wow pattern match wake up stats
+ * @wma: Pointer to wma handle
+ * @data: Pointer to pattern match data
+ * @len: Pattern match data length
+ *
+ * Return: none
+ */
+static void wma_wow_wake_up_stats(tp_wma_handle wma, uint8_t *data, int32_t len)
+{
+
+ if (WMA_BCAST_MAC_ADDR == *data) {
+ wma->wow_bcast_wake_up_count++;
+ } else if (WMA_MCAST_IPV4_MAC_ADDR == *data) {
+ wma->wow_ipv4_mcast_wake_up_count++;
+ } else if (WMA_MCAST_IPV6_MAC_ADDR == *data) {
+ wma->wow_ipv6_mcast_wake_up_count++;
+ if (len > WMA_ICMP_V6_TYPE_OFFSET)
+ wma_wow_ipv6_mcast_stats(wma, data);
+ else
+ WMA_LOGA("ICMP_V6 data len %d", len);
+ } else {
+ wma->wow_ucast_wake_up_count++;
+ }
+
+ return;
+}
+
/*
* Handler to catch wow wakeup host event. This event will have
* reason why the firmware has woken the host.
@@ -18895,11 +18983,14 @@ static int wma_wow_wakeup_host_event(void *handle, u_int8_t *event,
case WOW_REASON_HTT_EVENT:
break;
case WOW_REASON_PATTERN_MATCH_FOUND:
+ wma_wow_wake_up_stats_display(wma);
WMA_LOGD("Wake up for Rx packet, dump starting from ethernet hdr");
if (param_buf->wow_packet_buffer) {
/* First 4-bytes of wow_packet_buffer is the length */
vos_mem_copy((u_int8_t *) &wow_buf_pkt_len,
param_buf->wow_packet_buffer, 4);
+ wma_wow_wake_up_stats(wma,
+ param_buf->wow_packet_buffer + 4, wow_buf_pkt_len);
vos_trace_hex_dump(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_DEBUG,
param_buf->wow_packet_buffer + 4,
wow_buf_pkt_len);
diff --git a/CORE/SERVICES/WMA/wma.h b/CORE/SERVICES/WMA/wma.h
index ecfd13211190..49aa0e592036 100644
--- a/CORE/SERVICES/WMA/wma.h
+++ b/CORE/SERVICES/WMA/wma.h
@@ -162,6 +162,21 @@
#define BEACON_TX_BUFFER_SIZE (512)
+/* WMA_ETHER_TYPE_OFFSET = sa(6) + da(6) */
+#define WMA_ETHER_TYPE_OFFSET (6 + 6)
+/* WMA_ICMP_V6_HEADER_OFFSET = sa(6) + da(6) + eth_type(2) + icmp_v6_hdr(6)*/
+#define WMA_ICMP_V6_HEADER_OFFSET (6 + 6 + 2 + 6)
+/* WMA_ICMP_V6_TYPE_OFFSET = sa(6) + da(6) + eth_type(2) + 40 */
+#define WMA_ICMP_V6_TYPE_OFFSET (6 + 6 + 2 + 40)
+
+#define WMA_ICMP_V6_HEADER_TYPE (0x3A)
+#define WMA_ICMP_V6_RA_TYPE (0x86)
+#define WMA_ICMP_V6_NS_TYPE (0x87)
+#define WMA_ICMP_V6_NA_TYPE (0x88)
+#define WMA_BCAST_MAC_ADDR (0xFF)
+#define WMA_MCAST_IPV4_MAC_ADDR (0x01)
+#define WMA_MCAST_IPV6_MAC_ADDR (0x33)
+
typedef struct probeTime_dwellTime {
u_int8_t dwell_time;
u_int8_t probe_time;
@@ -785,6 +800,15 @@ typedef struct wma_handle {
uint32_t num_of_diag_events_logs;
uint32_t *events_logs_list;
+
+ uint32_t wow_ucast_wake_up_count;
+ uint32_t wow_bcast_wake_up_count;
+ uint32_t wow_ipv4_mcast_wake_up_count;
+ uint32_t wow_ipv6_mcast_wake_up_count;
+ uint32_t wow_ipv6_mcast_ra_stats;
+ uint32_t wow_ipv6_mcast_ns_stats;
+ uint32_t wow_ipv6_mcast_na_stats;
+
}t_wma_handle, *tp_wma_handle;
struct wma_target_cap {