iwl-devtrace.h 10.3 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
#if !defined(__IWLWIFI_DEVICE_TRACE) || defined(TRACE_HEADER_MULTI_READ)
#define __IWLWIFI_DEVICE_TRACE

#include <linux/tracepoint.h>
31
#include <linux/device.h>
32
#include "iwl-trans.h"
J
Johannes Berg 已提交
33

34

J
Johannes Berg 已提交
35 36 37 38
#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 已提交
39 40 41 42 43
#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 已提交
44 45
#endif

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

#undef TRACE_SYSTEM
J
Johannes Berg 已提交
50
#define TRACE_SYSTEM iwlwifi_io
J
Johannes Berg 已提交
51 52

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

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

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

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

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

133 134 135 136
#undef TRACE_SYSTEM
#define TRACE_SYSTEM iwlwifi_ucode

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

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

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

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

J
Johannes Berg 已提交
177 178 179
#undef TRACE_SYSTEM
#define TRACE_SYSTEM iwlwifi_msg

180
#define MAX_MSG_LEN	110
J
Johannes Berg 已提交
181 182 183 184 185 186 187 188 189 190 191 192

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);
	),
193
	TP_printk("%s", __get_str(msg))
J
Johannes Berg 已提交
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 235 236
);

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 已提交
237 238 239
#undef TRACE_SYSTEM
#define TRACE_SYSTEM iwlwifi

J
Johannes Berg 已提交
240
TRACE_EVENT(iwlwifi_dev_hcmd,
241 242 243 244
	TP_PROTO(const struct device *dev,
		 struct iwl_host_cmd *cmd, u16 total_size,
		 const void *hdr, size_t hdr_len),
	TP_ARGS(dev, cmd, total_size, hdr, hdr_len),
J
Johannes Berg 已提交
245
	TP_STRUCT__entry(
246
		DEV_ENTRY
247
		__dynamic_array(u8, hcmd, total_size)
J
Johannes Berg 已提交
248 249 250
		__field(u32, flags)
	),
	TP_fast_assign(
251 252
		int i, offset = hdr_len;

253
		DEV_ASSIGN;
254 255 256 257 258 259 260 261 262 263 264 265
		__entry->flags = cmd->flags;
		memcpy(__get_dynamic_array(hcmd), hdr, hdr_len);

		for (i = 0; i < IWL_MAX_CMD_TFDS; i++) {
			if (!cmd->len[i])
				continue;
			if (!(cmd->dataflags[i] & IWL_HCMD_DFL_NOCOPY))
				continue;
			memcpy((u8 *)__get_dynamic_array(hcmd) + offset,
			       cmd->data[i], cmd->len[i]);
			offset += cmd->len[i];
		}
J
Johannes Berg 已提交
266
	),
267
	TP_printk("[%s] hcmd %#.2x (%ssync)",
268
		  __get_str(dev), ((u8 *)__get_dynamic_array(hcmd))[0],
J
Johannes Berg 已提交
269 270 271 272
		  __entry->flags & CMD_ASYNC ? "a" : "")
);

TRACE_EVENT(iwlwifi_dev_rx,
273 274
	TP_PROTO(const struct device *dev, void *rxbuf, size_t len),
	TP_ARGS(dev, rxbuf, len),
J
Johannes Berg 已提交
275
	TP_STRUCT__entry(
276
		DEV_ENTRY
J
Johannes Berg 已提交
277 278 279
		__dynamic_array(u8, rxbuf, len)
	),
	TP_fast_assign(
280
		DEV_ASSIGN;
J
Johannes Berg 已提交
281 282
		memcpy(__get_dynamic_array(rxbuf), rxbuf, len);
	),
283 284
	TP_printk("[%s] RX cmd %#.2x",
		  __get_str(dev), ((u8 *)__get_dynamic_array(rxbuf))[4])
J
Johannes Berg 已提交
285 286 287
);

