iwl-debugfs.c revision 3ac7f14694dd38273d9d96f1c873233d71190c15
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);
2343ac7f14694dd38273d9d96f1c873233d71190c15Tomas 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");
258db0589f3b9443f2b57ea6daaec09c1ab0ac99cb0Abhijeet Kolekar			pos += scnprintf(buf + pos, bufsz - pos,
259344234de54891ed15bf8127e4640ff9238076d6cDavid S. Miller					"\tframe_count\twait_for_ba\t");
260db0589f3b9443f2b57ea6daaec09c1ab0ac99cb0Abhijeet Kolekar			pos += scnprintf(buf + pos, bufsz - pos,
261db0589f3b9443f2b57ea6daaec09c1ab0ac99cb0Abhijeet Kolekar					"start_idx\tbitmap0\t");
262db0589f3b9443f2b57ea6daaec09c1ab0ac99cb0Abhijeet Kolekar			pos += scnprintf(buf + pos, bufsz - pos,
263344234de54891ed15bf8127e4640ff9238076d6cDavid S. Miller					"bitmap1\trate_n_flags");
264344234de54891ed15bf8127e4640ff9238076d6cDavid S. Miller			pos += scnprintf(buf + pos, bufsz - pos, "\n");
265712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler
266712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler			for (j = 0; j < MAX_TID_COUNT; j++) {
267db0589f3b9443f2b57ea6daaec09c1ab0ac99cb0Abhijeet Kolekar				pos += scnprintf(buf + pos, bufsz - pos,
268344234de54891ed15bf8127e4640ff9238076d6cDavid S. Miller						"[%d]:\t\t%u", j,
269db0589f3b9443f2b57ea6daaec09c1ab0ac99cb0Abhijeet Kolekar						station->tid[j].seq_number);
270db0589f3b9443f2b57ea6daaec09c1ab0ac99cb0Abhijeet Kolekar				pos += scnprintf(buf + pos, bufsz - pos,
271344234de54891ed15bf8127e4640ff9238076d6cDavid S. Miller						"\t%u\t\t%u\t\t%u\t\t",
272712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler						station->tid[j].agg.txq_id,
273712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler						station->tid[j].agg.frame_count,
274712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler						station->tid[j].agg.wait_for_ba);
275db0589f3b9443f2b57ea6daaec09c1ab0ac99cb0Abhijeet Kolekar				pos += scnprintf(buf + pos, bufsz - pos,
276344234de54891ed15bf8127e4640ff9238076d6cDavid S. Miller						"%u\t%llu\t%u",
277712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler						station->tid[j].agg.start_idx,
27816788599a9601cbba6ad7b58b3b52227ea59c013John W. Linville						(unsigned long long)station->tid[j].agg.bitmap,
279712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler						station->tid[j].agg.rate_n_flags);
280344234de54891ed15bf8127e4640ff9238076d6cDavid S. Miller				pos += scnprintf(buf + pos, bufsz - pos, "\n");
281712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler			}
282db0589f3b9443f2b57ea6daaec09c1ab0ac99cb0Abhijeet Kolekar			pos += scnprintf(buf + pos, bufsz - pos, "\n");
283712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler		}
284712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler	}
285712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler
286712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler	ret = simple_read_from_buffer(user_buf, count, ppos, buf, pos);
287712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler	kfree(buf);
288712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler	return ret;
289712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler}
290712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler
2918dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winklerstatic ssize_t iwl_dbgfs_eeprom_read(struct file *file,
2928dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler				       char __user *user_buf,
2938dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler				       size_t count,
2948dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler				       loff_t *ppos)
2958dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler{
2968dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler	ssize_t ret;
2978dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler	struct iwl_priv *priv = (struct iwl_priv *)file->private_data;
2988dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler	int pos = 0, ofs = 0, buf_size = 0;
2998dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler	const u8 *ptr;
3008dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler	char *buf;
3018dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler	size_t eeprom_len = priv->cfg->eeprom_size;
3028dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler	buf_size = 4 * eeprom_len + 256;
3038dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler
3048dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler	if (eeprom_len % 16) {
3058dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler		IWL_ERROR("EEPROM size is not multiple of 16.\n");
3068dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler		return -ENODATA;
3078dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler	}
3088dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler
3098dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler	/* 4 characters for byte 0xYY */
3108dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler	buf = kzalloc(buf_size, GFP_KERNEL);
3118dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler	if (!buf) {
3128dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler		IWL_ERROR("Can not allocate Buffer\n");
3138dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler		return -ENOMEM;
3148dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler	}
3158dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler
3168dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler	ptr = priv->eeprom;
3178dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler	for (ofs = 0 ; ofs < eeprom_len ; ofs += 16) {
3188dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler		pos += scnprintf(buf + pos, buf_size - pos, "0x%.4x ", ofs);
3198dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler		hex_dump_to_buffer(ptr + ofs, 16 , 16, 2, buf + pos,
3208dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler				   buf_size - pos, 0);
3218dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler		pos += strlen(buf);
3228dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler		if (buf_size - pos > 0)
3238dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler			buf[pos++] = '\n';
3248dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler	}
3258dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler
3268dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler	ret = simple_read_from_buffer(user_buf, count, ppos, buf, pos);
3278dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler	kfree(buf);
3288dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler	return ret;
3298dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler}
330712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler
331189a2b5942d62bd18e1e01772c4c784253f5dd16Ester Kummerstatic ssize_t iwl_dbgfs_log_event_write(struct file *file,
332189a2b5942d62bd18e1e01772c4c784253f5dd16Ester Kummer					const char __user *user_buf,
333189a2b5942d62bd18e1e01772c4c784253f5dd16Ester Kummer					size_t count, loff_t *ppos)
334189a2b5942d62bd18e1e01772c4c784253f5dd16Ester Kummer{
335189a2b5942d62bd18e1e01772c4c784253f5dd16Ester Kummer	struct iwl_priv *priv = file->private_data;
336189a2b5942d62bd18e1e01772c4c784253f5dd16Ester Kummer	u32 event_log_flag;
337189a2b5942d62bd18e1e01772c4c784253f5dd16Ester Kummer	char buf[8];
338189a2b5942d62bd18e1e01772c4c784253f5dd16Ester Kummer	int buf_size;
339189a2b5942d62bd18e1e01772c4c784253f5dd16Ester Kummer
340189a2b5942d62bd18e1e01772c4c784253f5dd16Ester Kummer	memset(buf, 0, sizeof(buf));
341189a2b5942d62bd18e1e01772c4c784253f5dd16Ester Kummer	buf_size = min(count, sizeof(buf) -  1);
342189a2b5942d62bd18e1e01772c4c784253f5dd16Ester Kummer	if (copy_from_user(buf, user_buf, buf_size))
343189a2b5942d62bd18e1e01772c4c784253f5dd16Ester Kummer		return -EFAULT;
344189a2b5942d62bd18e1e01772c4c784253f5dd16Ester Kummer	if (sscanf(buf, "%d", &event_log_flag) != 1)
345189a2b5942d62bd18e1e01772c4c784253f5dd16Ester Kummer		return -EFAULT;
346189a2b5942d62bd18e1e01772c4c784253f5dd16Ester Kummer	if (event_log_flag == 1)
347189a2b5942d62bd18e1e01772c4c784253f5dd16Ester Kummer		iwl_dump_nic_event_log(priv);
348189a2b5942d62bd18e1e01772c4c784253f5dd16Ester Kummer
349189a2b5942d62bd18e1e01772c4c784253f5dd16Ester Kummer	return count;
350189a2b5942d62bd18e1e01772c4c784253f5dd16Ester Kummer}
351189a2b5942d62bd18e1e01772c4c784253f5dd16Ester Kummer
352712b6cf57a53da608a682b5f782c5785bda76001Tomas WinklerDEBUGFS_READ_WRITE_FILE_OPS(sram);
353189a2b5942d62bd18e1e01772c4c784253f5dd16Ester KummerDEBUGFS_WRITE_FILE_OPS(log_event);
3548dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas WinklerDEBUGFS_READ_FILE_OPS(eeprom);
355712b6cf57a53da608a682b5f782c5785bda76001Tomas WinklerDEBUGFS_READ_FILE_OPS(stations);
356712b6cf57a53da608a682b5f782c5785bda76001Tomas WinklerDEBUGFS_READ_FILE_OPS(rx_statistics);
357712b6cf57a53da608a682b5f782c5785bda76001Tomas WinklerDEBUGFS_READ_FILE_OPS(tx_statistics);
358712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler
359712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler/*
360712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler * Create the debugfs files and directories
361712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler *
362712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler */
363712b6cf57a53da608a682b5f782c5785bda76001Tomas Winklerint iwl_dbgfs_register(struct iwl_priv *priv, const char *name)
364712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler{
365712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler	struct iwl_debugfs *dbgfs;
36695b1a8224abf6230899856753c5506a3f737a65bZhu Yi	struct dentry *phyd = priv->hw->wiphy->debugfsdir;
3673ac7f14694dd38273d9d96f1c873233d71190c15Tomas Winkler	int ret = 0;
368712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler
369712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler	dbgfs = kzalloc(sizeof(struct iwl_debugfs), GFP_KERNEL);
370712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler	if (!dbgfs) {
3713ac7f14694dd38273d9d96f1c873233d71190c15Tomas Winkler		ret = -ENOMEM;
372712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler		goto err;
373712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler	}
374712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler
375712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler	priv->dbgfs = dbgfs;
376712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler	dbgfs->name = name;
37795b1a8224abf6230899856753c5506a3f737a65bZhu Yi	dbgfs->dir_drv = debugfs_create_dir(name, phyd);
3783ac7f14694dd38273d9d96f1c873233d71190c15Tomas Winkler	if (!dbgfs->dir_drv || IS_ERR(dbgfs->dir_drv)) {
3793ac7f14694dd38273d9d96f1c873233d71190c15Tomas Winkler		ret = -ENOENT;
380712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler		goto err;
381712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler	}
382712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler
383712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler	DEBUGFS_ADD_DIR(data, dbgfs->dir_drv);
384445c2dff409ef9de5d2f964d20917ab238fd266fTomas Winkler	DEBUGFS_ADD_DIR(rf, dbgfs->dir_drv);
3858dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler	DEBUGFS_ADD_FILE(eeprom, data);
386712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler	DEBUGFS_ADD_FILE(sram, data);
387189a2b5942d62bd18e1e01772c4c784253f5dd16Ester Kummer	DEBUGFS_ADD_FILE(log_event, data);
388712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler	DEBUGFS_ADD_FILE(stations, data);
389712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler	DEBUGFS_ADD_FILE(rx_statistics, data);
390712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler	DEBUGFS_ADD_FILE(tx_statistics, data);
391445c2dff409ef9de5d2f964d20917ab238fd266fTomas Winkler	DEBUGFS_ADD_BOOL(disable_sensitivity, rf, &priv->disable_sens_cal);
392445c2dff409ef9de5d2f964d20917ab238fd266fTomas Winkler	DEBUGFS_ADD_BOOL(disable_chain_noise, rf,
393445c2dff409ef9de5d2f964d20917ab238fd266fTomas Winkler			 &priv->disable_chain_noise_cal);
394203566f359b5702be72238a8b1d37655c986cc7cEmmanuel Grumbach	DEBUGFS_ADD_BOOL(disable_tx_power, rf, &priv->disable_tx_power_cal);
395712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler	return 0;
396712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler
397712b6cf57a53da608a682b5f782c5785bda76001Tomas Winklererr:
398712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler	IWL_ERROR("Can't open the debugfs directory\n");
399712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler	iwl_dbgfs_unregister(priv);
4003ac7f14694dd38273d9d96f1c873233d71190c15Tomas Winkler	return ret;
401712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler}
402712b6cf57a53da608a682b5f782c5785bda76001Tomas WinklerEXPORT_SYMBOL(iwl_dbgfs_register);
403712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler
404712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler/**
405712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler * Remove the debugfs files and directories
406712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler *
407712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler */
408712b6cf57a53da608a682b5f782c5785bda76001Tomas Winklervoid iwl_dbgfs_unregister(struct iwl_priv *priv)
409712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler{
4103ac7f14694dd38273d9d96f1c873233d71190c15Tomas Winkler	if (!priv->dbgfs)
411712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler		return;
412712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler
4138dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler	DEBUGFS_REMOVE(priv->dbgfs->dbgfs_data_files.file_eeprom);
414712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler	DEBUGFS_REMOVE(priv->dbgfs->dbgfs_data_files.file_rx_statistics);
415712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler	DEBUGFS_REMOVE(priv->dbgfs->dbgfs_data_files.file_tx_statistics);
416712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler	DEBUGFS_REMOVE(priv->dbgfs->dbgfs_data_files.file_sram);
417189a2b5942d62bd18e1e01772c4c784253f5dd16Ester Kummer	DEBUGFS_REMOVE(priv->dbgfs->dbgfs_data_files.file_log_event);
418712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler	DEBUGFS_REMOVE(priv->dbgfs->dbgfs_data_files.file_stations);
419712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler	DEBUGFS_REMOVE(priv->dbgfs->dir_data);
420445c2dff409ef9de5d2f964d20917ab238fd266fTomas Winkler	DEBUGFS_REMOVE(priv->dbgfs->dbgfs_rf_files.file_disable_sensitivity);
421445c2dff409ef9de5d2f964d20917ab238fd266fTomas Winkler	DEBUGFS_REMOVE(priv->dbgfs->dbgfs_rf_files.file_disable_chain_noise);
422203566f359b5702be72238a8b1d37655c986cc7cEmmanuel Grumbach	DEBUGFS_REMOVE(priv->dbgfs->dbgfs_rf_files.file_disable_tx_power);
423445c2dff409ef9de5d2f964d20917ab238fd266fTomas Winkler	DEBUGFS_REMOVE(priv->dbgfs->dir_rf);
424712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler	DEBUGFS_REMOVE(priv->dbgfs->dir_drv);
425712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler	kfree(priv->dbgfs);
426712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler	priv->dbgfs = NULL;
427712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler}
428712b6cf57a53da608a682b5f782c5785bda76001Tomas WinklerEXPORT_SYMBOL(iwl_dbgfs_unregister);
429712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler
430712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler
431445c2dff409ef9de5d2f964d20917ab238fd266fTomas Winkler
432