1416cf0b4SKalle Valo #if !defined(_ATH6KL_TRACE_H) || defined(TRACE_HEADER_MULTI_READ) 2416cf0b4SKalle Valo 3416cf0b4SKalle Valo #include <net/cfg80211.h> 4416cf0b4SKalle Valo #include <linux/skbuff.h> 5416cf0b4SKalle Valo #include <linux/tracepoint.h> 6416cf0b4SKalle Valo #include "wmi.h" 7e60c8154SKalle Valo #include "hif.h" 8416cf0b4SKalle Valo 9416cf0b4SKalle Valo #if !defined(_ATH6KL_TRACE_H) 10416cf0b4SKalle Valo static inline unsigned int ath6kl_get_wmi_id(void *buf, size_t buf_len) 11416cf0b4SKalle Valo { 12416cf0b4SKalle Valo struct wmi_cmd_hdr *hdr = buf; 13416cf0b4SKalle Valo 14416cf0b4SKalle Valo if (buf_len < sizeof(*hdr)) 15416cf0b4SKalle Valo return 0; 16416cf0b4SKalle Valo 17416cf0b4SKalle Valo return le16_to_cpu(hdr->cmd_id); 18416cf0b4SKalle Valo } 19416cf0b4SKalle Valo #endif /* __ATH6KL_TRACE_H */ 20416cf0b4SKalle Valo 21416cf0b4SKalle Valo #define _ATH6KL_TRACE_H 22416cf0b4SKalle Valo 23416cf0b4SKalle Valo /* create empty functions when tracing is disabled */ 24416cf0b4SKalle Valo #if !defined(CONFIG_ATH6KL_TRACING) 25416cf0b4SKalle Valo #undef TRACE_EVENT 26416cf0b4SKalle Valo #define TRACE_EVENT(name, proto, ...) \ 27416cf0b4SKalle Valo static inline void trace_ ## name(proto) {} 28da01d53cSKalle Valo #undef DECLARE_EVENT_CLASS 29da01d53cSKalle Valo #define DECLARE_EVENT_CLASS(...) 30da01d53cSKalle Valo #undef DEFINE_EVENT 31da01d53cSKalle Valo #define DEFINE_EVENT(evt_class, name, proto, ...) \ 32da01d53cSKalle Valo static inline void trace_ ## name(proto) {} 33416cf0b4SKalle Valo #endif /* !CONFIG_ATH6KL_TRACING || __CHECKER__ */ 34416cf0b4SKalle Valo 35416cf0b4SKalle Valo #undef TRACE_SYSTEM 36416cf0b4SKalle Valo #define TRACE_SYSTEM ath6kl 37416cf0b4SKalle Valo 38416cf0b4SKalle Valo TRACE_EVENT(ath6kl_wmi_cmd, 39416cf0b4SKalle Valo TP_PROTO(void *buf, size_t buf_len), 40416cf0b4SKalle Valo 41416cf0b4SKalle Valo TP_ARGS(buf, buf_len), 42416cf0b4SKalle Valo 43416cf0b4SKalle Valo TP_STRUCT__entry( 44416cf0b4SKalle Valo __field(unsigned int, id) 45416cf0b4SKalle Valo __field(size_t, buf_len) 46416cf0b4SKalle Valo __dynamic_array(u8, buf, buf_len) 47416cf0b4SKalle Valo ), 48416cf0b4SKalle Valo 49416cf0b4SKalle Valo TP_fast_assign( 50416cf0b4SKalle Valo __entry->id = ath6kl_get_wmi_id(buf, buf_len); 51416cf0b4SKalle Valo __entry->buf_len = buf_len; 52416cf0b4SKalle Valo memcpy(__get_dynamic_array(buf), buf, buf_len); 53416cf0b4SKalle Valo ), 54416cf0b4SKalle Valo 55416cf0b4SKalle Valo TP_printk( 560d4e6717SKalle Valo "id %d len %zd", 57416cf0b4SKalle Valo __entry->id, __entry->buf_len 58416cf0b4SKalle Valo ) 59416cf0b4SKalle Valo ); 60416cf0b4SKalle Valo 61416cf0b4SKalle Valo TRACE_EVENT(ath6kl_wmi_event, 62416cf0b4SKalle Valo TP_PROTO(void *buf, size_t buf_len), 63416cf0b4SKalle Valo 64416cf0b4SKalle Valo TP_ARGS(buf, buf_len), 65416cf0b4SKalle Valo 66416cf0b4SKalle Valo TP_STRUCT__entry( 67416cf0b4SKalle Valo __field(unsigned int, id) 68416cf0b4SKalle Valo __field(size_t, buf_len) 69416cf0b4SKalle Valo __dynamic_array(u8, buf, buf_len) 70416cf0b4SKalle Valo ), 71416cf0b4SKalle Valo 72416cf0b4SKalle Valo TP_fast_assign( 73416cf0b4SKalle Valo __entry->id = ath6kl_get_wmi_id(buf, buf_len); 74416cf0b4SKalle Valo __entry->buf_len = buf_len; 75416cf0b4SKalle Valo memcpy(__get_dynamic_array(buf), buf, buf_len); 76416cf0b4SKalle Valo ), 77416cf0b4SKalle Valo 78416cf0b4SKalle Valo TP_printk( 790d4e6717SKalle Valo "id %d len %zd", 80416cf0b4SKalle Valo __entry->id, __entry->buf_len 81416cf0b4SKalle Valo ) 82416cf0b4SKalle Valo ); 83416cf0b4SKalle Valo 84e60c8154SKalle Valo TRACE_EVENT(ath6kl_sdio, 85e60c8154SKalle Valo TP_PROTO(unsigned int addr, int flags, 86e60c8154SKalle Valo void *buf, size_t buf_len), 87e60c8154SKalle Valo 88e60c8154SKalle Valo TP_ARGS(addr, flags, buf, buf_len), 89e60c8154SKalle Valo 90e60c8154SKalle Valo TP_STRUCT__entry( 91e60c8154SKalle Valo __field(unsigned int, tx) 92e60c8154SKalle Valo __field(unsigned int, addr) 93e60c8154SKalle Valo __field(int, flags) 94e60c8154SKalle Valo __field(size_t, buf_len) 95e60c8154SKalle Valo __dynamic_array(u8, buf, buf_len) 96e60c8154SKalle Valo ), 97e60c8154SKalle Valo 98e60c8154SKalle Valo TP_fast_assign( 99e60c8154SKalle Valo __entry->addr = addr; 100e60c8154SKalle Valo __entry->flags = flags; 101e60c8154SKalle Valo __entry->buf_len = buf_len; 102e60c8154SKalle Valo memcpy(__get_dynamic_array(buf), buf, buf_len); 103e60c8154SKalle Valo 104e60c8154SKalle Valo if (flags & HIF_WRITE) 105e60c8154SKalle Valo __entry->tx = 1; 106e60c8154SKalle Valo else 107e60c8154SKalle Valo __entry->tx = 0; 108e60c8154SKalle Valo ), 109e60c8154SKalle Valo 110e60c8154SKalle Valo TP_printk( 1110d4e6717SKalle Valo "%s addr 0x%x flags 0x%x len %zd\n", 112e60c8154SKalle Valo __entry->tx ? "tx" : "rx", 113e60c8154SKalle Valo __entry->addr, 114e60c8154SKalle Valo __entry->flags, 115e60c8154SKalle Valo __entry->buf_len 116e60c8154SKalle Valo ) 117e60c8154SKalle Valo ); 118e60c8154SKalle Valo 119e60c8154SKalle Valo TRACE_EVENT(ath6kl_sdio_scat, 120e60c8154SKalle Valo TP_PROTO(unsigned int addr, int flags, unsigned int total_len, 121e60c8154SKalle Valo unsigned int entries, struct hif_scatter_item *list), 122e60c8154SKalle Valo 123e60c8154SKalle Valo TP_ARGS(addr, flags, total_len, entries, list), 124e60c8154SKalle Valo 125e60c8154SKalle Valo TP_STRUCT__entry( 126e60c8154SKalle Valo __field(unsigned int, tx) 127e60c8154SKalle Valo __field(unsigned int, addr) 128e60c8154SKalle Valo __field(int, flags) 129e60c8154SKalle Valo __field(unsigned int, entries) 130e60c8154SKalle Valo __field(size_t, total_len) 131e60c8154SKalle Valo __dynamic_array(unsigned int, len_array, entries) 132e60c8154SKalle Valo __dynamic_array(u8, data, total_len) 133e60c8154SKalle Valo ), 134e60c8154SKalle Valo 135e60c8154SKalle Valo TP_fast_assign( 136e60c8154SKalle Valo unsigned int *len_array; 137e60c8154SKalle Valo int i, offset = 0; 138e60c8154SKalle Valo size_t len; 139e60c8154SKalle Valo 140e60c8154SKalle Valo __entry->addr = addr; 141e60c8154SKalle Valo __entry->flags = flags; 142e60c8154SKalle Valo __entry->entries = entries; 143e60c8154SKalle Valo __entry->total_len = total_len; 144e60c8154SKalle Valo 145e60c8154SKalle Valo if (flags & HIF_WRITE) 146e60c8154SKalle Valo __entry->tx = 1; 147e60c8154SKalle Valo else 148e60c8154SKalle Valo __entry->tx = 0; 149e60c8154SKalle Valo 150e60c8154SKalle Valo len_array = __get_dynamic_array(len_array); 151e60c8154SKalle Valo 152e60c8154SKalle Valo for (i = 0; i < entries; i++) { 153e60c8154SKalle Valo len = list[i].len; 154e60c8154SKalle Valo 155e60c8154SKalle Valo memcpy((u8 *) __get_dynamic_array(data) + offset, 156e60c8154SKalle Valo list[i].buf, len); 157e60c8154SKalle Valo 158e60c8154SKalle Valo len_array[i] = len; 159e60c8154SKalle Valo offset += len; 160e60c8154SKalle Valo } 161e60c8154SKalle Valo ), 162e60c8154SKalle Valo 163e60c8154SKalle Valo TP_printk( 1640d4e6717SKalle Valo "%s addr 0x%x flags 0x%x entries %d total_len %zd\n", 165e60c8154SKalle Valo __entry->tx ? "tx" : "rx", 166e60c8154SKalle Valo __entry->addr, 167e60c8154SKalle Valo __entry->flags, 168e60c8154SKalle Valo __entry->entries, 169e60c8154SKalle Valo __entry->total_len 170e60c8154SKalle Valo ) 171e60c8154SKalle Valo ); 172e60c8154SKalle Valo 173d57f093aSKalle Valo TRACE_EVENT(ath6kl_sdio_irq, 174d57f093aSKalle Valo TP_PROTO(void *buf, size_t buf_len), 175d57f093aSKalle Valo 176d57f093aSKalle Valo TP_ARGS(buf, buf_len), 177d57f093aSKalle Valo 178d57f093aSKalle Valo TP_STRUCT__entry( 179d57f093aSKalle Valo __field(size_t, buf_len) 180d57f093aSKalle Valo __dynamic_array(u8, buf, buf_len) 181d57f093aSKalle Valo ), 182d57f093aSKalle Valo 183d57f093aSKalle Valo TP_fast_assign( 184d57f093aSKalle Valo __entry->buf_len = buf_len; 185d57f093aSKalle Valo memcpy(__get_dynamic_array(buf), buf, buf_len); 186d57f093aSKalle Valo ), 187d57f093aSKalle Valo 188d57f093aSKalle Valo TP_printk( 1890d4e6717SKalle Valo "irq len %zd\n", __entry->buf_len 190d57f093aSKalle Valo ) 191d57f093aSKalle Valo ); 192d57f093aSKalle Valo 1934771979aSKalle Valo TRACE_EVENT(ath6kl_htc_rx, 1944771979aSKalle Valo TP_PROTO(int status, int endpoint, void *buf, 1954771979aSKalle Valo size_t buf_len), 1964771979aSKalle Valo 1974771979aSKalle Valo TP_ARGS(status, endpoint, buf, buf_len), 1984771979aSKalle Valo 1994771979aSKalle Valo TP_STRUCT__entry( 2004771979aSKalle Valo __field(int, status) 2014771979aSKalle Valo __field(int, endpoint) 2024771979aSKalle Valo __field(size_t, buf_len) 2034771979aSKalle Valo __dynamic_array(u8, buf, buf_len) 2044771979aSKalle Valo ), 2054771979aSKalle Valo 2064771979aSKalle Valo TP_fast_assign( 2074771979aSKalle Valo __entry->status = status; 2084771979aSKalle Valo __entry->endpoint = endpoint; 2094771979aSKalle Valo __entry->buf_len = buf_len; 2104771979aSKalle Valo memcpy(__get_dynamic_array(buf), buf, buf_len); 2114771979aSKalle Valo ), 2124771979aSKalle Valo 2134771979aSKalle Valo TP_printk( 2140d4e6717SKalle Valo "status %d endpoint %d len %zd\n", 2154771979aSKalle Valo __entry->status, 2164771979aSKalle Valo __entry->endpoint, 2174771979aSKalle Valo __entry->buf_len 2184771979aSKalle Valo ) 2194771979aSKalle Valo ); 2204771979aSKalle Valo 2214771979aSKalle Valo TRACE_EVENT(ath6kl_htc_tx, 2224771979aSKalle Valo TP_PROTO(int status, int endpoint, void *buf, 2234771979aSKalle Valo size_t buf_len), 2244771979aSKalle Valo 2254771979aSKalle Valo TP_ARGS(status, endpoint, buf, buf_len), 2264771979aSKalle Valo 2274771979aSKalle Valo TP_STRUCT__entry( 2284771979aSKalle Valo __field(int, status) 2294771979aSKalle Valo __field(int, endpoint) 2304771979aSKalle Valo __field(size_t, buf_len) 2314771979aSKalle Valo __dynamic_array(u8, buf, buf_len) 2324771979aSKalle Valo ), 2334771979aSKalle Valo 2344771979aSKalle Valo TP_fast_assign( 2354771979aSKalle Valo __entry->status = status; 2364771979aSKalle Valo __entry->endpoint = endpoint; 2374771979aSKalle Valo __entry->buf_len = buf_len; 2384771979aSKalle Valo memcpy(__get_dynamic_array(buf), buf, buf_len); 2394771979aSKalle Valo ), 2404771979aSKalle Valo 2414771979aSKalle Valo TP_printk( 2420d4e6717SKalle Valo "status %d endpoint %d len %zd\n", 2434771979aSKalle Valo __entry->status, 2444771979aSKalle Valo __entry->endpoint, 2454771979aSKalle Valo __entry->buf_len 2464771979aSKalle Valo ) 2474771979aSKalle Valo ); 2484771979aSKalle Valo 249da01d53cSKalle Valo #define ATH6KL_MSG_MAX 200 250da01d53cSKalle Valo 251da01d53cSKalle Valo DECLARE_EVENT_CLASS(ath6kl_log_event, 252da01d53cSKalle Valo TP_PROTO(struct va_format *vaf), 253da01d53cSKalle Valo TP_ARGS(vaf), 254da01d53cSKalle Valo TP_STRUCT__entry( 255da01d53cSKalle Valo __dynamic_array(char, msg, ATH6KL_MSG_MAX) 256da01d53cSKalle Valo ), 257da01d53cSKalle Valo TP_fast_assign( 258da01d53cSKalle Valo WARN_ON_ONCE(vsnprintf(__get_dynamic_array(msg), 259da01d53cSKalle Valo ATH6KL_MSG_MAX, 260da01d53cSKalle Valo vaf->fmt, 261da01d53cSKalle Valo *vaf->va) >= ATH6KL_MSG_MAX); 262da01d53cSKalle Valo ), 263da01d53cSKalle Valo TP_printk("%s", __get_str(msg)) 264da01d53cSKalle Valo ); 265da01d53cSKalle Valo 266da01d53cSKalle Valo DEFINE_EVENT(ath6kl_log_event, ath6kl_log_err, 267da01d53cSKalle Valo TP_PROTO(struct va_format *vaf), 268da01d53cSKalle Valo TP_ARGS(vaf) 269da01d53cSKalle Valo ); 270da01d53cSKalle Valo 271da01d53cSKalle Valo DEFINE_EVENT(ath6kl_log_event, ath6kl_log_warn, 272da01d53cSKalle Valo TP_PROTO(struct va_format *vaf), 273da01d53cSKalle Valo TP_ARGS(vaf) 274da01d53cSKalle Valo ); 275da01d53cSKalle Valo 276da01d53cSKalle Valo DEFINE_EVENT(ath6kl_log_event, ath6kl_log_info, 277da01d53cSKalle Valo TP_PROTO(struct va_format *vaf), 278da01d53cSKalle Valo TP_ARGS(vaf) 279da01d53cSKalle Valo ); 280da01d53cSKalle Valo 281aa8705fcSKalle Valo TRACE_EVENT(ath6kl_log_dbg, 282aa8705fcSKalle Valo TP_PROTO(unsigned int level, struct va_format *vaf), 283aa8705fcSKalle Valo TP_ARGS(level, vaf), 284aa8705fcSKalle Valo TP_STRUCT__entry( 285aa8705fcSKalle Valo __field(unsigned int, level) 286aa8705fcSKalle Valo __dynamic_array(char, msg, ATH6KL_MSG_MAX) 287aa8705fcSKalle Valo ), 288aa8705fcSKalle Valo TP_fast_assign( 289aa8705fcSKalle Valo __entry->level = level; 290aa8705fcSKalle Valo WARN_ON_ONCE(vsnprintf(__get_dynamic_array(msg), 291aa8705fcSKalle Valo ATH6KL_MSG_MAX, 292aa8705fcSKalle Valo vaf->fmt, 293aa8705fcSKalle Valo *vaf->va) >= ATH6KL_MSG_MAX); 294aa8705fcSKalle Valo ), 295aa8705fcSKalle Valo TP_printk("%s", __get_str(msg)) 296aa8705fcSKalle Valo ); 297aa8705fcSKalle Valo 298aa8705fcSKalle Valo TRACE_EVENT(ath6kl_log_dbg_dump, 299aa8705fcSKalle Valo TP_PROTO(const char *msg, const char *prefix, 300aa8705fcSKalle Valo const void *buf, size_t buf_len), 301aa8705fcSKalle Valo 302aa8705fcSKalle Valo TP_ARGS(msg, prefix, buf, buf_len), 303aa8705fcSKalle Valo 304aa8705fcSKalle Valo TP_STRUCT__entry( 305aa8705fcSKalle Valo __string(msg, msg) 306aa8705fcSKalle Valo __string(prefix, prefix) 307aa8705fcSKalle Valo __field(size_t, buf_len) 308aa8705fcSKalle Valo __dynamic_array(u8, buf, buf_len) 309aa8705fcSKalle Valo ), 310aa8705fcSKalle Valo 311aa8705fcSKalle Valo TP_fast_assign( 312aa8705fcSKalle Valo __assign_str(msg, msg); 313aa8705fcSKalle Valo __assign_str(prefix, prefix); 314aa8705fcSKalle Valo __entry->buf_len = buf_len; 315aa8705fcSKalle Valo memcpy(__get_dynamic_array(buf), buf, buf_len); 316aa8705fcSKalle Valo ), 317aa8705fcSKalle Valo 318aa8705fcSKalle Valo TP_printk( 319aa8705fcSKalle Valo "%s/%s\n", __get_str(prefix), __get_str(msg) 320aa8705fcSKalle Valo ) 321aa8705fcSKalle Valo ); 322aa8705fcSKalle Valo 323416cf0b4SKalle Valo #endif /* _ ATH6KL_TRACE_H || TRACE_HEADER_MULTI_READ*/ 324416cf0b4SKalle Valo 325416cf0b4SKalle Valo /* we don't want to use include/trace/events */ 326416cf0b4SKalle Valo #undef TRACE_INCLUDE_PATH 327416cf0b4SKalle Valo #define TRACE_INCLUDE_PATH . 328416cf0b4SKalle Valo #undef TRACE_INCLUDE_FILE 329416cf0b4SKalle Valo #define TRACE_INCLUDE_FILE trace 330416cf0b4SKalle Valo 331416cf0b4SKalle Valo /* This part must be outside protection */ 332416cf0b4SKalle Valo #include <trace/define_trace.h> 333