TRACE_EVENT(iwlwifi_dev_tx,
288
	TP_PROTO(const struct device *dev, void *tfd, size_t tfdlen,
J
Johannes Berg 已提交
289 290
		 void *buf0, size_t buf0_len,
		 void *buf1, size_t buf1_len),
291
	TP_ARGS(dev, tfd, tfdlen, buf0, buf0_len, buf1, buf1_len),
J
Johannes Berg 已提交
292
	TP_STRUCT__entry(
293
		DEV_ENTRY
J
Johannes Berg 已提交
294 295 296 297 298 299 300 301 302 303 304 305 306

		__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(
307
		DEV_ASSIGN;
J
Johannes Berg 已提交
308 309 310
		__entry->framelen = buf0_len + buf1_len;
		memcpy(__get_dynamic_array(tfd), tfd, tfdlen);
		memcpy(__get_dynamic_array(buf0), buf0, buf0_len);
J
Johannes Berg 已提交
311
		memcpy(__get_dynamic_array(buf1), buf1, buf1_len);
J
Johannes Berg 已提交
312
	),
313 314
	TP_printk("[%s] TX %.2x (%zu bytes)",
		  __get_str(dev), ((u8 *)__get_dynamic_array(buf0))[0],
J
Johannes Berg 已提交
315 316 317 318
		  __entry->framelen)
);

TRACE_EVENT(iwlwifi_dev_ucode_error,
319
	TP_PROTO(const struct device *dev, u32 desc, u32 tsf_low,
J
Johannes Berg 已提交
320
		 u32 data1, u32 data2, u32 line, u32 blink1,
W
Wey-Yi Guy 已提交
321 322 323
		 u32 blink2, u32 ilink1, u32 ilink2, u32 bcon_time,
		 u32 gp1, u32 gp2, u32 gp3, u32 ucode_ver, u32 hw_ver,
		 u32 brd_ver),
324
	TP_ARGS(dev, desc, tsf_low, data1, data2, line,
W
Wey-Yi Guy 已提交
325 326
		blink1, blink2, ilink1, ilink2, bcon_time, gp1, gp2,
		gp3, ucode_ver, hw_ver, brd_ver),
J
Johannes Berg 已提交
327
	TP_STRUCT__entry(
328
		DEV_ENTRY
J
Johannes Berg 已提交
329
		__field(u32, desc)
W
Wey-Yi Guy 已提交
330
		__field(u32, tsf_low)
J
Johannes Berg 已提交
331 332 333 334 335 336 337
		__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 已提交
338 339 340 341 342 343 344
		__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 已提交
345 346
	),
	TP_fast_assign(
347
		DEV_ASSIGN;
J
Johannes Berg 已提交
348
		__entry->desc = desc;
W
Wey-Yi Guy 已提交
349
		__entry->tsf_low = tsf_low;
J
Johannes Berg 已提交
350 351 352 353 354 355 356
		__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 已提交
357 358 359 360 361 362 363
		__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 已提交
364
	),
365
	TP_printk("[%s] #%02d %010u data 0x%08X 0x%08X line %u, "
W
Wey-Yi Guy 已提交
366 367 368
		  "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",
369
		  __get_str(dev), __entry->desc, __entry->tsf_low,
W
Wey-Yi Guy 已提交
370
		  __entry->data1,
J
Johannes Berg 已提交
371
		  __entry->data2, __entry->line, __entry->blink1,
W
Wey-Yi Guy 已提交
372 373 374 375
		  __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 已提交
376 377 378
);

TRACE_EVENT(iwlwifi_dev_ucode_event,
379 380
	TP_PROTO(const struct device *dev, u32 time, u32 data, u32 ev),
	TP_ARGS(dev, time, data, ev),
J
Johannes Berg 已提交
381
	TP_STRUCT__entry(
382
		DEV_ENTRY
J
Johannes Berg 已提交
383 384 385 386 387 388

		__field(u32, time)
		__field(u32, data)
		__field(u32, ev)
	),
	TP_fast_assign(
389
		DEV_ASSIGN;
J
Johannes Berg 已提交
390 391 392 393
		__entry->time = time;
		__entry->data = data;
		__entry->ev = ev;
	),
394 395
	TP_printk("[%s] EVT_LOGT:%010u:0x%08x:%04u",
		  __get_str(dev), __entry->time, __entry->data, __entry->ev)
J
Johannes Berg 已提交
396 397 398 399 400 401 402 403
);
#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>