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