iwl-devtrace.h 10.2 KB
Newer Older
1 2
/******************************************************************************
 *
W
Wey-Yi Guy 已提交
3
 * Copyright(c) 2009 - 2012 Intel Corporation. All rights reserved.
4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
 *
 * This program is free software; you can redistribute it and/or modify it
 * under the terms of version 2 of the GNU General Public License as
 * published by the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
 * more details.
 *
 * You should have received a copy of the GNU General Public License along with
 * this program; if not, write to the Free Software Foundation, Inc.,
 * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
 *
 * The full GNU General Public License is included in this distribution in the
 * file called LICENSE.
 *
 * Contact Information:
 *  Intel Linux Wireless <ilw@linux.intel.com>
 * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
 *
 *****************************************************************************/

J
Johannes Berg 已提交
27 28 29 30 31
#if !defined(__IWLWIFI_DEVICE_TRACE) || defined(TRACE_HEADER_MULTI_READ)
#define __IWLWIFI_DEVICE_TRACE

#include <linux/tracepoint.h>

32

J
Johannes Berg 已提交
33 34 35 36
#if !defined(CONFIG_IWLWIFI_DEVICE_TRACING) || defined(__CHECKER__)
#undef TRACE_EVENT
#define TRACE_EVENT(name, proto, ...) \
static inline void trace_ ## name(proto) {}
J
Johannes Berg 已提交
37 38 39 40 41
#undef DECLARE_EVENT_CLASS
#define DECLARE_EVENT_CLASS(...)
#undef DEFINE_EVENT
#define DEFINE_EVENT(evt_class, name, proto, ...) \
static inline void trace_ ## name(proto) {}
J
Johannes Berg 已提交
42 43
#endif

44 45
#define DEV_ENTRY	__string(dev, dev_name(dev))
#define DEV_ASSIGN	__assign_str(dev, dev_name(dev))
J
Johannes Berg 已提交
46 47

#undef TRACE_SYSTEM
J
Johannes Berg 已提交
48
#define TRACE_SYSTEM iwlwifi_io
J
Johannes Berg 已提交
49 50

TRACE_EVENT(iwlwifi_dev_ioread32,
51 52
	TP_PROTO(const struct device *dev, u32 offs, u32 val),
	TP_ARGS(dev, offs, val),
J
Johannes Berg 已提交
53
	TP_STRUCT__entry(
54
		DEV_ENTRY
J
Johannes Berg 已提交
55 56 57 58
		__field(u32, offs)
		__field(u32, val)
	),
	TP_fast_assign(
59
		DEV_ASSIGN;
J
Johannes Berg 已提交
60 61 62
		__entry->offs = offs;
		__entry->val = val;
	),
63 64
	TP_printk("[%s] read io[%#x] = %#x",
		  __get_str(dev), __entry->offs, __entry->val)
J
Johannes Berg 已提交
65 66
);

B
Ben Cahill 已提交
67
TRACE_EVENT(iwlwifi_dev_iowrite8,
68 69
	TP_PROTO(const struct device *dev, u32 offs, u8 val),
	TP_ARGS(dev, offs, val),
B
Ben Cahill 已提交
70
	TP_STRUCT__entry(
71
		DEV_ENTRY
B
Ben Cahill 已提交
72 73 74 75
		__field(u32, offs)
		__field(u8, val)
	),
	TP_fast_assign(
76
		DEV_ASSIGN;
B
Ben Cahill 已提交
77 78 79
		__entry->offs = offs;
		__entry->val = val;
	),
80 81
	TP_printk("[%s] write io[%#x] = %#x)",
		  __get_str(dev), __entry->offs, __entry->val)
B
Ben Cahill 已提交
82 83
);

J
Johannes Berg 已提交
84
TRACE_EVENT(iwlwifi_dev_iowrite32,
85 86
	TP_PROTO(const struct device *dev, u32 offs, u32 val),
	TP_ARGS(dev, offs, val),
J
Johannes Berg 已提交
87
	TP_STRUCT__entry(
88
		DEV_ENTRY
J
Johannes Berg 已提交
89 90 91 92
		__field(u32, offs)
		__field(u32, val)
	),
	TP_fast_assign(
93
		DEV_ASSIGN;
J
Johannes Berg 已提交
94 95 96
		__entry->offs = offs;
		__entry->val = val;
	),
97 98
	TP_printk("[%s] write io[%#x] = %#x)",
		  __get_str(dev), __entry->offs, __entry->val)
J
Johannes Berg 已提交
99 100
);

