172 строки
4.7 KiB
C
172 строки
4.7 KiB
C
/*
|
|
* iwmc3200top - Intel Wireless MultiCom 3200 Top Driver
|
|
* drivers/misc/iwmc3200top/log.h
|
|
*
|
|
* Copyright (C) 2009 Intel Corporation. All rights reserved.
|
|
*
|
|
* This program is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU General Public License version
|
|
* 2 as published by the Free Software Foundation.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, write to the Free Software
|
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
|
|
* 02110-1301, USA.
|
|
*
|
|
*
|
|
* Author Name: Maxim Grabarnik <maxim.grabarnink@intel.com>
|
|
* -
|
|
*
|
|
*/
|
|
|
|
#ifndef __LOG_H__
|
|
#define __LOG_H__
|
|
|
|
|
|
/* log severity:
|
|
* The log levels here match FW log levels
|
|
* so values need to stay as is */
|
|
#define LOG_SEV_CRITICAL 0
|
|
#define LOG_SEV_ERROR 1
|
|
#define LOG_SEV_WARNING 2
|
|
#define LOG_SEV_INFO 3
|
|
#define LOG_SEV_INFOEX 4
|
|
|
|
/* Log levels not defined for FW */
|
|
#define LOG_SEV_TRACE 5
|
|
#define LOG_SEV_DUMP 6
|
|
|
|
#define LOG_SEV_FW_FILTER_ALL \
|
|
(BIT(LOG_SEV_CRITICAL) | \
|
|
BIT(LOG_SEV_ERROR) | \
|
|
BIT(LOG_SEV_WARNING) | \
|
|
BIT(LOG_SEV_INFO) | \
|
|
BIT(LOG_SEV_INFOEX))
|
|
|
|
#define LOG_SEV_FILTER_ALL \
|
|
(BIT(LOG_SEV_CRITICAL) | \
|
|
BIT(LOG_SEV_ERROR) | \
|
|
BIT(LOG_SEV_WARNING) | \
|
|
BIT(LOG_SEV_INFO) | \
|
|
BIT(LOG_SEV_INFOEX) | \
|
|
BIT(LOG_SEV_TRACE) | \
|
|
BIT(LOG_SEV_DUMP))
|
|
|
|
/* log source */
|
|
#define LOG_SRC_INIT 0
|
|
#define LOG_SRC_DEBUGFS 1
|
|
#define LOG_SRC_FW_DOWNLOAD 2
|
|
#define LOG_SRC_FW_MSG 3
|
|
#define LOG_SRC_TST 4
|
|
#define LOG_SRC_IRQ 5
|
|
|
|
#define LOG_SRC_MAX 6
|
|
#define LOG_SRC_ALL 0xFF
|
|
|
|
/**
|
|
* Default intitialization runtime log level
|
|
*/
|
|
#ifndef LOG_SEV_FILTER_RUNTIME
|
|
#define LOG_SEV_FILTER_RUNTIME \
|
|
(BIT(LOG_SEV_CRITICAL) | \
|
|
BIT(LOG_SEV_ERROR) | \
|
|
BIT(LOG_SEV_WARNING))
|
|
#endif
|
|
|
|
#ifndef FW_LOG_SEV_FILTER_RUNTIME
|
|
#define FW_LOG_SEV_FILTER_RUNTIME LOG_SEV_FILTER_ALL
|
|
#endif
|
|
|
|
#ifdef CONFIG_IWMC3200TOP_DEBUG
|
|
/**
|
|
* Log macros
|
|
*/
|
|
|
|
#define priv2dev(priv) (&(priv->func)->dev)
|
|
|
|
#define LOG_CRITICAL(priv, src, fmt, args...) \
|
|
do { \
|
|
if (iwmct_logdefs[LOG_SRC_ ## src] & BIT(LOG_SEV_CRITICAL)) \
|
|
dev_crit(priv2dev(priv), "%s %d: " fmt, \
|
|
__func__, __LINE__, ##args); \
|
|
} while (0)
|
|
|
|
#define LOG_ERROR(priv, src, fmt, args...) \
|
|
do { \
|
|
if (iwmct_logdefs[LOG_SRC_ ## src] & BIT(LOG_SEV_ERROR)) \
|
|
dev_err(priv2dev(priv), "%s %d: " fmt, \
|
|
__func__, __LINE__, ##args); \
|
|
} while (0)
|
|
|
|
#define LOG_WARNING(priv, src, fmt, args...) \
|
|
do { \
|
|
if (iwmct_logdefs[LOG_SRC_ ## src] & BIT(LOG_SEV_WARNING)) \
|
|
dev_warn(priv2dev(priv), "%s %d: " fmt, \
|
|
__func__, __LINE__, ##args); \
|
|
} while (0)
|
|
|
|
#define LOG_INFO(priv, src, fmt, args...) \
|
|
do { \
|
|
if (iwmct_logdefs[LOG_SRC_ ## src] & BIT(LOG_SEV_INFO)) \
|
|
dev_info(priv2dev(priv), "%s %d: " fmt, \
|
|
__func__, __LINE__, ##args); \
|
|
} while (0)
|
|
|
|
#define LOG_TRACE(priv, src, fmt, args...) \
|
|
do { \
|
|
if (iwmct_logdefs[LOG_SRC_ ## src] & BIT(LOG_SEV_TRACE)) \
|
|
dev_dbg(priv2dev(priv), "%s %d: " fmt, \
|
|
__func__, __LINE__, ##args); \
|
|
} while (0)
|
|
|
|
#define LOG_HEXDUMP(src, ptr, len) \
|
|
do { \
|
|
if (iwmct_logdefs[LOG_SRC_ ## src] & BIT(LOG_SEV_DUMP)) \
|
|
print_hex_dump(KERN_DEBUG, "", DUMP_PREFIX_NONE, \
|
|
16, 1, ptr, len, false); \
|
|
} while (0)
|
|
|
|
void iwmct_log_top_message(struct iwmct_priv *priv, u8 *buf, int len);
|
|
|
|
extern u8 iwmct_logdefs[];
|
|
|
|
int iwmct_log_set_filter(u8 src, u8 logmask);
|
|
int iwmct_log_set_fw_filter(u8 src, u8 logmask);
|
|
|
|
ssize_t show_iwmct_log_level(struct device *d,
|
|
struct device_attribute *attr, char *buf);
|
|
ssize_t store_iwmct_log_level(struct device *d,
|
|
struct device_attribute *attr,
|
|
const char *buf, size_t count);
|
|
ssize_t show_iwmct_log_level_fw(struct device *d,
|
|
struct device_attribute *attr, char *buf);
|
|
ssize_t store_iwmct_log_level_fw(struct device *d,
|
|
struct device_attribute *attr,
|
|
const char *buf, size_t count);
|
|
|
|
#else
|
|
|
|
#define LOG_CRITICAL(priv, src, fmt, args...)
|
|
#define LOG_ERROR(priv, src, fmt, args...)
|
|
#define LOG_WARNING(priv, src, fmt, args...)
|
|
#define LOG_INFO(priv, src, fmt, args...)
|
|
#define LOG_TRACE(priv, src, fmt, args...)
|
|
#define LOG_HEXDUMP(src, ptr, len)
|
|
|
|
static inline void iwmct_log_top_message(struct iwmct_priv *priv,
|
|
u8 *buf, int len) {}
|
|
static inline int iwmct_log_set_filter(u8 src, u8 logmask) { return 0; }
|
|
static inline int iwmct_log_set_fw_filter(u8 src, u8 logmask) { return 0; }
|
|
|
|
#endif /* CONFIG_IWMC3200TOP_DEBUG */
|
|
|
|
int log_get_filter_str(char *buf, int size);
|
|
int log_get_fw_filter_str(char *buf, int size);
|
|
|
|
#endif /* __LOG_H__ */
|