162306a36Sopenharmony_ci/* SPDX-License-Identifier: ISC */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * Copyright (c) 2013-2016 Qualcomm Atheros, Inc.
462306a36Sopenharmony_ci * Copyright (c) 2019, The Linux Foundation. All rights reserved.
562306a36Sopenharmony_ci */
662306a36Sopenharmony_ci
762306a36Sopenharmony_ci#undef TRACE_SYSTEM
862306a36Sopenharmony_ci#define TRACE_SYSTEM wil6210
962306a36Sopenharmony_ci#if !defined(WIL6210_TRACE_H) || defined(TRACE_HEADER_MULTI_READ)
1062306a36Sopenharmony_ci#define WIL6210_TRACE_H
1162306a36Sopenharmony_ci
1262306a36Sopenharmony_ci#include <linux/tracepoint.h>
1362306a36Sopenharmony_ci#include "wil6210.h"
1462306a36Sopenharmony_ci#include "txrx.h"
1562306a36Sopenharmony_ci
1662306a36Sopenharmony_ci/* create empty functions when tracing is disabled */
1762306a36Sopenharmony_ci#if !defined(CONFIG_WIL6210_TRACING) || defined(__CHECKER__)
1862306a36Sopenharmony_ci
1962306a36Sopenharmony_ci#undef TRACE_EVENT
2062306a36Sopenharmony_ci#define TRACE_EVENT(name, proto, ...) \
2162306a36Sopenharmony_cistatic inline void trace_ ## name(proto) {}
2262306a36Sopenharmony_ci#undef DECLARE_EVENT_CLASS
2362306a36Sopenharmony_ci#define DECLARE_EVENT_CLASS(...)
2462306a36Sopenharmony_ci#undef DEFINE_EVENT
2562306a36Sopenharmony_ci#define DEFINE_EVENT(evt_class, name, proto, ...) \
2662306a36Sopenharmony_cistatic inline void trace_ ## name(proto) {}
2762306a36Sopenharmony_ci#endif /* !CONFIG_WIL6210_TRACING || defined(__CHECKER__) */
2862306a36Sopenharmony_ci
2962306a36Sopenharmony_ciDECLARE_EVENT_CLASS(wil6210_wmi,
3062306a36Sopenharmony_ci	TP_PROTO(struct wmi_cmd_hdr *wmi, void *buf, u16 buf_len),
3162306a36Sopenharmony_ci
3262306a36Sopenharmony_ci	TP_ARGS(wmi, buf, buf_len),
3362306a36Sopenharmony_ci
3462306a36Sopenharmony_ci	TP_STRUCT__entry(
3562306a36Sopenharmony_ci		__field(u8, mid)
3662306a36Sopenharmony_ci		__field(u16, command_id)
3762306a36Sopenharmony_ci		__field(u32, fw_timestamp)
3862306a36Sopenharmony_ci		__field(u16, buf_len)
3962306a36Sopenharmony_ci		__dynamic_array(u8, buf, buf_len)
4062306a36Sopenharmony_ci	),
4162306a36Sopenharmony_ci
4262306a36Sopenharmony_ci	TP_fast_assign(
4362306a36Sopenharmony_ci		__entry->mid = wmi->mid;
4462306a36Sopenharmony_ci		__entry->command_id = le16_to_cpu(wmi->command_id);
4562306a36Sopenharmony_ci		__entry->fw_timestamp = le32_to_cpu(wmi->fw_timestamp);
4662306a36Sopenharmony_ci		__entry->buf_len = buf_len;
4762306a36Sopenharmony_ci		memcpy(__get_dynamic_array(buf), buf, buf_len);
4862306a36Sopenharmony_ci	),
4962306a36Sopenharmony_ci
5062306a36Sopenharmony_ci	TP_printk(
5162306a36Sopenharmony_ci		"MID %d id 0x%04x len %d timestamp %d",
5262306a36Sopenharmony_ci		__entry->mid, __entry->command_id, __entry->buf_len,
5362306a36Sopenharmony_ci		__entry->fw_timestamp
5462306a36Sopenharmony_ci	)
5562306a36Sopenharmony_ci);
5662306a36Sopenharmony_ci
5762306a36Sopenharmony_ciDEFINE_EVENT(wil6210_wmi, wil6210_wmi_cmd,
5862306a36Sopenharmony_ci	TP_PROTO(struct wmi_cmd_hdr *wmi, void *buf, u16 buf_len),
5962306a36Sopenharmony_ci	TP_ARGS(wmi, buf, buf_len)
6062306a36Sopenharmony_ci);
6162306a36Sopenharmony_ci
6262306a36Sopenharmony_ciDEFINE_EVENT(wil6210_wmi, wil6210_wmi_event,
6362306a36Sopenharmony_ci	TP_PROTO(struct wmi_cmd_hdr *wmi, void *buf, u16 buf_len),
6462306a36Sopenharmony_ci	TP_ARGS(wmi, buf, buf_len)
6562306a36Sopenharmony_ci);
6662306a36Sopenharmony_ci
6762306a36Sopenharmony_ci#define WIL6210_MSG_MAX (200)
6862306a36Sopenharmony_ci
6962306a36Sopenharmony_ciDECLARE_EVENT_CLASS(wil6210_log_event,
7062306a36Sopenharmony_ci	TP_PROTO(struct va_format *vaf),
7162306a36Sopenharmony_ci	TP_ARGS(vaf),
7262306a36Sopenharmony_ci	TP_STRUCT__entry(
7362306a36Sopenharmony_ci		__vstring(msg, vaf->fmt, vaf->va)
7462306a36Sopenharmony_ci	),
7562306a36Sopenharmony_ci	TP_fast_assign(
7662306a36Sopenharmony_ci		__assign_vstr(msg, vaf->fmt, vaf->va);
7762306a36Sopenharmony_ci	),
7862306a36Sopenharmony_ci	TP_printk("%s", __get_str(msg))
7962306a36Sopenharmony_ci);
8062306a36Sopenharmony_ci
8162306a36Sopenharmony_ciDEFINE_EVENT(wil6210_log_event, wil6210_log_err,
8262306a36Sopenharmony_ci	TP_PROTO(struct va_format *vaf),
8362306a36Sopenharmony_ci	TP_ARGS(vaf)
8462306a36Sopenharmony_ci);
8562306a36Sopenharmony_ci
8662306a36Sopenharmony_ciDEFINE_EVENT(wil6210_log_event, wil6210_log_info,
8762306a36Sopenharmony_ci	TP_PROTO(struct va_format *vaf),
8862306a36Sopenharmony_ci	TP_ARGS(vaf)
8962306a36Sopenharmony_ci);
9062306a36Sopenharmony_ci
9162306a36Sopenharmony_ciDEFINE_EVENT(wil6210_log_event, wil6210_log_dbg,
9262306a36Sopenharmony_ci	TP_PROTO(struct va_format *vaf),
9362306a36Sopenharmony_ci	TP_ARGS(vaf)
9462306a36Sopenharmony_ci);
9562306a36Sopenharmony_ci
9662306a36Sopenharmony_ci#define wil_pseudo_irq_cause(x) __print_flags(x, "|",	\
9762306a36Sopenharmony_ci	{BIT_DMA_PSEUDO_CAUSE_RX,	"Rx" },		\
9862306a36Sopenharmony_ci	{BIT_DMA_PSEUDO_CAUSE_TX,	"Tx" },		\
9962306a36Sopenharmony_ci	{BIT_DMA_PSEUDO_CAUSE_MISC,	"Misc" })
10062306a36Sopenharmony_ci
10162306a36Sopenharmony_ciTRACE_EVENT(wil6210_irq_pseudo,
10262306a36Sopenharmony_ci	TP_PROTO(u32 x),
10362306a36Sopenharmony_ci	TP_ARGS(x),
10462306a36Sopenharmony_ci	TP_STRUCT__entry(
10562306a36Sopenharmony_ci		__field(u32, x)
10662306a36Sopenharmony_ci	),
10762306a36Sopenharmony_ci	TP_fast_assign(
10862306a36Sopenharmony_ci		__entry->x = x;
10962306a36Sopenharmony_ci	),
11062306a36Sopenharmony_ci	TP_printk("cause 0x%08x : %s", __entry->x,
11162306a36Sopenharmony_ci		  wil_pseudo_irq_cause(__entry->x))
11262306a36Sopenharmony_ci);
11362306a36Sopenharmony_ci
11462306a36Sopenharmony_ciDECLARE_EVENT_CLASS(wil6210_irq,
11562306a36Sopenharmony_ci	TP_PROTO(u32 x),
11662306a36Sopenharmony_ci	TP_ARGS(x),
11762306a36Sopenharmony_ci	TP_STRUCT__entry(
11862306a36Sopenharmony_ci		__field(u32, x)
11962306a36Sopenharmony_ci	),
12062306a36Sopenharmony_ci	TP_fast_assign(
12162306a36Sopenharmony_ci		__entry->x = x;
12262306a36Sopenharmony_ci	),
12362306a36Sopenharmony_ci	TP_printk("cause 0x%08x", __entry->x)
12462306a36Sopenharmony_ci);
12562306a36Sopenharmony_ci
12662306a36Sopenharmony_ciDEFINE_EVENT(wil6210_irq, wil6210_irq_rx,
12762306a36Sopenharmony_ci	TP_PROTO(u32 x),
12862306a36Sopenharmony_ci	TP_ARGS(x)
12962306a36Sopenharmony_ci);
13062306a36Sopenharmony_ci
13162306a36Sopenharmony_ciDEFINE_EVENT(wil6210_irq, wil6210_irq_tx,
13262306a36Sopenharmony_ci	TP_PROTO(u32 x),
13362306a36Sopenharmony_ci	TP_ARGS(x)
13462306a36Sopenharmony_ci);
13562306a36Sopenharmony_ci
13662306a36Sopenharmony_ciDEFINE_EVENT(wil6210_irq, wil6210_irq_misc,
13762306a36Sopenharmony_ci	TP_PROTO(u32 x),
13862306a36Sopenharmony_ci	TP_ARGS(x)
13962306a36Sopenharmony_ci);
14062306a36Sopenharmony_ci
14162306a36Sopenharmony_ciDEFINE_EVENT(wil6210_irq, wil6210_irq_misc_thread,
14262306a36Sopenharmony_ci	TP_PROTO(u32 x),
14362306a36Sopenharmony_ci	TP_ARGS(x)
14462306a36Sopenharmony_ci);
14562306a36Sopenharmony_ci
14662306a36Sopenharmony_ciTRACE_EVENT(wil6210_rx,
14762306a36Sopenharmony_ci	TP_PROTO(u16 index, struct vring_rx_desc *d),
14862306a36Sopenharmony_ci	TP_ARGS(index, d),
14962306a36Sopenharmony_ci	TP_STRUCT__entry(
15062306a36Sopenharmony_ci		__field(u16, index)
15162306a36Sopenharmony_ci		__field(unsigned int, len)
15262306a36Sopenharmony_ci		__field(u8, mid)
15362306a36Sopenharmony_ci		__field(u8, cid)
15462306a36Sopenharmony_ci		__field(u8, tid)
15562306a36Sopenharmony_ci		__field(u8, type)
15662306a36Sopenharmony_ci		__field(u8, subtype)
15762306a36Sopenharmony_ci		__field(u16, seq)
15862306a36Sopenharmony_ci		__field(u8, mcs)
15962306a36Sopenharmony_ci	),
16062306a36Sopenharmony_ci	TP_fast_assign(
16162306a36Sopenharmony_ci		__entry->index = index;
16262306a36Sopenharmony_ci		__entry->len = d->dma.length;
16362306a36Sopenharmony_ci		__entry->mid = wil_rxdesc_mid(d);
16462306a36Sopenharmony_ci		__entry->cid = wil_rxdesc_cid(d);
16562306a36Sopenharmony_ci		__entry->tid = wil_rxdesc_tid(d);
16662306a36Sopenharmony_ci		__entry->type = wil_rxdesc_ftype(d);
16762306a36Sopenharmony_ci		__entry->subtype = wil_rxdesc_subtype(d);
16862306a36Sopenharmony_ci		__entry->seq = wil_rxdesc_seq(d);
16962306a36Sopenharmony_ci		__entry->mcs = wil_rxdesc_mcs(d);
17062306a36Sopenharmony_ci	),
17162306a36Sopenharmony_ci	TP_printk("index %d len %d mid %d cid (%%8) %d tid %d mcs %d seq 0x%03x"
17262306a36Sopenharmony_ci		  " type 0x%1x subtype 0x%1x", __entry->index, __entry->len,
17362306a36Sopenharmony_ci		  __entry->mid, __entry->cid, __entry->tid, __entry->mcs,
17462306a36Sopenharmony_ci		  __entry->seq, __entry->type, __entry->subtype)
17562306a36Sopenharmony_ci);
17662306a36Sopenharmony_ci
17762306a36Sopenharmony_ciTRACE_EVENT(wil6210_rx_status,
17862306a36Sopenharmony_ci	    TP_PROTO(struct wil6210_priv *wil, u8 use_compressed, u16 buff_id,
17962306a36Sopenharmony_ci		     void *msg),
18062306a36Sopenharmony_ci	    TP_ARGS(wil, use_compressed, buff_id, msg),
18162306a36Sopenharmony_ci	    TP_STRUCT__entry(__field(u8, use_compressed)
18262306a36Sopenharmony_ci			     __field(u16, buff_id)
18362306a36Sopenharmony_ci			     __field(unsigned int, len)
18462306a36Sopenharmony_ci			     __field(u8, mid)
18562306a36Sopenharmony_ci			     __field(u8, cid)
18662306a36Sopenharmony_ci			     __field(u8, tid)
18762306a36Sopenharmony_ci			     __field(u8, type)
18862306a36Sopenharmony_ci			     __field(u8, subtype)
18962306a36Sopenharmony_ci			     __field(u16, seq)
19062306a36Sopenharmony_ci			     __field(u8, mcs)
19162306a36Sopenharmony_ci	    ),
19262306a36Sopenharmony_ci	    TP_fast_assign(__entry->use_compressed = use_compressed;
19362306a36Sopenharmony_ci			   __entry->buff_id = buff_id;
19462306a36Sopenharmony_ci			   __entry->len = wil_rx_status_get_length(msg);
19562306a36Sopenharmony_ci			   __entry->mid = wil_rx_status_get_mid(msg);
19662306a36Sopenharmony_ci			   __entry->cid = wil_rx_status_get_cid(msg);
19762306a36Sopenharmony_ci			   __entry->tid = wil_rx_status_get_tid(msg);
19862306a36Sopenharmony_ci			   __entry->type = wil_rx_status_get_frame_type(wil,
19962306a36Sopenharmony_ci									msg);
20062306a36Sopenharmony_ci			   __entry->subtype = wil_rx_status_get_fc1(wil, msg);
20162306a36Sopenharmony_ci			   __entry->seq = wil_rx_status_get_seq(wil, msg);
20262306a36Sopenharmony_ci			   __entry->mcs = wil_rx_status_get_mcs(msg);
20362306a36Sopenharmony_ci	    ),
20462306a36Sopenharmony_ci	    TP_printk(
20562306a36Sopenharmony_ci		      "compressed %d buff_id %d len %d mid %d cid %d tid %d mcs %d seq 0x%03x type 0x%1x subtype 0x%1x",
20662306a36Sopenharmony_ci		      __entry->use_compressed, __entry->buff_id, __entry->len,
20762306a36Sopenharmony_ci		      __entry->mid, __entry->cid, __entry->tid, __entry->mcs,
20862306a36Sopenharmony_ci		      __entry->seq, __entry->type, __entry->subtype)
20962306a36Sopenharmony_ci);
21062306a36Sopenharmony_ci
21162306a36Sopenharmony_ciTRACE_EVENT(wil6210_tx,
21262306a36Sopenharmony_ci	TP_PROTO(u8 vring, u16 index, unsigned int len, u8 frags),
21362306a36Sopenharmony_ci	TP_ARGS(vring, index, len, frags),
21462306a36Sopenharmony_ci	TP_STRUCT__entry(
21562306a36Sopenharmony_ci		__field(u8, vring)
21662306a36Sopenharmony_ci		__field(u8, frags)
21762306a36Sopenharmony_ci		__field(u16, index)
21862306a36Sopenharmony_ci		__field(unsigned int, len)
21962306a36Sopenharmony_ci	),
22062306a36Sopenharmony_ci	TP_fast_assign(
22162306a36Sopenharmony_ci		__entry->vring = vring;
22262306a36Sopenharmony_ci		__entry->frags = frags;
22362306a36Sopenharmony_ci		__entry->index = index;
22462306a36Sopenharmony_ci		__entry->len = len;
22562306a36Sopenharmony_ci	),
22662306a36Sopenharmony_ci	TP_printk("vring %d index %d len %d frags %d",
22762306a36Sopenharmony_ci		  __entry->vring, __entry->index, __entry->len, __entry->frags)
22862306a36Sopenharmony_ci);
22962306a36Sopenharmony_ci
23062306a36Sopenharmony_ciTRACE_EVENT(wil6210_tx_done,
23162306a36Sopenharmony_ci	TP_PROTO(u8 vring, u16 index, unsigned int len, u8 err),
23262306a36Sopenharmony_ci	TP_ARGS(vring, index, len, err),
23362306a36Sopenharmony_ci	TP_STRUCT__entry(
23462306a36Sopenharmony_ci		__field(u8, vring)
23562306a36Sopenharmony_ci		__field(u8, err)
23662306a36Sopenharmony_ci		__field(u16, index)
23762306a36Sopenharmony_ci		__field(unsigned int, len)
23862306a36Sopenharmony_ci	),
23962306a36Sopenharmony_ci	TP_fast_assign(
24062306a36Sopenharmony_ci		__entry->vring = vring;
24162306a36Sopenharmony_ci		__entry->index = index;
24262306a36Sopenharmony_ci		__entry->len = len;
24362306a36Sopenharmony_ci		__entry->err = err;
24462306a36Sopenharmony_ci	),
24562306a36Sopenharmony_ci	TP_printk("vring %d index %d len %d err 0x%02x",
24662306a36Sopenharmony_ci		  __entry->vring, __entry->index, __entry->len,
24762306a36Sopenharmony_ci		  __entry->err)
24862306a36Sopenharmony_ci);
24962306a36Sopenharmony_ci
25062306a36Sopenharmony_ciTRACE_EVENT(wil6210_tx_status,
25162306a36Sopenharmony_ci	    TP_PROTO(struct wil_ring_tx_status *msg, u16 index,
25262306a36Sopenharmony_ci		     unsigned int len),
25362306a36Sopenharmony_ci	    TP_ARGS(msg, index, len),
25462306a36Sopenharmony_ci	    TP_STRUCT__entry(__field(u16, index)
25562306a36Sopenharmony_ci			     __field(unsigned int, len)
25662306a36Sopenharmony_ci			     __field(u8, num_descs)
25762306a36Sopenharmony_ci			     __field(u8, ring_id)
25862306a36Sopenharmony_ci			     __field(u8, status)
25962306a36Sopenharmony_ci			     __field(u8, mcs)
26062306a36Sopenharmony_ci
26162306a36Sopenharmony_ci	    ),
26262306a36Sopenharmony_ci	    TP_fast_assign(__entry->index = index;
26362306a36Sopenharmony_ci			   __entry->len = len;
26462306a36Sopenharmony_ci			   __entry->num_descs = msg->num_descriptors;
26562306a36Sopenharmony_ci			   __entry->ring_id = msg->ring_id;
26662306a36Sopenharmony_ci			   __entry->status = msg->status;
26762306a36Sopenharmony_ci			   __entry->mcs = wil_tx_status_get_mcs(msg);
26862306a36Sopenharmony_ci	    ),
26962306a36Sopenharmony_ci	    TP_printk(
27062306a36Sopenharmony_ci		      "ring_id %d swtail 0x%x len %d num_descs %d status 0x%x mcs %d",
27162306a36Sopenharmony_ci		      __entry->ring_id, __entry->index, __entry->len,
27262306a36Sopenharmony_ci		      __entry->num_descs, __entry->status, __entry->mcs)
27362306a36Sopenharmony_ci);
27462306a36Sopenharmony_ci
27562306a36Sopenharmony_ci#endif /* WIL6210_TRACE_H || TRACE_HEADER_MULTI_READ*/
27662306a36Sopenharmony_ci
27762306a36Sopenharmony_ci#if defined(CONFIG_WIL6210_TRACING) && !defined(__CHECKER__)
27862306a36Sopenharmony_ci/* we don't want to use include/trace/events */
27962306a36Sopenharmony_ci#undef TRACE_INCLUDE_PATH
28062306a36Sopenharmony_ci#define TRACE_INCLUDE_PATH .
28162306a36Sopenharmony_ci#undef TRACE_INCLUDE_FILE
28262306a36Sopenharmony_ci#define TRACE_INCLUDE_FILE trace
28362306a36Sopenharmony_ci
28462306a36Sopenharmony_ci/* This part must be outside protection */
28562306a36Sopenharmony_ci#include <trace/define_trace.h>
28662306a36Sopenharmony_ci#endif /* defined(CONFIG_WIL6210_TRACING) && !defined(__CHECKER__) */
287