]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
ath11k: add trace log support
authorVenkateswara Naralasetty <quic_vnaralas@quicinc.com>
Tue, 9 Nov 2021 06:35:55 +0000 (12:05 +0530)
committerKalle Valo <kvalo@codeaurora.org>
Wed, 17 Nov 2021 07:29:34 +0000 (09:29 +0200)
This change is to add trace log support for,
        * WMI events
        * WMI commands
        * ath11k_dbg messages
        * ath11k_dbg_dump messages
        * ath11k_log_info messages
        * ath11k_log_warn messages
        * ath11k_log_err messages

Tested-on: IPQ8074 hw2.0 AHB WLAN.HK.2.5.0.1-00652-QCAHKSWPL_SILICONZ-1

Signed-off-by: Venkateswara Naralasetty <quic_vnaralas@quicinc.com>
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
Link: https://lore.kernel.org/r/1636439755-30419-1-git-send-email-quic_vnaralas@quicinc.com
drivers/net/wireless/ath/ath11k/debug.c
drivers/net/wireless/ath/ath11k/debug.h
drivers/net/wireless/ath/ath11k/trace.c
drivers/net/wireless/ath/ath11k/trace.h
drivers/net/wireless/ath/ath11k/wmi.c

index c86de95fbdc5853835c124f59c271cbf99d94b92..958d874290624a338b1b9d0470d331fb07f3108d 100644 (file)
@@ -17,7 +17,7 @@ void ath11k_info(struct ath11k_base *ab, const char *fmt, ...)
        va_start(args, fmt);
        vaf.va = &args;
        dev_info(ab->dev, "%pV", &vaf);
-       /* TODO: Trace the log */
+       trace_ath11k_log_info(ab, &vaf);
        va_end(args);
 }
 EXPORT_SYMBOL(ath11k_info);
@@ -32,7 +32,7 @@ void ath11k_err(struct ath11k_base *ab, const char *fmt, ...)
        va_start(args, fmt);
        vaf.va = &args;
        dev_err(ab->dev, "%pV", &vaf);
-       /* TODO: Trace the log */
+       trace_ath11k_log_err(ab, &vaf);
        va_end(args);
 }
 EXPORT_SYMBOL(ath11k_err);
@@ -47,7 +47,7 @@ void ath11k_warn(struct ath11k_base *ab, const char *fmt, ...)
        va_start(args, fmt);
        vaf.va = &args;
        dev_warn_ratelimited(ab->dev, "%pV", &vaf);
-       /* TODO: Trace the log */
+       trace_ath11k_log_warn(ab, &vaf);
        va_end(args);
 }
 EXPORT_SYMBOL(ath11k_warn);
@@ -68,7 +68,7 @@ void __ath11k_dbg(struct ath11k_base *ab, enum ath11k_debug_mask mask,
        if (ath11k_debug_mask & mask)
                dev_printk(KERN_DEBUG, ab->dev, "%pV", &vaf);
 
-       /* TODO: trace log */
+       trace_ath11k_log_dbg(ab, mask, &vaf);
 
        va_end(args);
 }
@@ -100,6 +100,10 @@ void ath11k_dbg_dump(struct ath11k_base *ab,
                        dev_printk(KERN_DEBUG, ab->dev, "%s\n", linebuf);
                }
        }
+
+       /* tracing code doesn't like null strings */
+       trace_ath11k_log_dbg_dump(ab, msg ? msg : "", prefix ? prefix : "",
+                                 buf, len);
 }
 EXPORT_SYMBOL(ath11k_dbg_dump);
 
