1/* 2 * Intel Wireless Multicomm 3200 WiFi driver 3 * 4 * Copyright (C) 2009 Intel Corporation <ilw@linux.intel.com> 5 * Samuel Ortiz <samuel.ortiz@intel.com> 6 * Zhu Yi <yi.zhu@intel.com> 7 * 8 * This program is free software; you can redistribute it and/or 9 * modify it under the terms of the GNU General Public License version 10 * 2 as published by the Free Software Foundation. 11 * 12 * This program is distributed in the hope that it will be useful, 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 * GNU General Public License for more details. 16 * 17 * You should have received a copy of the GNU General Public License 18 * along with this program; if not, write to the Free Software 19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 20 * 02110-1301, USA. 21 * 22 */ 23 24#ifndef __IWM_DEBUG_H__ 25#define __IWM_DEBUG_H__ 26 27#define IWM_ERR(p, f, a...) dev_err(iwm_to_dev(p), f, ## a) 28#define IWM_WARN(p, f, a...) dev_warn(iwm_to_dev(p), f, ## a) 29#define IWM_INFO(p, f, a...) dev_info(iwm_to_dev(p), f, ## a) 30#define IWM_CRIT(p, f, a...) dev_crit(iwm_to_dev(p), f, ## a) 31 32#ifdef CONFIG_IWM_DEBUG 33 34#define IWM_DEBUG_MODULE(i, level, module, f, a...) \ 35do { \ 36 if (unlikely(i->dbg.dbg_module[IWM_DM_##module] >= (IWM_DL_##level)))\ 37 dev_printk(KERN_INFO, (iwm_to_dev(i)), \ 38 "%s " f, __func__ , ## a); \ 39} while (0) 40 41#define IWM_HEXDUMP(i, level, module, pref, buf, len) \ 42do { \ 43 if (unlikely(i->dbg.dbg_module[IWM_DM_##module] >= (IWM_DL_##level)))\ 44 print_hex_dump(KERN_INFO, pref, DUMP_PREFIX_OFFSET, \ 45 16, 1, buf, len, 1); \ 46} while (0) 47 48#else 49 50#define IWM_DEBUG_MODULE(i, level, module, f, a...) 51#define IWM_HEXDUMP(i, level, module, pref, buf, len) 52 53#endif /* CONFIG_IWM_DEBUG */ 54 55/* Debug modules */ 56enum iwm_debug_module_id { 57 IWM_DM_BOOT = 0, 58 IWM_DM_FW, 59 IWM_DM_SDIO, 60 IWM_DM_NTF, 61 IWM_DM_RX, 62 IWM_DM_TX, 63 IWM_DM_MLME, 64 IWM_DM_CMD, 65 IWM_DM_WEXT, 66 __IWM_DM_NR, 67}; 68#define IWM_DM_DEFAULT 0 69 70#define IWM_DBG_BOOT(i, l, f, a...) IWM_DEBUG_MODULE(i, l, BOOT, f, ## a) 71#define IWM_DBG_FW(i, l, f, a...) IWM_DEBUG_MODULE(i, l, FW, f, ## a) 72#define IWM_DBG_SDIO(i, l, f, a...) IWM_DEBUG_MODULE(i, l, SDIO, f, ## a) 73#define IWM_DBG_NTF(i, l, f, a...) IWM_DEBUG_MODULE(i, l, NTF, f, ## a) 74#define IWM_DBG_RX(i, l, f, a...) IWM_DEBUG_MODULE(i, l, RX, f, ## a) 75#define IWM_DBG_TX(i, l, f, a...) IWM_DEBUG_MODULE(i, l, TX, f, ## a) 76#define IWM_DBG_MLME(i, l, f, a...) IWM_DEBUG_MODULE(i, l, MLME, f, ## a) 77#define IWM_DBG_CMD(i, l, f, a...) IWM_DEBUG_MODULE(i, l, CMD, f, ## a) 78#define IWM_DBG_WEXT(i, l, f, a...) IWM_DEBUG_MODULE(i, l, WEXT, f, ## a) 79 80/* Debug levels */ 81enum iwm_debug_level { 82 IWM_DL_NONE = 0, 83 IWM_DL_ERR, 84 IWM_DL_WARN, 85 IWM_DL_INFO, 86 IWM_DL_DBG, 87}; 88#define IWM_DL_DEFAULT IWM_DL_ERR 89 90struct iwm_debugfs { 91 struct iwm_priv *iwm; 92 struct dentry *rootdir; 93 struct dentry *devdir; 94 struct dentry *dbgdir; 95 struct dentry *txdir; 96 struct dentry *rxdir; 97 struct dentry *busdir; 98 99 u32 dbg_level; 100 struct dentry *dbg_level_dentry; 101 102 unsigned long dbg_modules; 103 struct dentry *dbg_modules_dentry; 104 105 u8 dbg_module[__IWM_DM_NR]; 106 struct dentry *dbg_module_dentries[__IWM_DM_NR]; 107 108 struct dentry *txq_dentry; 109 struct dentry *tx_credit_dentry; 110 struct dentry *rx_ticket_dentry; 111 112 struct dentry *fw_err_dentry; 113}; 114 115#ifdef CONFIG_IWM_DEBUG 116void iwm_debugfs_init(struct iwm_priv *iwm); 117void iwm_debugfs_exit(struct iwm_priv *iwm); 118#else 119static inline void iwm_debugfs_init(struct iwm_priv *iwm) {} 120static inline void iwm_debugfs_exit(struct iwm_priv *iwm) {} 121#endif 122 123#endif 124