Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/ieee1394...
[linux-2.6] / drivers / s390 / net / ctcm_dbug.h
1 /*
2  *      drivers/s390/net/ctcm_dbug.h
3  *
4  *      Copyright IBM Corp. 2001, 2007
5  *      Authors:        Peter Tiedemann (ptiedem@de.ibm.com)
6  *
7  */
8
9 #ifndef _CTCM_DBUG_H_
10 #define _CTCM_DBUG_H_
11
12 /*
13  * Debug Facility stuff
14  */
15
16 #include <asm/debug.h>
17
18 #ifdef DEBUG
19  #define do_debug 1
20 #else
21  #define do_debug 0
22 #endif
23 #ifdef DEBUGDATA
24  #define do_debug_data 1
25 #else
26  #define do_debug_data 0
27 #endif
28 #ifdef DEBUGCCW
29  #define do_debug_ccw 1
30 #else
31  #define do_debug_ccw 0
32 #endif
33
34 /* define dbf debug levels similar to kernel msg levels */
35 #define CTC_DBF_ALWAYS  0       /* always print this                    */
36 #define CTC_DBF_EMERG   0       /* system is unusable                   */
37 #define CTC_DBF_ALERT   1       /* action must be taken immediately     */
38 #define CTC_DBF_CRIT    2       /* critical conditions                  */
39 #define CTC_DBF_ERROR   3       /* error conditions                     */
40 #define CTC_DBF_WARN    4       /* warning conditions                   */
41 #define CTC_DBF_NOTICE  5       /* normal but significant condition     */
42 #define CTC_DBF_INFO    5       /* informational                        */
43 #define CTC_DBF_DEBUG   6       /* debug-level messages                 */
44
45 DECLARE_PER_CPU(char[256], ctcm_dbf_txt_buf);
46
47 enum ctcm_dbf_names {
48         CTCM_DBF_SETUP,
49         CTCM_DBF_ERROR,
50         CTCM_DBF_TRACE,
51         CTCM_DBF_MPC_SETUP,
52         CTCM_DBF_MPC_ERROR,
53         CTCM_DBF_MPC_TRACE,
54         CTCM_DBF_INFOS  /* must be last element */
55 };
56
57 struct ctcm_dbf_info {
58         char name[DEBUG_MAX_NAME_LEN];
59         int pages;
60         int areas;
61         int len;
62         int level;
63         debug_info_t *id;
64 };
65
66 extern struct ctcm_dbf_info ctcm_dbf[CTCM_DBF_INFOS];
67
68 int ctcm_register_dbf_views(void);
69 void ctcm_unregister_dbf_views(void);
70
71 static inline const char *strtail(const char *s, int n)
72 {
73         int l = strlen(s);
74         return (l > n) ? s + (l - n) : s;
75 }
76
77 /* sort out levels early to avoid unnecessary sprintfs */
78 static inline int ctcm_dbf_passes(debug_info_t *dbf_grp, int level)
79 {
80         return (dbf_grp->level >= level);
81 }
82
83 #define CTCM_FUNTAIL strtail((char *)__func__, 16)
84
85 #define CTCM_DBF_TEXT(name, level, text) \
86         do { \
87                 debug_text_event(ctcm_dbf[CTCM_DBF_##name].id, level, text); \
88         } while (0)
89
90 #define CTCM_DBF_HEX(name, level, addr, len) \
91         do { \
92                 debug_event(ctcm_dbf[CTCM_DBF_##name].id, \
93                                         level, (void *)(addr), len); \
94         } while (0)
95
96 #define CTCM_DBF_TEXT_(name, level, text...) \
97         do { \
98                 if (ctcm_dbf_passes(ctcm_dbf[CTCM_DBF_##name].id, level)) { \
99                         char *ctcm_dbf_txt_buf = \
100                                          get_cpu_var(ctcm_dbf_txt_buf); \
101                         sprintf(ctcm_dbf_txt_buf, text); \
102                         debug_text_event(ctcm_dbf[CTCM_DBF_##name].id, \
103                                         level, ctcm_dbf_txt_buf); \
104                         put_cpu_var(ctcm_dbf_txt_buf); \
105                 } \
106         } while (0)
107
108 /*
109  * cat : one of {setup, mpc_setup, trace, mpc_trace, error, mpc_error}.
110  * dev : netdevice with valid name field.
111  * text: any text string.
112  */
113 #define CTCM_DBF_DEV_NAME(cat, dev, text) \
114         do { \
115                 CTCM_DBF_TEXT_(cat, CTC_DBF_INFO, "%s(%s) : %s", \
116                         CTCM_FUNTAIL, dev->name, text); \
117         } while (0)
118
119 #define MPC_DBF_DEV_NAME(cat, dev, text) \
120         do { \
121                 CTCM_DBF_TEXT_(MPC_##cat, CTC_DBF_INFO, "%s(%s) : %s", \
122                         CTCM_FUNTAIL, dev->name, text); \
123         } while (0)
124
125 #define CTCMY_DBF_DEV_NAME(cat, dev, text) \
126         do { \
127                 if (IS_MPCDEV(dev)) \
128                         MPC_DBF_DEV_NAME(cat, dev, text); \
129                 else \
130                         CTCM_DBF_DEV_NAME(cat, dev, text); \
131         } while (0)
132
133 /*
134  * cat : one of {setup, mpc_setup, trace, mpc_trace, error, mpc_error}.
135  * dev : netdevice.
136  * text: any text string.
137  */
138 #define CTCM_DBF_DEV(cat, dev, text) \
139         do { \
140                 CTCM_DBF_TEXT_(cat, CTC_DBF_INFO, "%s(%p) : %s", \
141                         CTCM_FUNTAIL, dev, text); \
142         } while (0)
143
144 #define MPC_DBF_DEV(cat, dev, text) \
145         do { \
146                 CTCM_DBF_TEXT_(MPC_##cat, CTC_DBF_INFO, "%s(%p) : %s", \
147                         CTCM_FUNTAIL, dev, text); \
148         } while (0)
149
150 #define CTCMY_DBF_DEV(cat, dev, text) \
151         do { \
152                 if (IS_MPCDEV(dev)) \
153                         MPC_DBF_DEV(cat, dev, text); \
154                 else \
155                         CTCM_DBF_DEV(cat, dev, text); \
156         } while (0)
157
158 #endif