1/* 2 * Copyright (c) 2011 Broadcom Corporation 3 * 4 * Permission to use, copy, modify, and/or distribute this software for any 5 * purpose with or without fee is hereby granted, provided that the above 6 * copyright notice and this permission notice appear in all copies. 7 * 8 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 9 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 10 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY 11 * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 12 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION 13 * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN 14 * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 15 */ 16 17#if !defined(__TRACE_BRCMSMAC_H) || defined(TRACE_HEADER_MULTI_READ) 18 19#define __TRACE_BRCMSMAC_H 20 21#include <linux/types.h> 22#include <linux/device.h> 23#include <linux/tracepoint.h> 24#include "mac80211_if.h" 25 26#ifndef CONFIG_BRCM_TRACING 27#undef TRACE_EVENT 28#define TRACE_EVENT(name, proto, ...) \ 29static inline void trace_ ## name(proto) {} 30#undef DECLARE_EVENT_CLASS 31#define DECLARE_EVENT_CLASS(...) 32#undef DEFINE_EVENT 33#define DEFINE_EVENT(evt_class, name, proto, ...) \ 34static inline void trace_ ## name(proto) {} 35#endif 36 37#undef TRACE_SYSTEM 38#define TRACE_SYSTEM brcmsmac 39 40/* 41 * We define a tracepoint, its arguments, its printk format and its 42 * 'fast binary record' layout. 43 */ 44TRACE_EVENT(brcms_timer, 45 /* TPPROTO is the prototype of the function called by this tracepoint */ 46 TP_PROTO(struct brcms_timer *t), 47 /* 48 * TPARGS(firstarg, p) are the parameters names, same as found in the 49 * prototype. 50 */ 51 TP_ARGS(t), 52 /* 53 * Fast binary tracing: define the trace record via TP_STRUCT__entry(). 54 * You can think about it like a regular C structure local variable 55 * definition. 56 */ 57 TP_STRUCT__entry( 58 __field(uint, ms) 59 __field(uint, set) 60 __field(uint, periodic) 61 ), 62 TP_fast_assign( 63 __entry->ms = t->ms; 64 __entry->set = t->set; 65 __entry->periodic = t->periodic; 66 ), 67 TP_printk( 68 "ms=%u set=%u periodic=%u", 69 __entry->ms, __entry->set, __entry->periodic 70 ) 71); 72 73TRACE_EVENT(brcms_dpc, 74 TP_PROTO(unsigned long data), 75 TP_ARGS(data), 76 TP_STRUCT__entry( 77 __field(unsigned long, data) 78 ), 79 TP_fast_assign( 80 __entry->data = data; 81 ), 82 TP_printk( 83 "data=%p", 84 (void *)__entry->data 85 ) 86); 87 88TRACE_EVENT(brcms_macintstatus, 89 TP_PROTO(const struct device *dev, int in_isr, u32 macintstatus, 90 u32 mask), 91 TP_ARGS(dev, in_isr, macintstatus, mask), 92 TP_STRUCT__entry( 93 __string(dev, dev_name(dev)) 94 __field(int, in_isr) 95 __field(u32, macintstatus) 96 __field(u32, mask) 97 ), 98 TP_fast_assign( 99 __assign_str(dev, dev_name(dev)); 100 __entry->in_isr = in_isr; 101 __entry->macintstatus = macintstatus; 102 __entry->mask = mask; 103 ), 104 TP_printk("[%s] in_isr=%d macintstatus=%#x mask=%#x", __get_str(dev), 105 __entry->in_isr, __entry->macintstatus, __entry->mask) 106); 107 108#undef TRACE_SYSTEM 109#define TRACE_SYSTEM brcmsmac_tx 110 111TRACE_EVENT(brcms_txdesc, 112 TP_PROTO(const struct device *dev, 113 void *txh, size_t txh_len), 114 TP_ARGS(dev, txh, txh_len), 115 TP_STRUCT__entry( 116 __string(dev, dev_name(dev)) 117 __dynamic_array(u8, txh, txh_len) 118 ), 119 TP_fast_assign( 120 __assign_str(dev, dev_name(dev)); 121 memcpy(__get_dynamic_array(txh), txh, txh_len); 122 ), 123 TP_printk("[%s] txdesc", __get_str(dev)) 124); 125 126TRACE_EVENT(brcms_txstatus, 127 TP_PROTO(const struct device *dev, u16 framelen, u16 frameid, 128 u16 status, u16 lasttxtime, u16 sequence, u16 phyerr, 129 u16 ackphyrxsh), 130 TP_ARGS(dev, framelen, frameid, status, lasttxtime, sequence, phyerr, 131 ackphyrxsh), 132 TP_STRUCT__entry( 133 __string(dev, dev_name(dev)) 134 __field(u16, framelen) 135 __field(u16, frameid) 136 __field(u16, status) 137 __field(u16, lasttxtime) 138 __field(u16, sequence) 139 __field(u16, phyerr) 140 __field(u16, ackphyrxsh) 141 ), 142 TP_fast_assign( 143 __assign_str(dev, dev_name(dev)); 144 __entry->framelen = framelen; 145 __entry->frameid = frameid; 146 __entry->status = status; 147 __entry->lasttxtime = lasttxtime; 148 __entry->sequence = sequence; 149 __entry->phyerr = phyerr; 150 __entry->ackphyrxsh = ackphyrxsh; 151 ), 152 TP_printk("[%s] FrameId %#04x TxStatus %#04x LastTxTime %#04x " 153 "Seq %#04x PHYTxStatus %#04x RxAck %#04x", 154 __get_str(dev), __entry->frameid, __entry->status, 155 __entry->lasttxtime, __entry->sequence, __entry->phyerr, 156 __entry->ackphyrxsh) 157); 158 159TRACE_EVENT(brcms_ampdu_session, 160 TP_PROTO(const struct device *dev, unsigned max_ampdu_len, 161 u16 max_ampdu_frames, u16 ampdu_len, u16 ampdu_frames, 162 u16 dma_len), 163 TP_ARGS(dev, max_ampdu_len, max_ampdu_frames, ampdu_len, ampdu_frames, 164 dma_len), 165 TP_STRUCT__entry( 166 __string(dev, dev_name(dev)) 167 __field(unsigned, max_ampdu_len) 168 __field(u16, max_ampdu_frames) 169 __field(u16, ampdu_len) 170 __field(u16, ampdu_frames) 171 __field(u16, dma_len) 172 ), 173 TP_fast_assign( 174 __assign_str(dev, dev_name(dev)); 175 __entry->max_ampdu_len = max_ampdu_len; 176 __entry->max_ampdu_frames = max_ampdu_frames; 177 __entry->ampdu_len = ampdu_len; 178 __entry->ampdu_frames = ampdu_frames; 179 __entry->dma_len = dma_len; 180 ), 181 TP_printk("[%s] ampdu session max_len=%u max_frames=%u len=%u frames=%u dma_len=%u", 182 __get_str(dev), __entry->max_ampdu_len, 183 __entry->max_ampdu_frames, __entry->ampdu_len, 184 __entry->ampdu_frames, __entry->dma_len) 185); 186 187#undef TRACE_SYSTEM 188#define TRACE_SYSTEM brcmsmac_msg 189 190#define MAX_MSG_LEN 100 191 192DECLARE_EVENT_CLASS(brcms_msg_event, 193 TP_PROTO(struct va_format *vaf), 194 TP_ARGS(vaf), 195 TP_STRUCT__entry( 196 __dynamic_array(char, msg, MAX_MSG_LEN) 197 ), 198 TP_fast_assign( 199 WARN_ON_ONCE(vsnprintf(__get_dynamic_array(msg), 200 MAX_MSG_LEN, vaf->fmt, 201 *vaf->va) >= MAX_MSG_LEN); 202 ), 203 TP_printk("%s", __get_str(msg)) 204); 205 206DEFINE_EVENT(brcms_msg_event, brcms_info, 207 TP_PROTO(struct va_format *vaf), 208 TP_ARGS(vaf) 209); 210 211DEFINE_EVENT(brcms_msg_event, brcms_warn, 212 TP_PROTO(struct va_format *vaf), 213 TP_ARGS(vaf) 214); 215 216DEFINE_EVENT(brcms_msg_event, brcms_err, 217 TP_PROTO(struct va_format *vaf), 218 TP_ARGS(vaf) 219); 220 221DEFINE_EVENT(brcms_msg_event, brcms_crit, 222 TP_PROTO(struct va_format *vaf), 223 TP_ARGS(vaf) 224); 225 226TRACE_EVENT(brcms_dbg, 227 TP_PROTO(u32 level, const char *func, struct va_format *vaf), 228 TP_ARGS(level, func, vaf), 229 TP_STRUCT__entry( 230 __field(u32, level) 231 __string(func, func) 232 __dynamic_array(char, msg, MAX_MSG_LEN) 233 ), 234 TP_fast_assign( 235 __entry->level = level; 236 __assign_str(func, func); 237 WARN_ON_ONCE(vsnprintf(__get_dynamic_array(msg), 238 MAX_MSG_LEN, vaf->fmt, 239 *vaf->va) >= MAX_MSG_LEN); 240 ), 241 TP_printk("%s: %s", __get_str(func), __get_str(msg)) 242); 243 244#endif /* __TRACE_BRCMSMAC_H */ 245 246#ifdef CONFIG_BRCM_TRACING 247 248#undef TRACE_INCLUDE_PATH 249#define TRACE_INCLUDE_PATH . 250#undef TRACE_INCLUDE_FILE 251#define TRACE_INCLUDE_FILE brcms_trace_events 252 253#include <trace/define_trace.h> 254 255#endif /* CONFIG_BRCM_TRACING */ 256