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