J
Johannes Berg 已提交
101
TRACE_EVENT(iwlwifi_dev_irq,
102 103
	TP_PROTO(const struct device *dev),
	TP_ARGS(dev),
J
Johannes Berg 已提交
104
	TP_STRUCT__entry(
105
		DEV_ENTRY
J
Johannes Berg 已提交
106 107
	),
	TP_fast_assign(
108
		DEV_ASSIGN;
J
Johannes Berg 已提交
109 110 111 112 113 114
	),
	/* TP_printk("") doesn't compile */
	TP_printk("%d", 0)
);

TRACE_EVENT(iwlwifi_dev_ict_read,
115 116
	TP_PROTO(const struct device *dev, u32 index, u32 value),
	TP_ARGS(dev, index, value),
J
Johannes Berg 已提交
117
	TP_STRUCT__entry(
118
		DEV_ENTRY
J
Johannes Berg 已提交
119 120 121 122
		__field(u32, index)
		__field(u32, value)
	),
	TP_fast_assign(
123
		DEV_ASSIGN;
J
Johannes Berg 已提交
124 125 126
		__entry->index = index;
		__entry->value = value;
	),
127 128
	TP_printk("[%s] read ict[%d] = %#.8x",
		  __get_str(dev), __entry->index, __entry->value)
J
Johannes Berg 已提交
129 130
);

131 132 133 134
#undef TRACE_SYSTEM
#define TRACE_SYSTEM iwlwifi_ucode

TRACE_EVENT(iwlwifi_dev_ucode_cont_event,
135 136
	TP_PROTO(const struct device *dev, u32 time, u32 data, u32 ev),
	TP_ARGS(dev, time, data, ev),
137
	TP_STRUCT__entry(
138
		DEV_ENTRY
139 140 141 142 143 144

		__field(u32, time)
		__field(u32, data)
		__field(u32, ev)
	),
	TP_fast_assign(
145
		DEV_ASSIGN;
146 147 148 149
		__entry->time = time;
		__entry->data = data;
		__entry->ev = ev;
	),
150 151
	TP_printk("[%s] EVT_LOGT:%010u:0x%08x:%04u",
		  __get_str(dev), __entry->time, __entry->data, __entry->ev)
152 153 154
);

TRACE_EVENT(iwlwifi_dev_ucode_wrap_event,
155 156
	TP_PROTO(const struct device *dev, u32 wraps, u32 n_entry, u32 p_entry),
	TP_ARGS(dev, wraps, n_entry, p_entry),
157
	TP_STRUCT__entry(
158
		DEV_ENTRY
159 160 161 162 163 164

		__field(u32, wraps)
		__field(u32, n_entry)
		__field(u32, p_entry)
	),
	TP_fast_assign(
165
		DEV_ASSIGN;
166 167 168 169
		__entry->wraps = wraps;
		__entry->n_entry = n_entry;
		__entry->p_entry = p_entry;
	),
170 171
	TP_printk("[%s] wraps=#%02d n=0x%X p=0x%X",
		  __get_str(dev), __entry->wraps, __entry->n_entry,
172 173 174
		  __entry->p_entry)
);

J
Johannes Berg 已提交
175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234
#undef TRACE_SYSTEM
#define TRACE_SYSTEM iwlwifi_msg

#define MAX_MSG_LEN	100

DECLARE_EVENT_CLASS(iwlwifi_msg_event,
	TP_PROTO(struct va_format *vaf),
	TP_ARGS(vaf),
	TP_STRUCT__entry(
		__dynamic_array(char, msg, MAX_MSG_LEN)
	),
	TP_fast_assign(
		WARN_ON_ONCE(vsnprintf(__get_dynamic_array(msg),
				       MAX_MSG_LEN, vaf->fmt,
				       *vaf->va) >= MAX_MSG_LEN);
	),
	TP_printk("%s", (char *)__get_dynamic_array(msg))
);

DEFINE_EVENT(iwlwifi_msg_event, iwlwifi_err,
	TP_PROTO(struct va_format *vaf),
	TP_ARGS(vaf)
);

DEFINE_EVENT(iwlwifi_msg_event, iwlwifi_warn,
	TP_PROTO(struct va_format *vaf),
	TP_ARGS(vaf)
);

DEFINE_EVENT(iwlwifi_msg_event, iwlwifi_info,
	TP_PROTO(struct va_format *vaf),
	TP_ARGS(vaf)
);

DEFINE_EVENT(iwlwifi_msg_event, iwlwifi_crit,
	TP_PROTO(struct va_format *vaf),
	TP_ARGS(vaf)
);

TRACE_EVENT(iwlwifi_dbg,
	TP_PROTO(u32 level, bool in_interrupt, const char *function,
		 struct va_format *vaf),
	TP_ARGS(level, in_interrupt, function, vaf),
	TP_STRUCT__entry(
		__field(u32, level)
		__field(u8, in_interrupt)
		__string(function, function)
		__dynamic_array(char, msg, MAX_MSG_LEN)
	),
	TP_fast_assign(
		__entry->level = level;
		__entry->in_interrupt = in_interrupt;
		__assign_str(function, function);
		WARN_ON_ONCE(vsnprintf(__get_dynamic_array(msg),
				       MAX_MSG_LEN, vaf->fmt,
				       *vaf->va) >= MAX_MSG_LEN);
	),
	TP_printk("%s", (char *)__get_dynamic_array(msg))
);

