iwl-debugfs.c revision 7e4005cc4ae49100582ee1c97368dd79474f0a82
1712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler/****************************************************************************** 2712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler * 3712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler * GPL LICENSE SUMMARY 4712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler * 5901069c71415a76d731857ccda814e18ded062f7Wey-Yi Guy * Copyright(c) 2008 - 2011 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 295a0e3ad6af8660be21ca98a971cd00f331318c05Tejun Heo#include <linux/slab.h> 30712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler#include <linux/kernel.h> 31712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler#include <linux/module.h> 32712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler#include <linux/debugfs.h> 33712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 34712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler#include <linux/ieee80211.h> 35712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler#include <net/mac80211.h> 36712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 37712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 383e0d4cb12f6fd97193a455b49125398b2231c87cTomas Winkler#include "iwl-dev.h" 39712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler#include "iwl-debug.h" 40fee1247a30e5b3d48fe985b4a935eb6818f3b464Tomas Winkler#include "iwl-core.h" 413395f6e9cf48469d7ee05703cad1502002741c16Tomas Winkler#include "iwl-io.h" 42d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy#include "iwl-agn.h" 43712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 44712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler/* create and remove of files */ 454c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg#define DEBUGFS_ADD_FILE(name, parent, mode) do { \ 464c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg if (!debugfs_create_file(#name, mode, parent, priv, \ 474c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg &iwl_dbgfs_##name##_ops)) \ 484c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg goto err; \ 49712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler} while (0) 50712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 514c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg#define DEBUGFS_ADD_BOOL(name, parent, ptr) do { \ 524c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg struct dentry *__tmp; \ 534c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg __tmp = debugfs_create_bool(#name, S_IWUSR | S_IRUSR, \ 544c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg parent, ptr); \ 554c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg if (IS_ERR(__tmp) || !__tmp) \ 564c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg goto err; \ 57712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler} while (0) 58712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 594c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg#define DEBUGFS_ADD_X32(name, parent, ptr) do { \ 604c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg struct dentry *__tmp; \ 614c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg __tmp = debugfs_create_x32(#name, S_IWUSR | S_IRUSR, \ 624c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg parent, ptr); \ 634c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg if (IS_ERR(__tmp) || !__tmp) \ 644c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg goto err; \ 65445c2dff409ef9de5d2f964d20917ab238fd266fTomas Winkler} while (0) 66445c2dff409ef9de5d2f964d20917ab238fd266fTomas Winkler 67ca934b6715c134573da5acea01e9258eb0bf7c27Johannes Berg#define DEBUGFS_ADD_U32(name, parent, ptr, mode) do { \ 68ca934b6715c134573da5acea01e9258eb0bf7c27Johannes Berg struct dentry *__tmp; \ 69ca934b6715c134573da5acea01e9258eb0bf7c27Johannes Berg __tmp = debugfs_create_u32(#name, mode, \ 70ca934b6715c134573da5acea01e9258eb0bf7c27Johannes Berg parent, ptr); \ 71ca934b6715c134573da5acea01e9258eb0bf7c27Johannes Berg if (IS_ERR(__tmp) || !__tmp) \ 72ca934b6715c134573da5acea01e9258eb0bf7c27Johannes Berg goto err; \ 73ca934b6715c134573da5acea01e9258eb0bf7c27Johannes Berg} while (0) 74ca934b6715c134573da5acea01e9258eb0bf7c27Johannes Berg 75712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler/* file operation */ 76712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler#define DEBUGFS_READ_FUNC(name) \ 77712b6cf57a53da608a682b5f782c5785bda76001Tomas Winklerstatic ssize_t iwl_dbgfs_##name##_read(struct file *file, \ 78712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler char __user *user_buf, \ 79712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler size_t count, loff_t *ppos); 80712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 81712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler#define DEBUGFS_WRITE_FUNC(name) \ 82712b6cf57a53da608a682b5f782c5785bda76001Tomas Winklerstatic ssize_t iwl_dbgfs_##name##_write(struct file *file, \ 83712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler const char __user *user_buf, \ 84712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler size_t count, loff_t *ppos); 85712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 86712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 87712b6cf57a53da608a682b5f782c5785bda76001Tomas Winklerstatic int iwl_dbgfs_open_file_generic(struct inode *inode, struct file *file) 88712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler{ 89712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler file->private_data = inode->i_private; 90712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler return 0; 91712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler} 92712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 93712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler#define DEBUGFS_READ_FILE_OPS(name) \ 94712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler DEBUGFS_READ_FUNC(name); \ 95712b6cf57a53da608a682b5f782c5785bda76001Tomas Winklerstatic const struct file_operations iwl_dbgfs_##name##_ops = { \ 96712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler .read = iwl_dbgfs_##name##_read, \ 97712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler .open = iwl_dbgfs_open_file_generic, \ 982b18ab36cf7e956fb5b5ee12847e94fc66d496f4Arnd Bergmann .llseek = generic_file_llseek, \ 99712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler}; 100712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 101189a2b5942d62bd18e1e01772c4c784253f5dd16Ester Kummer#define DEBUGFS_WRITE_FILE_OPS(name) \ 102189a2b5942d62bd18e1e01772c4c784253f5dd16Ester Kummer DEBUGFS_WRITE_FUNC(name); \ 103189a2b5942d62bd18e1e01772c4c784253f5dd16Ester Kummerstatic const struct file_operations iwl_dbgfs_##name##_ops = { \ 104189a2b5942d62bd18e1e01772c4c784253f5dd16Ester Kummer .write = iwl_dbgfs_##name##_write, \ 105189a2b5942d62bd18e1e01772c4c784253f5dd16Ester Kummer .open = iwl_dbgfs_open_file_generic, \ 1062b18ab36cf7e956fb5b5ee12847e94fc66d496f4Arnd Bergmann .llseek = generic_file_llseek, \ 107189a2b5942d62bd18e1e01772c4c784253f5dd16Ester Kummer}; 108189a2b5942d62bd18e1e01772c4c784253f5dd16Ester Kummer 109189a2b5942d62bd18e1e01772c4c784253f5dd16Ester Kummer 110712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler#define DEBUGFS_READ_WRITE_FILE_OPS(name) \ 111712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler DEBUGFS_READ_FUNC(name); \ 112712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler DEBUGFS_WRITE_FUNC(name); \ 113712b6cf57a53da608a682b5f782c5785bda76001Tomas Winklerstatic const struct file_operations iwl_dbgfs_##name##_ops = { \ 114712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler .write = iwl_dbgfs_##name##_write, \ 115712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler .read = iwl_dbgfs_##name##_read, \ 116712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler .open = iwl_dbgfs_open_file_generic, \ 1172b18ab36cf7e956fb5b5ee12847e94fc66d496f4Arnd Bergmann .llseek = generic_file_llseek, \ 118712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler}; 119712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 120712b6cf57a53da608a682b5f782c5785bda76001Tomas Winklerstatic ssize_t iwl_dbgfs_tx_statistics_read(struct file *file, 121712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler char __user *user_buf, 122712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler size_t count, loff_t *ppos) { 123712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 12428f63a4bb744ea81030219aba2337fddb10b380bH Hartley Sweeten struct iwl_priv *priv = file->private_data; 12522fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy char *buf; 126712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler int pos = 0; 127712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 12822fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy int cnt; 12922fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy ssize_t ret; 13098a7b43be19faa7b92576c62614c45e38517331cWey-Yi Guy const size_t bufsz = 100 + 13198a7b43be19faa7b92576c62614c45e38517331cWey-Yi Guy sizeof(char) * 50 * (MANAGEMENT_MAX + CONTROL_MAX); 13222fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy buf = kzalloc(bufsz, GFP_KERNEL); 13322fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy if (!buf) 13422fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy return -ENOMEM; 13522fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "Management:\n"); 13622fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy for (cnt = 0; cnt < MANAGEMENT_MAX; cnt++) { 13722fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 13898a7b43be19faa7b92576c62614c45e38517331cWey-Yi Guy "\t%25s\t\t: %u\n", 13922fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy get_mgmt_string(cnt), 14022fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy priv->tx_stats.mgmt[cnt]); 14122fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy } 14222fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "Control\n"); 14322fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy for (cnt = 0; cnt < CONTROL_MAX; cnt++) { 14422fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 14598a7b43be19faa7b92576c62614c45e38517331cWey-Yi Guy "\t%25s\t\t: %u\n", 14622fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy get_ctrl_string(cnt), 14722fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy priv->tx_stats.ctrl[cnt]); 14822fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy } 14922fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "Data:\n"); 15022fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "\tcnt: %u\n", 15122fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy priv->tx_stats.data_cnt); 15222fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "\tbytes: %llu\n", 15322fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy priv->tx_stats.data_bytes); 15422fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy ret = simple_read_from_buffer(user_buf, count, ppos, buf, pos); 15522fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy kfree(buf); 15622fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy return ret; 15722fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy} 15822fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy 1597163b8a4ec995dabda3e92c6fed7b8600060618cWey-Yi Guystatic ssize_t iwl_dbgfs_clear_traffic_statistics_write(struct file *file, 16022fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy const char __user *user_buf, 16122fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy size_t count, loff_t *ppos) 16222fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy{ 16322fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy struct iwl_priv *priv = file->private_data; 16422fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy u32 clear_flag; 16522fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy char buf[8]; 16622fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy int buf_size; 167712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 16822fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy memset(buf, 0, sizeof(buf)); 16922fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy buf_size = min(count, sizeof(buf) - 1); 17022fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy if (copy_from_user(buf, user_buf, buf_size)) 17122fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy return -EFAULT; 17222fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy if (sscanf(buf, "%x", &clear_flag) != 1) 17322fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy return -EFAULT; 1747163b8a4ec995dabda3e92c6fed7b8600060618cWey-Yi Guy iwl_clear_traffic_stats(priv); 17522fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy 17622fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy return count; 177712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler} 178712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 179712b6cf57a53da608a682b5f782c5785bda76001Tomas Winklerstatic ssize_t iwl_dbgfs_rx_statistics_read(struct file *file, 180712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler char __user *user_buf, 181712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler size_t count, loff_t *ppos) { 182712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 18328f63a4bb744ea81030219aba2337fddb10b380bH Hartley Sweeten struct iwl_priv *priv = file->private_data; 18422fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy char *buf; 185712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler int pos = 0; 18622fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy int cnt; 18722fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy ssize_t ret; 18822fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy const size_t bufsz = 100 + 18998a7b43be19faa7b92576c62614c45e38517331cWey-Yi Guy sizeof(char) * 50 * (MANAGEMENT_MAX + CONTROL_MAX); 19022fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy buf = kzalloc(bufsz, GFP_KERNEL); 19122fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy if (!buf) 19222fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy return -ENOMEM; 193712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 19422fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "Management:\n"); 19522fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy for (cnt = 0; cnt < MANAGEMENT_MAX; cnt++) { 19622fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 19798a7b43be19faa7b92576c62614c45e38517331cWey-Yi Guy "\t%25s\t\t: %u\n", 19822fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy get_mgmt_string(cnt), 19922fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy priv->rx_stats.mgmt[cnt]); 20022fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy } 20122fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "Control:\n"); 20222fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy for (cnt = 0; cnt < CONTROL_MAX; cnt++) { 20322fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 20498a7b43be19faa7b92576c62614c45e38517331cWey-Yi Guy "\t%25s\t\t: %u\n", 20522fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy get_ctrl_string(cnt), 20622fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy priv->rx_stats.ctrl[cnt]); 20722fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy } 20822fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "Data:\n"); 20922fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "\tcnt: %u\n", 21022fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy priv->rx_stats.data_cnt); 21122fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "\tbytes: %llu\n", 21222fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy priv->rx_stats.data_bytes); 213712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 21422fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy ret = simple_read_from_buffer(user_buf, count, ppos, buf, pos); 21522fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy kfree(buf); 21622fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy return ret; 21722fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy} 21822fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy 219712b6cf57a53da608a682b5f782c5785bda76001Tomas Winklerstatic ssize_t iwl_dbgfs_sram_read(struct file *file, 220712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler char __user *user_buf, 221712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler size_t count, loff_t *ppos) 222712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler{ 22324834d2c8455a6eeee82e007d41d7e05986d134fJay Sternberg u32 val = 0; 2242943f136ffe29adb08162197b129bf8106e8191cWey-Yi Guy char *buf; 225712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler ssize_t ret; 22624834d2c8455a6eeee82e007d41d7e05986d134fJay Sternberg int i = 0; 22724834d2c8455a6eeee82e007d41d7e05986d134fJay Sternberg bool device_format = false; 22824834d2c8455a6eeee82e007d41d7e05986d134fJay Sternberg int offset = 0; 22924834d2c8455a6eeee82e007d41d7e05986d134fJay Sternberg int len = 0; 230712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler int pos = 0; 23124834d2c8455a6eeee82e007d41d7e05986d134fJay Sternberg int sram; 23228f63a4bb744ea81030219aba2337fddb10b380bH Hartley Sweeten struct iwl_priv *priv = file->private_data; 2332943f136ffe29adb08162197b129bf8106e8191cWey-Yi Guy size_t bufsz; 234712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 2355ade1e4dd1df436c3a441d17321c24aac8497306Wey-Yi Guy /* default is to dump the entire data segment */ 2364c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg if (!priv->dbgfs_sram_offset && !priv->dbgfs_sram_len) { 2374c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg priv->dbgfs_sram_offset = 0x800000; 238872907bb17fe2d8d01d0e9723f72f91cb4ea103fJohannes Berg if (priv->ucode_type == IWL_UCODE_INIT) 239dbf28e21ca391110e90ccad05dda79d2e2f60e0eJohannes Berg priv->dbgfs_sram_len = priv->ucode_init.data.len; 2405ade1e4dd1df436c3a441d17321c24aac8497306Wey-Yi Guy else 241dbf28e21ca391110e90ccad05dda79d2e2f60e0eJohannes Berg priv->dbgfs_sram_len = priv->ucode_rt.data.len; 2425ade1e4dd1df436c3a441d17321c24aac8497306Wey-Yi Guy } 24324834d2c8455a6eeee82e007d41d7e05986d134fJay Sternberg len = priv->dbgfs_sram_len; 24424834d2c8455a6eeee82e007d41d7e05986d134fJay Sternberg 24524834d2c8455a6eeee82e007d41d7e05986d134fJay Sternberg if (len == -4) { 24624834d2c8455a6eeee82e007d41d7e05986d134fJay Sternberg device_format = true; 24724834d2c8455a6eeee82e007d41d7e05986d134fJay Sternberg len = 4; 24824834d2c8455a6eeee82e007d41d7e05986d134fJay Sternberg } 24924834d2c8455a6eeee82e007d41d7e05986d134fJay Sternberg 25024834d2c8455a6eeee82e007d41d7e05986d134fJay Sternberg bufsz = 50 + len * 4; 2512943f136ffe29adb08162197b129bf8106e8191cWey-Yi Guy buf = kmalloc(bufsz, GFP_KERNEL); 2522943f136ffe29adb08162197b129bf8106e8191cWey-Yi Guy if (!buf) 2532943f136ffe29adb08162197b129bf8106e8191cWey-Yi Guy return -ENOMEM; 25424834d2c8455a6eeee82e007d41d7e05986d134fJay Sternberg 2555ade1e4dd1df436c3a441d17321c24aac8497306Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "sram_len: 0x%x\n", 25624834d2c8455a6eeee82e007d41d7e05986d134fJay Sternberg len); 2575ade1e4dd1df436c3a441d17321c24aac8497306Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "sram_offset: 0x%x\n", 2584c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg priv->dbgfs_sram_offset); 25924834d2c8455a6eeee82e007d41d7e05986d134fJay Sternberg 26024834d2c8455a6eeee82e007d41d7e05986d134fJay Sternberg /* adjust sram address since reads are only on even u32 boundaries */ 26124834d2c8455a6eeee82e007d41d7e05986d134fJay Sternberg offset = priv->dbgfs_sram_offset & 0x3; 26224834d2c8455a6eeee82e007d41d7e05986d134fJay Sternberg sram = priv->dbgfs_sram_offset & ~0x3; 26324834d2c8455a6eeee82e007d41d7e05986d134fJay Sternberg 26424834d2c8455a6eeee82e007d41d7e05986d134fJay Sternberg /* read the first u32 from sram */ 26583ed90155f98bd949735c2cc22d832b557a6d7d1Emmanuel Grumbach val = iwl_read_targ_mem(bus(priv), sram); 26624834d2c8455a6eeee82e007d41d7e05986d134fJay Sternberg 26724834d2c8455a6eeee82e007d41d7e05986d134fJay Sternberg for (; len; len--) { 26824834d2c8455a6eeee82e007d41d7e05986d134fJay Sternberg /* put the address at the start of every line */ 26924834d2c8455a6eeee82e007d41d7e05986d134fJay Sternberg if (i == 0) 27024834d2c8455a6eeee82e007d41d7e05986d134fJay Sternberg pos += scnprintf(buf + pos, bufsz - pos, 27124834d2c8455a6eeee82e007d41d7e05986d134fJay Sternberg "%08X: ", sram + offset); 27224834d2c8455a6eeee82e007d41d7e05986d134fJay Sternberg 27324834d2c8455a6eeee82e007d41d7e05986d134fJay Sternberg if (device_format) 27424834d2c8455a6eeee82e007d41d7e05986d134fJay Sternberg pos += scnprintf(buf + pos, bufsz - pos, 27524834d2c8455a6eeee82e007d41d7e05986d134fJay Sternberg "%02x", (val >> (8 * (3 - offset))) & 0xff); 27624834d2c8455a6eeee82e007d41d7e05986d134fJay Sternberg else 27724834d2c8455a6eeee82e007d41d7e05986d134fJay Sternberg pos += scnprintf(buf + pos, bufsz - pos, 27824834d2c8455a6eeee82e007d41d7e05986d134fJay Sternberg "%02x ", (val >> (8 * offset)) & 0xff); 27924834d2c8455a6eeee82e007d41d7e05986d134fJay Sternberg 28024834d2c8455a6eeee82e007d41d7e05986d134fJay Sternberg /* if all bytes processed, read the next u32 from sram */ 28124834d2c8455a6eeee82e007d41d7e05986d134fJay Sternberg if (++offset == 4) { 28224834d2c8455a6eeee82e007d41d7e05986d134fJay Sternberg sram += 4; 28324834d2c8455a6eeee82e007d41d7e05986d134fJay Sternberg offset = 0; 28483ed90155f98bd949735c2cc22d832b557a6d7d1Emmanuel Grumbach val = iwl_read_targ_mem(bus(priv), sram); 285712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler } 28624834d2c8455a6eeee82e007d41d7e05986d134fJay Sternberg 28724834d2c8455a6eeee82e007d41d7e05986d134fJay Sternberg /* put in extra spaces and split lines for human readability */ 28824834d2c8455a6eeee82e007d41d7e05986d134fJay Sternberg if (++i == 16) { 28924834d2c8455a6eeee82e007d41d7e05986d134fJay Sternberg i = 0; 2902943f136ffe29adb08162197b129bf8106e8191cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "\n"); 29124834d2c8455a6eeee82e007d41d7e05986d134fJay Sternberg } else if (!(i & 7)) { 29224834d2c8455a6eeee82e007d41d7e05986d134fJay Sternberg pos += scnprintf(buf + pos, bufsz - pos, " "); 29324834d2c8455a6eeee82e007d41d7e05986d134fJay Sternberg } else if (!(i & 3)) { 29424834d2c8455a6eeee82e007d41d7e05986d134fJay Sternberg pos += scnprintf(buf + pos, bufsz - pos, " "); 29524834d2c8455a6eeee82e007d41d7e05986d134fJay Sternberg } 296712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler } 29724834d2c8455a6eeee82e007d41d7e05986d134fJay Sternberg if (i) 29824834d2c8455a6eeee82e007d41d7e05986d134fJay Sternberg pos += scnprintf(buf + pos, bufsz - pos, "\n"); 299712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 300712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler ret = simple_read_from_buffer(user_buf, count, ppos, buf, pos); 3012943f136ffe29adb08162197b129bf8106e8191cWey-Yi Guy kfree(buf); 302712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler return ret; 303712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler} 304712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 305712b6cf57a53da608a682b5f782c5785bda76001Tomas Winklerstatic ssize_t iwl_dbgfs_sram_write(struct file *file, 306712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler const char __user *user_buf, 307712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler size_t count, loff_t *ppos) 308712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler{ 309712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler struct iwl_priv *priv = file->private_data; 310712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler char buf[64]; 311712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler int buf_size; 312712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler u32 offset, len; 313712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 314712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler memset(buf, 0, sizeof(buf)); 315712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler buf_size = min(count, sizeof(buf) - 1); 316712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler if (copy_from_user(buf, user_buf, buf_size)) 317712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler return -EFAULT; 318712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 319712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler if (sscanf(buf, "%x,%x", &offset, &len) == 2) { 3204c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg priv->dbgfs_sram_offset = offset; 3214c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg priv->dbgfs_sram_len = len; 32224834d2c8455a6eeee82e007d41d7e05986d134fJay Sternberg } else if (sscanf(buf, "%x", &offset) == 1) { 32324834d2c8455a6eeee82e007d41d7e05986d134fJay Sternberg priv->dbgfs_sram_offset = offset; 32424834d2c8455a6eeee82e007d41d7e05986d134fJay Sternberg priv->dbgfs_sram_len = -4; 325712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler } else { 3264c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg priv->dbgfs_sram_offset = 0; 3274c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg priv->dbgfs_sram_len = 0; 328712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler } 329712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 330712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler return count; 331712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler} 332712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 333c8ac61cf6e53fefb3b439fc58390fb65d2730e63Johannes Bergstatic ssize_t iwl_dbgfs_wowlan_sram_read(struct file *file, 334c8ac61cf6e53fefb3b439fc58390fb65d2730e63Johannes Berg char __user *user_buf, 335c8ac61cf6e53fefb3b439fc58390fb65d2730e63Johannes Berg size_t count, loff_t *ppos) 336c8ac61cf6e53fefb3b439fc58390fb65d2730e63Johannes Berg{ 337c8ac61cf6e53fefb3b439fc58390fb65d2730e63Johannes Berg struct iwl_priv *priv = file->private_data; 338c8ac61cf6e53fefb3b439fc58390fb65d2730e63Johannes Berg 339c8ac61cf6e53fefb3b439fc58390fb65d2730e63Johannes Berg if (!priv->wowlan_sram) 340c8ac61cf6e53fefb3b439fc58390fb65d2730e63Johannes Berg return -ENODATA; 341c8ac61cf6e53fefb3b439fc58390fb65d2730e63Johannes Berg 342c8ac61cf6e53fefb3b439fc58390fb65d2730e63Johannes Berg return simple_read_from_buffer(user_buf, count, ppos, 343c8ac61cf6e53fefb3b439fc58390fb65d2730e63Johannes Berg priv->wowlan_sram, 344c8ac61cf6e53fefb3b439fc58390fb65d2730e63Johannes Berg priv->ucode_wowlan.data.len); 345c8ac61cf6e53fefb3b439fc58390fb65d2730e63Johannes Berg} 346712b6cf57a53da608a682b5f782c5785bda76001Tomas Winklerstatic ssize_t iwl_dbgfs_stations_read(struct file *file, char __user *user_buf, 347712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler size_t count, loff_t *ppos) 348712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler{ 34928f63a4bb744ea81030219aba2337fddb10b380bH Hartley Sweeten struct iwl_priv *priv = file->private_data; 3506def9761f72501e638e79eebcd70afea12a3a93dTomas Winkler struct iwl_station_entry *station; 3515f85a7890cbfd2be8f4c6620b2a6774d6b5ac647Emmanuel Grumbach struct iwl_tid_data *tid_data; 352d618912417fbce4f6514fe1cbef7df2e73bdb6c2Emmanuel Grumbach int max_sta = hw_params(priv).max_stations; 353712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler char *buf; 354712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler int i, j, pos = 0; 355712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler ssize_t ret; 356712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler /* Add 30 for initial string */ 357712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler const size_t bufsz = 30 + sizeof(char) * 500 * (priv->num_stations); 358712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 359712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler buf = kmalloc(bufsz, GFP_KERNEL); 3603ac7f14694dd38273d9d96f1c873233d71190c15Tomas Winkler if (!buf) 361712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler return -ENOMEM; 362712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 363db0589f3b9443f2b57ea6daaec09c1ab0ac99cb0Abhijeet Kolekar pos += scnprintf(buf + pos, bufsz - pos, "num of stations: %d\n\n", 364712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler priv->num_stations); 365712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 366712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler for (i = 0; i < max_sta; i++) { 367712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler station = &priv->stations[i]; 368da73511d4316c4e3efe903e123286c5b55a1999fJohannes Berg if (!station->used) 369da73511d4316c4e3efe903e123286c5b55a1999fJohannes Berg continue; 370da73511d4316c4e3efe903e123286c5b55a1999fJohannes Berg pos += scnprintf(buf + pos, bufsz - pos, 371da73511d4316c4e3efe903e123286c5b55a1999fJohannes Berg "station %d - addr: %pM, flags: %#x\n", 372da73511d4316c4e3efe903e123286c5b55a1999fJohannes Berg i, station->sta.sta.addr, 373da73511d4316c4e3efe903e123286c5b55a1999fJohannes Berg station->sta.station_flags_msk); 374da73511d4316c4e3efe903e123286c5b55a1999fJohannes Berg pos += scnprintf(buf + pos, bufsz - pos, 3755f85a7890cbfd2be8f4c6620b2a6774d6b5ac647Emmanuel Grumbach "TID\tseq_num\ttxq_id\ttfds\trate_n_flags\n"); 376712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 3775f85a7890cbfd2be8f4c6620b2a6774d6b5ac647Emmanuel Grumbach for (j = 0; j < IWL_MAX_TID_COUNT; j++) { 3785f85a7890cbfd2be8f4c6620b2a6774d6b5ac647Emmanuel Grumbach tid_data = &priv->shrd->tid_data[i][j]; 379da73511d4316c4e3efe903e123286c5b55a1999fJohannes Berg pos += scnprintf(buf + pos, bufsz - pos, 3805f85a7890cbfd2be8f4c6620b2a6774d6b5ac647Emmanuel Grumbach "%d:\t%#x\t%#x\t%u\t%#x", 3815f85a7890cbfd2be8f4c6620b2a6774d6b5ac647Emmanuel Grumbach j, tid_data->seq_number, 3825f85a7890cbfd2be8f4c6620b2a6774d6b5ac647Emmanuel Grumbach tid_data->agg.txq_id, 3835f85a7890cbfd2be8f4c6620b2a6774d6b5ac647Emmanuel Grumbach tid_data->tfds_in_queue, 3845f85a7890cbfd2be8f4c6620b2a6774d6b5ac647Emmanuel Grumbach tid_data->agg.rate_n_flags); 3855f85a7890cbfd2be8f4c6620b2a6774d6b5ac647Emmanuel Grumbach 3865f85a7890cbfd2be8f4c6620b2a6774d6b5ac647Emmanuel Grumbach if (tid_data->agg.wait_for_ba) 387db0589f3b9443f2b57ea6daaec09c1ab0ac99cb0Abhijeet Kolekar pos += scnprintf(buf + pos, bufsz - pos, 388da73511d4316c4e3efe903e123286c5b55a1999fJohannes Berg " - waitforba"); 389db0589f3b9443f2b57ea6daaec09c1ab0ac99cb0Abhijeet Kolekar pos += scnprintf(buf + pos, bufsz - pos, "\n"); 390712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler } 391da73511d4316c4e3efe903e123286c5b55a1999fJohannes Berg 392da73511d4316c4e3efe903e123286c5b55a1999fJohannes Berg pos += scnprintf(buf + pos, bufsz - pos, "\n"); 393712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler } 394712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 395712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler ret = simple_read_from_buffer(user_buf, count, ppos, buf, pos); 396712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler kfree(buf); 397712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler return ret; 398712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler} 399712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 4000848e297c2107dbc12a91a1709c879c73bd188d8Wey-Yi Guystatic ssize_t iwl_dbgfs_nvm_read(struct file *file, 4018dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler char __user *user_buf, 4028dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler size_t count, 4038dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler loff_t *ppos) 4048dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler{ 4058dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler ssize_t ret; 40628f63a4bb744ea81030219aba2337fddb10b380bH Hartley Sweeten struct iwl_priv *priv = file->private_data; 4078dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler int pos = 0, ofs = 0, buf_size = 0; 4088dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler const u8 *ptr; 4098dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler char *buf; 410e307ddce394ee7bcec41fb74330ac89eafaea1d9Wey-Yi Guy u16 eeprom_ver; 4117cb1b0887fcc61918e3d64827fbef968bb67a57aWey-Yi Guy size_t eeprom_len = priv->cfg->base_params->eeprom_size; 4128dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler buf_size = 4 * eeprom_len + 256; 4138dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler 4148dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler if (eeprom_len % 16) { 4150848e297c2107dbc12a91a1709c879c73bd188d8Wey-Yi Guy IWL_ERR(priv, "NVM size is not multiple of 16.\n"); 4168dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler return -ENODATA; 4178dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler } 4188dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler 419c37457e69ffd7d3c94cbfcc1c39be9a45dd7ad21Julia Lawall ptr = priv->eeprom; 420c37457e69ffd7d3c94cbfcc1c39be9a45dd7ad21Julia Lawall if (!ptr) { 421c37457e69ffd7d3c94cbfcc1c39be9a45dd7ad21Julia Lawall IWL_ERR(priv, "Invalid EEPROM/OTP memory\n"); 422c37457e69ffd7d3c94cbfcc1c39be9a45dd7ad21Julia Lawall return -ENOMEM; 423c37457e69ffd7d3c94cbfcc1c39be9a45dd7ad21Julia Lawall } 424c37457e69ffd7d3c94cbfcc1c39be9a45dd7ad21Julia Lawall 4258dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler /* 4 characters for byte 0xYY */ 4268dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler buf = kzalloc(buf_size, GFP_KERNEL); 4278dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler if (!buf) { 42815b1687cb4f45b87ddbe4dfc7759ff5bb69497d2Winkler, Tomas IWL_ERR(priv, "Can not allocate Buffer\n"); 4298dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler return -ENOMEM; 4308dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler } 431e307ddce394ee7bcec41fb74330ac89eafaea1d9Wey-Yi Guy eeprom_ver = iwl_eeprom_query16(priv, EEPROM_VERSION); 432e307ddce394ee7bcec41fb74330ac89eafaea1d9Wey-Yi Guy pos += scnprintf(buf + pos, buf_size - pos, "NVM Type: %s, " 433e307ddce394ee7bcec41fb74330ac89eafaea1d9Wey-Yi Guy "version: 0x%x\n", 4340848e297c2107dbc12a91a1709c879c73bd188d8Wey-Yi Guy (priv->nvm_device_type == NVM_DEVICE_TYPE_OTP) 435e307ddce394ee7bcec41fb74330ac89eafaea1d9Wey-Yi Guy ? "OTP" : "EEPROM", eeprom_ver); 4368dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler for (ofs = 0 ; ofs < eeprom_len ; ofs += 16) { 4378dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler pos += scnprintf(buf + pos, buf_size - pos, "0x%.4x ", ofs); 4388dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler hex_dump_to_buffer(ptr + ofs, 16 , 16, 2, buf + pos, 4398dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler buf_size - pos, 0); 4402fac9717a05fc4b4824422d2c439c1260807c110Reinette Chatre pos += strlen(buf + pos); 4418dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler if (buf_size - pos > 0) 4428dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler buf[pos++] = '\n'; 4438dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler } 4448dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler 4458dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler ret = simple_read_from_buffer(user_buf, count, ppos, buf, pos); 4468dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler kfree(buf); 4478dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler return ret; 4488dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler} 449712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 450d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomasstatic ssize_t iwl_dbgfs_channels_read(struct file *file, char __user *user_buf, 451d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomas size_t count, loff_t *ppos) 452d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomas{ 45328f63a4bb744ea81030219aba2337fddb10b380bH Hartley Sweeten struct iwl_priv *priv = file->private_data; 454d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomas struct ieee80211_channel *channels = NULL; 455d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomas const struct ieee80211_supported_band *supp_band = NULL; 456d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomas int pos = 0, i, bufsz = PAGE_SIZE; 457d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomas char *buf; 458d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomas ssize_t ret; 459d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomas 46063013ae30159c90d2a873e20e680e7810fa533faEmmanuel Grumbach if (!test_bit(STATUS_GEO_CONFIGURED, &priv->shrd->status)) 461d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomas return -EAGAIN; 462d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomas 463d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomas buf = kzalloc(bufsz, GFP_KERNEL); 464d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomas if (!buf) { 46515b1687cb4f45b87ddbe4dfc7759ff5bb69497d2Winkler, Tomas IWL_ERR(priv, "Can not allocate Buffer\n"); 466d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomas return -ENOMEM; 467d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomas } 468d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomas 469d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomas supp_band = iwl_get_hw_mode(priv, IEEE80211_BAND_2GHZ); 470a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy if (supp_band) { 471a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy channels = supp_band->channels; 472d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomas 473d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomas pos += scnprintf(buf + pos, bufsz - pos, 474a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy "Displaying %d channels in 2.4GHz band 802.11bg):\n", 475a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy supp_band->n_channels); 476d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomas 477a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy for (i = 0; i < supp_band->n_channels; i++) 478a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 479a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy "%d: %ddBm: BSS%s%s, %s.\n", 48081e95430aaa898799421617c2db2882386bab69aShanyu Zhao channels[i].hw_value, 481a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy channels[i].max_power, 482a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy channels[i].flags & IEEE80211_CHAN_RADAR ? 483a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy " (IEEE 802.11h required)" : "", 484a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy ((channels[i].flags & IEEE80211_CHAN_NO_IBSS) 485a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy || (channels[i].flags & 486a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy IEEE80211_CHAN_RADAR)) ? "" : 487a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy ", IBSS", 488a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy channels[i].flags & 489a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy IEEE80211_CHAN_PASSIVE_SCAN ? 490a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy "passive only" : "active/passive"); 491a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy } 492d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomas supp_band = iwl_get_hw_mode(priv, IEEE80211_BAND_5GHZ); 493a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy if (supp_band) { 494a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy channels = supp_band->channels; 495d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomas 496d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomas pos += scnprintf(buf + pos, bufsz - pos, 497a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy "Displaying %d channels in 5.2GHz band (802.11a)\n", 498a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy supp_band->n_channels); 499a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy 500a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy for (i = 0; i < supp_band->n_channels; i++) 501a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 502a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy "%d: %ddBm: BSS%s%s, %s.\n", 50381e95430aaa898799421617c2db2882386bab69aShanyu Zhao channels[i].hw_value, 504a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy channels[i].max_power, 505a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy channels[i].flags & IEEE80211_CHAN_RADAR ? 506a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy " (IEEE 802.11h required)" : "", 507a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy ((channels[i].flags & IEEE80211_CHAN_NO_IBSS) 508a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy || (channels[i].flags & 509a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy IEEE80211_CHAN_RADAR)) ? "" : 510a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy ", IBSS", 511a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy channels[i].flags & 512a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy IEEE80211_CHAN_PASSIVE_SCAN ? 513a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy "passive only" : "active/passive"); 514a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy } 515d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomas ret = simple_read_from_buffer(user_buf, count, ppos, buf, pos); 516d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomas kfree(buf); 517d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomas return ret; 518d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomas} 519d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomas 52008df05aa9b25f3079585855506022bb33a011183Wey-Yi Guystatic ssize_t iwl_dbgfs_status_read(struct file *file, 52108df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy char __user *user_buf, 52208df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy size_t count, loff_t *ppos) { 52308df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy 52428f63a4bb744ea81030219aba2337fddb10b380bH Hartley Sweeten struct iwl_priv *priv = file->private_data; 52508df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy char buf[512]; 52608df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy int pos = 0; 52708df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy const size_t bufsz = sizeof(buf); 52808df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy 52908df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "STATUS_HCMD_ACTIVE:\t %d\n", 53063013ae30159c90d2a873e20e680e7810fa533faEmmanuel Grumbach test_bit(STATUS_HCMD_ACTIVE, &priv->shrd->status)); 53108df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "STATUS_INT_ENABLED:\t %d\n", 53263013ae30159c90d2a873e20e680e7810fa533faEmmanuel Grumbach test_bit(STATUS_INT_ENABLED, &priv->shrd->status)); 53308df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "STATUS_RF_KILL_HW:\t %d\n", 53463013ae30159c90d2a873e20e680e7810fa533faEmmanuel Grumbach test_bit(STATUS_RF_KILL_HW, &priv->shrd->status)); 5357812b16730ccebce71a3b2228ac08dd4f8b39469Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "STATUS_CT_KILL:\t\t %d\n", 53663013ae30159c90d2a873e20e680e7810fa533faEmmanuel Grumbach test_bit(STATUS_CT_KILL, &priv->shrd->status)); 53708df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "STATUS_INIT:\t\t %d\n", 53863013ae30159c90d2a873e20e680e7810fa533faEmmanuel Grumbach test_bit(STATUS_INIT, &priv->shrd->status)); 53908df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "STATUS_ALIVE:\t\t %d\n", 54063013ae30159c90d2a873e20e680e7810fa533faEmmanuel Grumbach test_bit(STATUS_ALIVE, &priv->shrd->status)); 54108df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "STATUS_READY:\t\t %d\n", 54263013ae30159c90d2a873e20e680e7810fa533faEmmanuel Grumbach test_bit(STATUS_READY, &priv->shrd->status)); 54308df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "STATUS_TEMPERATURE:\t %d\n", 54463013ae30159c90d2a873e20e680e7810fa533faEmmanuel Grumbach test_bit(STATUS_TEMPERATURE, &priv->shrd->status)); 54508df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "STATUS_GEO_CONFIGURED:\t %d\n", 54663013ae30159c90d2a873e20e680e7810fa533faEmmanuel Grumbach test_bit(STATUS_GEO_CONFIGURED, &priv->shrd->status)); 54708df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "STATUS_EXIT_PENDING:\t %d\n", 54863013ae30159c90d2a873e20e680e7810fa533faEmmanuel Grumbach test_bit(STATUS_EXIT_PENDING, &priv->shrd->status)); 54908df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "STATUS_STATISTICS:\t %d\n", 55063013ae30159c90d2a873e20e680e7810fa533faEmmanuel Grumbach test_bit(STATUS_STATISTICS, &priv->shrd->status)); 55108df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "STATUS_SCANNING:\t %d\n", 55263013ae30159c90d2a873e20e680e7810fa533faEmmanuel Grumbach test_bit(STATUS_SCANNING, &priv->shrd->status)); 55308df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "STATUS_SCAN_ABORTING:\t %d\n", 55463013ae30159c90d2a873e20e680e7810fa533faEmmanuel Grumbach test_bit(STATUS_SCAN_ABORTING, &priv->shrd->status)); 55508df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "STATUS_SCAN_HW:\t\t %d\n", 55663013ae30159c90d2a873e20e680e7810fa533faEmmanuel Grumbach test_bit(STATUS_SCAN_HW, &priv->shrd->status)); 55708df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "STATUS_POWER_PMI:\t %d\n", 55863013ae30159c90d2a873e20e680e7810fa533faEmmanuel Grumbach test_bit(STATUS_POWER_PMI, &priv->shrd->status)); 55908df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "STATUS_FW_ERROR:\t %d\n", 56063013ae30159c90d2a873e20e680e7810fa533faEmmanuel Grumbach test_bit(STATUS_FW_ERROR, &priv->shrd->status)); 56108df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy return simple_read_from_buffer(user_buf, count, ppos, buf, pos); 56208df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy} 56308df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy 5641f7b6172db86e9ab2b4cd794441bb2c40ab287fcEmmanuel Grumbachstatic ssize_t iwl_dbgfs_rx_handlers_read(struct file *file, 565a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy char __user *user_buf, 566a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy size_t count, loff_t *ppos) { 567a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy 56828f63a4bb744ea81030219aba2337fddb10b380bH Hartley Sweeten struct iwl_priv *priv = file->private_data; 5691f7b6172db86e9ab2b4cd794441bb2c40ab287fcEmmanuel Grumbach 570a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy int pos = 0; 571a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy int cnt = 0; 572a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy char *buf; 573a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy int bufsz = 24 * 64; /* 24 items * 64 char per item */ 574a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy ssize_t ret; 575a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy 576a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy buf = kzalloc(bufsz, GFP_KERNEL); 577a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy if (!buf) { 578a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy IWL_ERR(priv, "Can not allocate Buffer\n"); 579a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy return -ENOMEM; 580a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy } 581a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy 582a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy for (cnt = 0; cnt < REPLY_MAX; cnt++) { 5831f7b6172db86e9ab2b4cd794441bb2c40ab287fcEmmanuel Grumbach if (priv->rx_handlers_stats[cnt] > 0) 584a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 585a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy "\tRx handler[%36s]:\t\t %u\n", 586a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy get_cmd_string(cnt), 5871f7b6172db86e9ab2b4cd794441bb2c40ab287fcEmmanuel Grumbach priv->rx_handlers_stats[cnt]); 588a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy } 589a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy 590a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy ret = simple_read_from_buffer(user_buf, count, ppos, buf, pos); 591a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy kfree(buf); 592a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy return ret; 593a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy} 594a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy 5951f7b6172db86e9ab2b4cd794441bb2c40ab287fcEmmanuel Grumbachstatic ssize_t iwl_dbgfs_rx_handlers_write(struct file *file, 596a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy const char __user *user_buf, 597a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy size_t count, loff_t *ppos) 598a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy{ 599a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy struct iwl_priv *priv = file->private_data; 6001f7b6172db86e9ab2b4cd794441bb2c40ab287fcEmmanuel Grumbach 601a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy char buf[8]; 602a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy int buf_size; 603a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy u32 reset_flag; 604a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy 605a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy memset(buf, 0, sizeof(buf)); 606a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy buf_size = min(count, sizeof(buf) - 1); 607a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy if (copy_from_user(buf, user_buf, buf_size)) 608a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy return -EFAULT; 609a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy if (sscanf(buf, "%x", &reset_flag) != 1) 610a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy return -EFAULT; 611a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy if (reset_flag == 0) 6121f7b6172db86e9ab2b4cd794441bb2c40ab287fcEmmanuel Grumbach memset(&priv->rx_handlers_stats[0], 0, 6131f7b6172db86e9ab2b4cd794441bb2c40ab287fcEmmanuel Grumbach sizeof(priv->rx_handlers_stats)); 614a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy 615a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy return count; 616a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy} 617a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy 618f5ad69fa47e7b204d0032d569812544cd9a351fbWey-Yi Guystatic ssize_t iwl_dbgfs_qos_read(struct file *file, char __user *user_buf, 619f5ad69fa47e7b204d0032d569812544cd9a351fbWey-Yi Guy size_t count, loff_t *ppos) 620f5ad69fa47e7b204d0032d569812544cd9a351fbWey-Yi Guy{ 62128f63a4bb744ea81030219aba2337fddb10b380bH Hartley Sweeten struct iwl_priv *priv = file->private_data; 6228dfdb9d5757424f7018a643258065c4fc8e6a439Johannes Berg struct iwl_rxon_context *ctx; 623f5ad69fa47e7b204d0032d569812544cd9a351fbWey-Yi Guy int pos = 0, i; 6248dfdb9d5757424f7018a643258065c4fc8e6a439Johannes Berg char buf[256 * NUM_IWL_RXON_CTX]; 625f5ad69fa47e7b204d0032d569812544cd9a351fbWey-Yi Guy const size_t bufsz = sizeof(buf); 626f5ad69fa47e7b204d0032d569812544cd9a351fbWey-Yi Guy 6278dfdb9d5757424f7018a643258065c4fc8e6a439Johannes Berg for_each_context(priv, ctx) { 6288dfdb9d5757424f7018a643258065c4fc8e6a439Johannes Berg pos += scnprintf(buf + pos, bufsz - pos, "context %d:\n", 6298dfdb9d5757424f7018a643258065c4fc8e6a439Johannes Berg ctx->ctxid); 6308dfdb9d5757424f7018a643258065c4fc8e6a439Johannes Berg for (i = 0; i < AC_NUM; i++) { 6318dfdb9d5757424f7018a643258065c4fc8e6a439Johannes Berg pos += scnprintf(buf + pos, bufsz - pos, 6328dfdb9d5757424f7018a643258065c4fc8e6a439Johannes Berg "\tcw_min\tcw_max\taifsn\ttxop\n"); 6338dfdb9d5757424f7018a643258065c4fc8e6a439Johannes Berg pos += scnprintf(buf + pos, bufsz - pos, 634f5ad69fa47e7b204d0032d569812544cd9a351fbWey-Yi Guy "AC[%d]\t%u\t%u\t%u\t%u\n", i, 6358dfdb9d5757424f7018a643258065c4fc8e6a439Johannes Berg ctx->qos_data.def_qos_parm.ac[i].cw_min, 6368dfdb9d5757424f7018a643258065c4fc8e6a439Johannes Berg ctx->qos_data.def_qos_parm.ac[i].cw_max, 6378dfdb9d5757424f7018a643258065c4fc8e6a439Johannes Berg ctx->qos_data.def_qos_parm.ac[i].aifsn, 6388dfdb9d5757424f7018a643258065c4fc8e6a439Johannes Berg ctx->qos_data.def_qos_parm.ac[i].edca_txop); 6398dfdb9d5757424f7018a643258065c4fc8e6a439Johannes Berg } 6408dfdb9d5757424f7018a643258065c4fc8e6a439Johannes Berg pos += scnprintf(buf + pos, bufsz - pos, "\n"); 641f5ad69fa47e7b204d0032d569812544cd9a351fbWey-Yi Guy } 6424967c31677cf3c6c49aadf205f1a31d15d7610daWey-Yi Guy return simple_read_from_buffer(user_buf, count, ppos, buf, pos); 643f5ad69fa47e7b204d0032d569812544cd9a351fbWey-Yi Guy} 644a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy 645fbf3a2af3834e8e93e9c2876de62c5b49988e352Wey-Yi Guystatic ssize_t iwl_dbgfs_thermal_throttling_read(struct file *file, 646fbf3a2af3834e8e93e9c2876de62c5b49988e352Wey-Yi Guy char __user *user_buf, 647fbf3a2af3834e8e93e9c2876de62c5b49988e352Wey-Yi Guy size_t count, loff_t *ppos) 648fbf3a2af3834e8e93e9c2876de62c5b49988e352Wey-Yi Guy{ 64928f63a4bb744ea81030219aba2337fddb10b380bH Hartley Sweeten struct iwl_priv *priv = file->private_data; 6503ad3b92a5517c043ef30e4b95c4c39a35bbc36beJohannes Berg struct iwl_tt_mgmt *tt = &priv->thermal_throttle; 651fbf3a2af3834e8e93e9c2876de62c5b49988e352Wey-Yi Guy struct iwl_tt_restriction *restriction; 652fbf3a2af3834e8e93e9c2876de62c5b49988e352Wey-Yi Guy char buf[100]; 653fbf3a2af3834e8e93e9c2876de62c5b49988e352Wey-Yi Guy int pos = 0; 654fbf3a2af3834e8e93e9c2876de62c5b49988e352Wey-Yi Guy const size_t bufsz = sizeof(buf); 655fbf3a2af3834e8e93e9c2876de62c5b49988e352Wey-Yi Guy 656fbf3a2af3834e8e93e9c2876de62c5b49988e352Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 657fbf3a2af3834e8e93e9c2876de62c5b49988e352Wey-Yi Guy "Thermal Throttling Mode: %s\n", 6583ad3b92a5517c043ef30e4b95c4c39a35bbc36beJohannes Berg tt->advanced_tt ? "Advance" : "Legacy"); 659fbf3a2af3834e8e93e9c2876de62c5b49988e352Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 660fbf3a2af3834e8e93e9c2876de62c5b49988e352Wey-Yi Guy "Thermal Throttling State: %d\n", 661fbf3a2af3834e8e93e9c2876de62c5b49988e352Wey-Yi Guy tt->state); 6623ad3b92a5517c043ef30e4b95c4c39a35bbc36beJohannes Berg if (tt->advanced_tt) { 663fbf3a2af3834e8e93e9c2876de62c5b49988e352Wey-Yi Guy restriction = tt->restriction + tt->state; 664fbf3a2af3834e8e93e9c2876de62c5b49988e352Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 665fbf3a2af3834e8e93e9c2876de62c5b49988e352Wey-Yi Guy "Tx mode: %d\n", 666fbf3a2af3834e8e93e9c2876de62c5b49988e352Wey-Yi Guy restriction->tx_stream); 667fbf3a2af3834e8e93e9c2876de62c5b49988e352Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 668fbf3a2af3834e8e93e9c2876de62c5b49988e352Wey-Yi Guy "Rx mode: %d\n", 669fbf3a2af3834e8e93e9c2876de62c5b49988e352Wey-Yi Guy restriction->rx_stream); 670fbf3a2af3834e8e93e9c2876de62c5b49988e352Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 671fbf3a2af3834e8e93e9c2876de62c5b49988e352Wey-Yi Guy "HT mode: %d\n", 672fbf3a2af3834e8e93e9c2876de62c5b49988e352Wey-Yi Guy restriction->is_ht); 673fbf3a2af3834e8e93e9c2876de62c5b49988e352Wey-Yi Guy } 6744967c31677cf3c6c49aadf205f1a31d15d7610daWey-Yi Guy return simple_read_from_buffer(user_buf, count, ppos, buf, pos); 675fbf3a2af3834e8e93e9c2876de62c5b49988e352Wey-Yi Guy} 676fbf3a2af3834e8e93e9c2876de62c5b49988e352Wey-Yi Guy 6771e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guystatic ssize_t iwl_dbgfs_disable_ht40_write(struct file *file, 6781e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy const char __user *user_buf, 6791e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy size_t count, loff_t *ppos) 6801e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy{ 6811e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy struct iwl_priv *priv = file->private_data; 6821e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy char buf[8]; 6831e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy int buf_size; 6841e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy int ht40; 6851e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy 6861e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy memset(buf, 0, sizeof(buf)); 6871e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy buf_size = min(count, sizeof(buf) - 1); 6881e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy if (copy_from_user(buf, user_buf, buf_size)) 6891e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy return -EFAULT; 6901e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy if (sscanf(buf, "%d", &ht40) != 1) 6911e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy return -EFAULT; 692246ed355221076884d225f9d8a4c30a048be8162Johannes Berg if (!iwl_is_any_associated(priv)) 6931e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy priv->disable_ht40 = ht40 ? true : false; 6941e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy else { 6951e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy IWL_ERR(priv, "Sta associated with AP - " 6961e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy "Change to 40MHz channel support is not allowed\n"); 6971e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy return -EINVAL; 6981e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy } 6991e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy 7001e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy return count; 7011e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy} 7021e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy 7031e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guystatic ssize_t iwl_dbgfs_disable_ht40_read(struct file *file, 7041e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy char __user *user_buf, 7051e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy size_t count, loff_t *ppos) 7061e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy{ 70728f63a4bb744ea81030219aba2337fddb10b380bH Hartley Sweeten struct iwl_priv *priv = file->private_data; 7081e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy char buf[100]; 7091e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy int pos = 0; 7101e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy const size_t bufsz = sizeof(buf); 7111e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy 7121e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 7131e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy "11n 40MHz Mode: %s\n", 7141e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy priv->disable_ht40 ? "Disabled" : "Enabled"); 7154967c31677cf3c6c49aadf205f1a31d15d7610daWey-Yi Guy return simple_read_from_buffer(user_buf, count, ppos, buf, pos); 7161e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy} 7171e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy 718511afa3bfbb421ff0e87086725367f762587ab87Emmanuel Grumbachstatic ssize_t iwl_dbgfs_temperature_read(struct file *file, 719511afa3bfbb421ff0e87086725367f762587ab87Emmanuel Grumbach char __user *user_buf, 720511afa3bfbb421ff0e87086725367f762587ab87Emmanuel Grumbach size_t count, loff_t *ppos) 721511afa3bfbb421ff0e87086725367f762587ab87Emmanuel Grumbach{ 722511afa3bfbb421ff0e87086725367f762587ab87Emmanuel Grumbach struct iwl_priv *priv = file->private_data; 723511afa3bfbb421ff0e87086725367f762587ab87Emmanuel Grumbach char buf[8]; 724511afa3bfbb421ff0e87086725367f762587ab87Emmanuel Grumbach int pos = 0; 725511afa3bfbb421ff0e87086725367f762587ab87Emmanuel Grumbach const size_t bufsz = sizeof(buf); 726511afa3bfbb421ff0e87086725367f762587ab87Emmanuel Grumbach 727511afa3bfbb421ff0e87086725367f762587ab87Emmanuel Grumbach pos += scnprintf(buf + pos, bufsz - pos, "%d\n", priv->temperature); 728511afa3bfbb421ff0e87086725367f762587ab87Emmanuel Grumbach return simple_read_from_buffer(user_buf, count, ppos, buf, pos); 729511afa3bfbb421ff0e87086725367f762587ab87Emmanuel Grumbach} 730511afa3bfbb421ff0e87086725367f762587ab87Emmanuel Grumbach 731511afa3bfbb421ff0e87086725367f762587ab87Emmanuel Grumbach 732e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Bergstatic ssize_t iwl_dbgfs_sleep_level_override_write(struct file *file, 733e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg const char __user *user_buf, 734e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg size_t count, loff_t *ppos) 735e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg{ 736e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg struct iwl_priv *priv = file->private_data; 737e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg char buf[8]; 738e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg int buf_size; 739e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg int value; 740e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg 741e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg memset(buf, 0, sizeof(buf)); 742e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg buf_size = min(count, sizeof(buf) - 1); 743e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg if (copy_from_user(buf, user_buf, buf_size)) 744e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg return -EFAULT; 745e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg 746e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg if (sscanf(buf, "%d", &value) != 1) 747e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg return -EINVAL; 748e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg 749e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg /* 750e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg * Our users expect 0 to be "CAM", but 0 isn't actually 751e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg * valid here. However, let's not confuse them and present 752e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg * IWL_POWER_INDEX_1 as "1", not "0". 753e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg */ 7541a34c043802a213e719420ece395cf25c85cc7c5Reinette Chatre if (value == 0) 7551a34c043802a213e719420ece395cf25c85cc7c5Reinette Chatre return -EINVAL; 7561a34c043802a213e719420ece395cf25c85cc7c5Reinette Chatre else if (value > 0) 757e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg value -= 1; 758e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg 759e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg if (value != -1 && (value < 0 || value >= IWL_POWER_NUM)) 760e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg return -EINVAL; 761e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg 762845a9c0d8acea87dede740bc5feb9ec2d00505d9Emmanuel Grumbach if (!iwl_is_ready_rf(priv->shrd)) 7634ad177b5c860dc0b1083eccc55957daf4a116b90Wey-Yi Guy return -EAGAIN; 7644ad177b5c860dc0b1083eccc55957daf4a116b90Wey-Yi Guy 765e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg priv->power_data.debug_sleep_level_override = value; 766e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg 7676ac2f839b0b21225a65f41802c5f0df5eff4f16cEmmanuel Grumbach mutex_lock(&priv->shrd->mutex); 7684ad177b5c860dc0b1083eccc55957daf4a116b90Wey-Yi Guy iwl_power_update_mode(priv, true); 7696ac2f839b0b21225a65f41802c5f0df5eff4f16cEmmanuel Grumbach mutex_unlock(&priv->shrd->mutex); 770e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg 771e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg return count; 772e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg} 773e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg 774e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Bergstatic ssize_t iwl_dbgfs_sleep_level_override_read(struct file *file, 775e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg char __user *user_buf, 776e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg size_t count, loff_t *ppos) 777e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg{ 77828f63a4bb744ea81030219aba2337fddb10b380bH Hartley Sweeten struct iwl_priv *priv = file->private_data; 779e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg char buf[10]; 780e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg int pos, value; 781e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg const size_t bufsz = sizeof(buf); 782e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg 783e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg /* see the write function */ 784e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg value = priv->power_data.debug_sleep_level_override; 785e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg if (value >= 0) 786e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg value += 1; 787e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg 788e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg pos = scnprintf(buf, bufsz, "%d\n", value); 789e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg return simple_read_from_buffer(user_buf, count, ppos, buf, pos); 790e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg} 791e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg 792e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Bergstatic ssize_t iwl_dbgfs_current_sleep_command_read(struct file *file, 793e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg char __user *user_buf, 794e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg size_t count, loff_t *ppos) 795e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg{ 79628f63a4bb744ea81030219aba2337fddb10b380bH Hartley Sweeten struct iwl_priv *priv = file->private_data; 797e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg char buf[200]; 798e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg int pos = 0, i; 799e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg const size_t bufsz = sizeof(buf); 800e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg struct iwl_powertable_cmd *cmd = &priv->power_data.sleep_cmd; 801e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg 802e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg pos += scnprintf(buf + pos, bufsz - pos, 803e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg "flags: %#.2x\n", le16_to_cpu(cmd->flags)); 804e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg pos += scnprintf(buf + pos, bufsz - pos, 805e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg "RX/TX timeout: %d/%d usec\n", 806e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg le32_to_cpu(cmd->rx_data_timeout), 807e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg le32_to_cpu(cmd->tx_data_timeout)); 808e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg for (i = 0; i < IWL_POWER_VEC_SIZE; i++) 809e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg pos += scnprintf(buf + pos, bufsz - pos, 810e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg "sleep_interval[%d]: %d\n", i, 811e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg le32_to_cpu(cmd->sleep_interval[i])); 812e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg 813e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg return simple_read_from_buffer(user_buf, count, ppos, buf, pos); 814e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg} 815e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg 816712b6cf57a53da608a682b5f782c5785bda76001Tomas WinklerDEBUGFS_READ_WRITE_FILE_OPS(sram); 817c8ac61cf6e53fefb3b439fc58390fb65d2730e63Johannes BergDEBUGFS_READ_FILE_OPS(wowlan_sram); 8180848e297c2107dbc12a91a1709c879c73bd188d8Wey-Yi GuyDEBUGFS_READ_FILE_OPS(nvm); 819712b6cf57a53da608a682b5f782c5785bda76001Tomas WinklerDEBUGFS_READ_FILE_OPS(stations); 820d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, TomasDEBUGFS_READ_FILE_OPS(channels); 82108df05aa9b25f3079585855506022bb33a011183Wey-Yi GuyDEBUGFS_READ_FILE_OPS(status); 8221f7b6172db86e9ab2b4cd794441bb2c40ab287fcEmmanuel GrumbachDEBUGFS_READ_WRITE_FILE_OPS(rx_handlers); 823f5ad69fa47e7b204d0032d569812544cd9a351fbWey-Yi GuyDEBUGFS_READ_FILE_OPS(qos); 824fbf3a2af3834e8e93e9c2876de62c5b49988e352Wey-Yi GuyDEBUGFS_READ_FILE_OPS(thermal_throttling); 8251e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi GuyDEBUGFS_READ_WRITE_FILE_OPS(disable_ht40); 826511afa3bfbb421ff0e87086725367f762587ab87Emmanuel GrumbachDEBUGFS_READ_FILE_OPS(temperature); 827e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes BergDEBUGFS_READ_WRITE_FILE_OPS(sleep_level_override); 828e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes BergDEBUGFS_READ_FILE_OPS(current_sleep_command); 829712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 83041f5e0475c7c04b17b207736146187636b04eb4cEmmanuel Grumbachstatic ssize_t iwl_dbgfs_traffic_log_read(struct file *file, 83141f5e0475c7c04b17b207736146187636b04eb4cEmmanuel Grumbach char __user *user_buf, 83241f5e0475c7c04b17b207736146187636b04eb4cEmmanuel Grumbach size_t count, loff_t *ppos) 83341f5e0475c7c04b17b207736146187636b04eb4cEmmanuel Grumbach{ 83441f5e0475c7c04b17b207736146187636b04eb4cEmmanuel Grumbach struct iwl_priv *priv = file->private_data; 83541f5e0475c7c04b17b207736146187636b04eb4cEmmanuel Grumbach int pos = 0, ofs = 0; 83641f5e0475c7c04b17b207736146187636b04eb4cEmmanuel Grumbach int cnt = 0, entry; 83741f5e0475c7c04b17b207736146187636b04eb4cEmmanuel Grumbach 83841f5e0475c7c04b17b207736146187636b04eb4cEmmanuel Grumbach char *buf; 83941f5e0475c7c04b17b207736146187636b04eb4cEmmanuel Grumbach int bufsz = ((IWL_TRAFFIC_ENTRIES * IWL_TRAFFIC_ENTRY_SIZE * 64) * 2) + 84041f5e0475c7c04b17b207736146187636b04eb4cEmmanuel Grumbach (hw_params(priv).max_txq_num * 32 * 8) + 400; 84141f5e0475c7c04b17b207736146187636b04eb4cEmmanuel Grumbach const u8 *ptr; 84241f5e0475c7c04b17b207736146187636b04eb4cEmmanuel Grumbach ssize_t ret; 84341f5e0475c7c04b17b207736146187636b04eb4cEmmanuel Grumbach 84441f5e0475c7c04b17b207736146187636b04eb4cEmmanuel Grumbach buf = kzalloc(bufsz, GFP_KERNEL); 84541f5e0475c7c04b17b207736146187636b04eb4cEmmanuel Grumbach if (!buf) { 84641f5e0475c7c04b17b207736146187636b04eb4cEmmanuel Grumbach IWL_ERR(priv, "Can not allocate buffer\n"); 84741f5e0475c7c04b17b207736146187636b04eb4cEmmanuel Grumbach return -ENOMEM; 84841f5e0475c7c04b17b207736146187636b04eb4cEmmanuel Grumbach } 84941f5e0475c7c04b17b207736146187636b04eb4cEmmanuel Grumbach if (priv->tx_traffic && 85041f5e0475c7c04b17b207736146187636b04eb4cEmmanuel Grumbach (iwl_get_debug_level(priv->shrd) & IWL_DL_TX)) { 85141f5e0475c7c04b17b207736146187636b04eb4cEmmanuel Grumbach ptr = priv->tx_traffic; 85241f5e0475c7c04b17b207736146187636b04eb4cEmmanuel Grumbach pos += scnprintf(buf + pos, bufsz - pos, 85341f5e0475c7c04b17b207736146187636b04eb4cEmmanuel Grumbach "Tx Traffic idx: %u\n", priv->tx_traffic_idx); 85441f5e0475c7c04b17b207736146187636b04eb4cEmmanuel Grumbach for (cnt = 0, ofs = 0; cnt < IWL_TRAFFIC_ENTRIES; cnt++) { 85541f5e0475c7c04b17b207736146187636b04eb4cEmmanuel Grumbach for (entry = 0; entry < IWL_TRAFFIC_ENTRY_SIZE / 16; 85641f5e0475c7c04b17b207736146187636b04eb4cEmmanuel Grumbach entry++, ofs += 16) { 85741f5e0475c7c04b17b207736146187636b04eb4cEmmanuel Grumbach pos += scnprintf(buf + pos, bufsz - pos, 85841f5e0475c7c04b17b207736146187636b04eb4cEmmanuel Grumbach "0x%.4x ", ofs); 85941f5e0475c7c04b17b207736146187636b04eb4cEmmanuel Grumbach hex_dump_to_buffer(ptr + ofs, 16, 16, 2, 86041f5e0475c7c04b17b207736146187636b04eb4cEmmanuel Grumbach buf + pos, bufsz - pos, 0); 86141f5e0475c7c04b17b207736146187636b04eb4cEmmanuel Grumbach pos += strlen(buf + pos); 86241f5e0475c7c04b17b207736146187636b04eb4cEmmanuel Grumbach if (bufsz - pos > 0) 86341f5e0475c7c04b17b207736146187636b04eb4cEmmanuel Grumbach buf[pos++] = '\n'; 86441f5e0475c7c04b17b207736146187636b04eb4cEmmanuel Grumbach } 86541f5e0475c7c04b17b207736146187636b04eb4cEmmanuel Grumbach } 86641f5e0475c7c04b17b207736146187636b04eb4cEmmanuel Grumbach } 86741f5e0475c7c04b17b207736146187636b04eb4cEmmanuel Grumbach 86841f5e0475c7c04b17b207736146187636b04eb4cEmmanuel Grumbach if (priv->rx_traffic && 86941f5e0475c7c04b17b207736146187636b04eb4cEmmanuel Grumbach (iwl_get_debug_level(priv->shrd) & IWL_DL_RX)) { 87041f5e0475c7c04b17b207736146187636b04eb4cEmmanuel Grumbach ptr = priv->rx_traffic; 87141f5e0475c7c04b17b207736146187636b04eb4cEmmanuel Grumbach pos += scnprintf(buf + pos, bufsz - pos, 87241f5e0475c7c04b17b207736146187636b04eb4cEmmanuel Grumbach "Rx Traffic idx: %u\n", priv->rx_traffic_idx); 87341f5e0475c7c04b17b207736146187636b04eb4cEmmanuel Grumbach for (cnt = 0, ofs = 0; cnt < IWL_TRAFFIC_ENTRIES; cnt++) { 87441f5e0475c7c04b17b207736146187636b04eb4cEmmanuel Grumbach for (entry = 0; entry < IWL_TRAFFIC_ENTRY_SIZE / 16; 87541f5e0475c7c04b17b207736146187636b04eb4cEmmanuel Grumbach entry++, ofs += 16) { 87641f5e0475c7c04b17b207736146187636b04eb4cEmmanuel Grumbach pos += scnprintf(buf + pos, bufsz - pos, 87741f5e0475c7c04b17b207736146187636b04eb4cEmmanuel Grumbach "0x%.4x ", ofs); 87841f5e0475c7c04b17b207736146187636b04eb4cEmmanuel Grumbach hex_dump_to_buffer(ptr + ofs, 16, 16, 2, 87941f5e0475c7c04b17b207736146187636b04eb4cEmmanuel Grumbach buf + pos, bufsz - pos, 0); 88041f5e0475c7c04b17b207736146187636b04eb4cEmmanuel Grumbach pos += strlen(buf + pos); 88141f5e0475c7c04b17b207736146187636b04eb4cEmmanuel Grumbach if (bufsz - pos > 0) 88241f5e0475c7c04b17b207736146187636b04eb4cEmmanuel Grumbach buf[pos++] = '\n'; 88341f5e0475c7c04b17b207736146187636b04eb4cEmmanuel Grumbach } 88441f5e0475c7c04b17b207736146187636b04eb4cEmmanuel Grumbach } 88541f5e0475c7c04b17b207736146187636b04eb4cEmmanuel Grumbach } 88641f5e0475c7c04b17b207736146187636b04eb4cEmmanuel Grumbach 88741f5e0475c7c04b17b207736146187636b04eb4cEmmanuel Grumbach ret = simple_read_from_buffer(user_buf, count, ppos, buf, pos); 88841f5e0475c7c04b17b207736146187636b04eb4cEmmanuel Grumbach kfree(buf); 88941f5e0475c7c04b17b207736146187636b04eb4cEmmanuel Grumbach return ret; 89041f5e0475c7c04b17b207736146187636b04eb4cEmmanuel Grumbach} 89141f5e0475c7c04b17b207736146187636b04eb4cEmmanuel Grumbach 89241f5e0475c7c04b17b207736146187636b04eb4cEmmanuel Grumbachstatic ssize_t iwl_dbgfs_traffic_log_write(struct file *file, 89341f5e0475c7c04b17b207736146187636b04eb4cEmmanuel Grumbach const char __user *user_buf, 89441f5e0475c7c04b17b207736146187636b04eb4cEmmanuel Grumbach size_t count, loff_t *ppos) 89541f5e0475c7c04b17b207736146187636b04eb4cEmmanuel Grumbach{ 89641f5e0475c7c04b17b207736146187636b04eb4cEmmanuel Grumbach struct iwl_priv *priv = file->private_data; 89741f5e0475c7c04b17b207736146187636b04eb4cEmmanuel Grumbach char buf[8]; 89841f5e0475c7c04b17b207736146187636b04eb4cEmmanuel Grumbach int buf_size; 89941f5e0475c7c04b17b207736146187636b04eb4cEmmanuel Grumbach int traffic_log; 90041f5e0475c7c04b17b207736146187636b04eb4cEmmanuel Grumbach 90141f5e0475c7c04b17b207736146187636b04eb4cEmmanuel Grumbach memset(buf, 0, sizeof(buf)); 90241f5e0475c7c04b17b207736146187636b04eb4cEmmanuel Grumbach buf_size = min(count, sizeof(buf) - 1); 90341f5e0475c7c04b17b207736146187636b04eb4cEmmanuel Grumbach if (copy_from_user(buf, user_buf, buf_size)) 90441f5e0475c7c04b17b207736146187636b04eb4cEmmanuel Grumbach return -EFAULT; 90541f5e0475c7c04b17b207736146187636b04eb4cEmmanuel Grumbach if (sscanf(buf, "%d", &traffic_log) != 1) 90641f5e0475c7c04b17b207736146187636b04eb4cEmmanuel Grumbach return -EFAULT; 90741f5e0475c7c04b17b207736146187636b04eb4cEmmanuel Grumbach if (traffic_log == 0) 90841f5e0475c7c04b17b207736146187636b04eb4cEmmanuel Grumbach iwl_reset_traffic_log(priv); 90941f5e0475c7c04b17b207736146187636b04eb4cEmmanuel Grumbach 91041f5e0475c7c04b17b207736146187636b04eb4cEmmanuel Grumbach return count; 91141f5e0475c7c04b17b207736146187636b04eb4cEmmanuel Grumbach} 91241f5e0475c7c04b17b207736146187636b04eb4cEmmanuel Grumbach 913d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guystatic const char *fmt_value = " %-30s %10u\n"; 914d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guystatic const char *fmt_hex = " %-30s 0x%02X\n"; 915d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guystatic const char *fmt_table = " %-30s %10u %10u %10u %10u\n"; 916d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guystatic const char *fmt_header = 917d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy "%-32s current cumulative delta max\n"; 918d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy 919d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guystatic int iwl_statistics_flag(struct iwl_priv *priv, char *buf, int bufsz) 920d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy{ 921d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy int p = 0; 922d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy u32 flag; 923d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy 924d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy flag = le32_to_cpu(priv->statistics.flag); 925d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy 926d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy p += scnprintf(buf + p, bufsz - p, "Statistics Flag(0x%X):\n", flag); 927d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy if (flag & UCODE_STATISTICS_CLEAR_MSK) 928d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy p += scnprintf(buf + p, bufsz - p, 929d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy "\tStatistics have been cleared\n"); 930d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy p += scnprintf(buf + p, bufsz - p, "\tOperational Frequency: %s\n", 931d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy (flag & UCODE_STATISTICS_FREQUENCY_MSK) 932d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy ? "2.4 GHz" : "5.2 GHz"); 933d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy p += scnprintf(buf + p, bufsz - p, "\tTGj Narrow Band: %s\n", 934d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy (flag & UCODE_STATISTICS_NARROW_BAND_MSK) 935d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy ? "enabled" : "disabled"); 936d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy 937d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy return p; 938d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy} 939d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy 940e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guystatic ssize_t iwl_dbgfs_ucode_rx_stats_read(struct file *file, 941e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guy char __user *user_buf, 942e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guy size_t count, loff_t *ppos) 943e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guy{ 94428f63a4bb744ea81030219aba2337fddb10b380bH Hartley Sweeten struct iwl_priv *priv = file->private_data; 945d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy int pos = 0; 946d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy char *buf; 947d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy int bufsz = sizeof(struct statistics_rx_phy) * 40 + 948d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy sizeof(struct statistics_rx_non_phy) * 40 + 949d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy sizeof(struct statistics_rx_ht_phy) * 40 + 400; 950d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy ssize_t ret; 951d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy struct statistics_rx_phy *ofdm, *accum_ofdm, *delta_ofdm, *max_ofdm; 952d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy struct statistics_rx_phy *cck, *accum_cck, *delta_cck, *max_cck; 953d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy struct statistics_rx_non_phy *general, *accum_general; 954d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy struct statistics_rx_non_phy *delta_general, *max_general; 955d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy struct statistics_rx_ht_phy *ht, *accum_ht, *delta_ht, *max_ht; 956d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy 957845a9c0d8acea87dede740bc5feb9ec2d00505d9Emmanuel Grumbach if (!iwl_is_alive(priv->shrd)) 958d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy return -EAGAIN; 959d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy 960d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy buf = kzalloc(bufsz, GFP_KERNEL); 961d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy if (!buf) { 962d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy IWL_ERR(priv, "Can not allocate Buffer\n"); 963d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy return -ENOMEM; 964d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy } 965d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy 966d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy /* 967d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy * the statistic information display here is based on 968d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy * the last statistics notification from uCode 969d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy * might not reflect the current uCode activity 970d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy */ 971d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy ofdm = &priv->statistics.rx_ofdm; 972d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy cck = &priv->statistics.rx_cck; 973d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy general = &priv->statistics.rx_non_phy; 974d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy ht = &priv->statistics.rx_ofdm_ht; 975d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_ofdm = &priv->accum_stats.rx_ofdm; 976d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_cck = &priv->accum_stats.rx_cck; 977d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_general = &priv->accum_stats.rx_non_phy; 978d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_ht = &priv->accum_stats.rx_ofdm_ht; 979d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_ofdm = &priv->delta_stats.rx_ofdm; 980d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_cck = &priv->delta_stats.rx_cck; 981d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_general = &priv->delta_stats.rx_non_phy; 982d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_ht = &priv->delta_stats.rx_ofdm_ht; 983d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_ofdm = &priv->max_delta_stats.rx_ofdm; 984d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_cck = &priv->max_delta_stats.rx_cck; 985d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_general = &priv->max_delta_stats.rx_non_phy; 986d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_ht = &priv->max_delta_stats.rx_ofdm_ht; 987d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy 988d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += iwl_statistics_flag(priv, buf, bufsz); 989d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 990d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_header, "Statistics_Rx - OFDM:"); 991d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 992d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "ina_cnt:", 993d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(ofdm->ina_cnt), 994d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_ofdm->ina_cnt, 995d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_ofdm->ina_cnt, max_ofdm->ina_cnt); 996d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 997d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "fina_cnt:", 998d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(ofdm->fina_cnt), accum_ofdm->fina_cnt, 999d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_ofdm->fina_cnt, max_ofdm->fina_cnt); 1000d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1001d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "plcp_err:", 1002d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(ofdm->plcp_err), accum_ofdm->plcp_err, 1003d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_ofdm->plcp_err, max_ofdm->plcp_err); 1004d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1005d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "crc32_err:", 1006d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(ofdm->crc32_err), accum_ofdm->crc32_err, 1007d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_ofdm->crc32_err, max_ofdm->crc32_err); 1008d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1009d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "overrun_err:", 1010d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(ofdm->overrun_err), 1011d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_ofdm->overrun_err, delta_ofdm->overrun_err, 1012d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_ofdm->overrun_err); 1013d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1014d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "early_overrun_err:", 1015d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(ofdm->early_overrun_err), 1016d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_ofdm->early_overrun_err, 1017d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_ofdm->early_overrun_err, 1018d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_ofdm->early_overrun_err); 1019d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1020d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "crc32_good:", 1021d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(ofdm->crc32_good), 1022d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_ofdm->crc32_good, delta_ofdm->crc32_good, 1023d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_ofdm->crc32_good); 1024d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1025d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "false_alarm_cnt:", 1026d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(ofdm->false_alarm_cnt), 1027d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_ofdm->false_alarm_cnt, 1028d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_ofdm->false_alarm_cnt, 1029d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_ofdm->false_alarm_cnt); 1030d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1031d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "fina_sync_err_cnt:", 1032d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(ofdm->fina_sync_err_cnt), 1033d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_ofdm->fina_sync_err_cnt, 1034d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_ofdm->fina_sync_err_cnt, 1035d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_ofdm->fina_sync_err_cnt); 1036d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1037d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "sfd_timeout:", 1038d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(ofdm->sfd_timeout), 1039d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_ofdm->sfd_timeout, delta_ofdm->sfd_timeout, 1040d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_ofdm->sfd_timeout); 1041d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1042d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "fina_timeout:", 1043d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(ofdm->fina_timeout), 1044d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_ofdm->fina_timeout, delta_ofdm->fina_timeout, 1045d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_ofdm->fina_timeout); 1046d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1047d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "unresponded_rts:", 1048d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(ofdm->unresponded_rts), 1049d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_ofdm->unresponded_rts, 1050d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_ofdm->unresponded_rts, 1051d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_ofdm->unresponded_rts); 1052d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1053d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "rxe_frame_lmt_ovrun:", 1054d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(ofdm->rxe_frame_limit_overrun), 1055d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_ofdm->rxe_frame_limit_overrun, 1056d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_ofdm->rxe_frame_limit_overrun, 1057d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_ofdm->rxe_frame_limit_overrun); 1058d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1059d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "sent_ack_cnt:", 1060d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(ofdm->sent_ack_cnt), 1061d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_ofdm->sent_ack_cnt, delta_ofdm->sent_ack_cnt, 1062d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_ofdm->sent_ack_cnt); 1063d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1064d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "sent_cts_cnt:", 1065d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(ofdm->sent_cts_cnt), 1066d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_ofdm->sent_cts_cnt, delta_ofdm->sent_cts_cnt, 1067d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_ofdm->sent_cts_cnt); 1068d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1069d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "sent_ba_rsp_cnt:", 1070d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(ofdm->sent_ba_rsp_cnt), 1071d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_ofdm->sent_ba_rsp_cnt, 1072d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_ofdm->sent_ba_rsp_cnt, 1073d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_ofdm->sent_ba_rsp_cnt); 1074d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1075d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "dsp_self_kill:", 1076d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(ofdm->dsp_self_kill), 1077d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_ofdm->dsp_self_kill, 1078d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_ofdm->dsp_self_kill, 1079d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_ofdm->dsp_self_kill); 1080d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1081d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "mh_format_err:", 1082d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(ofdm->mh_format_err), 1083d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_ofdm->mh_format_err, 1084d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_ofdm->mh_format_err, 1085d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_ofdm->mh_format_err); 1086d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1087d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "re_acq_main_rssi_sum:", 1088d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(ofdm->re_acq_main_rssi_sum), 1089d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_ofdm->re_acq_main_rssi_sum, 1090d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_ofdm->re_acq_main_rssi_sum, 1091d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_ofdm->re_acq_main_rssi_sum); 1092d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy 1093d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1094d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_header, "Statistics_Rx - CCK:"); 1095d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1096d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "ina_cnt:", 1097d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(cck->ina_cnt), accum_cck->ina_cnt, 1098d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_cck->ina_cnt, max_cck->ina_cnt); 1099d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1100d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "fina_cnt:", 1101d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(cck->fina_cnt), accum_cck->fina_cnt, 1102d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_cck->fina_cnt, max_cck->fina_cnt); 1103d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1104d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "plcp_err:", 1105d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(cck->plcp_err), accum_cck->plcp_err, 1106d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_cck->plcp_err, max_cck->plcp_err); 1107d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1108d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "crc32_err:", 1109d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(cck->crc32_err), accum_cck->crc32_err, 1110d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_cck->crc32_err, max_cck->crc32_err); 1111d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1112d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "overrun_err:", 1113d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(cck->overrun_err), 1114d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_cck->overrun_err, delta_cck->overrun_err, 1115d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_cck->overrun_err); 1116d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1117d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "early_overrun_err:", 1118d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(cck->early_overrun_err), 1119d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_cck->early_overrun_err, 1120d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_cck->early_overrun_err, 1121d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_cck->early_overrun_err); 1122d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1123d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "crc32_good:", 1124d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(cck->crc32_good), accum_cck->crc32_good, 1125d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_cck->crc32_good, max_cck->crc32_good); 1126d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1127d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "false_alarm_cnt:", 1128d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(cck->false_alarm_cnt), 1129d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_cck->false_alarm_cnt, 1130d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_cck->false_alarm_cnt, max_cck->false_alarm_cnt); 1131d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1132d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "fina_sync_err_cnt:", 1133d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(cck->fina_sync_err_cnt), 1134d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_cck->fina_sync_err_cnt, 1135d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_cck->fina_sync_err_cnt, 1136d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_cck->fina_sync_err_cnt); 1137d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1138d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "sfd_timeout:", 1139d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(cck->sfd_timeout), 1140d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_cck->sfd_timeout, delta_cck->sfd_timeout, 1141d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_cck->sfd_timeout); 1142d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1143d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "fina_timeout:", 1144d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(cck->fina_timeout), 1145d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_cck->fina_timeout, delta_cck->fina_timeout, 1146d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_cck->fina_timeout); 1147d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1148d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "unresponded_rts:", 1149d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(cck->unresponded_rts), 1150d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_cck->unresponded_rts, delta_cck->unresponded_rts, 1151d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_cck->unresponded_rts); 1152d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1153d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "rxe_frame_lmt_ovrun:", 1154d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(cck->rxe_frame_limit_overrun), 1155d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_cck->rxe_frame_limit_overrun, 1156d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_cck->rxe_frame_limit_overrun, 1157d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_cck->rxe_frame_limit_overrun); 1158d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1159d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "sent_ack_cnt:", 1160d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(cck->sent_ack_cnt), 1161d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_cck->sent_ack_cnt, delta_cck->sent_ack_cnt, 1162d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_cck->sent_ack_cnt); 1163d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1164d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "sent_cts_cnt:", 1165d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(cck->sent_cts_cnt), 1166d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_cck->sent_cts_cnt, delta_cck->sent_cts_cnt, 1167d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_cck->sent_cts_cnt); 1168d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1169d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "sent_ba_rsp_cnt:", 1170d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(cck->sent_ba_rsp_cnt), 1171d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_cck->sent_ba_rsp_cnt, 1172d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_cck->sent_ba_rsp_cnt, 1173d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_cck->sent_ba_rsp_cnt); 1174d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1175d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "dsp_self_kill:", 1176d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(cck->dsp_self_kill), 1177d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_cck->dsp_self_kill, delta_cck->dsp_self_kill, 1178d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_cck->dsp_self_kill); 1179d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1180d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "mh_format_err:", 1181d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(cck->mh_format_err), 1182d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_cck->mh_format_err, delta_cck->mh_format_err, 1183d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_cck->mh_format_err); 1184d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1185d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "re_acq_main_rssi_sum:", 1186d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(cck->re_acq_main_rssi_sum), 1187d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_cck->re_acq_main_rssi_sum, 1188d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_cck->re_acq_main_rssi_sum, 1189d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_cck->re_acq_main_rssi_sum); 1190d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy 1191d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1192d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_header, "Statistics_Rx - GENERAL:"); 1193d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1194d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "bogus_cts:", 1195d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(general->bogus_cts), 1196d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_general->bogus_cts, delta_general->bogus_cts, 1197d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_general->bogus_cts); 1198d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1199d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "bogus_ack:", 1200d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(general->bogus_ack), 1201d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_general->bogus_ack, delta_general->bogus_ack, 1202d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_general->bogus_ack); 1203d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1204d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "non_bssid_frames:", 1205d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(general->non_bssid_frames), 1206d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_general->non_bssid_frames, 1207d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_general->non_bssid_frames, 1208d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_general->non_bssid_frames); 1209d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1210d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "filtered_frames:", 1211d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(general->filtered_frames), 1212d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_general->filtered_frames, 1213d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_general->filtered_frames, 1214d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_general->filtered_frames); 1215d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1216d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "non_channel_beacons:", 1217d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(general->non_channel_beacons), 1218d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_general->non_channel_beacons, 1219d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_general->non_channel_beacons, 1220d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_general->non_channel_beacons); 1221d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1222d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "channel_beacons:", 1223d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(general->channel_beacons), 1224d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_general->channel_beacons, 1225d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_general->channel_beacons, 1226d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_general->channel_beacons); 1227d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1228d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "num_missed_bcon:", 1229d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(general->num_missed_bcon), 1230d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_general->num_missed_bcon, 1231d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_general->num_missed_bcon, 1232d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_general->num_missed_bcon); 1233d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1234d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "adc_rx_saturation_time:", 1235d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(general->adc_rx_saturation_time), 1236d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_general->adc_rx_saturation_time, 1237d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_general->adc_rx_saturation_time, 1238d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_general->adc_rx_saturation_time); 1239d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1240d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "ina_detect_search_tm:", 1241d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(general->ina_detection_search_time), 1242d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_general->ina_detection_search_time, 1243d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_general->ina_detection_search_time, 1244d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_general->ina_detection_search_time); 1245d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1246d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "beacon_silence_rssi_a:", 1247d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(general->beacon_silence_rssi_a), 1248d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_general->beacon_silence_rssi_a, 1249d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_general->beacon_silence_rssi_a, 1250d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_general->beacon_silence_rssi_a); 1251d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1252d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "beacon_silence_rssi_b:", 1253d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(general->beacon_silence_rssi_b), 1254d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_general->beacon_silence_rssi_b, 1255d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_general->beacon_silence_rssi_b, 1256d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_general->beacon_silence_rssi_b); 1257d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1258d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "beacon_silence_rssi_c:", 1259d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(general->beacon_silence_rssi_c), 1260d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_general->beacon_silence_rssi_c, 1261d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_general->beacon_silence_rssi_c, 1262d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_general->beacon_silence_rssi_c); 1263d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1264d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "interference_data_flag:", 1265d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(general->interference_data_flag), 1266d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_general->interference_data_flag, 1267d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_general->interference_data_flag, 1268d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_general->interference_data_flag); 1269d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1270d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "channel_load:", 1271d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(general->channel_load), 1272d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_general->channel_load, 1273d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_general->channel_load, 1274d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_general->channel_load); 1275d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1276d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "dsp_false_alarms:", 1277d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(general->dsp_false_alarms), 1278d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_general->dsp_false_alarms, 1279d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_general->dsp_false_alarms, 1280d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_general->dsp_false_alarms); 1281d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1282d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "beacon_rssi_a:", 1283d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(general->beacon_rssi_a), 1284d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_general->beacon_rssi_a, 1285d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_general->beacon_rssi_a, 1286d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_general->beacon_rssi_a); 1287d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1288d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "beacon_rssi_b:", 1289d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(general->beacon_rssi_b), 1290d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_general->beacon_rssi_b, 1291d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_general->beacon_rssi_b, 1292d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_general->beacon_rssi_b); 1293d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1294d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "beacon_rssi_c:", 1295d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(general->beacon_rssi_c), 1296d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_general->beacon_rssi_c, 1297d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_general->beacon_rssi_c, 1298d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_general->beacon_rssi_c); 1299d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1300d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "beacon_energy_a:", 1301d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(general->beacon_energy_a), 1302d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_general->beacon_energy_a, 1303d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_general->beacon_energy_a, 1304d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_general->beacon_energy_a); 1305d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1306d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "beacon_energy_b:", 1307d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(general->beacon_energy_b), 1308d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_general->beacon_energy_b, 1309d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_general->beacon_energy_b, 1310d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_general->beacon_energy_b); 1311d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1312d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "beacon_energy_c:", 1313d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(general->beacon_energy_c), 1314d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_general->beacon_energy_c, 1315d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_general->beacon_energy_c, 1316d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_general->beacon_energy_c); 1317d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy 1318d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1319d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_header, "Statistics_Rx - OFDM_HT:"); 1320d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1321d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "plcp_err:", 1322d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(ht->plcp_err), accum_ht->plcp_err, 1323d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_ht->plcp_err, max_ht->plcp_err); 1324d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1325d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "overrun_err:", 1326d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(ht->overrun_err), accum_ht->overrun_err, 1327d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_ht->overrun_err, max_ht->overrun_err); 1328d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1329d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "early_overrun_err:", 1330d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(ht->early_overrun_err), 1331d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_ht->early_overrun_err, 1332d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_ht->early_overrun_err, 1333d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_ht->early_overrun_err); 1334d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1335d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "crc32_good:", 1336d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(ht->crc32_good), accum_ht->crc32_good, 1337d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_ht->crc32_good, max_ht->crc32_good); 1338d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1339d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "crc32_err:", 1340d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(ht->crc32_err), accum_ht->crc32_err, 1341d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_ht->crc32_err, max_ht->crc32_err); 1342d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1343d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "mh_format_err:", 1344d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(ht->mh_format_err), 1345d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_ht->mh_format_err, 1346d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_ht->mh_format_err, max_ht->mh_format_err); 1347d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1348d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "agg_crc32_good:", 1349d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(ht->agg_crc32_good), 1350d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_ht->agg_crc32_good, 1351d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_ht->agg_crc32_good, max_ht->agg_crc32_good); 1352d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1353d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "agg_mpdu_cnt:", 1354d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(ht->agg_mpdu_cnt), 1355d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_ht->agg_mpdu_cnt, 1356d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_ht->agg_mpdu_cnt, max_ht->agg_mpdu_cnt); 1357d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1358d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "agg_cnt:", 1359d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(ht->agg_cnt), accum_ht->agg_cnt, 1360d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_ht->agg_cnt, max_ht->agg_cnt); 1361d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1362d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "unsupport_mcs:", 1363d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(ht->unsupport_mcs), 1364d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_ht->unsupport_mcs, 1365d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_ht->unsupport_mcs, max_ht->unsupport_mcs); 1366d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy 1367d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy ret = simple_read_from_buffer(user_buf, count, ppos, buf, pos); 1368d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy kfree(buf); 1369d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy return ret; 1370e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guy} 1371e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guy 1372e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guystatic ssize_t iwl_dbgfs_ucode_tx_stats_read(struct file *file, 1373e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guy char __user *user_buf, 1374e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guy size_t count, loff_t *ppos) 1375e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guy{ 137628f63a4bb744ea81030219aba2337fddb10b380bH Hartley Sweeten struct iwl_priv *priv = file->private_data; 1377d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy int pos = 0; 1378d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy char *buf; 1379d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy int bufsz = (sizeof(struct statistics_tx) * 48) + 250; 1380d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy ssize_t ret; 1381d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy struct statistics_tx *tx, *accum_tx, *delta_tx, *max_tx; 1382d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy 1383845a9c0d8acea87dede740bc5feb9ec2d00505d9Emmanuel Grumbach if (!iwl_is_alive(priv->shrd)) 1384d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy return -EAGAIN; 1385d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy 1386d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy buf = kzalloc(bufsz, GFP_KERNEL); 1387d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy if (!buf) { 1388d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy IWL_ERR(priv, "Can not allocate Buffer\n"); 1389d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy return -ENOMEM; 1390d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy } 1391d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy 1392d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy /* the statistic information display here is based on 1393d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy * the last statistics notification from uCode 1394d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy * might not reflect the current uCode activity 1395d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy */ 1396d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy tx = &priv->statistics.tx; 1397d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_tx = &priv->accum_stats.tx; 1398d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_tx = &priv->delta_stats.tx; 1399d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_tx = &priv->max_delta_stats.tx; 1400d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy 1401d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += iwl_statistics_flag(priv, buf, bufsz); 1402d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1403d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_header, "Statistics_Tx:"); 1404d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1405d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "preamble:", 1406d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(tx->preamble_cnt), 1407d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_tx->preamble_cnt, 1408d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_tx->preamble_cnt, max_tx->preamble_cnt); 1409d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1410d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "rx_detected_cnt:", 1411d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(tx->rx_detected_cnt), 1412d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_tx->rx_detected_cnt, 1413d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_tx->rx_detected_cnt, max_tx->rx_detected_cnt); 1414d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1415d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "bt_prio_defer_cnt:", 1416d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(tx->bt_prio_defer_cnt), 1417d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_tx->bt_prio_defer_cnt, 1418d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_tx->bt_prio_defer_cnt, 1419d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_tx->bt_prio_defer_cnt); 1420d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1421d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "bt_prio_kill_cnt:", 1422d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(tx->bt_prio_kill_cnt), 1423d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_tx->bt_prio_kill_cnt, 1424d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_tx->bt_prio_kill_cnt, 1425d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_tx->bt_prio_kill_cnt); 1426d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1427d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "few_bytes_cnt:", 1428d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(tx->few_bytes_cnt), 1429d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_tx->few_bytes_cnt, 1430d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_tx->few_bytes_cnt, max_tx->few_bytes_cnt); 1431d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1432d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "cts_timeout:", 1433d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(tx->cts_timeout), accum_tx->cts_timeout, 1434d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_tx->cts_timeout, max_tx->cts_timeout); 1435d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1436d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "ack_timeout:", 1437d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(tx->ack_timeout), 1438d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_tx->ack_timeout, 1439d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_tx->ack_timeout, max_tx->ack_timeout); 1440d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1441d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "expected_ack_cnt:", 1442d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(tx->expected_ack_cnt), 1443d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_tx->expected_ack_cnt, 1444d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_tx->expected_ack_cnt, 1445d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_tx->expected_ack_cnt); 1446d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1447d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "actual_ack_cnt:", 1448d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(tx->actual_ack_cnt), 1449d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_tx->actual_ack_cnt, 1450d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_tx->actual_ack_cnt, 1451d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_tx->actual_ack_cnt); 1452d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1453d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "dump_msdu_cnt:", 1454d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(tx->dump_msdu_cnt), 1455d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_tx->dump_msdu_cnt, 1456d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_tx->dump_msdu_cnt, 1457d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_tx->dump_msdu_cnt); 1458d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1459d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "abort_nxt_frame_mismatch:", 1460d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(tx->burst_abort_next_frame_mismatch_cnt), 1461d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_tx->burst_abort_next_frame_mismatch_cnt, 1462d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_tx->burst_abort_next_frame_mismatch_cnt, 1463d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_tx->burst_abort_next_frame_mismatch_cnt); 1464d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1465d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "abort_missing_nxt_frame:", 1466d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(tx->burst_abort_missing_next_frame_cnt), 1467d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_tx->burst_abort_missing_next_frame_cnt, 1468d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_tx->burst_abort_missing_next_frame_cnt, 1469d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_tx->burst_abort_missing_next_frame_cnt); 1470d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1471d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "cts_timeout_collision:", 1472d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(tx->cts_timeout_collision), 1473d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_tx->cts_timeout_collision, 1474d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_tx->cts_timeout_collision, 1475d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_tx->cts_timeout_collision); 1476d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1477d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "ack_ba_timeout_collision:", 1478d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(tx->ack_or_ba_timeout_collision), 1479d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_tx->ack_or_ba_timeout_collision, 1480d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_tx->ack_or_ba_timeout_collision, 1481d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_tx->ack_or_ba_timeout_collision); 1482d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1483d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "agg ba_timeout:", 1484d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(tx->agg.ba_timeout), 1485d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_tx->agg.ba_timeout, 1486d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_tx->agg.ba_timeout, 1487d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_tx->agg.ba_timeout); 1488d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1489d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "agg ba_resched_frames:", 1490d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(tx->agg.ba_reschedule_frames), 1491d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_tx->agg.ba_reschedule_frames, 1492d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_tx->agg.ba_reschedule_frames, 1493d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_tx->agg.ba_reschedule_frames); 1494d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1495d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "agg scd_query_agg_frame:", 1496d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(tx->agg.scd_query_agg_frame_cnt), 1497d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_tx->agg.scd_query_agg_frame_cnt, 1498d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_tx->agg.scd_query_agg_frame_cnt, 1499d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_tx->agg.scd_query_agg_frame_cnt); 1500d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1501d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "agg scd_query_no_agg:", 1502d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(tx->agg.scd_query_no_agg), 1503d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_tx->agg.scd_query_no_agg, 1504d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_tx->agg.scd_query_no_agg, 1505d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_tx->agg.scd_query_no_agg); 1506d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1507d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "agg scd_query_agg:", 1508d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(tx->agg.scd_query_agg), 1509d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_tx->agg.scd_query_agg, 1510d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_tx->agg.scd_query_agg, 1511d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_tx->agg.scd_query_agg); 1512d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1513d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "agg scd_query_mismatch:", 1514d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(tx->agg.scd_query_mismatch), 1515d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_tx->agg.scd_query_mismatch, 1516d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_tx->agg.scd_query_mismatch, 1517d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_tx->agg.scd_query_mismatch); 1518d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1519d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "agg frame_not_ready:", 1520d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(tx->agg.frame_not_ready), 1521d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_tx->agg.frame_not_ready, 1522d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_tx->agg.frame_not_ready, 1523d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_tx->agg.frame_not_ready); 1524d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1525d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "agg underrun:", 1526d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(tx->agg.underrun), 1527d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_tx->agg.underrun, 1528d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_tx->agg.underrun, max_tx->agg.underrun); 1529d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1530d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "agg bt_prio_kill:", 1531d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(tx->agg.bt_prio_kill), 1532d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_tx->agg.bt_prio_kill, 1533d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_tx->agg.bt_prio_kill, 1534d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_tx->agg.bt_prio_kill); 1535d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1536d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "agg rx_ba_rsp_cnt:", 1537d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(tx->agg.rx_ba_rsp_cnt), 1538d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_tx->agg.rx_ba_rsp_cnt, 1539d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_tx->agg.rx_ba_rsp_cnt, 1540d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_tx->agg.rx_ba_rsp_cnt); 1541d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy 1542d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy if (tx->tx_power.ant_a || tx->tx_power.ant_b || tx->tx_power.ant_c) { 1543d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1544d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy "tx power: (1/2 dB step)\n"); 1545d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy if ((priv->cfg->valid_tx_ant & ANT_A) && tx->tx_power.ant_a) 1546d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1547d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_hex, "antenna A:", 1548d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy tx->tx_power.ant_a); 1549d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy if ((priv->cfg->valid_tx_ant & ANT_B) && tx->tx_power.ant_b) 1550d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1551d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_hex, "antenna B:", 1552d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy tx->tx_power.ant_b); 1553d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy if ((priv->cfg->valid_tx_ant & ANT_C) && tx->tx_power.ant_c) 1554d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1555d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_hex, "antenna C:", 1556d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy tx->tx_power.ant_c); 1557d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy } 1558d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy ret = simple_read_from_buffer(user_buf, count, ppos, buf, pos); 1559d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy kfree(buf); 1560d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy return ret; 1561e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guy} 1562e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guy 1563e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guystatic ssize_t iwl_dbgfs_ucode_general_stats_read(struct file *file, 1564e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guy char __user *user_buf, 1565e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guy size_t count, loff_t *ppos) 1566e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guy{ 156728f63a4bb744ea81030219aba2337fddb10b380bH Hartley Sweeten struct iwl_priv *priv = file->private_data; 1568d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy int pos = 0; 1569d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy char *buf; 1570d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy int bufsz = sizeof(struct statistics_general) * 10 + 300; 1571d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy ssize_t ret; 1572d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy struct statistics_general_common *general, *accum_general; 1573d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy struct statistics_general_common *delta_general, *max_general; 1574d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy struct statistics_dbg *dbg, *accum_dbg, *delta_dbg, *max_dbg; 1575d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy struct statistics_div *div, *accum_div, *delta_div, *max_div; 1576d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy 1577845a9c0d8acea87dede740bc5feb9ec2d00505d9Emmanuel Grumbach if (!iwl_is_alive(priv->shrd)) 1578d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy return -EAGAIN; 1579d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy 1580d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy buf = kzalloc(bufsz, GFP_KERNEL); 1581d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy if (!buf) { 1582d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy IWL_ERR(priv, "Can not allocate Buffer\n"); 1583d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy return -ENOMEM; 1584d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy } 1585d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy 1586d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy /* the statistic information display here is based on 1587d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy * the last statistics notification from uCode 1588d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy * might not reflect the current uCode activity 1589d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy */ 1590d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy general = &priv->statistics.common; 1591d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy dbg = &priv->statistics.common.dbg; 1592d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy div = &priv->statistics.common.div; 1593d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_general = &priv->accum_stats.common; 1594d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_dbg = &priv->accum_stats.common.dbg; 1595d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_div = &priv->accum_stats.common.div; 1596d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_general = &priv->delta_stats.common; 1597d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_general = &priv->max_delta_stats.common; 1598d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_dbg = &priv->delta_stats.common.dbg; 1599d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_dbg = &priv->max_delta_stats.common.dbg; 1600d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_div = &priv->delta_stats.common.div; 1601d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_div = &priv->max_delta_stats.common.div; 1602d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy 1603d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += iwl_statistics_flag(priv, buf, bufsz); 1604d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1605d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_header, "Statistics_General:"); 1606d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1607d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_value, "temperature:", 1608d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(general->temperature)); 1609d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1610d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_value, "temperature_m:", 1611d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(general->temperature_m)); 1612d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1613d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_value, "ttl_timestamp:", 1614d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(general->ttl_timestamp)); 1615d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1616d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "burst_check:", 1617d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(dbg->burst_check), 1618d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_dbg->burst_check, 1619d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_dbg->burst_check, max_dbg->burst_check); 1620d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1621d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "burst_count:", 1622d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(dbg->burst_count), 1623d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_dbg->burst_count, 1624d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_dbg->burst_count, max_dbg->burst_count); 1625d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1626d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "wait_for_silence_timeout_count:", 1627d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(dbg->wait_for_silence_timeout_cnt), 1628d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_dbg->wait_for_silence_timeout_cnt, 1629d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_dbg->wait_for_silence_timeout_cnt, 1630d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_dbg->wait_for_silence_timeout_cnt); 1631d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1632d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "sleep_time:", 1633d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(general->sleep_time), 1634d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_general->sleep_time, 1635d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_general->sleep_time, max_general->sleep_time); 1636d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1637d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "slots_out:", 1638d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(general->slots_out), 1639d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_general->slots_out, 1640d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_general->slots_out, max_general->slots_out); 1641d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1642d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "slots_idle:", 1643d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(general->slots_idle), 1644d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_general->slots_idle, 1645d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_general->slots_idle, max_general->slots_idle); 1646d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1647d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "tx_on_a:", 1648d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(div->tx_on_a), accum_div->tx_on_a, 1649d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_div->tx_on_a, max_div->tx_on_a); 1650d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1651d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "tx_on_b:", 1652d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(div->tx_on_b), accum_div->tx_on_b, 1653d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_div->tx_on_b, max_div->tx_on_b); 1654d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1655d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "exec_time:", 1656d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(div->exec_time), accum_div->exec_time, 1657d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_div->exec_time, max_div->exec_time); 1658d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1659d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "probe_time:", 1660d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(div->probe_time), accum_div->probe_time, 1661d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_div->probe_time, max_div->probe_time); 1662d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1663d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "rx_enable_counter:", 1664d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(general->rx_enable_counter), 1665d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_general->rx_enable_counter, 1666d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_general->rx_enable_counter, 1667d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_general->rx_enable_counter); 1668d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1669d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "num_of_sos_states:", 1670d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(general->num_of_sos_states), 1671d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_general->num_of_sos_states, 1672d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_general->num_of_sos_states, 1673d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_general->num_of_sos_states); 1674d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy ret = simple_read_from_buffer(user_buf, count, ppos, buf, pos); 1675d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy kfree(buf); 1676d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy return ret; 1677d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy} 1678d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy 1679d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guystatic ssize_t iwl_dbgfs_ucode_bt_stats_read(struct file *file, 1680d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy char __user *user_buf, 1681d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy size_t count, loff_t *ppos) 1682d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy{ 1683d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy struct iwl_priv *priv = (struct iwl_priv *)file->private_data; 1684d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy int pos = 0; 1685d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy char *buf; 1686d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy int bufsz = (sizeof(struct statistics_bt_activity) * 24) + 200; 1687d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy ssize_t ret; 1688d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy struct statistics_bt_activity *bt, *accum_bt; 1689d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy 1690845a9c0d8acea87dede740bc5feb9ec2d00505d9Emmanuel Grumbach if (!iwl_is_alive(priv->shrd)) 1691d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy return -EAGAIN; 1692d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy 1693d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy if (!priv->bt_enable_flag) 1694d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy return -EINVAL; 1695d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy 1696d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy /* make request to uCode to retrieve statistics information */ 16976ac2f839b0b21225a65f41802c5f0df5eff4f16cEmmanuel Grumbach mutex_lock(&priv->shrd->mutex); 1698d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy ret = iwl_send_statistics_request(priv, CMD_SYNC, false); 16996ac2f839b0b21225a65f41802c5f0df5eff4f16cEmmanuel Grumbach mutex_unlock(&priv->shrd->mutex); 1700d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy 1701d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy if (ret) { 1702d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy IWL_ERR(priv, 1703d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy "Error sending statistics request: %zd\n", ret); 1704d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy return -EAGAIN; 1705d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy } 1706d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy buf = kzalloc(bufsz, GFP_KERNEL); 1707d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy if (!buf) { 1708d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy IWL_ERR(priv, "Can not allocate Buffer\n"); 1709d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy return -ENOMEM; 1710d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy } 1711d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy 1712d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy /* 1713d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy * the statistic information display here is based on 1714d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy * the last statistics notification from uCode 1715d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy * might not reflect the current uCode activity 1716d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy */ 1717d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy bt = &priv->statistics.bt_activity; 1718d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_bt = &priv->accum_stats.bt_activity; 1719d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy 1720d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += iwl_statistics_flag(priv, buf, bufsz); 1721d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "Statistics_BT:\n"); 1722d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1723d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy "\t\t\tcurrent\t\t\taccumulative\n"); 1724d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1725d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy "hi_priority_tx_req_cnt:\t\t%u\t\t\t%u\n", 1726d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(bt->hi_priority_tx_req_cnt), 1727d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_bt->hi_priority_tx_req_cnt); 1728d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1729d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy "hi_priority_tx_denied_cnt:\t%u\t\t\t%u\n", 1730d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(bt->hi_priority_tx_denied_cnt), 1731d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_bt->hi_priority_tx_denied_cnt); 1732d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1733d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy "lo_priority_tx_req_cnt:\t\t%u\t\t\t%u\n", 1734d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(bt->lo_priority_tx_req_cnt), 1735d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_bt->lo_priority_tx_req_cnt); 1736d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1737d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy "lo_priority_tx_denied_cnt:\t%u\t\t\t%u\n", 1738d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(bt->lo_priority_tx_denied_cnt), 1739d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_bt->lo_priority_tx_denied_cnt); 1740d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1741d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy "hi_priority_rx_req_cnt:\t\t%u\t\t\t%u\n", 1742d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(bt->hi_priority_rx_req_cnt), 1743d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_bt->hi_priority_rx_req_cnt); 1744d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1745d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy "hi_priority_rx_denied_cnt:\t%u\t\t\t%u\n", 1746d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(bt->hi_priority_rx_denied_cnt), 1747d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_bt->hi_priority_rx_denied_cnt); 1748d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1749d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy "lo_priority_rx_req_cnt:\t\t%u\t\t\t%u\n", 1750d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(bt->lo_priority_rx_req_cnt), 1751d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_bt->lo_priority_rx_req_cnt); 1752d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1753d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy "lo_priority_rx_denied_cnt:\t%u\t\t\t%u\n", 1754d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(bt->lo_priority_rx_denied_cnt), 1755d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_bt->lo_priority_rx_denied_cnt); 1756d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy 1757d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1758d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy "(rx)num_bt_kills:\t\t%u\t\t\t%u\n", 1759d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(priv->statistics.num_bt_kills), 1760d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy priv->statistics.accum_num_bt_kills); 1761d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy 1762d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy ret = simple_read_from_buffer(user_buf, count, ppos, buf, pos); 1763d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy kfree(buf); 1764d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy return ret; 1765d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy} 1766d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy 1767d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guystatic ssize_t iwl_dbgfs_reply_tx_error_read(struct file *file, 1768d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy char __user *user_buf, 1769d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy size_t count, loff_t *ppos) 1770d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy{ 1771d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy struct iwl_priv *priv = (struct iwl_priv *)file->private_data; 1772d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy int pos = 0; 1773d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy char *buf; 1774d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy int bufsz = (sizeof(struct reply_tx_error_statistics) * 24) + 1775d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy (sizeof(struct reply_agg_tx_error_statistics) * 24) + 200; 1776d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy ssize_t ret; 1777d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy 1778845a9c0d8acea87dede740bc5feb9ec2d00505d9Emmanuel Grumbach if (!iwl_is_alive(priv->shrd)) 1779d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy return -EAGAIN; 1780d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy 1781d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy buf = kzalloc(bufsz, GFP_KERNEL); 1782d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy if (!buf) { 1783d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy IWL_ERR(priv, "Can not allocate Buffer\n"); 1784d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy return -ENOMEM; 1785d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy } 1786d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy 1787d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "Statistics_TX_Error:\n"); 1788d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "%s:\t\t\t\t%u\n", 1789d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy iwl_get_tx_fail_reason(TX_STATUS_POSTPONE_DELAY), 1790898ed67be047d0762cc7592f67bf1313dff53ca9Wey-Yi Guy priv->reply_tx_stats.pp_delay); 1791d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "%s:\t\t\t%u\n", 1792d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy iwl_get_tx_fail_reason(TX_STATUS_POSTPONE_FEW_BYTES), 1793898ed67be047d0762cc7592f67bf1313dff53ca9Wey-Yi Guy priv->reply_tx_stats.pp_few_bytes); 1794d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "%s:\t\t\t%u\n", 1795d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy iwl_get_tx_fail_reason(TX_STATUS_POSTPONE_BT_PRIO), 1796898ed67be047d0762cc7592f67bf1313dff53ca9Wey-Yi Guy priv->reply_tx_stats.pp_bt_prio); 1797d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "%s:\t\t\t%u\n", 1798d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy iwl_get_tx_fail_reason(TX_STATUS_POSTPONE_QUIET_PERIOD), 1799898ed67be047d0762cc7592f67bf1313dff53ca9Wey-Yi Guy priv->reply_tx_stats.pp_quiet_period); 1800d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "%s:\t\t\t%u\n", 1801d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy iwl_get_tx_fail_reason(TX_STATUS_POSTPONE_CALC_TTAK), 1802898ed67be047d0762cc7592f67bf1313dff53ca9Wey-Yi Guy priv->reply_tx_stats.pp_calc_ttak); 1803d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "%s:\t\t%u\n", 1804d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy iwl_get_tx_fail_reason( 1805d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy TX_STATUS_FAIL_INTERNAL_CROSSED_RETRY), 1806898ed67be047d0762cc7592f67bf1313dff53ca9Wey-Yi Guy priv->reply_tx_stats.int_crossed_retry); 1807d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "%s:\t\t\t%u\n", 1808d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy iwl_get_tx_fail_reason(TX_STATUS_FAIL_SHORT_LIMIT), 1809898ed67be047d0762cc7592f67bf1313dff53ca9Wey-Yi Guy priv->reply_tx_stats.short_limit); 1810d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "%s:\t\t\t%u\n", 1811d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy iwl_get_tx_fail_reason(TX_STATUS_FAIL_LONG_LIMIT), 1812898ed67be047d0762cc7592f67bf1313dff53ca9Wey-Yi Guy priv->reply_tx_stats.long_limit); 1813d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "%s:\t\t\t%u\n", 1814d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy iwl_get_tx_fail_reason(TX_STATUS_FAIL_FIFO_UNDERRUN), 1815898ed67be047d0762cc7592f67bf1313dff53ca9Wey-Yi Guy priv->reply_tx_stats.fifo_underrun); 1816d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "%s:\t\t\t%u\n", 1817d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy iwl_get_tx_fail_reason(TX_STATUS_FAIL_DRAIN_FLOW), 1818898ed67be047d0762cc7592f67bf1313dff53ca9Wey-Yi Guy priv->reply_tx_stats.drain_flow); 1819d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "%s:\t\t\t%u\n", 1820d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy iwl_get_tx_fail_reason(TX_STATUS_FAIL_RFKILL_FLUSH), 1821898ed67be047d0762cc7592f67bf1313dff53ca9Wey-Yi Guy priv->reply_tx_stats.rfkill_flush); 1822d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "%s:\t\t\t%u\n", 1823d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy iwl_get_tx_fail_reason(TX_STATUS_FAIL_LIFE_EXPIRE), 1824898ed67be047d0762cc7592f67bf1313dff53ca9Wey-Yi Guy priv->reply_tx_stats.life_expire); 1825d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "%s:\t\t\t%u\n", 1826d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy iwl_get_tx_fail_reason(TX_STATUS_FAIL_DEST_PS), 1827898ed67be047d0762cc7592f67bf1313dff53ca9Wey-Yi Guy priv->reply_tx_stats.dest_ps); 1828d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "%s:\t\t\t%u\n", 1829d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy iwl_get_tx_fail_reason(TX_STATUS_FAIL_HOST_ABORTED), 1830898ed67be047d0762cc7592f67bf1313dff53ca9Wey-Yi Guy priv->reply_tx_stats.host_abort); 1831d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "%s:\t\t\t%u\n", 1832d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy iwl_get_tx_fail_reason(TX_STATUS_FAIL_BT_RETRY), 1833898ed67be047d0762cc7592f67bf1313dff53ca9Wey-Yi Guy priv->reply_tx_stats.pp_delay); 1834d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "%s:\t\t\t%u\n", 1835d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy iwl_get_tx_fail_reason(TX_STATUS_FAIL_STA_INVALID), 1836898ed67be047d0762cc7592f67bf1313dff53ca9Wey-Yi Guy priv->reply_tx_stats.sta_invalid); 1837d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "%s:\t\t\t%u\n", 1838d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy iwl_get_tx_fail_reason(TX_STATUS_FAIL_FRAG_DROPPED), 1839898ed67be047d0762cc7592f67bf1313dff53ca9Wey-Yi Guy priv->reply_tx_stats.frag_drop); 1840d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "%s:\t\t\t%u\n", 1841d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy iwl_get_tx_fail_reason(TX_STATUS_FAIL_TID_DISABLE), 1842898ed67be047d0762cc7592f67bf1313dff53ca9Wey-Yi Guy priv->reply_tx_stats.tid_disable); 1843d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "%s:\t\t\t%u\n", 1844d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy iwl_get_tx_fail_reason(TX_STATUS_FAIL_FIFO_FLUSHED), 1845898ed67be047d0762cc7592f67bf1313dff53ca9Wey-Yi Guy priv->reply_tx_stats.fifo_flush); 1846d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "%s:\t\t%u\n", 1847d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy iwl_get_tx_fail_reason( 1848d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy TX_STATUS_FAIL_INSUFFICIENT_CF_POLL), 1849898ed67be047d0762cc7592f67bf1313dff53ca9Wey-Yi Guy priv->reply_tx_stats.insuff_cf_poll); 1850d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "%s:\t\t\t%u\n", 1851d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy iwl_get_tx_fail_reason(TX_STATUS_FAIL_PASSIVE_NO_RX), 1852898ed67be047d0762cc7592f67bf1313dff53ca9Wey-Yi Guy priv->reply_tx_stats.fail_hw_drop); 1853d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "%s:\t\t%u\n", 1854d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy iwl_get_tx_fail_reason( 1855d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy TX_STATUS_FAIL_NO_BEACON_ON_RADAR), 1856898ed67be047d0762cc7592f67bf1313dff53ca9Wey-Yi Guy priv->reply_tx_stats.sta_color_mismatch); 1857d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "UNKNOWN:\t\t\t%u\n", 1858898ed67be047d0762cc7592f67bf1313dff53ca9Wey-Yi Guy priv->reply_tx_stats.unknown); 1859d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy 1860d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1861d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy "\nStatistics_Agg_TX_Error:\n"); 1862d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy 1863d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "%s:\t\t\t%u\n", 1864d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy iwl_get_agg_tx_fail_reason(AGG_TX_STATE_UNDERRUN_MSK), 1865898ed67be047d0762cc7592f67bf1313dff53ca9Wey-Yi Guy priv->reply_agg_tx_stats.underrun); 1866d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "%s:\t\t\t%u\n", 1867d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy iwl_get_agg_tx_fail_reason(AGG_TX_STATE_BT_PRIO_MSK), 1868898ed67be047d0762cc7592f67bf1313dff53ca9Wey-Yi Guy priv->reply_agg_tx_stats.bt_prio); 1869d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "%s:\t\t\t%u\n", 1870d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy iwl_get_agg_tx_fail_reason(AGG_TX_STATE_FEW_BYTES_MSK), 1871898ed67be047d0762cc7592f67bf1313dff53ca9Wey-Yi Guy priv->reply_agg_tx_stats.few_bytes); 1872d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "%s:\t\t\t%u\n", 1873d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy iwl_get_agg_tx_fail_reason(AGG_TX_STATE_ABORT_MSK), 1874898ed67be047d0762cc7592f67bf1313dff53ca9Wey-Yi Guy priv->reply_agg_tx_stats.abort); 1875d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "%s:\t\t%u\n", 1876d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy iwl_get_agg_tx_fail_reason( 1877d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy AGG_TX_STATE_LAST_SENT_TTL_MSK), 1878898ed67be047d0762cc7592f67bf1313dff53ca9Wey-Yi Guy priv->reply_agg_tx_stats.last_sent_ttl); 1879d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "%s:\t\t%u\n", 1880d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy iwl_get_agg_tx_fail_reason( 1881d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy AGG_TX_STATE_LAST_SENT_TRY_CNT_MSK), 1882898ed67be047d0762cc7592f67bf1313dff53ca9Wey-Yi Guy priv->reply_agg_tx_stats.last_sent_try); 1883d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "%s:\t\t%u\n", 1884d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy iwl_get_agg_tx_fail_reason( 1885d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy AGG_TX_STATE_LAST_SENT_BT_KILL_MSK), 1886898ed67be047d0762cc7592f67bf1313dff53ca9Wey-Yi Guy priv->reply_agg_tx_stats.last_sent_bt_kill); 1887d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "%s:\t\t\t%u\n", 1888d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy iwl_get_agg_tx_fail_reason(AGG_TX_STATE_SCD_QUERY_MSK), 1889898ed67be047d0762cc7592f67bf1313dff53ca9Wey-Yi Guy priv->reply_agg_tx_stats.scd_query); 1890d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "%s:\t\t%u\n", 1891d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy iwl_get_agg_tx_fail_reason( 1892d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy AGG_TX_STATE_TEST_BAD_CRC32_MSK), 1893898ed67be047d0762cc7592f67bf1313dff53ca9Wey-Yi Guy priv->reply_agg_tx_stats.bad_crc32); 1894d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "%s:\t\t\t%u\n", 1895d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy iwl_get_agg_tx_fail_reason(AGG_TX_STATE_RESPONSE_MSK), 1896898ed67be047d0762cc7592f67bf1313dff53ca9Wey-Yi Guy priv->reply_agg_tx_stats.response); 1897d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "%s:\t\t\t%u\n", 1898d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy iwl_get_agg_tx_fail_reason(AGG_TX_STATE_DUMP_TX_MSK), 1899898ed67be047d0762cc7592f67bf1313dff53ca9Wey-Yi Guy priv->reply_agg_tx_stats.dump_tx); 1900d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "%s:\t\t\t%u\n", 1901d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy iwl_get_agg_tx_fail_reason(AGG_TX_STATE_DELAY_TX_MSK), 1902898ed67be047d0762cc7592f67bf1313dff53ca9Wey-Yi Guy priv->reply_agg_tx_stats.delay_tx); 1903d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "UNKNOWN:\t\t\t%u\n", 1904898ed67be047d0762cc7592f67bf1313dff53ca9Wey-Yi Guy priv->reply_agg_tx_stats.unknown); 1905d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy 1906d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy ret = simple_read_from_buffer(user_buf, count, ppos, buf, pos); 1907d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy kfree(buf); 1908d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy return ret; 1909e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guy} 1910e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guy 19115225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guystatic ssize_t iwl_dbgfs_sensitivity_read(struct file *file, 19125225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy char __user *user_buf, 19135225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy size_t count, loff_t *ppos) { 19145225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy 191528f63a4bb744ea81030219aba2337fddb10b380bH Hartley Sweeten struct iwl_priv *priv = file->private_data; 19165225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy int pos = 0; 19175225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy int cnt = 0; 19185225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy char *buf; 19195225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy int bufsz = sizeof(struct iwl_sensitivity_data) * 4 + 100; 19205225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy ssize_t ret; 19215225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy struct iwl_sensitivity_data *data; 19225225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy 19235225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy data = &priv->sensitivity_data; 19245225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy buf = kzalloc(bufsz, GFP_KERNEL); 19255225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy if (!buf) { 19265225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy IWL_ERR(priv, "Can not allocate Buffer\n"); 19275225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy return -ENOMEM; 19285225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy } 19295225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy 19305225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "auto_corr_ofdm:\t\t\t %u\n", 19315225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy data->auto_corr_ofdm); 19325225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 19335225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy "auto_corr_ofdm_mrc:\t\t %u\n", 19345225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy data->auto_corr_ofdm_mrc); 19355225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "auto_corr_ofdm_x1:\t\t %u\n", 19365225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy data->auto_corr_ofdm_x1); 19375225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 19385225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy "auto_corr_ofdm_mrc_x1:\t\t %u\n", 19395225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy data->auto_corr_ofdm_mrc_x1); 19405225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "auto_corr_cck:\t\t\t %u\n", 19415225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy data->auto_corr_cck); 19425225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "auto_corr_cck_mrc:\t\t %u\n", 19435225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy data->auto_corr_cck_mrc); 19445225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 19455225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy "last_bad_plcp_cnt_ofdm:\t\t %u\n", 19465225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy data->last_bad_plcp_cnt_ofdm); 19475225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "last_fa_cnt_ofdm:\t\t %u\n", 19485225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy data->last_fa_cnt_ofdm); 19495225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 19505225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy "last_bad_plcp_cnt_cck:\t\t %u\n", 19515225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy data->last_bad_plcp_cnt_cck); 19525225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "last_fa_cnt_cck:\t\t %u\n", 19535225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy data->last_fa_cnt_cck); 19545225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "nrg_curr_state:\t\t\t %u\n", 19555225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy data->nrg_curr_state); 19565225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "nrg_prev_state:\t\t\t %u\n", 19575225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy data->nrg_prev_state); 19585225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "nrg_value:\t\t\t"); 19595225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy for (cnt = 0; cnt < 10; cnt++) { 19605225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, " %u", 19615225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy data->nrg_value[cnt]); 19625225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy } 19635225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "\n"); 19645225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "nrg_silence_rssi:\t\t"); 19655225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy for (cnt = 0; cnt < NRG_NUM_PREV_STAT_L; cnt++) { 19665225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, " %u", 19675225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy data->nrg_silence_rssi[cnt]); 19685225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy } 19695225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "\n"); 19705225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "nrg_silence_ref:\t\t %u\n", 19715225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy data->nrg_silence_ref); 19725225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "nrg_energy_idx:\t\t\t %u\n", 19735225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy data->nrg_energy_idx); 19745225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "nrg_silence_idx:\t\t %u\n", 19755225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy data->nrg_silence_idx); 19765225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "nrg_th_cck:\t\t\t %u\n", 19775225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy data->nrg_th_cck); 19785225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 19795225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy "nrg_auto_corr_silence_diff:\t %u\n", 19805225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy data->nrg_auto_corr_silence_diff); 19815225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "num_in_cck_no_fa:\t\t %u\n", 19825225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy data->num_in_cck_no_fa); 19835225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "nrg_th_ofdm:\t\t\t %u\n", 19845225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy data->nrg_th_ofdm); 19855225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy 19865225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy ret = simple_read_from_buffer(user_buf, count, ppos, buf, pos); 19875225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy kfree(buf); 19885225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy return ret; 19895225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy} 19905225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy 19915225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy 19925225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guystatic ssize_t iwl_dbgfs_chain_noise_read(struct file *file, 19935225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy char __user *user_buf, 19945225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy size_t count, loff_t *ppos) { 19955225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy 199628f63a4bb744ea81030219aba2337fddb10b380bH Hartley Sweeten struct iwl_priv *priv = file->private_data; 19975225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy int pos = 0; 19985225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy int cnt = 0; 19995225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy char *buf; 20005225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy int bufsz = sizeof(struct iwl_chain_noise_data) * 4 + 100; 20015225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy ssize_t ret; 20025225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy struct iwl_chain_noise_data *data; 20035225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy 20045225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy data = &priv->chain_noise_data; 20055225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy buf = kzalloc(bufsz, GFP_KERNEL); 20065225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy if (!buf) { 20075225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy IWL_ERR(priv, "Can not allocate Buffer\n"); 20085225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy return -ENOMEM; 20095225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy } 20105225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy 20115225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "active_chains:\t\t\t %u\n", 20125225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy data->active_chains); 20135225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "chain_noise_a:\t\t\t %u\n", 20145225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy data->chain_noise_a); 20155225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "chain_noise_b:\t\t\t %u\n", 20165225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy data->chain_noise_b); 20175225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "chain_noise_c:\t\t\t %u\n", 20185225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy data->chain_noise_c); 20195225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "chain_signal_a:\t\t\t %u\n", 20205225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy data->chain_signal_a); 20215225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "chain_signal_b:\t\t\t %u\n", 20225225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy data->chain_signal_b); 20235225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "chain_signal_c:\t\t\t %u\n", 20245225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy data->chain_signal_c); 20255225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "beacon_count:\t\t\t %u\n", 20265225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy data->beacon_count); 20275225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy 20285225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "disconn_array:\t\t\t"); 20295225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy for (cnt = 0; cnt < NUM_RX_CHAINS; cnt++) { 20305225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, " %u", 20315225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy data->disconn_array[cnt]); 20325225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy } 20335225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "\n"); 20345225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "delta_gain_code:\t\t"); 20355225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy for (cnt = 0; cnt < NUM_RX_CHAINS; cnt++) { 20365225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, " %u", 20375225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy data->delta_gain_code[cnt]); 20385225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy } 20395225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "\n"); 20405225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "radio_write:\t\t\t %u\n", 20415225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy data->radio_write); 20425225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "state:\t\t\t\t %u\n", 20435225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy data->state); 20445225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy 20455225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy ret = simple_read_from_buffer(user_buf, count, ppos, buf, pos); 20465225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy kfree(buf); 20475225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy return ret; 20485225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy} 20495225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy 2050c09430abed4159e5c56aaea257d040f7452daba6Wey-Yi Guystatic ssize_t iwl_dbgfs_power_save_status_read(struct file *file, 2051c09430abed4159e5c56aaea257d040f7452daba6Wey-Yi Guy char __user *user_buf, 2052c09430abed4159e5c56aaea257d040f7452daba6Wey-Yi Guy size_t count, loff_t *ppos) 2053c09430abed4159e5c56aaea257d040f7452daba6Wey-Yi Guy{ 205428f63a4bb744ea81030219aba2337fddb10b380bH Hartley Sweeten struct iwl_priv *priv = file->private_data; 2055c09430abed4159e5c56aaea257d040f7452daba6Wey-Yi Guy char buf[60]; 2056c09430abed4159e5c56aaea257d040f7452daba6Wey-Yi Guy int pos = 0; 2057c09430abed4159e5c56aaea257d040f7452daba6Wey-Yi Guy const size_t bufsz = sizeof(buf); 2058c09430abed4159e5c56aaea257d040f7452daba6Wey-Yi Guy u32 pwrsave_status; 2059c09430abed4159e5c56aaea257d040f7452daba6Wey-Yi Guy 206083ed90155f98bd949735c2cc22d832b557a6d7d1Emmanuel Grumbach pwrsave_status = iwl_read32(bus(priv), CSR_GP_CNTRL) & 2061c09430abed4159e5c56aaea257d040f7452daba6Wey-Yi Guy CSR_GP_REG_POWER_SAVE_STATUS_MSK; 2062c09430abed4159e5c56aaea257d040f7452daba6Wey-Yi Guy 2063c09430abed4159e5c56aaea257d040f7452daba6Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "Power Save Status: "); 2064c09430abed4159e5c56aaea257d040f7452daba6Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "%s\n", 2065c09430abed4159e5c56aaea257d040f7452daba6Wey-Yi Guy (pwrsave_status == CSR_GP_REG_NO_POWER_SAVE) ? "none" : 2066c09430abed4159e5c56aaea257d040f7452daba6Wey-Yi Guy (pwrsave_status == CSR_GP_REG_MAC_POWER_SAVE) ? "MAC" : 2067c09430abed4159e5c56aaea257d040f7452daba6Wey-Yi Guy (pwrsave_status == CSR_GP_REG_PHY_POWER_SAVE) ? "PHY" : 2068c09430abed4159e5c56aaea257d040f7452daba6Wey-Yi Guy "error"); 2069c09430abed4159e5c56aaea257d040f7452daba6Wey-Yi Guy 2070c09430abed4159e5c56aaea257d040f7452daba6Wey-Yi Guy return simple_read_from_buffer(user_buf, count, ppos, buf, pos); 2071c09430abed4159e5c56aaea257d040f7452daba6Wey-Yi Guy} 2072c09430abed4159e5c56aaea257d040f7452daba6Wey-Yi Guy 20737163b8a4ec995dabda3e92c6fed7b8600060618cWey-Yi Guystatic ssize_t iwl_dbgfs_clear_ucode_statistics_write(struct file *file, 2074ef8d5529b015d4c5db7fad1adfc91edfd5abad56Wey-Yi Guy const char __user *user_buf, 2075ef8d5529b015d4c5db7fad1adfc91edfd5abad56Wey-Yi Guy size_t count, loff_t *ppos) 2076ef8d5529b015d4c5db7fad1adfc91edfd5abad56Wey-Yi Guy{ 2077ef8d5529b015d4c5db7fad1adfc91edfd5abad56Wey-Yi Guy struct iwl_priv *priv = file->private_data; 2078ef8d5529b015d4c5db7fad1adfc91edfd5abad56Wey-Yi Guy char buf[8]; 2079ef8d5529b015d4c5db7fad1adfc91edfd5abad56Wey-Yi Guy int buf_size; 2080ef8d5529b015d4c5db7fad1adfc91edfd5abad56Wey-Yi Guy int clear; 2081ef8d5529b015d4c5db7fad1adfc91edfd5abad56Wey-Yi Guy 2082ef8d5529b015d4c5db7fad1adfc91edfd5abad56Wey-Yi Guy memset(buf, 0, sizeof(buf)); 2083ef8d5529b015d4c5db7fad1adfc91edfd5abad56Wey-Yi Guy buf_size = min(count, sizeof(buf) - 1); 2084ef8d5529b015d4c5db7fad1adfc91edfd5abad56Wey-Yi Guy if (copy_from_user(buf, user_buf, buf_size)) 2085ef8d5529b015d4c5db7fad1adfc91edfd5abad56Wey-Yi Guy return -EFAULT; 2086ef8d5529b015d4c5db7fad1adfc91edfd5abad56Wey-Yi Guy if (sscanf(buf, "%d", &clear) != 1) 2087ef8d5529b015d4c5db7fad1adfc91edfd5abad56Wey-Yi Guy return -EFAULT; 2088ef8d5529b015d4c5db7fad1adfc91edfd5abad56Wey-Yi Guy 2089ef8d5529b015d4c5db7fad1adfc91edfd5abad56Wey-Yi Guy /* make request to uCode to retrieve statistics information */ 20906ac2f839b0b21225a65f41802c5f0df5eff4f16cEmmanuel Grumbach mutex_lock(&priv->shrd->mutex); 2091ef8d5529b015d4c5db7fad1adfc91edfd5abad56Wey-Yi Guy iwl_send_statistics_request(priv, CMD_SYNC, true); 20926ac2f839b0b21225a65f41802c5f0df5eff4f16cEmmanuel Grumbach mutex_unlock(&priv->shrd->mutex); 2093ef8d5529b015d4c5db7fad1adfc91edfd5abad56Wey-Yi Guy 2094ef8d5529b015d4c5db7fad1adfc91edfd5abad56Wey-Yi Guy return count; 2095ef8d5529b015d4c5db7fad1adfc91edfd5abad56Wey-Yi Guy} 2096ef8d5529b015d4c5db7fad1adfc91edfd5abad56Wey-Yi Guy 2097a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guystatic ssize_t iwl_dbgfs_ucode_tracing_read(struct file *file, 2098a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy char __user *user_buf, 2099a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy size_t count, loff_t *ppos) { 2100a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy 210157674308d00b5ebb639ce53d388e61728e0c7f72Joe Perches struct iwl_priv *priv = file->private_data; 2102a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy int pos = 0; 2103a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy char buf[128]; 2104a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy const size_t bufsz = sizeof(buf); 2105a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy 2106a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "ucode trace timer is %s\n", 2107a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy priv->event_log.ucode_trace ? "On" : "Off"); 2108a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "non_wraps_count:\t\t %u\n", 2109a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy priv->event_log.non_wraps_count); 2110a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "wraps_once_count:\t\t %u\n", 2111a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy priv->event_log.wraps_once_count); 2112a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "wraps_more_count:\t\t %u\n", 2113a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy priv->event_log.wraps_more_count); 2114a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy 21154967c31677cf3c6c49aadf205f1a31d15d7610daWey-Yi Guy return simple_read_from_buffer(user_buf, count, ppos, buf, pos); 2116a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy} 2117a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy 2118a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guystatic ssize_t iwl_dbgfs_ucode_tracing_write(struct file *file, 2119a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy const char __user *user_buf, 2120a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy size_t count, loff_t *ppos) 2121a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy{ 2122a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy struct iwl_priv *priv = file->private_data; 2123a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy char buf[8]; 2124a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy int buf_size; 2125a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy int trace; 2126a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy 2127a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy memset(buf, 0, sizeof(buf)); 2128a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy buf_size = min(count, sizeof(buf) - 1); 2129a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy if (copy_from_user(buf, user_buf, buf_size)) 2130a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy return -EFAULT; 2131a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy if (sscanf(buf, "%d", &trace) != 1) 2132a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy return -EFAULT; 2133a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy 2134a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy if (trace) { 2135a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy priv->event_log.ucode_trace = true; 2136a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy /* schedule the ucode timer to occur in UCODE_TRACE_PERIOD */ 2137a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy mod_timer(&priv->ucode_trace, 2138a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy jiffies + msecs_to_jiffies(UCODE_TRACE_PERIOD)); 2139a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy } else { 2140a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy priv->event_log.ucode_trace = false; 2141a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy del_timer_sync(&priv->ucode_trace); 2142a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy } 2143a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy 2144a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy return count; 2145a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy} 2146a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy 214760987206cba0dbb547bce2d23c3a3338c5aaf5acJohannes Bergstatic ssize_t iwl_dbgfs_rxon_flags_read(struct file *file, 214860987206cba0dbb547bce2d23c3a3338c5aaf5acJohannes Berg char __user *user_buf, 214960987206cba0dbb547bce2d23c3a3338c5aaf5acJohannes Berg size_t count, loff_t *ppos) { 215060987206cba0dbb547bce2d23c3a3338c5aaf5acJohannes Berg 215157674308d00b5ebb639ce53d388e61728e0c7f72Joe Perches struct iwl_priv *priv = file->private_data; 215260987206cba0dbb547bce2d23c3a3338c5aaf5acJohannes Berg int len = 0; 215360987206cba0dbb547bce2d23c3a3338c5aaf5acJohannes Berg char buf[20]; 215460987206cba0dbb547bce2d23c3a3338c5aaf5acJohannes Berg 2155246ed355221076884d225f9d8a4c30a048be8162Johannes Berg len = sprintf(buf, "0x%04X\n", 2156246ed355221076884d225f9d8a4c30a048be8162Johannes Berg le32_to_cpu(priv->contexts[IWL_RXON_CTX_BSS].active.flags)); 215760987206cba0dbb547bce2d23c3a3338c5aaf5acJohannes Berg return simple_read_from_buffer(user_buf, count, ppos, buf, len); 215860987206cba0dbb547bce2d23c3a3338c5aaf5acJohannes Berg} 215960987206cba0dbb547bce2d23c3a3338c5aaf5acJohannes Berg 216060987206cba0dbb547bce2d23c3a3338c5aaf5acJohannes Bergstatic ssize_t iwl_dbgfs_rxon_filter_flags_read(struct file *file, 216160987206cba0dbb547bce2d23c3a3338c5aaf5acJohannes Berg char __user *user_buf, 216260987206cba0dbb547bce2d23c3a3338c5aaf5acJohannes Berg size_t count, loff_t *ppos) { 216360987206cba0dbb547bce2d23c3a3338c5aaf5acJohannes Berg 216457674308d00b5ebb639ce53d388e61728e0c7f72Joe Perches struct iwl_priv *priv = file->private_data; 216560987206cba0dbb547bce2d23c3a3338c5aaf5acJohannes Berg int len = 0; 216660987206cba0dbb547bce2d23c3a3338c5aaf5acJohannes Berg char buf[20]; 216760987206cba0dbb547bce2d23c3a3338c5aaf5acJohannes Berg 216860987206cba0dbb547bce2d23c3a3338c5aaf5acJohannes Berg len = sprintf(buf, "0x%04X\n", 2169246ed355221076884d225f9d8a4c30a048be8162Johannes Berg le32_to_cpu(priv->contexts[IWL_RXON_CTX_BSS].active.filter_flags)); 217060987206cba0dbb547bce2d23c3a3338c5aaf5acJohannes Berg return simple_read_from_buffer(user_buf, count, ppos, buf, len); 217160987206cba0dbb547bce2d23c3a3338c5aaf5acJohannes Berg} 217260987206cba0dbb547bce2d23c3a3338c5aaf5acJohannes Berg 2173a13d276f1e49ae0bc4ad18ce8ea3c90656c9e8d4Wey-Yi Guystatic ssize_t iwl_dbgfs_missed_beacon_read(struct file *file, 2174a13d276f1e49ae0bc4ad18ce8ea3c90656c9e8d4Wey-Yi Guy char __user *user_buf, 2175a13d276f1e49ae0bc4ad18ce8ea3c90656c9e8d4Wey-Yi Guy size_t count, loff_t *ppos) { 2176a13d276f1e49ae0bc4ad18ce8ea3c90656c9e8d4Wey-Yi Guy 2177a13d276f1e49ae0bc4ad18ce8ea3c90656c9e8d4Wey-Yi Guy struct iwl_priv *priv = file->private_data; 2178a13d276f1e49ae0bc4ad18ce8ea3c90656c9e8d4Wey-Yi Guy int pos = 0; 2179a13d276f1e49ae0bc4ad18ce8ea3c90656c9e8d4Wey-Yi Guy char buf[12]; 2180a13d276f1e49ae0bc4ad18ce8ea3c90656c9e8d4Wey-Yi Guy const size_t bufsz = sizeof(buf); 2181a13d276f1e49ae0bc4ad18ce8ea3c90656c9e8d4Wey-Yi Guy 2182a13d276f1e49ae0bc4ad18ce8ea3c90656c9e8d4Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "%d\n", 2183a13d276f1e49ae0bc4ad18ce8ea3c90656c9e8d4Wey-Yi Guy priv->missed_beacon_threshold); 2184a13d276f1e49ae0bc4ad18ce8ea3c90656c9e8d4Wey-Yi Guy 21854967c31677cf3c6c49aadf205f1a31d15d7610daWey-Yi Guy return simple_read_from_buffer(user_buf, count, ppos, buf, pos); 2186a13d276f1e49ae0bc4ad18ce8ea3c90656c9e8d4Wey-Yi Guy} 2187a13d276f1e49ae0bc4ad18ce8ea3c90656c9e8d4Wey-Yi Guy 2188a13d276f1e49ae0bc4ad18ce8ea3c90656c9e8d4Wey-Yi Guystatic ssize_t iwl_dbgfs_missed_beacon_write(struct file *file, 2189a13d276f1e49ae0bc4ad18ce8ea3c90656c9e8d4Wey-Yi Guy const char __user *user_buf, 2190a13d276f1e49ae0bc4ad18ce8ea3c90656c9e8d4Wey-Yi Guy size_t count, loff_t *ppos) 2191a13d276f1e49ae0bc4ad18ce8ea3c90656c9e8d4Wey-Yi Guy{ 2192a13d276f1e49ae0bc4ad18ce8ea3c90656c9e8d4Wey-Yi Guy struct iwl_priv *priv = file->private_data; 2193a13d276f1e49ae0bc4ad18ce8ea3c90656c9e8d4Wey-Yi Guy char buf[8]; 2194a13d276f1e49ae0bc4ad18ce8ea3c90656c9e8d4Wey-Yi Guy int buf_size; 2195a13d276f1e49ae0bc4ad18ce8ea3c90656c9e8d4Wey-Yi Guy int missed; 2196a13d276f1e49ae0bc4ad18ce8ea3c90656c9e8d4Wey-Yi Guy 2197a13d276f1e49ae0bc4ad18ce8ea3c90656c9e8d4Wey-Yi Guy memset(buf, 0, sizeof(buf)); 2198a13d276f1e49ae0bc4ad18ce8ea3c90656c9e8d4Wey-Yi Guy buf_size = min(count, sizeof(buf) - 1); 2199a13d276f1e49ae0bc4ad18ce8ea3c90656c9e8d4Wey-Yi Guy if (copy_from_user(buf, user_buf, buf_size)) 2200a13d276f1e49ae0bc4ad18ce8ea3c90656c9e8d4Wey-Yi Guy return -EFAULT; 2201a13d276f1e49ae0bc4ad18ce8ea3c90656c9e8d4Wey-Yi Guy if (sscanf(buf, "%d", &missed) != 1) 2202a13d276f1e49ae0bc4ad18ce8ea3c90656c9e8d4Wey-Yi Guy return -EINVAL; 2203a13d276f1e49ae0bc4ad18ce8ea3c90656c9e8d4Wey-Yi Guy 2204a13d276f1e49ae0bc4ad18ce8ea3c90656c9e8d4Wey-Yi Guy if (missed < IWL_MISSED_BEACON_THRESHOLD_MIN || 2205a13d276f1e49ae0bc4ad18ce8ea3c90656c9e8d4Wey-Yi Guy missed > IWL_MISSED_BEACON_THRESHOLD_MAX) 2206a13d276f1e49ae0bc4ad18ce8ea3c90656c9e8d4Wey-Yi Guy priv->missed_beacon_threshold = 2207a13d276f1e49ae0bc4ad18ce8ea3c90656c9e8d4Wey-Yi Guy IWL_MISSED_BEACON_THRESHOLD_DEF; 2208a13d276f1e49ae0bc4ad18ce8ea3c90656c9e8d4Wey-Yi Guy else 2209a13d276f1e49ae0bc4ad18ce8ea3c90656c9e8d4Wey-Yi Guy priv->missed_beacon_threshold = missed; 2210a13d276f1e49ae0bc4ad18ce8ea3c90656c9e8d4Wey-Yi Guy 2211a13d276f1e49ae0bc4ad18ce8ea3c90656c9e8d4Wey-Yi Guy return count; 2212a13d276f1e49ae0bc4ad18ce8ea3c90656c9e8d4Wey-Yi Guy} 2213a13d276f1e49ae0bc4ad18ce8ea3c90656c9e8d4Wey-Yi Guy 22143e4fb5faefb57824f2e42305b3d5907845af978cTrieu 'Andrew' Nguyenstatic ssize_t iwl_dbgfs_plcp_delta_read(struct file *file, 22153e4fb5faefb57824f2e42305b3d5907845af978cTrieu 'Andrew' Nguyen char __user *user_buf, 22163e4fb5faefb57824f2e42305b3d5907845af978cTrieu 'Andrew' Nguyen size_t count, loff_t *ppos) { 22173e4fb5faefb57824f2e42305b3d5907845af978cTrieu 'Andrew' Nguyen 221857674308d00b5ebb639ce53d388e61728e0c7f72Joe Perches struct iwl_priv *priv = file->private_data; 22193e4fb5faefb57824f2e42305b3d5907845af978cTrieu 'Andrew' Nguyen int pos = 0; 22203e4fb5faefb57824f2e42305b3d5907845af978cTrieu 'Andrew' Nguyen char buf[12]; 22213e4fb5faefb57824f2e42305b3d5907845af978cTrieu 'Andrew' Nguyen const size_t bufsz = sizeof(buf); 22223e4fb5faefb57824f2e42305b3d5907845af978cTrieu 'Andrew' Nguyen 22233e4fb5faefb57824f2e42305b3d5907845af978cTrieu 'Andrew' Nguyen pos += scnprintf(buf + pos, bufsz - pos, "%u\n", 22247cb1b0887fcc61918e3d64827fbef968bb67a57aWey-Yi Guy priv->cfg->base_params->plcp_delta_threshold); 22253e4fb5faefb57824f2e42305b3d5907845af978cTrieu 'Andrew' Nguyen 22264967c31677cf3c6c49aadf205f1a31d15d7610daWey-Yi Guy return simple_read_from_buffer(user_buf, count, ppos, buf, pos); 22273e4fb5faefb57824f2e42305b3d5907845af978cTrieu 'Andrew' Nguyen} 22283e4fb5faefb57824f2e42305b3d5907845af978cTrieu 'Andrew' Nguyen 22293e4fb5faefb57824f2e42305b3d5907845af978cTrieu 'Andrew' Nguyenstatic ssize_t iwl_dbgfs_plcp_delta_write(struct file *file, 22303e4fb5faefb57824f2e42305b3d5907845af978cTrieu 'Andrew' Nguyen const char __user *user_buf, 22313e4fb5faefb57824f2e42305b3d5907845af978cTrieu 'Andrew' Nguyen size_t count, loff_t *ppos) { 22323e4fb5faefb57824f2e42305b3d5907845af978cTrieu 'Andrew' Nguyen 22333e4fb5faefb57824f2e42305b3d5907845af978cTrieu 'Andrew' Nguyen struct iwl_priv *priv = file->private_data; 22343e4fb5faefb57824f2e42305b3d5907845af978cTrieu 'Andrew' Nguyen char buf[8]; 22353e4fb5faefb57824f2e42305b3d5907845af978cTrieu 'Andrew' Nguyen int buf_size; 22363e4fb5faefb57824f2e42305b3d5907845af978cTrieu 'Andrew' Nguyen int plcp; 22373e4fb5faefb57824f2e42305b3d5907845af978cTrieu 'Andrew' Nguyen 22383e4fb5faefb57824f2e42305b3d5907845af978cTrieu 'Andrew' Nguyen memset(buf, 0, sizeof(buf)); 22393e4fb5faefb57824f2e42305b3d5907845af978cTrieu 'Andrew' Nguyen buf_size = min(count, sizeof(buf) - 1); 22403e4fb5faefb57824f2e42305b3d5907845af978cTrieu 'Andrew' Nguyen if (copy_from_user(buf, user_buf, buf_size)) 22413e4fb5faefb57824f2e42305b3d5907845af978cTrieu 'Andrew' Nguyen return -EFAULT; 22423e4fb5faefb57824f2e42305b3d5907845af978cTrieu 'Andrew' Nguyen if (sscanf(buf, "%d", &plcp) != 1) 22433e4fb5faefb57824f2e42305b3d5907845af978cTrieu 'Andrew' Nguyen return -EINVAL; 2244680788aca3dcc24b932eb7a4219ab921ac5bf2d0Wey-Yi Guy if ((plcp < IWL_MAX_PLCP_ERR_THRESHOLD_MIN) || 22453e4fb5faefb57824f2e42305b3d5907845af978cTrieu 'Andrew' Nguyen (plcp > IWL_MAX_PLCP_ERR_THRESHOLD_MAX)) 22467cb1b0887fcc61918e3d64827fbef968bb67a57aWey-Yi Guy priv->cfg->base_params->plcp_delta_threshold = 2247680788aca3dcc24b932eb7a4219ab921ac5bf2d0Wey-Yi Guy IWL_MAX_PLCP_ERR_THRESHOLD_DISABLE; 22483e4fb5faefb57824f2e42305b3d5907845af978cTrieu 'Andrew' Nguyen else 22497cb1b0887fcc61918e3d64827fbef968bb67a57aWey-Yi Guy priv->cfg->base_params->plcp_delta_threshold = plcp; 22503e4fb5faefb57824f2e42305b3d5907845af978cTrieu 'Andrew' Nguyen return count; 22513e4fb5faefb57824f2e42305b3d5907845af978cTrieu 'Andrew' Nguyen} 22523e4fb5faefb57824f2e42305b3d5907845af978cTrieu 'Andrew' Nguyen 2253528c3126a98e75f47fc9fa11b243c82a59271d0dWey-Yi Guystatic ssize_t iwl_dbgfs_force_reset_read(struct file *file, 2254528c3126a98e75f47fc9fa11b243c82a59271d0dWey-Yi Guy char __user *user_buf, 2255ca934b6715c134573da5acea01e9258eb0bf7c27Johannes Berg size_t count, loff_t *ppos) 2256ca934b6715c134573da5acea01e9258eb0bf7c27Johannes Berg{ 2257528c3126a98e75f47fc9fa11b243c82a59271d0dWey-Yi Guy struct iwl_priv *priv = file->private_data; 2258528c3126a98e75f47fc9fa11b243c82a59271d0dWey-Yi Guy int i, pos = 0; 2259528c3126a98e75f47fc9fa11b243c82a59271d0dWey-Yi Guy char buf[300]; 2260528c3126a98e75f47fc9fa11b243c82a59271d0dWey-Yi Guy const size_t bufsz = sizeof(buf); 2261528c3126a98e75f47fc9fa11b243c82a59271d0dWey-Yi Guy struct iwl_force_reset *force_reset; 2262528c3126a98e75f47fc9fa11b243c82a59271d0dWey-Yi Guy 2263528c3126a98e75f47fc9fa11b243c82a59271d0dWey-Yi Guy for (i = 0; i < IWL_MAX_FORCE_RESET; i++) { 2264528c3126a98e75f47fc9fa11b243c82a59271d0dWey-Yi Guy force_reset = &priv->force_reset[i]; 2265528c3126a98e75f47fc9fa11b243c82a59271d0dWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 2266528c3126a98e75f47fc9fa11b243c82a59271d0dWey-Yi Guy "Force reset method %d\n", i); 2267528c3126a98e75f47fc9fa11b243c82a59271d0dWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 2268528c3126a98e75f47fc9fa11b243c82a59271d0dWey-Yi Guy "\tnumber of reset request: %d\n", 2269528c3126a98e75f47fc9fa11b243c82a59271d0dWey-Yi Guy force_reset->reset_request_count); 2270528c3126a98e75f47fc9fa11b243c82a59271d0dWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 2271528c3126a98e75f47fc9fa11b243c82a59271d0dWey-Yi Guy "\tnumber of reset request success: %d\n", 2272528c3126a98e75f47fc9fa11b243c82a59271d0dWey-Yi Guy force_reset->reset_success_count); 2273528c3126a98e75f47fc9fa11b243c82a59271d0dWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 2274528c3126a98e75f47fc9fa11b243c82a59271d0dWey-Yi Guy "\tnumber of reset request reject: %d\n", 2275528c3126a98e75f47fc9fa11b243c82a59271d0dWey-Yi Guy force_reset->reset_reject_count); 2276528c3126a98e75f47fc9fa11b243c82a59271d0dWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 2277528c3126a98e75f47fc9fa11b243c82a59271d0dWey-Yi Guy "\treset duration: %lu\n", 2278528c3126a98e75f47fc9fa11b243c82a59271d0dWey-Yi Guy force_reset->reset_duration); 2279528c3126a98e75f47fc9fa11b243c82a59271d0dWey-Yi Guy } 2280528c3126a98e75f47fc9fa11b243c82a59271d0dWey-Yi Guy return simple_read_from_buffer(user_buf, count, ppos, buf, pos); 2281528c3126a98e75f47fc9fa11b243c82a59271d0dWey-Yi Guy} 2282528c3126a98e75f47fc9fa11b243c82a59271d0dWey-Yi Guy 228304cafd7fa74d5f70efc93bef36f118177057ff74Wey-Yi Guystatic ssize_t iwl_dbgfs_force_reset_write(struct file *file, 228404cafd7fa74d5f70efc93bef36f118177057ff74Wey-Yi Guy const char __user *user_buf, 228504cafd7fa74d5f70efc93bef36f118177057ff74Wey-Yi Guy size_t count, loff_t *ppos) { 228604cafd7fa74d5f70efc93bef36f118177057ff74Wey-Yi Guy 228704cafd7fa74d5f70efc93bef36f118177057ff74Wey-Yi Guy struct iwl_priv *priv = file->private_data; 228804cafd7fa74d5f70efc93bef36f118177057ff74Wey-Yi Guy char buf[8]; 228904cafd7fa74d5f70efc93bef36f118177057ff74Wey-Yi Guy int buf_size; 229004cafd7fa74d5f70efc93bef36f118177057ff74Wey-Yi Guy int reset, ret; 229104cafd7fa74d5f70efc93bef36f118177057ff74Wey-Yi Guy 229204cafd7fa74d5f70efc93bef36f118177057ff74Wey-Yi Guy memset(buf, 0, sizeof(buf)); 229304cafd7fa74d5f70efc93bef36f118177057ff74Wey-Yi Guy buf_size = min(count, sizeof(buf) - 1); 229404cafd7fa74d5f70efc93bef36f118177057ff74Wey-Yi Guy if (copy_from_user(buf, user_buf, buf_size)) 229504cafd7fa74d5f70efc93bef36f118177057ff74Wey-Yi Guy return -EFAULT; 229604cafd7fa74d5f70efc93bef36f118177057ff74Wey-Yi Guy if (sscanf(buf, "%d", &reset) != 1) 229704cafd7fa74d5f70efc93bef36f118177057ff74Wey-Yi Guy return -EINVAL; 229804cafd7fa74d5f70efc93bef36f118177057ff74Wey-Yi Guy switch (reset) { 229904cafd7fa74d5f70efc93bef36f118177057ff74Wey-Yi Guy case IWL_RF_RESET: 230004cafd7fa74d5f70efc93bef36f118177057ff74Wey-Yi Guy case IWL_FW_RESET: 2301c04f9f220300da83f71698fa7be24714152faf0dWey-Yi Guy ret = iwl_force_reset(priv, reset, true); 230204cafd7fa74d5f70efc93bef36f118177057ff74Wey-Yi Guy break; 230304cafd7fa74d5f70efc93bef36f118177057ff74Wey-Yi Guy default: 230404cafd7fa74d5f70efc93bef36f118177057ff74Wey-Yi Guy return -EINVAL; 230504cafd7fa74d5f70efc93bef36f118177057ff74Wey-Yi Guy } 230604cafd7fa74d5f70efc93bef36f118177057ff74Wey-Yi Guy return ret ? ret : count; 230704cafd7fa74d5f70efc93bef36f118177057ff74Wey-Yi Guy} 230804cafd7fa74d5f70efc93bef36f118177057ff74Wey-Yi Guy 23094bf49a90bc0bda131ef353cca631025849f36b4eWey-Yi Guystatic ssize_t iwl_dbgfs_txfifo_flush_write(struct file *file, 23104bf49a90bc0bda131ef353cca631025849f36b4eWey-Yi Guy const char __user *user_buf, 23114bf49a90bc0bda131ef353cca631025849f36b4eWey-Yi Guy size_t count, loff_t *ppos) { 23124bf49a90bc0bda131ef353cca631025849f36b4eWey-Yi Guy 23134bf49a90bc0bda131ef353cca631025849f36b4eWey-Yi Guy struct iwl_priv *priv = file->private_data; 23144bf49a90bc0bda131ef353cca631025849f36b4eWey-Yi Guy char buf[8]; 23154bf49a90bc0bda131ef353cca631025849f36b4eWey-Yi Guy int buf_size; 23164bf49a90bc0bda131ef353cca631025849f36b4eWey-Yi Guy int flush; 23174bf49a90bc0bda131ef353cca631025849f36b4eWey-Yi Guy 23184bf49a90bc0bda131ef353cca631025849f36b4eWey-Yi Guy memset(buf, 0, sizeof(buf)); 23194bf49a90bc0bda131ef353cca631025849f36b4eWey-Yi Guy buf_size = min(count, sizeof(buf) - 1); 23204bf49a90bc0bda131ef353cca631025849f36b4eWey-Yi Guy if (copy_from_user(buf, user_buf, buf_size)) 23214bf49a90bc0bda131ef353cca631025849f36b4eWey-Yi Guy return -EFAULT; 23224bf49a90bc0bda131ef353cca631025849f36b4eWey-Yi Guy if (sscanf(buf, "%d", &flush) != 1) 23234bf49a90bc0bda131ef353cca631025849f36b4eWey-Yi Guy return -EINVAL; 23244bf49a90bc0bda131ef353cca631025849f36b4eWey-Yi Guy 2325845a9c0d8acea87dede740bc5feb9ec2d00505d9Emmanuel Grumbach if (iwl_is_rfkill(priv->shrd)) 23264bf49a90bc0bda131ef353cca631025849f36b4eWey-Yi Guy return -EFAULT; 23274bf49a90bc0bda131ef353cca631025849f36b4eWey-Yi Guy 2328c68744fb935400964f7af4835017cad5014c8c88Wey-Yi Guy iwlagn_dev_txfifo_flush(priv, IWL_DROP_ALL); 23294bf49a90bc0bda131ef353cca631025849f36b4eWey-Yi Guy 23304bf49a90bc0bda131ef353cca631025849f36b4eWey-Yi Guy return count; 23314bf49a90bc0bda131ef353cca631025849f36b4eWey-Yi Guy} 23324bf49a90bc0bda131ef353cca631025849f36b4eWey-Yi Guy 233322de94de7de78b8de2fb1f2df5aa85b5556cfcfdStanislaw Gruszkastatic ssize_t iwl_dbgfs_wd_timeout_write(struct file *file, 23347bdc473c7a52497af9fe8c73e4745615a2825aaaWey-Yi Guy const char __user *user_buf, 2335ca934b6715c134573da5acea01e9258eb0bf7c27Johannes Berg size_t count, loff_t *ppos) 2336ca934b6715c134573da5acea01e9258eb0bf7c27Johannes Berg{ 23377bdc473c7a52497af9fe8c73e4745615a2825aaaWey-Yi Guy struct iwl_priv *priv = file->private_data; 23387bdc473c7a52497af9fe8c73e4745615a2825aaaWey-Yi Guy char buf[8]; 23397bdc473c7a52497af9fe8c73e4745615a2825aaaWey-Yi Guy int buf_size; 234022de94de7de78b8de2fb1f2df5aa85b5556cfcfdStanislaw Gruszka int timeout; 23417bdc473c7a52497af9fe8c73e4745615a2825aaaWey-Yi Guy 23427bdc473c7a52497af9fe8c73e4745615a2825aaaWey-Yi Guy memset(buf, 0, sizeof(buf)); 23437bdc473c7a52497af9fe8c73e4745615a2825aaaWey-Yi Guy buf_size = min(count, sizeof(buf) - 1); 23447bdc473c7a52497af9fe8c73e4745615a2825aaaWey-Yi Guy if (copy_from_user(buf, user_buf, buf_size)) 23457bdc473c7a52497af9fe8c73e4745615a2825aaaWey-Yi Guy return -EFAULT; 234622de94de7de78b8de2fb1f2df5aa85b5556cfcfdStanislaw Gruszka if (sscanf(buf, "%d", &timeout) != 1) 23477bdc473c7a52497af9fe8c73e4745615a2825aaaWey-Yi Guy return -EINVAL; 234822de94de7de78b8de2fb1f2df5aa85b5556cfcfdStanislaw Gruszka if (timeout < 0 || timeout > IWL_MAX_WD_TIMEOUT) 234922de94de7de78b8de2fb1f2df5aa85b5556cfcfdStanislaw Gruszka timeout = IWL_DEF_WD_TIMEOUT; 23507bdc473c7a52497af9fe8c73e4745615a2825aaaWey-Yi Guy 235122de94de7de78b8de2fb1f2df5aa85b5556cfcfdStanislaw Gruszka priv->cfg->base_params->wd_timeout = timeout; 235222de94de7de78b8de2fb1f2df5aa85b5556cfcfdStanislaw Gruszka iwl_setup_watchdog(priv); 23537bdc473c7a52497af9fe8c73e4745615a2825aaaWey-Yi Guy return count; 23547bdc473c7a52497af9fe8c73e4745615a2825aaaWey-Yi Guy} 23557bdc473c7a52497af9fe8c73e4745615a2825aaaWey-Yi Guy 2356befe8c469baebe8a0fb5bd9b7cd4afd8c54ebbd5Wey-Yi Guystatic ssize_t iwl_dbgfs_bt_traffic_read(struct file *file, 2357befe8c469baebe8a0fb5bd9b7cd4afd8c54ebbd5Wey-Yi Guy char __user *user_buf, 2358befe8c469baebe8a0fb5bd9b7cd4afd8c54ebbd5Wey-Yi Guy size_t count, loff_t *ppos) { 2359befe8c469baebe8a0fb5bd9b7cd4afd8c54ebbd5Wey-Yi Guy 2360befe8c469baebe8a0fb5bd9b7cd4afd8c54ebbd5Wey-Yi Guy struct iwl_priv *priv = (struct iwl_priv *)file->private_data; 2361befe8c469baebe8a0fb5bd9b7cd4afd8c54ebbd5Wey-Yi Guy int pos = 0; 2362befe8c469baebe8a0fb5bd9b7cd4afd8c54ebbd5Wey-Yi Guy char buf[200]; 2363befe8c469baebe8a0fb5bd9b7cd4afd8c54ebbd5Wey-Yi Guy const size_t bufsz = sizeof(buf); 2364befe8c469baebe8a0fb5bd9b7cd4afd8c54ebbd5Wey-Yi Guy 2365f21dd005df95e0fc6a578342c61b5333ce2abc2bWey-Yi Guy if (!priv->bt_enable_flag) { 2366f21dd005df95e0fc6a578342c61b5333ce2abc2bWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "BT coex disabled\n"); 236708960dea6c736280a03cb947f445fdb94fdaa2eeJohannes Berg return simple_read_from_buffer(user_buf, count, ppos, buf, pos); 2368f21dd005df95e0fc6a578342c61b5333ce2abc2bWey-Yi Guy } 2369f21dd005df95e0fc6a578342c61b5333ce2abc2bWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "BT enable flag: 0x%x\n", 2370f21dd005df95e0fc6a578342c61b5333ce2abc2bWey-Yi Guy priv->bt_enable_flag); 2371befe8c469baebe8a0fb5bd9b7cd4afd8c54ebbd5Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "BT in %s mode\n", 2372befe8c469baebe8a0fb5bd9b7cd4afd8c54ebbd5Wey-Yi Guy priv->bt_full_concurrent ? "full concurrency" : "3-wire"); 2373befe8c469baebe8a0fb5bd9b7cd4afd8c54ebbd5Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "BT status: %s, " 2374befe8c469baebe8a0fb5bd9b7cd4afd8c54ebbd5Wey-Yi Guy "last traffic notif: %d\n", 237566e863a527f9ed3a871797862aaf0d62b0954813Wey-Yi Guy priv->bt_status ? "On" : "Off", priv->last_bt_traffic_load); 2376befe8c469baebe8a0fb5bd9b7cd4afd8c54ebbd5Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "ch_announcement: %d, " 2377187bc4f6b2f81e1c8f6b1e9d5dee3e8e9018ebbfWey-Yi Guy "kill_ack_mask: %x, kill_cts_mask: %x\n", 2378187bc4f6b2f81e1c8f6b1e9d5dee3e8e9018ebbfWey-Yi Guy priv->bt_ch_announce, priv->kill_ack_mask, 2379187bc4f6b2f81e1c8f6b1e9d5dee3e8e9018ebbfWey-Yi Guy priv->kill_cts_mask); 2380befe8c469baebe8a0fb5bd9b7cd4afd8c54ebbd5Wey-Yi Guy 2381befe8c469baebe8a0fb5bd9b7cd4afd8c54ebbd5Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "bluetooth traffic load: "); 2382befe8c469baebe8a0fb5bd9b7cd4afd8c54ebbd5Wey-Yi Guy switch (priv->bt_traffic_load) { 2383befe8c469baebe8a0fb5bd9b7cd4afd8c54ebbd5Wey-Yi Guy case IWL_BT_COEX_TRAFFIC_LOAD_CONTINUOUS: 2384befe8c469baebe8a0fb5bd9b7cd4afd8c54ebbd5Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "Continuous\n"); 2385befe8c469baebe8a0fb5bd9b7cd4afd8c54ebbd5Wey-Yi Guy break; 2386befe8c469baebe8a0fb5bd9b7cd4afd8c54ebbd5Wey-Yi Guy case IWL_BT_COEX_TRAFFIC_LOAD_HIGH: 2387befe8c469baebe8a0fb5bd9b7cd4afd8c54ebbd5Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "High\n"); 2388befe8c469baebe8a0fb5bd9b7cd4afd8c54ebbd5Wey-Yi Guy break; 2389befe8c469baebe8a0fb5bd9b7cd4afd8c54ebbd5Wey-Yi Guy case IWL_BT_COEX_TRAFFIC_LOAD_LOW: 2390befe8c469baebe8a0fb5bd9b7cd4afd8c54ebbd5Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "Low\n"); 2391befe8c469baebe8a0fb5bd9b7cd4afd8c54ebbd5Wey-Yi Guy break; 2392befe8c469baebe8a0fb5bd9b7cd4afd8c54ebbd5Wey-Yi Guy case IWL_BT_COEX_TRAFFIC_LOAD_NONE: 2393befe8c469baebe8a0fb5bd9b7cd4afd8c54ebbd5Wey-Yi Guy default: 2394befe8c469baebe8a0fb5bd9b7cd4afd8c54ebbd5Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "None\n"); 2395befe8c469baebe8a0fb5bd9b7cd4afd8c54ebbd5Wey-Yi Guy break; 2396befe8c469baebe8a0fb5bd9b7cd4afd8c54ebbd5Wey-Yi Guy } 2397befe8c469baebe8a0fb5bd9b7cd4afd8c54ebbd5Wey-Yi Guy 239808960dea6c736280a03cb947f445fdb94fdaa2eeJohannes Berg return simple_read_from_buffer(user_buf, count, ppos, buf, pos); 2399befe8c469baebe8a0fb5bd9b7cd4afd8c54ebbd5Wey-Yi Guy} 2400befe8c469baebe8a0fb5bd9b7cd4afd8c54ebbd5Wey-Yi Guy 2401c6abdc0dc3440b9b6ae00a59c3560ab2160c7c7dWey-Yi Guystatic ssize_t iwl_dbgfs_protection_mode_read(struct file *file, 2402c6abdc0dc3440b9b6ae00a59c3560ab2160c7c7dWey-Yi Guy char __user *user_buf, 2403c6abdc0dc3440b9b6ae00a59c3560ab2160c7c7dWey-Yi Guy size_t count, loff_t *ppos) 2404c6abdc0dc3440b9b6ae00a59c3560ab2160c7c7dWey-Yi Guy{ 2405c6abdc0dc3440b9b6ae00a59c3560ab2160c7c7dWey-Yi Guy struct iwl_priv *priv = (struct iwl_priv *)file->private_data; 2406c6abdc0dc3440b9b6ae00a59c3560ab2160c7c7dWey-Yi Guy 2407c6abdc0dc3440b9b6ae00a59c3560ab2160c7c7dWey-Yi Guy int pos = 0; 2408c6abdc0dc3440b9b6ae00a59c3560ab2160c7c7dWey-Yi Guy char buf[40]; 2409c6abdc0dc3440b9b6ae00a59c3560ab2160c7c7dWey-Yi Guy const size_t bufsz = sizeof(buf); 2410c6abdc0dc3440b9b6ae00a59c3560ab2160c7c7dWey-Yi Guy 24117cb1b0887fcc61918e3d64827fbef968bb67a57aWey-Yi Guy if (priv->cfg->ht_params) 24127cb1b0887fcc61918e3d64827fbef968bb67a57aWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 24137cb1b0887fcc61918e3d64827fbef968bb67a57aWey-Yi Guy "use %s for aggregation\n", 24147cb1b0887fcc61918e3d64827fbef968bb67a57aWey-Yi Guy (priv->cfg->ht_params->use_rts_for_aggregation) ? 24157cb1b0887fcc61918e3d64827fbef968bb67a57aWey-Yi Guy "rts/cts" : "cts-to-self"); 24167cb1b0887fcc61918e3d64827fbef968bb67a57aWey-Yi Guy else 24177cb1b0887fcc61918e3d64827fbef968bb67a57aWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "N/A"); 24187cb1b0887fcc61918e3d64827fbef968bb67a57aWey-Yi Guy 2419c6abdc0dc3440b9b6ae00a59c3560ab2160c7c7dWey-Yi Guy return simple_read_from_buffer(user_buf, count, ppos, buf, pos); 2420c6abdc0dc3440b9b6ae00a59c3560ab2160c7c7dWey-Yi Guy} 2421c6abdc0dc3440b9b6ae00a59c3560ab2160c7c7dWey-Yi Guy 2422c6abdc0dc3440b9b6ae00a59c3560ab2160c7c7dWey-Yi Guystatic ssize_t iwl_dbgfs_protection_mode_write(struct file *file, 2423c6abdc0dc3440b9b6ae00a59c3560ab2160c7c7dWey-Yi Guy const char __user *user_buf, 2424c6abdc0dc3440b9b6ae00a59c3560ab2160c7c7dWey-Yi Guy size_t count, loff_t *ppos) { 2425c6abdc0dc3440b9b6ae00a59c3560ab2160c7c7dWey-Yi Guy 2426c6abdc0dc3440b9b6ae00a59c3560ab2160c7c7dWey-Yi Guy struct iwl_priv *priv = file->private_data; 2427c6abdc0dc3440b9b6ae00a59c3560ab2160c7c7dWey-Yi Guy char buf[8]; 2428c6abdc0dc3440b9b6ae00a59c3560ab2160c7c7dWey-Yi Guy int buf_size; 2429c6abdc0dc3440b9b6ae00a59c3560ab2160c7c7dWey-Yi Guy int rts; 2430c6abdc0dc3440b9b6ae00a59c3560ab2160c7c7dWey-Yi Guy 24317cb1b0887fcc61918e3d64827fbef968bb67a57aWey-Yi Guy if (!priv->cfg->ht_params) 24327cb1b0887fcc61918e3d64827fbef968bb67a57aWey-Yi Guy return -EINVAL; 24337cb1b0887fcc61918e3d64827fbef968bb67a57aWey-Yi Guy 2434c6abdc0dc3440b9b6ae00a59c3560ab2160c7c7dWey-Yi Guy memset(buf, 0, sizeof(buf)); 2435c6abdc0dc3440b9b6ae00a59c3560ab2160c7c7dWey-Yi Guy buf_size = min(count, sizeof(buf) - 1); 2436c6abdc0dc3440b9b6ae00a59c3560ab2160c7c7dWey-Yi Guy if (copy_from_user(buf, user_buf, buf_size)) 2437c6abdc0dc3440b9b6ae00a59c3560ab2160c7c7dWey-Yi Guy return -EFAULT; 2438c6abdc0dc3440b9b6ae00a59c3560ab2160c7c7dWey-Yi Guy if (sscanf(buf, "%d", &rts) != 1) 2439c6abdc0dc3440b9b6ae00a59c3560ab2160c7c7dWey-Yi Guy return -EINVAL; 2440c6abdc0dc3440b9b6ae00a59c3560ab2160c7c7dWey-Yi Guy if (rts) 24417cb1b0887fcc61918e3d64827fbef968bb67a57aWey-Yi Guy priv->cfg->ht_params->use_rts_for_aggregation = true; 2442c6abdc0dc3440b9b6ae00a59c3560ab2160c7c7dWey-Yi Guy else 24437cb1b0887fcc61918e3d64827fbef968bb67a57aWey-Yi Guy priv->cfg->ht_params->use_rts_for_aggregation = false; 2444c6abdc0dc3440b9b6ae00a59c3560ab2160c7c7dWey-Yi Guy return count; 2445c6abdc0dc3440b9b6ae00a59c3560ab2160c7c7dWey-Yi Guy} 2446c6abdc0dc3440b9b6ae00a59c3560ab2160c7c7dWey-Yi Guy 24477e4005cc4ae49100582ee1c97368dd79474f0a82Wey-Yi Guystatic ssize_t iwl_dbgfs_echo_test_write(struct file *file, 24487e4005cc4ae49100582ee1c97368dd79474f0a82Wey-Yi Guy const char __user *user_buf, 24497e4005cc4ae49100582ee1c97368dd79474f0a82Wey-Yi Guy size_t count, loff_t *ppos) 24507e4005cc4ae49100582ee1c97368dd79474f0a82Wey-Yi Guy{ 24517e4005cc4ae49100582ee1c97368dd79474f0a82Wey-Yi Guy struct iwl_priv *priv = file->private_data; 24527e4005cc4ae49100582ee1c97368dd79474f0a82Wey-Yi Guy char buf[8]; 24537e4005cc4ae49100582ee1c97368dd79474f0a82Wey-Yi Guy int buf_size; 24547e4005cc4ae49100582ee1c97368dd79474f0a82Wey-Yi Guy 24557e4005cc4ae49100582ee1c97368dd79474f0a82Wey-Yi Guy memset(buf, 0, sizeof(buf)); 24567e4005cc4ae49100582ee1c97368dd79474f0a82Wey-Yi Guy buf_size = min(count, sizeof(buf) - 1); 24577e4005cc4ae49100582ee1c97368dd79474f0a82Wey-Yi Guy if (copy_from_user(buf, user_buf, buf_size)) 24587e4005cc4ae49100582ee1c97368dd79474f0a82Wey-Yi Guy return -EFAULT; 24597e4005cc4ae49100582ee1c97368dd79474f0a82Wey-Yi Guy 24607e4005cc4ae49100582ee1c97368dd79474f0a82Wey-Yi Guy iwl_cmd_echo_test(priv); 24617e4005cc4ae49100582ee1c97368dd79474f0a82Wey-Yi Guy return count; 24627e4005cc4ae49100582ee1c97368dd79474f0a82Wey-Yi Guy} 24637e4005cc4ae49100582ee1c97368dd79474f0a82Wey-Yi Guy 24647163b8a4ec995dabda3e92c6fed7b8600060618cWey-Yi GuyDEBUGFS_READ_FILE_OPS(rx_statistics); 24657163b8a4ec995dabda3e92c6fed7b8600060618cWey-Yi GuyDEBUGFS_READ_FILE_OPS(tx_statistics); 246641f5e0475c7c04b17b207736146187636b04eb4cEmmanuel GrumbachDEBUGFS_READ_WRITE_FILE_OPS(traffic_log); 2467e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi GuyDEBUGFS_READ_FILE_OPS(ucode_rx_stats); 2468e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi GuyDEBUGFS_READ_FILE_OPS(ucode_tx_stats); 2469e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi GuyDEBUGFS_READ_FILE_OPS(ucode_general_stats); 24705225935b53ce1eafb222c644230d03ad6011d357Wey-Yi GuyDEBUGFS_READ_FILE_OPS(sensitivity); 24715225935b53ce1eafb222c644230d03ad6011d357Wey-Yi GuyDEBUGFS_READ_FILE_OPS(chain_noise); 2472c09430abed4159e5c56aaea257d040f7452daba6Wey-Yi GuyDEBUGFS_READ_FILE_OPS(power_save_status); 24737163b8a4ec995dabda3e92c6fed7b8600060618cWey-Yi GuyDEBUGFS_WRITE_FILE_OPS(clear_ucode_statistics); 24747163b8a4ec995dabda3e92c6fed7b8600060618cWey-Yi GuyDEBUGFS_WRITE_FILE_OPS(clear_traffic_statistics); 2475a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi GuyDEBUGFS_READ_WRITE_FILE_OPS(ucode_tracing); 2476a13d276f1e49ae0bc4ad18ce8ea3c90656c9e8d4Wey-Yi GuyDEBUGFS_READ_WRITE_FILE_OPS(missed_beacon); 24773e4fb5faefb57824f2e42305b3d5907845af978cTrieu 'Andrew' NguyenDEBUGFS_READ_WRITE_FILE_OPS(plcp_delta); 2478528c3126a98e75f47fc9fa11b243c82a59271d0dWey-Yi GuyDEBUGFS_READ_WRITE_FILE_OPS(force_reset); 247960987206cba0dbb547bce2d23c3a3338c5aaf5acJohannes BergDEBUGFS_READ_FILE_OPS(rxon_flags); 248060987206cba0dbb547bce2d23c3a3338c5aaf5acJohannes BergDEBUGFS_READ_FILE_OPS(rxon_filter_flags); 24814bf49a90bc0bda131ef353cca631025849f36b4eWey-Yi GuyDEBUGFS_WRITE_FILE_OPS(txfifo_flush); 2482ffb7d896b3bc21e09d77fed45b52b2ff4ce213e5Wey-Yi GuyDEBUGFS_READ_FILE_OPS(ucode_bt_stats); 248322de94de7de78b8de2fb1f2df5aa85b5556cfcfdStanislaw GruszkaDEBUGFS_WRITE_FILE_OPS(wd_timeout); 2484befe8c469baebe8a0fb5bd9b7cd4afd8c54ebbd5Wey-Yi GuyDEBUGFS_READ_FILE_OPS(bt_traffic); 2485c6abdc0dc3440b9b6ae00a59c3560ab2160c7c7dWey-Yi GuyDEBUGFS_READ_WRITE_FILE_OPS(protection_mode); 248654a9aa65f749673f851ef86481940394185c1b0eWey-Yi GuyDEBUGFS_READ_FILE_OPS(reply_tx_error); 24877e4005cc4ae49100582ee1c97368dd79474f0a82Wey-Yi GuyDEBUGFS_WRITE_FILE_OPS(echo_test); 248820594eb0daa67f7a0cc19d74a1bafceb1bb09f4aWey-Yi Guy 2489ca934b6715c134573da5acea01e9258eb0bf7c27Johannes Berg#ifdef CONFIG_IWLWIFI_DEBUG 2490ca934b6715c134573da5acea01e9258eb0bf7c27Johannes Bergstatic ssize_t iwl_dbgfs_debug_level_read(struct file *file, 2491ca934b6715c134573da5acea01e9258eb0bf7c27Johannes Berg char __user *user_buf, 2492ca934b6715c134573da5acea01e9258eb0bf7c27Johannes Berg size_t count, loff_t *ppos) 2493ca934b6715c134573da5acea01e9258eb0bf7c27Johannes Berg{ 2494ca934b6715c134573da5acea01e9258eb0bf7c27Johannes Berg struct iwl_priv *priv = file->private_data; 2495ca934b6715c134573da5acea01e9258eb0bf7c27Johannes Berg struct iwl_shared *shrd = priv->shrd; 2496ca934b6715c134573da5acea01e9258eb0bf7c27Johannes Berg char buf[11]; 2497ca934b6715c134573da5acea01e9258eb0bf7c27Johannes Berg int len; 2498ca934b6715c134573da5acea01e9258eb0bf7c27Johannes Berg 2499ca934b6715c134573da5acea01e9258eb0bf7c27Johannes Berg len = scnprintf(buf, sizeof(buf), "0x%.8x", 2500ca934b6715c134573da5acea01e9258eb0bf7c27Johannes Berg iwl_get_debug_level(shrd)); 2501ca934b6715c134573da5acea01e9258eb0bf7c27Johannes Berg 2502ca934b6715c134573da5acea01e9258eb0bf7c27Johannes Berg return simple_read_from_buffer(user_buf, count, ppos, buf, len); 2503ca934b6715c134573da5acea01e9258eb0bf7c27Johannes Berg} 2504ca934b6715c134573da5acea01e9258eb0bf7c27Johannes Berg 2505ca934b6715c134573da5acea01e9258eb0bf7c27Johannes Bergstatic ssize_t iwl_dbgfs_debug_level_write(struct file *file, 2506ca934b6715c134573da5acea01e9258eb0bf7c27Johannes Berg const char __user *user_buf, 2507ca934b6715c134573da5acea01e9258eb0bf7c27Johannes Berg size_t count, loff_t *ppos) 2508ca934b6715c134573da5acea01e9258eb0bf7c27Johannes Berg{ 2509ca934b6715c134573da5acea01e9258eb0bf7c27Johannes Berg struct iwl_priv *priv = file->private_data; 2510ca934b6715c134573da5acea01e9258eb0bf7c27Johannes Berg struct iwl_shared *shrd = priv->shrd; 2511ca934b6715c134573da5acea01e9258eb0bf7c27Johannes Berg char buf[11]; 2512ca934b6715c134573da5acea01e9258eb0bf7c27Johannes Berg unsigned long val; 2513ca934b6715c134573da5acea01e9258eb0bf7c27Johannes Berg int ret; 2514ca934b6715c134573da5acea01e9258eb0bf7c27Johannes Berg 2515ca934b6715c134573da5acea01e9258eb0bf7c27Johannes Berg if (count > sizeof(buf)) 2516ca934b6715c134573da5acea01e9258eb0bf7c27Johannes Berg return -EINVAL; 2517ca934b6715c134573da5acea01e9258eb0bf7c27Johannes Berg 2518ca934b6715c134573da5acea01e9258eb0bf7c27Johannes Berg memset(buf, 0, sizeof(buf)); 2519ca934b6715c134573da5acea01e9258eb0bf7c27Johannes Berg if (copy_from_user(buf, user_buf, count)) 2520ca934b6715c134573da5acea01e9258eb0bf7c27Johannes Berg return -EFAULT; 2521ca934b6715c134573da5acea01e9258eb0bf7c27Johannes Berg 2522ca934b6715c134573da5acea01e9258eb0bf7c27Johannes Berg ret = strict_strtoul(buf, 0, &val); 2523ca934b6715c134573da5acea01e9258eb0bf7c27Johannes Berg if (ret) 2524ca934b6715c134573da5acea01e9258eb0bf7c27Johannes Berg return ret; 2525ca934b6715c134573da5acea01e9258eb0bf7c27Johannes Berg 2526ca934b6715c134573da5acea01e9258eb0bf7c27Johannes Berg shrd->dbg_level_dev = val; 2527ca934b6715c134573da5acea01e9258eb0bf7c27Johannes Berg if (iwl_alloc_traffic_mem(priv)) 2528ca934b6715c134573da5acea01e9258eb0bf7c27Johannes Berg IWL_ERR(priv, "Not enough memory to generate traffic log\n"); 2529ca934b6715c134573da5acea01e9258eb0bf7c27Johannes Berg 2530ca934b6715c134573da5acea01e9258eb0bf7c27Johannes Berg return count; 2531ca934b6715c134573da5acea01e9258eb0bf7c27Johannes Berg} 2532ca934b6715c134573da5acea01e9258eb0bf7c27Johannes BergDEBUGFS_READ_WRITE_FILE_OPS(debug_level); 2533ca934b6715c134573da5acea01e9258eb0bf7c27Johannes Berg#endif /* CONFIG_IWLWIFI_DEBUG */ 2534ca934b6715c134573da5acea01e9258eb0bf7c27Johannes Berg 2535712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler/* 2536712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler * Create the debugfs files and directories 2537712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler * 2538712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler */ 2539712b6cf57a53da608a682b5f782c5785bda76001Tomas Winklerint iwl_dbgfs_register(struct iwl_priv *priv, const char *name) 2540712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler{ 254195b1a8224abf6230899856753c5506a3f737a65bZhu Yi struct dentry *phyd = priv->hw->wiphy->debugfsdir; 25424c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg struct dentry *dir_drv, *dir_data, *dir_rf, *dir_debug; 2543712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 25444c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg dir_drv = debugfs_create_dir(name, phyd); 25454c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg if (!dir_drv) 25464c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg return -ENOMEM; 2547712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 25484c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg priv->debugfs_dir = dir_drv; 25494c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg 25504c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg dir_data = debugfs_create_dir("data", dir_drv); 25514c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg if (!dir_data) 25524c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg goto err; 25534c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg dir_rf = debugfs_create_dir("rf", dir_drv); 25544c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg if (!dir_rf) 25554c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg goto err; 25564c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg dir_debug = debugfs_create_dir("debug", dir_drv); 25574c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg if (!dir_debug) 2558712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler goto err; 2559712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 25604c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg DEBUGFS_ADD_FILE(nvm, dir_data, S_IRUSR); 25614c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg DEBUGFS_ADD_FILE(sram, dir_data, S_IWUSR | S_IRUSR); 2562c8ac61cf6e53fefb3b439fc58390fb65d2730e63Johannes Berg DEBUGFS_ADD_FILE(wowlan_sram, dir_data, S_IRUSR); 25634c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg DEBUGFS_ADD_FILE(stations, dir_data, S_IRUSR); 25644c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg DEBUGFS_ADD_FILE(channels, dir_data, S_IRUSR); 25654c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg DEBUGFS_ADD_FILE(status, dir_data, S_IRUSR); 25661f7b6172db86e9ab2b4cd794441bb2c40ab287fcEmmanuel Grumbach DEBUGFS_ADD_FILE(rx_handlers, dir_data, S_IWUSR | S_IRUSR); 25674c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg DEBUGFS_ADD_FILE(qos, dir_data, S_IRUSR); 256823c0fcc66b4345ea97ae588c2e01f10c994652baWey-Yi Guy DEBUGFS_ADD_FILE(sleep_level_override, dir_data, S_IWUSR | S_IRUSR); 256923c0fcc66b4345ea97ae588c2e01f10c994652baWey-Yi Guy DEBUGFS_ADD_FILE(current_sleep_command, dir_data, S_IRUSR); 25704c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg DEBUGFS_ADD_FILE(thermal_throttling, dir_data, S_IRUSR); 25714c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg DEBUGFS_ADD_FILE(disable_ht40, dir_data, S_IWUSR | S_IRUSR); 2572511afa3bfbb421ff0e87086725367f762587ab87Emmanuel Grumbach DEBUGFS_ADD_FILE(temperature, dir_data, S_IRUSR); 2573ca934b6715c134573da5acea01e9258eb0bf7c27Johannes Berg 25744c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg DEBUGFS_ADD_FILE(rx_statistics, dir_debug, S_IRUSR); 25754c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg DEBUGFS_ADD_FILE(tx_statistics, dir_debug, S_IRUSR); 257641f5e0475c7c04b17b207736146187636b04eb4cEmmanuel Grumbach DEBUGFS_ADD_FILE(traffic_log, dir_debug, S_IWUSR | S_IRUSR); 25774c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg DEBUGFS_ADD_FILE(power_save_status, dir_debug, S_IRUSR); 25784c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg DEBUGFS_ADD_FILE(clear_ucode_statistics, dir_debug, S_IWUSR); 25794c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg DEBUGFS_ADD_FILE(clear_traffic_statistics, dir_debug, S_IWUSR); 25804c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg DEBUGFS_ADD_FILE(missed_beacon, dir_debug, S_IWUSR); 25814c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg DEBUGFS_ADD_FILE(plcp_delta, dir_debug, S_IWUSR | S_IRUSR); 2582528c3126a98e75f47fc9fa11b243c82a59271d0dWey-Yi Guy DEBUGFS_ADD_FILE(force_reset, dir_debug, S_IWUSR | S_IRUSR); 2583b8c76267cfb9a025afdd122bc2a8942dbf493dd1Abhijeet Kolekar DEBUGFS_ADD_FILE(ucode_rx_stats, dir_debug, S_IRUSR); 2584b8c76267cfb9a025afdd122bc2a8942dbf493dd1Abhijeet Kolekar DEBUGFS_ADD_FILE(ucode_tx_stats, dir_debug, S_IRUSR); 2585b8c76267cfb9a025afdd122bc2a8942dbf493dd1Abhijeet Kolekar DEBUGFS_ADD_FILE(ucode_general_stats, dir_debug, S_IRUSR); 2586c68744fb935400964f7af4835017cad5014c8c88Wey-Yi Guy DEBUGFS_ADD_FILE(txfifo_flush, dir_debug, S_IWUSR); 2587c6abdc0dc3440b9b6ae00a59c3560ab2160c7c7dWey-Yi Guy DEBUGFS_ADD_FILE(protection_mode, dir_debug, S_IWUSR | S_IRUSR); 2588703bc583cb98a24eeedd297ee59dfa12852897d1Wey-Yi Guy DEBUGFS_ADD_FILE(sensitivity, dir_debug, S_IRUSR); 2589703bc583cb98a24eeedd297ee59dfa12852897d1Wey-Yi Guy DEBUGFS_ADD_FILE(chain_noise, dir_debug, S_IRUSR); 2590b7af6a99690503a48c63ce5e587b4e4555f31cdbWey-Yi Guy DEBUGFS_ADD_FILE(ucode_tracing, dir_debug, S_IWUSR | S_IRUSR); 25910da0e5bf1522d75d446f5124e17016628d0a149eJohannes Berg DEBUGFS_ADD_FILE(ucode_bt_stats, dir_debug, S_IRUSR); 259254a9aa65f749673f851ef86481940394185c1b0eWey-Yi Guy DEBUGFS_ADD_FILE(reply_tx_error, dir_debug, S_IRUSR); 259360987206cba0dbb547bce2d23c3a3338c5aaf5acJohannes Berg DEBUGFS_ADD_FILE(rxon_flags, dir_debug, S_IWUSR); 259460987206cba0dbb547bce2d23c3a3338c5aaf5acJohannes Berg DEBUGFS_ADD_FILE(rxon_filter_flags, dir_debug, S_IWUSR); 259522de94de7de78b8de2fb1f2df5aa85b5556cfcfdStanislaw Gruszka DEBUGFS_ADD_FILE(wd_timeout, dir_debug, S_IWUSR); 25967e4005cc4ae49100582ee1c97368dd79474f0a82Wey-Yi Guy DEBUGFS_ADD_FILE(echo_test, dir_debug, S_IWUSR); 259788e58fc5d940c3463c7070a2a7a8a0ce65af3fdcStanislaw Gruszka if (iwl_advanced_bt_coexist(priv)) 2598befe8c469baebe8a0fb5bd9b7cd4afd8c54ebbd5Wey-Yi Guy DEBUGFS_ADD_FILE(bt_traffic, dir_debug, S_IRUSR); 2599ca934b6715c134573da5acea01e9258eb0bf7c27Johannes Berg#ifdef CONFIG_IWLWIFI_DEBUG 2600ca934b6715c134573da5acea01e9258eb0bf7c27Johannes Berg DEBUGFS_ADD_FILE(debug_level, dir_debug, S_IRUSR | S_IWUSR); 2601ca934b6715c134573da5acea01e9258eb0bf7c27Johannes Berg#endif 2602ca934b6715c134573da5acea01e9258eb0bf7c27Johannes Berg 2603703bc583cb98a24eeedd297ee59dfa12852897d1Wey-Yi Guy DEBUGFS_ADD_BOOL(disable_sensitivity, dir_rf, 2604703bc583cb98a24eeedd297ee59dfa12852897d1Wey-Yi Guy &priv->disable_sens_cal); 2605703bc583cb98a24eeedd297ee59dfa12852897d1Wey-Yi Guy DEBUGFS_ADD_BOOL(disable_chain_noise, dir_rf, 2606703bc583cb98a24eeedd297ee59dfa12852897d1Wey-Yi Guy &priv->disable_chain_noise_cal); 260787e5666c0722d5f4cad3560ab5c180c8bba62b8bEmmanuel Grumbach 260887e5666c0722d5f4cad3560ab5c180c8bba62b8bEmmanuel Grumbach if (iwl_trans_dbgfs_register(trans(priv), dir_debug)) 260987e5666c0722d5f4cad3560ab5c180c8bba62b8bEmmanuel Grumbach goto err; 2610712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler return 0; 2611712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 2612712b6cf57a53da608a682b5f782c5785bda76001Tomas Winklererr: 26134c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg IWL_ERR(priv, "Can't create the debugfs directory\n"); 2614712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler iwl_dbgfs_unregister(priv); 26154c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg return -ENOMEM; 2616712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler} 2617712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 2618712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler/** 2619712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler * Remove the debugfs files and directories 2620712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler * 2621712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler */ 2622712b6cf57a53da608a682b5f782c5785bda76001Tomas Winklervoid iwl_dbgfs_unregister(struct iwl_priv *priv) 2623712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler{ 26244c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg if (!priv->debugfs_dir) 2625712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler return; 2626712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 26274c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg debugfs_remove_recursive(priv->debugfs_dir); 26284c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg priv->debugfs_dir = NULL; 2629712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler} 2630