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:
26 * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
27 *****************************************************************************/
28 #include <linux/ieee80211.h>
29 #include <net/mac80211.h>
33 /* create and remove of files */
34 #define DEBUGFS_ADD_FILE(name, parent, mode) do { \
35 if (!debugfs_create_file(#name, mode, parent, il, \
36 &il_dbgfs_##name##_ops)) \
40 #define DEBUGFS_ADD_BOOL(name, parent, ptr) do { \
41 struct dentry *__tmp; \
42 __tmp = debugfs_create_bool(#name, S_IWUSR | S_IRUSR, \
44 if (IS_ERR(__tmp) || !__tmp) \
48 #define DEBUGFS_ADD_X32(name, parent, ptr) do { \
49 struct dentry *__tmp; \
50 __tmp = debugfs_create_x32(#name, S_IWUSR | S_IRUSR, \
52 if (IS_ERR(__tmp) || !__tmp) \
57 #define DEBUGFS_READ_FUNC(name) \
58 static ssize_t il_dbgfs_##name##_read(struct file *file, \
59 char __user *user_buf, \
60 size_t count, loff_t *ppos);
62 #define DEBUGFS_WRITE_FUNC(name) \
63 static ssize_t il_dbgfs_##name##_write(struct file *file, \
64 const char __user *user_buf, \
65 size_t count, loff_t *ppos);
68 il_dbgfs_open_file_generic(struct inode *inode, struct file *file)
70 file->private_data = inode->i_private;
74 #define DEBUGFS_READ_FILE_OPS(name) \
75 DEBUGFS_READ_FUNC(name); \
76 static const struct file_operations il_dbgfs_##name##_ops = { \
77 .read = il_dbgfs_##name##_read, \
78 .open = il_dbgfs_open_file_generic, \
79 .llseek = generic_file_llseek, \
82 #define DEBUGFS_WRITE_FILE_OPS(name) \
83 DEBUGFS_WRITE_FUNC(name); \
84 static const struct file_operations il_dbgfs_##name##_ops = { \
85 .write = il_dbgfs_##name##_write, \
86 .open = il_dbgfs_open_file_generic, \
87 .llseek = generic_file_llseek, \
90 #define DEBUGFS_READ_WRITE_FILE_OPS(name) \
91 DEBUGFS_READ_FUNC(name); \
92 DEBUGFS_WRITE_FUNC(name); \
93 static const struct file_operations il_dbgfs_##name##_ops = { \
94 .write = il_dbgfs_##name##_write, \
95 .read = il_dbgfs_##name##_read, \
96 .open = il_dbgfs_open_file_generic, \
97 .llseek = generic_file_llseek, \
101 il_dbgfs_tx_stats_read(struct file *file, char __user *user_buf, size_t count,
105 struct il_priv *il = file->private_data;
112 100 + sizeof(char) * 50 * (MANAGEMENT_MAX + CONTROL_MAX);
113 buf = kzalloc(bufsz, GFP_KERNEL);
116 pos += scnprintf(buf + pos, bufsz - pos, "Management:\n");
117 for (cnt = 0; cnt < MANAGEMENT_MAX; cnt++) {
119 scnprintf(buf + pos, bufsz - pos, "\t%25s\t\t: %u\n",
120 il_get_mgmt_string(cnt), il->tx_stats.mgmt[cnt]);
122 pos += scnprintf(buf + pos, bufsz - pos, "Control\n");
123 for (cnt = 0; cnt < CONTROL_MAX; cnt++) {
125 scnprintf(buf + pos, bufsz - pos, "\t%25s\t\t: %u\n",
126 il_get_ctrl_string(cnt), il->tx_stats.ctrl[cnt]);
128 pos += scnprintf(buf + pos, bufsz - pos, "Data:\n");
130 scnprintf(buf + pos, bufsz - pos, "\tcnt: %u\n",
131 il->tx_stats.data_cnt);
133 scnprintf(buf + pos, bufsz - pos, "\tbytes: %llu\n",
134 il->tx_stats.data_bytes);
135 ret = simple_read_from_buffer(user_buf, count, ppos, buf, pos);
141 il_dbgfs_clear_traffic_stats_write(struct file *file,
142 const char __user *user_buf, size_t count,
145 struct il_priv *il = file->private_data;
150 memset(buf, 0, sizeof(buf));
151 buf_size = min(count, sizeof(buf) - 1);
152 if (copy_from_user(buf, user_buf, buf_size))
154 if (sscanf(buf, "%x", &clear_flag) != 1)
156 il_clear_traffic_stats(il);
162 il_dbgfs_rx_stats_read(struct file *file, char __user *user_buf, size_t count,
166 struct il_priv *il = file->private_data;
172 100 + sizeof(char) * 50 * (MANAGEMENT_MAX + CONTROL_MAX);
173 buf = kzalloc(bufsz, GFP_KERNEL);
177 pos += scnprintf(buf + pos, bufsz - pos, "Management:\n");
178 for (cnt = 0; cnt < MANAGEMENT_MAX; cnt++) {
180 scnprintf(buf + pos, bufsz - pos, "\t%25s\t\t: %u\n",
181 il_get_mgmt_string(cnt), il->rx_stats.mgmt[cnt]);
183 pos += scnprintf(buf + pos, bufsz - pos, "Control:\n");
184 for (cnt = 0; cnt < CONTROL_MAX; cnt++) {
186 scnprintf(buf + pos, bufsz - pos, "\t%25s\t\t: %u\n",
187 il_get_ctrl_string(cnt), il->rx_stats.ctrl[cnt]);
189 pos += scnprintf(buf + pos, bufsz - pos, "Data:\n");
191 scnprintf(buf + pos, bufsz - pos, "\tcnt: %u\n",
192 il->rx_stats.data_cnt);
194 scnprintf(buf + pos, bufsz - pos, "\tbytes: %llu\n",
195 il->rx_stats.data_bytes);
197 ret = simple_read_from_buffer(user_buf, count, ppos, buf, pos);
202 #define BYTE1_MASK 0x000000ff;
203 #define BYTE2_MASK 0x0000ffff;
204 #define BYTE3_MASK 0x00ffffff;
206 il_dbgfs_sram_read(struct file *file, char __user *user_buf, size_t count,
214 struct il_priv *il = file->private_data;
217 /* default is to dump the entire data segment */
218 if (!il->dbgfs_sram_offset && !il->dbgfs_sram_len) {
219 il->dbgfs_sram_offset = 0x800000;
220 if (il->ucode_type == UCODE_INIT)
221 il->dbgfs_sram_len = il->ucode_init_data.len;
223 il->dbgfs_sram_len = il->ucode_data.len;
225 bufsz = 30 + il->dbgfs_sram_len * sizeof(char) * 10;
226 buf = kmalloc(bufsz, GFP_KERNEL);
230 scnprintf(buf + pos, bufsz - pos, "sram_len: 0x%x\n",
233 scnprintf(buf + pos, bufsz - pos, "sram_offset: 0x%x\n",
234 il->dbgfs_sram_offset);
235 for (i = il->dbgfs_sram_len; i > 0; i -= 4) {
238 il->dbgfs_sram_offset +
239 il->dbgfs_sram_len - i);
254 pos += scnprintf(buf + pos, bufsz - pos, "\n");
255 pos += scnprintf(buf + pos, bufsz - pos, "0x%08x ", val);
257 pos += scnprintf(buf + pos, bufsz - pos, "\n");
259 ret = simple_read_from_buffer(user_buf, count, ppos, buf, pos);
265 il_dbgfs_sram_write(struct file *file, const char __user *user_buf,
266 size_t count, loff_t *ppos)
268 struct il_priv *il = file->private_data;
273 memset(buf, 0, sizeof(buf));
274 buf_size = min(count, sizeof(buf) - 1);
275 if (copy_from_user(buf, user_buf, buf_size))
278 if (sscanf(buf, "%x,%x", &offset, &len) == 2) {
279 il->dbgfs_sram_offset = offset;
280 il->dbgfs_sram_len = len;
282 il->dbgfs_sram_offset = 0;
283 il->dbgfs_sram_len = 0;
290 il_dbgfs_stations_read(struct file *file, char __user *user_buf, size_t count,
293 struct il_priv *il = file->private_data;
294 struct il_station_entry *station;
295 int max_sta = il->hw_params.max_stations;
299 /* Add 30 for initial string */
300 const size_t bufsz = 30 + sizeof(char) * 500 * (il->num_stations);
302 buf = kmalloc(bufsz, GFP_KERNEL);
307 scnprintf(buf + pos, bufsz - pos, "num of stations: %d\n\n",
310 for (i = 0; i < max_sta; i++) {
311 station = &il->stations[i];
315 scnprintf(buf + pos, bufsz - pos,
316 "station %d - addr: %pM, flags: %#x\n", i,
317 station->sta.sta.addr,
318 station->sta.station_flags_msk);
320 scnprintf(buf + pos, bufsz - pos,
321 "TID\tseq_num\ttxq_id\tframes\ttfds\t");
323 scnprintf(buf + pos, bufsz - pos,
324 "start_idx\tbitmap\t\t\trate_n_flags\n");
326 for (j = 0; j < MAX_TID_COUNT; j++) {
328 scnprintf(buf + pos, bufsz - pos,
329 "%d:\t%#x\t%#x\t%u\t%u\t%u\t\t%#.16llx\t%#x",
330 j, station->tid[j].seq_number,
331 station->tid[j].agg.txq_id,
332 station->tid[j].agg.frame_count,
333 station->tid[j].tfds_in_queue,
334 station->tid[j].agg.start_idx,
335 station->tid[j].agg.bitmap,
336 station->tid[j].agg.rate_n_flags);
338 if (station->tid[j].agg.wait_for_ba)
340 scnprintf(buf + pos, bufsz - pos,
342 pos += scnprintf(buf + pos, bufsz - pos, "\n");
345 pos += scnprintf(buf + pos, bufsz - pos, "\n");
348 ret = simple_read_from_buffer(user_buf, count, ppos, buf, pos);
354 il_dbgfs_nvm_read(struct file *file, char __user *user_buf, size_t count,
358 struct il_priv *il = file->private_data;
359 int pos = 0, ofs = 0, buf_size = 0;
363 size_t eeprom_len = il->cfg->base_params->eeprom_size;
364 buf_size = 4 * eeprom_len + 256;
366 if (eeprom_len % 16) {
367 IL_ERR("NVM size is not multiple of 16.\n");
373 IL_ERR("Invalid EEPROM memory\n");
377 /* 4 characters for byte 0xYY */
378 buf = kzalloc(buf_size, GFP_KERNEL);
380 IL_ERR("Can not allocate Buffer\n");
383 eeprom_ver = il_eeprom_query16(il, EEPROM_VERSION);
385 scnprintf(buf + pos, buf_size - pos, "EEPROM " "version: 0x%x\n",
387 for (ofs = 0; ofs < eeprom_len; ofs += 16) {
388 pos += scnprintf(buf + pos, buf_size - pos, "0x%.4x ", ofs);
389 hex_dump_to_buffer(ptr + ofs, 16, 16, 2, buf + pos,
391 pos += strlen(buf + pos);
392 if (buf_size - pos > 0)
396 ret = simple_read_from_buffer(user_buf, count, ppos, buf, pos);
402 il_dbgfs_channels_read(struct file *file, char __user *user_buf, size_t count,
405 struct il_priv *il = file->private_data;
406 struct ieee80211_channel *channels = NULL;
407 const struct ieee80211_supported_band *supp_band = NULL;
408 int pos = 0, i, bufsz = PAGE_SIZE;
412 if (!test_bit(S_GEO_CONFIGURED, &il->status))
415 buf = kzalloc(bufsz, GFP_KERNEL);
417 IL_ERR("Can not allocate Buffer\n");
421 supp_band = il_get_hw_mode(il, IEEE80211_BAND_2GHZ);
423 channels = supp_band->channels;
426 scnprintf(buf + pos, bufsz - pos,
427 "Displaying %d channels in 2.4GHz band 802.11bg):\n",
428 supp_band->n_channels);
430 for (i = 0; i < supp_band->n_channels; i++)
432 scnprintf(buf + pos, bufsz - pos,
433 "%d: %ddBm: BSS%s%s, %s.\n",
434 channels[i].hw_value,
435 channels[i].max_power,
437 flags & IEEE80211_CHAN_RADAR ?
438 " (IEEE 802.11h required)" : "",
440 flags & IEEE80211_CHAN_NO_IBSS) ||
442 flags & IEEE80211_CHAN_RADAR)) ? "" :
445 flags & IEEE80211_CHAN_PASSIVE_SCAN ?
446 "passive only" : "active/passive");
448 supp_band = il_get_hw_mode(il, IEEE80211_BAND_5GHZ);
450 channels = supp_band->channels;
453 scnprintf(buf + pos, bufsz - pos,
454 "Displaying %d channels in 5.2GHz band (802.11a)\n",
455 supp_band->n_channels);
457 for (i = 0; i < supp_band->n_channels; i++)
459 scnprintf(buf + pos, bufsz - pos,
460 "%d: %ddBm: BSS%s%s, %s.\n",
461 channels[i].hw_value,
462 channels[i].max_power,
464 flags & IEEE80211_CHAN_RADAR ?
465 " (IEEE 802.11h required)" : "",
467 flags & IEEE80211_CHAN_NO_IBSS) ||
469 flags & IEEE80211_CHAN_RADAR)) ? "" :
472 flags & IEEE80211_CHAN_PASSIVE_SCAN ?
473 "passive only" : "active/passive");
475 ret = simple_read_from_buffer(user_buf, count, ppos, buf, pos);
481 il_dbgfs_status_read(struct file *file, char __user *user_buf, size_t count,
485 struct il_priv *il = file->private_data;
488 const size_t bufsz = sizeof(buf);
491 scnprintf(buf + pos, bufsz - pos, "S_HCMD_ACTIVE:\t %d\n",
492 test_bit(S_HCMD_ACTIVE, &il->status));
494 scnprintf(buf + pos, bufsz - pos, "S_INT_ENABLED:\t %d\n",
495 test_bit(S_INT_ENABLED, &il->status));
497 scnprintf(buf + pos, bufsz - pos, "S_RF_KILL_HW:\t %d\n",
498 test_bit(S_RF_KILL_HW, &il->status));
500 scnprintf(buf + pos, bufsz - pos, "S_CT_KILL:\t\t %d\n",
501 test_bit(S_CT_KILL, &il->status));
503 scnprintf(buf + pos, bufsz - pos, "S_INIT:\t\t %d\n",
504 test_bit(S_INIT, &il->status));
506 scnprintf(buf + pos, bufsz - pos, "S_ALIVE:\t\t %d\n",
507 test_bit(S_ALIVE, &il->status));
509 scnprintf(buf + pos, bufsz - pos, "S_READY:\t\t %d\n",
510 test_bit(S_READY, &il->status));
512 scnprintf(buf + pos, bufsz - pos, "S_TEMPERATURE:\t %d\n",
513 test_bit(S_TEMPERATURE, &il->status));
515 scnprintf(buf + pos, bufsz - pos, "S_GEO_CONFIGURED:\t %d\n",
516 test_bit(S_GEO_CONFIGURED, &il->status));
518 scnprintf(buf + pos, bufsz - pos, "S_EXIT_PENDING:\t %d\n",
519 test_bit(S_EXIT_PENDING, &il->status));
521 scnprintf(buf + pos, bufsz - pos, "S_STATS:\t %d\n",
522 test_bit(S_STATS, &il->status));
524 scnprintf(buf + pos, bufsz - pos, "S_SCANNING:\t %d\n",
525 test_bit(S_SCANNING, &il->status));
527 scnprintf(buf + pos, bufsz - pos, "S_SCAN_ABORTING:\t %d\n",
528 test_bit(S_SCAN_ABORTING, &il->status));
530 scnprintf(buf + pos, bufsz - pos, "S_SCAN_HW:\t\t %d\n",
531 test_bit(S_SCAN_HW, &il->status));
533 scnprintf(buf + pos, bufsz - pos, "S_POWER_PMI:\t %d\n",
534 test_bit(S_POWER_PMI, &il->status));
536 scnprintf(buf + pos, bufsz - pos, "S_FW_ERROR:\t %d\n",
537 test_bit(S_FW_ERROR, &il->status));
538 return simple_read_from_buffer(user_buf, count, ppos, buf, pos);
542 il_dbgfs_interrupt_read(struct file *file, char __user *user_buf, size_t count,
546 struct il_priv *il = file->private_data;
550 int bufsz = 24 * 64; /* 24 items * 64 char per item */
553 buf = kzalloc(bufsz, GFP_KERNEL);
555 IL_ERR("Can not allocate Buffer\n");
560 scnprintf(buf + pos, bufsz - pos, "Interrupt Statistics Report:\n");
563 scnprintf(buf + pos, bufsz - pos, "HW Error:\t\t\t %u\n",
566 scnprintf(buf + pos, bufsz - pos, "SW Error:\t\t\t %u\n",
568 if (il->isr_stats.sw || il->isr_stats.hw) {
570 scnprintf(buf + pos, bufsz - pos,
571 "\tLast Restarting Code: 0x%X\n",
572 il->isr_stats.err_code);
574 #ifdef CONFIG_IWLEGACY_DEBUG
576 scnprintf(buf + pos, bufsz - pos, "Frame transmitted:\t\t %u\n",
579 scnprintf(buf + pos, bufsz - pos, "Alive interrupt:\t\t %u\n",
580 il->isr_stats.alive);
583 scnprintf(buf + pos, bufsz - pos,
584 "HW RF KILL switch toggled:\t %u\n",
585 il->isr_stats.rfkill);
588 scnprintf(buf + pos, bufsz - pos, "CT KILL:\t\t\t %u\n",
589 il->isr_stats.ctkill);
592 scnprintf(buf + pos, bufsz - pos, "Wakeup Interrupt:\t\t %u\n",
593 il->isr_stats.wakeup);
596 scnprintf(buf + pos, bufsz - pos, "Rx command responses:\t\t %u\n",
598 for (cnt = 0; cnt < IL_CN_MAX; cnt++) {
599 if (il->isr_stats.handlers[cnt] > 0)
601 scnprintf(buf + pos, bufsz - pos,
602 "\tRx handler[%36s]:\t\t %u\n",
603 il_get_cmd_string(cnt),
604 il->isr_stats.handlers[cnt]);
608 scnprintf(buf + pos, bufsz - pos, "Tx/FH interrupt:\t\t %u\n",
612 scnprintf(buf + pos, bufsz - pos, "Unexpected INTA:\t\t %u\n",
613 il->isr_stats.unhandled);
615 ret = simple_read_from_buffer(user_buf, count, ppos, buf, pos);
621 il_dbgfs_interrupt_write(struct file *file, const char __user *user_buf,
622 size_t count, loff_t *ppos)
624 struct il_priv *il = file->private_data;
629 memset(buf, 0, sizeof(buf));
630 buf_size = min(count, sizeof(buf) - 1);
631 if (copy_from_user(buf, user_buf, buf_size))
633 if (sscanf(buf, "%x", &reset_flag) != 1)
636 il_clear_isr_stats(il);
642 il_dbgfs_qos_read(struct file *file, char __user *user_buf, size_t count,
645 struct il_priv *il = file->private_data;
646 struct il_rxon_context *ctx = &il->ctx;
649 const size_t bufsz = sizeof(buf);
651 pos += scnprintf(buf + pos, bufsz - pos, "context %d:\n", ctx->ctxid);
652 for (i = 0; i < AC_NUM; i++) {
654 scnprintf(buf + pos, bufsz - pos,
655 "\tcw_min\tcw_max\taifsn\ttxop\n");
657 scnprintf(buf + pos, bufsz - pos,
658 "AC[%d]\t%u\t%u\t%u\t%u\n", i,
659 ctx->qos_data.def_qos_parm.ac[i].cw_min,
660 ctx->qos_data.def_qos_parm.ac[i].cw_max,
661 ctx->qos_data.def_qos_parm.ac[i].aifsn,
662 ctx->qos_data.def_qos_parm.ac[i].edca_txop);
665 return simple_read_from_buffer(user_buf, count, ppos, buf, pos);
669 il_dbgfs_disable_ht40_write(struct file *file, const char __user *user_buf,
670 size_t count, loff_t *ppos)
672 struct il_priv *il = file->private_data;
677 memset(buf, 0, sizeof(buf));
678 buf_size = min(count, sizeof(buf) - 1);
679 if (copy_from_user(buf, user_buf, buf_size))
681 if (sscanf(buf, "%d", &ht40) != 1)
683 if (!il_is_any_associated(il))
684 il->disable_ht40 = ht40 ? true : false;
686 IL_ERR("Sta associated with AP - "
687 "Change to 40MHz channel support is not allowed\n");
695 il_dbgfs_disable_ht40_read(struct file *file, char __user *user_buf,
696 size_t count, loff_t *ppos)
698 struct il_priv *il = file->private_data;
701 const size_t bufsz = sizeof(buf);
704 scnprintf(buf + pos, bufsz - pos, "11n 40MHz Mode: %s\n",
705 il->disable_ht40 ? "Disabled" : "Enabled");
706 return simple_read_from_buffer(user_buf, count, ppos, buf, pos);
709 DEBUGFS_READ_WRITE_FILE_OPS(sram);
710 DEBUGFS_READ_FILE_OPS(nvm);
711 DEBUGFS_READ_FILE_OPS(stations);
712 DEBUGFS_READ_FILE_OPS(channels);
713 DEBUGFS_READ_FILE_OPS(status);
714 DEBUGFS_READ_WRITE_FILE_OPS(interrupt);
715 DEBUGFS_READ_FILE_OPS(qos);
716 DEBUGFS_READ_WRITE_FILE_OPS(disable_ht40);
719 il_dbgfs_traffic_log_read(struct file *file, char __user *user_buf,
720 size_t count, loff_t *ppos)
722 struct il_priv *il = file->private_data;
723 int pos = 0, ofs = 0;
725 struct il_tx_queue *txq;
727 struct il_rx_queue *rxq = &il->rxq;
730 ((IL_TRAFFIC_ENTRIES * IL_TRAFFIC_ENTRY_SIZE * 64) * 2) +
731 (il->cfg->base_params->num_of_queues * 32 * 8) + 400;
736 IL_ERR("txq not ready\n");
739 buf = kzalloc(bufsz, GFP_KERNEL);
741 IL_ERR("Can not allocate buffer\n");
744 pos += scnprintf(buf + pos, bufsz - pos, "Tx Queue\n");
745 for (cnt = 0; cnt < il->hw_params.max_txq_num; cnt++) {
749 scnprintf(buf + pos, bufsz - pos,
750 "q[%d]: read_ptr: %u, write_ptr: %u\n", cnt,
751 q->read_ptr, q->write_ptr);
753 if (il->tx_traffic && (il_debug_level & IL_DL_TX)) {
754 ptr = il->tx_traffic;
756 scnprintf(buf + pos, bufsz - pos, "Tx Traffic idx: %u\n",
758 for (cnt = 0, ofs = 0; cnt < IL_TRAFFIC_ENTRIES; cnt++) {
759 for (entry = 0; entry < IL_TRAFFIC_ENTRY_SIZE / 16;
760 entry++, ofs += 16) {
762 scnprintf(buf + pos, bufsz - pos, "0x%.4x ",
764 hex_dump_to_buffer(ptr + ofs, 16, 16, 2,
765 buf + pos, bufsz - pos, 0);
766 pos += strlen(buf + pos);
773 pos += scnprintf(buf + pos, bufsz - pos, "Rx Queue\n");
775 scnprintf(buf + pos, bufsz - pos, "read: %u, write: %u\n",
776 rxq->read, rxq->write);
778 if (il->rx_traffic && (il_debug_level & IL_DL_RX)) {
779 ptr = il->rx_traffic;
781 scnprintf(buf + pos, bufsz - pos, "Rx Traffic idx: %u\n",
783 for (cnt = 0, ofs = 0; cnt < IL_TRAFFIC_ENTRIES; cnt++) {
784 for (entry = 0; entry < IL_TRAFFIC_ENTRY_SIZE / 16;
785 entry++, ofs += 16) {
787 scnprintf(buf + pos, bufsz - pos, "0x%.4x ",
789 hex_dump_to_buffer(ptr + ofs, 16, 16, 2,
790 buf + pos, bufsz - pos, 0);
791 pos += strlen(buf + pos);
798 ret = simple_read_from_buffer(user_buf, count, ppos, buf, pos);
804 il_dbgfs_traffic_log_write(struct file *file, const char __user *user_buf,
805 size_t count, loff_t *ppos)
807 struct il_priv *il = file->private_data;
812 memset(buf, 0, sizeof(buf));
813 buf_size = min(count, sizeof(buf) - 1);
814 if (copy_from_user(buf, user_buf, buf_size))
816 if (sscanf(buf, "%d", &traffic_log) != 1)
818 if (traffic_log == 0)
819 il_reset_traffic_log(il);
825 il_dbgfs_tx_queue_read(struct file *file, char __user *user_buf, size_t count,
829 struct il_priv *il = file->private_data;
830 struct il_tx_queue *txq;
837 sizeof(char) * 64 * il->cfg->base_params->num_of_queues;
840 IL_ERR("txq not ready\n");
843 buf = kzalloc(bufsz, GFP_KERNEL);
847 for (cnt = 0; cnt < il->hw_params.max_txq_num; cnt++) {
851 scnprintf(buf + pos, bufsz - pos,
852 "hwq %.2d: read=%u write=%u stop=%d"
853 " swq_id=%#.2x (ac %d/hwq %d)\n", cnt,
854 q->read_ptr, q->write_ptr,
855 !!test_bit(cnt, il->queue_stopped),
856 txq->swq_id, txq->swq_id & 3,
857 (txq->swq_id >> 2) & 0x1f);
860 /* for the ACs, display the stop count too */
862 scnprintf(buf + pos, bufsz - pos,
864 atomic_read(&il->queue_stop_count[cnt]));
866 ret = simple_read_from_buffer(user_buf, count, ppos, buf, pos);
872 il_dbgfs_rx_queue_read(struct file *file, char __user *user_buf, size_t count,
876 struct il_priv *il = file->private_data;
877 struct il_rx_queue *rxq = &il->rxq;
880 const size_t bufsz = sizeof(buf);
882 pos += scnprintf(buf + pos, bufsz - pos, "read: %u\n", rxq->read);
883 pos += scnprintf(buf + pos, bufsz - pos, "write: %u\n", rxq->write);
885 scnprintf(buf + pos, bufsz - pos, "free_count: %u\n",
889 scnprintf(buf + pos, bufsz - pos, "closed_rb_num: %u\n",
890 le16_to_cpu(rxq->rb_stts->
891 closed_rb_num) & 0x0FFF);
894 scnprintf(buf + pos, bufsz - pos,
895 "closed_rb_num: Not Allocated\n");
897 return simple_read_from_buffer(user_buf, count, ppos, buf, pos);
901 il_dbgfs_ucode_rx_stats_read(struct file *file, char __user *user_buf,
902 size_t count, loff_t *ppos)
904 struct il_priv *il = file->private_data;
905 return il->cfg->ops->lib->debugfs_ops.rx_stats_read(file, user_buf,
910 il_dbgfs_ucode_tx_stats_read(struct file *file, char __user *user_buf,
911 size_t count, loff_t *ppos)
913 struct il_priv *il = file->private_data;
914 return il->cfg->ops->lib->debugfs_ops.tx_stats_read(file, user_buf,
919 il_dbgfs_ucode_general_stats_read(struct file *file, char __user *user_buf,
920 size_t count, loff_t *ppos)
922 struct il_priv *il = file->private_data;
923 return il->cfg->ops->lib->debugfs_ops.general_stats_read(file, user_buf,
928 il_dbgfs_sensitivity_read(struct file *file, char __user *user_buf,
929 size_t count, loff_t *ppos)
932 struct il_priv *il = file->private_data;
936 int bufsz = sizeof(struct il_sensitivity_data) * 4 + 100;
938 struct il_sensitivity_data *data;
940 data = &il->sensitivity_data;
941 buf = kzalloc(bufsz, GFP_KERNEL);
943 IL_ERR("Can not allocate Buffer\n");
948 scnprintf(buf + pos, bufsz - pos, "auto_corr_ofdm:\t\t\t %u\n",
949 data->auto_corr_ofdm);
951 scnprintf(buf + pos, bufsz - pos, "auto_corr_ofdm_mrc:\t\t %u\n",
952 data->auto_corr_ofdm_mrc);
954 scnprintf(buf + pos, bufsz - pos, "auto_corr_ofdm_x1:\t\t %u\n",
955 data->auto_corr_ofdm_x1);
957 scnprintf(buf + pos, bufsz - pos, "auto_corr_ofdm_mrc_x1:\t\t %u\n",
958 data->auto_corr_ofdm_mrc_x1);
960 scnprintf(buf + pos, bufsz - pos, "auto_corr_cck:\t\t\t %u\n",
961 data->auto_corr_cck);
963 scnprintf(buf + pos, bufsz - pos, "auto_corr_cck_mrc:\t\t %u\n",
964 data->auto_corr_cck_mrc);
966 scnprintf(buf + pos, bufsz - pos,
967 "last_bad_plcp_cnt_ofdm:\t\t %u\n",
968 data->last_bad_plcp_cnt_ofdm);
970 scnprintf(buf + pos, bufsz - pos, "last_fa_cnt_ofdm:\t\t %u\n",
971 data->last_fa_cnt_ofdm);
973 scnprintf(buf + pos, bufsz - pos, "last_bad_plcp_cnt_cck:\t\t %u\n",
974 data->last_bad_plcp_cnt_cck);
976 scnprintf(buf + pos, bufsz - pos, "last_fa_cnt_cck:\t\t %u\n",
977 data->last_fa_cnt_cck);
979 scnprintf(buf + pos, bufsz - pos, "nrg_curr_state:\t\t\t %u\n",
980 data->nrg_curr_state);
982 scnprintf(buf + pos, bufsz - pos, "nrg_prev_state:\t\t\t %u\n",
983 data->nrg_prev_state);
984 pos += scnprintf(buf + pos, bufsz - pos, "nrg_value:\t\t\t");
985 for (cnt = 0; cnt < 10; cnt++) {
987 scnprintf(buf + pos, bufsz - pos, " %u",
988 data->nrg_value[cnt]);
990 pos += scnprintf(buf + pos, bufsz - pos, "\n");
991 pos += scnprintf(buf + pos, bufsz - pos, "nrg_silence_rssi:\t\t");
992 for (cnt = 0; cnt < NRG_NUM_PREV_STAT_L; cnt++) {
994 scnprintf(buf + pos, bufsz - pos, " %u",
995 data->nrg_silence_rssi[cnt]);
997 pos += scnprintf(buf + pos, bufsz - pos, "\n");
999 scnprintf(buf + pos, bufsz - pos, "nrg_silence_ref:\t\t %u\n",
1000 data->nrg_silence_ref);
1002 scnprintf(buf + pos, bufsz - pos, "nrg_energy_idx:\t\t\t %u\n",
1003 data->nrg_energy_idx);
1005 scnprintf(buf + pos, bufsz - pos, "nrg_silence_idx:\t\t %u\n",
1006 data->nrg_silence_idx);
1008 scnprintf(buf + pos, bufsz - pos, "nrg_th_cck:\t\t\t %u\n",
1011 scnprintf(buf + pos, bufsz - pos,
1012 "nrg_auto_corr_silence_diff:\t %u\n",
1013 data->nrg_auto_corr_silence_diff);
1015 scnprintf(buf + pos, bufsz - pos, "num_in_cck_no_fa:\t\t %u\n",
1016 data->num_in_cck_no_fa);
1018 scnprintf(buf + pos, bufsz - pos, "nrg_th_ofdm:\t\t\t %u\n",
1021 ret = simple_read_from_buffer(user_buf, count, ppos, buf, pos);
1027 il_dbgfs_chain_noise_read(struct file *file, char __user *user_buf,
1028 size_t count, loff_t *ppos)
1031 struct il_priv *il = file->private_data;
1035 int bufsz = sizeof(struct il_chain_noise_data) * 4 + 100;
1037 struct il_chain_noise_data *data;
1039 data = &il->chain_noise_data;
1040 buf = kzalloc(bufsz, GFP_KERNEL);
1042 IL_ERR("Can not allocate Buffer\n");
1047 scnprintf(buf + pos, bufsz - pos, "active_chains:\t\t\t %u\n",
1048 data->active_chains);
1050 scnprintf(buf + pos, bufsz - pos, "chain_noise_a:\t\t\t %u\n",
1051 data->chain_noise_a);
1053 scnprintf(buf + pos, bufsz - pos, "chain_noise_b:\t\t\t %u\n",
1054 data->chain_noise_b);
1056 scnprintf(buf + pos, bufsz - pos, "chain_noise_c:\t\t\t %u\n",
1057 data->chain_noise_c);
1059 scnprintf(buf + pos, bufsz - pos, "chain_signal_a:\t\t\t %u\n",
1060 data->chain_signal_a);
1062 scnprintf(buf + pos, bufsz - pos, "chain_signal_b:\t\t\t %u\n",
1063 data->chain_signal_b);
1065 scnprintf(buf + pos, bufsz - pos, "chain_signal_c:\t\t\t %u\n",
1066 data->chain_signal_c);
1068 scnprintf(buf + pos, bufsz - pos, "beacon_count:\t\t\t %u\n",
1069 data->beacon_count);
1071 pos += scnprintf(buf + pos, bufsz - pos, "disconn_array:\t\t\t");
1072 for (cnt = 0; cnt < NUM_RX_CHAINS; cnt++) {
1074 scnprintf(buf + pos, bufsz - pos, " %u",
1075 data->disconn_array[cnt]);
1077 pos += scnprintf(buf + pos, bufsz - pos, "\n");
1078 pos += scnprintf(buf + pos, bufsz - pos, "delta_gain_code:\t\t");
1079 for (cnt = 0; cnt < NUM_RX_CHAINS; cnt++) {
1081 scnprintf(buf + pos, bufsz - pos, " %u",
1082 data->delta_gain_code[cnt]);
1084 pos += scnprintf(buf + pos, bufsz - pos, "\n");
1086 scnprintf(buf + pos, bufsz - pos, "radio_write:\t\t\t %u\n",
1089 scnprintf(buf + pos, bufsz - pos, "state:\t\t\t\t %u\n",
1092 ret = simple_read_from_buffer(user_buf, count, ppos, buf, pos);
1098 il_dbgfs_power_save_status_read(struct file *file, char __user *user_buf,
1099 size_t count, loff_t *ppos)
1101 struct il_priv *il = file->private_data;
1104 const size_t bufsz = sizeof(buf);
1108 _il_rd(il, CSR_GP_CNTRL) & CSR_GP_REG_POWER_SAVE_STATUS_MSK;
1110 pos += scnprintf(buf + pos, bufsz - pos, "Power Save Status: ");
1112 scnprintf(buf + pos, bufsz - pos, "%s\n",
1113 (pwrsave_status == CSR_GP_REG_NO_POWER_SAVE) ? "none" :
1114 (pwrsave_status == CSR_GP_REG_MAC_POWER_SAVE) ? "MAC" :
1115 (pwrsave_status == CSR_GP_REG_PHY_POWER_SAVE) ? "PHY" :
1118 return simple_read_from_buffer(user_buf, count, ppos, buf, pos);
1122 il_dbgfs_clear_ucode_stats_write(struct file *file,
1123 const char __user *user_buf, size_t count,
1126 struct il_priv *il = file->private_data;
1131 memset(buf, 0, sizeof(buf));
1132 buf_size = min(count, sizeof(buf) - 1);
1133 if (copy_from_user(buf, user_buf, buf_size))
1135 if (sscanf(buf, "%d", &clear) != 1)
1138 /* make request to uCode to retrieve stats information */
1139 mutex_lock(&il->mutex);
1140 il_send_stats_request(il, CMD_SYNC, true);
1141 mutex_unlock(&il->mutex);
1147 il_dbgfs_rxon_flags_read(struct file *file, char __user *user_buf,
1148 size_t count, loff_t *ppos)
1151 struct il_priv *il = file->private_data;
1155 len = sprintf(buf, "0x%04X\n", le32_to_cpu(il->ctx.active.flags));
1156 return simple_read_from_buffer(user_buf, count, ppos, buf, len);
1160 il_dbgfs_rxon_filter_flags_read(struct file *file, char __user *user_buf,
1161 size_t count, loff_t *ppos)
1164 struct il_priv *il = file->private_data;
1169 sprintf(buf, "0x%04X\n", le32_to_cpu(il->ctx.active.filter_flags));
1170 return simple_read_from_buffer(user_buf, count, ppos, buf, len);
1174 il_dbgfs_fh_reg_read(struct file *file, char __user *user_buf, size_t count,
1177 struct il_priv *il = file->private_data;
1180 ssize_t ret = -EFAULT;
1182 if (il->cfg->ops->lib->dump_fh) {
1183 ret = pos = il->cfg->ops->lib->dump_fh(il, &buf, true);
1186 simple_read_from_buffer(user_buf, count, ppos, buf,
1196 il_dbgfs_missed_beacon_read(struct file *file, char __user *user_buf,
1197 size_t count, loff_t *ppos)
1200 struct il_priv *il = file->private_data;
1203 const size_t bufsz = sizeof(buf);
1206 scnprintf(buf + pos, bufsz - pos, "%d\n",
1207 il->missed_beacon_threshold);
1209 return simple_read_from_buffer(user_buf, count, ppos, buf, pos);
1213 il_dbgfs_missed_beacon_write(struct file *file, const char __user *user_buf,
1214 size_t count, loff_t *ppos)
1216 struct il_priv *il = file->private_data;
1221 memset(buf, 0, sizeof(buf));
1222 buf_size = min(count, sizeof(buf) - 1);
1223 if (copy_from_user(buf, user_buf, buf_size))
1225 if (sscanf(buf, "%d", &missed) != 1)
1228 if (missed < IL_MISSED_BEACON_THRESHOLD_MIN ||
1229 missed > IL_MISSED_BEACON_THRESHOLD_MAX)
1230 il->missed_beacon_threshold = IL_MISSED_BEACON_THRESHOLD_DEF;
1232 il->missed_beacon_threshold = missed;
1238 il_dbgfs_force_reset_read(struct file *file, char __user *user_buf,
1239 size_t count, loff_t *ppos)
1242 struct il_priv *il = file->private_data;
1245 const size_t bufsz = sizeof(buf);
1246 struct il_force_reset *force_reset;
1248 force_reset = &il->force_reset;
1251 scnprintf(buf + pos, bufsz - pos, "\tnumber of reset request: %d\n",
1252 force_reset->reset_request_count);
1254 scnprintf(buf + pos, bufsz - pos,
1255 "\tnumber of reset request success: %d\n",
1256 force_reset->reset_success_count);
1258 scnprintf(buf + pos, bufsz - pos,
1259 "\tnumber of reset request reject: %d\n",
1260 force_reset->reset_reject_count);
1262 scnprintf(buf + pos, bufsz - pos, "\treset duration: %lu\n",
1263 force_reset->reset_duration);
1265 return simple_read_from_buffer(user_buf, count, ppos, buf, pos);
1269 il_dbgfs_force_reset_write(struct file *file, const char __user *user_buf,
1270 size_t count, loff_t *ppos)
1274 struct il_priv *il = file->private_data;
1276 ret = il_force_reset(il, true);
1278 return ret ? ret : count;
1282 il_dbgfs_wd_timeout_write(struct file *file, const char __user *user_buf,
1283 size_t count, loff_t *ppos)
1286 struct il_priv *il = file->private_data;
1291 memset(buf, 0, sizeof(buf));
1292 buf_size = min(count, sizeof(buf) - 1);
1293 if (copy_from_user(buf, user_buf, buf_size))
1295 if (sscanf(buf, "%d", &timeout) != 1)
1297 if (timeout < 0 || timeout > IL_MAX_WD_TIMEOUT)
1298 timeout = IL_DEF_WD_TIMEOUT;
1300 il->cfg->base_params->wd_timeout = timeout;
1301 il_setup_watchdog(il);
1305 DEBUGFS_READ_FILE_OPS(rx_stats);
1306 DEBUGFS_READ_FILE_OPS(tx_stats);
1307 DEBUGFS_READ_WRITE_FILE_OPS(traffic_log);
1308 DEBUGFS_READ_FILE_OPS(rx_queue);
1309 DEBUGFS_READ_FILE_OPS(tx_queue);
1310 DEBUGFS_READ_FILE_OPS(ucode_rx_stats);
1311 DEBUGFS_READ_FILE_OPS(ucode_tx_stats);
1312 DEBUGFS_READ_FILE_OPS(ucode_general_stats);
1313 DEBUGFS_READ_FILE_OPS(sensitivity);
1314 DEBUGFS_READ_FILE_OPS(chain_noise);
1315 DEBUGFS_READ_FILE_OPS(power_save_status);
1316 DEBUGFS_WRITE_FILE_OPS(clear_ucode_stats);
1317 DEBUGFS_WRITE_FILE_OPS(clear_traffic_stats);
1318 DEBUGFS_READ_FILE_OPS(fh_reg);
1319 DEBUGFS_READ_WRITE_FILE_OPS(missed_beacon);
1320 DEBUGFS_READ_WRITE_FILE_OPS(force_reset);
1321 DEBUGFS_READ_FILE_OPS(rxon_flags);
1322 DEBUGFS_READ_FILE_OPS(rxon_filter_flags);
1323 DEBUGFS_WRITE_FILE_OPS(wd_timeout);
1326 * Create the debugfs files and directories
1330 il_dbgfs_register(struct il_priv *il, const char *name)
1332 struct dentry *phyd = il->hw->wiphy->debugfsdir;
1333 struct dentry *dir_drv, *dir_data, *dir_rf, *dir_debug;
1335 dir_drv = debugfs_create_dir(name, phyd);
1339 il->debugfs_dir = dir_drv;
1341 dir_data = debugfs_create_dir("data", dir_drv);
1344 dir_rf = debugfs_create_dir("rf", dir_drv);
1347 dir_debug = debugfs_create_dir("debug", dir_drv);
1351 DEBUGFS_ADD_FILE(nvm, dir_data, S_IRUSR);
1352 DEBUGFS_ADD_FILE(sram, dir_data, S_IWUSR | S_IRUSR);
1353 DEBUGFS_ADD_FILE(stations, dir_data, S_IRUSR);
1354 DEBUGFS_ADD_FILE(channels, dir_data, S_IRUSR);
1355 DEBUGFS_ADD_FILE(status, dir_data, S_IRUSR);
1356 DEBUGFS_ADD_FILE(interrupt, dir_data, S_IWUSR | S_IRUSR);
1357 DEBUGFS_ADD_FILE(qos, dir_data, S_IRUSR);
1358 DEBUGFS_ADD_FILE(disable_ht40, dir_data, S_IWUSR | S_IRUSR);
1359 DEBUGFS_ADD_FILE(rx_stats, dir_debug, S_IRUSR);
1360 DEBUGFS_ADD_FILE(tx_stats, dir_debug, S_IRUSR);
1361 DEBUGFS_ADD_FILE(traffic_log, dir_debug, S_IWUSR | S_IRUSR);
1362 DEBUGFS_ADD_FILE(rx_queue, dir_debug, S_IRUSR);
1363 DEBUGFS_ADD_FILE(tx_queue, dir_debug, S_IRUSR);
1364 DEBUGFS_ADD_FILE(power_save_status, dir_debug, S_IRUSR);
1365 DEBUGFS_ADD_FILE(clear_ucode_stats, dir_debug, S_IWUSR);
1366 DEBUGFS_ADD_FILE(clear_traffic_stats, dir_debug, S_IWUSR);
1367 DEBUGFS_ADD_FILE(fh_reg, dir_debug, S_IRUSR);
1368 DEBUGFS_ADD_FILE(missed_beacon, dir_debug, S_IWUSR);
1369 DEBUGFS_ADD_FILE(force_reset, dir_debug, S_IWUSR | S_IRUSR);
1370 DEBUGFS_ADD_FILE(ucode_rx_stats, dir_debug, S_IRUSR);
1371 DEBUGFS_ADD_FILE(ucode_tx_stats, dir_debug, S_IRUSR);
1372 DEBUGFS_ADD_FILE(ucode_general_stats, dir_debug, S_IRUSR);
1374 if (il->cfg->base_params->sensitivity_calib_by_driver)
1375 DEBUGFS_ADD_FILE(sensitivity, dir_debug, S_IRUSR);
1376 if (il->cfg->base_params->chain_noise_calib_by_driver)
1377 DEBUGFS_ADD_FILE(chain_noise, dir_debug, S_IRUSR);
1378 DEBUGFS_ADD_FILE(rxon_flags, dir_debug, S_IWUSR);
1379 DEBUGFS_ADD_FILE(rxon_filter_flags, dir_debug, S_IWUSR);
1380 DEBUGFS_ADD_FILE(wd_timeout, dir_debug, S_IWUSR);
1381 if (il->cfg->base_params->sensitivity_calib_by_driver)
1382 DEBUGFS_ADD_BOOL(disable_sensitivity, dir_rf,
1383 &il->disable_sens_cal);
1384 if (il->cfg->base_params->chain_noise_calib_by_driver)
1385 DEBUGFS_ADD_BOOL(disable_chain_noise, dir_rf,
1386 &il->disable_chain_noise_cal);
1387 DEBUGFS_ADD_BOOL(disable_tx_power, dir_rf, &il->disable_tx_power_cal);
1391 IL_ERR("Can't create the debugfs directory\n");
1392 il_dbgfs_unregister(il);
1395 EXPORT_SYMBOL(il_dbgfs_register);
1398 * Remove the debugfs files and directories
1402 il_dbgfs_unregister(struct il_priv *il)
1404 if (!il->debugfs_dir)
1407 debugfs_remove_recursive(il->debugfs_dir);
1408 il->debugfs_dir = NULL;
1410 EXPORT_SYMBOL(il_dbgfs_unregister);