iwl-debugfs.c revision 95b1a8224abf6230899856753c5506a3f737a65b
1712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler/****************************************************************************** 2712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler * 3712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler * GPL LICENSE SUMMARY 4712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler * 5712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler * Copyright(c) 2008 Intel Corporation. All rights reserved. 6712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler * 7712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler * This program is free software; you can redistribute it and/or modify 8712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler * it under the terms of version 2 of the GNU General Public License as 9712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler * published by the Free Software Foundation. 10712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler * 11712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler * This program is distributed in the hope that it will be useful, but 12712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler * WITHOUT ANY WARRANTY; without even the implied warranty of 13712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler * General Public License for more details. 15712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler * 16712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler * You should have received a copy of the GNU General Public License 17712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler * along with this program; if not, write to the Free Software 18712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110, 19712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler * USA 20712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler * 21712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler * The full GNU General Public License is included in this distribution 22712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler * in the file called LICENSE.GPL. 23712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler * 24712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler * Contact Information: 25712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler * Tomas Winkler <tomas.winkler@intel.com> 26712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 27712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler *****************************************************************************/ 28712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 29712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler#include <linux/kernel.h> 30712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler#include <linux/module.h> 31712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler#include <linux/debugfs.h> 32712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 33712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler#include <linux/ieee80211.h> 34712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler#include <net/mac80211.h> 35712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 36712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 373e0d4cb12f6fd97193a455b49125398b2231c87cTomas Winkler#include "iwl-dev.h" 38712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler#include "iwl-debug.h" 39fee1247a30e5b3d48fe985b4a935eb6818f3b464Tomas Winkler#include "iwl-core.h" 403395f6e9cf48469d7ee05703cad1502002741c16Tomas Winkler#include "iwl-io.h" 41712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 42712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 43712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler/* create and remove of files */ 44712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler#define DEBUGFS_ADD_DIR(name, parent) do { \ 45712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler dbgfs->dir_##name = debugfs_create_dir(#name, parent); \ 46712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler if (!(dbgfs->dir_##name)) \ 47712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler goto err; \ 48712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler} while (0) 49712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 50712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler#define DEBUGFS_ADD_FILE(name, parent) do { \ 51712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler dbgfs->dbgfs_##parent##_files.file_##name = \ 52712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler debugfs_create_file(#name, 0644, dbgfs->dir_##parent, priv, \ 53712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler &iwl_dbgfs_##name##_ops); \ 54712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler if (!(dbgfs->dbgfs_##parent##_files.file_##name)) \ 55712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler goto err; \ 56712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler} while (0) 57712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 58445c2dff409ef9de5d2f964d20917ab238fd266fTomas Winkler#define DEBUGFS_ADD_BOOL(name, parent, ptr) do { \ 59445c2dff409ef9de5d2f964d20917ab238fd266fTomas Winkler dbgfs->dbgfs_##parent##_files.file_##name = \ 60445c2dff409ef9de5d2f964d20917ab238fd266fTomas Winkler debugfs_create_bool(#name, 0644, dbgfs->dir_##parent, ptr); \ 61445c2dff409ef9de5d2f964d20917ab238fd266fTomas Winkler if (IS_ERR(dbgfs->dbgfs_##parent##_files.file_##name)) \ 62445c2dff409ef9de5d2f964d20917ab238fd266fTomas Winkler goto err; \ 63445c2dff409ef9de5d2f964d20917ab238fd266fTomas Winkler} while (0) 64445c2dff409ef9de5d2f964d20917ab238fd266fTomas Winkler 65712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler#define DEBUGFS_REMOVE(name) do { \ 66712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler debugfs_remove(name); \ 67712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler name = NULL; \ 68712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler} while (0); 69712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 70712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler/* file operation */ 71712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler#define DEBUGFS_READ_FUNC(name) \ 72712b6cf57a53da608a682b5f782c5785bda76001Tomas Winklerstatic ssize_t iwl_dbgfs_##name##_read(struct file *file, \ 73712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler char __user *user_buf, \ 74712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler size_t count, loff_t *ppos); 75712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 76712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler#define DEBUGFS_WRITE_FUNC(name) \ 77712b6cf57a53da608a682b5f782c5785bda76001Tomas Winklerstatic ssize_t iwl_dbgfs_##name##_write(struct file *file, \ 78712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler const char __user *user_buf, \ 79712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler size_t count, loff_t *ppos); 80712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 81712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 82712b6cf57a53da608a682b5f782c5785bda76001Tomas Winklerstatic int iwl_dbgfs_open_file_generic(struct inode *inode, struct file *file) 83712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler{ 84712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler file->private_data = inode->i_private; 85712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler return 0; 86712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler} 87712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 88712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler#define DEBUGFS_READ_FILE_OPS(name) \ 89712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler DEBUGFS_READ_FUNC(name); \ 90712b6cf57a53da608a682b5f782c5785bda76001Tomas Winklerstatic const struct file_operations iwl_dbgfs_##name##_ops = { \ 91712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler .read = iwl_dbgfs_##name##_read, \ 92712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler .open = iwl_dbgfs_open_file_generic, \ 93712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler}; 94712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 95189a2b5942d62bd18e1e01772c4c784253f5dd16Ester Kummer#define DEBUGFS_WRITE_FILE_OPS(name) \ 96189a2b5942d62bd18e1e01772c4c784253f5dd16Ester Kummer DEBUGFS_WRITE_FUNC(name); \ 97189a2b5942d62bd18e1e01772c4c784253f5dd16Ester Kummerstatic const struct file_operations iwl_dbgfs_##name##_ops = { \ 98189a2b5942d62bd18e1e01772c4c784253f5dd16Ester Kummer .write = iwl_dbgfs_##name##_write, \ 99189a2b5942d62bd18e1e01772c4c784253f5dd16Ester Kummer .open = iwl_dbgfs_open_file_generic, \ 100189a2b5942d62bd18e1e01772c4c784253f5dd16Ester Kummer}; 101189a2b5942d62bd18e1e01772c4c784253f5dd16Ester Kummer 102189a2b5942d62bd18e1e01772c4c784253f5dd16Ester Kummer 103712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler#define DEBUGFS_READ_WRITE_FILE_OPS(name) \ 104712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler DEBUGFS_READ_FUNC(name); \ 105712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler DEBUGFS_WRITE_FUNC(name); \ 106712b6cf57a53da608a682b5f782c5785bda76001Tomas Winklerstatic const struct file_operations iwl_dbgfs_##name##_ops = { \ 107712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler .write = iwl_dbgfs_##name##_write, \ 108712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler .read = iwl_dbgfs_##name##_read, \ 109712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler .open = iwl_dbgfs_open_file_generic, \ 110712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler}; 111712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 112712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 113712b6cf57a53da608a682b5f782c5785bda76001Tomas Winklerstatic ssize_t iwl_dbgfs_tx_statistics_read(struct file *file, 114712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler char __user *user_buf, 115712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler size_t count, loff_t *ppos) { 116712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 117712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler struct iwl_priv *priv = (struct iwl_priv *)file->private_data; 118712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler char buf[256]; 119712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler int pos = 0; 120db0589f3b9443f2b57ea6daaec09c1ab0ac99cb0Abhijeet Kolekar const size_t bufsz = sizeof(buf); 121712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 122db0589f3b9443f2b57ea6daaec09c1ab0ac99cb0Abhijeet Kolekar pos += scnprintf(buf + pos, bufsz - pos, "mgmt: %u\n", 123db0589f3b9443f2b57ea6daaec09c1ab0ac99cb0Abhijeet Kolekar priv->tx_stats[0].cnt); 124db0589f3b9443f2b57ea6daaec09c1ab0ac99cb0Abhijeet Kolekar pos += scnprintf(buf + pos, bufsz - pos, "ctrl: %u\n", 125db0589f3b9443f2b57ea6daaec09c1ab0ac99cb0Abhijeet Kolekar priv->tx_stats[1].cnt); 126db0589f3b9443f2b57ea6daaec09c1ab0ac99cb0Abhijeet Kolekar pos += scnprintf(buf + pos, bufsz - pos, "data: %u\n", 127db0589f3b9443f2b57ea6daaec09c1ab0ac99cb0Abhijeet Kolekar priv->tx_stats[2].cnt); 128712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 129712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler return simple_read_from_buffer(user_buf, count, ppos, buf, pos); 130712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler} 131712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 132712b6cf57a53da608a682b5f782c5785bda76001Tomas Winklerstatic ssize_t iwl_dbgfs_rx_statistics_read(struct file *file, 133712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler char __user *user_buf, 134712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler size_t count, loff_t *ppos) { 135712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 136712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler struct iwl_priv *priv = (struct iwl_priv *)file->private_data; 137712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler char buf[256]; 138712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler int pos = 0; 139db0589f3b9443f2b57ea6daaec09c1ab0ac99cb0Abhijeet Kolekar const size_t bufsz = sizeof(buf); 140712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 141db0589f3b9443f2b57ea6daaec09c1ab0ac99cb0Abhijeet Kolekar pos += scnprintf(buf + pos, bufsz - pos, "mgmt: %u\n", 142db0589f3b9443f2b57ea6daaec09c1ab0ac99cb0Abhijeet Kolekar priv->rx_stats[0].cnt); 143db0589f3b9443f2b57ea6daaec09c1ab0ac99cb0Abhijeet Kolekar pos += scnprintf(buf + pos, bufsz - pos, "ctrl: %u\n", 144db0589f3b9443f2b57ea6daaec09c1ab0ac99cb0Abhijeet Kolekar priv->rx_stats[1].cnt); 145db0589f3b9443f2b57ea6daaec09c1ab0ac99cb0Abhijeet Kolekar pos += scnprintf(buf + pos, bufsz - pos, "data: %u\n", 146db0589f3b9443f2b57ea6daaec09c1ab0ac99cb0Abhijeet Kolekar priv->rx_stats[2].cnt); 147712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 148712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler return simple_read_from_buffer(user_buf, count, ppos, buf, pos); 149712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler} 150712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 151712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler#define BYTE1_MASK 0x000000ff; 152712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler#define BYTE2_MASK 0x0000ffff; 153712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler#define BYTE3_MASK 0x00ffffff; 154712b6cf57a53da608a682b5f782c5785bda76001Tomas Winklerstatic ssize_t iwl_dbgfs_sram_read(struct file *file, 155712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler char __user *user_buf, 156712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler size_t count, loff_t *ppos) 157712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler{ 158712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler u32 val; 159712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler char buf[1024]; 160712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler ssize_t ret; 161712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler int i; 162712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler int pos = 0; 163712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler struct iwl_priv *priv = (struct iwl_priv *)file->private_data; 164db0589f3b9443f2b57ea6daaec09c1ab0ac99cb0Abhijeet Kolekar const size_t bufsz = sizeof(buf); 165712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 166712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler printk(KERN_DEBUG "offset is: 0x%x\tlen is: 0x%x\n", 167712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler priv->dbgfs->sram_offset, priv->dbgfs->sram_len); 168712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 1693395f6e9cf48469d7ee05703cad1502002741c16Tomas Winkler iwl_grab_nic_access(priv); 170712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler for (i = priv->dbgfs->sram_len; i > 0; i -= 4) { 1713395f6e9cf48469d7ee05703cad1502002741c16Tomas Winkler val = iwl_read_targ_mem(priv, priv->dbgfs->sram_offset + \ 172712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler priv->dbgfs->sram_len - i); 173712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler if (i < 4) { 174712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler switch (i) { 175712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler case 1: 176712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler val &= BYTE1_MASK; 177712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler break; 178712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler case 2: 179712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler val &= BYTE2_MASK; 180712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler break; 181712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler case 3: 182712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler val &= BYTE3_MASK; 183712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler break; 184712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler } 185712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler } 186db0589f3b9443f2b57ea6daaec09c1ab0ac99cb0Abhijeet Kolekar pos += scnprintf(buf + pos, bufsz - pos, "0x%08x ", val); 187712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler } 188db0589f3b9443f2b57ea6daaec09c1ab0ac99cb0Abhijeet Kolekar pos += scnprintf(buf + pos, bufsz - pos, "\n"); 1893395f6e9cf48469d7ee05703cad1502002741c16Tomas Winkler iwl_release_nic_access(priv); 190712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 191712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler ret = simple_read_from_buffer(user_buf, count, ppos, buf, pos); 192712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler return ret; 193712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler} 194712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 195712b6cf57a53da608a682b5f782c5785bda76001Tomas Winklerstatic ssize_t iwl_dbgfs_sram_write(struct file *file, 196712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler const char __user *user_buf, 197712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler size_t count, loff_t *ppos) 198712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler{ 199712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler struct iwl_priv *priv = file->private_data; 200712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler char buf[64]; 201712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler int buf_size; 202712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler u32 offset, len; 203712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 204712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler memset(buf, 0, sizeof(buf)); 205712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler buf_size = min(count, sizeof(buf) - 1); 206712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler if (copy_from_user(buf, user_buf, buf_size)) 207712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler return -EFAULT; 208712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 209712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler if (sscanf(buf, "%x,%x", &offset, &len) == 2) { 210712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler priv->dbgfs->sram_offset = offset; 211712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler priv->dbgfs->sram_len = len; 212712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler } else { 213712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler priv->dbgfs->sram_offset = 0; 214712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler priv->dbgfs->sram_len = 0; 215712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler } 216712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 217712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler return count; 218712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler} 219712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 220712b6cf57a53da608a682b5f782c5785bda76001Tomas Winklerstatic ssize_t iwl_dbgfs_stations_read(struct file *file, char __user *user_buf, 221712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler size_t count, loff_t *ppos) 222712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler{ 223712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler struct iwl_priv *priv = (struct iwl_priv *)file->private_data; 2246def9761f72501e638e79eebcd70afea12a3a93dTomas Winkler struct iwl_station_entry *station; 2255425e490471d521bae2fce16d22995803b41d90fTomas Winkler int max_sta = priv->hw_params.max_stations; 226712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler char *buf; 227712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler int i, j, pos = 0; 228712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler ssize_t ret; 229712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler /* Add 30 for initial string */ 230712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler const size_t bufsz = 30 + sizeof(char) * 500 * (priv->num_stations); 231712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler DECLARE_MAC_BUF(mac); 232712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 233712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler buf = kmalloc(bufsz, GFP_KERNEL); 234712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler if(!buf) 235712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler return -ENOMEM; 236712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 237db0589f3b9443f2b57ea6daaec09c1ab0ac99cb0Abhijeet Kolekar pos += scnprintf(buf + pos, bufsz - pos, "num of stations: %d\n\n", 238712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler priv->num_stations); 239712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 240712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler for (i = 0; i < max_sta; i++) { 241712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler station = &priv->stations[i]; 242712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler if (station->used) { 243db0589f3b9443f2b57ea6daaec09c1ab0ac99cb0Abhijeet Kolekar pos += scnprintf(buf + pos, bufsz - pos, 244db0589f3b9443f2b57ea6daaec09c1ab0ac99cb0Abhijeet Kolekar "station %d:\ngeneral data:\n", i+1); 245712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler print_mac(mac, station->sta.sta.addr); 246db0589f3b9443f2b57ea6daaec09c1ab0ac99cb0Abhijeet Kolekar pos += scnprintf(buf + pos, bufsz - pos, "id: %u\n", 247712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler station->sta.sta.sta_id); 248db0589f3b9443f2b57ea6daaec09c1ab0ac99cb0Abhijeet Kolekar pos += scnprintf(buf + pos, bufsz - pos, "mode: %u\n", 249712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler station->sta.mode); 250db0589f3b9443f2b57ea6daaec09c1ab0ac99cb0Abhijeet Kolekar pos += scnprintf(buf + pos, bufsz - pos, 251db0589f3b9443f2b57ea6daaec09c1ab0ac99cb0Abhijeet Kolekar "flags: 0x%x\n", 252712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler station->sta.station_flags_msk); 253db0589f3b9443f2b57ea6daaec09c1ab0ac99cb0Abhijeet Kolekar pos += scnprintf(buf + pos, bufsz - pos, 254db0589f3b9443f2b57ea6daaec09c1ab0ac99cb0Abhijeet Kolekar "ps_status: %u\n", station->ps_status); 255db0589f3b9443f2b57ea6daaec09c1ab0ac99cb0Abhijeet Kolekar pos += scnprintf(buf + pos, bufsz - pos, "tid data:\n"); 256db0589f3b9443f2b57ea6daaec09c1ab0ac99cb0Abhijeet Kolekar pos += scnprintf(buf + pos, bufsz - pos, 257344234de54891ed15bf8127e4640ff9238076d6cDavid S. Miller "seq_num\t\ttxq_id"); 258344234de54891ed15bf8127e4640ff9238076d6cDavid S. Miller#ifdef CONFIG_IWL4965_HT 259db0589f3b9443f2b57ea6daaec09c1ab0ac99cb0Abhijeet Kolekar pos += scnprintf(buf + pos, bufsz - pos, 260344234de54891ed15bf8127e4640ff9238076d6cDavid S. Miller "\tframe_count\twait_for_ba\t"); 261db0589f3b9443f2b57ea6daaec09c1ab0ac99cb0Abhijeet Kolekar pos += scnprintf(buf + pos, bufsz - pos, 262db0589f3b9443f2b57ea6daaec09c1ab0ac99cb0Abhijeet Kolekar "start_idx\tbitmap0\t"); 263db0589f3b9443f2b57ea6daaec09c1ab0ac99cb0Abhijeet Kolekar pos += scnprintf(buf + pos, bufsz - pos, 264344234de54891ed15bf8127e4640ff9238076d6cDavid S. Miller "bitmap1\trate_n_flags"); 265344234de54891ed15bf8127e4640ff9238076d6cDavid S. Miller#endif 266344234de54891ed15bf8127e4640ff9238076d6cDavid S. Miller pos += scnprintf(buf + pos, bufsz - pos, "\n"); 267712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 268712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler for (j = 0; j < MAX_TID_COUNT; j++) { 269db0589f3b9443f2b57ea6daaec09c1ab0ac99cb0Abhijeet Kolekar pos += scnprintf(buf + pos, bufsz - pos, 270344234de54891ed15bf8127e4640ff9238076d6cDavid S. Miller "[%d]:\t\t%u", j, 271db0589f3b9443f2b57ea6daaec09c1ab0ac99cb0Abhijeet Kolekar station->tid[j].seq_number); 272344234de54891ed15bf8127e4640ff9238076d6cDavid S. Miller#ifdef CONFIG_IWL4965_HT 273db0589f3b9443f2b57ea6daaec09c1ab0ac99cb0Abhijeet Kolekar pos += scnprintf(buf + pos, bufsz - pos, 274344234de54891ed15bf8127e4640ff9238076d6cDavid S. Miller "\t%u\t\t%u\t\t%u\t\t", 275712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler station->tid[j].agg.txq_id, 276712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler station->tid[j].agg.frame_count, 277712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler station->tid[j].agg.wait_for_ba); 278db0589f3b9443f2b57ea6daaec09c1ab0ac99cb0Abhijeet Kolekar pos += scnprintf(buf + pos, bufsz - pos, 279344234de54891ed15bf8127e4640ff9238076d6cDavid S. Miller "%u\t%llu\t%u", 280712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler station->tid[j].agg.start_idx, 28116788599a9601cbba6ad7b58b3b52227ea59c013John W. Linville (unsigned long long)station->tid[j].agg.bitmap, 282712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler station->tid[j].agg.rate_n_flags); 283344234de54891ed15bf8127e4640ff9238076d6cDavid S. Miller#endif 284344234de54891ed15bf8127e4640ff9238076d6cDavid S. Miller pos += scnprintf(buf + pos, bufsz - pos, "\n"); 285712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler } 286db0589f3b9443f2b57ea6daaec09c1ab0ac99cb0Abhijeet Kolekar pos += scnprintf(buf + pos, bufsz - pos, "\n"); 287712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler } 288712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler } 289712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 290712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler ret = simple_read_from_buffer(user_buf, count, ppos, buf, pos); 291712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler kfree(buf); 292712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler return ret; 293712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler} 294712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 2958dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winklerstatic ssize_t iwl_dbgfs_eeprom_read(struct file *file, 2968dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler char __user *user_buf, 2978dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler size_t count, 2988dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler loff_t *ppos) 2998dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler{ 3008dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler ssize_t ret; 3018dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler struct iwl_priv *priv = (struct iwl_priv *)file->private_data; 3028dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler int pos = 0, ofs = 0, buf_size = 0; 3038dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler const u8 *ptr; 3048dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler char *buf; 3058dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler size_t eeprom_len = priv->cfg->eeprom_size; 3068dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler buf_size = 4 * eeprom_len + 256; 3078dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler 3088dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler if (eeprom_len % 16) { 3098dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler IWL_ERROR("EEPROM size is not multiple of 16.\n"); 3108dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler return -ENODATA; 3118dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler } 3128dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler 3138dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler /* 4 characters for byte 0xYY */ 3148dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler buf = kzalloc(buf_size, GFP_KERNEL); 3158dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler if (!buf) { 3168dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler IWL_ERROR("Can not allocate Buffer\n"); 3178dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler return -ENOMEM; 3188dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler } 3198dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler 3208dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler ptr = priv->eeprom; 3218dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler for (ofs = 0 ; ofs < eeprom_len ; ofs += 16) { 3228dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler pos += scnprintf(buf + pos, buf_size - pos, "0x%.4x ", ofs); 3238dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler hex_dump_to_buffer(ptr + ofs, 16 , 16, 2, buf + pos, 3248dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler buf_size - pos, 0); 3258dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler pos += strlen(buf); 3268dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler if (buf_size - pos > 0) 3278dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler buf[pos++] = '\n'; 3288dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler } 3298dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler 3308dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler ret = simple_read_from_buffer(user_buf, count, ppos, buf, pos); 3318dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler kfree(buf); 3328dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler return ret; 3338dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler} 334712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 335189a2b5942d62bd18e1e01772c4c784253f5dd16Ester Kummerstatic ssize_t iwl_dbgfs_log_event_write(struct file *file, 336189a2b5942d62bd18e1e01772c4c784253f5dd16Ester Kummer const char __user *user_buf, 337189a2b5942d62bd18e1e01772c4c784253f5dd16Ester Kummer size_t count, loff_t *ppos) 338189a2b5942d62bd18e1e01772c4c784253f5dd16Ester Kummer{ 339189a2b5942d62bd18e1e01772c4c784253f5dd16Ester Kummer struct iwl_priv *priv = file->private_data; 340189a2b5942d62bd18e1e01772c4c784253f5dd16Ester Kummer u32 event_log_flag; 341189a2b5942d62bd18e1e01772c4c784253f5dd16Ester Kummer char buf[8]; 342189a2b5942d62bd18e1e01772c4c784253f5dd16Ester Kummer int buf_size; 343189a2b5942d62bd18e1e01772c4c784253f5dd16Ester Kummer 344189a2b5942d62bd18e1e01772c4c784253f5dd16Ester Kummer memset(buf, 0, sizeof(buf)); 345189a2b5942d62bd18e1e01772c4c784253f5dd16Ester Kummer buf_size = min(count, sizeof(buf) - 1); 346189a2b5942d62bd18e1e01772c4c784253f5dd16Ester Kummer if (copy_from_user(buf, user_buf, buf_size)) 347189a2b5942d62bd18e1e01772c4c784253f5dd16Ester Kummer return -EFAULT; 348189a2b5942d62bd18e1e01772c4c784253f5dd16Ester Kummer if (sscanf(buf, "%d", &event_log_flag) != 1) 349189a2b5942d62bd18e1e01772c4c784253f5dd16Ester Kummer return -EFAULT; 350189a2b5942d62bd18e1e01772c4c784253f5dd16Ester Kummer if (event_log_flag == 1) 351189a2b5942d62bd18e1e01772c4c784253f5dd16Ester Kummer iwl_dump_nic_event_log(priv); 352189a2b5942d62bd18e1e01772c4c784253f5dd16Ester Kummer 353189a2b5942d62bd18e1e01772c4c784253f5dd16Ester Kummer return count; 354189a2b5942d62bd18e1e01772c4c784253f5dd16Ester Kummer} 355189a2b5942d62bd18e1e01772c4c784253f5dd16Ester Kummer 356712b6cf57a53da608a682b5f782c5785bda76001Tomas WinklerDEBUGFS_READ_WRITE_FILE_OPS(sram); 357189a2b5942d62bd18e1e01772c4c784253f5dd16Ester KummerDEBUGFS_WRITE_FILE_OPS(log_event); 3588dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas WinklerDEBUGFS_READ_FILE_OPS(eeprom); 359712b6cf57a53da608a682b5f782c5785bda76001Tomas WinklerDEBUGFS_READ_FILE_OPS(stations); 360712b6cf57a53da608a682b5f782c5785bda76001Tomas WinklerDEBUGFS_READ_FILE_OPS(rx_statistics); 361712b6cf57a53da608a682b5f782c5785bda76001Tomas WinklerDEBUGFS_READ_FILE_OPS(tx_statistics); 362712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 363712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler/* 364712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler * Create the debugfs files and directories 365712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler * 366712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler */ 367712b6cf57a53da608a682b5f782c5785bda76001Tomas Winklerint iwl_dbgfs_register(struct iwl_priv *priv, const char *name) 368712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler{ 369712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler struct iwl_debugfs *dbgfs; 37095b1a8224abf6230899856753c5506a3f737a65bZhu Yi struct dentry *phyd = priv->hw->wiphy->debugfsdir; 371712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 372712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler dbgfs = kzalloc(sizeof(struct iwl_debugfs), GFP_KERNEL); 373712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler if (!dbgfs) { 374712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler goto err; 375712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler } 376712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 377712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler priv->dbgfs = dbgfs; 378712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler dbgfs->name = name; 37995b1a8224abf6230899856753c5506a3f737a65bZhu Yi dbgfs->dir_drv = debugfs_create_dir(name, phyd); 380712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler if (!dbgfs->dir_drv || IS_ERR(dbgfs->dir_drv)){ 381712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler goto err; 382712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler } 383712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 384712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler DEBUGFS_ADD_DIR(data, dbgfs->dir_drv); 385445c2dff409ef9de5d2f964d20917ab238fd266fTomas Winkler DEBUGFS_ADD_DIR(rf, dbgfs->dir_drv); 3868dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler DEBUGFS_ADD_FILE(eeprom, data); 387712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler DEBUGFS_ADD_FILE(sram, data); 388189a2b5942d62bd18e1e01772c4c784253f5dd16Ester Kummer DEBUGFS_ADD_FILE(log_event, data); 389712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler DEBUGFS_ADD_FILE(stations, data); 390712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler DEBUGFS_ADD_FILE(rx_statistics, data); 391712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler DEBUGFS_ADD_FILE(tx_statistics, data); 392445c2dff409ef9de5d2f964d20917ab238fd266fTomas Winkler#ifdef CONFIG_IWLWIFI_RUN_TIME_CALIB 393445c2dff409ef9de5d2f964d20917ab238fd266fTomas Winkler DEBUGFS_ADD_BOOL(disable_sensitivity, rf, &priv->disable_sens_cal); 394445c2dff409ef9de5d2f964d20917ab238fd266fTomas Winkler DEBUGFS_ADD_BOOL(disable_chain_noise, rf, 395445c2dff409ef9de5d2f964d20917ab238fd266fTomas Winkler &priv->disable_chain_noise_cal); 396445c2dff409ef9de5d2f964d20917ab238fd266fTomas Winkler#endif /* CONFIG_IWLWIFI_RUN_TIME_CALIB */ 397712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler return 0; 398712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 399712b6cf57a53da608a682b5f782c5785bda76001Tomas Winklererr: 400712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler IWL_ERROR("Can't open the debugfs directory\n"); 401712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler iwl_dbgfs_unregister(priv); 402712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler return -ENOENT; 403712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler} 404712b6cf57a53da608a682b5f782c5785bda76001Tomas WinklerEXPORT_SYMBOL(iwl_dbgfs_register); 405712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 406712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler/** 407712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler * Remove the debugfs files and directories 408712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler * 409712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler */ 410712b6cf57a53da608a682b5f782c5785bda76001Tomas Winklervoid iwl_dbgfs_unregister(struct iwl_priv *priv) 411712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler{ 412712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler if (!(priv->dbgfs)) 413712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler return; 414712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 4158dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler DEBUGFS_REMOVE(priv->dbgfs->dbgfs_data_files.file_eeprom); 416712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler DEBUGFS_REMOVE(priv->dbgfs->dbgfs_data_files.file_rx_statistics); 417712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler DEBUGFS_REMOVE(priv->dbgfs->dbgfs_data_files.file_tx_statistics); 418712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler DEBUGFS_REMOVE(priv->dbgfs->dbgfs_data_files.file_sram); 419189a2b5942d62bd18e1e01772c4c784253f5dd16Ester Kummer DEBUGFS_REMOVE(priv->dbgfs->dbgfs_data_files.file_log_event); 420712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler DEBUGFS_REMOVE(priv->dbgfs->dbgfs_data_files.file_stations); 421712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler DEBUGFS_REMOVE(priv->dbgfs->dir_data); 422445c2dff409ef9de5d2f964d20917ab238fd266fTomas Winkler#ifdef CONFIG_IWLWIFI_RUN_TIME_CALIB 423445c2dff409ef9de5d2f964d20917ab238fd266fTomas Winkler DEBUGFS_REMOVE(priv->dbgfs->dbgfs_rf_files.file_disable_sensitivity); 424445c2dff409ef9de5d2f964d20917ab238fd266fTomas Winkler DEBUGFS_REMOVE(priv->dbgfs->dbgfs_rf_files.file_disable_chain_noise); 425445c2dff409ef9de5d2f964d20917ab238fd266fTomas Winkler#endif /* CONFIG_IWLWIFI_RUN_TIME_CALIB */ 426445c2dff409ef9de5d2f964d20917ab238fd266fTomas Winkler DEBUGFS_REMOVE(priv->dbgfs->dir_rf); 427712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler DEBUGFS_REMOVE(priv->dbgfs->dir_drv); 428712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler kfree(priv->dbgfs); 429712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler priv->dbgfs = NULL; 430712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler} 431712b6cf57a53da608a682b5f782c5785bda76001Tomas WinklerEXPORT_SYMBOL(iwl_dbgfs_unregister); 432712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 433712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 434445c2dff409ef9de5d2f964d20917ab238fd266fTomas Winkler 435