1 /******************************************************************************
5 * Copyright(c) 2008 - 2011 Intel Corporation. All rights reserved.
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of version 2 of the GNU General Public License as
9 * published by the Free Software Foundation.
11 * This program is distributed in the hope that it will be useful, but
12 * WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110,
21 * The full GNU General Public License is included in this distribution
22 * in the file called LICENSE.GPL.
24 * Contact Information:
25 * Intel Linux Wireless <ilw@linux.intel.com>
26 * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
27 *****************************************************************************/
28 #include <linux/ieee80211.h>
29 #include <linux/export.h>
30 #include <net/mac80211.h>
35 il_clear_traffic_stats(struct il_priv
*il
)
37 memset(&il
->tx_stats
, 0, sizeof(struct traffic_stats
));
38 memset(&il
->rx_stats
, 0, sizeof(struct traffic_stats
));
42 * il_update_stats function record all the MGMT, CTRL and DATA pkt for
43 * both TX and Rx . Use debugfs to display the rx/rx_stats
46 il_update_stats(struct il_priv
*il
, bool is_tx
, __le16 fc
, u16 len
)
48 struct traffic_stats
*stats
;
51 stats
= &il
->tx_stats
;
53 stats
= &il
->rx_stats
;
55 if (ieee80211_is_mgmt(fc
)) {
56 switch (fc
& cpu_to_le16(IEEE80211_FCTL_STYPE
)) {
57 case cpu_to_le16(IEEE80211_STYPE_ASSOC_REQ
):
58 stats
->mgmt
[MANAGEMENT_ASSOC_REQ
]++;
60 case cpu_to_le16(IEEE80211_STYPE_ASSOC_RESP
):
61 stats
->mgmt
[MANAGEMENT_ASSOC_RESP
]++;
63 case cpu_to_le16(IEEE80211_STYPE_REASSOC_REQ
):
64 stats
->mgmt
[MANAGEMENT_REASSOC_REQ
]++;
66 case cpu_to_le16(IEEE80211_STYPE_REASSOC_RESP
):
67 stats
->mgmt
[MANAGEMENT_REASSOC_RESP
]++;
69 case cpu_to_le16(IEEE80211_STYPE_PROBE_REQ
):
70 stats
->mgmt
[MANAGEMENT_PROBE_REQ
]++;
72 case cpu_to_le16(IEEE80211_STYPE_PROBE_RESP
):
73 stats
->mgmt
[MANAGEMENT_PROBE_RESP
]++;
75 case cpu_to_le16(IEEE80211_STYPE_BEACON
):
76 stats
->mgmt
[MANAGEMENT_BEACON
]++;
78 case cpu_to_le16(IEEE80211_STYPE_ATIM
):
79 stats
->mgmt
[MANAGEMENT_ATIM
]++;
81 case cpu_to_le16(IEEE80211_STYPE_DISASSOC
):
82 stats
->mgmt
[MANAGEMENT_DISASSOC
]++;
84 case cpu_to_le16(IEEE80211_STYPE_AUTH
):
85 stats
->mgmt
[MANAGEMENT_AUTH
]++;
87 case cpu_to_le16(IEEE80211_STYPE_DEAUTH
):
88 stats
->mgmt
[MANAGEMENT_DEAUTH
]++;
90 case cpu_to_le16(IEEE80211_STYPE_ACTION
):
91 stats
->mgmt
[MANAGEMENT_ACTION
]++;
94 } else if (ieee80211_is_ctl(fc
)) {
95 switch (fc
& cpu_to_le16(IEEE80211_FCTL_STYPE
)) {
96 case cpu_to_le16(IEEE80211_STYPE_BACK_REQ
):
97 stats
->ctrl
[CONTROL_BACK_REQ
]++;
99 case cpu_to_le16(IEEE80211_STYPE_BACK
):
100 stats
->ctrl
[CONTROL_BACK
]++;
102 case cpu_to_le16(IEEE80211_STYPE_PSPOLL
):
103 stats
->ctrl
[CONTROL_PSPOLL
]++;
105 case cpu_to_le16(IEEE80211_STYPE_RTS
):
106 stats
->ctrl
[CONTROL_RTS
]++;
108 case cpu_to_le16(IEEE80211_STYPE_CTS
):
109 stats
->ctrl
[CONTROL_CTS
]++;
111 case cpu_to_le16(IEEE80211_STYPE_ACK
):
112 stats
->ctrl
[CONTROL_ACK
]++;
114 case cpu_to_le16(IEEE80211_STYPE_CFEND
):
115 stats
->ctrl
[CONTROL_CFEND
]++;
117 case cpu_to_le16(IEEE80211_STYPE_CFENDACK
):
118 stats
->ctrl
[CONTROL_CFENDACK
]++;
124 stats
->data_bytes
+= len
;
127 EXPORT_SYMBOL(il_update_stats
);
129 /* create and remove of files */
130 #define DEBUGFS_ADD_FILE(name, parent, mode) do { \
131 debugfs_create_file(#name, mode, parent, il, \
132 &il_dbgfs_##name##_ops); \
135 #define DEBUGFS_ADD_BOOL(name, parent, ptr) do { \
136 debugfs_create_bool(#name, 0600, parent, ptr); \
140 #define DEBUGFS_READ_FUNC(name) \
141 static ssize_t il_dbgfs_##name##_read(struct file *file, \
142 char __user *user_buf, \
143 size_t count, loff_t *ppos);
145 #define DEBUGFS_WRITE_FUNC(name) \
146 static ssize_t il_dbgfs_##name##_write(struct file *file, \
147 const char __user *user_buf, \
148 size_t count, loff_t *ppos);
151 #define DEBUGFS_READ_FILE_OPS(name) \
152 DEBUGFS_READ_FUNC(name); \
153 static const struct file_operations il_dbgfs_##name##_ops = { \
154 .read = il_dbgfs_##name##_read, \
155 .open = simple_open, \
156 .llseek = generic_file_llseek, \
159 #define DEBUGFS_WRITE_FILE_OPS(name) \
160 DEBUGFS_WRITE_FUNC(name); \
161 static const struct file_operations il_dbgfs_##name##_ops = { \
162 .write = il_dbgfs_##name##_write, \
163 .open = simple_open, \
164 .llseek = generic_file_llseek, \
167 #define DEBUGFS_READ_WRITE_FILE_OPS(name) \
168 DEBUGFS_READ_FUNC(name); \
169 DEBUGFS_WRITE_FUNC(name); \
170 static const struct file_operations il_dbgfs_##name##_ops = { \
171 .write = il_dbgfs_##name##_write, \
172 .read = il_dbgfs_##name##_read, \
173 .open = simple_open, \
174 .llseek = generic_file_llseek, \
178 il_get_mgmt_string(int cmd
)
181 IL_CMD(MANAGEMENT_ASSOC_REQ
);
182 IL_CMD(MANAGEMENT_ASSOC_RESP
);
183 IL_CMD(MANAGEMENT_REASSOC_REQ
);
184 IL_CMD(MANAGEMENT_REASSOC_RESP
);
185 IL_CMD(MANAGEMENT_PROBE_REQ
);
186 IL_CMD(MANAGEMENT_PROBE_RESP
);
187 IL_CMD(MANAGEMENT_BEACON
);
188 IL_CMD(MANAGEMENT_ATIM
);
189 IL_CMD(MANAGEMENT_DISASSOC
);
190 IL_CMD(MANAGEMENT_AUTH
);
191 IL_CMD(MANAGEMENT_DEAUTH
);
192 IL_CMD(MANAGEMENT_ACTION
);
200 il_get_ctrl_string(int cmd
)
203 IL_CMD(CONTROL_BACK_REQ
);
204 IL_CMD(CONTROL_BACK
);
205 IL_CMD(CONTROL_PSPOLL
);
209 IL_CMD(CONTROL_CFEND
);
210 IL_CMD(CONTROL_CFENDACK
);
218 il_dbgfs_tx_stats_read(struct file
*file
, char __user
*user_buf
, size_t count
,
222 struct il_priv
*il
= file
->private_data
;
229 100 + sizeof(char) * 50 * (MANAGEMENT_MAX
+ CONTROL_MAX
);
230 buf
= kzalloc(bufsz
, GFP_KERNEL
);
233 pos
+= scnprintf(buf
+ pos
, bufsz
- pos
, "Management:\n");
234 for (cnt
= 0; cnt
< MANAGEMENT_MAX
; cnt
++) {
236 scnprintf(buf
+ pos
, bufsz
- pos
, "\t%25s\t\t: %u\n",
237 il_get_mgmt_string(cnt
), il
->tx_stats
.mgmt
[cnt
]);
239 pos
+= scnprintf(buf
+ pos
, bufsz
- pos
, "Control\n");
240 for (cnt
= 0; cnt
< CONTROL_MAX
; cnt
++) {
242 scnprintf(buf
+ pos
, bufsz
- pos
, "\t%25s\t\t: %u\n",
243 il_get_ctrl_string(cnt
), il
->tx_stats
.ctrl
[cnt
]);
245 pos
+= scnprintf(buf
+ pos
, bufsz
- pos
, "Data:\n");
247 scnprintf(buf
+ pos
, bufsz
- pos
, "\tcnt: %u\n",
248 il
->tx_stats
.data_cnt
);
250 scnprintf(buf
+ pos
, bufsz
- pos
, "\tbytes: %llu\n",
251 il
->tx_stats
.data_bytes
);
252 ret
= simple_read_from_buffer(user_buf
, count
, ppos
, buf
, pos
);
258 il_dbgfs_clear_traffic_stats_write(struct file
*file
,
259 const char __user
*user_buf
, size_t count
,
262 struct il_priv
*il
= file
->private_data
;
267 memset(buf
, 0, sizeof(buf
));
268 buf_size
= min(count
, sizeof(buf
) - 1);
269 if (copy_from_user(buf
, user_buf
, buf_size
))
271 if (sscanf(buf
, "%x", &clear_flag
) != 1)
273 il_clear_traffic_stats(il
);
279 il_dbgfs_rx_stats_read(struct file
*file
, char __user
*user_buf
, size_t count
,
283 struct il_priv
*il
= file
->private_data
;
289 100 + sizeof(char) * 50 * (MANAGEMENT_MAX
+ CONTROL_MAX
);
290 buf
= kzalloc(bufsz
, GFP_KERNEL
);
294 pos
+= scnprintf(buf
+ pos
, bufsz
- pos
, "Management:\n");
295 for (cnt
= 0; cnt
< MANAGEMENT_MAX
; cnt
++) {
297 scnprintf(buf
+ pos
, bufsz
- pos
, "\t%25s\t\t: %u\n",
298 il_get_mgmt_string(cnt
), il
->rx_stats
.mgmt
[cnt
]);
300 pos
+= scnprintf(buf
+ pos
, bufsz
- pos
, "Control:\n");
301 for (cnt
= 0; cnt
< CONTROL_MAX
; cnt
++) {
303 scnprintf(buf
+ pos
, bufsz
- pos
, "\t%25s\t\t: %u\n",
304 il_get_ctrl_string(cnt
), il
->rx_stats
.ctrl
[cnt
]);
306 pos
+= scnprintf(buf
+ pos
, bufsz
- pos
, "Data:\n");
308 scnprintf(buf
+ pos
, bufsz
- pos
, "\tcnt: %u\n",
309 il
->rx_stats
.data_cnt
);
311 scnprintf(buf
+ pos
, bufsz
- pos
, "\tbytes: %llu\n",
312 il
->rx_stats
.data_bytes
);
314 ret
= simple_read_from_buffer(user_buf
, count
, ppos
, buf
, pos
);
319 #define BYTE1_MASK 0x000000ff;
320 #define BYTE2_MASK 0x0000ffff;
321 #define BYTE3_MASK 0x00ffffff;
323 il_dbgfs_sram_read(struct file
*file
, char __user
*user_buf
, size_t count
,
331 struct il_priv
*il
= file
->private_data
;
334 /* default is to dump the entire data segment */
335 if (!il
->dbgfs_sram_offset
&& !il
->dbgfs_sram_len
) {
336 il
->dbgfs_sram_offset
= 0x800000;
337 if (il
->ucode_type
== UCODE_INIT
)
338 il
->dbgfs_sram_len
= il
->ucode_init_data
.len
;
340 il
->dbgfs_sram_len
= il
->ucode_data
.len
;
342 bufsz
= 30 + il
->dbgfs_sram_len
* sizeof(char) * 10;
343 buf
= kmalloc(bufsz
, GFP_KERNEL
);
347 scnprintf(buf
+ pos
, bufsz
- pos
, "sram_len: 0x%x\n",
350 scnprintf(buf
+ pos
, bufsz
- pos
, "sram_offset: 0x%x\n",
351 il
->dbgfs_sram_offset
);
352 for (i
= il
->dbgfs_sram_len
; i
> 0; i
-= 4) {
355 il
->dbgfs_sram_offset
+
356 il
->dbgfs_sram_len
- i
);
371 pos
+= scnprintf(buf
+ pos
, bufsz
- pos
, "\n");
372 pos
+= scnprintf(buf
+ pos
, bufsz
- pos
, "0x%08x ", val
);
374 pos
+= scnprintf(buf
+ pos
, bufsz
- pos
, "\n");
376 ret
= simple_read_from_buffer(user_buf
, count
, ppos
, buf
, pos
);
382 il_dbgfs_sram_write(struct file
*file
, const char __user
*user_buf
,
383 size_t count
, loff_t
*ppos
)
385 struct il_priv
*il
= file
->private_data
;
390 memset(buf
, 0, sizeof(buf
));
391 buf_size
= min(count
, sizeof(buf
) - 1);
392 if (copy_from_user(buf
, user_buf
, buf_size
))
395 if (sscanf(buf
, "%x,%x", &offset
, &len
) == 2) {
396 il
->dbgfs_sram_offset
= offset
;
397 il
->dbgfs_sram_len
= len
;
399 il
->dbgfs_sram_offset
= 0;
400 il
->dbgfs_sram_len
= 0;
407 il_dbgfs_stations_read(struct file
*file
, char __user
*user_buf
, size_t count
,
410 struct il_priv
*il
= file
->private_data
;
411 struct il_station_entry
*station
;
412 int max_sta
= il
->hw_params
.max_stations
;
416 /* Add 30 for initial string */
417 const size_t bufsz
= 30 + sizeof(char) * 500 * (il
->num_stations
);
419 buf
= kmalloc(bufsz
, GFP_KERNEL
);
424 scnprintf(buf
+ pos
, bufsz
- pos
, "num of stations: %d\n\n",
427 for (i
= 0; i
< max_sta
; i
++) {
428 station
= &il
->stations
[i
];
432 scnprintf(buf
+ pos
, bufsz
- pos
,
433 "station %d - addr: %pM, flags: %#x\n", i
,
434 station
->sta
.sta
.addr
,
435 station
->sta
.station_flags_msk
);
437 scnprintf(buf
+ pos
, bufsz
- pos
,
438 "TID\tseq_num\ttxq_id\tframes\ttfds\t");
440 scnprintf(buf
+ pos
, bufsz
- pos
,
441 "start_idx\tbitmap\t\t\trate_n_flags\n");
443 for (j
= 0; j
< MAX_TID_COUNT
; j
++) {
445 scnprintf(buf
+ pos
, bufsz
- pos
,
446 "%d:\t%#x\t%#x\t%u\t%u\t%u\t\t%#.16llx\t%#x",
447 j
, station
->tid
[j
].seq_number
,
448 station
->tid
[j
].agg
.txq_id
,
449 station
->tid
[j
].agg
.frame_count
,
450 station
->tid
[j
].tfds_in_queue
,
451 station
->tid
[j
].agg
.start_idx
,
452 station
->tid
[j
].agg
.bitmap
,
453 station
->tid
[j
].agg
.rate_n_flags
);
455 if (station
->tid
[j
].agg
.wait_for_ba
)
457 scnprintf(buf
+ pos
, bufsz
- pos
,
459 pos
+= scnprintf(buf
+ pos
, bufsz
- pos
, "\n");
462 pos
+= scnprintf(buf
+ pos
, bufsz
- pos
, "\n");
465 ret
= simple_read_from_buffer(user_buf
, count
, ppos
, buf
, pos
);
471 il_dbgfs_nvm_read(struct file
*file
, char __user
*user_buf
, size_t count
,
475 struct il_priv
*il
= file
->private_data
;
476 int pos
= 0, ofs
= 0, buf_size
= 0;
480 size_t eeprom_len
= il
->cfg
->eeprom_size
;
481 buf_size
= 4 * eeprom_len
+ 256;
483 if (eeprom_len
% 16) {
484 IL_ERR("NVM size is not multiple of 16.\n");
490 IL_ERR("Invalid EEPROM memory\n");
494 /* 4 characters for byte 0xYY */
495 buf
= kzalloc(buf_size
, GFP_KERNEL
);
497 IL_ERR("Can not allocate Buffer\n");
500 eeprom_ver
= il_eeprom_query16(il
, EEPROM_VERSION
);
502 scnprintf(buf
+ pos
, buf_size
- pos
, "EEPROM " "version: 0x%x\n",
504 for (ofs
= 0; ofs
< eeprom_len
; ofs
+= 16) {
505 pos
+= scnprintf(buf
+ pos
, buf_size
- pos
, "0x%.4x %16ph\n",
509 ret
= simple_read_from_buffer(user_buf
, count
, ppos
, buf
, pos
);
515 il_dbgfs_channels_read(struct file
*file
, char __user
*user_buf
, size_t count
,
518 struct il_priv
*il
= file
->private_data
;
519 struct ieee80211_channel
*channels
= NULL
;
520 const struct ieee80211_supported_band
*supp_band
= NULL
;
521 int pos
= 0, i
, bufsz
= PAGE_SIZE
;
525 if (!test_bit(S_GEO_CONFIGURED
, &il
->status
))
528 buf
= kzalloc(bufsz
, GFP_KERNEL
);
530 IL_ERR("Can not allocate Buffer\n");
534 supp_band
= il_get_hw_mode(il
, NL80211_BAND_2GHZ
);
536 channels
= supp_band
->channels
;
539 scnprintf(buf
+ pos
, bufsz
- pos
,
540 "Displaying %d channels in 2.4GHz band 802.11bg):\n",
541 supp_band
->n_channels
);
543 for (i
= 0; i
< supp_band
->n_channels
; i
++)
545 scnprintf(buf
+ pos
, bufsz
- pos
,
546 "%d: %ddBm: BSS%s%s, %s.\n",
547 channels
[i
].hw_value
,
548 channels
[i
].max_power
,
550 flags
& IEEE80211_CHAN_RADAR
?
551 " (IEEE 802.11h required)" : "",
553 flags
& IEEE80211_CHAN_NO_IR
) ||
555 flags
& IEEE80211_CHAN_RADAR
)) ? "" :
558 flags
& IEEE80211_CHAN_NO_IR
?
559 "passive only" : "active/passive");
561 supp_band
= il_get_hw_mode(il
, NL80211_BAND_5GHZ
);
563 channels
= supp_band
->channels
;
566 scnprintf(buf
+ pos
, bufsz
- pos
,
567 "Displaying %d channels in 5.2GHz band (802.11a)\n",
568 supp_band
->n_channels
);
570 for (i
= 0; i
< supp_band
->n_channels
; i
++)
572 scnprintf(buf
+ pos
, bufsz
- pos
,
573 "%d: %ddBm: BSS%s%s, %s.\n",
574 channels
[i
].hw_value
,
575 channels
[i
].max_power
,
577 flags
& IEEE80211_CHAN_RADAR
?
578 " (IEEE 802.11h required)" : "",
580 flags
& IEEE80211_CHAN_NO_IR
) ||
582 flags
& IEEE80211_CHAN_RADAR
)) ? "" :
585 flags
& IEEE80211_CHAN_NO_IR
?
586 "passive only" : "active/passive");
588 ret
= simple_read_from_buffer(user_buf
, count
, ppos
, buf
, pos
);
594 il_dbgfs_status_read(struct file
*file
, char __user
*user_buf
, size_t count
,
598 struct il_priv
*il
= file
->private_data
;
601 const size_t bufsz
= sizeof(buf
);
604 scnprintf(buf
+ pos
, bufsz
- pos
, "S_HCMD_ACTIVE:\t %d\n",
605 test_bit(S_HCMD_ACTIVE
, &il
->status
));
607 scnprintf(buf
+ pos
, bufsz
- pos
, "S_INT_ENABLED:\t %d\n",
608 test_bit(S_INT_ENABLED
, &il
->status
));
610 scnprintf(buf
+ pos
, bufsz
- pos
, "S_RFKILL:\t %d\n",
611 test_bit(S_RFKILL
, &il
->status
));
613 scnprintf(buf
+ pos
, bufsz
- pos
, "S_CT_KILL:\t\t %d\n",
614 test_bit(S_CT_KILL
, &il
->status
));
616 scnprintf(buf
+ pos
, bufsz
- pos
, "S_INIT:\t\t %d\n",
617 test_bit(S_INIT
, &il
->status
));
619 scnprintf(buf
+ pos
, bufsz
- pos
, "S_ALIVE:\t\t %d\n",
620 test_bit(S_ALIVE
, &il
->status
));
622 scnprintf(buf
+ pos
, bufsz
- pos
, "S_READY:\t\t %d\n",
623 test_bit(S_READY
, &il
->status
));
625 scnprintf(buf
+ pos
, bufsz
- pos
, "S_TEMPERATURE:\t %d\n",
626 test_bit(S_TEMPERATURE
, &il
->status
));
628 scnprintf(buf
+ pos
, bufsz
- pos
, "S_GEO_CONFIGURED:\t %d\n",
629 test_bit(S_GEO_CONFIGURED
, &il
->status
));
631 scnprintf(buf
+ pos
, bufsz
- pos
, "S_EXIT_PENDING:\t %d\n",
632 test_bit(S_EXIT_PENDING
, &il
->status
));
634 scnprintf(buf
+ pos
, bufsz
- pos
, "S_STATS:\t %d\n",
635 test_bit(S_STATS
, &il
->status
));
637 scnprintf(buf
+ pos
, bufsz
- pos
, "S_SCANNING:\t %d\n",
638 test_bit(S_SCANNING
, &il
->status
));
640 scnprintf(buf
+ pos
, bufsz
- pos
, "S_SCAN_ABORTING:\t %d\n",
641 test_bit(S_SCAN_ABORTING
, &il
->status
));
643 scnprintf(buf
+ pos
, bufsz
- pos
, "S_SCAN_HW:\t\t %d\n",
644 test_bit(S_SCAN_HW
, &il
->status
));
646 scnprintf(buf
+ pos
, bufsz
- pos
, "S_POWER_PMI:\t %d\n",
647 test_bit(S_POWER_PMI
, &il
->status
));
649 scnprintf(buf
+ pos
, bufsz
- pos
, "S_FW_ERROR:\t %d\n",
650 test_bit(S_FW_ERROR
, &il
->status
));
651 return simple_read_from_buffer(user_buf
, count
, ppos
, buf
, pos
);
655 il_dbgfs_interrupt_read(struct file
*file
, char __user
*user_buf
, size_t count
,
659 struct il_priv
*il
= file
->private_data
;
663 int bufsz
= 24 * 64; /* 24 items * 64 char per item */
666 buf
= kzalloc(bufsz
, GFP_KERNEL
);
668 IL_ERR("Can not allocate Buffer\n");
673 scnprintf(buf
+ pos
, bufsz
- pos
, "Interrupt Statistics Report:\n");
676 scnprintf(buf
+ pos
, bufsz
- pos
, "HW Error:\t\t\t %u\n",
679 scnprintf(buf
+ pos
, bufsz
- pos
, "SW Error:\t\t\t %u\n",
681 if (il
->isr_stats
.sw
|| il
->isr_stats
.hw
) {
683 scnprintf(buf
+ pos
, bufsz
- pos
,
684 "\tLast Restarting Code: 0x%X\n",
685 il
->isr_stats
.err_code
);
687 #ifdef CONFIG_IWLEGACY_DEBUG
689 scnprintf(buf
+ pos
, bufsz
- pos
, "Frame transmitted:\t\t %u\n",
692 scnprintf(buf
+ pos
, bufsz
- pos
, "Alive interrupt:\t\t %u\n",
693 il
->isr_stats
.alive
);
696 scnprintf(buf
+ pos
, bufsz
- pos
,
697 "HW RF KILL switch toggled:\t %u\n",
698 il
->isr_stats
.rfkill
);
701 scnprintf(buf
+ pos
, bufsz
- pos
, "CT KILL:\t\t\t %u\n",
702 il
->isr_stats
.ctkill
);
705 scnprintf(buf
+ pos
, bufsz
- pos
, "Wakeup Interrupt:\t\t %u\n",
706 il
->isr_stats
.wakeup
);
709 scnprintf(buf
+ pos
, bufsz
- pos
, "Rx command responses:\t\t %u\n",
711 for (cnt
= 0; cnt
< IL_CN_MAX
; cnt
++) {
712 if (il
->isr_stats
.handlers
[cnt
] > 0)
714 scnprintf(buf
+ pos
, bufsz
- pos
,
715 "\tRx handler[%36s]:\t\t %u\n",
716 il_get_cmd_string(cnt
),
717 il
->isr_stats
.handlers
[cnt
]);
721 scnprintf(buf
+ pos
, bufsz
- pos
, "Tx/FH interrupt:\t\t %u\n",
725 scnprintf(buf
+ pos
, bufsz
- pos
, "Unexpected INTA:\t\t %u\n",
726 il
->isr_stats
.unhandled
);
728 ret
= simple_read_from_buffer(user_buf
, count
, ppos
, buf
, pos
);
734 il_dbgfs_interrupt_write(struct file
*file
, const char __user
*user_buf
,
735 size_t count
, loff_t
*ppos
)
737 struct il_priv
*il
= file
->private_data
;
742 memset(buf
, 0, sizeof(buf
));
743 buf_size
= min(count
, sizeof(buf
) - 1);
744 if (copy_from_user(buf
, user_buf
, buf_size
))
746 if (sscanf(buf
, "%x", &reset_flag
) != 1)
749 il_clear_isr_stats(il
);
755 il_dbgfs_qos_read(struct file
*file
, char __user
*user_buf
, size_t count
,
758 struct il_priv
*il
= file
->private_data
;
761 const size_t bufsz
= sizeof(buf
);
763 for (i
= 0; i
< AC_NUM
; i
++) {
765 scnprintf(buf
+ pos
, bufsz
- pos
,
766 "\tcw_min\tcw_max\taifsn\ttxop\n");
768 scnprintf(buf
+ pos
, bufsz
- pos
,
769 "AC[%d]\t%u\t%u\t%u\t%u\n", i
,
770 il
->qos_data
.def_qos_parm
.ac
[i
].cw_min
,
771 il
->qos_data
.def_qos_parm
.ac
[i
].cw_max
,
772 il
->qos_data
.def_qos_parm
.ac
[i
].aifsn
,
773 il
->qos_data
.def_qos_parm
.ac
[i
].edca_txop
);
776 return simple_read_from_buffer(user_buf
, count
, ppos
, buf
, pos
);
780 il_dbgfs_disable_ht40_write(struct file
*file
, const char __user
*user_buf
,
781 size_t count
, loff_t
*ppos
)
783 struct il_priv
*il
= file
->private_data
;
788 memset(buf
, 0, sizeof(buf
));
789 buf_size
= min(count
, sizeof(buf
) - 1);
790 if (copy_from_user(buf
, user_buf
, buf_size
))
792 if (sscanf(buf
, "%d", &ht40
) != 1)
794 if (!il_is_any_associated(il
))
795 il
->disable_ht40
= ht40
? true : false;
797 IL_ERR("Sta associated with AP - "
798 "Change to 40MHz channel support is not allowed\n");
806 il_dbgfs_disable_ht40_read(struct file
*file
, char __user
*user_buf
,
807 size_t count
, loff_t
*ppos
)
809 struct il_priv
*il
= file
->private_data
;
812 const size_t bufsz
= sizeof(buf
);
815 scnprintf(buf
+ pos
, bufsz
- pos
, "11n 40MHz Mode: %s\n",
816 il
->disable_ht40
? "Disabled" : "Enabled");
817 return simple_read_from_buffer(user_buf
, count
, ppos
, buf
, pos
);
820 DEBUGFS_READ_WRITE_FILE_OPS(sram
);
821 DEBUGFS_READ_FILE_OPS(nvm
);
822 DEBUGFS_READ_FILE_OPS(stations
);
823 DEBUGFS_READ_FILE_OPS(channels
);
824 DEBUGFS_READ_FILE_OPS(status
);
825 DEBUGFS_READ_WRITE_FILE_OPS(interrupt
);
826 DEBUGFS_READ_FILE_OPS(qos
);
827 DEBUGFS_READ_WRITE_FILE_OPS(disable_ht40
);
830 il_dbgfs_tx_queue_read(struct file
*file
, char __user
*user_buf
, size_t count
,
834 struct il_priv
*il
= file
->private_data
;
835 struct il_tx_queue
*txq
;
842 sizeof(char) * 64 * il
->cfg
->num_of_queues
;
845 IL_ERR("txq not ready\n");
848 buf
= kzalloc(bufsz
, GFP_KERNEL
);
852 for (cnt
= 0; cnt
< il
->hw_params
.max_txq_num
; cnt
++) {
856 scnprintf(buf
+ pos
, bufsz
- pos
,
857 "hwq %.2d: read=%u write=%u stop=%d"
858 " swq_id=%#.2x (ac %d/hwq %d)\n", cnt
,
859 q
->read_ptr
, q
->write_ptr
,
860 !!test_bit(cnt
, il
->queue_stopped
),
861 txq
->swq_id
, txq
->swq_id
& 3,
862 (txq
->swq_id
>> 2) & 0x1f);
865 /* for the ACs, display the stop count too */
867 scnprintf(buf
+ pos
, bufsz
- pos
,
869 atomic_read(&il
->queue_stop_count
[cnt
]));
871 ret
= simple_read_from_buffer(user_buf
, count
, ppos
, buf
, pos
);
877 il_dbgfs_rx_queue_read(struct file
*file
, char __user
*user_buf
, size_t count
,
881 struct il_priv
*il
= file
->private_data
;
882 struct il_rx_queue
*rxq
= &il
->rxq
;
885 const size_t bufsz
= sizeof(buf
);
887 pos
+= scnprintf(buf
+ pos
, bufsz
- pos
, "read: %u\n", rxq
->read
);
888 pos
+= scnprintf(buf
+ pos
, bufsz
- pos
, "write: %u\n", rxq
->write
);
890 scnprintf(buf
+ pos
, bufsz
- pos
, "free_count: %u\n",
894 scnprintf(buf
+ pos
, bufsz
- pos
, "closed_rb_num: %u\n",
895 le16_to_cpu(rxq
->rb_stts
->
896 closed_rb_num
) & 0x0FFF);
899 scnprintf(buf
+ pos
, bufsz
- pos
,
900 "closed_rb_num: Not Allocated\n");
902 return simple_read_from_buffer(user_buf
, count
, ppos
, buf
, pos
);
906 il_dbgfs_ucode_rx_stats_read(struct file
*file
, char __user
*user_buf
,
907 size_t count
, loff_t
*ppos
)
909 struct il_priv
*il
= file
->private_data
;
911 return il
->debugfs_ops
->rx_stats_read(file
, user_buf
, count
, ppos
);
915 il_dbgfs_ucode_tx_stats_read(struct file
*file
, char __user
*user_buf
,
916 size_t count
, loff_t
*ppos
)
918 struct il_priv
*il
= file
->private_data
;
920 return il
->debugfs_ops
->tx_stats_read(file
, user_buf
, count
, ppos
);
924 il_dbgfs_ucode_general_stats_read(struct file
*file
, char __user
*user_buf
,
925 size_t count
, loff_t
*ppos
)
927 struct il_priv
*il
= file
->private_data
;
929 return il
->debugfs_ops
->general_stats_read(file
, user_buf
, count
, ppos
);
933 il_dbgfs_sensitivity_read(struct file
*file
, char __user
*user_buf
,
934 size_t count
, loff_t
*ppos
)
937 struct il_priv
*il
= file
->private_data
;
941 int bufsz
= sizeof(struct il_sensitivity_data
) * 4 + 100;
943 struct il_sensitivity_data
*data
;
945 data
= &il
->sensitivity_data
;
946 buf
= kzalloc(bufsz
, GFP_KERNEL
);
948 IL_ERR("Can not allocate Buffer\n");
953 scnprintf(buf
+ pos
, bufsz
- pos
, "auto_corr_ofdm:\t\t\t %u\n",
954 data
->auto_corr_ofdm
);
956 scnprintf(buf
+ pos
, bufsz
- pos
, "auto_corr_ofdm_mrc:\t\t %u\n",
957 data
->auto_corr_ofdm_mrc
);
959 scnprintf(buf
+ pos
, bufsz
- pos
, "auto_corr_ofdm_x1:\t\t %u\n",
960 data
->auto_corr_ofdm_x1
);
962 scnprintf(buf
+ pos
, bufsz
- pos
, "auto_corr_ofdm_mrc_x1:\t\t %u\n",
963 data
->auto_corr_ofdm_mrc_x1
);
965 scnprintf(buf
+ pos
, bufsz
- pos
, "auto_corr_cck:\t\t\t %u\n",
966 data
->auto_corr_cck
);
968 scnprintf(buf
+ pos
, bufsz
- pos
, "auto_corr_cck_mrc:\t\t %u\n",
969 data
->auto_corr_cck_mrc
);
971 scnprintf(buf
+ pos
, bufsz
- pos
,
972 "last_bad_plcp_cnt_ofdm:\t\t %u\n",
973 data
->last_bad_plcp_cnt_ofdm
);
975 scnprintf(buf
+ pos
, bufsz
- pos
, "last_fa_cnt_ofdm:\t\t %u\n",
976 data
->last_fa_cnt_ofdm
);
978 scnprintf(buf
+ pos
, bufsz
- pos
, "last_bad_plcp_cnt_cck:\t\t %u\n",
979 data
->last_bad_plcp_cnt_cck
);
981 scnprintf(buf
+ pos
, bufsz
- pos
, "last_fa_cnt_cck:\t\t %u\n",
982 data
->last_fa_cnt_cck
);
984 scnprintf(buf
+ pos
, bufsz
- pos
, "nrg_curr_state:\t\t\t %u\n",
985 data
->nrg_curr_state
);
987 scnprintf(buf
+ pos
, bufsz
- pos
, "nrg_prev_state:\t\t\t %u\n",
988 data
->nrg_prev_state
);
989 pos
+= scnprintf(buf
+ pos
, bufsz
- pos
, "nrg_value:\t\t\t");
990 for (cnt
= 0; cnt
< 10; cnt
++) {
992 scnprintf(buf
+ pos
, bufsz
- pos
, " %u",
993 data
->nrg_value
[cnt
]);
995 pos
+= scnprintf(buf
+ pos
, bufsz
- pos
, "\n");
996 pos
+= scnprintf(buf
+ pos
, bufsz
- pos
, "nrg_silence_rssi:\t\t");
997 for (cnt
= 0; cnt
< NRG_NUM_PREV_STAT_L
; cnt
++) {
999 scnprintf(buf
+ pos
, bufsz
- pos
, " %u",
1000 data
->nrg_silence_rssi
[cnt
]);
1002 pos
+= scnprintf(buf
+ pos
, bufsz
- pos
, "\n");
1004 scnprintf(buf
+ pos
, bufsz
- pos
, "nrg_silence_ref:\t\t %u\n",
1005 data
->nrg_silence_ref
);
1007 scnprintf(buf
+ pos
, bufsz
- pos
, "nrg_energy_idx:\t\t\t %u\n",
1008 data
->nrg_energy_idx
);
1010 scnprintf(buf
+ pos
, bufsz
- pos
, "nrg_silence_idx:\t\t %u\n",
1011 data
->nrg_silence_idx
);
1013 scnprintf(buf
+ pos
, bufsz
- pos
, "nrg_th_cck:\t\t\t %u\n",
1016 scnprintf(buf
+ pos
, bufsz
- pos
,
1017 "nrg_auto_corr_silence_diff:\t %u\n",
1018 data
->nrg_auto_corr_silence_diff
);
1020 scnprintf(buf
+ pos
, bufsz
- pos
, "num_in_cck_no_fa:\t\t %u\n",
1021 data
->num_in_cck_no_fa
);
1023 scnprintf(buf
+ pos
, bufsz
- pos
, "nrg_th_ofdm:\t\t\t %u\n",
1026 ret
= simple_read_from_buffer(user_buf
, count
, ppos
, buf
, pos
);
1032 il_dbgfs_chain_noise_read(struct file
*file
, char __user
*user_buf
,
1033 size_t count
, loff_t
*ppos
)
1036 struct il_priv
*il
= file
->private_data
;
1040 int bufsz
= sizeof(struct il_chain_noise_data
) * 4 + 100;
1042 struct il_chain_noise_data
*data
;
1044 data
= &il
->chain_noise_data
;
1045 buf
= kzalloc(bufsz
, GFP_KERNEL
);
1047 IL_ERR("Can not allocate Buffer\n");
1052 scnprintf(buf
+ pos
, bufsz
- pos
, "active_chains:\t\t\t %u\n",
1053 data
->active_chains
);
1055 scnprintf(buf
+ pos
, bufsz
- pos
, "chain_noise_a:\t\t\t %u\n",
1056 data
->chain_noise_a
);
1058 scnprintf(buf
+ pos
, bufsz
- pos
, "chain_noise_b:\t\t\t %u\n",
1059 data
->chain_noise_b
);
1061 scnprintf(buf
+ pos
, bufsz
- pos
, "chain_noise_c:\t\t\t %u\n",
1062 data
->chain_noise_c
);
1064 scnprintf(buf
+ pos
, bufsz
- pos
, "chain_signal_a:\t\t\t %u\n",
1065 data
->chain_signal_a
);
1067 scnprintf(buf
+ pos
, bufsz
- pos
, "chain_signal_b:\t\t\t %u\n",
1068 data
->chain_signal_b
);
1070 scnprintf(buf
+ pos
, bufsz
- pos
, "chain_signal_c:\t\t\t %u\n",
1071 data
->chain_signal_c
);
1073 scnprintf(buf
+ pos
, bufsz
- pos
, "beacon_count:\t\t\t %u\n",
1074 data
->beacon_count
);
1076 pos
+= scnprintf(buf
+ pos
, bufsz
- pos
, "disconn_array:\t\t\t");
1077 for (cnt
= 0; cnt
< NUM_RX_CHAINS
; cnt
++) {
1079 scnprintf(buf
+ pos
, bufsz
- pos
, " %u",
1080 data
->disconn_array
[cnt
]);
1082 pos
+= scnprintf(buf
+ pos
, bufsz
- pos
, "\n");
1083 pos
+= scnprintf(buf
+ pos
, bufsz
- pos
, "delta_gain_code:\t\t");
1084 for (cnt
= 0; cnt
< NUM_RX_CHAINS
; cnt
++) {
1086 scnprintf(buf
+ pos
, bufsz
- pos
, " %u",
1087 data
->delta_gain_code
[cnt
]);
1089 pos
+= scnprintf(buf
+ pos
, bufsz
- pos
, "\n");
1091 scnprintf(buf
+ pos
, bufsz
- pos
, "radio_write:\t\t\t %u\n",
1094 scnprintf(buf
+ pos
, bufsz
- pos
, "state:\t\t\t\t %u\n",
1097 ret
= simple_read_from_buffer(user_buf
, count
, ppos
, buf
, pos
);
1103 il_dbgfs_power_save_status_read(struct file
*file
, char __user
*user_buf
,
1104 size_t count
, loff_t
*ppos
)
1106 struct il_priv
*il
= file
->private_data
;
1109 const size_t bufsz
= sizeof(buf
);
1113 _il_rd(il
, CSR_GP_CNTRL
) & CSR_GP_REG_POWER_SAVE_STATUS_MSK
;
1115 pos
+= scnprintf(buf
+ pos
, bufsz
- pos
, "Power Save Status: ");
1117 scnprintf(buf
+ pos
, bufsz
- pos
, "%s\n",
1118 (pwrsave_status
== CSR_GP_REG_NO_POWER_SAVE
) ? "none" :
1119 (pwrsave_status
== CSR_GP_REG_MAC_POWER_SAVE
) ? "MAC" :
1120 (pwrsave_status
== CSR_GP_REG_PHY_POWER_SAVE
) ? "PHY" :
1123 return simple_read_from_buffer(user_buf
, count
, ppos
, buf
, pos
);
1127 il_dbgfs_clear_ucode_stats_write(struct file
*file
,
1128 const char __user
*user_buf
, size_t count
,
1131 struct il_priv
*il
= file
->private_data
;
1136 memset(buf
, 0, sizeof(buf
));
1137 buf_size
= min(count
, sizeof(buf
) - 1);
1138 if (copy_from_user(buf
, user_buf
, buf_size
))
1140 if (sscanf(buf
, "%d", &clear
) != 1)
1143 /* make request to uCode to retrieve stats information */
1144 mutex_lock(&il
->mutex
);
1145 il_send_stats_request(il
, CMD_SYNC
, true);
1146 mutex_unlock(&il
->mutex
);
1152 il_dbgfs_rxon_flags_read(struct file
*file
, char __user
*user_buf
,
1153 size_t count
, loff_t
*ppos
)
1156 struct il_priv
*il
= file
->private_data
;
1160 len
= sprintf(buf
, "0x%04X\n", le32_to_cpu(il
->active
.flags
));
1161 return simple_read_from_buffer(user_buf
, count
, ppos
, buf
, len
);
1165 il_dbgfs_rxon_filter_flags_read(struct file
*file
, char __user
*user_buf
,
1166 size_t count
, loff_t
*ppos
)
1169 struct il_priv
*il
= file
->private_data
;
1174 sprintf(buf
, "0x%04X\n", le32_to_cpu(il
->active
.filter_flags
));
1175 return simple_read_from_buffer(user_buf
, count
, ppos
, buf
, len
);
1179 il_dbgfs_fh_reg_read(struct file
*file
, char __user
*user_buf
, size_t count
,
1182 struct il_priv
*il
= file
->private_data
;
1185 ssize_t ret
= -EFAULT
;
1187 if (il
->ops
->dump_fh
) {
1188 ret
= pos
= il
->ops
->dump_fh(il
, &buf
, true);
1191 simple_read_from_buffer(user_buf
, count
, ppos
, buf
,
1201 il_dbgfs_missed_beacon_read(struct file
*file
, char __user
*user_buf
,
1202 size_t count
, loff_t
*ppos
)
1205 struct il_priv
*il
= file
->private_data
;
1208 const size_t bufsz
= sizeof(buf
);
1211 scnprintf(buf
+ pos
, bufsz
- pos
, "%d\n",
1212 il
->missed_beacon_threshold
);
1214 return simple_read_from_buffer(user_buf
, count
, ppos
, buf
, pos
);
1218 il_dbgfs_missed_beacon_write(struct file
*file
, const char __user
*user_buf
,
1219 size_t count
, loff_t
*ppos
)
1221 struct il_priv
*il
= file
->private_data
;
1226 memset(buf
, 0, sizeof(buf
));
1227 buf_size
= min(count
, sizeof(buf
) - 1);
1228 if (copy_from_user(buf
, user_buf
, buf_size
))
1230 if (sscanf(buf
, "%d", &missed
) != 1)
1233 if (missed
< IL_MISSED_BEACON_THRESHOLD_MIN
||
1234 missed
> IL_MISSED_BEACON_THRESHOLD_MAX
)
1235 il
->missed_beacon_threshold
= IL_MISSED_BEACON_THRESHOLD_DEF
;
1237 il
->missed_beacon_threshold
= missed
;
1243 il_dbgfs_force_reset_read(struct file
*file
, char __user
*user_buf
,
1244 size_t count
, loff_t
*ppos
)
1247 struct il_priv
*il
= file
->private_data
;
1250 const size_t bufsz
= sizeof(buf
);
1251 struct il_force_reset
*force_reset
;
1253 force_reset
= &il
->force_reset
;
1256 scnprintf(buf
+ pos
, bufsz
- pos
, "\tnumber of reset request: %d\n",
1257 force_reset
->reset_request_count
);
1259 scnprintf(buf
+ pos
, bufsz
- pos
,
1260 "\tnumber of reset request success: %d\n",
1261 force_reset
->reset_success_count
);
1263 scnprintf(buf
+ pos
, bufsz
- pos
,
1264 "\tnumber of reset request reject: %d\n",
1265 force_reset
->reset_reject_count
);
1267 scnprintf(buf
+ pos
, bufsz
- pos
, "\treset duration: %lu\n",
1268 force_reset
->reset_duration
);
1270 return simple_read_from_buffer(user_buf
, count
, ppos
, buf
, pos
);
1274 il_dbgfs_force_reset_write(struct file
*file
, const char __user
*user_buf
,
1275 size_t count
, loff_t
*ppos
)
1279 struct il_priv
*il
= file
->private_data
;
1281 ret
= il_force_reset(il
, true);
1283 return ret
? ret
: count
;
1287 il_dbgfs_wd_timeout_write(struct file
*file
, const char __user
*user_buf
,
1288 size_t count
, loff_t
*ppos
)
1291 struct il_priv
*il
= file
->private_data
;
1296 memset(buf
, 0, sizeof(buf
));
1297 buf_size
= min(count
, sizeof(buf
) - 1);
1298 if (copy_from_user(buf
, user_buf
, buf_size
))
1300 if (sscanf(buf
, "%d", &timeout
) != 1)
1302 if (timeout
< 0 || timeout
> IL_MAX_WD_TIMEOUT
)
1303 timeout
= IL_DEF_WD_TIMEOUT
;
1305 il
->cfg
->wd_timeout
= timeout
;
1306 il_setup_watchdog(il
);
1310 DEBUGFS_READ_FILE_OPS(rx_stats
);
1311 DEBUGFS_READ_FILE_OPS(tx_stats
);
1312 DEBUGFS_READ_FILE_OPS(rx_queue
);
1313 DEBUGFS_READ_FILE_OPS(tx_queue
);
1314 DEBUGFS_READ_FILE_OPS(ucode_rx_stats
);
1315 DEBUGFS_READ_FILE_OPS(ucode_tx_stats
);
1316 DEBUGFS_READ_FILE_OPS(ucode_general_stats
);
1317 DEBUGFS_READ_FILE_OPS(sensitivity
);
1318 DEBUGFS_READ_FILE_OPS(chain_noise
);
1319 DEBUGFS_READ_FILE_OPS(power_save_status
);
1320 DEBUGFS_WRITE_FILE_OPS(clear_ucode_stats
);
1321 DEBUGFS_WRITE_FILE_OPS(clear_traffic_stats
);
1322 DEBUGFS_READ_FILE_OPS(fh_reg
);
1323 DEBUGFS_READ_WRITE_FILE_OPS(missed_beacon
);
1324 DEBUGFS_READ_WRITE_FILE_OPS(force_reset
);
1325 DEBUGFS_READ_FILE_OPS(rxon_flags
);
1326 DEBUGFS_READ_FILE_OPS(rxon_filter_flags
);
1327 DEBUGFS_WRITE_FILE_OPS(wd_timeout
);
1330 * Create the debugfs files and directories
1334 il_dbgfs_register(struct il_priv
*il
, const char *name
)
1336 struct dentry
*phyd
= il
->hw
->wiphy
->debugfsdir
;
1337 struct dentry
*dir_drv
, *dir_data
, *dir_rf
, *dir_debug
;
1339 dir_drv
= debugfs_create_dir(name
, phyd
);
1340 il
->debugfs_dir
= dir_drv
;
1342 dir_data
= debugfs_create_dir("data", dir_drv
);
1343 dir_rf
= debugfs_create_dir("rf", dir_drv
);
1344 dir_debug
= debugfs_create_dir("debug", dir_drv
);
1346 DEBUGFS_ADD_FILE(nvm
, dir_data
, 0400);
1347 DEBUGFS_ADD_FILE(sram
, dir_data
, 0600);
1348 DEBUGFS_ADD_FILE(stations
, dir_data
, 0400);
1349 DEBUGFS_ADD_FILE(channels
, dir_data
, 0400);
1350 DEBUGFS_ADD_FILE(status
, dir_data
, 0400);
1351 DEBUGFS_ADD_FILE(interrupt
, dir_data
, 0600);
1352 DEBUGFS_ADD_FILE(qos
, dir_data
, 0400);
1353 DEBUGFS_ADD_FILE(disable_ht40
, dir_data
, 0600);
1354 DEBUGFS_ADD_FILE(rx_stats
, dir_debug
, 0400);
1355 DEBUGFS_ADD_FILE(tx_stats
, dir_debug
, 0400);
1356 DEBUGFS_ADD_FILE(rx_queue
, dir_debug
, 0400);
1357 DEBUGFS_ADD_FILE(tx_queue
, dir_debug
, 0400);
1358 DEBUGFS_ADD_FILE(power_save_status
, dir_debug
, 0400);
1359 DEBUGFS_ADD_FILE(clear_ucode_stats
, dir_debug
, 0200);
1360 DEBUGFS_ADD_FILE(clear_traffic_stats
, dir_debug
, 0200);
1361 DEBUGFS_ADD_FILE(fh_reg
, dir_debug
, 0400);
1362 DEBUGFS_ADD_FILE(missed_beacon
, dir_debug
, 0200);
1363 DEBUGFS_ADD_FILE(force_reset
, dir_debug
, 0600);
1364 DEBUGFS_ADD_FILE(ucode_rx_stats
, dir_debug
, 0400);
1365 DEBUGFS_ADD_FILE(ucode_tx_stats
, dir_debug
, 0400);
1366 DEBUGFS_ADD_FILE(ucode_general_stats
, dir_debug
, 0400);
1368 if (il
->cfg
->sensitivity_calib_by_driver
)
1369 DEBUGFS_ADD_FILE(sensitivity
, dir_debug
, 0400);
1370 if (il
->cfg
->chain_noise_calib_by_driver
)
1371 DEBUGFS_ADD_FILE(chain_noise
, dir_debug
, 0400);
1372 DEBUGFS_ADD_FILE(rxon_flags
, dir_debug
, 0200);
1373 DEBUGFS_ADD_FILE(rxon_filter_flags
, dir_debug
, 0200);
1374 DEBUGFS_ADD_FILE(wd_timeout
, dir_debug
, 0200);
1375 if (il
->cfg
->sensitivity_calib_by_driver
)
1376 DEBUGFS_ADD_BOOL(disable_sensitivity
, dir_rf
,
1377 &il
->disable_sens_cal
);
1378 if (il
->cfg
->chain_noise_calib_by_driver
)
1379 DEBUGFS_ADD_BOOL(disable_chain_noise
, dir_rf
,
1380 &il
->disable_chain_noise_cal
);
1381 DEBUGFS_ADD_BOOL(disable_tx_power
, dir_rf
, &il
->disable_tx_power_cal
);
1383 EXPORT_SYMBOL(il_dbgfs_register
);
1386 * Remove the debugfs files and directories
1390 il_dbgfs_unregister(struct il_priv
*il
)
1392 if (!il
->debugfs_dir
)
1395 debugfs_remove_recursive(il
->debugfs_dir
);
1396 il
->debugfs_dir
= NULL
;
1398 EXPORT_SYMBOL(il_dbgfs_unregister
);