1 /* SPDX-License-Identifier: ISC */ 2 #if !defined(_ATH6KL_TRACE_H) || defined(TRACE_HEADER_MULTI_READ) 3 4 #include <net/cfg80211.h> 5 #include <linux/skbuff.h> 6 #include <linux/tracepoint.h> 7 #include "wmi.h" 8 #include "hif.h" 9 10 #if !defined(_ATH6KL_TRACE_H) 11 static inline unsigned int ath6kl_get_wmi_id(void *buf, size_t buf_len) 12 { 13 struct wmi_cmd_hdr *hdr = buf; 14 15 if (buf_len < sizeof(*hdr)) 16 return 0; 17 18 return le16_to_cpu(hdr->cmd_id); 19 } 20 #endif /* __ATH6KL_TRACE_H */ 21 22 #define _ATH6KL_TRACE_H 23 24 /* create empty functions when tracing is disabled */ 25 #if !defined(CONFIG_ATH6KL_TRACING) 26 #undef TRACE_EVENT 27 #define TRACE_EVENT(name, proto, ...) \ 28 static inline void trace_ ## name(proto) {} 29 #undef DECLARE_EVENT_CLASS 30 #define DECLARE_EVENT_CLASS(...) 31 #undef DEFINE_EVENT 32 #define DEFINE_EVENT(evt_class, name, proto, ...) \ 33 static inline void trace_ ## name(proto) {} 34 #endif /* !CONFIG_ATH6KL_TRACING || __CHECKER__ */ 35 36 #undef TRACE_SYSTEM 37 #define TRACE_SYSTEM ath6kl 38 39 TRACE_EVENT(ath6kl_wmi_cmd, 40 TP_PROTO(void *buf, size_t buf_len), 41 42 TP_ARGS(buf, buf_len), 43 44 TP_STRUCT__entry( 45 __field(unsigned int, id) 46 __field(size_t, buf_len) 47 __dynamic_array(u8, buf, buf_len) 48 ), 49 50 TP_fast_assign( 51 __entry->id = ath6kl_get_wmi_id(buf, buf_len); 52 __entry->buf_len = buf_len; 53 memcpy(__get_dynamic_array(buf), buf, buf_len); 54 ), 55 56 TP_printk( 57 "id %d len %zd", 58 __entry->id, __entry->buf_len 59 ) 60 ); 61 62 TRACE_EVENT(ath6kl_wmi_event, 63 TP_PROTO(void *buf, size_t buf_len), 64 65 TP_ARGS(buf, buf_len), 66 67 TP_STRUCT__entry( 68 __field(unsigned int, id) 69 __field(size_t, buf_len) 70 __dynamic_array(u8, buf, buf_len) 71 ), 72 73 TP_fast_assign( 74 __entry->id = ath6kl_get_wmi_id(buf, buf_len); 75 __entry->buf_len = buf_len; 76 memcpy(__get_dynamic_array(buf), buf, buf_len); 77 ), 78 79 TP_printk( 80 "id %d len %zd", 81 __entry->id, __entry->buf_len 82 ) 83 ); 84 85 TRACE_EVENT(ath6kl_sdio, 86 TP_PROTO(unsigned int addr, int flags, 87 void *buf, size_t buf_len), 88 89 TP_ARGS(addr, flags, buf, buf_len), 90 91 TP_STRUCT__entry( 92 __field(unsigned int, tx) 93 __field(unsigned int, addr) 94 __field(int, flags) 95 __field(size_t, buf_len) 96 __dynamic_array(u8, buf, buf_len) 97 ), 98 99 TP_fast_assign( 100 __entry->addr = addr; 101 __entry->flags = flags; 102 __entry->buf_len = buf_len; 103 memcpy(__get_dynamic_array(buf), buf, buf_len); 104 105 if (flags & HIF_WRITE) 106 __entry->tx = 1; 107 else 108 __entry->tx = 0; 109 ), 110 111 TP_printk( 112 "%s addr 0x%x flags 0x%x len %zd\n", 113 __entry->tx ? "tx" : "rx", 114 __entry->addr, 115 __entry->flags, 116 __entry->buf_len 117 ) 118 ); 119 120 TRACE_EVENT(ath6kl_sdio_scat, 121 TP_PROTO(unsigned int addr, int flags, unsigned int total_len, 122 unsigned int entries, struct hif_scatter_item *list), 123 124 TP_ARGS(addr, flags, total_len, entries, list), 125 126 TP_STRUCT__entry( 127 __field(unsigned int, tx) 128 __field(unsigned int, addr) 129 __field(int, flags) 130 __field(unsigned int, entries) 131 __field(size_t, total_len) 132 __dynamic_array(unsigned int, len_array, entries) 133 __dynamic_array(u8, data, total_len) 134 ), 135 136 TP_fast_assign( 137 unsigned int *len_array; 138 int i, offset = 0; 139 size_t len; 140 141 __entry->addr = addr; 142 __entry->flags = flags; 143 __entry->entries = entries; 144 __entry->total_len = total_len; 145 146 if (flags & HIF_WRITE) 147 __entry->tx = 1; 148 else 149 __entry->tx = 0; 150 151 len_array = __get_dynamic_array(len_array); 152 153 for (i = 0; i < entries; i++) { 154 len = list[i].len; 155 156 memcpy((u8 *) __get_dynamic_array(data) + offset, 157 list[i].buf, len); 158 159 len_array[i] = len; 160 offset += len; 161 } 162 ), 163 164 TP_printk( 165 "%s addr 0x%x flags 0x%x entries %d total_len %zd\n", 166 __entry->tx ? "tx" : "rx", 167 __entry->addr, 168 __entry->flags, 169 __entry->entries, 170 __entry->total_len 171 ) 172 ); 173 174 TRACE_EVENT(ath6kl_sdio_irq, 175 TP_PROTO(void *buf, size_t buf_len), 176 177 TP_ARGS(buf, buf_len), 178 179 TP_STRUCT__entry( 180 __field(size_t, buf_len) 181 __dynamic_array(u8, buf, buf_len) 182 ), 183 184 TP_fast_assign( 185 __entry->buf_len = buf_len; 186 memcpy(__get_dynamic_array(buf), buf, buf_len); 187 ), 188 189 TP_printk( 190 "irq len %zd\n", __entry->buf_len 191 ) 192 ); 193 194 TRACE_EVENT(ath6kl_htc_rx, 195 TP_PROTO(int status, int endpoint, void *buf, 196 size_t buf_len), 197 198 TP_ARGS(status, endpoint, buf, buf_len), 199 200 TP_STRUCT__entry( 201 __field(int, status) 202 __field(int, endpoint) 203 __field(size_t, buf_len) 204 __dynamic_array(u8, buf, buf_len) 205 ), 206 207 TP_fast_assign( 208 __entry->status = status; 209 __entry->endpoint = endpoint; 210 __entry->buf_len = buf_len; 211 memcpy(__get_dynamic_array(buf), buf, buf_len); 212 ), 213 214 TP_printk( 215 "status %d endpoint %d len %zd\n", 216 __entry->status, 217 __entry->endpoint, 218 __entry->buf_len 219 ) 220 ); 221 222 TRACE_EVENT(ath6kl_htc_tx, 223 TP_PROTO(int status, int endpoint, void *buf, 224 size_t buf_len), 225 226 TP_ARGS(status, endpoint, buf, buf_len), 227 228 TP_STRUCT__entry( 229 __field(int, status) 230 __field(int, endpoint) 231 __field(size_t, buf_len) 232 __dynamic_array(u8, buf, buf_len) 233 ), 234 235 TP_fast_assign( 236 __entry->status = status; 237 __entry->endpoint = endpoint; 238 __entry->buf_len = buf_len; 239 memcpy(__get_dynamic_array(buf), buf, buf_len); 240 ), 241 242 TP_printk( 243 "status %d endpoint %d len %zd\n", 244 __entry->status, 245 __entry->endpoint, 246 __entry->buf_len 247 ) 248 ); 249 250 #define ATH6KL_MSG_MAX 200 251 252 DECLARE_EVENT_CLASS(ath6kl_log_event, 253 TP_PROTO(struct va_format *vaf), 254 TP_ARGS(vaf), 255 TP_STRUCT__entry( 256 __dynamic_array(char, msg, ATH6KL_MSG_MAX) 257 ), 258 TP_fast_assign( 259 WARN_ON_ONCE(vsnprintf(__get_dynamic_array(msg), 260 ATH6KL_MSG_MAX, 261 vaf->fmt, 262 *vaf->va) >= ATH6KL_MSG_MAX); 263 ), 264 TP_printk("%s", __get_str(msg)) 265 ); 266 267 DEFINE_EVENT(ath6kl_log_event, ath6kl_log_err, 268 TP_PROTO(struct va_format *vaf), 269 TP_ARGS(vaf) 270 ); 271 272 DEFINE_EVENT(ath6kl_log_event, ath6kl_log_warn, 273 TP_PROTO(struct va_format *vaf), 274 TP_ARGS(vaf) 275 ); 276 277 DEFINE_EVENT(ath6kl_log_event, ath6kl_log_info, 278 TP_PROTO(struct va_format *vaf), 279 TP_ARGS(vaf) 280 ); 281 282 TRACE_EVENT(ath6kl_log_dbg, 283 TP_PROTO(unsigned int level, struct va_format *vaf), 284 TP_ARGS(level, vaf), 285 TP_STRUCT__entry( 286 __field(unsigned int, level) 287 __dynamic_array(char, msg, ATH6KL_MSG_MAX) 288 ), 289 TP_fast_assign( 290 __entry->level = level; 291 WARN_ON_ONCE(vsnprintf(__get_dynamic_array(msg), 292 ATH6KL_MSG_MAX, 293 vaf->fmt, 294 *vaf->va) >= ATH6KL_MSG_MAX); 295 ), 296 TP_printk("%s", __get_str(msg)) 297 ); 298 299 TRACE_EVENT(ath6kl_log_dbg_dump, 300 TP_PROTO(const char *msg, const char *prefix, 301 const void *buf, size_t buf_len), 302 303 TP_ARGS(msg, prefix, buf, buf_len), 304 305 TP_STRUCT__entry( 306 __string(msg, msg) 307 __string(prefix, prefix) 308 __field(size_t, buf_len) 309 __dynamic_array(u8, buf, buf_len) 310 ), 311 312 TP_fast_assign( 313 __assign_str(msg, msg); 314 __assign_str(prefix, prefix); 315 __entry->buf_len = buf_len; 316 memcpy(__get_dynamic_array(buf), buf, buf_len); 317 ), 318 319 TP_printk( 320 "%s/%s\n", __get_str(prefix), __get_str(msg) 321 ) 322 ); 323 324 #endif /* _ ATH6KL_TRACE_H || TRACE_HEADER_MULTI_READ*/ 325 326 /* we don't want to use include/trace/events */ 327 #undef TRACE_INCLUDE_PATH 328 #define TRACE_INCLUDE_PATH . 329 #undef TRACE_INCLUDE_FILE 330 #define TRACE_INCLUDE_FILE trace 331 332 /* This part must be outside protection */ 333 #include <trace/define_trace.h> 334