1 /* SPDX-License-Identifier: ISC */ 2 /* 3 * Copyright (c) 2013-2016 Qualcomm Atheros, Inc. 4 * Copyright (c) 2019, The Linux Foundation. All rights reserved. 5 */ 6 7 #undef TRACE_SYSTEM 8 #define TRACE_SYSTEM wil6210 9 #if !defined(WIL6210_TRACE_H) || defined(TRACE_HEADER_MULTI_READ) 10 #define WIL6210_TRACE_H 11 12 #include <linux/tracepoint.h> 13 #include "wil6210.h" 14 #include "txrx.h" 15 16 /* create empty functions when tracing is disabled */ 17 #if !defined(CONFIG_WIL6210_TRACING) || defined(__CHECKER__) 18 19 #undef TRACE_EVENT 20 #define TRACE_EVENT(name, proto, ...) \ 21 static inline void trace_ ## name(proto) {} 22 #undef DECLARE_EVENT_CLASS 23 #define DECLARE_EVENT_CLASS(...) 24 #undef DEFINE_EVENT 25 #define DEFINE_EVENT(evt_class, name, proto, ...) \ 26 static inline void trace_ ## name(proto) {} 27 #endif /* !CONFIG_WIL6210_TRACING || defined(__CHECKER__) */ 28 29 DECLARE_EVENT_CLASS(wil6210_wmi, 30 TP_PROTO(struct wmi_cmd_hdr *wmi, void *buf, u16 buf_len), 31 32 TP_ARGS(wmi, buf, buf_len), 33 34 TP_STRUCT__entry( 35 __field(u8, mid) 36 __field(u16, command_id) 37 __field(u32, fw_timestamp) 38 __field(u16, buf_len) 39 __dynamic_array(u8, buf, buf_len) 40 ), 41 42 TP_fast_assign( 43 __entry->mid = wmi->mid; 44 __entry->command_id = le16_to_cpu(wmi->command_id); 45 __entry->fw_timestamp = le32_to_cpu(wmi->fw_timestamp); 46 __entry->buf_len = buf_len; 47 memcpy(__get_dynamic_array(buf), buf, buf_len); 48 ), 49 50 TP_printk( 51 "MID %d id 0x%04x len %d timestamp %d", 52 __entry->mid, __entry->command_id, __entry->buf_len, 53 __entry->fw_timestamp 54 ) 55 ); 56 57 DEFINE_EVENT(wil6210_wmi, wil6210_wmi_cmd, 58 TP_PROTO(struct wmi_cmd_hdr *wmi, void *buf, u16 buf_len), 59 TP_ARGS(wmi, buf, buf_len) 60 ); 61 62 DEFINE_EVENT(wil6210_wmi, wil6210_wmi_event, 63 TP_PROTO(struct wmi_cmd_hdr *wmi, void *buf, u16 buf_len), 64 TP_ARGS(wmi, buf, buf_len) 65 ); 66 67 #define WIL6210_MSG_MAX (200) 68 69 DECLARE_EVENT_CLASS(wil6210_log_event, 70 TP_PROTO(struct va_format *vaf), 71 TP_ARGS(vaf), 72 TP_STRUCT__entry( 73 __dynamic_array(char, msg, WIL6210_MSG_MAX) 74 ), 75 TP_fast_assign( 76 WARN_ON_ONCE(vsnprintf(__get_dynamic_array(msg), 77 WIL6210_MSG_MAX, 78 vaf->fmt, 79 *vaf->va) >= WIL6210_MSG_MAX); 80 ), 81 TP_printk("%s", __get_str(msg)) 82 ); 83 84 DEFINE_EVENT(wil6210_log_event, wil6210_log_err, 85 TP_PROTO(struct va_format *vaf), 86 TP_ARGS(vaf) 87 ); 88 89 DEFINE_EVENT(wil6210_log_event, wil6210_log_info, 90 TP_PROTO(struct va_format *vaf), 91 TP_ARGS(vaf) 92 ); 93 94 DEFINE_EVENT(wil6210_log_event, wil6210_log_dbg, 95 TP_PROTO(struct va_format *vaf), 96 TP_ARGS(vaf) 97 ); 98 99 #define wil_pseudo_irq_cause(x) __print_flags(x, "|", \ 100 {BIT_DMA_PSEUDO_CAUSE_RX, "Rx" }, \ 101 {BIT_DMA_PSEUDO_CAUSE_TX, "Tx" }, \ 102 {BIT_DMA_PSEUDO_CAUSE_MISC, "Misc" }) 103 104 TRACE_EVENT(wil6210_irq_pseudo, 105 TP_PROTO(u32 x), 106 TP_ARGS(x), 107 TP_STRUCT__entry( 108 __field(u32, x) 109 ), 110 TP_fast_assign( 111 __entry->x = x; 112 ), 113 TP_printk("cause 0x%08x : %s", __entry->x, 114 wil_pseudo_irq_cause(__entry->x)) 115 ); 116 117 DECLARE_EVENT_CLASS(wil6210_irq, 118 TP_PROTO(u32 x), 119 TP_ARGS(x), 120 TP_STRUCT__entry( 121 __field(u32, x) 122 ), 123 TP_fast_assign( 124 __entry->x = x; 125 ), 126 TP_printk("cause 0x%08x", __entry->x) 127 ); 128 129 DEFINE_EVENT(wil6210_irq, wil6210_irq_rx, 130 TP_PROTO(u32 x), 131 TP_ARGS(x) 132 ); 133 134 DEFINE_EVENT(wil6210_irq, wil6210_irq_tx, 135 TP_PROTO(u32 x), 136 TP_ARGS(x) 137 ); 138 139 DEFINE_EVENT(wil6210_irq, wil6210_irq_misc, 140 TP_PROTO(u32 x), 141 TP_ARGS(x) 142 ); 143 144 DEFINE_EVENT(wil6210_irq, wil6210_irq_misc_thread, 145 TP_PROTO(u32 x), 146 TP_ARGS(x) 147 ); 148 149 TRACE_EVENT(wil6210_rx, 150 TP_PROTO(u16 index, struct vring_rx_desc *d), 151 TP_ARGS(index, d), 152 TP_STRUCT__entry( 153 __field(u16, index) 154 __field(unsigned int, len) 155 __field(u8, mid) 156 __field(u8, cid) 157 __field(u8, tid) 158 __field(u8, type) 159 __field(u8, subtype) 160 __field(u16, seq) 161 __field(u8, mcs) 162 ), 163 TP_fast_assign( 164 __entry->index = index; 165 __entry->len = d->dma.length; 166 __entry->mid = wil_rxdesc_mid(d); 167 __entry->cid = wil_rxdesc_cid(d); 168 __entry->tid = wil_rxdesc_tid(d); 169 __entry->type = wil_rxdesc_ftype(d); 170 __entry->subtype = wil_rxdesc_subtype(d); 171 __entry->seq = wil_rxdesc_seq(d); 172 __entry->mcs = wil_rxdesc_mcs(d); 173 ), 174 TP_printk("index %d len %d mid %d cid (%%8) %d tid %d mcs %d seq 0x%03x" 175 " type 0x%1x subtype 0x%1x", __entry->index, __entry->len, 176 __entry->mid, __entry->cid, __entry->tid, __entry->mcs, 177 __entry->seq, __entry->type, __entry->subtype) 178 ); 179 180 TRACE_EVENT(wil6210_rx_status, 181 TP_PROTO(struct wil6210_priv *wil, u8 use_compressed, u16 buff_id, 182 void *msg), 183 TP_ARGS(wil, use_compressed, buff_id, msg), 184 TP_STRUCT__entry(__field(u8, use_compressed) 185 __field(u16, buff_id) 186 __field(unsigned int, len) 187 __field(u8, mid) 188 __field(u8, cid) 189 __field(u8, tid) 190 __field(u8, type) 191 __field(u8, subtype) 192 __field(u16, seq) 193 __field(u8, mcs) 194 ), 195 TP_fast_assign(__entry->use_compressed = use_compressed; 196 __entry->buff_id = buff_id; 197 __entry->len = wil_rx_status_get_length(msg); 198 __entry->mid = wil_rx_status_get_mid(msg); 199 __entry->cid = wil_rx_status_get_cid(msg); 200 __entry->tid = wil_rx_status_get_tid(msg); 201 __entry->type = wil_rx_status_get_frame_type(wil, 202 msg); 203 __entry->subtype = wil_rx_status_get_fc1(wil, msg); 204 __entry->seq = wil_rx_status_get_seq(wil, msg); 205 __entry->mcs = wil_rx_status_get_mcs(msg); 206 ), 207 TP_printk( 208 "compressed %d buff_id %d len %d mid %d cid %d tid %d mcs %d seq 0x%03x type 0x%1x subtype 0x%1x", 209 __entry->use_compressed, __entry->buff_id, __entry->len, 210 __entry->mid, __entry->cid, __entry->tid, __entry->mcs, 211 __entry->seq, __entry->type, __entry->subtype) 212 ); 213 214 TRACE_EVENT(wil6210_tx, 215 TP_PROTO(u8 vring, u16 index, unsigned int len, u8 frags), 216 TP_ARGS(vring, index, len, frags), 217 TP_STRUCT__entry( 218 __field(u8, vring) 219 __field(u8, frags) 220 __field(u16, index) 221 __field(unsigned int, len) 222 ), 223 TP_fast_assign( 224 __entry->vring = vring; 225 __entry->frags = frags; 226 __entry->index = index; 227 __entry->len = len; 228 ), 229 TP_printk("vring %d index %d len %d frags %d", 230 __entry->vring, __entry->index, __entry->len, __entry->frags) 231 ); 232 233 TRACE_EVENT(wil6210_tx_done, 234 TP_PROTO(u8 vring, u16 index, unsigned int len, u8 err), 235 TP_ARGS(vring, index, len, err), 236 TP_STRUCT__entry( 237 __field(u8, vring) 238 __field(u8, err) 239 __field(u16, index) 240 __field(unsigned int, len) 241 ), 242 TP_fast_assign( 243 __entry->vring = vring; 244 __entry->index = index; 245 __entry->len = len; 246 __entry->err = err; 247 ), 248 TP_printk("vring %d index %d len %d err 0x%02x", 249 __entry->vring, __entry->index, __entry->len, 250 __entry->err) 251 ); 252 253 TRACE_EVENT(wil6210_tx_status, 254 TP_PROTO(struct wil_ring_tx_status *msg, u16 index, 255 unsigned int len), 256 TP_ARGS(msg, index, len), 257 TP_STRUCT__entry(__field(u16, index) 258 __field(unsigned int, len) 259 __field(u8, num_descs) 260 __field(u8, ring_id) 261 __field(u8, status) 262 __field(u8, mcs) 263 264 ), 265 TP_fast_assign(__entry->index = index; 266 __entry->len = len; 267 __entry->num_descs = msg->num_descriptors; 268 __entry->ring_id = msg->ring_id; 269 __entry->status = msg->status; 270 __entry->mcs = wil_tx_status_get_mcs(msg); 271 ), 272 TP_printk( 273 "ring_id %d swtail 0x%x len %d num_descs %d status 0x%x mcs %d", 274 __entry->ring_id, __entry->index, __entry->len, 275 __entry->num_descs, __entry->status, __entry->mcs) 276 ); 277 278 #endif /* WIL6210_TRACE_H || TRACE_HEADER_MULTI_READ*/ 279 280 #if defined(CONFIG_WIL6210_TRACING) && !defined(__CHECKER__) 281 /* we don't want to use include/trace/events */ 282 #undef TRACE_INCLUDE_PATH 283 #define TRACE_INCLUDE_PATH . 284 #undef TRACE_INCLUDE_FILE 285 #define TRACE_INCLUDE_FILE trace 286 287 /* This part must be outside protection */ 288 #include <trace/define_trace.h> 289 #endif /* defined(CONFIG_WIL6210_TRACING) && !defined(__CHECKER__) */ 290