i8k: Avoid lahf in 64-bit code
[linux-2.6.git] / drivers / misc / iwmc3200top / log.h
1 /*
2  * iwmc3200top - Intel Wireless MultiCom 3200 Top Driver
3  * drivers/misc/iwmc3200top/log.h
4  *
5  * Copyright (C) 2009 Intel Corporation. All rights reserved.
6  *
7  * This program is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU General Public License version
9  * 2 as published by the Free Software Foundation.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
19  * 02110-1301, USA.
20  *
21  *
22  * Author Name: Maxim Grabarnik <maxim.grabarnink@intel.com>
23  *  -
24  *
25  */
26
27 #ifndef __LOG_H__
28 #define __LOG_H__
29
30
31 /* log severity:
32  * The log levels here match FW log levels
33  * so values need to stay as is */
34 #define LOG_SEV_CRITICAL                0
35 #define LOG_SEV_ERROR                   1
36 #define LOG_SEV_WARNING                 2
37 #define LOG_SEV_INFO                    3
38 #define LOG_SEV_INFOEX                  4
39
40 /* Log levels not defined for FW */
41 #define LOG_SEV_TRACE                   5
42 #define LOG_SEV_DUMP                    6
43
44 #define LOG_SEV_FW_FILTER_ALL           \
45         (BIT(LOG_SEV_CRITICAL)  |       \
46          BIT(LOG_SEV_ERROR)     |       \
47          BIT(LOG_SEV_WARNING)   |       \
48          BIT(LOG_SEV_INFO)      |       \
49          BIT(LOG_SEV_INFOEX))
50
51 #define LOG_SEV_FILTER_ALL              \
52         (BIT(LOG_SEV_CRITICAL)  |       \
53          BIT(LOG_SEV_ERROR)     |       \
54          BIT(LOG_SEV_WARNING)   |       \
55          BIT(LOG_SEV_INFO)      |       \
56          BIT(LOG_SEV_INFOEX)    |       \
57          BIT(LOG_SEV_TRACE)     |       \
58          BIT(LOG_SEV_DUMP))
59
60 /* log source */
61 #define LOG_SRC_INIT                    0
62 #define LOG_SRC_DEBUGFS                 1
63 #define LOG_SRC_FW_DOWNLOAD             2
64 #define LOG_SRC_FW_MSG                  3
65 #define LOG_SRC_TST                     4
66 #define LOG_SRC_IRQ                     5
67
68 #define LOG_SRC_MAX                     6
69 #define LOG_SRC_ALL                     0xFF
70
71 /**
72  * Default intitialization runtime log level
73  */
74 #ifndef LOG_SEV_FILTER_RUNTIME
75 #define LOG_SEV_FILTER_RUNTIME                  \
76         (BIT(LOG_SEV_CRITICAL)  |               \
77          BIT(LOG_SEV_ERROR)     |               \
78          BIT(LOG_SEV_WARNING))
79 #endif
80
81 #ifndef FW_LOG_SEV_FILTER_RUNTIME
82 #define FW_LOG_SEV_FILTER_RUNTIME       LOG_SEV_FILTER_ALL
83 #endif
84
85 #ifdef CONFIG_IWMC3200TOP_DEBUG
86 /**
87  * Log macros
88  */
89
90 #define priv2dev(priv) (&(priv->func)->dev)
91
92 #define LOG_CRITICAL(priv, src, fmt, args...)                           \
93 do {                                                                    \
94         if (iwmct_logdefs[LOG_SRC_ ## src] & BIT(LOG_SEV_CRITICAL))     \
95                 dev_crit(priv2dev(priv), "%s %d: " fmt,                 \
96                         __func__, __LINE__, ##args);                    \
97 } while (0)
98
99 #define LOG_ERROR(priv, src, fmt, args...)                              \
100 do {                                                                    \
101         if (iwmct_logdefs[LOG_SRC_ ## src] & BIT(LOG_SEV_ERROR))        \
102                 dev_err(priv2dev(priv), "%s %d: " fmt,                  \
103                         __func__, __LINE__, ##args);                    \
104 } while (0)
105
106 #define LOG_WARNING(priv, src, fmt, args...)                            \
107 do {                                                                    \
108         if (iwmct_logdefs[LOG_SRC_ ## src] & BIT(LOG_SEV_WARNING))      \
109                 dev_warn(priv2dev(priv), "%s %d: " fmt,                 \
110                          __func__, __LINE__, ##args);                   \
111 } while (0)
112
113 #define LOG_INFO(priv, src, fmt, args...)                               \
114 do {                                                                    \
115         if (iwmct_logdefs[LOG_SRC_ ## src] & BIT(LOG_SEV_INFO))         \
116                 dev_info(priv2dev(priv), "%s %d: " fmt,                 \
117                          __func__, __LINE__, ##args);                   \
118 } while (0)
119
120 #define LOG_TRACE(priv, src, fmt, args...)                              \
121 do {                                                                    \
122         if (iwmct_logdefs[LOG_SRC_ ## src] & BIT(LOG_SEV_TRACE))        \
123                 dev_dbg(priv2dev(priv), "%s %d: " fmt,                  \
124                          __func__, __LINE__, ##args);                   \
125 } while (0)
126
127 #define LOG_HEXDUMP(src, ptr, len)                                      \
128 do {                                                                    \
129         if (iwmct_logdefs[LOG_SRC_ ## src] & BIT(LOG_SEV_DUMP)) \
130                 print_hex_dump(KERN_DEBUG, "", DUMP_PREFIX_NONE,        \
131                                 16, 1, ptr, len, false);                \
132 } while (0)
133
134 void iwmct_log_top_message(struct iwmct_priv *priv, u8 *buf, int len);
135
136 extern u8 iwmct_logdefs[];
137
138 int iwmct_log_set_filter(u8 src, u8 logmask);
139 int iwmct_log_set_fw_filter(u8 src, u8 logmask);
140
141 ssize_t show_iwmct_log_level(struct device *d,
142                         struct device_attribute *attr, char *buf);
143 ssize_t store_iwmct_log_level(struct device *d,
144                         struct device_attribute *attr,
145                         const char *buf, size_t count);
146 ssize_t show_iwmct_log_level_fw(struct device *d,
147                         struct device_attribute *attr, char *buf);
148 ssize_t store_iwmct_log_level_fw(struct device *d,
149                         struct device_attribute *attr,
150                         const char *buf, size_t count);
151
152 #else
153
154 #define LOG_CRITICAL(priv, src, fmt, args...)
155 #define LOG_ERROR(priv, src, fmt, args...)
156 #define LOG_WARNING(priv, src, fmt, args...)
157 #define LOG_INFO(priv, src, fmt, args...)
158 #define LOG_TRACE(priv, src, fmt, args...)
159 #define LOG_HEXDUMP(src, ptr, len)
160
161 static inline void iwmct_log_top_message(struct iwmct_priv *priv,
162                                          u8 *buf, int len) {}
163 static inline int iwmct_log_set_filter(u8 src, u8 logmask) { return 0; }
164 static inline int iwmct_log_set_fw_filter(u8 src, u8 logmask) { return 0; }
165
166 #endif /* CONFIG_IWMC3200TOP_DEBUG */
167
168 int log_get_filter_str(char *buf, int size);
169 int log_get_fw_filter_str(char *buf, int size);
170
171 #endif /* __LOG_H__ */