diff options
author | Arend van Spriel <arend@broadcom.com> | 2013-03-03 06:45:21 -0500 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2013-03-06 16:28:31 -0500 |
commit | e5483576f04476de8f277feb313248b348d56ad8 (patch) | |
tree | a0a7370c12cfff67af52db3ee58d26f3453e5e5d /drivers/net/wireless/brcm80211 | |
parent | cd864522b349cfe88903cf6f3415293c39856b6c (diff) |
brcmfmac: introduce tracepoints for message logging
Inspired by tracing functionality added by Seth Forshee in the
brcmsmac driver, this patch adds similar functionality to brcmfmac.
Reviewed-by: Piotr Haber <phaber@broadcom.com>
Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
Reviewed-by: Hante Meuleman <meuleman@broadcom.com>
Signed-off-by: Arend van Spriel <arend@broadcom.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net/wireless/brcm80211')
6 files changed, 159 insertions, 7 deletions
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/Makefile b/drivers/net/wireless/brcm80211/brcmfmac/Makefile index 756e19fc2795..74282739350d 100644 --- a/drivers/net/wireless/brcm80211/brcmfmac/Makefile +++ b/drivers/net/wireless/brcm80211/brcmfmac/Makefile | |||
@@ -39,3 +39,5 @@ brcmfmac-$(CONFIG_BRCMFMAC_USB) += \ | |||
39 | usb.o | 39 | usb.o |
40 | brcmfmac-$(CONFIG_BRCMDBG) += \ | 40 | brcmfmac-$(CONFIG_BRCMDBG) += \ |
41 | dhd_dbg.o | 41 | dhd_dbg.o |
42 | brcmfmac-$(CONFIG_BRCM_TRACING) += \ | ||
43 | tracepoint.o | ||
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/dhd_common.c b/drivers/net/wireless/brcm80211/brcmfmac/dhd_common.c index 4544342a0428..be0787cab24f 100644 --- a/drivers/net/wireless/brcm80211/brcmfmac/dhd_common.c +++ b/drivers/net/wireless/brcm80211/brcmfmac/dhd_common.c | |||
@@ -24,6 +24,7 @@ | |||
24 | #include "dhd_proto.h" | 24 | #include "dhd_proto.h" |
25 | #include "dhd_dbg.h" | 25 | #include "dhd_dbg.h" |
26 | #include "fwil.h" | 26 | #include "fwil.h" |
27 | #include "tracepoint.h" | ||
27 | 28 | ||
28 | #define PKTFILTER_BUF_SIZE 128 | 29 | #define PKTFILTER_BUF_SIZE 128 |
29 | #define BRCMF_ARPOL_MODE 0xb /* agent|snoop|peer_autoreply */ | 30 | #define BRCMF_ARPOL_MODE 0xb /* agent|snoop|peer_autoreply */ |
@@ -373,3 +374,35 @@ int brcmf_c_preinit_dcmds(struct brcmf_if *ifp) | |||
373 | done: | 374 | done: |
374 | return err; | 375 | return err; |
375 | } | 376 | } |
377 | |||
378 | #ifdef CONFIG_BRCM_TRACING | ||
379 | void __brcmf_err(const char *func, const char *fmt, ...) | ||
380 | { | ||
381 | struct va_format vaf = { | ||
382 | .fmt = fmt, | ||
383 | }; | ||
384 | va_list args; | ||
385 | |||
386 | va_start(args, fmt); | ||
387 | vaf.va = &args; | ||
388 | pr_err("%s: %pV", func, &vaf); | ||
389 | trace_brcmf_err(func, &vaf); | ||
390 | va_end(args); | ||
391 | } | ||
392 | #endif | ||
393 | #if defined(CONFIG_BRCM_TRACING) || defined(CONFIG_BRCMDBG) | ||
394 | void __brcmf_dbg(u32 level, const char *func, const char *fmt, ...) | ||
395 | { | ||
396 | struct va_format vaf = { | ||
397 | .fmt = fmt, | ||
398 | }; | ||
399 | va_list args; | ||
400 | |||
401 | va_start(args, fmt); | ||
402 | vaf.va = &args; | ||
403 | if (brcmf_msg_level & level) | ||
404 | pr_debug("%s %pV", func, &vaf); | ||
405 | trace_brcmf_dbg(level, func, &vaf); | ||
406 | va_end(args); | ||
407 | } | ||
408 | #endif | ||
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/dhd_dbg.c b/drivers/net/wireless/brcm80211/brcmfmac/dhd_dbg.c index 57671eddf79d..50f293851982 100644 --- a/drivers/net/wireless/brcm80211/brcmfmac/dhd_dbg.c +++ b/drivers/net/wireless/brcm80211/brcmfmac/dhd_dbg.c | |||
@@ -22,6 +22,7 @@ | |||
22 | #include "dhd.h" | 22 | #include "dhd.h" |
23 | #include "dhd_bus.h" | 23 | #include "dhd_bus.h" |
24 | #include "dhd_dbg.h" | 24 | #include "dhd_dbg.h" |
25 | #include "tracepoint.h" | ||
25 | 26 | ||
26 | static struct dentry *root_folder; | 27 | static struct dentry *root_folder; |
27 | 28 | ||
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/dhd_dbg.h b/drivers/net/wireless/brcm80211/brcmfmac/dhd_dbg.h index bc013cbe06f6..0a1806f58676 100644 --- a/drivers/net/wireless/brcm80211/brcmfmac/dhd_dbg.h +++ b/drivers/net/wireless/brcm80211/brcmfmac/dhd_dbg.h | |||
@@ -43,6 +43,7 @@ | |||
43 | * debugging is not selected. When debugging the driver error | 43 | * debugging is not selected. When debugging the driver error |
44 | * messages are as important as other tracing or even more so. | 44 | * messages are as important as other tracing or even more so. |
45 | */ | 45 | */ |
46 | #ifndef CONFIG_BRCM_TRACING | ||
46 | #ifdef CONFIG_BRCMDBG | 47 | #ifdef CONFIG_BRCMDBG |
47 | #define brcmf_err(fmt, ...) pr_err("%s: " fmt, __func__, ##__VA_ARGS__) | 48 | #define brcmf_err(fmt, ...) pr_err("%s: " fmt, __func__, ##__VA_ARGS__) |
48 | #else | 49 | #else |
@@ -52,15 +53,21 @@ | |||
52 | pr_err("%s: " fmt, __func__, ##__VA_ARGS__); \ | 53 | pr_err("%s: " fmt, __func__, ##__VA_ARGS__); \ |
53 | } while (0) | 54 | } while (0) |
54 | #endif | 55 | #endif |
56 | #else | ||
57 | __printf(2, 3) | ||
58 | void __brcmf_err(const char *func, const char *fmt, ...); | ||
59 | #define brcmf_err(fmt, ...) \ | ||
60 | __brcmf_err(__func__, fmt, ##__VA_ARGS__) | ||
61 | #endif | ||
55 | 62 | ||
56 | #if defined(DEBUG) | 63 | #if defined(DEBUG) || defined(CONFIG_BRCM_TRACING) |
57 | 64 | __printf(3, 4) | |
65 | void __brcmf_dbg(u32 level, const char *func, const char *fmt, ...); | ||
58 | #define brcmf_dbg(level, fmt, ...) \ | 66 | #define brcmf_dbg(level, fmt, ...) \ |
59 | do { \ | 67 | do { \ |
60 | if (brcmf_msg_level & BRCMF_##level##_VAL) \ | 68 | __brcmf_dbg(BRCMF_##level##_VAL, __func__, \ |
61 | pr_debug("%s: " fmt, __func__, ##__VA_ARGS__); \ | 69 | fmt, ##__VA_ARGS__); \ |
62 | } while (0) | 70 | } while (0) |
63 | |||
64 | #define BRCMF_DATA_ON() (brcmf_msg_level & BRCMF_DATA_VAL) | 71 | #define BRCMF_DATA_ON() (brcmf_msg_level & BRCMF_DATA_VAL) |
65 | #define BRCMF_CTL_ON() (brcmf_msg_level & BRCMF_CTL_VAL) | 72 | #define BRCMF_CTL_ON() (brcmf_msg_level & BRCMF_CTL_VAL) |
66 | #define BRCMF_HDRS_ON() (brcmf_msg_level & BRCMF_HDRS_VAL) | 73 | #define BRCMF_HDRS_ON() (brcmf_msg_level & BRCMF_HDRS_VAL) |
@@ -69,7 +76,7 @@ do { \ | |||
69 | #define BRCMF_EVENT_ON() (brcmf_msg_level & BRCMF_EVENT_VAL) | 76 | #define BRCMF_EVENT_ON() (brcmf_msg_level & BRCMF_EVENT_VAL) |
70 | #define BRCMF_FIL_ON() (brcmf_msg_level & BRCMF_FIL_VAL) | 77 | #define BRCMF_FIL_ON() (brcmf_msg_level & BRCMF_FIL_VAL) |
71 | 78 | ||
72 | #else /* (defined DEBUG) || (defined DEBUG) */ | 79 | #else /* defined(DEBUG) || defined(CONFIG_BRCM_TRACING) */ |
73 | 80 | ||
74 | #define brcmf_dbg(level, fmt, ...) no_printk(fmt, ##__VA_ARGS__) | 81 | #define brcmf_dbg(level, fmt, ...) no_printk(fmt, ##__VA_ARGS__) |
75 | 82 | ||
@@ -81,7 +88,7 @@ do { \ | |||
81 | #define BRCMF_EVENT_ON() 0 | 88 | #define BRCMF_EVENT_ON() 0 |
82 | #define BRCMF_FIL_ON() 0 | 89 | #define BRCMF_FIL_ON() 0 |
83 | 90 | ||
84 | #endif /* defined(DEBUG) */ | 91 | #endif /* defined(DEBUG) || defined(CONFIG_BRCM_TRACING) */ |
85 | 92 | ||
86 | #define brcmf_dbg_hex_dump(test, data, len, fmt, ...) \ | 93 | #define brcmf_dbg_hex_dump(test, data, len, fmt, ...) \ |
87 | do { \ | 94 | do { \ |
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/tracepoint.c b/drivers/net/wireless/brcm80211/brcmfmac/tracepoint.c new file mode 100644 index 000000000000..b505db48c60d --- /dev/null +++ b/drivers/net/wireless/brcm80211/brcmfmac/tracepoint.c | |||
@@ -0,0 +1,22 @@ | |||
1 | /* | ||
2 | * Copyright (c) 2012 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 | #include <linux/module.h> /* bug in tracepoint.h, it should include this */ | ||
18 | |||
19 | #ifndef __CHECKER__ | ||
20 | #define CREATE_TRACE_POINTS | ||
21 | #include "tracepoint.h" | ||
22 | #endif | ||
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/tracepoint.h b/drivers/net/wireless/brcm80211/brcmfmac/tracepoint.h new file mode 100644 index 000000000000..35efc7a67644 --- /dev/null +++ b/drivers/net/wireless/brcm80211/brcmfmac/tracepoint.h | |||
@@ -0,0 +1,87 @@ | |||
1 | /* | ||
2 | * Copyright (c) 2013 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 | #if !defined(BRCMF_TRACEPOINT_H_) || defined(TRACE_HEADER_MULTI_READ) | ||
17 | #define BRCMF_TRACEPOINT_H_ | ||
18 | |||
19 | #include <linux/types.h> | ||
20 | #include <linux/tracepoint.h> | ||
21 | |||
22 | #ifndef CONFIG_BRCM_TRACING | ||
23 | |||
24 | #undef TRACE_EVENT | ||
25 | #define TRACE_EVENT(name, proto, ...) \ | ||
26 | static inline void trace_ ## name(proto) {} | ||
27 | |||
28 | #undef DECLARE_EVENT_CLASS | ||
29 | #define DECLARE_EVENT_CLASS(...) | ||
30 | |||
31 | #undef DEFINE_EVENT | ||
32 | #define DEFINE_EVENT(evt_class, name, proto, ...) \ | ||
33 | static inline void trace_ ## name(proto) {} | ||
34 | |||
35 | #endif /* CONFIG_BRCM_TRACING */ | ||
36 | |||
37 | #undef TRACE_SYSTEM | ||
38 | #define TRACE_SYSTEM brcmfmac | ||
39 | |||
40 | #define MAX_MSG_LEN 100 | ||
41 | |||
42 | TRACE_EVENT(brcmf_err, | ||
43 | TP_PROTO(const char *func, struct va_format *vaf), | ||
44 | TP_ARGS(func, vaf), | ||
45 | TP_STRUCT__entry( | ||
46 | __string(func, func) | ||
47 | __dynamic_array(char, msg, MAX_MSG_LEN) | ||
48 | ), | ||
49 | TP_fast_assign( | ||
50 | __assign_str(func, func); | ||
51 | WARN_ON_ONCE(vsnprintf(__get_dynamic_array(msg), | ||
52 | MAX_MSG_LEN, vaf->fmt, | ||
53 | *vaf->va) >= MAX_MSG_LEN); | ||
54 | ), | ||
55 | TP_printk("%s: %s", __get_str(func), __get_str(msg)) | ||
56 | ); | ||
57 | |||
58 | TRACE_EVENT(brcmf_dbg, | ||
59 | TP_PROTO(u32 level, const char *func, struct va_format *vaf), | ||
60 | TP_ARGS(level, func, vaf), | ||
61 | TP_STRUCT__entry( | ||
62 | __field(u32, level) | ||
63 | __string(func, func) | ||
64 | __dynamic_array(char, msg, MAX_MSG_LEN) | ||
65 | ), | ||
66 | TP_fast_assign( | ||
67 | __entry->level = level; | ||
68 | __assign_str(func, func); | ||
69 | WARN_ON_ONCE(vsnprintf(__get_dynamic_array(msg), | ||
70 | MAX_MSG_LEN, vaf->fmt, | ||
71 | *vaf->va) >= MAX_MSG_LEN); | ||
72 | ), | ||
73 | TP_printk("%s: %s", __get_str(func), __get_str(msg)) | ||
74 | ); | ||
75 | |||
76 | #ifdef CONFIG_BRCM_TRACING | ||
77 | |||
78 | #undef TRACE_INCLUDE_PATH | ||
79 | #define TRACE_INCLUDE_PATH . | ||
80 | #undef TRACE_INCLUDE_FILE | ||
81 | #define TRACE_INCLUDE_FILE tracepoint | ||
82 | |||
83 | #include <trace/define_trace.h> | ||
84 | |||
85 | #endif /* CONFIG_BRCM_TRACING */ | ||
86 | |||
87 | #endif /* BRCMF_TRACEPOINT_H_ */ | ||