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 DEBUGCCW
24  #define do_debug_ccw 1
25  #define DEBUGDATA 1
26 #else
27  #define do_debug_ccw 0
28 #endif
29 #ifdef DEBUGDATA
30  #define do_debug_data 1
31 #else
32  #define do_debug_data 0
33 #endif
34 
35 /* define dbf debug levels similar to kernel msg levels */
36 #define	CTC_DBF_ALWAYS	0	/* always print this 			*/
37 #define	CTC_DBF_EMERG	0	/* system is unusable			*/
38 #define	CTC_DBF_ALERT	1	/* action must be taken immediately	*/
39 #define	CTC_DBF_CRIT	2	/* critical conditions			*/
40 #define	CTC_DBF_ERROR	3	/* error conditions			*/
41 #define	CTC_DBF_WARN	4	/* warning conditions			*/
42 #define	CTC_DBF_NOTICE	5	/* normal but significant condition	*/
43 #define	CTC_DBF_INFO	5	/* informational			*/
44 #define	CTC_DBF_DEBUG	6	/* debug-level messages			*/
45 
46 enum ctcm_dbf_names {
47 	CTCM_DBF_SETUP,
48 	CTCM_DBF_ERROR,
49 	CTCM_DBF_TRACE,
50 	CTCM_DBF_MPC_SETUP,
51 	CTCM_DBF_MPC_ERROR,
52 	CTCM_DBF_MPC_TRACE,
53 	CTCM_DBF_INFOS	/* must be last element */
54 };
55 
56 struct ctcm_dbf_info {
57 	char name[DEBUG_MAX_NAME_LEN];
58 	int pages;
59 	int areas;
60 	int len;
61 	int level;
62 	debug_info_t *id;
63 };
64 
65 extern struct ctcm_dbf_info ctcm_dbf[CTCM_DBF_INFOS];
66 
67 int ctcm_register_dbf_views(void);
68 void ctcm_unregister_dbf_views(void);
69 void ctcm_dbf_longtext(enum ctcm_dbf_names dbf_nix, int level, char *text, ...);
70 
strtail(const char * s,int n)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 #define CTCM_FUNTAIL strtail((char *)__func__, 16)
78 
79 #define CTCM_DBF_TEXT(name, level, text) \
80 	do { \
81 		debug_text_event(ctcm_dbf[CTCM_DBF_##name].id, level, text); \
82 	} while (0)
83 
84 #define CTCM_DBF_HEX(name, level, addr, len) \
85 	do { \
86 		debug_event(ctcm_dbf[CTCM_DBF_##name].id, \
87 					level, (void *)(addr), len); \
88 	} while (0)
89 
90 #define CTCM_DBF_TEXT_(name, level, text...) \
91 	ctcm_dbf_longtext(CTCM_DBF_##name, level, text)
92 
93 /*
94  * cat : one of {setup, mpc_setup, trace, mpc_trace, error, mpc_error}.
95  * dev : netdevice with valid name field.
96  * text: any text string.
97  */
98 #define CTCM_DBF_DEV_NAME(cat, dev, text) \
99 	do { \
100 		CTCM_DBF_TEXT_(cat, CTC_DBF_INFO, "%s(%s) :- %s", \
101 			CTCM_FUNTAIL, dev->name, text); \
102 	} while (0)
103 
104 #define MPC_DBF_DEV_NAME(cat, dev, text) \
105 	do { \
106 		CTCM_DBF_TEXT_(MPC_##cat, CTC_DBF_INFO, "%s(%s) := %s", \
107 			CTCM_FUNTAIL, dev->name, text); \
108 	} while (0)
109 
110 #define CTCMY_DBF_DEV_NAME(cat, dev, text) \
111 	do { \
112 		if (IS_MPCDEV(dev)) \
113 			MPC_DBF_DEV_NAME(cat, dev, text); \
114 		else \
115 			CTCM_DBF_DEV_NAME(cat, dev, text); \
116 	} while (0)
117 
118 /*
119  * cat : one of {setup, mpc_setup, trace, mpc_trace, error, mpc_error}.
120  * dev : netdevice.
121  * text: any text string.
122  */
123 #define CTCM_DBF_DEV(cat, dev, text) \
124 	do { \
125 		CTCM_DBF_TEXT_(cat, CTC_DBF_INFO, "%s(%p) :-: %s", \
126 			CTCM_FUNTAIL, dev, text); \
127 	} while (0)
128 
129 #define MPC_DBF_DEV(cat, dev, text) \
130 	do { \
131 		CTCM_DBF_TEXT_(MPC_##cat, CTC_DBF_INFO, "%s(%p) :=: %s", \
132 			CTCM_FUNTAIL, dev, text); \
133 	} while (0)
134 
135 #define CTCMY_DBF_DEV(cat, dev, text) \
136 	do { \
137 		if (IS_MPCDEV(dev)) \
138 			MPC_DBF_DEV(cat, dev, text); \
139 		else \
140 			CTCM_DBF_DEV(cat, dev, text); \
141 	} while (0)
142 
143 #endif
144