1b4c3e9b5SBjoern A. Zeeb // SPDX-License-Identifier: ISC 2b4c3e9b5SBjoern A. Zeeb /* 3b4c3e9b5SBjoern A. Zeeb * Copyright (c) 2013 Broadcom Corporation 4b4c3e9b5SBjoern A. Zeeb */ 5b4c3e9b5SBjoern A. Zeeb #if !defined(BRCMF_TRACEPOINT_H_) || defined(TRACE_HEADER_MULTI_READ) 6b4c3e9b5SBjoern A. Zeeb #define BRCMF_TRACEPOINT_H_ 7b4c3e9b5SBjoern A. Zeeb 8b4c3e9b5SBjoern A. Zeeb #include <linux/types.h> 9b4c3e9b5SBjoern A. Zeeb #include <linux/tracepoint.h> 10b4c3e9b5SBjoern A. Zeeb 11b4c3e9b5SBjoern A. Zeeb #ifndef CONFIG_BRCM_TRACING 12b4c3e9b5SBjoern A. Zeeb 13b4c3e9b5SBjoern A. Zeeb #undef TRACE_EVENT 14b4c3e9b5SBjoern A. Zeeb #define TRACE_EVENT(name, proto, ...) \ 15b4c3e9b5SBjoern A. Zeeb static inline void trace_ ## name(proto) {} 16b4c3e9b5SBjoern A. Zeeb 17b4c3e9b5SBjoern A. Zeeb #undef DECLARE_EVENT_CLASS 18b4c3e9b5SBjoern A. Zeeb #define DECLARE_EVENT_CLASS(...) 19b4c3e9b5SBjoern A. Zeeb 20b4c3e9b5SBjoern A. Zeeb #undef DEFINE_EVENT 21b4c3e9b5SBjoern A. Zeeb #define DEFINE_EVENT(evt_class, name, proto, ...) \ 22b4c3e9b5SBjoern A. Zeeb static inline void trace_ ## name(proto) {} 23b4c3e9b5SBjoern A. Zeeb 24b4c3e9b5SBjoern A. Zeeb #endif /* CONFIG_BRCM_TRACING */ 25b4c3e9b5SBjoern A. Zeeb 26b4c3e9b5SBjoern A. Zeeb #undef TRACE_SYSTEM 27b4c3e9b5SBjoern A. Zeeb #define TRACE_SYSTEM brcmfmac 28b4c3e9b5SBjoern A. Zeeb 29b4c3e9b5SBjoern A. Zeeb #define MAX_MSG_LEN 100 30b4c3e9b5SBjoern A. Zeeb 31b4c3e9b5SBjoern A. Zeeb #pragma GCC diagnostic push 32b4c3e9b5SBjoern A. Zeeb #ifndef __clang__ 33b4c3e9b5SBjoern A. Zeeb #pragma GCC diagnostic ignored "-Wsuggest-attribute=format" 34b4c3e9b5SBjoern A. Zeeb #endif 35b4c3e9b5SBjoern A. Zeeb 36b4c3e9b5SBjoern A. Zeeb TRACE_EVENT(brcmf_err, 37b4c3e9b5SBjoern A. Zeeb TP_PROTO(const char *func, struct va_format *vaf), 38b4c3e9b5SBjoern A. Zeeb TP_ARGS(func, vaf), 39b4c3e9b5SBjoern A. Zeeb TP_STRUCT__entry( 40b4c3e9b5SBjoern A. Zeeb __string(func, func) 41b4c3e9b5SBjoern A. Zeeb __vstring(msg, vaf->fmt, vaf->va) 42b4c3e9b5SBjoern A. Zeeb ), 43b4c3e9b5SBjoern A. Zeeb TP_fast_assign( 44b4c3e9b5SBjoern A. Zeeb __assign_str(func); 45b4c3e9b5SBjoern A. Zeeb __assign_vstr(msg, vaf->fmt, vaf->va); 46b4c3e9b5SBjoern A. Zeeb ), 47b4c3e9b5SBjoern A. Zeeb TP_printk("%s: %s", __get_str(func), __get_str(msg)) 48b4c3e9b5SBjoern A. Zeeb ); 49b4c3e9b5SBjoern A. Zeeb 50b4c3e9b5SBjoern A. Zeeb TRACE_EVENT(brcmf_dbg, 51b4c3e9b5SBjoern A. Zeeb TP_PROTO(u32 level, const char *func, struct va_format *vaf), 52b4c3e9b5SBjoern A. Zeeb TP_ARGS(level, func, vaf), 53b4c3e9b5SBjoern A. Zeeb TP_STRUCT__entry( 54b4c3e9b5SBjoern A. Zeeb __field(u32, level) 55b4c3e9b5SBjoern A. Zeeb __string(func, func) 56b4c3e9b5SBjoern A. Zeeb __vstring(msg, vaf->fmt, vaf->va) 57b4c3e9b5SBjoern A. Zeeb ), 58b4c3e9b5SBjoern A. Zeeb TP_fast_assign( 59b4c3e9b5SBjoern A. Zeeb __entry->level = level; 60b4c3e9b5SBjoern A. Zeeb __assign_str(func); 61b4c3e9b5SBjoern A. Zeeb __assign_vstr(msg, vaf->fmt, vaf->va); 62b4c3e9b5SBjoern A. Zeeb ), 63b4c3e9b5SBjoern A. Zeeb TP_printk("%s: %s", __get_str(func), __get_str(msg)) 64b4c3e9b5SBjoern A. Zeeb ); 65b4c3e9b5SBjoern A. Zeeb 66*902136e0SBjoern A. Zeeb #if defined(__linux__) 67b4c3e9b5SBjoern A. Zeeb TRACE_EVENT(brcmf_hexdump, 68b4c3e9b5SBjoern A. Zeeb TP_PROTO(void *data, size_t len), 69b4c3e9b5SBjoern A. Zeeb TP_ARGS(data, len), 70b4c3e9b5SBjoern A. Zeeb TP_STRUCT__entry( 71b4c3e9b5SBjoern A. Zeeb __field(unsigned long, len) 72b4c3e9b5SBjoern A. Zeeb __field(unsigned long, addr) 73b4c3e9b5SBjoern A. Zeeb __dynamic_array(u8, hdata, len) 74b4c3e9b5SBjoern A. Zeeb ), 75b4c3e9b5SBjoern A. Zeeb TP_fast_assign( 76b4c3e9b5SBjoern A. Zeeb __entry->len = len; 77b4c3e9b5SBjoern A. Zeeb __entry->addr = (unsigned long)data; 78b4c3e9b5SBjoern A. Zeeb memcpy(__get_dynamic_array(hdata), data, len); 79b4c3e9b5SBjoern A. Zeeb ), 80b4c3e9b5SBjoern A. Zeeb TP_printk("hexdump [addr=%lx, length=%lu]", __entry->addr, __entry->len) 81b4c3e9b5SBjoern A. Zeeb ); 82*902136e0SBjoern A. Zeeb #elif defined(__FreeBSD__) 83*902136e0SBjoern A. Zeeb TRACE_EVENT(brcmf_hexdump, 84*902136e0SBjoern A. Zeeb TP_PROTO(const void *data, size_t len), 85*902136e0SBjoern A. Zeeb TP_ARGS(data, len), 86*902136e0SBjoern A. Zeeb TP_STRUCT__entry( 87*902136e0SBjoern A. Zeeb __field(unsigned long, len) 88*902136e0SBjoern A. Zeeb __field(unsigned long, addr) 89*902136e0SBjoern A. Zeeb __dynamic_array(u8, hdata, len) 90*902136e0SBjoern A. Zeeb ), 91*902136e0SBjoern A. Zeeb TP_fast_assign( 92*902136e0SBjoern A. Zeeb __entry->len = len; 93*902136e0SBjoern A. Zeeb __entry->addr = (unsigned long)data; 94*902136e0SBjoern A. Zeeb memcpy(__get_dynamic_array(hdata), data, len); 95*902136e0SBjoern A. Zeeb ), 96*902136e0SBjoern A. Zeeb TP_printk("hexdump [addr=%lx, length=%lu]", __entry->addr, __entry->len) 97*902136e0SBjoern A. Zeeb ); 98*902136e0SBjoern A. Zeeb #endif 99b4c3e9b5SBjoern A. Zeeb 100b4c3e9b5SBjoern A. Zeeb TRACE_EVENT(brcmf_bcdchdr, 101b4c3e9b5SBjoern A. Zeeb TP_PROTO(void *data), 102b4c3e9b5SBjoern A. Zeeb TP_ARGS(data), 103b4c3e9b5SBjoern A. Zeeb TP_STRUCT__entry( 104b4c3e9b5SBjoern A. Zeeb __field(u8, flags) 105b4c3e9b5SBjoern A. Zeeb __field(u8, prio) 106b4c3e9b5SBjoern A. Zeeb __field(u8, flags2) 107b4c3e9b5SBjoern A. Zeeb __field(u32, siglen) 108b4c3e9b5SBjoern A. Zeeb __dynamic_array(u8, signal, *((u8 *)data + 3) * 4) 109b4c3e9b5SBjoern A. Zeeb ), 110b4c3e9b5SBjoern A. Zeeb TP_fast_assign( 111b4c3e9b5SBjoern A. Zeeb __entry->flags = *(u8 *)data; 112b4c3e9b5SBjoern A. Zeeb __entry->prio = *((u8 *)data + 1); 113b4c3e9b5SBjoern A. Zeeb __entry->flags2 = *((u8 *)data + 2); 114b4c3e9b5SBjoern A. Zeeb __entry->siglen = *((u8 *)data + 3) * 4; 115b4c3e9b5SBjoern A. Zeeb memcpy(__get_dynamic_array(signal), 116b4c3e9b5SBjoern A. Zeeb (u8 *)data + 4, __entry->siglen); 117b4c3e9b5SBjoern A. Zeeb ), 118b4c3e9b5SBjoern A. Zeeb TP_printk("bcdc: prio=%d siglen=%d", __entry->prio, __entry->siglen) 119b4c3e9b5SBjoern A. Zeeb ); 120b4c3e9b5SBjoern A. Zeeb 121b4c3e9b5SBjoern A. Zeeb #ifndef SDPCM_RX 122b4c3e9b5SBjoern A. Zeeb #define SDPCM_RX 0 123b4c3e9b5SBjoern A. Zeeb #endif 124b4c3e9b5SBjoern A. Zeeb #ifndef SDPCM_TX 125b4c3e9b5SBjoern A. Zeeb #define SDPCM_TX 1 126b4c3e9b5SBjoern A. Zeeb #endif 127b4c3e9b5SBjoern A. Zeeb #ifndef SDPCM_GLOM 128b4c3e9b5SBjoern A. Zeeb #define SDPCM_GLOM 2 129b4c3e9b5SBjoern A. Zeeb #endif 130b4c3e9b5SBjoern A. Zeeb 131b4c3e9b5SBjoern A. Zeeb TRACE_EVENT(brcmf_sdpcm_hdr, 132b4c3e9b5SBjoern A. Zeeb TP_PROTO(u8 dir, void *data), 133b4c3e9b5SBjoern A. Zeeb TP_ARGS(dir, data), 134b4c3e9b5SBjoern A. Zeeb TP_STRUCT__entry( 135b4c3e9b5SBjoern A. Zeeb __field(u8, dir) 136b4c3e9b5SBjoern A. Zeeb __field(u16, len) 137b4c3e9b5SBjoern A. Zeeb __dynamic_array(u8, hdr, dir == SDPCM_GLOM ? 20 : 12) 138b4c3e9b5SBjoern A. Zeeb ), 139b4c3e9b5SBjoern A. Zeeb TP_fast_assign( 140b4c3e9b5SBjoern A. Zeeb memcpy(__get_dynamic_array(hdr), data, dir == SDPCM_GLOM ? 20 : 12); 141b4c3e9b5SBjoern A. Zeeb __entry->len = *(u8 *)data | (*((u8 *)data + 1) << 8); 142b4c3e9b5SBjoern A. Zeeb __entry->dir = dir; 143b4c3e9b5SBjoern A. Zeeb ), 144b4c3e9b5SBjoern A. Zeeb TP_printk("sdpcm: %s len %u, seq %d", 145b4c3e9b5SBjoern A. Zeeb __entry->dir == SDPCM_RX ? "RX" : "TX", 146b4c3e9b5SBjoern A. Zeeb __entry->len, ((u8 *)__get_dynamic_array(hdr))[4]) 147b4c3e9b5SBjoern A. Zeeb ); 148b4c3e9b5SBjoern A. Zeeb 149b4c3e9b5SBjoern A. Zeeb #pragma GCC diagnostic pop 150b4c3e9b5SBjoern A. Zeeb 151b4c3e9b5SBjoern A. Zeeb #ifdef CONFIG_BRCM_TRACING 152b4c3e9b5SBjoern A. Zeeb 153b4c3e9b5SBjoern A. Zeeb #undef TRACE_INCLUDE_PATH 154b4c3e9b5SBjoern A. Zeeb #define TRACE_INCLUDE_PATH . 155b4c3e9b5SBjoern A. Zeeb #undef TRACE_INCLUDE_FILE 156b4c3e9b5SBjoern A. Zeeb #define TRACE_INCLUDE_FILE tracepoint 157b4c3e9b5SBjoern A. Zeeb 158b4c3e9b5SBjoern A. Zeeb #include <trace/define_trace.h> 159b4c3e9b5SBjoern A. Zeeb 160b4c3e9b5SBjoern A. Zeeb #endif /* CONFIG_BRCM_TRACING */ 161b4c3e9b5SBjoern A. Zeeb 162b4c3e9b5SBjoern A. Zeeb #endif /* BRCMF_TRACEPOINT_H_ */ 163