| /* | |
| * 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__ */ |