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