J
Johannes Berg 已提交
235 236 237
#undef TRACE_SYSTEM
#define TRACE_SYSTEM iwlwifi

J
Johannes Berg 已提交
238
TRACE_EVENT(iwlwifi_dev_hcmd,
239
	TP_PROTO(const struct device *dev, u32 flags,
240 241 242
		 const void *hcmd0, size_t len0,
		 const void *hcmd1, size_t len1,
		 const void *hcmd2, size_t len2),
243
	TP_ARGS(dev, flags, hcmd0, len0, hcmd1, len1, hcmd2, len2),
J
Johannes Berg 已提交
244
	TP_STRUCT__entry(
245
		DEV_ENTRY
246 247 248
		__dynamic_array(u8, hcmd0, len0)
		__dynamic_array(u8, hcmd1, len1)
		__dynamic_array(u8, hcmd2, len2)
J
Johannes Berg 已提交
249 250 251
		__field(u32, flags)
	),
	TP_fast_assign(
252
		DEV_ASSIGN;
253 254 255
		memcpy(__get_dynamic_array(hcmd0), hcmd0, len0);
		memcpy(__get_dynamic_array(hcmd1), hcmd1, len1);
		memcpy(__get_dynamic_array(hcmd2), hcmd2, len2);
J
Johannes Berg 已提交
256 257
		__entry->flags = flags;
	),
258 259
	TP_printk("[%s] hcmd %#.2x (%ssync)",
		  __get_str(dev), ((u8 *)__get_dynamic_array(hcmd0))[0],
J
Johannes Berg 已提交
260 261 262 263
		  __entry->flags & CMD_ASYNC ? "a" : "")
);

TRACE_EVENT(iwlwifi_dev_rx,
264 265
	TP_PROTO(const struct device *dev, void *rxbuf, size_t len),
	TP_ARGS(dev, rxbuf, len),
J
Johannes Berg 已提交
266
	TP_STRUCT__entry(
267
		DEV_ENTRY
J
Johannes Berg 已提交
268 269 270
		__dynamic_array(u8, rxbuf, len)
	),
	TP_fast_assign(
271
		DEV_ASSIGN;
J
Johannes Berg 已提交
272 273
		memcpy(__get_dynamic_array(rxbuf), rxbuf, len);
	),
274 275
	TP_printk("[%s] RX cmd %#.2x",
		  __get_str(dev), ((u8 *)__get_dynamic_array(rxbuf))[4])
J
Johannes Berg 已提交
276 277 278
);

TRACE_EVENT(iwlwifi_dev_tx,
279
	TP_PROTO(const struct device *dev, void *tfd, size_t tfdlen,
J
Johannes Berg 已提交
280 281
		 void *buf0, size_t buf0_len,
		 void *buf1, size_t buf1_len),
282
	TP_ARGS(dev, tfd, tfdlen, buf0, buf0_len, buf1, buf1_len),
J
Johannes Berg 已提交
283
	TP_STRUCT__entry(
284
		DEV_ENTRY
J
Johannes Berg 已提交
285 286 287 288 289 290 291 292 293 294 295 296 297

		__field(size_t, framelen)
		__dynamic_array(u8, tfd, tfdlen)

		/*
		 * Do not insert between or below these items,
		 * we want to keep the frame together (except
		 * for the possible padding).
		 */
		__dynamic_array(u8, buf0, buf0_len)
		__dynamic_array(u8, buf1, buf1_len)
	),
	TP_fast_assign(
298
		DEV_ASSIGN;
J
Johannes Berg 已提交
299 300 301
		__entry->framelen = buf0_len + buf1_len;
		memcpy(__get_dynamic_array(tfd), tfd, tfdlen);
		memcpy(__get_dynamic_array(buf0), buf0, buf0_len);
J
Johannes Berg 已提交
302
		memcpy(__get_dynamic_array(buf1), buf1, buf1_len);
J
Johannes Berg 已提交
303
	),
304 305
	TP_printk("[%s] TX %.2x (%zu bytes)",
		  __get_str(dev), ((u8 *)__get_dynamic_array(buf0))[0],
J
Johannes Berg 已提交
306 307 308 309
		  __entry->framelen)
);

