Skip to content

Commit

Permalink
ath11k: add trace log support
Browse files Browse the repository at this point in the history
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
  • Loading branch information
Venkateswara Naralasetty authored and Kalle Valo committed Nov 17, 2021
1 parent 1ad6e4b commit fb12305
Show file tree
Hide file tree
Showing 5 changed files with 187 additions and 5 deletions.
12 changes: 8 additions & 4 deletions drivers/net/wireless/ath/ath11k/debug.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand All @@ -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);
Expand All @@ -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);
Expand All @@ -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);
}
Expand Down Expand Up @@ -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);

Expand Down
3 changes: 2 additions & 1 deletion drivers/net/wireless/ath/ath11k/debug.h
Original file line number Diff line number Diff line change
Expand Up @@ -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)

Expand Down
1 change: 1 addition & 0 deletions drivers/net/wireless/ath/ath11k/trace.c
Original file line number Diff line number Diff line change
Expand Up @@ -7,3 +7,4 @@

#define CREATE_TRACE_POINTS
#include "trace.h"
EXPORT_SYMBOL(__tracepoint_ath11k_log_dbg);
172 changes: 172 additions & 0 deletions drivers/net/wireless/ath/ath11k/trace.h
Original file line number Diff line number Diff line change
Expand Up @@ -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),
Expand Down Expand Up @@ -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 */
Expand Down
4 changes: 4 additions & 0 deletions drivers/net/wireless/ath/ath11k/wmi.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand Down Expand Up @@ -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;

Expand Down

0 comments on commit fb12305

Please sign in to comment.