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