iwl-debugfs.c revision 1f44780827c6bbbcd1f12d5c6b6ce84f49a96bc0
1712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler/****************************************************************************** 2712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler * 3712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler * GPL LICENSE SUMMARY 4712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler * 51f44780827c6bbbcd1f12d5c6b6ce84f49a96bc0Reinette Chatre * Copyright(c) 2008 - 2010 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: 25759ef89fb096c4a6ef078d3cfd5682ac037bd789Winkler, Tomas * Intel Linux Wireless <ilw@linux.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" 415225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy#include "iwl-calib.h" 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 5043e851157adb966dd633e983b24040f72877737eWey-Yi Guy#define DEBUGFS_ADD_FILE(name, parent, mode) do { \ 51712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler dbgfs->dbgfs_##parent##_files.file_##name = \ 5243e851157adb966dd633e983b24040f72877737eWey-Yi Guy debugfs_create_file(#name, mode, \ 53fcf89d05404dafcde581d44dfa89bd8c8def27f9Reinette Chatre dbgfs->dir_##parent, priv, \ 54712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler &iwl_dbgfs_##name##_ops); \ 55712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler if (!(dbgfs->dbgfs_##parent##_files.file_##name)) \ 56712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler goto err; \ 57712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler} while (0) 58712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 59445c2dff409ef9de5d2f964d20917ab238fd266fTomas Winkler#define DEBUGFS_ADD_BOOL(name, parent, ptr) do { \ 60445c2dff409ef9de5d2f964d20917ab238fd266fTomas Winkler dbgfs->dbgfs_##parent##_files.file_##name = \ 61fcf89d05404dafcde581d44dfa89bd8c8def27f9Reinette Chatre debugfs_create_bool(#name, S_IWUSR | S_IRUSR, \ 62fcf89d05404dafcde581d44dfa89bd8c8def27f9Reinette Chatre dbgfs->dir_##parent, ptr); \ 639b24001db145cf1da76a479918373c18aa10bb4bZhaolei if (IS_ERR(dbgfs->dbgfs_##parent##_files.file_##name) \ 649b24001db145cf1da76a479918373c18aa10bb4bZhaolei || !dbgfs->dbgfs_##parent##_files.file_##name) \ 65445c2dff409ef9de5d2f964d20917ab238fd266fTomas Winkler goto err; \ 66445c2dff409ef9de5d2f964d20917ab238fd266fTomas Winkler} while (0) 67445c2dff409ef9de5d2f964d20917ab238fd266fTomas Winkler 682ddfa129bbf3dca708ffb0eb29d08de32cacd547Winkler, Tomas#define DEBUGFS_ADD_X32(name, parent, ptr) do { \ 692ddfa129bbf3dca708ffb0eb29d08de32cacd547Winkler, Tomas dbgfs->dbgfs_##parent##_files.file_##name = \ 70fcf89d05404dafcde581d44dfa89bd8c8def27f9Reinette Chatre debugfs_create_x32(#name, S_IRUSR, dbgfs->dir_##parent, ptr); \ 712ddfa129bbf3dca708ffb0eb29d08de32cacd547Winkler, Tomas if (IS_ERR(dbgfs->dbgfs_##parent##_files.file_##name) \ 722ddfa129bbf3dca708ffb0eb29d08de32cacd547Winkler, Tomas || !dbgfs->dbgfs_##parent##_files.file_##name) \ 732ddfa129bbf3dca708ffb0eb29d08de32cacd547Winkler, Tomas goto err; \ 742ddfa129bbf3dca708ffb0eb29d08de32cacd547Winkler, Tomas} while (0) 752ddfa129bbf3dca708ffb0eb29d08de32cacd547Winkler, Tomas 76712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler#define DEBUGFS_REMOVE(name) do { \ 77712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler debugfs_remove(name); \ 78712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler name = NULL; \ 79712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler} while (0); 80712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 81712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler/* file operation */ 82712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler#define DEBUGFS_READ_FUNC(name) \ 83712b6cf57a53da608a682b5f782c5785bda76001Tomas Winklerstatic ssize_t iwl_dbgfs_##name##_read(struct file *file, \ 84712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler char __user *user_buf, \ 85712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler size_t count, loff_t *ppos); 86712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 87712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler#define DEBUGFS_WRITE_FUNC(name) \ 88712b6cf57a53da608a682b5f782c5785bda76001Tomas Winklerstatic ssize_t iwl_dbgfs_##name##_write(struct file *file, \ 89712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler const char __user *user_buf, \ 90712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler size_t count, loff_t *ppos); 91712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 92712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 93712b6cf57a53da608a682b5f782c5785bda76001Tomas Winklerstatic int iwl_dbgfs_open_file_generic(struct inode *inode, struct file *file) 94712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler{ 95712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler file->private_data = inode->i_private; 96712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler return 0; 97712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler} 98712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 99712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler#define DEBUGFS_READ_FILE_OPS(name) \ 100712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler DEBUGFS_READ_FUNC(name); \ 101712b6cf57a53da608a682b5f782c5785bda76001Tomas Winklerstatic const struct file_operations iwl_dbgfs_##name##_ops = { \ 102712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler .read = iwl_dbgfs_##name##_read, \ 103712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler .open = iwl_dbgfs_open_file_generic, \ 104712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler}; 105712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 106189a2b5942d62bd18e1e01772c4c784253f5dd16Ester Kummer#define DEBUGFS_WRITE_FILE_OPS(name) \ 107189a2b5942d62bd18e1e01772c4c784253f5dd16Ester Kummer DEBUGFS_WRITE_FUNC(name); \ 108189a2b5942d62bd18e1e01772c4c784253f5dd16Ester Kummerstatic const struct file_operations iwl_dbgfs_##name##_ops = { \ 109189a2b5942d62bd18e1e01772c4c784253f5dd16Ester Kummer .write = iwl_dbgfs_##name##_write, \ 110189a2b5942d62bd18e1e01772c4c784253f5dd16Ester Kummer .open = iwl_dbgfs_open_file_generic, \ 111189a2b5942d62bd18e1e01772c4c784253f5dd16Ester Kummer}; 112189a2b5942d62bd18e1e01772c4c784253f5dd16Ester Kummer 113189a2b5942d62bd18e1e01772c4c784253f5dd16Ester Kummer 114712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler#define DEBUGFS_READ_WRITE_FILE_OPS(name) \ 115712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler DEBUGFS_READ_FUNC(name); \ 116712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler DEBUGFS_WRITE_FUNC(name); \ 117712b6cf57a53da608a682b5f782c5785bda76001Tomas Winklerstatic const struct file_operations iwl_dbgfs_##name##_ops = { \ 118712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler .write = iwl_dbgfs_##name##_write, \ 119712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler .read = iwl_dbgfs_##name##_read, \ 120712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler .open = iwl_dbgfs_open_file_generic, \ 121712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler}; 122712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 123712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 124712b6cf57a53da608a682b5f782c5785bda76001Tomas Winklerstatic ssize_t iwl_dbgfs_tx_statistics_read(struct file *file, 125712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler char __user *user_buf, 126712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler size_t count, loff_t *ppos) { 127712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 12828f63a4bb744ea81030219aba2337fddb10b380bH Hartley Sweeten struct iwl_priv *priv = file->private_data; 12922fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy char *buf; 130712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler int pos = 0; 131712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 13222fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy int cnt; 13322fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy ssize_t ret; 13498a7b43be19faa7b92576c62614c45e38517331cWey-Yi Guy const size_t bufsz = 100 + 13598a7b43be19faa7b92576c62614c45e38517331cWey-Yi Guy sizeof(char) * 50 * (MANAGEMENT_MAX + CONTROL_MAX); 13622fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy buf = kzalloc(bufsz, GFP_KERNEL); 13722fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy if (!buf) 13822fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy return -ENOMEM; 13922fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "Management:\n"); 14022fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy for (cnt = 0; cnt < MANAGEMENT_MAX; cnt++) { 14122fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 14298a7b43be19faa7b92576c62614c45e38517331cWey-Yi Guy "\t%25s\t\t: %u\n", 14322fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy get_mgmt_string(cnt), 14422fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy priv->tx_stats.mgmt[cnt]); 14522fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy } 14622fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "Control\n"); 14722fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy for (cnt = 0; cnt < CONTROL_MAX; cnt++) { 14822fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 14998a7b43be19faa7b92576c62614c45e38517331cWey-Yi Guy "\t%25s\t\t: %u\n", 15022fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy get_ctrl_string(cnt), 15122fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy priv->tx_stats.ctrl[cnt]); 15222fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy } 15322fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "Data:\n"); 15422fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "\tcnt: %u\n", 15522fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy priv->tx_stats.data_cnt); 15622fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "\tbytes: %llu\n", 15722fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy priv->tx_stats.data_bytes); 15822fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy ret = simple_read_from_buffer(user_buf, count, ppos, buf, pos); 15922fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy kfree(buf); 16022fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy return ret; 16122fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy} 16222fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy 1637163b8a4ec995dabda3e92c6fed7b8600060618cWey-Yi Guystatic ssize_t iwl_dbgfs_clear_traffic_statistics_write(struct file *file, 16422fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy const char __user *user_buf, 16522fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy size_t count, loff_t *ppos) 16622fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy{ 16722fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy struct iwl_priv *priv = file->private_data; 16822fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy u32 clear_flag; 16922fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy char buf[8]; 17022fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy int buf_size; 171712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 17222fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy memset(buf, 0, sizeof(buf)); 17322fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy buf_size = min(count, sizeof(buf) - 1); 17422fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy if (copy_from_user(buf, user_buf, buf_size)) 17522fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy return -EFAULT; 17622fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy if (sscanf(buf, "%x", &clear_flag) != 1) 17722fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy return -EFAULT; 1787163b8a4ec995dabda3e92c6fed7b8600060618cWey-Yi Guy iwl_clear_traffic_stats(priv); 17922fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy 18022fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy return count; 181712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler} 182712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 183712b6cf57a53da608a682b5f782c5785bda76001Tomas Winklerstatic ssize_t iwl_dbgfs_rx_statistics_read(struct file *file, 184712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler char __user *user_buf, 185712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler size_t count, loff_t *ppos) { 186712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 18728f63a4bb744ea81030219aba2337fddb10b380bH Hartley Sweeten struct iwl_priv *priv = file->private_data; 18822fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy char *buf; 189712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler int pos = 0; 19022fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy int cnt; 19122fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy ssize_t ret; 19222fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy const size_t bufsz = 100 + 19398a7b43be19faa7b92576c62614c45e38517331cWey-Yi Guy sizeof(char) * 50 * (MANAGEMENT_MAX + CONTROL_MAX); 19422fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy buf = kzalloc(bufsz, GFP_KERNEL); 19522fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy if (!buf) 19622fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy return -ENOMEM; 197712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 19822fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "Management:\n"); 19922fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy for (cnt = 0; cnt < MANAGEMENT_MAX; cnt++) { 20022fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 20198a7b43be19faa7b92576c62614c45e38517331cWey-Yi Guy "\t%25s\t\t: %u\n", 20222fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy get_mgmt_string(cnt), 20322fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy priv->rx_stats.mgmt[cnt]); 20422fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy } 20522fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "Control:\n"); 20622fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy for (cnt = 0; cnt < CONTROL_MAX; cnt++) { 20722fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 20898a7b43be19faa7b92576c62614c45e38517331cWey-Yi Guy "\t%25s\t\t: %u\n", 20922fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy get_ctrl_string(cnt), 21022fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy priv->rx_stats.ctrl[cnt]); 21122fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy } 21222fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "Data:\n"); 21322fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "\tcnt: %u\n", 21422fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy priv->rx_stats.data_cnt); 21522fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "\tbytes: %llu\n", 21622fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy priv->rx_stats.data_bytes); 217712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 21822fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy ret = simple_read_from_buffer(user_buf, count, ppos, buf, pos); 21922fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy kfree(buf); 22022fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy return ret; 22122fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy} 22222fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy 223712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler#define BYTE1_MASK 0x000000ff; 224712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler#define BYTE2_MASK 0x0000ffff; 225712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler#define BYTE3_MASK 0x00ffffff; 226712b6cf57a53da608a682b5f782c5785bda76001Tomas Winklerstatic ssize_t iwl_dbgfs_sram_read(struct file *file, 227712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler char __user *user_buf, 228712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler size_t count, loff_t *ppos) 229712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler{ 230712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler u32 val; 2312943f136ffe29adb08162197b129bf8106e8191cWey-Yi Guy char *buf; 232712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler ssize_t ret; 233712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler int i; 234712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler int pos = 0; 23528f63a4bb744ea81030219aba2337fddb10b380bH Hartley Sweeten struct iwl_priv *priv = file->private_data; 2362943f136ffe29adb08162197b129bf8106e8191cWey-Yi Guy size_t bufsz; 237712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 2385ade1e4dd1df436c3a441d17321c24aac8497306Wey-Yi Guy /* default is to dump the entire data segment */ 2395ade1e4dd1df436c3a441d17321c24aac8497306Wey-Yi Guy if (!priv->dbgfs->sram_offset && !priv->dbgfs->sram_len) { 2405ade1e4dd1df436c3a441d17321c24aac8497306Wey-Yi Guy priv->dbgfs->sram_offset = 0x800000; 2415ade1e4dd1df436c3a441d17321c24aac8497306Wey-Yi Guy if (priv->ucode_type == UCODE_INIT) 2425ade1e4dd1df436c3a441d17321c24aac8497306Wey-Yi Guy priv->dbgfs->sram_len = priv->ucode_init_data.len; 2435ade1e4dd1df436c3a441d17321c24aac8497306Wey-Yi Guy else 2445ade1e4dd1df436c3a441d17321c24aac8497306Wey-Yi Guy priv->dbgfs->sram_len = priv->ucode_data.len; 2455ade1e4dd1df436c3a441d17321c24aac8497306Wey-Yi Guy } 2465ade1e4dd1df436c3a441d17321c24aac8497306Wey-Yi Guy bufsz = 30 + priv->dbgfs->sram_len * sizeof(char) * 10; 2472943f136ffe29adb08162197b129bf8106e8191cWey-Yi Guy buf = kmalloc(bufsz, GFP_KERNEL); 2482943f136ffe29adb08162197b129bf8106e8191cWey-Yi Guy if (!buf) 2492943f136ffe29adb08162197b129bf8106e8191cWey-Yi Guy return -ENOMEM; 2505ade1e4dd1df436c3a441d17321c24aac8497306Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "sram_len: 0x%x\n", 2512943f136ffe29adb08162197b129bf8106e8191cWey-Yi Guy priv->dbgfs->sram_len); 2525ade1e4dd1df436c3a441d17321c24aac8497306Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "sram_offset: 0x%x\n", 2532943f136ffe29adb08162197b129bf8106e8191cWey-Yi Guy priv->dbgfs->sram_offset); 254712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler for (i = priv->dbgfs->sram_len; i > 0; i -= 4) { 2553395f6e9cf48469d7ee05703cad1502002741c16Tomas Winkler val = iwl_read_targ_mem(priv, priv->dbgfs->sram_offset + \ 256712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler priv->dbgfs->sram_len - i); 257712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler if (i < 4) { 258712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler switch (i) { 259712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler case 1: 260712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler val &= BYTE1_MASK; 261712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler break; 262712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler case 2: 263712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler val &= BYTE2_MASK; 264712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler break; 265712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler case 3: 266712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler val &= BYTE3_MASK; 267712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler break; 268712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler } 269712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler } 2702943f136ffe29adb08162197b129bf8106e8191cWey-Yi Guy if (!(i % 16)) 2712943f136ffe29adb08162197b129bf8106e8191cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "\n"); 272db0589f3b9443f2b57ea6daaec09c1ab0ac99cb0Abhijeet Kolekar pos += scnprintf(buf + pos, bufsz - pos, "0x%08x ", val); 273712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler } 274db0589f3b9443f2b57ea6daaec09c1ab0ac99cb0Abhijeet Kolekar pos += scnprintf(buf + pos, bufsz - pos, "\n"); 275712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 276712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler ret = simple_read_from_buffer(user_buf, count, ppos, buf, pos); 2772943f136ffe29adb08162197b129bf8106e8191cWey-Yi Guy kfree(buf); 278712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler return ret; 279712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler} 280712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 281712b6cf57a53da608a682b5f782c5785bda76001Tomas Winklerstatic ssize_t iwl_dbgfs_sram_write(struct file *file, 282712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler const char __user *user_buf, 283712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler size_t count, loff_t *ppos) 284712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler{ 285712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler struct iwl_priv *priv = file->private_data; 286712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler char buf[64]; 287712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler int buf_size; 288712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler u32 offset, len; 289712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 290712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler memset(buf, 0, sizeof(buf)); 291712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler buf_size = min(count, sizeof(buf) - 1); 292712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler if (copy_from_user(buf, user_buf, buf_size)) 293712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler return -EFAULT; 294712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 295712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler if (sscanf(buf, "%x,%x", &offset, &len) == 2) { 296712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler priv->dbgfs->sram_offset = offset; 297712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler priv->dbgfs->sram_len = len; 298712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler } else { 299712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler priv->dbgfs->sram_offset = 0; 300712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler priv->dbgfs->sram_len = 0; 301712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler } 302712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 303712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler return count; 304712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler} 305712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 306712b6cf57a53da608a682b5f782c5785bda76001Tomas Winklerstatic ssize_t iwl_dbgfs_stations_read(struct file *file, char __user *user_buf, 307712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler size_t count, loff_t *ppos) 308712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler{ 30928f63a4bb744ea81030219aba2337fddb10b380bH Hartley Sweeten struct iwl_priv *priv = file->private_data; 3106def9761f72501e638e79eebcd70afea12a3a93dTomas Winkler struct iwl_station_entry *station; 3115425e490471d521bae2fce16d22995803b41d90fTomas Winkler int max_sta = priv->hw_params.max_stations; 312712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler char *buf; 313712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler int i, j, pos = 0; 314712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler ssize_t ret; 315712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler /* Add 30 for initial string */ 316712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler const size_t bufsz = 30 + sizeof(char) * 500 * (priv->num_stations); 317712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 318712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler buf = kmalloc(bufsz, GFP_KERNEL); 3193ac7f14694dd38273d9d96f1c873233d71190c15Tomas Winkler if (!buf) 320712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler return -ENOMEM; 321712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 322db0589f3b9443f2b57ea6daaec09c1ab0ac99cb0Abhijeet Kolekar pos += scnprintf(buf + pos, bufsz - pos, "num of stations: %d\n\n", 323712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler priv->num_stations); 324712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 325712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler for (i = 0; i < max_sta; i++) { 326712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler station = &priv->stations[i]; 327712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler if (station->used) { 328db0589f3b9443f2b57ea6daaec09c1ab0ac99cb0Abhijeet Kolekar pos += scnprintf(buf + pos, bufsz - pos, 329db0589f3b9443f2b57ea6daaec09c1ab0ac99cb0Abhijeet Kolekar "station %d:\ngeneral data:\n", i+1); 330db0589f3b9443f2b57ea6daaec09c1ab0ac99cb0Abhijeet Kolekar pos += scnprintf(buf + pos, bufsz - pos, "id: %u\n", 331712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler station->sta.sta.sta_id); 332db0589f3b9443f2b57ea6daaec09c1ab0ac99cb0Abhijeet Kolekar pos += scnprintf(buf + pos, bufsz - pos, "mode: %u\n", 333712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler station->sta.mode); 334db0589f3b9443f2b57ea6daaec09c1ab0ac99cb0Abhijeet Kolekar pos += scnprintf(buf + pos, bufsz - pos, 335db0589f3b9443f2b57ea6daaec09c1ab0ac99cb0Abhijeet Kolekar "flags: 0x%x\n", 336712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler station->sta.station_flags_msk); 337db0589f3b9443f2b57ea6daaec09c1ab0ac99cb0Abhijeet Kolekar pos += scnprintf(buf + pos, bufsz - pos, "tid data:\n"); 338db0589f3b9443f2b57ea6daaec09c1ab0ac99cb0Abhijeet Kolekar pos += scnprintf(buf + pos, bufsz - pos, 339344234de54891ed15bf8127e4640ff9238076d6cDavid S. Miller "seq_num\t\ttxq_id"); 340db0589f3b9443f2b57ea6daaec09c1ab0ac99cb0Abhijeet Kolekar pos += scnprintf(buf + pos, bufsz - pos, 341344234de54891ed15bf8127e4640ff9238076d6cDavid S. Miller "\tframe_count\twait_for_ba\t"); 342db0589f3b9443f2b57ea6daaec09c1ab0ac99cb0Abhijeet Kolekar pos += scnprintf(buf + pos, bufsz - pos, 343db0589f3b9443f2b57ea6daaec09c1ab0ac99cb0Abhijeet Kolekar "start_idx\tbitmap0\t"); 344db0589f3b9443f2b57ea6daaec09c1ab0ac99cb0Abhijeet Kolekar pos += scnprintf(buf + pos, bufsz - pos, 345344234de54891ed15bf8127e4640ff9238076d6cDavid S. Miller "bitmap1\trate_n_flags"); 346344234de54891ed15bf8127e4640ff9238076d6cDavid S. Miller pos += scnprintf(buf + pos, bufsz - pos, "\n"); 347712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 348712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler for (j = 0; j < MAX_TID_COUNT; j++) { 349db0589f3b9443f2b57ea6daaec09c1ab0ac99cb0Abhijeet Kolekar pos += scnprintf(buf + pos, bufsz - pos, 350344234de54891ed15bf8127e4640ff9238076d6cDavid S. Miller "[%d]:\t\t%u", j, 351db0589f3b9443f2b57ea6daaec09c1ab0ac99cb0Abhijeet Kolekar station->tid[j].seq_number); 352db0589f3b9443f2b57ea6daaec09c1ab0ac99cb0Abhijeet Kolekar pos += scnprintf(buf + pos, bufsz - pos, 353344234de54891ed15bf8127e4640ff9238076d6cDavid S. Miller "\t%u\t\t%u\t\t%u\t\t", 354712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler station->tid[j].agg.txq_id, 355712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler station->tid[j].agg.frame_count, 356712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler station->tid[j].agg.wait_for_ba); 357db0589f3b9443f2b57ea6daaec09c1ab0ac99cb0Abhijeet Kolekar pos += scnprintf(buf + pos, bufsz - pos, 358344234de54891ed15bf8127e4640ff9238076d6cDavid S. Miller "%u\t%llu\t%u", 359712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler station->tid[j].agg.start_idx, 36016788599a9601cbba6ad7b58b3b52227ea59c013John W. Linville (unsigned long long)station->tid[j].agg.bitmap, 361712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler station->tid[j].agg.rate_n_flags); 362344234de54891ed15bf8127e4640ff9238076d6cDavid S. Miller pos += scnprintf(buf + pos, bufsz - pos, "\n"); 363712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler } 364db0589f3b9443f2b57ea6daaec09c1ab0ac99cb0Abhijeet Kolekar pos += scnprintf(buf + pos, bufsz - pos, "\n"); 365712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler } 366712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler } 367712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 368712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler ret = simple_read_from_buffer(user_buf, count, ppos, buf, pos); 369712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler kfree(buf); 370712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler return ret; 371712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler} 372712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 3730848e297c2107dbc12a91a1709c879c73bd188d8Wey-Yi Guystatic ssize_t iwl_dbgfs_nvm_read(struct file *file, 3748dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler char __user *user_buf, 3758dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler size_t count, 3768dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler loff_t *ppos) 3778dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler{ 3788dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler ssize_t ret; 37928f63a4bb744ea81030219aba2337fddb10b380bH Hartley Sweeten struct iwl_priv *priv = file->private_data; 3808dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler int pos = 0, ofs = 0, buf_size = 0; 3818dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler const u8 *ptr; 3828dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler char *buf; 383e307ddce394ee7bcec41fb74330ac89eafaea1d9Wey-Yi Guy u16 eeprom_ver; 3848dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler size_t eeprom_len = priv->cfg->eeprom_size; 3858dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler buf_size = 4 * eeprom_len + 256; 3868dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler 3878dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler if (eeprom_len % 16) { 3880848e297c2107dbc12a91a1709c879c73bd188d8Wey-Yi Guy IWL_ERR(priv, "NVM size is not multiple of 16.\n"); 3898dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler return -ENODATA; 3908dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler } 3918dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler 392c37457e69ffd7d3c94cbfcc1c39be9a45dd7ad21Julia Lawall ptr = priv->eeprom; 393c37457e69ffd7d3c94cbfcc1c39be9a45dd7ad21Julia Lawall if (!ptr) { 394c37457e69ffd7d3c94cbfcc1c39be9a45dd7ad21Julia Lawall IWL_ERR(priv, "Invalid EEPROM/OTP memory\n"); 395c37457e69ffd7d3c94cbfcc1c39be9a45dd7ad21Julia Lawall return -ENOMEM; 396c37457e69ffd7d3c94cbfcc1c39be9a45dd7ad21Julia Lawall } 397c37457e69ffd7d3c94cbfcc1c39be9a45dd7ad21Julia Lawall 3988dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler /* 4 characters for byte 0xYY */ 3998dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler buf = kzalloc(buf_size, GFP_KERNEL); 4008dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler if (!buf) { 40115b1687cb4f45b87ddbe4dfc7759ff5bb69497d2Winkler, Tomas IWL_ERR(priv, "Can not allocate Buffer\n"); 4028dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler return -ENOMEM; 4038dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler } 404e307ddce394ee7bcec41fb74330ac89eafaea1d9Wey-Yi Guy eeprom_ver = iwl_eeprom_query16(priv, EEPROM_VERSION); 405e307ddce394ee7bcec41fb74330ac89eafaea1d9Wey-Yi Guy pos += scnprintf(buf + pos, buf_size - pos, "NVM Type: %s, " 406e307ddce394ee7bcec41fb74330ac89eafaea1d9Wey-Yi Guy "version: 0x%x\n", 4070848e297c2107dbc12a91a1709c879c73bd188d8Wey-Yi Guy (priv->nvm_device_type == NVM_DEVICE_TYPE_OTP) 408e307ddce394ee7bcec41fb74330ac89eafaea1d9Wey-Yi Guy ? "OTP" : "EEPROM", eeprom_ver); 4098dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler for (ofs = 0 ; ofs < eeprom_len ; ofs += 16) { 4108dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler pos += scnprintf(buf + pos, buf_size - pos, "0x%.4x ", ofs); 4118dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler hex_dump_to_buffer(ptr + ofs, 16 , 16, 2, buf + pos, 4128dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler buf_size - pos, 0); 4132fac9717a05fc4b4824422d2c439c1260807c110Reinette Chatre pos += strlen(buf + pos); 4148dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler if (buf_size - pos > 0) 4158dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler buf[pos++] = '\n'; 4168dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler } 4178dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler 4188dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler ret = simple_read_from_buffer(user_buf, count, ppos, buf, pos); 4198dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler kfree(buf); 4208dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler return ret; 4218dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler} 422712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 423b03d7d0fd3d23b7cf130fa702f4ae3b1bc827d4bWey-Yi Guystatic ssize_t iwl_dbgfs_log_event_read(struct file *file, 424b03d7d0fd3d23b7cf130fa702f4ae3b1bc827d4bWey-Yi Guy char __user *user_buf, 425b03d7d0fd3d23b7cf130fa702f4ae3b1bc827d4bWey-Yi Guy size_t count, loff_t *ppos) 426b03d7d0fd3d23b7cf130fa702f4ae3b1bc827d4bWey-Yi Guy{ 427b03d7d0fd3d23b7cf130fa702f4ae3b1bc827d4bWey-Yi Guy struct iwl_priv *priv = file->private_data; 428b03d7d0fd3d23b7cf130fa702f4ae3b1bc827d4bWey-Yi Guy char *buf; 429b03d7d0fd3d23b7cf130fa702f4ae3b1bc827d4bWey-Yi Guy int pos = 0; 430b03d7d0fd3d23b7cf130fa702f4ae3b1bc827d4bWey-Yi Guy ssize_t ret = -ENOMEM; 431b03d7d0fd3d23b7cf130fa702f4ae3b1bc827d4bWey-Yi Guy 432937c397eb633b804d9a806d08c395ecfc42b1fecWey-Yi Guy ret = pos = priv->cfg->ops->lib->dump_nic_event_log( 433937c397eb633b804d9a806d08c395ecfc42b1fecWey-Yi Guy priv, true, &buf, true); 434937c397eb633b804d9a806d08c395ecfc42b1fecWey-Yi Guy if (buf) { 435b03d7d0fd3d23b7cf130fa702f4ae3b1bc827d4bWey-Yi Guy ret = simple_read_from_buffer(user_buf, count, ppos, buf, pos); 436b03d7d0fd3d23b7cf130fa702f4ae3b1bc827d4bWey-Yi Guy kfree(buf); 437b03d7d0fd3d23b7cf130fa702f4ae3b1bc827d4bWey-Yi Guy } 438b03d7d0fd3d23b7cf130fa702f4ae3b1bc827d4bWey-Yi Guy return ret; 439b03d7d0fd3d23b7cf130fa702f4ae3b1bc827d4bWey-Yi Guy} 440b03d7d0fd3d23b7cf130fa702f4ae3b1bc827d4bWey-Yi Guy 441189a2b5942d62bd18e1e01772c4c784253f5dd16Ester Kummerstatic ssize_t iwl_dbgfs_log_event_write(struct file *file, 442189a2b5942d62bd18e1e01772c4c784253f5dd16Ester Kummer const char __user *user_buf, 443189a2b5942d62bd18e1e01772c4c784253f5dd16Ester Kummer size_t count, loff_t *ppos) 444189a2b5942d62bd18e1e01772c4c784253f5dd16Ester Kummer{ 445189a2b5942d62bd18e1e01772c4c784253f5dd16Ester Kummer struct iwl_priv *priv = file->private_data; 446189a2b5942d62bd18e1e01772c4c784253f5dd16Ester Kummer u32 event_log_flag; 447189a2b5942d62bd18e1e01772c4c784253f5dd16Ester Kummer char buf[8]; 448189a2b5942d62bd18e1e01772c4c784253f5dd16Ester Kummer int buf_size; 449189a2b5942d62bd18e1e01772c4c784253f5dd16Ester Kummer 450189a2b5942d62bd18e1e01772c4c784253f5dd16Ester Kummer memset(buf, 0, sizeof(buf)); 451189a2b5942d62bd18e1e01772c4c784253f5dd16Ester Kummer buf_size = min(count, sizeof(buf) - 1); 452189a2b5942d62bd18e1e01772c4c784253f5dd16Ester Kummer if (copy_from_user(buf, user_buf, buf_size)) 453189a2b5942d62bd18e1e01772c4c784253f5dd16Ester Kummer return -EFAULT; 454189a2b5942d62bd18e1e01772c4c784253f5dd16Ester Kummer if (sscanf(buf, "%d", &event_log_flag) != 1) 455189a2b5942d62bd18e1e01772c4c784253f5dd16Ester Kummer return -EFAULT; 456189a2b5942d62bd18e1e01772c4c784253f5dd16Ester Kummer if (event_log_flag == 1) 457b03d7d0fd3d23b7cf130fa702f4ae3b1bc827d4bWey-Yi Guy priv->cfg->ops->lib->dump_nic_event_log(priv, true, 458b03d7d0fd3d23b7cf130fa702f4ae3b1bc827d4bWey-Yi Guy NULL, false); 459189a2b5942d62bd18e1e01772c4c784253f5dd16Ester Kummer 460189a2b5942d62bd18e1e01772c4c784253f5dd16Ester Kummer return count; 461189a2b5942d62bd18e1e01772c4c784253f5dd16Ester Kummer} 462189a2b5942d62bd18e1e01772c4c784253f5dd16Ester Kummer 463d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomas 464d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomas 465d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomasstatic ssize_t iwl_dbgfs_channels_read(struct file *file, char __user *user_buf, 466d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomas size_t count, loff_t *ppos) 467d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomas{ 46828f63a4bb744ea81030219aba2337fddb10b380bH Hartley Sweeten struct iwl_priv *priv = file->private_data; 469d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomas struct ieee80211_channel *channels = NULL; 470d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomas const struct ieee80211_supported_band *supp_band = NULL; 471d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomas int pos = 0, i, bufsz = PAGE_SIZE; 472d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomas char *buf; 473d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomas ssize_t ret; 474d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomas 475d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomas if (!test_bit(STATUS_GEO_CONFIGURED, &priv->status)) 476d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomas return -EAGAIN; 477d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomas 478d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomas buf = kzalloc(bufsz, GFP_KERNEL); 479d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomas if (!buf) { 48015b1687cb4f45b87ddbe4dfc7759ff5bb69497d2Winkler, Tomas IWL_ERR(priv, "Can not allocate Buffer\n"); 481d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomas return -ENOMEM; 482d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomas } 483d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomas 484d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomas supp_band = iwl_get_hw_mode(priv, IEEE80211_BAND_2GHZ); 485a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy if (supp_band) { 486a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy channels = supp_band->channels; 487d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomas 488d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomas pos += scnprintf(buf + pos, bufsz - pos, 489a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy "Displaying %d channels in 2.4GHz band 802.11bg):\n", 490a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy supp_band->n_channels); 491d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomas 492a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy for (i = 0; i < supp_band->n_channels; i++) 493a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 494a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy "%d: %ddBm: BSS%s%s, %s.\n", 495a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy ieee80211_frequency_to_channel( 496a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy channels[i].center_freq), 497a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy channels[i].max_power, 498a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy channels[i].flags & IEEE80211_CHAN_RADAR ? 499a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy " (IEEE 802.11h required)" : "", 500a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy ((channels[i].flags & IEEE80211_CHAN_NO_IBSS) 501a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy || (channels[i].flags & 502a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy IEEE80211_CHAN_RADAR)) ? "" : 503a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy ", IBSS", 504a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy channels[i].flags & 505a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy IEEE80211_CHAN_PASSIVE_SCAN ? 506a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy "passive only" : "active/passive"); 507a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy } 508d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomas supp_band = iwl_get_hw_mode(priv, IEEE80211_BAND_5GHZ); 509a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy if (supp_band) { 510a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy channels = supp_band->channels; 511d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomas 512d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomas pos += scnprintf(buf + pos, bufsz - pos, 513a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy "Displaying %d channels in 5.2GHz band (802.11a)\n", 514a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy supp_band->n_channels); 515a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy 516a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy for (i = 0; i < supp_band->n_channels; i++) 517a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 518a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy "%d: %ddBm: BSS%s%s, %s.\n", 519a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy ieee80211_frequency_to_channel( 520a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy channels[i].center_freq), 521a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy channels[i].max_power, 522a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy channels[i].flags & IEEE80211_CHAN_RADAR ? 523a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy " (IEEE 802.11h required)" : "", 524a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy ((channels[i].flags & IEEE80211_CHAN_NO_IBSS) 525a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy || (channels[i].flags & 526a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy IEEE80211_CHAN_RADAR)) ? "" : 527a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy ", IBSS", 528a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy channels[i].flags & 529a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy IEEE80211_CHAN_PASSIVE_SCAN ? 530a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy "passive only" : "active/passive"); 531a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy } 532d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomas ret = simple_read_from_buffer(user_buf, count, ppos, buf, pos); 533d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomas kfree(buf); 534d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomas return ret; 535d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomas} 536d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomas 53708df05aa9b25f3079585855506022bb33a011183Wey-Yi Guystatic ssize_t iwl_dbgfs_status_read(struct file *file, 53808df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy char __user *user_buf, 53908df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy size_t count, loff_t *ppos) { 54008df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy 54128f63a4bb744ea81030219aba2337fddb10b380bH Hartley Sweeten struct iwl_priv *priv = file->private_data; 54208df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy char buf[512]; 54308df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy int pos = 0; 54408df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy const size_t bufsz = sizeof(buf); 54508df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy 54608df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "STATUS_HCMD_ACTIVE:\t %d\n", 54708df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy test_bit(STATUS_HCMD_ACTIVE, &priv->status)); 54808df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "STATUS_HCMD_SYNC_ACTIVE: %d\n", 54908df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy test_bit(STATUS_HCMD_SYNC_ACTIVE, &priv->status)); 55008df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "STATUS_INT_ENABLED:\t %d\n", 55108df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy test_bit(STATUS_INT_ENABLED, &priv->status)); 55208df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "STATUS_RF_KILL_HW:\t %d\n", 55308df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy test_bit(STATUS_RF_KILL_HW, &priv->status)); 5547812b16730ccebce71a3b2228ac08dd4f8b39469Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "STATUS_CT_KILL:\t\t %d\n", 5557812b16730ccebce71a3b2228ac08dd4f8b39469Wey-Yi Guy test_bit(STATUS_CT_KILL, &priv->status)); 55608df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "STATUS_INIT:\t\t %d\n", 55708df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy test_bit(STATUS_INIT, &priv->status)); 55808df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "STATUS_ALIVE:\t\t %d\n", 55908df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy test_bit(STATUS_ALIVE, &priv->status)); 56008df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "STATUS_READY:\t\t %d\n", 56108df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy test_bit(STATUS_READY, &priv->status)); 56208df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "STATUS_TEMPERATURE:\t %d\n", 56308df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy test_bit(STATUS_TEMPERATURE, &priv->status)); 56408df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "STATUS_GEO_CONFIGURED:\t %d\n", 56508df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy test_bit(STATUS_GEO_CONFIGURED, &priv->status)); 56608df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "STATUS_EXIT_PENDING:\t %d\n", 56708df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy test_bit(STATUS_EXIT_PENDING, &priv->status)); 56808df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "STATUS_STATISTICS:\t %d\n", 56908df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy test_bit(STATUS_STATISTICS, &priv->status)); 57008df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "STATUS_SCANNING:\t %d\n", 57108df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy test_bit(STATUS_SCANNING, &priv->status)); 57208df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "STATUS_SCAN_ABORTING:\t %d\n", 57308df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy test_bit(STATUS_SCAN_ABORTING, &priv->status)); 57408df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "STATUS_SCAN_HW:\t\t %d\n", 57508df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy test_bit(STATUS_SCAN_HW, &priv->status)); 57608df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "STATUS_POWER_PMI:\t %d\n", 57708df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy test_bit(STATUS_POWER_PMI, &priv->status)); 57808df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "STATUS_FW_ERROR:\t %d\n", 57908df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy test_bit(STATUS_FW_ERROR, &priv->status)); 58008df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "STATUS_MODE_PENDING:\t %d\n", 58108df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy test_bit(STATUS_MODE_PENDING, &priv->status)); 58208df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy return simple_read_from_buffer(user_buf, count, ppos, buf, pos); 58308df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy} 58408df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy 585a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guystatic ssize_t iwl_dbgfs_interrupt_read(struct file *file, 586a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy char __user *user_buf, 587a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy size_t count, loff_t *ppos) { 588a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy 58928f63a4bb744ea81030219aba2337fddb10b380bH Hartley Sweeten struct iwl_priv *priv = file->private_data; 590a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy int pos = 0; 591a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy int cnt = 0; 592a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy char *buf; 593a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy int bufsz = 24 * 64; /* 24 items * 64 char per item */ 594a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy ssize_t ret; 595a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy 596a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy buf = kzalloc(bufsz, GFP_KERNEL); 597a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy if (!buf) { 598a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy IWL_ERR(priv, "Can not allocate Buffer\n"); 599a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy return -ENOMEM; 600a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy } 601a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy 602a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 603a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy "Interrupt Statistics Report:\n"); 604a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy 605a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "HW Error:\t\t\t %u\n", 606a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy priv->isr_stats.hw); 607a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "SW Error:\t\t\t %u\n", 608a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy priv->isr_stats.sw); 609a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy if (priv->isr_stats.sw > 0) { 610a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 611a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy "\tLast Restarting Code: 0x%X\n", 612a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy priv->isr_stats.sw_err); 613a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy } 614a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy#ifdef CONFIG_IWLWIFI_DEBUG 615a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "Frame transmitted:\t\t %u\n", 616a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy priv->isr_stats.sch); 617a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "Alive interrupt:\t\t %u\n", 618a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy priv->isr_stats.alive); 619a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy#endif 620a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 621a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy "HW RF KILL switch toggled:\t %u\n", 622a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy priv->isr_stats.rfkill); 623a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy 624a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "CT KILL:\t\t\t %u\n", 625a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy priv->isr_stats.ctkill); 626a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy 627a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "Wakeup Interrupt:\t\t %u\n", 628a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy priv->isr_stats.wakeup); 629a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy 630a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 631a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy "Rx command responses:\t\t %u\n", 632a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy priv->isr_stats.rx); 633a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy for (cnt = 0; cnt < REPLY_MAX; cnt++) { 634a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy if (priv->isr_stats.rx_handlers[cnt] > 0) 635a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 636a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy "\tRx handler[%36s]:\t\t %u\n", 637a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy get_cmd_string(cnt), 638a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy priv->isr_stats.rx_handlers[cnt]); 639a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy } 640a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy 641a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "Tx/FH interrupt:\t\t %u\n", 642a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy priv->isr_stats.tx); 643a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy 644a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "Unexpected INTA:\t\t %u\n", 645a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy priv->isr_stats.unhandled); 646a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy 647a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy ret = simple_read_from_buffer(user_buf, count, ppos, buf, pos); 648a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy kfree(buf); 649a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy return ret; 650a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy} 651a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy 652a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guystatic ssize_t iwl_dbgfs_interrupt_write(struct file *file, 653a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy const char __user *user_buf, 654a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy size_t count, loff_t *ppos) 655a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy{ 656a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy struct iwl_priv *priv = file->private_data; 657a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy char buf[8]; 658a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy int buf_size; 659a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy u32 reset_flag; 660a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy 661a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy memset(buf, 0, sizeof(buf)); 662a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy buf_size = min(count, sizeof(buf) - 1); 663a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy if (copy_from_user(buf, user_buf, buf_size)) 664a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy return -EFAULT; 665a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy if (sscanf(buf, "%x", &reset_flag) != 1) 666a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy return -EFAULT; 667a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy if (reset_flag == 0) 668a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy iwl_clear_isr_stats(priv); 669a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy 670a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy return count; 671a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy} 672a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy 673f5ad69fa47e7b204d0032d569812544cd9a351fbWey-Yi Guystatic ssize_t iwl_dbgfs_qos_read(struct file *file, char __user *user_buf, 674f5ad69fa47e7b204d0032d569812544cd9a351fbWey-Yi Guy size_t count, loff_t *ppos) 675f5ad69fa47e7b204d0032d569812544cd9a351fbWey-Yi Guy{ 67628f63a4bb744ea81030219aba2337fddb10b380bH Hartley Sweeten struct iwl_priv *priv = file->private_data; 677f5ad69fa47e7b204d0032d569812544cd9a351fbWey-Yi Guy int pos = 0, i; 678f5ad69fa47e7b204d0032d569812544cd9a351fbWey-Yi Guy char buf[256]; 679f5ad69fa47e7b204d0032d569812544cd9a351fbWey-Yi Guy const size_t bufsz = sizeof(buf); 680f5ad69fa47e7b204d0032d569812544cd9a351fbWey-Yi Guy ssize_t ret; 681f5ad69fa47e7b204d0032d569812544cd9a351fbWey-Yi Guy 682f5ad69fa47e7b204d0032d569812544cd9a351fbWey-Yi Guy for (i = 0; i < AC_NUM; i++) { 683f5ad69fa47e7b204d0032d569812544cd9a351fbWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 684f5ad69fa47e7b204d0032d569812544cd9a351fbWey-Yi Guy "\tcw_min\tcw_max\taifsn\ttxop\n"); 685f5ad69fa47e7b204d0032d569812544cd9a351fbWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 686f5ad69fa47e7b204d0032d569812544cd9a351fbWey-Yi Guy "AC[%d]\t%u\t%u\t%u\t%u\n", i, 687f5ad69fa47e7b204d0032d569812544cd9a351fbWey-Yi Guy priv->qos_data.def_qos_parm.ac[i].cw_min, 688f5ad69fa47e7b204d0032d569812544cd9a351fbWey-Yi Guy priv->qos_data.def_qos_parm.ac[i].cw_max, 689f5ad69fa47e7b204d0032d569812544cd9a351fbWey-Yi Guy priv->qos_data.def_qos_parm.ac[i].aifsn, 690f5ad69fa47e7b204d0032d569812544cd9a351fbWey-Yi Guy priv->qos_data.def_qos_parm.ac[i].edca_txop); 691f5ad69fa47e7b204d0032d569812544cd9a351fbWey-Yi Guy } 692f5ad69fa47e7b204d0032d569812544cd9a351fbWey-Yi Guy ret = simple_read_from_buffer(user_buf, count, ppos, buf, pos); 693f5ad69fa47e7b204d0032d569812544cd9a351fbWey-Yi Guy return ret; 694f5ad69fa47e7b204d0032d569812544cd9a351fbWey-Yi Guy} 695a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy 696a283c0116b0cc5e82327e50ad4d05f6d4d42c603Wey-Yi Guystatic ssize_t iwl_dbgfs_led_read(struct file *file, char __user *user_buf, 697a283c0116b0cc5e82327e50ad4d05f6d4d42c603Wey-Yi Guy size_t count, loff_t *ppos) 698a283c0116b0cc5e82327e50ad4d05f6d4d42c603Wey-Yi Guy{ 69928f63a4bb744ea81030219aba2337fddb10b380bH Hartley Sweeten struct iwl_priv *priv = file->private_data; 700a283c0116b0cc5e82327e50ad4d05f6d4d42c603Wey-Yi Guy int pos = 0; 701a283c0116b0cc5e82327e50ad4d05f6d4d42c603Wey-Yi Guy char buf[256]; 702a283c0116b0cc5e82327e50ad4d05f6d4d42c603Wey-Yi Guy const size_t bufsz = sizeof(buf); 703a283c0116b0cc5e82327e50ad4d05f6d4d42c603Wey-Yi Guy ssize_t ret; 704a283c0116b0cc5e82327e50ad4d05f6d4d42c603Wey-Yi Guy 705a283c0116b0cc5e82327e50ad4d05f6d4d42c603Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 706a283c0116b0cc5e82327e50ad4d05f6d4d42c603Wey-Yi Guy "allow blinking: %s\n", 707a283c0116b0cc5e82327e50ad4d05f6d4d42c603Wey-Yi Guy (priv->allow_blinking) ? "True" : "False"); 708a283c0116b0cc5e82327e50ad4d05f6d4d42c603Wey-Yi Guy if (priv->allow_blinking) { 709a283c0116b0cc5e82327e50ad4d05f6d4d42c603Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 710a283c0116b0cc5e82327e50ad4d05f6d4d42c603Wey-Yi Guy "Led blinking rate: %u\n", 711a283c0116b0cc5e82327e50ad4d05f6d4d42c603Wey-Yi Guy priv->last_blink_rate); 712a283c0116b0cc5e82327e50ad4d05f6d4d42c603Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 713a283c0116b0cc5e82327e50ad4d05f6d4d42c603Wey-Yi Guy "Last blink time: %lu\n", 714a283c0116b0cc5e82327e50ad4d05f6d4d42c603Wey-Yi Guy priv->last_blink_time); 715a283c0116b0cc5e82327e50ad4d05f6d4d42c603Wey-Yi Guy } 716a283c0116b0cc5e82327e50ad4d05f6d4d42c603Wey-Yi Guy 717a283c0116b0cc5e82327e50ad4d05f6d4d42c603Wey-Yi Guy ret = simple_read_from_buffer(user_buf, count, ppos, buf, pos); 718a283c0116b0cc5e82327e50ad4d05f6d4d42c603Wey-Yi Guy return ret; 719a283c0116b0cc5e82327e50ad4d05f6d4d42c603Wey-Yi Guy} 720a283c0116b0cc5e82327e50ad4d05f6d4d42c603Wey-Yi Guy 721fbf3a2af3834e8e93e9c2876de62c5b49988e352Wey-Yi Guystatic ssize_t iwl_dbgfs_thermal_throttling_read(struct file *file, 722fbf3a2af3834e8e93e9c2876de62c5b49988e352Wey-Yi Guy char __user *user_buf, 723fbf3a2af3834e8e93e9c2876de62c5b49988e352Wey-Yi Guy size_t count, loff_t *ppos) 724fbf3a2af3834e8e93e9c2876de62c5b49988e352Wey-Yi Guy{ 72528f63a4bb744ea81030219aba2337fddb10b380bH Hartley Sweeten struct iwl_priv *priv = file->private_data; 7263ad3b92a5517c043ef30e4b95c4c39a35bbc36beJohannes Berg struct iwl_tt_mgmt *tt = &priv->thermal_throttle; 727fbf3a2af3834e8e93e9c2876de62c5b49988e352Wey-Yi Guy struct iwl_tt_restriction *restriction; 728fbf3a2af3834e8e93e9c2876de62c5b49988e352Wey-Yi Guy char buf[100]; 729fbf3a2af3834e8e93e9c2876de62c5b49988e352Wey-Yi Guy int pos = 0; 730fbf3a2af3834e8e93e9c2876de62c5b49988e352Wey-Yi Guy const size_t bufsz = sizeof(buf); 731fbf3a2af3834e8e93e9c2876de62c5b49988e352Wey-Yi Guy ssize_t ret; 732fbf3a2af3834e8e93e9c2876de62c5b49988e352Wey-Yi Guy 733fbf3a2af3834e8e93e9c2876de62c5b49988e352Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 734fbf3a2af3834e8e93e9c2876de62c5b49988e352Wey-Yi Guy "Thermal Throttling Mode: %s\n", 7353ad3b92a5517c043ef30e4b95c4c39a35bbc36beJohannes Berg tt->advanced_tt ? "Advance" : "Legacy"); 736fbf3a2af3834e8e93e9c2876de62c5b49988e352Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 737fbf3a2af3834e8e93e9c2876de62c5b49988e352Wey-Yi Guy "Thermal Throttling State: %d\n", 738fbf3a2af3834e8e93e9c2876de62c5b49988e352Wey-Yi Guy tt->state); 7393ad3b92a5517c043ef30e4b95c4c39a35bbc36beJohannes Berg if (tt->advanced_tt) { 740fbf3a2af3834e8e93e9c2876de62c5b49988e352Wey-Yi Guy restriction = tt->restriction + tt->state; 741fbf3a2af3834e8e93e9c2876de62c5b49988e352Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 742fbf3a2af3834e8e93e9c2876de62c5b49988e352Wey-Yi Guy "Tx mode: %d\n", 743fbf3a2af3834e8e93e9c2876de62c5b49988e352Wey-Yi Guy restriction->tx_stream); 744fbf3a2af3834e8e93e9c2876de62c5b49988e352Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 745fbf3a2af3834e8e93e9c2876de62c5b49988e352Wey-Yi Guy "Rx mode: %d\n", 746fbf3a2af3834e8e93e9c2876de62c5b49988e352Wey-Yi Guy restriction->rx_stream); 747fbf3a2af3834e8e93e9c2876de62c5b49988e352Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 748fbf3a2af3834e8e93e9c2876de62c5b49988e352Wey-Yi Guy "HT mode: %d\n", 749fbf3a2af3834e8e93e9c2876de62c5b49988e352Wey-Yi Guy restriction->is_ht); 750fbf3a2af3834e8e93e9c2876de62c5b49988e352Wey-Yi Guy } 751fbf3a2af3834e8e93e9c2876de62c5b49988e352Wey-Yi Guy ret = simple_read_from_buffer(user_buf, count, ppos, buf, pos); 752fbf3a2af3834e8e93e9c2876de62c5b49988e352Wey-Yi Guy return ret; 753fbf3a2af3834e8e93e9c2876de62c5b49988e352Wey-Yi Guy} 754fbf3a2af3834e8e93e9c2876de62c5b49988e352Wey-Yi Guy 7551e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guystatic ssize_t iwl_dbgfs_disable_ht40_write(struct file *file, 7561e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy const char __user *user_buf, 7571e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy size_t count, loff_t *ppos) 7581e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy{ 7591e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy struct iwl_priv *priv = file->private_data; 7601e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy char buf[8]; 7611e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy int buf_size; 7621e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy int ht40; 7631e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy 7641e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy memset(buf, 0, sizeof(buf)); 7651e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy buf_size = min(count, sizeof(buf) - 1); 7661e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy if (copy_from_user(buf, user_buf, buf_size)) 7671e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy return -EFAULT; 7681e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy if (sscanf(buf, "%d", &ht40) != 1) 7691e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy return -EFAULT; 7701e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy if (!iwl_is_associated(priv)) 7711e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy priv->disable_ht40 = ht40 ? true : false; 7721e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy else { 7731e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy IWL_ERR(priv, "Sta associated with AP - " 7741e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy "Change to 40MHz channel support is not allowed\n"); 7751e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy return -EINVAL; 7761e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy } 7771e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy 7781e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy return count; 7791e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy} 7801e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy 7811e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guystatic ssize_t iwl_dbgfs_disable_ht40_read(struct file *file, 7821e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy char __user *user_buf, 7831e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy size_t count, loff_t *ppos) 7841e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy{ 78528f63a4bb744ea81030219aba2337fddb10b380bH Hartley Sweeten struct iwl_priv *priv = file->private_data; 7861e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy char buf[100]; 7871e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy int pos = 0; 7881e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy const size_t bufsz = sizeof(buf); 7891e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy ssize_t ret; 7901e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy 7911e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 7921e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy "11n 40MHz Mode: %s\n", 7931e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy priv->disable_ht40 ? "Disabled" : "Enabled"); 7941e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy ret = simple_read_from_buffer(user_buf, count, ppos, buf, pos); 7951e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy return ret; 7961e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy} 7971e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy 798e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Bergstatic ssize_t iwl_dbgfs_sleep_level_override_write(struct file *file, 799e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg const char __user *user_buf, 800e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg size_t count, loff_t *ppos) 801e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg{ 802e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg struct iwl_priv *priv = file->private_data; 803e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg char buf[8]; 804e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg int buf_size; 805e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg int value; 806e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg 807e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg memset(buf, 0, sizeof(buf)); 808e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg buf_size = min(count, sizeof(buf) - 1); 809e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg if (copy_from_user(buf, user_buf, buf_size)) 810e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg return -EFAULT; 811e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg 812e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg if (sscanf(buf, "%d", &value) != 1) 813e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg return -EINVAL; 814e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg 815e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg /* 816e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg * Our users expect 0 to be "CAM", but 0 isn't actually 817e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg * valid here. However, let's not confuse them and present 818e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg * IWL_POWER_INDEX_1 as "1", not "0". 819e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg */ 8201a34c043802a213e719420ece395cf25c85cc7c5Reinette Chatre if (value == 0) 8211a34c043802a213e719420ece395cf25c85cc7c5Reinette Chatre return -EINVAL; 8221a34c043802a213e719420ece395cf25c85cc7c5Reinette Chatre else if (value > 0) 823e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg value -= 1; 824e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg 825e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg if (value != -1 && (value < 0 || value >= IWL_POWER_NUM)) 826e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg return -EINVAL; 827e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg 8284ad177b5c860dc0b1083eccc55957daf4a116b90Wey-Yi Guy if (!iwl_is_ready_rf(priv)) 8294ad177b5c860dc0b1083eccc55957daf4a116b90Wey-Yi Guy return -EAGAIN; 8304ad177b5c860dc0b1083eccc55957daf4a116b90Wey-Yi Guy 831e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg priv->power_data.debug_sleep_level_override = value; 832e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg 8334ad177b5c860dc0b1083eccc55957daf4a116b90Wey-Yi Guy iwl_power_update_mode(priv, true); 834e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg 835e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg return count; 836e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg} 837e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg 838e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Bergstatic ssize_t iwl_dbgfs_sleep_level_override_read(struct file *file, 839e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg char __user *user_buf, 840e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg size_t count, loff_t *ppos) 841e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg{ 84228f63a4bb744ea81030219aba2337fddb10b380bH Hartley Sweeten struct iwl_priv *priv = file->private_data; 843e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg char buf[10]; 844e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg int pos, value; 845e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg const size_t bufsz = sizeof(buf); 846e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg 847e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg /* see the write function */ 848e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg value = priv->power_data.debug_sleep_level_override; 849e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg if (value >= 0) 850e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg value += 1; 851e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg 852e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg pos = scnprintf(buf, bufsz, "%d\n", value); 853e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg return simple_read_from_buffer(user_buf, count, ppos, buf, pos); 854e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg} 855e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg 856e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Bergstatic ssize_t iwl_dbgfs_current_sleep_command_read(struct file *file, 857e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg char __user *user_buf, 858e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg size_t count, loff_t *ppos) 859e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg{ 86028f63a4bb744ea81030219aba2337fddb10b380bH Hartley Sweeten struct iwl_priv *priv = file->private_data; 861e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg char buf[200]; 862e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg int pos = 0, i; 863e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg const size_t bufsz = sizeof(buf); 864e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg struct iwl_powertable_cmd *cmd = &priv->power_data.sleep_cmd; 865e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg 866e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg pos += scnprintf(buf + pos, bufsz - pos, 867e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg "flags: %#.2x\n", le16_to_cpu(cmd->flags)); 868e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg pos += scnprintf(buf + pos, bufsz - pos, 869e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg "RX/TX timeout: %d/%d usec\n", 870e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg le32_to_cpu(cmd->rx_data_timeout), 871e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg le32_to_cpu(cmd->tx_data_timeout)); 872e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg for (i = 0; i < IWL_POWER_VEC_SIZE; i++) 873e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg pos += scnprintf(buf + pos, bufsz - pos, 874e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg "sleep_interval[%d]: %d\n", i, 875e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg le32_to_cpu(cmd->sleep_interval[i])); 876e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg 877e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg return simple_read_from_buffer(user_buf, count, ppos, buf, pos); 878e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg} 879e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg 880712b6cf57a53da608a682b5f782c5785bda76001Tomas WinklerDEBUGFS_READ_WRITE_FILE_OPS(sram); 881b03d7d0fd3d23b7cf130fa702f4ae3b1bc827d4bWey-Yi GuyDEBUGFS_READ_WRITE_FILE_OPS(log_event); 8820848e297c2107dbc12a91a1709c879c73bd188d8Wey-Yi GuyDEBUGFS_READ_FILE_OPS(nvm); 883712b6cf57a53da608a682b5f782c5785bda76001Tomas WinklerDEBUGFS_READ_FILE_OPS(stations); 884d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, TomasDEBUGFS_READ_FILE_OPS(channels); 88508df05aa9b25f3079585855506022bb33a011183Wey-Yi GuyDEBUGFS_READ_FILE_OPS(status); 886a83b9141b540f96dd59409c6487828e880113a29Wey-Yi GuyDEBUGFS_READ_WRITE_FILE_OPS(interrupt); 887f5ad69fa47e7b204d0032d569812544cd9a351fbWey-Yi GuyDEBUGFS_READ_FILE_OPS(qos); 888a283c0116b0cc5e82327e50ad4d05f6d4d42c603Wey-Yi GuyDEBUGFS_READ_FILE_OPS(led); 889fbf3a2af3834e8e93e9c2876de62c5b49988e352Wey-Yi GuyDEBUGFS_READ_FILE_OPS(thermal_throttling); 8901e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi GuyDEBUGFS_READ_WRITE_FILE_OPS(disable_ht40); 891e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes BergDEBUGFS_READ_WRITE_FILE_OPS(sleep_level_override); 892e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes BergDEBUGFS_READ_FILE_OPS(current_sleep_command); 893712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 89420594eb0daa67f7a0cc19d74a1bafceb1bb09f4aWey-Yi Guystatic ssize_t iwl_dbgfs_traffic_log_read(struct file *file, 89520594eb0daa67f7a0cc19d74a1bafceb1bb09f4aWey-Yi Guy char __user *user_buf, 89620594eb0daa67f7a0cc19d74a1bafceb1bb09f4aWey-Yi Guy size_t count, loff_t *ppos) 89720594eb0daa67f7a0cc19d74a1bafceb1bb09f4aWey-Yi Guy{ 89820594eb0daa67f7a0cc19d74a1bafceb1bb09f4aWey-Yi Guy struct iwl_priv *priv = file->private_data; 89920594eb0daa67f7a0cc19d74a1bafceb1bb09f4aWey-Yi Guy int pos = 0, ofs = 0; 90020594eb0daa67f7a0cc19d74a1bafceb1bb09f4aWey-Yi Guy int cnt = 0, entry; 90120594eb0daa67f7a0cc19d74a1bafceb1bb09f4aWey-Yi Guy struct iwl_tx_queue *txq; 90220594eb0daa67f7a0cc19d74a1bafceb1bb09f4aWey-Yi Guy struct iwl_queue *q; 90320594eb0daa67f7a0cc19d74a1bafceb1bb09f4aWey-Yi Guy struct iwl_rx_queue *rxq = &priv->rxq; 90420594eb0daa67f7a0cc19d74a1bafceb1bb09f4aWey-Yi Guy char *buf; 90520594eb0daa67f7a0cc19d74a1bafceb1bb09f4aWey-Yi Guy int bufsz = ((IWL_TRAFFIC_ENTRIES * IWL_TRAFFIC_ENTRY_SIZE * 64) * 2) + 90688804e2b33b6ab3974ff2330cd045ca53d6750c5Wey-Yi Guy (priv->cfg->num_of_queues * 32 * 8) + 400; 90720594eb0daa67f7a0cc19d74a1bafceb1bb09f4aWey-Yi Guy const u8 *ptr; 90820594eb0daa67f7a0cc19d74a1bafceb1bb09f4aWey-Yi Guy ssize_t ret; 90920594eb0daa67f7a0cc19d74a1bafceb1bb09f4aWey-Yi Guy 91088804e2b33b6ab3974ff2330cd045ca53d6750c5Wey-Yi Guy if (!priv->txq) { 91188804e2b33b6ab3974ff2330cd045ca53d6750c5Wey-Yi Guy IWL_ERR(priv, "txq not ready\n"); 91288804e2b33b6ab3974ff2330cd045ca53d6750c5Wey-Yi Guy return -EAGAIN; 91388804e2b33b6ab3974ff2330cd045ca53d6750c5Wey-Yi Guy } 91420594eb0daa67f7a0cc19d74a1bafceb1bb09f4aWey-Yi Guy buf = kzalloc(bufsz, GFP_KERNEL); 91520594eb0daa67f7a0cc19d74a1bafceb1bb09f4aWey-Yi Guy if (!buf) { 91620594eb0daa67f7a0cc19d74a1bafceb1bb09f4aWey-Yi Guy IWL_ERR(priv, "Can not allocate buffer\n"); 91720594eb0daa67f7a0cc19d74a1bafceb1bb09f4aWey-Yi Guy return -ENOMEM; 91820594eb0daa67f7a0cc19d74a1bafceb1bb09f4aWey-Yi Guy } 91920594eb0daa67f7a0cc19d74a1bafceb1bb09f4aWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "Tx Queue\n"); 92020594eb0daa67f7a0cc19d74a1bafceb1bb09f4aWey-Yi Guy for (cnt = 0; cnt < priv->hw_params.max_txq_num; cnt++) { 92120594eb0daa67f7a0cc19d74a1bafceb1bb09f4aWey-Yi Guy txq = &priv->txq[cnt]; 92220594eb0daa67f7a0cc19d74a1bafceb1bb09f4aWey-Yi Guy q = &txq->q; 92320594eb0daa67f7a0cc19d74a1bafceb1bb09f4aWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 92420594eb0daa67f7a0cc19d74a1bafceb1bb09f4aWey-Yi Guy "q[%d]: read_ptr: %u, write_ptr: %u\n", 92520594eb0daa67f7a0cc19d74a1bafceb1bb09f4aWey-Yi Guy cnt, q->read_ptr, q->write_ptr); 92620594eb0daa67f7a0cc19d74a1bafceb1bb09f4aWey-Yi Guy } 92720594eb0daa67f7a0cc19d74a1bafceb1bb09f4aWey-Yi Guy if (priv->tx_traffic && (iwl_debug_level & IWL_DL_TX)) { 92820594eb0daa67f7a0cc19d74a1bafceb1bb09f4aWey-Yi Guy ptr = priv->tx_traffic; 92920594eb0daa67f7a0cc19d74a1bafceb1bb09f4aWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 93020594eb0daa67f7a0cc19d74a1bafceb1bb09f4aWey-Yi Guy "Tx Traffic idx: %u\n", priv->tx_traffic_idx); 93120594eb0daa67f7a0cc19d74a1bafceb1bb09f4aWey-Yi Guy for (cnt = 0, ofs = 0; cnt < IWL_TRAFFIC_ENTRIES; cnt++) { 93220594eb0daa67f7a0cc19d74a1bafceb1bb09f4aWey-Yi Guy for (entry = 0; entry < IWL_TRAFFIC_ENTRY_SIZE / 16; 93320594eb0daa67f7a0cc19d74a1bafceb1bb09f4aWey-Yi Guy entry++, ofs += 16) { 93420594eb0daa67f7a0cc19d74a1bafceb1bb09f4aWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 93520594eb0daa67f7a0cc19d74a1bafceb1bb09f4aWey-Yi Guy "0x%.4x ", ofs); 93620594eb0daa67f7a0cc19d74a1bafceb1bb09f4aWey-Yi Guy hex_dump_to_buffer(ptr + ofs, 16, 16, 2, 93720594eb0daa67f7a0cc19d74a1bafceb1bb09f4aWey-Yi Guy buf + pos, bufsz - pos, 0); 9382fac9717a05fc4b4824422d2c439c1260807c110Reinette Chatre pos += strlen(buf + pos); 93920594eb0daa67f7a0cc19d74a1bafceb1bb09f4aWey-Yi Guy if (bufsz - pos > 0) 94020594eb0daa67f7a0cc19d74a1bafceb1bb09f4aWey-Yi Guy buf[pos++] = '\n'; 94120594eb0daa67f7a0cc19d74a1bafceb1bb09f4aWey-Yi Guy } 94220594eb0daa67f7a0cc19d74a1bafceb1bb09f4aWey-Yi Guy } 94320594eb0daa67f7a0cc19d74a1bafceb1bb09f4aWey-Yi Guy } 94420594eb0daa67f7a0cc19d74a1bafceb1bb09f4aWey-Yi Guy 94520594eb0daa67f7a0cc19d74a1bafceb1bb09f4aWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "Rx Queue\n"); 94620594eb0daa67f7a0cc19d74a1bafceb1bb09f4aWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 94720594eb0daa67f7a0cc19d74a1bafceb1bb09f4aWey-Yi Guy "read: %u, write: %u\n", 94820594eb0daa67f7a0cc19d74a1bafceb1bb09f4aWey-Yi Guy rxq->read, rxq->write); 94920594eb0daa67f7a0cc19d74a1bafceb1bb09f4aWey-Yi Guy 95020594eb0daa67f7a0cc19d74a1bafceb1bb09f4aWey-Yi Guy if (priv->rx_traffic && (iwl_debug_level & IWL_DL_RX)) { 95120594eb0daa67f7a0cc19d74a1bafceb1bb09f4aWey-Yi Guy ptr = priv->rx_traffic; 95220594eb0daa67f7a0cc19d74a1bafceb1bb09f4aWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 95320594eb0daa67f7a0cc19d74a1bafceb1bb09f4aWey-Yi Guy "Rx Traffic idx: %u\n", priv->rx_traffic_idx); 95420594eb0daa67f7a0cc19d74a1bafceb1bb09f4aWey-Yi Guy for (cnt = 0, ofs = 0; cnt < IWL_TRAFFIC_ENTRIES; cnt++) { 95520594eb0daa67f7a0cc19d74a1bafceb1bb09f4aWey-Yi Guy for (entry = 0; entry < IWL_TRAFFIC_ENTRY_SIZE / 16; 95620594eb0daa67f7a0cc19d74a1bafceb1bb09f4aWey-Yi Guy entry++, ofs += 16) { 95720594eb0daa67f7a0cc19d74a1bafceb1bb09f4aWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 95820594eb0daa67f7a0cc19d74a1bafceb1bb09f4aWey-Yi Guy "0x%.4x ", ofs); 95920594eb0daa67f7a0cc19d74a1bafceb1bb09f4aWey-Yi Guy hex_dump_to_buffer(ptr + ofs, 16, 16, 2, 96020594eb0daa67f7a0cc19d74a1bafceb1bb09f4aWey-Yi Guy buf + pos, bufsz - pos, 0); 9612fac9717a05fc4b4824422d2c439c1260807c110Reinette Chatre pos += strlen(buf + pos); 96220594eb0daa67f7a0cc19d74a1bafceb1bb09f4aWey-Yi Guy if (bufsz - pos > 0) 96320594eb0daa67f7a0cc19d74a1bafceb1bb09f4aWey-Yi Guy buf[pos++] = '\n'; 96420594eb0daa67f7a0cc19d74a1bafceb1bb09f4aWey-Yi Guy } 96520594eb0daa67f7a0cc19d74a1bafceb1bb09f4aWey-Yi Guy } 96620594eb0daa67f7a0cc19d74a1bafceb1bb09f4aWey-Yi Guy } 96720594eb0daa67f7a0cc19d74a1bafceb1bb09f4aWey-Yi Guy 96820594eb0daa67f7a0cc19d74a1bafceb1bb09f4aWey-Yi Guy ret = simple_read_from_buffer(user_buf, count, ppos, buf, pos); 96920594eb0daa67f7a0cc19d74a1bafceb1bb09f4aWey-Yi Guy kfree(buf); 97020594eb0daa67f7a0cc19d74a1bafceb1bb09f4aWey-Yi Guy return ret; 97120594eb0daa67f7a0cc19d74a1bafceb1bb09f4aWey-Yi Guy} 97220594eb0daa67f7a0cc19d74a1bafceb1bb09f4aWey-Yi Guy 97320594eb0daa67f7a0cc19d74a1bafceb1bb09f4aWey-Yi Guystatic ssize_t iwl_dbgfs_traffic_log_write(struct file *file, 97420594eb0daa67f7a0cc19d74a1bafceb1bb09f4aWey-Yi Guy const char __user *user_buf, 97520594eb0daa67f7a0cc19d74a1bafceb1bb09f4aWey-Yi Guy size_t count, loff_t *ppos) 97620594eb0daa67f7a0cc19d74a1bafceb1bb09f4aWey-Yi Guy{ 97720594eb0daa67f7a0cc19d74a1bafceb1bb09f4aWey-Yi Guy struct iwl_priv *priv = file->private_data; 97820594eb0daa67f7a0cc19d74a1bafceb1bb09f4aWey-Yi Guy char buf[8]; 97920594eb0daa67f7a0cc19d74a1bafceb1bb09f4aWey-Yi Guy int buf_size; 98020594eb0daa67f7a0cc19d74a1bafceb1bb09f4aWey-Yi Guy int traffic_log; 98120594eb0daa67f7a0cc19d74a1bafceb1bb09f4aWey-Yi Guy 98220594eb0daa67f7a0cc19d74a1bafceb1bb09f4aWey-Yi Guy memset(buf, 0, sizeof(buf)); 98320594eb0daa67f7a0cc19d74a1bafceb1bb09f4aWey-Yi Guy buf_size = min(count, sizeof(buf) - 1); 98420594eb0daa67f7a0cc19d74a1bafceb1bb09f4aWey-Yi Guy if (copy_from_user(buf, user_buf, buf_size)) 98520594eb0daa67f7a0cc19d74a1bafceb1bb09f4aWey-Yi Guy return -EFAULT; 98620594eb0daa67f7a0cc19d74a1bafceb1bb09f4aWey-Yi Guy if (sscanf(buf, "%d", &traffic_log) != 1) 98720594eb0daa67f7a0cc19d74a1bafceb1bb09f4aWey-Yi Guy return -EFAULT; 98820594eb0daa67f7a0cc19d74a1bafceb1bb09f4aWey-Yi Guy if (traffic_log == 0) 98920594eb0daa67f7a0cc19d74a1bafceb1bb09f4aWey-Yi Guy iwl_reset_traffic_log(priv); 99020594eb0daa67f7a0cc19d74a1bafceb1bb09f4aWey-Yi Guy 99120594eb0daa67f7a0cc19d74a1bafceb1bb09f4aWey-Yi Guy return count; 99220594eb0daa67f7a0cc19d74a1bafceb1bb09f4aWey-Yi Guy} 99320594eb0daa67f7a0cc19d74a1bafceb1bb09f4aWey-Yi Guy 994141b03e07a54af68fc099459bf780a182b240b45Wey-Yi Guystatic ssize_t iwl_dbgfs_tx_queue_read(struct file *file, 995141b03e07a54af68fc099459bf780a182b240b45Wey-Yi Guy char __user *user_buf, 996141b03e07a54af68fc099459bf780a182b240b45Wey-Yi Guy size_t count, loff_t *ppos) { 997141b03e07a54af68fc099459bf780a182b240b45Wey-Yi Guy 99828f63a4bb744ea81030219aba2337fddb10b380bH Hartley Sweeten struct iwl_priv *priv = file->private_data; 999141b03e07a54af68fc099459bf780a182b240b45Wey-Yi Guy struct iwl_tx_queue *txq; 1000141b03e07a54af68fc099459bf780a182b240b45Wey-Yi Guy struct iwl_queue *q; 1001141b03e07a54af68fc099459bf780a182b240b45Wey-Yi Guy char *buf; 1002141b03e07a54af68fc099459bf780a182b240b45Wey-Yi Guy int pos = 0; 1003141b03e07a54af68fc099459bf780a182b240b45Wey-Yi Guy int cnt; 1004141b03e07a54af68fc099459bf780a182b240b45Wey-Yi Guy int ret; 1005d23db556819c00d297c0f447bdd75b282d563122Wey-Yi Guy const size_t bufsz = sizeof(char) * 64 * priv->cfg->num_of_queues; 1006141b03e07a54af68fc099459bf780a182b240b45Wey-Yi Guy 100788804e2b33b6ab3974ff2330cd045ca53d6750c5Wey-Yi Guy if (!priv->txq) { 100888804e2b33b6ab3974ff2330cd045ca53d6750c5Wey-Yi Guy IWL_ERR(priv, "txq not ready\n"); 100988804e2b33b6ab3974ff2330cd045ca53d6750c5Wey-Yi Guy return -EAGAIN; 101088804e2b33b6ab3974ff2330cd045ca53d6750c5Wey-Yi Guy } 1011141b03e07a54af68fc099459bf780a182b240b45Wey-Yi Guy buf = kzalloc(bufsz, GFP_KERNEL); 1012141b03e07a54af68fc099459bf780a182b240b45Wey-Yi Guy if (!buf) 1013141b03e07a54af68fc099459bf780a182b240b45Wey-Yi Guy return -ENOMEM; 1014141b03e07a54af68fc099459bf780a182b240b45Wey-Yi Guy 1015141b03e07a54af68fc099459bf780a182b240b45Wey-Yi Guy for (cnt = 0; cnt < priv->hw_params.max_txq_num; cnt++) { 1016141b03e07a54af68fc099459bf780a182b240b45Wey-Yi Guy txq = &priv->txq[cnt]; 1017141b03e07a54af68fc099459bf780a182b240b45Wey-Yi Guy q = &txq->q; 1018141b03e07a54af68fc099459bf780a182b240b45Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1019141b03e07a54af68fc099459bf780a182b240b45Wey-Yi Guy "hwq %.2d: read=%u write=%u stop=%d" 1020141b03e07a54af68fc099459bf780a182b240b45Wey-Yi Guy " swq_id=%#.2x (ac %d/hwq %d)\n", 1021141b03e07a54af68fc099459bf780a182b240b45Wey-Yi Guy cnt, q->read_ptr, q->write_ptr, 1022141b03e07a54af68fc099459bf780a182b240b45Wey-Yi Guy !!test_bit(cnt, priv->queue_stopped), 1023141b03e07a54af68fc099459bf780a182b240b45Wey-Yi Guy txq->swq_id, 1024141b03e07a54af68fc099459bf780a182b240b45Wey-Yi Guy txq->swq_id & 0x80 ? txq->swq_id & 3 : 1025141b03e07a54af68fc099459bf780a182b240b45Wey-Yi Guy txq->swq_id, 1026141b03e07a54af68fc099459bf780a182b240b45Wey-Yi Guy txq->swq_id & 0x80 ? (txq->swq_id >> 2) & 1027141b03e07a54af68fc099459bf780a182b240b45Wey-Yi Guy 0x1f : txq->swq_id); 1028141b03e07a54af68fc099459bf780a182b240b45Wey-Yi Guy if (cnt >= 4) 1029141b03e07a54af68fc099459bf780a182b240b45Wey-Yi Guy continue; 1030141b03e07a54af68fc099459bf780a182b240b45Wey-Yi Guy /* for the ACs, display the stop count too */ 1031141b03e07a54af68fc099459bf780a182b240b45Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1032141b03e07a54af68fc099459bf780a182b240b45Wey-Yi Guy " stop-count: %d\n", 1033141b03e07a54af68fc099459bf780a182b240b45Wey-Yi Guy atomic_read(&priv->queue_stop_count[cnt])); 1034141b03e07a54af68fc099459bf780a182b240b45Wey-Yi Guy } 1035141b03e07a54af68fc099459bf780a182b240b45Wey-Yi Guy ret = simple_read_from_buffer(user_buf, count, ppos, buf, pos); 1036141b03e07a54af68fc099459bf780a182b240b45Wey-Yi Guy kfree(buf); 1037141b03e07a54af68fc099459bf780a182b240b45Wey-Yi Guy return ret; 1038141b03e07a54af68fc099459bf780a182b240b45Wey-Yi Guy} 1039141b03e07a54af68fc099459bf780a182b240b45Wey-Yi Guy 1040141b03e07a54af68fc099459bf780a182b240b45Wey-Yi Guystatic ssize_t iwl_dbgfs_rx_queue_read(struct file *file, 1041141b03e07a54af68fc099459bf780a182b240b45Wey-Yi Guy char __user *user_buf, 1042141b03e07a54af68fc099459bf780a182b240b45Wey-Yi Guy size_t count, loff_t *ppos) { 1043141b03e07a54af68fc099459bf780a182b240b45Wey-Yi Guy 104428f63a4bb744ea81030219aba2337fddb10b380bH Hartley Sweeten struct iwl_priv *priv = file->private_data; 1045141b03e07a54af68fc099459bf780a182b240b45Wey-Yi Guy struct iwl_rx_queue *rxq = &priv->rxq; 1046141b03e07a54af68fc099459bf780a182b240b45Wey-Yi Guy char buf[256]; 1047141b03e07a54af68fc099459bf780a182b240b45Wey-Yi Guy int pos = 0; 1048141b03e07a54af68fc099459bf780a182b240b45Wey-Yi Guy const size_t bufsz = sizeof(buf); 1049141b03e07a54af68fc099459bf780a182b240b45Wey-Yi Guy 1050141b03e07a54af68fc099459bf780a182b240b45Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "read: %u\n", 1051141b03e07a54af68fc099459bf780a182b240b45Wey-Yi Guy rxq->read); 1052141b03e07a54af68fc099459bf780a182b240b45Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "write: %u\n", 1053141b03e07a54af68fc099459bf780a182b240b45Wey-Yi Guy rxq->write); 1054141b03e07a54af68fc099459bf780a182b240b45Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "free_count: %u\n", 1055141b03e07a54af68fc099459bf780a182b240b45Wey-Yi Guy rxq->free_count); 1056141b03e07a54af68fc099459bf780a182b240b45Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "closed_rb_num: %u\n", 1057141b03e07a54af68fc099459bf780a182b240b45Wey-Yi Guy le16_to_cpu(rxq->rb_stts->closed_rb_num) & 0x0FFF); 1058141b03e07a54af68fc099459bf780a182b240b45Wey-Yi Guy return simple_read_from_buffer(user_buf, count, ppos, buf, pos); 1059141b03e07a54af68fc099459bf780a182b240b45Wey-Yi Guy} 1060141b03e07a54af68fc099459bf780a182b240b45Wey-Yi Guy 1061e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guystatic int iwl_dbgfs_statistics_flag(struct iwl_priv *priv, char *buf, 1062e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guy int bufsz) 1063e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guy{ 1064e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guy int p = 0; 1065e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guy 1066e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guy p += scnprintf(buf + p, bufsz - p, 1067e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guy "Statistics Flag(0x%X):\n", 1068e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guy le32_to_cpu(priv->statistics.flag)); 1069e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guy if (le32_to_cpu(priv->statistics.flag) & UCODE_STATISTICS_CLEAR_MSK) 1070e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guy p += scnprintf(buf + p, bufsz - p, 1071e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guy "\tStatistics have been cleared\n"); 1072e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guy p += scnprintf(buf + p, bufsz - p, 1073e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guy "\tOperational Frequency: %s\n", 1074e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guy (le32_to_cpu(priv->statistics.flag) & 1075e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guy UCODE_STATISTICS_FREQUENCY_MSK) 1076e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guy ? "2.4 GHz" : "5.2 GHz"); 1077e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guy p += scnprintf(buf + p, bufsz - p, 1078e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guy "\tTGj Narrow Band: %s\n", 1079e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guy (le32_to_cpu(priv->statistics.flag) & 1080e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guy UCODE_STATISTICS_NARROW_BAND_MSK) 1081e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guy ? "enabled" : "disabled"); 1082e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guy return p; 1083e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guy} 1084e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guy 1085e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guystatic const char ucode_stats_header[] = 1086e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy "%-32s current acumulative delta max\n"; 1087e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guystatic const char ucode_stats_short_format[] = 1088e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy " %-30s %10u\n"; 1089e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guystatic const char ucode_stats_format[] = 1090e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy " %-30s %10u %10u %10u %10u\n"; 1091e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guy 1092e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guystatic ssize_t iwl_dbgfs_ucode_rx_stats_read(struct file *file, 1093e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guy char __user *user_buf, 1094e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guy size_t count, loff_t *ppos) 1095e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guy{ 109628f63a4bb744ea81030219aba2337fddb10b380bH Hartley Sweeten struct iwl_priv *priv = file->private_data; 1097e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guy int pos = 0; 1098e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guy char *buf; 1099e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy int bufsz = sizeof(struct statistics_rx_phy) * 40 + 1100e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy sizeof(struct statistics_rx_non_phy) * 40 + 1101e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy sizeof(struct statistics_rx_ht_phy) * 40 + 400; 1102e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guy ssize_t ret; 1103e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy struct statistics_rx_phy *ofdm, *accum_ofdm, *delta_ofdm, *max_ofdm; 1104e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy struct statistics_rx_phy *cck, *accum_cck, *delta_cck, *max_cck; 110592a35bda792cf9295b1d399f7c937d4560292b1eWey-Yi Guy struct statistics_rx_non_phy *general, *accum_general; 1106e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy struct statistics_rx_non_phy *delta_general, *max_general; 1107e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy struct statistics_rx_ht_phy *ht, *accum_ht, *delta_ht, *max_ht; 1108e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guy 1109e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guy if (!iwl_is_alive(priv)) 1110e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guy return -EAGAIN; 1111e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guy 1112e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guy buf = kzalloc(bufsz, GFP_KERNEL); 1113e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guy if (!buf) { 1114e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guy IWL_ERR(priv, "Can not allocate Buffer\n"); 1115e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guy return -ENOMEM; 1116e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guy } 1117e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guy 1118e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guy /* the statistic information display here is based on 1119e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guy * the last statistics notification from uCode 1120e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guy * might not reflect the current uCode activity 1121e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guy */ 1122e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guy ofdm = &priv->statistics.rx.ofdm; 1123e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guy cck = &priv->statistics.rx.cck; 1124e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guy general = &priv->statistics.rx.general; 1125e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guy ht = &priv->statistics.rx.ofdm_ht; 112692a35bda792cf9295b1d399f7c937d4560292b1eWey-Yi Guy accum_ofdm = &priv->accum_statistics.rx.ofdm; 112792a35bda792cf9295b1d399f7c937d4560292b1eWey-Yi Guy accum_cck = &priv->accum_statistics.rx.cck; 112892a35bda792cf9295b1d399f7c937d4560292b1eWey-Yi Guy accum_general = &priv->accum_statistics.rx.general; 112992a35bda792cf9295b1d399f7c937d4560292b1eWey-Yi Guy accum_ht = &priv->accum_statistics.rx.ofdm_ht; 1130e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy delta_ofdm = &priv->delta_statistics.rx.ofdm; 1131e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy delta_cck = &priv->delta_statistics.rx.cck; 1132e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy delta_general = &priv->delta_statistics.rx.general; 1133e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy delta_ht = &priv->delta_statistics.rx.ofdm_ht; 1134e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy max_ofdm = &priv->max_delta.rx.ofdm; 1135e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy max_cck = &priv->max_delta.rx.cck; 1136e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy max_general = &priv->max_delta.rx.general; 1137e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy max_ht = &priv->max_delta.rx.ofdm_ht; 1138e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy 1139e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guy pos += iwl_dbgfs_statistics_flag(priv, buf, bufsz); 1140e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_header, 1141e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy "Statistics_Rx - OFDM:"); 1142e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, 1143e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy "ina_cnt:", le32_to_cpu(ofdm->ina_cnt), 1144e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy accum_ofdm->ina_cnt, 1145e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy delta_ofdm->ina_cnt, max_ofdm->ina_cnt); 1146e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, 1147e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy "fina_cnt:", 1148e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy le32_to_cpu(ofdm->fina_cnt), accum_ofdm->fina_cnt, 1149e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy delta_ofdm->fina_cnt, max_ofdm->fina_cnt); 1150e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, 1151e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy "plcp_err:", 1152e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy le32_to_cpu(ofdm->plcp_err), accum_ofdm->plcp_err, 1153e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy delta_ofdm->plcp_err, max_ofdm->plcp_err); 1154e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, 1155e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy "crc32_err:", 1156e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy le32_to_cpu(ofdm->crc32_err), accum_ofdm->crc32_err, 1157e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy delta_ofdm->crc32_err, max_ofdm->crc32_err); 1158e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, 1159e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy "overrun_err:", 116092a35bda792cf9295b1d399f7c937d4560292b1eWey-Yi Guy le32_to_cpu(ofdm->overrun_err), 1161e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy accum_ofdm->overrun_err, 1162e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy delta_ofdm->overrun_err, max_ofdm->overrun_err); 1163e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, 1164e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy "early_overrun_err:", 116592a35bda792cf9295b1d399f7c937d4560292b1eWey-Yi Guy le32_to_cpu(ofdm->early_overrun_err), 1166e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy accum_ofdm->early_overrun_err, 1167e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy delta_ofdm->early_overrun_err, 1168e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy max_ofdm->early_overrun_err); 1169e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, 1170e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy "crc32_good:", 117192a35bda792cf9295b1d399f7c937d4560292b1eWey-Yi Guy le32_to_cpu(ofdm->crc32_good), 1172e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy accum_ofdm->crc32_good, 1173e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy delta_ofdm->crc32_good, max_ofdm->crc32_good); 1174e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, 1175e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy "false_alarm_cnt:", 117692a35bda792cf9295b1d399f7c937d4560292b1eWey-Yi Guy le32_to_cpu(ofdm->false_alarm_cnt), 1177e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy accum_ofdm->false_alarm_cnt, 1178e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy delta_ofdm->false_alarm_cnt, 1179e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy max_ofdm->false_alarm_cnt); 1180e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, 1181e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy "fina_sync_err_cnt:", 118292a35bda792cf9295b1d399f7c937d4560292b1eWey-Yi Guy le32_to_cpu(ofdm->fina_sync_err_cnt), 1183e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy accum_ofdm->fina_sync_err_cnt, 1184e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy delta_ofdm->fina_sync_err_cnt, 1185e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy max_ofdm->fina_sync_err_cnt); 1186e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, 1187e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy "sfd_timeout:", 118892a35bda792cf9295b1d399f7c937d4560292b1eWey-Yi Guy le32_to_cpu(ofdm->sfd_timeout), 1189e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy accum_ofdm->sfd_timeout, 1190e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy delta_ofdm->sfd_timeout, 1191e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy max_ofdm->sfd_timeout); 1192e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, 1193e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy "fina_timeout:", 119492a35bda792cf9295b1d399f7c937d4560292b1eWey-Yi Guy le32_to_cpu(ofdm->fina_timeout), 1195e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy accum_ofdm->fina_timeout, 1196e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy delta_ofdm->fina_timeout, 1197e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy max_ofdm->fina_timeout); 1198e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, 1199e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy "unresponded_rts:", 120092a35bda792cf9295b1d399f7c937d4560292b1eWey-Yi Guy le32_to_cpu(ofdm->unresponded_rts), 1201e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy accum_ofdm->unresponded_rts, 1202e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy delta_ofdm->unresponded_rts, 1203e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy max_ofdm->unresponded_rts); 1204e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, 1205e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy "rxe_frame_lmt_ovrun:", 120692a35bda792cf9295b1d399f7c937d4560292b1eWey-Yi Guy le32_to_cpu(ofdm->rxe_frame_limit_overrun), 1207e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy accum_ofdm->rxe_frame_limit_overrun, 1208e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy delta_ofdm->rxe_frame_limit_overrun, 1209e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy max_ofdm->rxe_frame_limit_overrun); 1210e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, 1211e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy "sent_ack_cnt:", 121292a35bda792cf9295b1d399f7c937d4560292b1eWey-Yi Guy le32_to_cpu(ofdm->sent_ack_cnt), 1213e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy accum_ofdm->sent_ack_cnt, 1214e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy delta_ofdm->sent_ack_cnt, 1215e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy max_ofdm->sent_ack_cnt); 1216e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, 1217e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy "sent_cts_cnt:", 121892a35bda792cf9295b1d399f7c937d4560292b1eWey-Yi Guy le32_to_cpu(ofdm->sent_cts_cnt), 1219e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy accum_ofdm->sent_cts_cnt, 1220e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy delta_ofdm->sent_cts_cnt, max_ofdm->sent_cts_cnt); 1221e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, 1222e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy "sent_ba_rsp_cnt:", 122392a35bda792cf9295b1d399f7c937d4560292b1eWey-Yi Guy le32_to_cpu(ofdm->sent_ba_rsp_cnt), 1224e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy accum_ofdm->sent_ba_rsp_cnt, 1225e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy delta_ofdm->sent_ba_rsp_cnt, 1226e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy max_ofdm->sent_ba_rsp_cnt); 1227e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, 1228e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy "dsp_self_kill:", 122992a35bda792cf9295b1d399f7c937d4560292b1eWey-Yi Guy le32_to_cpu(ofdm->dsp_self_kill), 1230e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy accum_ofdm->dsp_self_kill, 1231e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy delta_ofdm->dsp_self_kill, 1232e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy max_ofdm->dsp_self_kill); 1233e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, 1234e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy "mh_format_err:", 123592a35bda792cf9295b1d399f7c937d4560292b1eWey-Yi Guy le32_to_cpu(ofdm->mh_format_err), 1236e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy accum_ofdm->mh_format_err, 1237e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy delta_ofdm->mh_format_err, 1238e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy max_ofdm->mh_format_err); 1239e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, 1240e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy "re_acq_main_rssi_sum:", 124192a35bda792cf9295b1d399f7c937d4560292b1eWey-Yi Guy le32_to_cpu(ofdm->re_acq_main_rssi_sum), 1242e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy accum_ofdm->re_acq_main_rssi_sum, 1243e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy delta_ofdm->re_acq_main_rssi_sum, 1244e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy max_ofdm->re_acq_main_rssi_sum); 1245e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy 1246e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_header, 1247e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy "Statistics_Rx - CCK:"); 1248e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, 1249e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy "ina_cnt:", 1250e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy le32_to_cpu(cck->ina_cnt), accum_cck->ina_cnt, 1251e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy delta_cck->ina_cnt, max_cck->ina_cnt); 1252e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, 1253e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy "fina_cnt:", 1254e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy le32_to_cpu(cck->fina_cnt), accum_cck->fina_cnt, 1255e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy delta_cck->fina_cnt, max_cck->fina_cnt); 1256e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, 1257e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy "plcp_err:", 1258e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy le32_to_cpu(cck->plcp_err), accum_cck->plcp_err, 1259e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy delta_cck->plcp_err, max_cck->plcp_err); 1260e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, 1261e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy "crc32_err:", 1262e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy le32_to_cpu(cck->crc32_err), accum_cck->crc32_err, 1263e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy delta_cck->crc32_err, max_cck->crc32_err); 1264e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, 1265e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy "overrun_err:", 126692a35bda792cf9295b1d399f7c937d4560292b1eWey-Yi Guy le32_to_cpu(cck->overrun_err), 1267e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy accum_cck->overrun_err, 1268e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy delta_cck->overrun_err, max_cck->overrun_err); 1269e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, 1270e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy "early_overrun_err:", 127192a35bda792cf9295b1d399f7c937d4560292b1eWey-Yi Guy le32_to_cpu(cck->early_overrun_err), 1272e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy accum_cck->early_overrun_err, 1273e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy delta_cck->early_overrun_err, 1274e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy max_cck->early_overrun_err); 1275e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, 1276e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy "crc32_good:", 1277e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy le32_to_cpu(cck->crc32_good), accum_cck->crc32_good, 1278e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy delta_cck->crc32_good, 1279e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy max_cck->crc32_good); 1280e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, 1281e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy "false_alarm_cnt:", 128292a35bda792cf9295b1d399f7c937d4560292b1eWey-Yi Guy le32_to_cpu(cck->false_alarm_cnt), 1283e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy accum_cck->false_alarm_cnt, 1284e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy delta_cck->false_alarm_cnt, max_cck->false_alarm_cnt); 1285e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, 1286e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy "fina_sync_err_cnt:", 128792a35bda792cf9295b1d399f7c937d4560292b1eWey-Yi Guy le32_to_cpu(cck->fina_sync_err_cnt), 1288e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy accum_cck->fina_sync_err_cnt, 1289e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy delta_cck->fina_sync_err_cnt, 1290e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy max_cck->fina_sync_err_cnt); 1291e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, 1292e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy "sfd_timeout:", 129392a35bda792cf9295b1d399f7c937d4560292b1eWey-Yi Guy le32_to_cpu(cck->sfd_timeout), 1294e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy accum_cck->sfd_timeout, 1295e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy delta_cck->sfd_timeout, max_cck->sfd_timeout); 1296e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, 1297e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy "fina_timeout:", 129892a35bda792cf9295b1d399f7c937d4560292b1eWey-Yi Guy le32_to_cpu(cck->fina_timeout), 1299e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy accum_cck->fina_timeout, 1300e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy delta_cck->fina_timeout, max_cck->fina_timeout); 1301e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, 1302e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy "unresponded_rts:", 130392a35bda792cf9295b1d399f7c937d4560292b1eWey-Yi Guy le32_to_cpu(cck->unresponded_rts), 1304e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy accum_cck->unresponded_rts, 1305e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy delta_cck->unresponded_rts, 1306e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy max_cck->unresponded_rts); 1307e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, 1308e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy "rxe_frame_lmt_ovrun:", 130992a35bda792cf9295b1d399f7c937d4560292b1eWey-Yi Guy le32_to_cpu(cck->rxe_frame_limit_overrun), 1310e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy accum_cck->rxe_frame_limit_overrun, 1311e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy delta_cck->rxe_frame_limit_overrun, 1312e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy max_cck->rxe_frame_limit_overrun); 1313e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, 1314e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy "sent_ack_cnt:", 131592a35bda792cf9295b1d399f7c937d4560292b1eWey-Yi Guy le32_to_cpu(cck->sent_ack_cnt), 1316e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy accum_cck->sent_ack_cnt, 1317e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy delta_cck->sent_ack_cnt, 1318e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy max_cck->sent_ack_cnt); 1319e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, 1320e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy "sent_cts_cnt:", 132192a35bda792cf9295b1d399f7c937d4560292b1eWey-Yi Guy le32_to_cpu(cck->sent_cts_cnt), 1322e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy accum_cck->sent_cts_cnt, 1323e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy delta_cck->sent_cts_cnt, 1324e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy max_cck->sent_cts_cnt); 1325e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, 1326e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy "sent_ba_rsp_cnt:", 132792a35bda792cf9295b1d399f7c937d4560292b1eWey-Yi Guy le32_to_cpu(cck->sent_ba_rsp_cnt), 1328e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy accum_cck->sent_ba_rsp_cnt, 1329e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy delta_cck->sent_ba_rsp_cnt, 1330e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy max_cck->sent_ba_rsp_cnt); 1331e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, 1332e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy "dsp_self_kill:", 133392a35bda792cf9295b1d399f7c937d4560292b1eWey-Yi Guy le32_to_cpu(cck->dsp_self_kill), 1334e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy accum_cck->dsp_self_kill, 1335e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy delta_cck->dsp_self_kill, 1336e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy max_cck->dsp_self_kill); 1337e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, 1338e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy "mh_format_err:", 133992a35bda792cf9295b1d399f7c937d4560292b1eWey-Yi Guy le32_to_cpu(cck->mh_format_err), 1340e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy accum_cck->mh_format_err, 1341e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy delta_cck->mh_format_err, max_cck->mh_format_err); 1342e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, 1343e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy "re_acq_main_rssi_sum:", 134492a35bda792cf9295b1d399f7c937d4560292b1eWey-Yi Guy le32_to_cpu(cck->re_acq_main_rssi_sum), 1345e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy accum_cck->re_acq_main_rssi_sum, 1346e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy delta_cck->re_acq_main_rssi_sum, 1347e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy max_cck->re_acq_main_rssi_sum); 1348e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy 1349e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_header, 1350e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy "Statistics_Rx - GENERAL:"); 1351e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, 1352e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy "bogus_cts:", 135392a35bda792cf9295b1d399f7c937d4560292b1eWey-Yi Guy le32_to_cpu(general->bogus_cts), 1354e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy accum_general->bogus_cts, 1355e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy delta_general->bogus_cts, max_general->bogus_cts); 1356e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, 1357e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy "bogus_ack:", 135892a35bda792cf9295b1d399f7c937d4560292b1eWey-Yi Guy le32_to_cpu(general->bogus_ack), 1359e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy accum_general->bogus_ack, 1360e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy delta_general->bogus_ack, max_general->bogus_ack); 1361e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, 1362e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy "non_bssid_frames:", 136392a35bda792cf9295b1d399f7c937d4560292b1eWey-Yi Guy le32_to_cpu(general->non_bssid_frames), 1364e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy accum_general->non_bssid_frames, 1365e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy delta_general->non_bssid_frames, 1366e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy max_general->non_bssid_frames); 1367e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, 1368e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy "filtered_frames:", 136992a35bda792cf9295b1d399f7c937d4560292b1eWey-Yi Guy le32_to_cpu(general->filtered_frames), 1370e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy accum_general->filtered_frames, 1371e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy delta_general->filtered_frames, 1372e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy max_general->filtered_frames); 1373e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, 1374e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy "non_channel_beacons:", 137592a35bda792cf9295b1d399f7c937d4560292b1eWey-Yi Guy le32_to_cpu(general->non_channel_beacons), 1376e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy accum_general->non_channel_beacons, 1377e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy delta_general->non_channel_beacons, 1378e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy max_general->non_channel_beacons); 1379e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, 1380e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy "channel_beacons:", 138192a35bda792cf9295b1d399f7c937d4560292b1eWey-Yi Guy le32_to_cpu(general->channel_beacons), 1382e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy accum_general->channel_beacons, 1383e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy delta_general->channel_beacons, 1384e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy max_general->channel_beacons); 1385e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, 1386e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy "num_missed_bcon:", 138792a35bda792cf9295b1d399f7c937d4560292b1eWey-Yi Guy le32_to_cpu(general->num_missed_bcon), 1388e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy accum_general->num_missed_bcon, 1389e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy delta_general->num_missed_bcon, 1390e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy max_general->num_missed_bcon); 1391e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, 1392e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy "adc_rx_saturation_time:", 139392a35bda792cf9295b1d399f7c937d4560292b1eWey-Yi Guy le32_to_cpu(general->adc_rx_saturation_time), 1394e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy accum_general->adc_rx_saturation_time, 1395e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy delta_general->adc_rx_saturation_time, 1396e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy max_general->adc_rx_saturation_time); 1397e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, 1398e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy "ina_detect_search_tm:", 139992a35bda792cf9295b1d399f7c937d4560292b1eWey-Yi Guy le32_to_cpu(general->ina_detection_search_time), 1400e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy accum_general->ina_detection_search_time, 1401e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy delta_general->ina_detection_search_time, 1402e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy max_general->ina_detection_search_time); 1403e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, 1404e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy "beacon_silence_rssi_a:", 140592a35bda792cf9295b1d399f7c937d4560292b1eWey-Yi Guy le32_to_cpu(general->beacon_silence_rssi_a), 1406e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy accum_general->beacon_silence_rssi_a, 1407e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy delta_general->beacon_silence_rssi_a, 1408e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy max_general->beacon_silence_rssi_a); 1409e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, 1410e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy "beacon_silence_rssi_b:", 141192a35bda792cf9295b1d399f7c937d4560292b1eWey-Yi Guy le32_to_cpu(general->beacon_silence_rssi_b), 1412e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy accum_general->beacon_silence_rssi_b, 1413e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy delta_general->beacon_silence_rssi_b, 1414e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy max_general->beacon_silence_rssi_b); 1415e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, 1416e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy "beacon_silence_rssi_c:", 141792a35bda792cf9295b1d399f7c937d4560292b1eWey-Yi Guy le32_to_cpu(general->beacon_silence_rssi_c), 1418e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy accum_general->beacon_silence_rssi_c, 1419e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy delta_general->beacon_silence_rssi_c, 1420e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy max_general->beacon_silence_rssi_c); 1421e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, 1422e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy "interference_data_flag:", 142392a35bda792cf9295b1d399f7c937d4560292b1eWey-Yi Guy le32_to_cpu(general->interference_data_flag), 1424e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy accum_general->interference_data_flag, 1425e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy delta_general->interference_data_flag, 1426e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy max_general->interference_data_flag); 1427e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, 1428e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy "channel_load:", 142992a35bda792cf9295b1d399f7c937d4560292b1eWey-Yi Guy le32_to_cpu(general->channel_load), 1430e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy accum_general->channel_load, 1431e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy delta_general->channel_load, 1432e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy max_general->channel_load); 1433e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, 1434e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy "dsp_false_alarms:", 143592a35bda792cf9295b1d399f7c937d4560292b1eWey-Yi Guy le32_to_cpu(general->dsp_false_alarms), 1436e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy accum_general->dsp_false_alarms, 1437e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy delta_general->dsp_false_alarms, 1438e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy max_general->dsp_false_alarms); 1439e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, 1440e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy "beacon_rssi_a:", 144192a35bda792cf9295b1d399f7c937d4560292b1eWey-Yi Guy le32_to_cpu(general->beacon_rssi_a), 1442e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy accum_general->beacon_rssi_a, 1443e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy delta_general->beacon_rssi_a, 1444e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy max_general->beacon_rssi_a); 1445e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, 1446e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy "beacon_rssi_b:", 144792a35bda792cf9295b1d399f7c937d4560292b1eWey-Yi Guy le32_to_cpu(general->beacon_rssi_b), 1448e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy accum_general->beacon_rssi_b, 1449e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy delta_general->beacon_rssi_b, 1450e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy max_general->beacon_rssi_b); 1451e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, 1452e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy "beacon_rssi_c:", 145392a35bda792cf9295b1d399f7c937d4560292b1eWey-Yi Guy le32_to_cpu(general->beacon_rssi_c), 1454e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy accum_general->beacon_rssi_c, 1455e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy delta_general->beacon_rssi_c, 1456e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy max_general->beacon_rssi_c); 1457e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, 1458e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy "beacon_energy_a:", 145992a35bda792cf9295b1d399f7c937d4560292b1eWey-Yi Guy le32_to_cpu(general->beacon_energy_a), 1460e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy accum_general->beacon_energy_a, 1461e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy delta_general->beacon_energy_a, 1462e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy max_general->beacon_energy_a); 1463e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, 1464e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy "beacon_energy_b:", 146592a35bda792cf9295b1d399f7c937d4560292b1eWey-Yi Guy le32_to_cpu(general->beacon_energy_b), 1466e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy accum_general->beacon_energy_b, 1467e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy delta_general->beacon_energy_b, 1468e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy max_general->beacon_energy_b); 1469e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, 1470e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy "beacon_energy_c:", 147192a35bda792cf9295b1d399f7c937d4560292b1eWey-Yi Guy le32_to_cpu(general->beacon_energy_c), 1472e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy accum_general->beacon_energy_c, 1473e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy delta_general->beacon_energy_c, 1474e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy max_general->beacon_energy_c); 1475e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guy 1476e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "Statistics_Rx - OFDM_HT:\n"); 1477e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_header, 1478e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy "Statistics_Rx - OFDM_HT:"); 1479e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, 1480e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy "plcp_err:", 1481e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy le32_to_cpu(ht->plcp_err), accum_ht->plcp_err, 1482e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy delta_ht->plcp_err, max_ht->plcp_err); 1483e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, 1484e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy "overrun_err:", 1485e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy le32_to_cpu(ht->overrun_err), accum_ht->overrun_err, 1486e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy delta_ht->overrun_err, max_ht->overrun_err); 1487e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, 1488e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy "early_overrun_err:", 148992a35bda792cf9295b1d399f7c937d4560292b1eWey-Yi Guy le32_to_cpu(ht->early_overrun_err), 1490e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy accum_ht->early_overrun_err, 1491e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy delta_ht->early_overrun_err, 1492e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy max_ht->early_overrun_err); 1493e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, 1494e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy "crc32_good:", 1495e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy le32_to_cpu(ht->crc32_good), accum_ht->crc32_good, 1496e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy delta_ht->crc32_good, max_ht->crc32_good); 1497e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, 1498e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy "crc32_err:", 1499e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy le32_to_cpu(ht->crc32_err), accum_ht->crc32_err, 1500e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy delta_ht->crc32_err, max_ht->crc32_err); 1501e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, 1502e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy "mh_format_err:", 150392a35bda792cf9295b1d399f7c937d4560292b1eWey-Yi Guy le32_to_cpu(ht->mh_format_err), 1504e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy accum_ht->mh_format_err, 1505e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy delta_ht->mh_format_err, max_ht->mh_format_err); 1506e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, 1507e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy "agg_crc32_good:", 150892a35bda792cf9295b1d399f7c937d4560292b1eWey-Yi Guy le32_to_cpu(ht->agg_crc32_good), 1509e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy accum_ht->agg_crc32_good, 1510e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy delta_ht->agg_crc32_good, max_ht->agg_crc32_good); 1511e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, 1512e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy "agg_mpdu_cnt:", 151392a35bda792cf9295b1d399f7c937d4560292b1eWey-Yi Guy le32_to_cpu(ht->agg_mpdu_cnt), 1514e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy accum_ht->agg_mpdu_cnt, 1515e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy delta_ht->agg_mpdu_cnt, max_ht->agg_mpdu_cnt); 1516e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, 1517e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy "agg_cnt:", 1518e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy le32_to_cpu(ht->agg_cnt), accum_ht->agg_cnt, 1519e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy delta_ht->agg_cnt, max_ht->agg_cnt); 1520e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, 1521e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy "unsupport_mcs:", 1522f0118a4575d45ce3074c830660de938bc6e17bdaWey-Yi Guy le32_to_cpu(ht->unsupport_mcs), 1523e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy accum_ht->unsupport_mcs, 1524e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy delta_ht->unsupport_mcs, max_ht->unsupport_mcs); 1525e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guy 1526e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guy ret = simple_read_from_buffer(user_buf, count, ppos, buf, pos); 1527e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guy kfree(buf); 1528e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guy return ret; 1529e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guy} 1530e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guy 1531e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guystatic ssize_t iwl_dbgfs_ucode_tx_stats_read(struct file *file, 1532e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guy char __user *user_buf, 1533e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guy size_t count, loff_t *ppos) 1534e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guy{ 153528f63a4bb744ea81030219aba2337fddb10b380bH Hartley Sweeten struct iwl_priv *priv = file->private_data; 1536e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guy int pos = 0; 1537e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guy char *buf; 1538e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy int bufsz = (sizeof(struct statistics_tx) * 48) + 250; 1539e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guy ssize_t ret; 1540e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy struct statistics_tx *tx, *accum_tx, *delta_tx, *max_tx; 1541e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guy 1542e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guy if (!iwl_is_alive(priv)) 1543e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guy return -EAGAIN; 1544e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guy 1545e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guy buf = kzalloc(bufsz, GFP_KERNEL); 1546e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guy if (!buf) { 1547e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guy IWL_ERR(priv, "Can not allocate Buffer\n"); 1548e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guy return -ENOMEM; 1549e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guy } 1550e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guy 1551e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guy /* the statistic information display here is based on 1552e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guy * the last statistics notification from uCode 1553e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guy * might not reflect the current uCode activity 1554e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guy */ 1555e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guy tx = &priv->statistics.tx; 155692a35bda792cf9295b1d399f7c937d4560292b1eWey-Yi Guy accum_tx = &priv->accum_statistics.tx; 1557e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy delta_tx = &priv->delta_statistics.tx; 1558e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy max_tx = &priv->max_delta.tx; 1559e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guy pos += iwl_dbgfs_statistics_flag(priv, buf, bufsz); 1560e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_header, 1561e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy "Statistics_Tx:"); 1562e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, 1563e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy "preamble:", 156492a35bda792cf9295b1d399f7c937d4560292b1eWey-Yi Guy le32_to_cpu(tx->preamble_cnt), 1565e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy accum_tx->preamble_cnt, 1566e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy delta_tx->preamble_cnt, max_tx->preamble_cnt); 1567e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, 1568e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy "rx_detected_cnt:", 156992a35bda792cf9295b1d399f7c937d4560292b1eWey-Yi Guy le32_to_cpu(tx->rx_detected_cnt), 1570e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy accum_tx->rx_detected_cnt, 1571e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy delta_tx->rx_detected_cnt, max_tx->rx_detected_cnt); 1572e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, 1573e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy "bt_prio_defer_cnt:", 157492a35bda792cf9295b1d399f7c937d4560292b1eWey-Yi Guy le32_to_cpu(tx->bt_prio_defer_cnt), 1575e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy accum_tx->bt_prio_defer_cnt, 1576e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy delta_tx->bt_prio_defer_cnt, 1577e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy max_tx->bt_prio_defer_cnt); 1578e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, 1579e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy "bt_prio_kill_cnt:", 158092a35bda792cf9295b1d399f7c937d4560292b1eWey-Yi Guy le32_to_cpu(tx->bt_prio_kill_cnt), 1581e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy accum_tx->bt_prio_kill_cnt, 1582e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy delta_tx->bt_prio_kill_cnt, 1583e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy max_tx->bt_prio_kill_cnt); 1584e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, 1585e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy "few_bytes_cnt:", 158692a35bda792cf9295b1d399f7c937d4560292b1eWey-Yi Guy le32_to_cpu(tx->few_bytes_cnt), 1587e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy accum_tx->few_bytes_cnt, 1588e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy delta_tx->few_bytes_cnt, max_tx->few_bytes_cnt); 1589e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, 1590e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy "cts_timeout:", 1591e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy le32_to_cpu(tx->cts_timeout), accum_tx->cts_timeout, 1592e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy delta_tx->cts_timeout, max_tx->cts_timeout); 1593e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, 1594e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy "ack_timeout:", 159592a35bda792cf9295b1d399f7c937d4560292b1eWey-Yi Guy le32_to_cpu(tx->ack_timeout), 1596e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy accum_tx->ack_timeout, 1597e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy delta_tx->ack_timeout, max_tx->ack_timeout); 1598e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, 1599e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy "expected_ack_cnt:", 160092a35bda792cf9295b1d399f7c937d4560292b1eWey-Yi Guy le32_to_cpu(tx->expected_ack_cnt), 1601e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy accum_tx->expected_ack_cnt, 1602e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy delta_tx->expected_ack_cnt, 1603e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy max_tx->expected_ack_cnt); 1604e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, 1605e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy "actual_ack_cnt:", 160692a35bda792cf9295b1d399f7c937d4560292b1eWey-Yi Guy le32_to_cpu(tx->actual_ack_cnt), 1607e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy accum_tx->actual_ack_cnt, 1608e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy delta_tx->actual_ack_cnt, 1609e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy max_tx->actual_ack_cnt); 1610e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, 1611e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy "dump_msdu_cnt:", 161292a35bda792cf9295b1d399f7c937d4560292b1eWey-Yi Guy le32_to_cpu(tx->dump_msdu_cnt), 1613e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy accum_tx->dump_msdu_cnt, 1614e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy delta_tx->dump_msdu_cnt, 1615e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy max_tx->dump_msdu_cnt); 1616e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, 1617e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy "abort_nxt_frame_mismatch:", 161892a35bda792cf9295b1d399f7c937d4560292b1eWey-Yi Guy le32_to_cpu(tx->burst_abort_next_frame_mismatch_cnt), 1619e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy accum_tx->burst_abort_next_frame_mismatch_cnt, 1620e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy delta_tx->burst_abort_next_frame_mismatch_cnt, 1621e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy max_tx->burst_abort_next_frame_mismatch_cnt); 1622e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, 1623e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy "abort_missing_nxt_frame:", 162492a35bda792cf9295b1d399f7c937d4560292b1eWey-Yi Guy le32_to_cpu(tx->burst_abort_missing_next_frame_cnt), 1625e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy accum_tx->burst_abort_missing_next_frame_cnt, 1626e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy delta_tx->burst_abort_missing_next_frame_cnt, 1627e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy max_tx->burst_abort_missing_next_frame_cnt); 1628e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, 1629e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy "cts_timeout_collision:", 163092a35bda792cf9295b1d399f7c937d4560292b1eWey-Yi Guy le32_to_cpu(tx->cts_timeout_collision), 1631e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy accum_tx->cts_timeout_collision, 1632e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy delta_tx->cts_timeout_collision, 1633e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy max_tx->cts_timeout_collision); 1634e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, 1635e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy "ack_ba_timeout_collision:", 163692a35bda792cf9295b1d399f7c937d4560292b1eWey-Yi Guy le32_to_cpu(tx->ack_or_ba_timeout_collision), 1637e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy accum_tx->ack_or_ba_timeout_collision, 1638e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy delta_tx->ack_or_ba_timeout_collision, 1639e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy max_tx->ack_or_ba_timeout_collision); 1640e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, 1641e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy "agg ba_timeout:", 164292a35bda792cf9295b1d399f7c937d4560292b1eWey-Yi Guy le32_to_cpu(tx->agg.ba_timeout), 1643e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy accum_tx->agg.ba_timeout, 1644e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy delta_tx->agg.ba_timeout, 1645e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy max_tx->agg.ba_timeout); 1646e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, 1647e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy "agg ba_resched_frames:", 164892a35bda792cf9295b1d399f7c937d4560292b1eWey-Yi Guy le32_to_cpu(tx->agg.ba_reschedule_frames), 1649e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy accum_tx->agg.ba_reschedule_frames, 1650e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy delta_tx->agg.ba_reschedule_frames, 1651e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy max_tx->agg.ba_reschedule_frames); 1652e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, 1653e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy "agg scd_query_agg_frame:", 165492a35bda792cf9295b1d399f7c937d4560292b1eWey-Yi Guy le32_to_cpu(tx->agg.scd_query_agg_frame_cnt), 1655e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy accum_tx->agg.scd_query_agg_frame_cnt, 1656e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy delta_tx->agg.scd_query_agg_frame_cnt, 1657e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy max_tx->agg.scd_query_agg_frame_cnt); 1658e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, 1659e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy "agg scd_query_no_agg:", 166092a35bda792cf9295b1d399f7c937d4560292b1eWey-Yi Guy le32_to_cpu(tx->agg.scd_query_no_agg), 1661e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy accum_tx->agg.scd_query_no_agg, 1662e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy delta_tx->agg.scd_query_no_agg, 1663e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy max_tx->agg.scd_query_no_agg); 1664e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, 1665e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy "agg scd_query_agg:", 166692a35bda792cf9295b1d399f7c937d4560292b1eWey-Yi Guy le32_to_cpu(tx->agg.scd_query_agg), 1667e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy accum_tx->agg.scd_query_agg, 1668e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy delta_tx->agg.scd_query_agg, 1669e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy max_tx->agg.scd_query_agg); 1670e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, 1671e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy "agg scd_query_mismatch:", 167292a35bda792cf9295b1d399f7c937d4560292b1eWey-Yi Guy le32_to_cpu(tx->agg.scd_query_mismatch), 1673e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy accum_tx->agg.scd_query_mismatch, 1674e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy delta_tx->agg.scd_query_mismatch, 1675e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy max_tx->agg.scd_query_mismatch); 1676e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, 1677e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy "agg frame_not_ready:", 167892a35bda792cf9295b1d399f7c937d4560292b1eWey-Yi Guy le32_to_cpu(tx->agg.frame_not_ready), 1679e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy accum_tx->agg.frame_not_ready, 1680e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy delta_tx->agg.frame_not_ready, 1681e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy max_tx->agg.frame_not_ready); 1682e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, 1683e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy "agg underrun:", 168492a35bda792cf9295b1d399f7c937d4560292b1eWey-Yi Guy le32_to_cpu(tx->agg.underrun), 1685e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy accum_tx->agg.underrun, 1686e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy delta_tx->agg.underrun, max_tx->agg.underrun); 1687e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, 1688e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy "agg bt_prio_kill:", 168992a35bda792cf9295b1d399f7c937d4560292b1eWey-Yi Guy le32_to_cpu(tx->agg.bt_prio_kill), 1690e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy accum_tx->agg.bt_prio_kill, 1691e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy delta_tx->agg.bt_prio_kill, 1692e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy max_tx->agg.bt_prio_kill); 1693e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, 1694e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy "agg rx_ba_rsp_cnt:", 169592a35bda792cf9295b1d399f7c937d4560292b1eWey-Yi Guy le32_to_cpu(tx->agg.rx_ba_rsp_cnt), 1696e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy accum_tx->agg.rx_ba_rsp_cnt, 1697e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy delta_tx->agg.rx_ba_rsp_cnt, 1698e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy max_tx->agg.rx_ba_rsp_cnt); 1699e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guy 1700e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guy ret = simple_read_from_buffer(user_buf, count, ppos, buf, pos); 1701e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guy kfree(buf); 1702e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guy return ret; 1703e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guy} 1704e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guy 1705e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guystatic ssize_t iwl_dbgfs_ucode_general_stats_read(struct file *file, 1706e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guy char __user *user_buf, 1707e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guy size_t count, loff_t *ppos) 1708e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guy{ 170928f63a4bb744ea81030219aba2337fddb10b380bH Hartley Sweeten struct iwl_priv *priv = file->private_data; 1710e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guy int pos = 0; 1711e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guy char *buf; 171211fc524941248dc717f1af5dfa844eceb7c0217fWey-Yi Guy int bufsz = sizeof(struct statistics_general) * 10 + 300; 1713e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guy ssize_t ret; 171492a35bda792cf9295b1d399f7c937d4560292b1eWey-Yi Guy struct statistics_general *general, *accum_general; 1715e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy struct statistics_general *delta_general, *max_general; 1716e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy struct statistics_dbg *dbg, *accum_dbg, *delta_dbg, *max_dbg; 1717e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy struct statistics_div *div, *accum_div, *delta_div, *max_div; 1718e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guy 1719e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guy if (!iwl_is_alive(priv)) 1720e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guy return -EAGAIN; 1721e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guy 1722e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guy buf = kzalloc(bufsz, GFP_KERNEL); 1723e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guy if (!buf) { 1724e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guy IWL_ERR(priv, "Can not allocate Buffer\n"); 1725e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guy return -ENOMEM; 1726e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guy } 1727e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guy 1728e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guy /* the statistic information display here is based on 1729e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guy * the last statistics notification from uCode 1730e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guy * might not reflect the current uCode activity 1731e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guy */ 1732e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guy general = &priv->statistics.general; 1733e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guy dbg = &priv->statistics.general.dbg; 1734e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guy div = &priv->statistics.general.div; 173592a35bda792cf9295b1d399f7c937d4560292b1eWey-Yi Guy accum_general = &priv->accum_statistics.general; 1736e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy delta_general = &priv->delta_statistics.general; 1737e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy max_general = &priv->max_delta.general; 173892a35bda792cf9295b1d399f7c937d4560292b1eWey-Yi Guy accum_dbg = &priv->accum_statistics.general.dbg; 1739e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy delta_dbg = &priv->delta_statistics.general.dbg; 1740e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy max_dbg = &priv->max_delta.general.dbg; 174192a35bda792cf9295b1d399f7c937d4560292b1eWey-Yi Guy accum_div = &priv->accum_statistics.general.div; 1742e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy delta_div = &priv->delta_statistics.general.div; 1743e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy max_div = &priv->max_delta.general.div; 1744e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guy pos += iwl_dbgfs_statistics_flag(priv, buf, bufsz); 1745e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_header, 1746e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy "Statistics_General:"); 1747e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_short_format, 1748e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy "temperature:", 1749e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guy le32_to_cpu(general->temperature)); 1750e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_short_format, 1751e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy "temperature_m:", 1752e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guy le32_to_cpu(general->temperature_m)); 1753e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, 1754e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy "burst_check:", 175592a35bda792cf9295b1d399f7c937d4560292b1eWey-Yi Guy le32_to_cpu(dbg->burst_check), 1756e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy accum_dbg->burst_check, 1757e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy delta_dbg->burst_check, max_dbg->burst_check); 1758e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, 1759e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy "burst_count:", 176092a35bda792cf9295b1d399f7c937d4560292b1eWey-Yi Guy le32_to_cpu(dbg->burst_count), 1761e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy accum_dbg->burst_count, 1762e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy delta_dbg->burst_count, max_dbg->burst_count); 1763e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, 1764e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy "sleep_time:", 176592a35bda792cf9295b1d399f7c937d4560292b1eWey-Yi Guy le32_to_cpu(general->sleep_time), 1766e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy accum_general->sleep_time, 1767e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy delta_general->sleep_time, max_general->sleep_time); 1768e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, 1769e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy "slots_out:", 177092a35bda792cf9295b1d399f7c937d4560292b1eWey-Yi Guy le32_to_cpu(general->slots_out), 1771e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy accum_general->slots_out, 1772e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy delta_general->slots_out, max_general->slots_out); 1773e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, 1774e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy "slots_idle:", 177592a35bda792cf9295b1d399f7c937d4560292b1eWey-Yi Guy le32_to_cpu(general->slots_idle), 1776e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy accum_general->slots_idle, 1777e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy delta_general->slots_idle, max_general->slots_idle); 177892a35bda792cf9295b1d399f7c937d4560292b1eWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "ttl_timestamp:\t\t\t%u\n", 1779e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guy le32_to_cpu(general->ttl_timestamp)); 1780e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, 1781e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy "tx_on_a:", 1782e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy le32_to_cpu(div->tx_on_a), accum_div->tx_on_a, 1783e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy delta_div->tx_on_a, max_div->tx_on_a); 1784e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, 1785e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy "tx_on_b:", 1786e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy le32_to_cpu(div->tx_on_b), accum_div->tx_on_b, 1787e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy delta_div->tx_on_b, max_div->tx_on_b); 1788e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, 1789e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy "exec_time:", 1790e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy le32_to_cpu(div->exec_time), accum_div->exec_time, 1791e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy delta_div->exec_time, max_div->exec_time); 1792e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, 1793e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy "probe_time:", 1794e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy le32_to_cpu(div->probe_time), accum_div->probe_time, 1795e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy delta_div->probe_time, max_div->probe_time); 1796e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, 1797e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy "rx_enable_counter:", 179892a35bda792cf9295b1d399f7c937d4560292b1eWey-Yi Guy le32_to_cpu(general->rx_enable_counter), 1799e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy accum_general->rx_enable_counter, 1800e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy delta_general->rx_enable_counter, 1801e3ef2164386a13a37714ec033e30811d052c7999Wey-Yi Guy max_general->rx_enable_counter); 180211fc524941248dc717f1af5dfa844eceb7c0217fWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, 180311fc524941248dc717f1af5dfa844eceb7c0217fWey-Yi Guy "num_of_sos_states:", 180411fc524941248dc717f1af5dfa844eceb7c0217fWey-Yi Guy le32_to_cpu(general->num_of_sos_states), 180511fc524941248dc717f1af5dfa844eceb7c0217fWey-Yi Guy accum_general->num_of_sos_states, 180611fc524941248dc717f1af5dfa844eceb7c0217fWey-Yi Guy delta_general->num_of_sos_states, 180711fc524941248dc717f1af5dfa844eceb7c0217fWey-Yi Guy max_general->num_of_sos_states); 1808e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guy ret = simple_read_from_buffer(user_buf, count, ppos, buf, pos); 1809e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guy kfree(buf); 1810e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guy return ret; 1811e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guy} 1812e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guy 18135225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guystatic ssize_t iwl_dbgfs_sensitivity_read(struct file *file, 18145225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy char __user *user_buf, 18155225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy size_t count, loff_t *ppos) { 18165225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy 181728f63a4bb744ea81030219aba2337fddb10b380bH Hartley Sweeten struct iwl_priv *priv = file->private_data; 18185225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy int pos = 0; 18195225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy int cnt = 0; 18205225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy char *buf; 18215225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy int bufsz = sizeof(struct iwl_sensitivity_data) * 4 + 100; 18225225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy ssize_t ret; 18235225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy struct iwl_sensitivity_data *data; 18245225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy 18255225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy data = &priv->sensitivity_data; 18265225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy buf = kzalloc(bufsz, GFP_KERNEL); 18275225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy if (!buf) { 18285225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy IWL_ERR(priv, "Can not allocate Buffer\n"); 18295225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy return -ENOMEM; 18305225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy } 18315225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy 18325225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "auto_corr_ofdm:\t\t\t %u\n", 18335225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy data->auto_corr_ofdm); 18345225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 18355225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy "auto_corr_ofdm_mrc:\t\t %u\n", 18365225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy data->auto_corr_ofdm_mrc); 18375225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "auto_corr_ofdm_x1:\t\t %u\n", 18385225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy data->auto_corr_ofdm_x1); 18395225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 18405225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy "auto_corr_ofdm_mrc_x1:\t\t %u\n", 18415225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy data->auto_corr_ofdm_mrc_x1); 18425225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "auto_corr_cck:\t\t\t %u\n", 18435225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy data->auto_corr_cck); 18445225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "auto_corr_cck_mrc:\t\t %u\n", 18455225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy data->auto_corr_cck_mrc); 18465225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 18475225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy "last_bad_plcp_cnt_ofdm:\t\t %u\n", 18485225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy data->last_bad_plcp_cnt_ofdm); 18495225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "last_fa_cnt_ofdm:\t\t %u\n", 18505225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy data->last_fa_cnt_ofdm); 18515225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 18525225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy "last_bad_plcp_cnt_cck:\t\t %u\n", 18535225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy data->last_bad_plcp_cnt_cck); 18545225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "last_fa_cnt_cck:\t\t %u\n", 18555225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy data->last_fa_cnt_cck); 18565225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "nrg_curr_state:\t\t\t %u\n", 18575225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy data->nrg_curr_state); 18585225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "nrg_prev_state:\t\t\t %u\n", 18595225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy data->nrg_prev_state); 18605225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "nrg_value:\t\t\t"); 18615225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy for (cnt = 0; cnt < 10; cnt++) { 18625225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, " %u", 18635225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy data->nrg_value[cnt]); 18645225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy } 18655225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "\n"); 18665225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "nrg_silence_rssi:\t\t"); 18675225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy for (cnt = 0; cnt < NRG_NUM_PREV_STAT_L; cnt++) { 18685225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, " %u", 18695225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy data->nrg_silence_rssi[cnt]); 18705225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy } 18715225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "\n"); 18725225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "nrg_silence_ref:\t\t %u\n", 18735225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy data->nrg_silence_ref); 18745225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "nrg_energy_idx:\t\t\t %u\n", 18755225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy data->nrg_energy_idx); 18765225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "nrg_silence_idx:\t\t %u\n", 18775225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy data->nrg_silence_idx); 18785225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "nrg_th_cck:\t\t\t %u\n", 18795225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy data->nrg_th_cck); 18805225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 18815225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy "nrg_auto_corr_silence_diff:\t %u\n", 18825225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy data->nrg_auto_corr_silence_diff); 18835225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "num_in_cck_no_fa:\t\t %u\n", 18845225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy data->num_in_cck_no_fa); 18855225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "nrg_th_ofdm:\t\t\t %u\n", 18865225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy data->nrg_th_ofdm); 18875225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy 18885225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy ret = simple_read_from_buffer(user_buf, count, ppos, buf, pos); 18895225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy kfree(buf); 18905225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy return ret; 18915225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy} 18925225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy 18935225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy 18945225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guystatic ssize_t iwl_dbgfs_chain_noise_read(struct file *file, 18955225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy char __user *user_buf, 18965225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy size_t count, loff_t *ppos) { 18975225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy 189828f63a4bb744ea81030219aba2337fddb10b380bH Hartley Sweeten struct iwl_priv *priv = file->private_data; 18995225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy int pos = 0; 19005225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy int cnt = 0; 19015225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy char *buf; 19025225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy int bufsz = sizeof(struct iwl_chain_noise_data) * 4 + 100; 19035225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy ssize_t ret; 19045225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy struct iwl_chain_noise_data *data; 19055225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy 19065225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy data = &priv->chain_noise_data; 19075225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy buf = kzalloc(bufsz, GFP_KERNEL); 19085225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy if (!buf) { 19095225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy IWL_ERR(priv, "Can not allocate Buffer\n"); 19105225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy return -ENOMEM; 19115225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy } 19125225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy 19135225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "active_chains:\t\t\t %u\n", 19145225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy data->active_chains); 19155225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "chain_noise_a:\t\t\t %u\n", 19165225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy data->chain_noise_a); 19175225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "chain_noise_b:\t\t\t %u\n", 19185225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy data->chain_noise_b); 19195225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "chain_noise_c:\t\t\t %u\n", 19205225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy data->chain_noise_c); 19215225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "chain_signal_a:\t\t\t %u\n", 19225225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy data->chain_signal_a); 19235225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "chain_signal_b:\t\t\t %u\n", 19245225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy data->chain_signal_b); 19255225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "chain_signal_c:\t\t\t %u\n", 19265225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy data->chain_signal_c); 19275225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "beacon_count:\t\t\t %u\n", 19285225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy data->beacon_count); 19295225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy 19305225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "disconn_array:\t\t\t"); 19315225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy for (cnt = 0; cnt < NUM_RX_CHAINS; cnt++) { 19325225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, " %u", 19335225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy data->disconn_array[cnt]); 19345225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy } 19355225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "\n"); 19365225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "delta_gain_code:\t\t"); 19375225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy for (cnt = 0; cnt < NUM_RX_CHAINS; cnt++) { 19385225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, " %u", 19395225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy data->delta_gain_code[cnt]); 19405225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy } 19415225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "\n"); 19425225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "radio_write:\t\t\t %u\n", 19435225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy data->radio_write); 19445225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "state:\t\t\t\t %u\n", 19455225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy data->state); 19465225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy 19475225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy ret = simple_read_from_buffer(user_buf, count, ppos, buf, pos); 19485225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy kfree(buf); 19495225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy return ret; 19505225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy} 19515225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy 1952f204b2487e5503ca4a9f3e69dcd63f6af979aaacWey-Yi Guystatic ssize_t iwl_dbgfs_tx_power_read(struct file *file, 1953f204b2487e5503ca4a9f3e69dcd63f6af979aaacWey-Yi Guy char __user *user_buf, 1954f204b2487e5503ca4a9f3e69dcd63f6af979aaacWey-Yi Guy size_t count, loff_t *ppos) { 1955f204b2487e5503ca4a9f3e69dcd63f6af979aaacWey-Yi Guy 195628f63a4bb744ea81030219aba2337fddb10b380bH Hartley Sweeten struct iwl_priv *priv = file->private_data; 1957f204b2487e5503ca4a9f3e69dcd63f6af979aaacWey-Yi Guy char buf[128]; 1958f204b2487e5503ca4a9f3e69dcd63f6af979aaacWey-Yi Guy int pos = 0; 1959f204b2487e5503ca4a9f3e69dcd63f6af979aaacWey-Yi Guy const size_t bufsz = sizeof(buf); 1960f204b2487e5503ca4a9f3e69dcd63f6af979aaacWey-Yi Guy struct statistics_tx *tx; 1961f204b2487e5503ca4a9f3e69dcd63f6af979aaacWey-Yi Guy 1962f204b2487e5503ca4a9f3e69dcd63f6af979aaacWey-Yi Guy if (!iwl_is_alive(priv)) 1963f204b2487e5503ca4a9f3e69dcd63f6af979aaacWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "N/A\n"); 1964f204b2487e5503ca4a9f3e69dcd63f6af979aaacWey-Yi Guy else { 1965f204b2487e5503ca4a9f3e69dcd63f6af979aaacWey-Yi Guy tx = &priv->statistics.tx; 1966f204b2487e5503ca4a9f3e69dcd63f6af979aaacWey-Yi Guy if (tx->tx_power.ant_a || 1967f204b2487e5503ca4a9f3e69dcd63f6af979aaacWey-Yi Guy tx->tx_power.ant_b || 1968f204b2487e5503ca4a9f3e69dcd63f6af979aaacWey-Yi Guy tx->tx_power.ant_c) { 1969f204b2487e5503ca4a9f3e69dcd63f6af979aaacWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1970f204b2487e5503ca4a9f3e69dcd63f6af979aaacWey-Yi Guy "tx power: (1/2 dB step)\n"); 1971f204b2487e5503ca4a9f3e69dcd63f6af979aaacWey-Yi Guy if ((priv->cfg->valid_tx_ant & ANT_A) && 1972f204b2487e5503ca4a9f3e69dcd63f6af979aaacWey-Yi Guy tx->tx_power.ant_a) 1973f204b2487e5503ca4a9f3e69dcd63f6af979aaacWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1974f204b2487e5503ca4a9f3e69dcd63f6af979aaacWey-Yi Guy "\tantenna A: 0x%X\n", 1975f204b2487e5503ca4a9f3e69dcd63f6af979aaacWey-Yi Guy tx->tx_power.ant_a); 1976f204b2487e5503ca4a9f3e69dcd63f6af979aaacWey-Yi Guy if ((priv->cfg->valid_tx_ant & ANT_B) && 1977f204b2487e5503ca4a9f3e69dcd63f6af979aaacWey-Yi Guy tx->tx_power.ant_b) 1978f204b2487e5503ca4a9f3e69dcd63f6af979aaacWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1979f204b2487e5503ca4a9f3e69dcd63f6af979aaacWey-Yi Guy "\tantenna B: 0x%X\n", 1980f204b2487e5503ca4a9f3e69dcd63f6af979aaacWey-Yi Guy tx->tx_power.ant_b); 1981f204b2487e5503ca4a9f3e69dcd63f6af979aaacWey-Yi Guy if ((priv->cfg->valid_tx_ant & ANT_C) && 1982f204b2487e5503ca4a9f3e69dcd63f6af979aaacWey-Yi Guy tx->tx_power.ant_c) 1983f204b2487e5503ca4a9f3e69dcd63f6af979aaacWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1984f204b2487e5503ca4a9f3e69dcd63f6af979aaacWey-Yi Guy "\tantenna C: 0x%X\n", 1985f204b2487e5503ca4a9f3e69dcd63f6af979aaacWey-Yi Guy tx->tx_power.ant_c); 1986f204b2487e5503ca4a9f3e69dcd63f6af979aaacWey-Yi Guy } else 1987f204b2487e5503ca4a9f3e69dcd63f6af979aaacWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "N/A\n"); 1988f204b2487e5503ca4a9f3e69dcd63f6af979aaacWey-Yi Guy } 1989f204b2487e5503ca4a9f3e69dcd63f6af979aaacWey-Yi Guy return simple_read_from_buffer(user_buf, count, ppos, buf, pos); 1990f204b2487e5503ca4a9f3e69dcd63f6af979aaacWey-Yi Guy} 1991f204b2487e5503ca4a9f3e69dcd63f6af979aaacWey-Yi Guy 1992c09430abed4159e5c56aaea257d040f7452daba6Wey-Yi Guystatic ssize_t iwl_dbgfs_power_save_status_read(struct file *file, 1993c09430abed4159e5c56aaea257d040f7452daba6Wey-Yi Guy char __user *user_buf, 1994c09430abed4159e5c56aaea257d040f7452daba6Wey-Yi Guy size_t count, loff_t *ppos) 1995c09430abed4159e5c56aaea257d040f7452daba6Wey-Yi Guy{ 199628f63a4bb744ea81030219aba2337fddb10b380bH Hartley Sweeten struct iwl_priv *priv = file->private_data; 1997c09430abed4159e5c56aaea257d040f7452daba6Wey-Yi Guy char buf[60]; 1998c09430abed4159e5c56aaea257d040f7452daba6Wey-Yi Guy int pos = 0; 1999c09430abed4159e5c56aaea257d040f7452daba6Wey-Yi Guy const size_t bufsz = sizeof(buf); 2000c09430abed4159e5c56aaea257d040f7452daba6Wey-Yi Guy u32 pwrsave_status; 2001c09430abed4159e5c56aaea257d040f7452daba6Wey-Yi Guy 2002c09430abed4159e5c56aaea257d040f7452daba6Wey-Yi Guy pwrsave_status = iwl_read32(priv, CSR_GP_CNTRL) & 2003c09430abed4159e5c56aaea257d040f7452daba6Wey-Yi Guy CSR_GP_REG_POWER_SAVE_STATUS_MSK; 2004c09430abed4159e5c56aaea257d040f7452daba6Wey-Yi Guy 2005c09430abed4159e5c56aaea257d040f7452daba6Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "Power Save Status: "); 2006c09430abed4159e5c56aaea257d040f7452daba6Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "%s\n", 2007c09430abed4159e5c56aaea257d040f7452daba6Wey-Yi Guy (pwrsave_status == CSR_GP_REG_NO_POWER_SAVE) ? "none" : 2008c09430abed4159e5c56aaea257d040f7452daba6Wey-Yi Guy (pwrsave_status == CSR_GP_REG_MAC_POWER_SAVE) ? "MAC" : 2009c09430abed4159e5c56aaea257d040f7452daba6Wey-Yi Guy (pwrsave_status == CSR_GP_REG_PHY_POWER_SAVE) ? "PHY" : 2010c09430abed4159e5c56aaea257d040f7452daba6Wey-Yi Guy "error"); 2011c09430abed4159e5c56aaea257d040f7452daba6Wey-Yi Guy 2012c09430abed4159e5c56aaea257d040f7452daba6Wey-Yi Guy return simple_read_from_buffer(user_buf, count, ppos, buf, pos); 2013c09430abed4159e5c56aaea257d040f7452daba6Wey-Yi Guy} 2014c09430abed4159e5c56aaea257d040f7452daba6Wey-Yi Guy 20157163b8a4ec995dabda3e92c6fed7b8600060618cWey-Yi Guystatic ssize_t iwl_dbgfs_clear_ucode_statistics_write(struct file *file, 2016ef8d5529b015d4c5db7fad1adfc91edfd5abad56Wey-Yi Guy const char __user *user_buf, 2017ef8d5529b015d4c5db7fad1adfc91edfd5abad56Wey-Yi Guy size_t count, loff_t *ppos) 2018ef8d5529b015d4c5db7fad1adfc91edfd5abad56Wey-Yi Guy{ 2019ef8d5529b015d4c5db7fad1adfc91edfd5abad56Wey-Yi Guy struct iwl_priv *priv = file->private_data; 2020ef8d5529b015d4c5db7fad1adfc91edfd5abad56Wey-Yi Guy char buf[8]; 2021ef8d5529b015d4c5db7fad1adfc91edfd5abad56Wey-Yi Guy int buf_size; 2022ef8d5529b015d4c5db7fad1adfc91edfd5abad56Wey-Yi Guy int clear; 2023ef8d5529b015d4c5db7fad1adfc91edfd5abad56Wey-Yi Guy 2024ef8d5529b015d4c5db7fad1adfc91edfd5abad56Wey-Yi Guy memset(buf, 0, sizeof(buf)); 2025ef8d5529b015d4c5db7fad1adfc91edfd5abad56Wey-Yi Guy buf_size = min(count, sizeof(buf) - 1); 2026ef8d5529b015d4c5db7fad1adfc91edfd5abad56Wey-Yi Guy if (copy_from_user(buf, user_buf, buf_size)) 2027ef8d5529b015d4c5db7fad1adfc91edfd5abad56Wey-Yi Guy return -EFAULT; 2028ef8d5529b015d4c5db7fad1adfc91edfd5abad56Wey-Yi Guy if (sscanf(buf, "%d", &clear) != 1) 2029ef8d5529b015d4c5db7fad1adfc91edfd5abad56Wey-Yi Guy return -EFAULT; 2030ef8d5529b015d4c5db7fad1adfc91edfd5abad56Wey-Yi Guy 2031ef8d5529b015d4c5db7fad1adfc91edfd5abad56Wey-Yi Guy /* make request to uCode to retrieve statistics information */ 2032ef8d5529b015d4c5db7fad1adfc91edfd5abad56Wey-Yi Guy mutex_lock(&priv->mutex); 2033ef8d5529b015d4c5db7fad1adfc91edfd5abad56Wey-Yi Guy iwl_send_statistics_request(priv, CMD_SYNC, true); 2034ef8d5529b015d4c5db7fad1adfc91edfd5abad56Wey-Yi Guy mutex_unlock(&priv->mutex); 2035ef8d5529b015d4c5db7fad1adfc91edfd5abad56Wey-Yi Guy 2036ef8d5529b015d4c5db7fad1adfc91edfd5abad56Wey-Yi Guy return count; 2037ef8d5529b015d4c5db7fad1adfc91edfd5abad56Wey-Yi Guy} 2038ef8d5529b015d4c5db7fad1adfc91edfd5abad56Wey-Yi Guy 2039696bdee3ba216186e21997d20a839b76158346e6Wey-Yi Guystatic ssize_t iwl_dbgfs_csr_write(struct file *file, 2040696bdee3ba216186e21997d20a839b76158346e6Wey-Yi Guy const char __user *user_buf, 2041696bdee3ba216186e21997d20a839b76158346e6Wey-Yi Guy size_t count, loff_t *ppos) 2042696bdee3ba216186e21997d20a839b76158346e6Wey-Yi Guy{ 2043696bdee3ba216186e21997d20a839b76158346e6Wey-Yi Guy struct iwl_priv *priv = file->private_data; 2044696bdee3ba216186e21997d20a839b76158346e6Wey-Yi Guy char buf[8]; 2045696bdee3ba216186e21997d20a839b76158346e6Wey-Yi Guy int buf_size; 2046696bdee3ba216186e21997d20a839b76158346e6Wey-Yi Guy int csr; 2047696bdee3ba216186e21997d20a839b76158346e6Wey-Yi Guy 2048696bdee3ba216186e21997d20a839b76158346e6Wey-Yi Guy memset(buf, 0, sizeof(buf)); 2049696bdee3ba216186e21997d20a839b76158346e6Wey-Yi Guy buf_size = min(count, sizeof(buf) - 1); 2050696bdee3ba216186e21997d20a839b76158346e6Wey-Yi Guy if (copy_from_user(buf, user_buf, buf_size)) 2051696bdee3ba216186e21997d20a839b76158346e6Wey-Yi Guy return -EFAULT; 2052696bdee3ba216186e21997d20a839b76158346e6Wey-Yi Guy if (sscanf(buf, "%d", &csr) != 1) 2053696bdee3ba216186e21997d20a839b76158346e6Wey-Yi Guy return -EFAULT; 2054696bdee3ba216186e21997d20a839b76158346e6Wey-Yi Guy 2055696bdee3ba216186e21997d20a839b76158346e6Wey-Yi Guy if (priv->cfg->ops->lib->dump_csr) 2056696bdee3ba216186e21997d20a839b76158346e6Wey-Yi Guy priv->cfg->ops->lib->dump_csr(priv); 2057696bdee3ba216186e21997d20a839b76158346e6Wey-Yi Guy 2058696bdee3ba216186e21997d20a839b76158346e6Wey-Yi Guy return count; 2059696bdee3ba216186e21997d20a839b76158346e6Wey-Yi Guy} 2060696bdee3ba216186e21997d20a839b76158346e6Wey-Yi Guy 2061a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guystatic ssize_t iwl_dbgfs_ucode_tracing_read(struct file *file, 2062a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy char __user *user_buf, 2063a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy size_t count, loff_t *ppos) { 2064a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy 2065a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy struct iwl_priv *priv = (struct iwl_priv *)file->private_data; 2066a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy int pos = 0; 2067a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy char buf[128]; 2068a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy const size_t bufsz = sizeof(buf); 2069a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy ssize_t ret; 2070a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy 2071a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "ucode trace timer is %s\n", 2072a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy priv->event_log.ucode_trace ? "On" : "Off"); 2073a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "non_wraps_count:\t\t %u\n", 2074a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy priv->event_log.non_wraps_count); 2075a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "wraps_once_count:\t\t %u\n", 2076a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy priv->event_log.wraps_once_count); 2077a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "wraps_more_count:\t\t %u\n", 2078a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy priv->event_log.wraps_more_count); 2079a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy 2080a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy ret = simple_read_from_buffer(user_buf, count, ppos, buf, pos); 2081a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy return ret; 2082a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy} 2083a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy 2084a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guystatic ssize_t iwl_dbgfs_ucode_tracing_write(struct file *file, 2085a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy const char __user *user_buf, 2086a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy size_t count, loff_t *ppos) 2087a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy{ 2088a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy struct iwl_priv *priv = file->private_data; 2089a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy char buf[8]; 2090a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy int buf_size; 2091a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy int trace; 2092a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy 2093a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy memset(buf, 0, sizeof(buf)); 2094a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy buf_size = min(count, sizeof(buf) - 1); 2095a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy if (copy_from_user(buf, user_buf, buf_size)) 2096a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy return -EFAULT; 2097a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy if (sscanf(buf, "%d", &trace) != 1) 2098a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy return -EFAULT; 2099a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy 2100a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy if (trace) { 2101a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy priv->event_log.ucode_trace = true; 2102a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy /* schedule the ucode timer to occur in UCODE_TRACE_PERIOD */ 2103a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy mod_timer(&priv->ucode_trace, 2104a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy jiffies + msecs_to_jiffies(UCODE_TRACE_PERIOD)); 2105a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy } else { 2106a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy priv->event_log.ucode_trace = false; 2107a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy del_timer_sync(&priv->ucode_trace); 2108a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy } 2109a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy 2110a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy return count; 2111a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy} 2112a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy 21131b3eb8236ad9369ae519216b61a3d22806370115Wey-Yi Guystatic ssize_t iwl_dbgfs_fh_reg_read(struct file *file, 21141b3eb8236ad9369ae519216b61a3d22806370115Wey-Yi Guy char __user *user_buf, 21151b3eb8236ad9369ae519216b61a3d22806370115Wey-Yi Guy size_t count, loff_t *ppos) 21161b3eb8236ad9369ae519216b61a3d22806370115Wey-Yi Guy{ 21171b3eb8236ad9369ae519216b61a3d22806370115Wey-Yi Guy struct iwl_priv *priv = (struct iwl_priv *)file->private_data; 21181b3eb8236ad9369ae519216b61a3d22806370115Wey-Yi Guy char *buf; 21191b3eb8236ad9369ae519216b61a3d22806370115Wey-Yi Guy int pos = 0; 21201b3eb8236ad9369ae519216b61a3d22806370115Wey-Yi Guy ssize_t ret = -EFAULT; 21211b3eb8236ad9369ae519216b61a3d22806370115Wey-Yi Guy 21221b3eb8236ad9369ae519216b61a3d22806370115Wey-Yi Guy if (priv->cfg->ops->lib->dump_fh) { 21231b3eb8236ad9369ae519216b61a3d22806370115Wey-Yi Guy ret = pos = priv->cfg->ops->lib->dump_fh(priv, &buf, true); 21241b3eb8236ad9369ae519216b61a3d22806370115Wey-Yi Guy if (buf) { 21251b3eb8236ad9369ae519216b61a3d22806370115Wey-Yi Guy ret = simple_read_from_buffer(user_buf, 21261b3eb8236ad9369ae519216b61a3d22806370115Wey-Yi Guy count, ppos, buf, pos); 21271b3eb8236ad9369ae519216b61a3d22806370115Wey-Yi Guy kfree(buf); 21281b3eb8236ad9369ae519216b61a3d22806370115Wey-Yi Guy } 21291b3eb8236ad9369ae519216b61a3d22806370115Wey-Yi Guy } 21301b3eb8236ad9369ae519216b61a3d22806370115Wey-Yi Guy 21311b3eb8236ad9369ae519216b61a3d22806370115Wey-Yi Guy return ret; 21321b3eb8236ad9369ae519216b61a3d22806370115Wey-Yi Guy} 21331b3eb8236ad9369ae519216b61a3d22806370115Wey-Yi Guy 21347163b8a4ec995dabda3e92c6fed7b8600060618cWey-Yi GuyDEBUGFS_READ_FILE_OPS(rx_statistics); 21357163b8a4ec995dabda3e92c6fed7b8600060618cWey-Yi GuyDEBUGFS_READ_FILE_OPS(tx_statistics); 213620594eb0daa67f7a0cc19d74a1bafceb1bb09f4aWey-Yi GuyDEBUGFS_READ_WRITE_FILE_OPS(traffic_log); 2137141b03e07a54af68fc099459bf780a182b240b45Wey-Yi GuyDEBUGFS_READ_FILE_OPS(rx_queue); 2138141b03e07a54af68fc099459bf780a182b240b45Wey-Yi GuyDEBUGFS_READ_FILE_OPS(tx_queue); 2139e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi GuyDEBUGFS_READ_FILE_OPS(ucode_rx_stats); 2140e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi GuyDEBUGFS_READ_FILE_OPS(ucode_tx_stats); 2141e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi GuyDEBUGFS_READ_FILE_OPS(ucode_general_stats); 21425225935b53ce1eafb222c644230d03ad6011d357Wey-Yi GuyDEBUGFS_READ_FILE_OPS(sensitivity); 21435225935b53ce1eafb222c644230d03ad6011d357Wey-Yi GuyDEBUGFS_READ_FILE_OPS(chain_noise); 2144f204b2487e5503ca4a9f3e69dcd63f6af979aaacWey-Yi GuyDEBUGFS_READ_FILE_OPS(tx_power); 2145c09430abed4159e5c56aaea257d040f7452daba6Wey-Yi GuyDEBUGFS_READ_FILE_OPS(power_save_status); 21467163b8a4ec995dabda3e92c6fed7b8600060618cWey-Yi GuyDEBUGFS_WRITE_FILE_OPS(clear_ucode_statistics); 21477163b8a4ec995dabda3e92c6fed7b8600060618cWey-Yi GuyDEBUGFS_WRITE_FILE_OPS(clear_traffic_statistics); 2148696bdee3ba216186e21997d20a839b76158346e6Wey-Yi GuyDEBUGFS_WRITE_FILE_OPS(csr); 2149a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi GuyDEBUGFS_READ_WRITE_FILE_OPS(ucode_tracing); 21501b3eb8236ad9369ae519216b61a3d22806370115Wey-Yi GuyDEBUGFS_READ_FILE_OPS(fh_reg); 215120594eb0daa67f7a0cc19d74a1bafceb1bb09f4aWey-Yi Guy 2152712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler/* 2153712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler * Create the debugfs files and directories 2154712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler * 2155712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler */ 2156712b6cf57a53da608a682b5f782c5785bda76001Tomas Winklerint iwl_dbgfs_register(struct iwl_priv *priv, const char *name) 2157712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler{ 2158712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler struct iwl_debugfs *dbgfs; 215995b1a8224abf6230899856753c5506a3f737a65bZhu Yi struct dentry *phyd = priv->hw->wiphy->debugfsdir; 21603ac7f14694dd38273d9d96f1c873233d71190c15Tomas Winkler int ret = 0; 2161712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 2162712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler dbgfs = kzalloc(sizeof(struct iwl_debugfs), GFP_KERNEL); 2163712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler if (!dbgfs) { 21643ac7f14694dd38273d9d96f1c873233d71190c15Tomas Winkler ret = -ENOMEM; 2165712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler goto err; 2166712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler } 2167712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 2168712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler priv->dbgfs = dbgfs; 2169712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler dbgfs->name = name; 217095b1a8224abf6230899856753c5506a3f737a65bZhu Yi dbgfs->dir_drv = debugfs_create_dir(name, phyd); 21713ac7f14694dd38273d9d96f1c873233d71190c15Tomas Winkler if (!dbgfs->dir_drv || IS_ERR(dbgfs->dir_drv)) { 21723ac7f14694dd38273d9d96f1c873233d71190c15Tomas Winkler ret = -ENOENT; 2173712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler goto err; 2174712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler } 2175712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 2176712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler DEBUGFS_ADD_DIR(data, dbgfs->dir_drv); 2177445c2dff409ef9de5d2f964d20917ab238fd266fTomas Winkler DEBUGFS_ADD_DIR(rf, dbgfs->dir_drv); 217820594eb0daa67f7a0cc19d74a1bafceb1bb09f4aWey-Yi Guy DEBUGFS_ADD_DIR(debug, dbgfs->dir_drv); 217943e851157adb966dd633e983b24040f72877737eWey-Yi Guy DEBUGFS_ADD_FILE(nvm, data, S_IRUSR); 218043e851157adb966dd633e983b24040f72877737eWey-Yi Guy DEBUGFS_ADD_FILE(sram, data, S_IWUSR | S_IRUSR); 2181b03d7d0fd3d23b7cf130fa702f4ae3b1bc827d4bWey-Yi Guy DEBUGFS_ADD_FILE(log_event, data, S_IWUSR | S_IRUSR); 218243e851157adb966dd633e983b24040f72877737eWey-Yi Guy DEBUGFS_ADD_FILE(stations, data, S_IRUSR); 218343e851157adb966dd633e983b24040f72877737eWey-Yi Guy DEBUGFS_ADD_FILE(channels, data, S_IRUSR); 218443e851157adb966dd633e983b24040f72877737eWey-Yi Guy DEBUGFS_ADD_FILE(status, data, S_IRUSR); 218543e851157adb966dd633e983b24040f72877737eWey-Yi Guy DEBUGFS_ADD_FILE(interrupt, data, S_IWUSR | S_IRUSR); 218643e851157adb966dd633e983b24040f72877737eWey-Yi Guy DEBUGFS_ADD_FILE(qos, data, S_IRUSR); 218743e851157adb966dd633e983b24040f72877737eWey-Yi Guy DEBUGFS_ADD_FILE(led, data, S_IRUSR); 218843e851157adb966dd633e983b24040f72877737eWey-Yi Guy DEBUGFS_ADD_FILE(sleep_level_override, data, S_IWUSR | S_IRUSR); 218943e851157adb966dd633e983b24040f72877737eWey-Yi Guy DEBUGFS_ADD_FILE(current_sleep_command, data, S_IRUSR); 219043e851157adb966dd633e983b24040f72877737eWey-Yi Guy DEBUGFS_ADD_FILE(thermal_throttling, data, S_IRUSR); 219143e851157adb966dd633e983b24040f72877737eWey-Yi Guy DEBUGFS_ADD_FILE(disable_ht40, data, S_IWUSR | S_IRUSR); 219243e851157adb966dd633e983b24040f72877737eWey-Yi Guy DEBUGFS_ADD_FILE(rx_statistics, debug, S_IRUSR); 219343e851157adb966dd633e983b24040f72877737eWey-Yi Guy DEBUGFS_ADD_FILE(tx_statistics, debug, S_IRUSR); 219443e851157adb966dd633e983b24040f72877737eWey-Yi Guy DEBUGFS_ADD_FILE(traffic_log, debug, S_IWUSR | S_IRUSR); 219543e851157adb966dd633e983b24040f72877737eWey-Yi Guy DEBUGFS_ADD_FILE(rx_queue, debug, S_IRUSR); 219643e851157adb966dd633e983b24040f72877737eWey-Yi Guy DEBUGFS_ADD_FILE(tx_queue, debug, S_IRUSR); 219743e851157adb966dd633e983b24040f72877737eWey-Yi Guy DEBUGFS_ADD_FILE(tx_power, debug, S_IRUSR); 219843e851157adb966dd633e983b24040f72877737eWey-Yi Guy DEBUGFS_ADD_FILE(power_save_status, debug, S_IRUSR); 219943e851157adb966dd633e983b24040f72877737eWey-Yi Guy DEBUGFS_ADD_FILE(clear_ucode_statistics, debug, S_IWUSR); 220043e851157adb966dd633e983b24040f72877737eWey-Yi Guy DEBUGFS_ADD_FILE(clear_traffic_statistics, debug, S_IWUSR); 2201696bdee3ba216186e21997d20a839b76158346e6Wey-Yi Guy DEBUGFS_ADD_FILE(csr, debug, S_IWUSR); 22021b3eb8236ad9369ae519216b61a3d22806370115Wey-Yi Guy DEBUGFS_ADD_FILE(fh_reg, debug, S_IRUSR); 2203e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guy if ((priv->hw_rev & CSR_HW_REV_TYPE_MSK) != CSR_HW_REV_TYPE_3945) { 220443e851157adb966dd633e983b24040f72877737eWey-Yi Guy DEBUGFS_ADD_FILE(ucode_rx_stats, debug, S_IRUSR); 220543e851157adb966dd633e983b24040f72877737eWey-Yi Guy DEBUGFS_ADD_FILE(ucode_tx_stats, debug, S_IRUSR); 220643e851157adb966dd633e983b24040f72877737eWey-Yi Guy DEBUGFS_ADD_FILE(ucode_general_stats, debug, S_IRUSR); 220743e851157adb966dd633e983b24040f72877737eWey-Yi Guy DEBUGFS_ADD_FILE(sensitivity, debug, S_IRUSR); 220843e851157adb966dd633e983b24040f72877737eWey-Yi Guy DEBUGFS_ADD_FILE(chain_noise, debug, S_IRUSR); 2209a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy DEBUGFS_ADD_FILE(ucode_tracing, debug, S_IWUSR | S_IRUSR); 2210e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guy } 2211445c2dff409ef9de5d2f964d20917ab238fd266fTomas Winkler DEBUGFS_ADD_BOOL(disable_sensitivity, rf, &priv->disable_sens_cal); 2212445c2dff409ef9de5d2f964d20917ab238fd266fTomas Winkler DEBUGFS_ADD_BOOL(disable_chain_noise, rf, 2213445c2dff409ef9de5d2f964d20917ab238fd266fTomas Winkler &priv->disable_chain_noise_cal); 2214030b865520c3e26f4a316852aa022a22c4948907Wey-Yi Guy if (((priv->hw_rev & CSR_HW_REV_TYPE_MSK) == CSR_HW_REV_TYPE_4965) || 2215030b865520c3e26f4a316852aa022a22c4948907Wey-Yi Guy ((priv->hw_rev & CSR_HW_REV_TYPE_MSK) == CSR_HW_REV_TYPE_3945)) 2216030b865520c3e26f4a316852aa022a22c4948907Wey-Yi Guy DEBUGFS_ADD_BOOL(disable_tx_power, rf, 2217030b865520c3e26f4a316852aa022a22c4948907Wey-Yi Guy &priv->disable_tx_power_cal); 2218712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler return 0; 2219712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 2220712b6cf57a53da608a682b5f782c5785bda76001Tomas Winklererr: 222115b1687cb4f45b87ddbe4dfc7759ff5bb69497d2Winkler, Tomas IWL_ERR(priv, "Can't open the debugfs directory\n"); 2222712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler iwl_dbgfs_unregister(priv); 22233ac7f14694dd38273d9d96f1c873233d71190c15Tomas Winkler return ret; 2224712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler} 2225712b6cf57a53da608a682b5f782c5785bda76001Tomas WinklerEXPORT_SYMBOL(iwl_dbgfs_register); 2226712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 2227712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler/** 2228712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler * Remove the debugfs files and directories 2229712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler * 2230712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler */ 2231712b6cf57a53da608a682b5f782c5785bda76001Tomas Winklervoid iwl_dbgfs_unregister(struct iwl_priv *priv) 2232712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler{ 22333ac7f14694dd38273d9d96f1c873233d71190c15Tomas Winkler if (!priv->dbgfs) 2234712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler return; 2235712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 2236e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg DEBUGFS_REMOVE(priv->dbgfs->dbgfs_data_files.file_sleep_level_override); 2237e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg DEBUGFS_REMOVE(priv->dbgfs->dbgfs_data_files.file_current_sleep_command); 22380848e297c2107dbc12a91a1709c879c73bd188d8Wey-Yi Guy DEBUGFS_REMOVE(priv->dbgfs->dbgfs_data_files.file_nvm); 2239712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler DEBUGFS_REMOVE(priv->dbgfs->dbgfs_data_files.file_sram); 2240189a2b5942d62bd18e1e01772c4c784253f5dd16Ester Kummer DEBUGFS_REMOVE(priv->dbgfs->dbgfs_data_files.file_log_event); 2241712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler DEBUGFS_REMOVE(priv->dbgfs->dbgfs_data_files.file_stations); 2242d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomas DEBUGFS_REMOVE(priv->dbgfs->dbgfs_data_files.file_channels); 224308df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy DEBUGFS_REMOVE(priv->dbgfs->dbgfs_data_files.file_status); 2244a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy DEBUGFS_REMOVE(priv->dbgfs->dbgfs_data_files.file_interrupt); 2245f5ad69fa47e7b204d0032d569812544cd9a351fbWey-Yi Guy DEBUGFS_REMOVE(priv->dbgfs->dbgfs_data_files.file_qos); 2246a283c0116b0cc5e82327e50ad4d05f6d4d42c603Wey-Yi Guy DEBUGFS_REMOVE(priv->dbgfs->dbgfs_data_files.file_led); 2247fbf3a2af3834e8e93e9c2876de62c5b49988e352Wey-Yi Guy DEBUGFS_REMOVE(priv->dbgfs->dbgfs_data_files.file_thermal_throttling); 22481e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy DEBUGFS_REMOVE(priv->dbgfs->dbgfs_data_files.file_disable_ht40); 2249712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler DEBUGFS_REMOVE(priv->dbgfs->dir_data); 225022fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy DEBUGFS_REMOVE(priv->dbgfs->dbgfs_debug_files.file_rx_statistics); 225122fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy DEBUGFS_REMOVE(priv->dbgfs->dbgfs_debug_files.file_tx_statistics); 225220594eb0daa67f7a0cc19d74a1bafceb1bb09f4aWey-Yi Guy DEBUGFS_REMOVE(priv->dbgfs->dbgfs_debug_files.file_traffic_log); 2253141b03e07a54af68fc099459bf780a182b240b45Wey-Yi Guy DEBUGFS_REMOVE(priv->dbgfs->dbgfs_debug_files.file_rx_queue); 2254141b03e07a54af68fc099459bf780a182b240b45Wey-Yi Guy DEBUGFS_REMOVE(priv->dbgfs->dbgfs_debug_files.file_tx_queue); 2255f204b2487e5503ca4a9f3e69dcd63f6af979aaacWey-Yi Guy DEBUGFS_REMOVE(priv->dbgfs->dbgfs_debug_files.file_tx_power); 2256c09430abed4159e5c56aaea257d040f7452daba6Wey-Yi Guy DEBUGFS_REMOVE(priv->dbgfs->dbgfs_debug_files.file_power_save_status); 22577163b8a4ec995dabda3e92c6fed7b8600060618cWey-Yi Guy DEBUGFS_REMOVE(priv->dbgfs->dbgfs_debug_files. 22587163b8a4ec995dabda3e92c6fed7b8600060618cWey-Yi Guy file_clear_ucode_statistics); 22597163b8a4ec995dabda3e92c6fed7b8600060618cWey-Yi Guy DEBUGFS_REMOVE(priv->dbgfs->dbgfs_debug_files. 22607163b8a4ec995dabda3e92c6fed7b8600060618cWey-Yi Guy file_clear_traffic_statistics); 2261696bdee3ba216186e21997d20a839b76158346e6Wey-Yi Guy DEBUGFS_REMOVE(priv->dbgfs->dbgfs_debug_files.file_csr); 22621b3eb8236ad9369ae519216b61a3d22806370115Wey-Yi Guy DEBUGFS_REMOVE(priv->dbgfs->dbgfs_debug_files.file_fh_reg); 2263e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guy if ((priv->hw_rev & CSR_HW_REV_TYPE_MSK) != CSR_HW_REV_TYPE_3945) { 2264e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guy DEBUGFS_REMOVE(priv->dbgfs->dbgfs_debug_files. 2265e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guy file_ucode_rx_stats); 2266e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guy DEBUGFS_REMOVE(priv->dbgfs->dbgfs_debug_files. 2267e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guy file_ucode_tx_stats); 2268e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guy DEBUGFS_REMOVE(priv->dbgfs->dbgfs_debug_files. 2269e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guy file_ucode_general_stats); 22705225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy DEBUGFS_REMOVE(priv->dbgfs->dbgfs_debug_files. 22715225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy file_sensitivity); 22725225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy DEBUGFS_REMOVE(priv->dbgfs->dbgfs_debug_files. 22735225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy file_chain_noise); 2274a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy DEBUGFS_REMOVE(priv->dbgfs->dbgfs_debug_files. 2275a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy file_ucode_tracing); 2276e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guy } 227720594eb0daa67f7a0cc19d74a1bafceb1bb09f4aWey-Yi Guy DEBUGFS_REMOVE(priv->dbgfs->dir_debug); 2278445c2dff409ef9de5d2f964d20917ab238fd266fTomas Winkler DEBUGFS_REMOVE(priv->dbgfs->dbgfs_rf_files.file_disable_sensitivity); 2279445c2dff409ef9de5d2f964d20917ab238fd266fTomas Winkler DEBUGFS_REMOVE(priv->dbgfs->dbgfs_rf_files.file_disable_chain_noise); 2280030b865520c3e26f4a316852aa022a22c4948907Wey-Yi Guy if (((priv->hw_rev & CSR_HW_REV_TYPE_MSK) == CSR_HW_REV_TYPE_4965) || 2281030b865520c3e26f4a316852aa022a22c4948907Wey-Yi Guy ((priv->hw_rev & CSR_HW_REV_TYPE_MSK) == CSR_HW_REV_TYPE_3945)) 2282030b865520c3e26f4a316852aa022a22c4948907Wey-Yi Guy DEBUGFS_REMOVE(priv->dbgfs->dbgfs_rf_files.file_disable_tx_power); 2283445c2dff409ef9de5d2f964d20917ab238fd266fTomas Winkler DEBUGFS_REMOVE(priv->dbgfs->dir_rf); 2284712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler DEBUGFS_REMOVE(priv->dbgfs->dir_drv); 2285712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler kfree(priv->dbgfs); 2286712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler priv->dbgfs = NULL; 2287712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler} 2288712b6cf57a53da608a682b5f782c5785bda76001Tomas WinklerEXPORT_SYMBOL(iwl_dbgfs_unregister); 2289712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 2290712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 2291445c2dff409ef9de5d2f964d20917ab238fd266fTomas Winkler 2292