Commit fb12305a authored by Venkateswara Naralasetty's avatar Venkateswara Naralasetty Committed by Kalle Valo
Browse files

ath11k: add trace log support



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: default avatarVenkateswara Naralasetty <quic_vnaralas@quicinc.com>
Signed-off-by: default avatarKalle Valo <kvalo@codeaurora.org>
Link: https://lore.kernel.org/r/1636439755-30419-1-git-send-email-quic_vnaralas@quicinc.com
parent 1ad6e4b0
Loading
Loading
Loading
Loading
+8 −4
Original line number Diff line number Diff line
@@ -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);

+2 −1
Original line number Diff line number Diff line
@@ -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)

+1 −0
Original line number Diff line number Diff line
@@ -7,3 +7,4 @@

#define CREATE_TRACE_POINTS
#include "trace.h"
EXPORT_SYMBOL(__tracepoint_ath11k_log_dbg);
+172 −0
Original line number Diff line number Diff line
@@ -14,12 +14,24 @@
#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 */
+4 −0
Original line number Diff line number Diff line
@@ -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;