TRACE_EVENT(iwlwifi_dev_ucode_error,
310
	TP_PROTO(const struct device *dev, u32 desc, u32 tsf_low,
J
Johannes Berg 已提交
311
		 u32 data1, u32 data2, u32 line, u32 blink1,
W
Wey-Yi Guy 已提交
312 313 314
		 u32 blink2, u32 ilink1, u32 ilink2, u32 bcon_time,
		 u32 gp1, u32 gp2, u32 gp3, u32 ucode_ver, u32 hw_ver,
		 u32 brd_ver),
315
	TP_ARGS(dev, desc, tsf_low, data1, data2, line,
W
Wey-Yi Guy 已提交
316 317
		blink1, blink2, ilink1, ilink2, bcon_time, gp1, gp2,
		gp3, ucode_ver, hw_ver, brd_ver),
J
Johannes Berg 已提交
318
	TP_STRUCT__entry(
319
		DEV_ENTRY
J
Johannes Berg 已提交
320
		__field(u32, desc)
W
Wey-Yi Guy 已提交
321
		__field(u32, tsf_low)
J
Johannes Berg 已提交
322 323 324 325 326 327 328
		__field(u32, data1)
		__field(u32, data2)
		__field(u32, line)
		__field(u32, blink1)
		__field(u32, blink2)
		__field(u32, ilink1)
		__field(u32, ilink2)
W
Wey-Yi Guy 已提交
329 330 331 332 333 334 335
		__field(u32, bcon_time)
		__field(u32, gp1)
		__field(u32, gp2)
		__field(u32, gp3)
		__field(u32, ucode_ver)
		__field(u32, hw_ver)
		__field(u32, brd_ver)
J
Johannes Berg 已提交
336 337
	),
	TP_fast_assign(
338
		DEV_ASSIGN;
J
Johannes Berg 已提交
339
		__entry->desc = desc;
W
Wey-Yi Guy 已提交
340
		__entry->tsf_low = tsf_low;
J
Johannes Berg 已提交
341 342 343 344 345 346 347
		__entry->data1 = data1;
		__entry->data2 = data2;
		__entry->line = line;
		__entry->blink1 = blink1;
		__entry->blink2 = blink2;
		__entry->ilink1 = ilink1;
		__entry->ilink2 = ilink2;
W
Wey-Yi Guy 已提交
348 349 350 351 352 353 354
		__entry->bcon_time = bcon_time;
		__entry->gp1 = gp1;
		__entry->gp2 = gp2;
		__entry->gp3 = gp3;
		__entry->ucode_ver = ucode_ver;
		__entry->hw_ver = hw_ver;
		__entry->brd_ver = brd_ver;
J
Johannes Berg 已提交
355
	),
356
	TP_printk("[%s] #%02d %010u data 0x%08X 0x%08X line %u, "
W
Wey-Yi Guy 已提交
357 358 359
		  "blink 0x%05X 0x%05X ilink 0x%05X 0x%05X "
		  "bcon_tm %010u gp 0x%08X 0x%08X 0x%08X uCode 0x%08X "
		  "hw 0x%08X brd 0x%08X",
360
		  __get_str(dev), __entry->desc, __entry->tsf_low,
W
Wey-Yi Guy 已提交
361
		  __entry->data1,
J
Johannes Berg 已提交
362
		  __entry->data2, __entry->line, __entry->blink1,
W
Wey-Yi Guy 已提交
363 364 365 366
		  __entry->blink2, __entry->ilink1, __entry->ilink2,
		  __entry->bcon_time, __entry->gp1, __entry->gp2,
		  __entry->gp3, __entry->ucode_ver, __entry->hw_ver,
		  __entry->brd_ver)
J
Johannes Berg 已提交
367 368 369
);

TRACE_EVENT(iwlwifi_dev_ucode_event,
370 371
	TP_PROTO(const struct device *dev, u32 time, u32 data, u32 ev),
	TP_ARGS(dev, time, data, ev),
J
Johannes Berg 已提交
372
	TP_STRUCT__entry(
373
		DEV_ENTRY
J
Johannes Berg 已提交
374 375 376 377 378 379

		__field(u32, time)
		__field(u32, data)
		__field(u32, ev)
	),
	TP_fast_assign(
380
		DEV_ASSIGN;
J
Johannes Berg 已提交
381 382 383 384
		__entry->time = time;
		__entry->data = data;
		__entry->ev = ev;
	),
385 386
	TP_printk("[%s] EVT_LOGT:%010u:0x%08x:%04u",
		  __get_str(dev), __entry->time, __entry->data, __entry->ev)
J
Johannes Berg 已提交
387 388 389 390 391 392 393 394
);
#endif /* __IWLWIFI_DEVICE_TRACE */

#undef TRACE_INCLUDE_PATH
#define TRACE_INCLUDE_PATH .
#undef TRACE_INCLUDE_FILE
#define TRACE_INCLUDE_FILE iwl-devtrace
#include <trace/define_trace.h>