index 659a275e2eb38a877ef367adbf3c672b140962db..fbbd5fe02aa83df210c8f823197090a7c6dce097 100644 (file)
@@ -60,7 +60,8 @@ static inline void ath11k_dbg_dump(struct ath11k_base *ab,
 
 #define ath11k_dbg(ar, dbg_mask, fmt, ...)                     \
 do {                                                           \
-       if (ath11k_debug_mask & dbg_mask)                       \
+       if ((ath11k_debug_mask & dbg_mask) ||                   \
+           trace_ath11k_log_dbg_enabled())                     \
                __ath11k_dbg(ar, dbg_mask, fmt, ##__VA_ARGS__); \
 } while (0)
 
index f0cc49ba0387fa3f0911ec42a00d4851cd9d7394..6620650d784502c51b7507b8cb2b9b95e04849f7 100644 (file)
@@ -7,3 +7,4 @@
 
 #define CREATE_TRACE_POINTS
 #include "trace.h"
+EXPORT_SYMBOL(__tracepoint_ath11k_log_dbg);
index 25d18e9d5b0b47f9e36ae121cfa605bf15a803ea..02003dc4207d5fb96f706694aaf30235c11ba3f0 100644 (file)
 #if !defined(CONFIG_ATH11K_TRACING)
 #undef TRACE_EVENT
 #define TRACE_EVENT(name, proto, ...) \
+static inline void trace_ ## name(proto) {} \
+static inline bool trace_##name##_enabled(void) \
+{                                              \
+       return false;                           \
+}
+
+#undef DECLARE_EVENT_CLASS
+#define DECLARE_EVENT_CLASS(...)
+#undef DEFINE_EVENT
+#define DEFINE_EVENT(evt_class, name, proto, ...) \
 static inline void trace_ ## name(proto) {}
 #endif /* !CONFIG_ATH11K_TRACING || __CHECKER__ */
 
 #undef TRACE_SYSTEM
 #define TRACE_SYSTEM ath11k
 
+#define ATH11K_MSG_MAX 400
+
 TRACE_EVENT(ath11k_htt_pktlog,
            TP_PROTO(struct ath11k *ar, const void *buf, u16 buf_len,
                     u32 pktlog_checksum),
@@ -108,6 +120,166 @@ TRACE_EVENT(ath11k_htt_rxdesc,
         )
 );
 
+DECLARE_EVENT_CLASS(ath11k_log_event,
+                   TP_PROTO(struct ath11k_base *ab, struct va_format *vaf),
+       TP_ARGS(ab, vaf),
+       TP_STRUCT__entry(
+               __string(device, dev_name(ab->dev))
+               __string(driver, dev_driver_string(ab->dev))
+               __dynamic_array(char, msg, ATH11K_MSG_MAX)
+       ),
+       TP_fast_assign(
+               __assign_str(device, dev_name(ab->dev));
+               __assign_str(driver, dev_driver_string(ab->dev));
+               WARN_ON_ONCE(vsnprintf(__get_dynamic_array(msg),
+                                      ATH11K_MSG_MAX,
+                                      vaf->fmt,
+                                      *vaf->va) >= ATH11K_MSG_MAX);
+       ),
+       TP_printk(
+               "%s %s %s",
+               __get_str(driver),
+               __get_str(device),
+               __get_str(msg)
+       )
+);
+
+DEFINE_EVENT(ath11k_log_event, ath11k_log_err,
+            TP_PROTO(struct ath11k_base *ab, struct va_format *vaf),
+            TP_ARGS(ab, vaf)
+);
+
+DEFINE_EVENT(ath11k_log_event, ath11k_log_warn,
+            TP_PROTO(struct ath11k_base *ab, struct va_format *vaf),
+            TP_ARGS(ab, vaf)
+);
+
+DEFINE_EVENT(ath11k_log_event, ath11k_log_info,
+            TP_PROTO(struct ath11k_base *ab, struct va_format *vaf),
+            TP_ARGS(ab, vaf)
+);
+
+TRACE_EVENT(ath11k_wmi_cmd,
+           TP_PROTO(struct ath11k_base *ab, int id, const void *buf, size_t buf_len),
+
+       TP_ARGS(ab, id, buf, buf_len),
+
+       TP_STRUCT__entry(
+               __string(device, dev_name(ab->dev))
+               __string(driver, dev_driver_string(ab->dev))
+               __field(unsigned int, id)
+               __field(size_t, buf_len)
+               __dynamic_array(u8, buf, buf_len)
+       ),
+
+       TP_fast_assign(
+               __assign_str(device, dev_name(ab->dev));
+               __assign_str(driver, dev_driver_string(ab->dev));
+               __entry->id = id;
+               __entry->buf_len = buf_len;
+               memcpy(__get_dynamic_array(buf), buf, buf_len);
+       ),
+
+       TP_printk(
+               "%s %s id %d len %zu",
+               __get_str(driver),
+               __get_str(device),
+               __entry->id,
+               __entry->buf_len
+        )
+);
+
+TRACE_EVENT(ath11k_wmi_event,
+           TP_PROTO(struct ath11k_base *ab, int id, const void *buf, size_t buf_len),
+
+       TP_ARGS(ab, id, buf, buf_len),
+
+       TP_STRUCT__entry(
+               __string(device, dev_name(ab->dev))
+               __string(driver, dev_driver_string(ab->dev))
+               __field(unsigned int, id)
+               __field(size_t, buf_len)
+               __dynamic_array(u8, buf, buf_len)
+       ),
+
+       TP_fast_assign(
+               __assign_str(device, dev_name(ab->dev));
+               __assign_str(driver, dev_driver_string(ab->dev));
+               __entry->id = id;
+               __entry->buf_len = buf_len;
+               memcpy(__get_dynamic_array(buf), buf, buf_len);
+       ),
+
+       TP_printk(
+               "%s %s id %d len %zu",
+               __get_str(driver),
+               __get_str(device),
+               __entry->id,
+               __entry->buf_len
+       )
+);
+
+TRACE_EVENT(ath11k_log_dbg,
+           TP_PROTO(struct ath11k_base *ab, unsigned int level, struct va_format *vaf),
+
+       TP_ARGS(ab, level, vaf),
+
+       TP_STRUCT__entry(
+               __string(device, dev_name(ab->dev))
+               __string(driver, dev_driver_string(ab->dev))
+               __field(unsigned int, level)
+               __dynamic_array(char, msg, ATH11K_MSG_MAX)
+       ),
+
+       TP_fast_assign(
+               __assign_str(device, dev_name(ab->dev));
+               __assign_str(driver, dev_driver_string(ab->dev));
+               __entry->level = level;
+               WARN_ON_ONCE(vsnprintf(__get_dynamic_array(msg),
+                                      ATH11K_MSG_MAX, vaf->fmt,
+                                      *vaf->va) >= ATH11K_MSG_MAX);
+       ),
+
+       TP_printk(
+               "%s %s %s",
+               __get_str(driver),
+               __get_str(device),
+               __get_str(msg)
+       )
+);
+
+TRACE_EVENT(ath11k_log_dbg_dump,
+           TP_PROTO(struct ath11k_base *ab, const char *msg, const char *prefix,
+                    const void *buf, size_t buf_len),
+
+       TP_ARGS(ab, msg, prefix, buf, buf_len),
+
+       TP_STRUCT__entry(
+               __string(device, dev_name(ab->dev))
+               __string(driver, dev_driver_string(ab->dev))
+               __string(msg, msg)
+               __string(prefix, prefix)
+               __field(size_t, buf_len)
+               __dynamic_array(u8, buf, buf_len)
+       ),
+
+       TP_fast_assign(
+               __assign_str(device, dev_name(ab->dev));
+               __assign_str(driver, dev_driver_string(ab->dev));
+               __assign_str(msg, msg);
+               __assign_str(prefix, prefix);
+               __entry->buf_len = buf_len;
+               memcpy(__get_dynamic_array(buf), buf, buf_len);
+       ),
+
+       TP_printk(
+               "%s %s %s/%s\n",
+               __get_str(driver),
+               __get_str(device),
+               __get_str(prefix),
+               __get_str(msg)
+       )
+);
 #endif /* _TRACE_H_ || TRACE_HEADER_MULTI_READ*/
 
 /* we don't want to use include/trace/events */
index 6bd355ce88d346ccbc450111538278dcfeba0c16..47e7fd127fd3c20f1e60a4746b78bd0a02d61bec 100644 (file)
@@ -249,6 +249,8 @@ static int ath11k_wmi_cmd_send_nowait(struct ath11k_pdev_wmi *wmi, struct sk_buf
        cmd_hdr = (struct wmi_cmd_hdr *)skb->data;
        cmd_hdr->cmd_id = cmd;
 
+       trace_ath11k_wmi_cmd(ab, cmd_id, skb->data, skb->len);
+
        memset(skb_cb, 0, sizeof(*skb_cb));
        ret = ath11k_htc_send(&ab->htc, wmi->eid, skb);
 
@@ -7103,6 +7105,8 @@ static void ath11k_wmi_tlv_op_rx(struct ath11k_base *ab, struct sk_buff *skb)
        cmd_hdr = (struct wmi_cmd_hdr *)skb->data;
        id = FIELD_GET(WMI_CMD_HDR_CMD_ID, (cmd_hdr->cmd_id));
 
+       trace_ath11k_wmi_event(ab, id, skb->data, skb->len);
+
        if (skb_pull(skb, sizeof(struct wmi_cmd_hdr)) == NULL)
                goto out;