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