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) { 2373d6acefc0a24bf90746c1f259e9d65d1ed7ea5e2Don Fry struct iwl_trans *trans = trans(priv); 2384c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg priv->dbgfs_sram_offset = 0x800000; 2393d6acefc0a24bf90746c1f259e9d65d1ed7ea5e2Don Fry if (trans->shrd->ucode_type == IWL_UCODE_INIT) 2403d6acefc0a24bf90746c1f259e9d65d1ed7ea5e2Don Fry priv->dbgfs_sram_len = trans->ucode_init.data.len; 2415ade1e4dd1df436c3a441d17321c24aac8497306Wey-Yi Guy else 2423d6acefc0a24bf90746c1f259e9d65d1ed7ea5e2Don Fry priv->dbgfs_sram_len = trans->ucode_rt.data.len; 2435ade1e4dd1df436c3a441d17321c24aac8497306Wey-Yi Guy } 24424834d2c8455a6eeee82e007d41d7e05986d134fJay Sternberg len = priv->dbgfs_sram_len; 24524834d2c8455a6eeee82e007d41d7e05986d134fJay Sternberg 24624834d2c8455a6eeee82e007d41d7e05986d134fJay Sternberg if (len == -4) { 24724834d2c8455a6eeee82e007d41d7e05986d134fJay Sternberg device_format = true; 24824834d2c8455a6eeee82e007d41d7e05986d134fJay Sternberg len = 4; 24924834d2c8455a6eeee82e007d41d7e05986d134fJay Sternberg } 25024834d2c8455a6eeee82e007d41d7e05986d134fJay Sternberg 25124834d2c8455a6eeee82e007d41d7e05986d134fJay Sternberg bufsz = 50 + len * 4; 2522943f136ffe29adb08162197b129bf8106e8191cWey-Yi Guy buf = kmalloc(bufsz, GFP_KERNEL); 2532943f136ffe29adb08162197b129bf8106e8191cWey-Yi Guy if (!buf) 2542943f136ffe29adb08162197b129bf8106e8191cWey-Yi Guy return -ENOMEM; 25524834d2c8455a6eeee82e007d41d7e05986d134fJay Sternberg 2565ade1e4dd1df436c3a441d17321c24aac8497306Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "sram_len: 0x%x\n", 25724834d2c8455a6eeee82e007d41d7e05986d134fJay Sternberg len); 2585ade1e4dd1df436c3a441d17321c24aac8497306Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "sram_offset: 0x%x\n", 2594c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg priv->dbgfs_sram_offset); 26024834d2c8455a6eeee82e007d41d7e05986d134fJay Sternberg 26124834d2c8455a6eeee82e007d41d7e05986d134fJay Sternberg /* adjust sram address since reads are only on even u32 boundaries */ 26224834d2c8455a6eeee82e007d41d7e05986d134fJay Sternberg offset = priv->dbgfs_sram_offset & 0x3; 26324834d2c8455a6eeee82e007d41d7e05986d134fJay Sternberg sram = priv->dbgfs_sram_offset & ~0x3; 26424834d2c8455a6eeee82e007d41d7e05986d134fJay Sternberg 26524834d2c8455a6eeee82e007d41d7e05986d134fJay Sternberg /* read the first u32 from sram */ 26683ed90155f98bd949735c2cc22d832b557a6d7d1Emmanuel Grumbach val = iwl_read_targ_mem(bus(priv), sram); 26724834d2c8455a6eeee82e007d41d7e05986d134fJay Sternberg 26824834d2c8455a6eeee82e007d41d7e05986d134fJay Sternberg for (; len; len--) { 26924834d2c8455a6eeee82e007d41d7e05986d134fJay Sternberg /* put the address at the start of every line */ 27024834d2c8455a6eeee82e007d41d7e05986d134fJay Sternberg if (i == 0) 27124834d2c8455a6eeee82e007d41d7e05986d134fJay Sternberg pos += scnprintf(buf + pos, bufsz - pos, 27224834d2c8455a6eeee82e007d41d7e05986d134fJay Sternberg "%08X: ", sram + offset); 27324834d2c8455a6eeee82e007d41d7e05986d134fJay Sternberg 27424834d2c8455a6eeee82e007d41d7e05986d134fJay Sternberg if (device_format) 27524834d2c8455a6eeee82e007d41d7e05986d134fJay Sternberg pos += scnprintf(buf + pos, bufsz - pos, 27624834d2c8455a6eeee82e007d41d7e05986d134fJay Sternberg "%02x", (val >> (8 * (3 - offset))) & 0xff); 27724834d2c8455a6eeee82e007d41d7e05986d134fJay Sternberg else 27824834d2c8455a6eeee82e007d41d7e05986d134fJay Sternberg pos += scnprintf(buf + pos, bufsz - pos, 27924834d2c8455a6eeee82e007d41d7e05986d134fJay Sternberg "%02x ", (val >> (8 * offset)) & 0xff); 28024834d2c8455a6eeee82e007d41d7e05986d134fJay Sternberg 28124834d2c8455a6eeee82e007d41d7e05986d134fJay Sternberg /* if all bytes processed, read the next u32 from sram */ 28224834d2c8455a6eeee82e007d41d7e05986d134fJay Sternberg if (++offset == 4) { 28324834d2c8455a6eeee82e007d41d7e05986d134fJay Sternberg sram += 4; 28424834d2c8455a6eeee82e007d41d7e05986d134fJay Sternberg offset = 0; 28583ed90155f98bd949735c2cc22d832b557a6d7d1Emmanuel Grumbach val = iwl_read_targ_mem(bus(priv), sram); 286712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler } 28724834d2c8455a6eeee82e007d41d7e05986d134fJay Sternberg 28824834d2c8455a6eeee82e007d41d7e05986d134fJay Sternberg /* put in extra spaces and split lines for human readability */ 28924834d2c8455a6eeee82e007d41d7e05986d134fJay Sternberg if (++i == 16) { 29024834d2c8455a6eeee82e007d41d7e05986d134fJay Sternberg i = 0; 2912943f136ffe29adb08162197b129bf8106e8191cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "\n"); 29224834d2c8455a6eeee82e007d41d7e05986d134fJay Sternberg } else if (!(i & 7)) { 29324834d2c8455a6eeee82e007d41d7e05986d134fJay Sternberg pos += scnprintf(buf + pos, bufsz - pos, " "); 29424834d2c8455a6eeee82e007d41d7e05986d134fJay Sternberg } else if (!(i & 3)) { 29524834d2c8455a6eeee82e007d41d7e05986d134fJay Sternberg pos += scnprintf(buf + pos, bufsz - pos, " "); 29624834d2c8455a6eeee82e007d41d7e05986d134fJay Sternberg } 297712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler } 29824834d2c8455a6eeee82e007d41d7e05986d134fJay Sternberg if (i) 29924834d2c8455a6eeee82e007d41d7e05986d134fJay Sternberg pos += scnprintf(buf + pos, bufsz - pos, "\n"); 300712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 301712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler ret = simple_read_from_buffer(user_buf, count, ppos, buf, pos); 3022943f136ffe29adb08162197b129bf8106e8191cWey-Yi Guy kfree(buf); 303712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler return ret; 304712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler} 305712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 306712b6cf57a53da608a682b5f782c5785bda76001Tomas Winklerstatic ssize_t iwl_dbgfs_sram_write(struct file *file, 307712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler const char __user *user_buf, 308712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler size_t count, loff_t *ppos) 309712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler{ 310712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler struct iwl_priv *priv = file->private_data; 311712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler char buf[64]; 312712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler int buf_size; 313712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler u32 offset, len; 314712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 315712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler memset(buf, 0, sizeof(buf)); 316712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler buf_size = min(count, sizeof(buf) - 1); 317712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler if (copy_from_user(buf, user_buf, buf_size)) 318712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler return -EFAULT; 319712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 320712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler if (sscanf(buf, "%x,%x", &offset, &len) == 2) { 3214c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg priv->dbgfs_sram_offset = offset; 3224c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg priv->dbgfs_sram_len = len; 32324834d2c8455a6eeee82e007d41d7e05986d134fJay Sternberg } else if (sscanf(buf, "%x", &offset) == 1) { 32424834d2c8455a6eeee82e007d41d7e05986d134fJay Sternberg priv->dbgfs_sram_offset = offset; 32524834d2c8455a6eeee82e007d41d7e05986d134fJay Sternberg priv->dbgfs_sram_len = -4; 326712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler } else { 3274c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg priv->dbgfs_sram_offset = 0; 3284c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg priv->dbgfs_sram_len = 0; 329712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler } 330712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 331712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler return count; 332712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler} 333712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 334c8ac61cf6e53fefb3b439fc58390fb65d2730e63Johannes Bergstatic ssize_t iwl_dbgfs_wowlan_sram_read(struct file *file, 335c8ac61cf6e53fefb3b439fc58390fb65d2730e63Johannes Berg char __user *user_buf, 336c8ac61cf6e53fefb3b439fc58390fb65d2730e63Johannes Berg size_t count, loff_t *ppos) 337c8ac61cf6e53fefb3b439fc58390fb65d2730e63Johannes Berg{ 338c8ac61cf6e53fefb3b439fc58390fb65d2730e63Johannes Berg struct iwl_priv *priv = file->private_data; 339c8ac61cf6e53fefb3b439fc58390fb65d2730e63Johannes Berg 340c8ac61cf6e53fefb3b439fc58390fb65d2730e63Johannes Berg if (!priv->wowlan_sram) 341c8ac61cf6e53fefb3b439fc58390fb65d2730e63Johannes Berg return -ENODATA; 342c8ac61cf6e53fefb3b439fc58390fb65d2730e63Johannes Berg 343c8ac61cf6e53fefb3b439fc58390fb65d2730e63Johannes Berg return simple_read_from_buffer(user_buf, count, ppos, 344c8ac61cf6e53fefb3b439fc58390fb65d2730e63Johannes Berg priv->wowlan_sram, 345de7f5f92dbda0652dcb850fd02762e628556f645Don Fry trans(priv)->ucode_wowlan.data.len); 346c8ac61cf6e53fefb3b439fc58390fb65d2730e63Johannes Berg} 347712b6cf57a53da608a682b5f782c5785bda76001Tomas Winklerstatic ssize_t iwl_dbgfs_stations_read(struct file *file, char __user *user_buf, 348712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler size_t count, loff_t *ppos) 349712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler{ 35028f63a4bb744ea81030219aba2337fddb10b380bH Hartley Sweeten struct iwl_priv *priv = file->private_data; 3516def9761f72501e638e79eebcd70afea12a3a93dTomas Winkler struct iwl_station_entry *station; 3525f85a7890cbfd2be8f4c6620b2a6774d6b5ac647Emmanuel Grumbach struct iwl_tid_data *tid_data; 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 3663eae4bb176d3d51f6c61b8b1679116e58586d669Emmanuel Grumbach for (i = 0; i < IWLAGN_STATION_COUNT; 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, 37576bc10fcd128ad028cf77c62e179cd20dc2ffecfEmmanuel Grumbach "TID\tseq_num\trate_n_flags\n"); 376712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 3775f85a7890cbfd2be8f4c6620b2a6774d6b5ac647Emmanuel Grumbach for (j = 0; j < IWL_MAX_TID_COUNT; j++) { 37804cf6824a5e92e6f86c0abcb38ac65ee744c3d34Emmanuel Grumbach tid_data = &priv->tid_data[i][j]; 379da73511d4316c4e3efe903e123286c5b55a1999fJohannes Berg pos += scnprintf(buf + pos, bufsz - pos, 38076bc10fcd128ad028cf77c62e179cd20dc2ffecfEmmanuel Grumbach "%d:\t%#x\t%#x", 3815f85a7890cbfd2be8f4c6620b2a6774d6b5ac647Emmanuel Grumbach j, tid_data->seq_number, 3825f85a7890cbfd2be8f4c6620b2a6774d6b5ac647Emmanuel Grumbach tid_data->agg.rate_n_flags); 3835f85a7890cbfd2be8f4c6620b2a6774d6b5ac647Emmanuel Grumbach 3845f85a7890cbfd2be8f4c6620b2a6774d6b5ac647Emmanuel Grumbach if (tid_data->agg.wait_for_ba) 385db0589f3b9443f2b57ea6daaec09c1ab0ac99cb0Abhijeet Kolekar pos += scnprintf(buf + pos, bufsz - pos, 386da73511d4316c4e3efe903e123286c5b55a1999fJohannes Berg " - waitforba"); 387db0589f3b9443f2b57ea6daaec09c1ab0ac99cb0Abhijeet Kolekar pos += scnprintf(buf + pos, bufsz - pos, "\n"); 388712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler } 389da73511d4316c4e3efe903e123286c5b55a1999fJohannes Berg 390da73511d4316c4e3efe903e123286c5b55a1999fJohannes Berg pos += scnprintf(buf + pos, bufsz - pos, "\n"); 391712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler } 392712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 393712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler ret = simple_read_from_buffer(user_buf, count, ppos, buf, pos); 394712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler kfree(buf); 395712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler return ret; 396712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler} 397712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 3980848e297c2107dbc12a91a1709c879c73bd188d8Wey-Yi Guystatic ssize_t iwl_dbgfs_nvm_read(struct file *file, 3998dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler char __user *user_buf, 4008dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler size_t count, 4018dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler loff_t *ppos) 4028dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler{ 4038dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler ssize_t ret; 40428f63a4bb744ea81030219aba2337fddb10b380bH Hartley Sweeten struct iwl_priv *priv = file->private_data; 4058dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler int pos = 0, ofs = 0, buf_size = 0; 4068dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler const u8 *ptr; 4078dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler char *buf; 408e307ddce394ee7bcec41fb74330ac89eafaea1d9Wey-Yi Guy u16 eeprom_ver; 4093862241945026a8fa165ab73c57739df77b8e1fbDon Fry size_t eeprom_len = cfg(priv)->base_params->eeprom_size; 4108dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler buf_size = 4 * eeprom_len + 256; 4118dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler 4128dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler if (eeprom_len % 16) { 4130848e297c2107dbc12a91a1709c879c73bd188d8Wey-Yi Guy IWL_ERR(priv, "NVM size is not multiple of 16.\n"); 4148dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler return -ENODATA; 4158dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler } 4168dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler 417ab36eab24e7847d6d92872c55b46554c8ac4c4b3Don Fry ptr = priv->shrd->eeprom; 418c37457e69ffd7d3c94cbfcc1c39be9a45dd7ad21Julia Lawall if (!ptr) { 419c37457e69ffd7d3c94cbfcc1c39be9a45dd7ad21Julia Lawall IWL_ERR(priv, "Invalid EEPROM/OTP memory\n"); 420c37457e69ffd7d3c94cbfcc1c39be9a45dd7ad21Julia Lawall return -ENOMEM; 421c37457e69ffd7d3c94cbfcc1c39be9a45dd7ad21Julia Lawall } 422c37457e69ffd7d3c94cbfcc1c39be9a45dd7ad21Julia Lawall 4238dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler /* 4 characters for byte 0xYY */ 4248dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler buf = kzalloc(buf_size, GFP_KERNEL); 4258dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler if (!buf) { 42615b1687cb4f45b87ddbe4dfc7759ff5bb69497d2Winkler, Tomas IWL_ERR(priv, "Can not allocate Buffer\n"); 4278dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler return -ENOMEM; 4288dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler } 429ab36eab24e7847d6d92872c55b46554c8ac4c4b3Don Fry eeprom_ver = iwl_eeprom_query16(priv->shrd, EEPROM_VERSION); 430e307ddce394ee7bcec41fb74330ac89eafaea1d9Wey-Yi Guy pos += scnprintf(buf + pos, buf_size - pos, "NVM Type: %s, " 431e307ddce394ee7bcec41fb74330ac89eafaea1d9Wey-Yi Guy "version: 0x%x\n", 43297b52cfd1ae0c2f7284ee36e80ea0c22000f90bfDon Fry (trans(priv)->nvm_device_type == NVM_DEVICE_TYPE_OTP) 433e307ddce394ee7bcec41fb74330ac89eafaea1d9Wey-Yi Guy ? "OTP" : "EEPROM", eeprom_ver); 4348dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler for (ofs = 0 ; ofs < eeprom_len ; ofs += 16) { 4358dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler pos += scnprintf(buf + pos, buf_size - pos, "0x%.4x ", ofs); 4368dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler hex_dump_to_buffer(ptr + ofs, 16 , 16, 2, buf + pos, 4378dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler buf_size - pos, 0); 4382fac9717a05fc4b4824422d2c439c1260807c110Reinette Chatre pos += strlen(buf + pos); 4398dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler if (buf_size - pos > 0) 4408dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler buf[pos++] = '\n'; 4418dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler } 4428dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler 4438dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler ret = simple_read_from_buffer(user_buf, count, ppos, buf, pos); 4448dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler kfree(buf); 4458dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler return ret; 4468dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler} 447712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 448d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomasstatic ssize_t iwl_dbgfs_channels_read(struct file *file, char __user *user_buf, 449d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomas size_t count, loff_t *ppos) 450d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomas{ 45128f63a4bb744ea81030219aba2337fddb10b380bH Hartley Sweeten struct iwl_priv *priv = file->private_data; 452d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomas struct ieee80211_channel *channels = NULL; 453d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomas const struct ieee80211_supported_band *supp_band = NULL; 454d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomas int pos = 0, i, bufsz = PAGE_SIZE; 455d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomas char *buf; 456d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomas ssize_t ret; 457d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomas 45863013ae30159c90d2a873e20e680e7810fa533faEmmanuel Grumbach if (!test_bit(STATUS_GEO_CONFIGURED, &priv->shrd->status)) 459d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomas return -EAGAIN; 460d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomas 461d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomas buf = kzalloc(bufsz, GFP_KERNEL); 462d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomas if (!buf) { 46315b1687cb4f45b87ddbe4dfc7759ff5bb69497d2Winkler, Tomas IWL_ERR(priv, "Can not allocate Buffer\n"); 464d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomas return -ENOMEM; 465d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomas } 466d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomas 467d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomas supp_band = iwl_get_hw_mode(priv, IEEE80211_BAND_2GHZ); 468a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy if (supp_band) { 469a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy channels = supp_band->channels; 470d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomas 471d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomas pos += scnprintf(buf + pos, bufsz - pos, 472a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy "Displaying %d channels in 2.4GHz band 802.11bg):\n", 473a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy supp_band->n_channels); 474d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomas 475a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy for (i = 0; i < supp_band->n_channels; i++) 476a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 477a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy "%d: %ddBm: BSS%s%s, %s.\n", 47881e95430aaa898799421617c2db2882386bab69aShanyu Zhao channels[i].hw_value, 479a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy channels[i].max_power, 480a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy channels[i].flags & IEEE80211_CHAN_RADAR ? 481a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy " (IEEE 802.11h required)" : "", 482a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy ((channels[i].flags & IEEE80211_CHAN_NO_IBSS) 483a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy || (channels[i].flags & 484a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy IEEE80211_CHAN_RADAR)) ? "" : 485a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy ", IBSS", 486a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy channels[i].flags & 487a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy IEEE80211_CHAN_PASSIVE_SCAN ? 488a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy "passive only" : "active/passive"); 489a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy } 490d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomas supp_band = iwl_get_hw_mode(priv, IEEE80211_BAND_5GHZ); 491a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy if (supp_band) { 492a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy channels = supp_band->channels; 493d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomas 494d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomas pos += scnprintf(buf + pos, bufsz - pos, 495a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy "Displaying %d channels in 5.2GHz band (802.11a)\n", 496a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy supp_band->n_channels); 497a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy 498a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy for (i = 0; i < supp_band->n_channels; i++) 499a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 500a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy "%d: %ddBm: BSS%s%s, %s.\n", 50181e95430aaa898799421617c2db2882386bab69aShanyu Zhao channels[i].hw_value, 502a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy channels[i].max_power, 503a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy channels[i].flags & IEEE80211_CHAN_RADAR ? 504a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy " (IEEE 802.11h required)" : "", 505a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy ((channels[i].flags & IEEE80211_CHAN_NO_IBSS) 506a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy || (channels[i].flags & 507a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy IEEE80211_CHAN_RADAR)) ? "" : 508a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy ", IBSS", 509a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy channels[i].flags & 510a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy IEEE80211_CHAN_PASSIVE_SCAN ? 511a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy "passive only" : "active/passive"); 512a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy } 513d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomas ret = simple_read_from_buffer(user_buf, count, ppos, buf, pos); 514d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomas kfree(buf); 515d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomas return ret; 516d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomas} 517d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomas 51808df05aa9b25f3079585855506022bb33a011183Wey-Yi Guystatic ssize_t iwl_dbgfs_status_read(struct file *file, 51908df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy char __user *user_buf, 52008df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy size_t count, loff_t *ppos) { 52108df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy 52228f63a4bb744ea81030219aba2337fddb10b380bH Hartley Sweeten struct iwl_priv *priv = file->private_data; 52308df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy char buf[512]; 52408df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy int pos = 0; 52508df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy const size_t bufsz = sizeof(buf); 52608df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy 52708df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "STATUS_HCMD_ACTIVE:\t %d\n", 52863013ae30159c90d2a873e20e680e7810fa533faEmmanuel Grumbach test_bit(STATUS_HCMD_ACTIVE, &priv->shrd->status)); 52908df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "STATUS_INT_ENABLED:\t %d\n", 53063013ae30159c90d2a873e20e680e7810fa533faEmmanuel Grumbach test_bit(STATUS_INT_ENABLED, &priv->shrd->status)); 53108df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "STATUS_RF_KILL_HW:\t %d\n", 53263013ae30159c90d2a873e20e680e7810fa533faEmmanuel Grumbach test_bit(STATUS_RF_KILL_HW, &priv->shrd->status)); 5337812b16730ccebce71a3b2228ac08dd4f8b39469Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "STATUS_CT_KILL:\t\t %d\n", 53463013ae30159c90d2a873e20e680e7810fa533faEmmanuel Grumbach test_bit(STATUS_CT_KILL, &priv->shrd->status)); 53508df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "STATUS_INIT:\t\t %d\n", 53663013ae30159c90d2a873e20e680e7810fa533faEmmanuel Grumbach test_bit(STATUS_INIT, &priv->shrd->status)); 53708df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "STATUS_ALIVE:\t\t %d\n", 53863013ae30159c90d2a873e20e680e7810fa533faEmmanuel Grumbach test_bit(STATUS_ALIVE, &priv->shrd->status)); 53908df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "STATUS_READY:\t\t %d\n", 54063013ae30159c90d2a873e20e680e7810fa533faEmmanuel Grumbach test_bit(STATUS_READY, &priv->shrd->status)); 54108df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "STATUS_TEMPERATURE:\t %d\n", 54263013ae30159c90d2a873e20e680e7810fa533faEmmanuel Grumbach test_bit(STATUS_TEMPERATURE, &priv->shrd->status)); 54308df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "STATUS_GEO_CONFIGURED:\t %d\n", 54463013ae30159c90d2a873e20e680e7810fa533faEmmanuel Grumbach test_bit(STATUS_GEO_CONFIGURED, &priv->shrd->status)); 54508df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "STATUS_EXIT_PENDING:\t %d\n", 54663013ae30159c90d2a873e20e680e7810fa533faEmmanuel Grumbach test_bit(STATUS_EXIT_PENDING, &priv->shrd->status)); 54708df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "STATUS_STATISTICS:\t %d\n", 54863013ae30159c90d2a873e20e680e7810fa533faEmmanuel Grumbach test_bit(STATUS_STATISTICS, &priv->shrd->status)); 54908df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "STATUS_SCANNING:\t %d\n", 55063013ae30159c90d2a873e20e680e7810fa533faEmmanuel Grumbach test_bit(STATUS_SCANNING, &priv->shrd->status)); 55108df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "STATUS_SCAN_ABORTING:\t %d\n", 55263013ae30159c90d2a873e20e680e7810fa533faEmmanuel Grumbach test_bit(STATUS_SCAN_ABORTING, &priv->shrd->status)); 55308df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "STATUS_SCAN_HW:\t\t %d\n", 55463013ae30159c90d2a873e20e680e7810fa533faEmmanuel Grumbach test_bit(STATUS_SCAN_HW, &priv->shrd->status)); 55508df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "STATUS_POWER_PMI:\t %d\n", 55663013ae30159c90d2a873e20e680e7810fa533faEmmanuel Grumbach test_bit(STATUS_POWER_PMI, &priv->shrd->status)); 55708df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "STATUS_FW_ERROR:\t %d\n", 55863013ae30159c90d2a873e20e680e7810fa533faEmmanuel Grumbach test_bit(STATUS_FW_ERROR, &priv->shrd->status)); 55908df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy return simple_read_from_buffer(user_buf, count, ppos, buf, pos); 56008df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy} 56108df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy 5621f7b6172db86e9ab2b4cd794441bb2c40ab287fcEmmanuel Grumbachstatic ssize_t iwl_dbgfs_rx_handlers_read(struct file *file, 563a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy char __user *user_buf, 564a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy size_t count, loff_t *ppos) { 565a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy 56628f63a4bb744ea81030219aba2337fddb10b380bH Hartley Sweeten struct iwl_priv *priv = file->private_data; 5671f7b6172db86e9ab2b4cd794441bb2c40ab287fcEmmanuel Grumbach 568a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy int pos = 0; 569a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy int cnt = 0; 570a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy char *buf; 571a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy int bufsz = 24 * 64; /* 24 items * 64 char per item */ 572a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy ssize_t ret; 573a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy 574a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy buf = kzalloc(bufsz, GFP_KERNEL); 575a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy if (!buf) { 576a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy IWL_ERR(priv, "Can not allocate Buffer\n"); 577a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy return -ENOMEM; 578a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy } 579a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy 580a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy for (cnt = 0; cnt < REPLY_MAX; cnt++) { 5811f7b6172db86e9ab2b4cd794441bb2c40ab287fcEmmanuel Grumbach if (priv->rx_handlers_stats[cnt] > 0) 582a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 583a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy "\tRx handler[%36s]:\t\t %u\n", 584a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy get_cmd_string(cnt), 5851f7b6172db86e9ab2b4cd794441bb2c40ab287fcEmmanuel Grumbach priv->rx_handlers_stats[cnt]); 586a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy } 587a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy 588a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy ret = simple_read_from_buffer(user_buf, count, ppos, buf, pos); 589a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy kfree(buf); 590a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy return ret; 591a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy} 592a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy 5931f7b6172db86e9ab2b4cd794441bb2c40ab287fcEmmanuel Grumbachstatic ssize_t iwl_dbgfs_rx_handlers_write(struct file *file, 594a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy const char __user *user_buf, 595a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy size_t count, loff_t *ppos) 596a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy{ 597a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy struct iwl_priv *priv = file->private_data; 5981f7b6172db86e9ab2b4cd794441bb2c40ab287fcEmmanuel Grumbach 599a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy char buf[8]; 600a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy int buf_size; 601a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy u32 reset_flag; 602a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy 603a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy memset(buf, 0, sizeof(buf)); 604a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy buf_size = min(count, sizeof(buf) - 1); 605a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy if (copy_from_user(buf, user_buf, buf_size)) 606a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy return -EFAULT; 607a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy if (sscanf(buf, "%x", &reset_flag) != 1) 608a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy return -EFAULT; 609a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy if (reset_flag == 0) 6101f7b6172db86e9ab2b4cd794441bb2c40ab287fcEmmanuel Grumbach memset(&priv->rx_handlers_stats[0], 0, 6111f7b6172db86e9ab2b4cd794441bb2c40ab287fcEmmanuel Grumbach sizeof(priv->rx_handlers_stats)); 612a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy 613a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy return count; 614a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy} 615a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy 616f5ad69fa47e7b204d0032d569812544cd9a351fbWey-Yi Guystatic ssize_t iwl_dbgfs_qos_read(struct file *file, char __user *user_buf, 617f5ad69fa47e7b204d0032d569812544cd9a351fbWey-Yi Guy size_t count, loff_t *ppos) 618f5ad69fa47e7b204d0032d569812544cd9a351fbWey-Yi Guy{ 61928f63a4bb744ea81030219aba2337fddb10b380bH Hartley Sweeten struct iwl_priv *priv = file->private_data; 6208dfdb9d5757424f7018a643258065c4fc8e6a439Johannes Berg struct iwl_rxon_context *ctx; 621f5ad69fa47e7b204d0032d569812544cd9a351fbWey-Yi Guy int pos = 0, i; 6228dfdb9d5757424f7018a643258065c4fc8e6a439Johannes Berg char buf[256 * NUM_IWL_RXON_CTX]; 623f5ad69fa47e7b204d0032d569812544cd9a351fbWey-Yi Guy const size_t bufsz = sizeof(buf); 624f5ad69fa47e7b204d0032d569812544cd9a351fbWey-Yi Guy 6258dfdb9d5757424f7018a643258065c4fc8e6a439Johannes Berg for_each_context(priv, ctx) { 6268dfdb9d5757424f7018a643258065c4fc8e6a439Johannes Berg pos += scnprintf(buf + pos, bufsz - pos, "context %d:\n", 6278dfdb9d5757424f7018a643258065c4fc8e6a439Johannes Berg ctx->ctxid); 6288dfdb9d5757424f7018a643258065c4fc8e6a439Johannes Berg for (i = 0; i < AC_NUM; i++) { 6298dfdb9d5757424f7018a643258065c4fc8e6a439Johannes Berg pos += scnprintf(buf + pos, bufsz - pos, 6308dfdb9d5757424f7018a643258065c4fc8e6a439Johannes Berg "\tcw_min\tcw_max\taifsn\ttxop\n"); 6318dfdb9d5757424f7018a643258065c4fc8e6a439Johannes Berg pos += scnprintf(buf + pos, bufsz - pos, 632f5ad69fa47e7b204d0032d569812544cd9a351fbWey-Yi Guy "AC[%d]\t%u\t%u\t%u\t%u\n", i, 6338dfdb9d5757424f7018a643258065c4fc8e6a439Johannes Berg ctx->qos_data.def_qos_parm.ac[i].cw_min, 6348dfdb9d5757424f7018a643258065c4fc8e6a439Johannes Berg ctx->qos_data.def_qos_parm.ac[i].cw_max, 6358dfdb9d5757424f7018a643258065c4fc8e6a439Johannes Berg ctx->qos_data.def_qos_parm.ac[i].aifsn, 6368dfdb9d5757424f7018a643258065c4fc8e6a439Johannes Berg ctx->qos_data.def_qos_parm.ac[i].edca_txop); 6378dfdb9d5757424f7018a643258065c4fc8e6a439Johannes Berg } 6388dfdb9d5757424f7018a643258065c4fc8e6a439Johannes Berg pos += scnprintf(buf + pos, bufsz - pos, "\n"); 639f5ad69fa47e7b204d0032d569812544cd9a351fbWey-Yi Guy } 6404967c31677cf3c6c49aadf205f1a31d15d7610daWey-Yi Guy return simple_read_from_buffer(user_buf, count, ppos, buf, pos); 641f5ad69fa47e7b204d0032d569812544cd9a351fbWey-Yi Guy} 642a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy 643fbf3a2af3834e8e93e9c2876de62c5b49988e352Wey-Yi Guystatic ssize_t iwl_dbgfs_thermal_throttling_read(struct file *file, 644fbf3a2af3834e8e93e9c2876de62c5b49988e352Wey-Yi Guy char __user *user_buf, 645fbf3a2af3834e8e93e9c2876de62c5b49988e352Wey-Yi Guy size_t count, loff_t *ppos) 646fbf3a2af3834e8e93e9c2876de62c5b49988e352Wey-Yi Guy{ 64728f63a4bb744ea81030219aba2337fddb10b380bH Hartley Sweeten struct iwl_priv *priv = file->private_data; 6483ad3b92a5517c043ef30e4b95c4c39a35bbc36beJohannes Berg struct iwl_tt_mgmt *tt = &priv->thermal_throttle; 649fbf3a2af3834e8e93e9c2876de62c5b49988e352Wey-Yi Guy struct iwl_tt_restriction *restriction; 650fbf3a2af3834e8e93e9c2876de62c5b49988e352Wey-Yi Guy char buf[100]; 651fbf3a2af3834e8e93e9c2876de62c5b49988e352Wey-Yi Guy int pos = 0; 652fbf3a2af3834e8e93e9c2876de62c5b49988e352Wey-Yi Guy const size_t bufsz = sizeof(buf); 653fbf3a2af3834e8e93e9c2876de62c5b49988e352Wey-Yi Guy 654fbf3a2af3834e8e93e9c2876de62c5b49988e352Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 655fbf3a2af3834e8e93e9c2876de62c5b49988e352Wey-Yi Guy "Thermal Throttling Mode: %s\n", 6563ad3b92a5517c043ef30e4b95c4c39a35bbc36beJohannes Berg tt->advanced_tt ? "Advance" : "Legacy"); 657fbf3a2af3834e8e93e9c2876de62c5b49988e352Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 658fbf3a2af3834e8e93e9c2876de62c5b49988e352Wey-Yi Guy "Thermal Throttling State: %d\n", 659fbf3a2af3834e8e93e9c2876de62c5b49988e352Wey-Yi Guy tt->state); 6603ad3b92a5517c043ef30e4b95c4c39a35bbc36beJohannes Berg if (tt->advanced_tt) { 661fbf3a2af3834e8e93e9c2876de62c5b49988e352Wey-Yi Guy restriction = tt->restriction + tt->state; 662fbf3a2af3834e8e93e9c2876de62c5b49988e352Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 663fbf3a2af3834e8e93e9c2876de62c5b49988e352Wey-Yi Guy "Tx mode: %d\n", 664fbf3a2af3834e8e93e9c2876de62c5b49988e352Wey-Yi Guy restriction->tx_stream); 665fbf3a2af3834e8e93e9c2876de62c5b49988e352Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 666fbf3a2af3834e8e93e9c2876de62c5b49988e352Wey-Yi Guy "Rx mode: %d\n", 667fbf3a2af3834e8e93e9c2876de62c5b49988e352Wey-Yi Guy restriction->rx_stream); 668fbf3a2af3834e8e93e9c2876de62c5b49988e352Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 669fbf3a2af3834e8e93e9c2876de62c5b49988e352Wey-Yi Guy "HT mode: %d\n", 670fbf3a2af3834e8e93e9c2876de62c5b49988e352Wey-Yi Guy restriction->is_ht); 671fbf3a2af3834e8e93e9c2876de62c5b49988e352Wey-Yi Guy } 6724967c31677cf3c6c49aadf205f1a31d15d7610daWey-Yi Guy return simple_read_from_buffer(user_buf, count, ppos, buf, pos); 673fbf3a2af3834e8e93e9c2876de62c5b49988e352Wey-Yi Guy} 674fbf3a2af3834e8e93e9c2876de62c5b49988e352Wey-Yi Guy 6751e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guystatic ssize_t iwl_dbgfs_disable_ht40_write(struct file *file, 6761e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy const char __user *user_buf, 6771e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy size_t count, loff_t *ppos) 6781e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy{ 6791e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy struct iwl_priv *priv = file->private_data; 6801e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy char buf[8]; 6811e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy int buf_size; 6821e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy int ht40; 6831e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy 6841e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy memset(buf, 0, sizeof(buf)); 6851e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy buf_size = min(count, sizeof(buf) - 1); 6861e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy if (copy_from_user(buf, user_buf, buf_size)) 6871e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy return -EFAULT; 6881e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy if (sscanf(buf, "%d", &ht40) != 1) 6891e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy return -EFAULT; 690246ed355221076884d225f9d8a4c30a048be8162Johannes Berg if (!iwl_is_any_associated(priv)) 6911e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy priv->disable_ht40 = ht40 ? true : false; 6921e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy else { 6931e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy IWL_ERR(priv, "Sta associated with AP - " 6941e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy "Change to 40MHz channel support is not allowed\n"); 6951e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy return -EINVAL; 6961e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy } 6971e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy 6981e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy return count; 6991e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy} 7001e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy 7011e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guystatic ssize_t iwl_dbgfs_disable_ht40_read(struct file *file, 7021e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy char __user *user_buf, 7031e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy size_t count, loff_t *ppos) 7041e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy{ 70528f63a4bb744ea81030219aba2337fddb10b380bH Hartley Sweeten struct iwl_priv *priv = file->private_data; 7061e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy char buf[100]; 7071e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy int pos = 0; 7081e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy const size_t bufsz = sizeof(buf); 7091e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy 7101e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 7111e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy "11n 40MHz Mode: %s\n", 7121e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy priv->disable_ht40 ? "Disabled" : "Enabled"); 7134967c31677cf3c6c49aadf205f1a31d15d7610daWey-Yi Guy return simple_read_from_buffer(user_buf, count, ppos, buf, pos); 7141e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy} 7151e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy 716511afa3bfbb421ff0e87086725367f762587ab87Emmanuel Grumbachstatic ssize_t iwl_dbgfs_temperature_read(struct file *file, 717511afa3bfbb421ff0e87086725367f762587ab87Emmanuel Grumbach char __user *user_buf, 718511afa3bfbb421ff0e87086725367f762587ab87Emmanuel Grumbach size_t count, loff_t *ppos) 719511afa3bfbb421ff0e87086725367f762587ab87Emmanuel Grumbach{ 720511afa3bfbb421ff0e87086725367f762587ab87Emmanuel Grumbach struct iwl_priv *priv = file->private_data; 721511afa3bfbb421ff0e87086725367f762587ab87Emmanuel Grumbach char buf[8]; 722511afa3bfbb421ff0e87086725367f762587ab87Emmanuel Grumbach int pos = 0; 723511afa3bfbb421ff0e87086725367f762587ab87Emmanuel Grumbach const size_t bufsz = sizeof(buf); 724511afa3bfbb421ff0e87086725367f762587ab87Emmanuel Grumbach 725511afa3bfbb421ff0e87086725367f762587ab87Emmanuel Grumbach pos += scnprintf(buf + pos, bufsz - pos, "%d\n", priv->temperature); 726511afa3bfbb421ff0e87086725367f762587ab87Emmanuel Grumbach return simple_read_from_buffer(user_buf, count, ppos, buf, pos); 727511afa3bfbb421ff0e87086725367f762587ab87Emmanuel Grumbach} 728511afa3bfbb421ff0e87086725367f762587ab87Emmanuel Grumbach 729511afa3bfbb421ff0e87086725367f762587ab87Emmanuel Grumbach 730e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Bergstatic ssize_t iwl_dbgfs_sleep_level_override_write(struct file *file, 731e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg const char __user *user_buf, 732e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg size_t count, loff_t *ppos) 733e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg{ 734e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg struct iwl_priv *priv = file->private_data; 735e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg char buf[8]; 736e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg int buf_size; 737e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg int value; 738e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg 739e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg memset(buf, 0, sizeof(buf)); 740e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg buf_size = min(count, sizeof(buf) - 1); 741e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg if (copy_from_user(buf, user_buf, buf_size)) 742e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg return -EFAULT; 743e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg 744e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg if (sscanf(buf, "%d", &value) != 1) 745e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg return -EINVAL; 746e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg 747e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg /* 748e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg * Our users expect 0 to be "CAM", but 0 isn't actually 749e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg * valid here. However, let's not confuse them and present 750e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg * IWL_POWER_INDEX_1 as "1", not "0". 751e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg */ 7521a34c043802a213e719420ece395cf25c85cc7c5Reinette Chatre if (value == 0) 7531a34c043802a213e719420ece395cf25c85cc7c5Reinette Chatre return -EINVAL; 7541a34c043802a213e719420ece395cf25c85cc7c5Reinette Chatre else if (value > 0) 755e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg value -= 1; 756e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg 757e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg if (value != -1 && (value < 0 || value >= IWL_POWER_NUM)) 758e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg return -EINVAL; 759e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg 760845a9c0d8acea87dede740bc5feb9ec2d00505d9Emmanuel Grumbach if (!iwl_is_ready_rf(priv->shrd)) 7614ad177b5c860dc0b1083eccc55957daf4a116b90Wey-Yi Guy return -EAGAIN; 7624ad177b5c860dc0b1083eccc55957daf4a116b90Wey-Yi Guy 763e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg priv->power_data.debug_sleep_level_override = value; 764e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg 7656ac2f839b0b21225a65f41802c5f0df5eff4f16cEmmanuel Grumbach mutex_lock(&priv->shrd->mutex); 7664ad177b5c860dc0b1083eccc55957daf4a116b90Wey-Yi Guy iwl_power_update_mode(priv, true); 7676ac2f839b0b21225a65f41802c5f0df5eff4f16cEmmanuel Grumbach mutex_unlock(&priv->shrd->mutex); 768e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg 769e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg return count; 770e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg} 771e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg 772e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Bergstatic ssize_t iwl_dbgfs_sleep_level_override_read(struct file *file, 773e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg char __user *user_buf, 774e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg size_t count, loff_t *ppos) 775e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg{ 77628f63a4bb744ea81030219aba2337fddb10b380bH Hartley Sweeten struct iwl_priv *priv = file->private_data; 777e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg char buf[10]; 778e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg int pos, value; 779e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg const size_t bufsz = sizeof(buf); 780e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg 781e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg /* see the write function */ 782e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg value = priv->power_data.debug_sleep_level_override; 783e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg if (value >= 0) 784e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg value += 1; 785e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg 786e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg pos = scnprintf(buf, bufsz, "%d\n", value); 787e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg return simple_read_from_buffer(user_buf, count, ppos, buf, pos); 788e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg} 789e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg 790e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Bergstatic ssize_t iwl_dbgfs_current_sleep_command_read(struct file *file, 791e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg char __user *user_buf, 792e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg size_t count, loff_t *ppos) 793e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg{ 79428f63a4bb744ea81030219aba2337fddb10b380bH Hartley Sweeten struct iwl_priv *priv = file->private_data; 795e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg char buf[200]; 796e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg int pos = 0, i; 797e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg const size_t bufsz = sizeof(buf); 798e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg struct iwl_powertable_cmd *cmd = &priv->power_data.sleep_cmd; 799e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg 800e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg pos += scnprintf(buf + pos, bufsz - pos, 801e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg "flags: %#.2x\n", le16_to_cpu(cmd->flags)); 802e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg pos += scnprintf(buf + pos, bufsz - pos, 803e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg "RX/TX timeout: %d/%d usec\n", 804e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg le32_to_cpu(cmd->rx_data_timeout), 805e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg le32_to_cpu(cmd->tx_data_timeout)); 806e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg for (i = 0; i < IWL_POWER_VEC_SIZE; i++) 807e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg pos += scnprintf(buf + pos, bufsz - pos, 808e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg "sleep_interval[%d]: %d\n", i, 809e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg le32_to_cpu(cmd->sleep_interval[i])); 810e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg 811e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg return simple_read_from_buffer(user_buf, count, ppos, buf, pos); 812e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg} 813e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg 814712b6cf57a53da608a682b5f782c5785bda76001Tomas WinklerDEBUGFS_READ_WRITE_FILE_OPS(sram); 815c8ac61cf6e53fefb3b439fc58390fb65d2730e63Johannes BergDEBUGFS_READ_FILE_OPS(wowlan_sram); 8160848e297c2107dbc12a91a1709c879c73bd188d8Wey-Yi GuyDEBUGFS_READ_FILE_OPS(nvm); 817712b6cf57a53da608a682b5f782c5785bda76001Tomas WinklerDEBUGFS_READ_FILE_OPS(stations); 818d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, TomasDEBUGFS_READ_FILE_OPS(channels); 81908df05aa9b25f3079585855506022bb33a011183Wey-Yi GuyDEBUGFS_READ_FILE_OPS(status); 8201f7b6172db86e9ab2b4cd794441bb2c40ab287fcEmmanuel GrumbachDEBUGFS_READ_WRITE_FILE_OPS(rx_handlers); 821f5ad69fa47e7b204d0032d569812544cd9a351fbWey-Yi GuyDEBUGFS_READ_FILE_OPS(qos); 822fbf3a2af3834e8e93e9c2876de62c5b49988e352Wey-Yi GuyDEBUGFS_READ_FILE_OPS(thermal_throttling); 8231e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi GuyDEBUGFS_READ_WRITE_FILE_OPS(disable_ht40); 824511afa3bfbb421ff0e87086725367f762587ab87Emmanuel GrumbachDEBUGFS_READ_FILE_OPS(temperature); 825e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes BergDEBUGFS_READ_WRITE_FILE_OPS(sleep_level_override); 826e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes BergDEBUGFS_READ_FILE_OPS(current_sleep_command); 827712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 82841f5e0475c7c04b17b207736146187636b04eb4cEmmanuel Grumbachstatic ssize_t iwl_dbgfs_traffic_log_read(struct file *file, 82941f5e0475c7c04b17b207736146187636b04eb4cEmmanuel Grumbach char __user *user_buf, 83041f5e0475c7c04b17b207736146187636b04eb4cEmmanuel Grumbach size_t count, loff_t *ppos) 83141f5e0475c7c04b17b207736146187636b04eb4cEmmanuel Grumbach{ 83241f5e0475c7c04b17b207736146187636b04eb4cEmmanuel Grumbach struct iwl_priv *priv = file->private_data; 83341f5e0475c7c04b17b207736146187636b04eb4cEmmanuel Grumbach int pos = 0, ofs = 0; 83441f5e0475c7c04b17b207736146187636b04eb4cEmmanuel Grumbach int cnt = 0, entry; 83541f5e0475c7c04b17b207736146187636b04eb4cEmmanuel Grumbach 83641f5e0475c7c04b17b207736146187636b04eb4cEmmanuel Grumbach char *buf; 83741f5e0475c7c04b17b207736146187636b04eb4cEmmanuel Grumbach int bufsz = ((IWL_TRAFFIC_ENTRIES * IWL_TRAFFIC_ENTRY_SIZE * 64) * 2) + 83841f5e0475c7c04b17b207736146187636b04eb4cEmmanuel Grumbach (hw_params(priv).max_txq_num * 32 * 8) + 400; 83941f5e0475c7c04b17b207736146187636b04eb4cEmmanuel Grumbach const u8 *ptr; 84041f5e0475c7c04b17b207736146187636b04eb4cEmmanuel Grumbach ssize_t ret; 84141f5e0475c7c04b17b207736146187636b04eb4cEmmanuel Grumbach 84241f5e0475c7c04b17b207736146187636b04eb4cEmmanuel Grumbach buf = kzalloc(bufsz, GFP_KERNEL); 84341f5e0475c7c04b17b207736146187636b04eb4cEmmanuel Grumbach if (!buf) { 84441f5e0475c7c04b17b207736146187636b04eb4cEmmanuel Grumbach IWL_ERR(priv, "Can not allocate buffer\n"); 84541f5e0475c7c04b17b207736146187636b04eb4cEmmanuel Grumbach return -ENOMEM; 84641f5e0475c7c04b17b207736146187636b04eb4cEmmanuel Grumbach } 84741f5e0475c7c04b17b207736146187636b04eb4cEmmanuel Grumbach if (priv->tx_traffic && 84841f5e0475c7c04b17b207736146187636b04eb4cEmmanuel Grumbach (iwl_get_debug_level(priv->shrd) & IWL_DL_TX)) { 84941f5e0475c7c04b17b207736146187636b04eb4cEmmanuel Grumbach ptr = priv->tx_traffic; 85041f5e0475c7c04b17b207736146187636b04eb4cEmmanuel Grumbach pos += scnprintf(buf + pos, bufsz - pos, 85141f5e0475c7c04b17b207736146187636b04eb4cEmmanuel Grumbach "Tx Traffic idx: %u\n", priv->tx_traffic_idx); 85241f5e0475c7c04b17b207736146187636b04eb4cEmmanuel Grumbach for (cnt = 0, ofs = 0; cnt < IWL_TRAFFIC_ENTRIES; cnt++) { 85341f5e0475c7c04b17b207736146187636b04eb4cEmmanuel Grumbach for (entry = 0; entry < IWL_TRAFFIC_ENTRY_SIZE / 16; 85441f5e0475c7c04b17b207736146187636b04eb4cEmmanuel Grumbach entry++, ofs += 16) { 85541f5e0475c7c04b17b207736146187636b04eb4cEmmanuel Grumbach pos += scnprintf(buf + pos, bufsz - pos, 85641f5e0475c7c04b17b207736146187636b04eb4cEmmanuel Grumbach "0x%.4x ", ofs); 85741f5e0475c7c04b17b207736146187636b04eb4cEmmanuel Grumbach hex_dump_to_buffer(ptr + ofs, 16, 16, 2, 85841f5e0475c7c04b17b207736146187636b04eb4cEmmanuel Grumbach buf + pos, bufsz - pos, 0); 85941f5e0475c7c04b17b207736146187636b04eb4cEmmanuel Grumbach pos += strlen(buf + pos); 86041f5e0475c7c04b17b207736146187636b04eb4cEmmanuel Grumbach if (bufsz - pos > 0) 86141f5e0475c7c04b17b207736146187636b04eb4cEmmanuel Grumbach buf[pos++] = '\n'; 86241f5e0475c7c04b17b207736146187636b04eb4cEmmanuel Grumbach } 86341f5e0475c7c04b17b207736146187636b04eb4cEmmanuel Grumbach } 86441f5e0475c7c04b17b207736146187636b04eb4cEmmanuel Grumbach } 86541f5e0475c7c04b17b207736146187636b04eb4cEmmanuel Grumbach 86641f5e0475c7c04b17b207736146187636b04eb4cEmmanuel Grumbach if (priv->rx_traffic && 86741f5e0475c7c04b17b207736146187636b04eb4cEmmanuel Grumbach (iwl_get_debug_level(priv->shrd) & IWL_DL_RX)) { 86841f5e0475c7c04b17b207736146187636b04eb4cEmmanuel Grumbach ptr = priv->rx_traffic; 86941f5e0475c7c04b17b207736146187636b04eb4cEmmanuel Grumbach pos += scnprintf(buf + pos, bufsz - pos, 87041f5e0475c7c04b17b207736146187636b04eb4cEmmanuel Grumbach "Rx Traffic idx: %u\n", priv->rx_traffic_idx); 87141f5e0475c7c04b17b207736146187636b04eb4cEmmanuel Grumbach for (cnt = 0, ofs = 0; cnt < IWL_TRAFFIC_ENTRIES; cnt++) { 87241f5e0475c7c04b17b207736146187636b04eb4cEmmanuel Grumbach for (entry = 0; entry < IWL_TRAFFIC_ENTRY_SIZE / 16; 87341f5e0475c7c04b17b207736146187636b04eb4cEmmanuel Grumbach entry++, ofs += 16) { 87441f5e0475c7c04b17b207736146187636b04eb4cEmmanuel Grumbach pos += scnprintf(buf + pos, bufsz - pos, 87541f5e0475c7c04b17b207736146187636b04eb4cEmmanuel Grumbach "0x%.4x ", ofs); 87641f5e0475c7c04b17b207736146187636b04eb4cEmmanuel Grumbach hex_dump_to_buffer(ptr + ofs, 16, 16, 2, 87741f5e0475c7c04b17b207736146187636b04eb4cEmmanuel Grumbach buf + pos, bufsz - pos, 0); 87841f5e0475c7c04b17b207736146187636b04eb4cEmmanuel Grumbach pos += strlen(buf + pos); 87941f5e0475c7c04b17b207736146187636b04eb4cEmmanuel Grumbach if (bufsz - pos > 0) 88041f5e0475c7c04b17b207736146187636b04eb4cEmmanuel Grumbach buf[pos++] = '\n'; 88141f5e0475c7c04b17b207736146187636b04eb4cEmmanuel Grumbach } 88241f5e0475c7c04b17b207736146187636b04eb4cEmmanuel Grumbach } 88341f5e0475c7c04b17b207736146187636b04eb4cEmmanuel Grumbach } 88441f5e0475c7c04b17b207736146187636b04eb4cEmmanuel Grumbach 88541f5e0475c7c04b17b207736146187636b04eb4cEmmanuel Grumbach ret = simple_read_from_buffer(user_buf, count, ppos, buf, pos); 88641f5e0475c7c04b17b207736146187636b04eb4cEmmanuel Grumbach kfree(buf); 88741f5e0475c7c04b17b207736146187636b04eb4cEmmanuel Grumbach return ret; 88841f5e0475c7c04b17b207736146187636b04eb4cEmmanuel Grumbach} 88941f5e0475c7c04b17b207736146187636b04eb4cEmmanuel Grumbach 89041f5e0475c7c04b17b207736146187636b04eb4cEmmanuel Grumbachstatic ssize_t iwl_dbgfs_traffic_log_write(struct file *file, 89141f5e0475c7c04b17b207736146187636b04eb4cEmmanuel Grumbach const char __user *user_buf, 89241f5e0475c7c04b17b207736146187636b04eb4cEmmanuel Grumbach size_t count, loff_t *ppos) 89341f5e0475c7c04b17b207736146187636b04eb4cEmmanuel Grumbach{ 89441f5e0475c7c04b17b207736146187636b04eb4cEmmanuel Grumbach struct iwl_priv *priv = file->private_data; 89541f5e0475c7c04b17b207736146187636b04eb4cEmmanuel Grumbach char buf[8]; 89641f5e0475c7c04b17b207736146187636b04eb4cEmmanuel Grumbach int buf_size; 89741f5e0475c7c04b17b207736146187636b04eb4cEmmanuel Grumbach int traffic_log; 89841f5e0475c7c04b17b207736146187636b04eb4cEmmanuel Grumbach 89941f5e0475c7c04b17b207736146187636b04eb4cEmmanuel Grumbach memset(buf, 0, sizeof(buf)); 90041f5e0475c7c04b17b207736146187636b04eb4cEmmanuel Grumbach buf_size = min(count, sizeof(buf) - 1); 90141f5e0475c7c04b17b207736146187636b04eb4cEmmanuel Grumbach if (copy_from_user(buf, user_buf, buf_size)) 90241f5e0475c7c04b17b207736146187636b04eb4cEmmanuel Grumbach return -EFAULT; 90341f5e0475c7c04b17b207736146187636b04eb4cEmmanuel Grumbach if (sscanf(buf, "%d", &traffic_log) != 1) 90441f5e0475c7c04b17b207736146187636b04eb4cEmmanuel Grumbach return -EFAULT; 90541f5e0475c7c04b17b207736146187636b04eb4cEmmanuel Grumbach if (traffic_log == 0) 90641f5e0475c7c04b17b207736146187636b04eb4cEmmanuel Grumbach iwl_reset_traffic_log(priv); 90741f5e0475c7c04b17b207736146187636b04eb4cEmmanuel Grumbach 90841f5e0475c7c04b17b207736146187636b04eb4cEmmanuel Grumbach return count; 90941f5e0475c7c04b17b207736146187636b04eb4cEmmanuel Grumbach} 91041f5e0475c7c04b17b207736146187636b04eb4cEmmanuel Grumbach 911d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guystatic const char *fmt_value = " %-30s %10u\n"; 912d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guystatic const char *fmt_hex = " %-30s 0x%02X\n"; 913d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guystatic const char *fmt_table = " %-30s %10u %10u %10u %10u\n"; 914d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guystatic const char *fmt_header = 915d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy "%-32s current cumulative delta max\n"; 916d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy 917d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guystatic int iwl_statistics_flag(struct iwl_priv *priv, char *buf, int bufsz) 918d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy{ 919d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy int p = 0; 920d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy u32 flag; 921d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy 922d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy flag = le32_to_cpu(priv->statistics.flag); 923d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy 924d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy p += scnprintf(buf + p, bufsz - p, "Statistics Flag(0x%X):\n", flag); 925d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy if (flag & UCODE_STATISTICS_CLEAR_MSK) 926d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy p += scnprintf(buf + p, bufsz - p, 927d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy "\tStatistics have been cleared\n"); 928d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy p += scnprintf(buf + p, bufsz - p, "\tOperational Frequency: %s\n", 929d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy (flag & UCODE_STATISTICS_FREQUENCY_MSK) 930d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy ? "2.4 GHz" : "5.2 GHz"); 931d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy p += scnprintf(buf + p, bufsz - p, "\tTGj Narrow Band: %s\n", 932d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy (flag & UCODE_STATISTICS_NARROW_BAND_MSK) 933d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy ? "enabled" : "disabled"); 934d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy 935d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy return p; 936d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy} 937d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy 938e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guystatic ssize_t iwl_dbgfs_ucode_rx_stats_read(struct file *file, 939e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guy char __user *user_buf, 940e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guy size_t count, loff_t *ppos) 941e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guy{ 94228f63a4bb744ea81030219aba2337fddb10b380bH Hartley Sweeten struct iwl_priv *priv = file->private_data; 943d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy int pos = 0; 944d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy char *buf; 945d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy int bufsz = sizeof(struct statistics_rx_phy) * 40 + 946d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy sizeof(struct statistics_rx_non_phy) * 40 + 947d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy sizeof(struct statistics_rx_ht_phy) * 40 + 400; 948d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy ssize_t ret; 949d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy struct statistics_rx_phy *ofdm, *accum_ofdm, *delta_ofdm, *max_ofdm; 950d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy struct statistics_rx_phy *cck, *accum_cck, *delta_cck, *max_cck; 951d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy struct statistics_rx_non_phy *general, *accum_general; 952d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy struct statistics_rx_non_phy *delta_general, *max_general; 953d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy struct statistics_rx_ht_phy *ht, *accum_ht, *delta_ht, *max_ht; 954d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy 955845a9c0d8acea87dede740bc5feb9ec2d00505d9Emmanuel Grumbach if (!iwl_is_alive(priv->shrd)) 956d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy return -EAGAIN; 957d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy 958d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy buf = kzalloc(bufsz, GFP_KERNEL); 959d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy if (!buf) { 960d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy IWL_ERR(priv, "Can not allocate Buffer\n"); 961d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy return -ENOMEM; 962d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy } 963d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy 964d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy /* 965d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy * the statistic information display here is based on 966d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy * the last statistics notification from uCode 967d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy * might not reflect the current uCode activity 968d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy */ 969d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy ofdm = &priv->statistics.rx_ofdm; 970d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy cck = &priv->statistics.rx_cck; 971d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy general = &priv->statistics.rx_non_phy; 972d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy ht = &priv->statistics.rx_ofdm_ht; 973d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_ofdm = &priv->accum_stats.rx_ofdm; 974d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_cck = &priv->accum_stats.rx_cck; 975d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_general = &priv->accum_stats.rx_non_phy; 976d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_ht = &priv->accum_stats.rx_ofdm_ht; 977d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_ofdm = &priv->delta_stats.rx_ofdm; 978d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_cck = &priv->delta_stats.rx_cck; 979d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_general = &priv->delta_stats.rx_non_phy; 980d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_ht = &priv->delta_stats.rx_ofdm_ht; 981d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_ofdm = &priv->max_delta_stats.rx_ofdm; 982d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_cck = &priv->max_delta_stats.rx_cck; 983d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_general = &priv->max_delta_stats.rx_non_phy; 984d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_ht = &priv->max_delta_stats.rx_ofdm_ht; 985d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy 986d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += iwl_statistics_flag(priv, buf, bufsz); 987d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 988d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_header, "Statistics_Rx - OFDM:"); 989d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 990d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "ina_cnt:", 991d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(ofdm->ina_cnt), 992d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_ofdm->ina_cnt, 993d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_ofdm->ina_cnt, max_ofdm->ina_cnt); 994d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 995d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "fina_cnt:", 996d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(ofdm->fina_cnt), accum_ofdm->fina_cnt, 997d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_ofdm->fina_cnt, max_ofdm->fina_cnt); 998d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 999d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "plcp_err:", 1000d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(ofdm->plcp_err), accum_ofdm->plcp_err, 1001d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_ofdm->plcp_err, max_ofdm->plcp_err); 1002d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1003d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "crc32_err:", 1004d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(ofdm->crc32_err), accum_ofdm->crc32_err, 1005d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_ofdm->crc32_err, max_ofdm->crc32_err); 1006d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1007d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "overrun_err:", 1008d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(ofdm->overrun_err), 1009d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_ofdm->overrun_err, delta_ofdm->overrun_err, 1010d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_ofdm->overrun_err); 1011d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1012d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "early_overrun_err:", 1013d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(ofdm->early_overrun_err), 1014d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_ofdm->early_overrun_err, 1015d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_ofdm->early_overrun_err, 1016d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_ofdm->early_overrun_err); 1017d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1018d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "crc32_good:", 1019d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(ofdm->crc32_good), 1020d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_ofdm->crc32_good, delta_ofdm->crc32_good, 1021d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_ofdm->crc32_good); 1022d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1023d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "false_alarm_cnt:", 1024d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(ofdm->false_alarm_cnt), 1025d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_ofdm->false_alarm_cnt, 1026d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_ofdm->false_alarm_cnt, 1027d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_ofdm->false_alarm_cnt); 1028d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1029d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "fina_sync_err_cnt:", 1030d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(ofdm->fina_sync_err_cnt), 1031d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_ofdm->fina_sync_err_cnt, 1032d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_ofdm->fina_sync_err_cnt, 1033d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_ofdm->fina_sync_err_cnt); 1034d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1035d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "sfd_timeout:", 1036d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(ofdm->sfd_timeout), 1037d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_ofdm->sfd_timeout, delta_ofdm->sfd_timeout, 1038d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_ofdm->sfd_timeout); 1039d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1040d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "fina_timeout:", 1041d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(ofdm->fina_timeout), 1042d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_ofdm->fina_timeout, delta_ofdm->fina_timeout, 1043d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_ofdm->fina_timeout); 1044d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1045d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "unresponded_rts:", 1046d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(ofdm->unresponded_rts), 1047d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_ofdm->unresponded_rts, 1048d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_ofdm->unresponded_rts, 1049d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_ofdm->unresponded_rts); 1050d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1051d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "rxe_frame_lmt_ovrun:", 1052d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(ofdm->rxe_frame_limit_overrun), 1053d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_ofdm->rxe_frame_limit_overrun, 1054d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_ofdm->rxe_frame_limit_overrun, 1055d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_ofdm->rxe_frame_limit_overrun); 1056d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1057d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "sent_ack_cnt:", 1058d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(ofdm->sent_ack_cnt), 1059d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_ofdm->sent_ack_cnt, delta_ofdm->sent_ack_cnt, 1060d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_ofdm->sent_ack_cnt); 1061d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1062d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "sent_cts_cnt:", 1063d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(ofdm->sent_cts_cnt), 1064d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_ofdm->sent_cts_cnt, delta_ofdm->sent_cts_cnt, 1065d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_ofdm->sent_cts_cnt); 1066d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1067d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "sent_ba_rsp_cnt:", 1068d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(ofdm->sent_ba_rsp_cnt), 1069d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_ofdm->sent_ba_rsp_cnt, 1070d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_ofdm->sent_ba_rsp_cnt, 1071d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_ofdm->sent_ba_rsp_cnt); 1072d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1073d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "dsp_self_kill:", 1074d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(ofdm->dsp_self_kill), 1075d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_ofdm->dsp_self_kill, 1076d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_ofdm->dsp_self_kill, 1077d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_ofdm->dsp_self_kill); 1078d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1079d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "mh_format_err:", 1080d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(ofdm->mh_format_err), 1081d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_ofdm->mh_format_err, 1082d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_ofdm->mh_format_err, 1083d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_ofdm->mh_format_err); 1084d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1085d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "re_acq_main_rssi_sum:", 1086d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(ofdm->re_acq_main_rssi_sum), 1087d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_ofdm->re_acq_main_rssi_sum, 1088d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_ofdm->re_acq_main_rssi_sum, 1089d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_ofdm->re_acq_main_rssi_sum); 1090d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy 1091d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1092d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_header, "Statistics_Rx - CCK:"); 1093d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1094d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "ina_cnt:", 1095d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(cck->ina_cnt), accum_cck->ina_cnt, 1096d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_cck->ina_cnt, max_cck->ina_cnt); 1097d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1098d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "fina_cnt:", 1099d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(cck->fina_cnt), accum_cck->fina_cnt, 1100d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_cck->fina_cnt, max_cck->fina_cnt); 1101d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1102d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "plcp_err:", 1103d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(cck->plcp_err), accum_cck->plcp_err, 1104d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_cck->plcp_err, max_cck->plcp_err); 1105d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1106d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "crc32_err:", 1107d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(cck->crc32_err), accum_cck->crc32_err, 1108d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_cck->crc32_err, max_cck->crc32_err); 1109d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1110d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "overrun_err:", 1111d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(cck->overrun_err), 1112d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_cck->overrun_err, delta_cck->overrun_err, 1113d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_cck->overrun_err); 1114d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1115d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "early_overrun_err:", 1116d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(cck->early_overrun_err), 1117d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_cck->early_overrun_err, 1118d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_cck->early_overrun_err, 1119d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_cck->early_overrun_err); 1120d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1121d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "crc32_good:", 1122d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(cck->crc32_good), accum_cck->crc32_good, 1123d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_cck->crc32_good, max_cck->crc32_good); 1124d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1125d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "false_alarm_cnt:", 1126d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(cck->false_alarm_cnt), 1127d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_cck->false_alarm_cnt, 1128d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_cck->false_alarm_cnt, max_cck->false_alarm_cnt); 1129d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1130d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "fina_sync_err_cnt:", 1131d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(cck->fina_sync_err_cnt), 1132d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_cck->fina_sync_err_cnt, 1133d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_cck->fina_sync_err_cnt, 1134d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_cck->fina_sync_err_cnt); 1135d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1136d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "sfd_timeout:", 1137d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(cck->sfd_timeout), 1138d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_cck->sfd_timeout, delta_cck->sfd_timeout, 1139d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_cck->sfd_timeout); 1140d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1141d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "fina_timeout:", 1142d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(cck->fina_timeout), 1143d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_cck->fina_timeout, delta_cck->fina_timeout, 1144d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_cck->fina_timeout); 1145d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1146d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "unresponded_rts:", 1147d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(cck->unresponded_rts), 1148d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_cck->unresponded_rts, delta_cck->unresponded_rts, 1149d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_cck->unresponded_rts); 1150d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1151d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "rxe_frame_lmt_ovrun:", 1152d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(cck->rxe_frame_limit_overrun), 1153d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_cck->rxe_frame_limit_overrun, 1154d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_cck->rxe_frame_limit_overrun, 1155d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_cck->rxe_frame_limit_overrun); 1156d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1157d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "sent_ack_cnt:", 1158d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(cck->sent_ack_cnt), 1159d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_cck->sent_ack_cnt, delta_cck->sent_ack_cnt, 1160d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_cck->sent_ack_cnt); 1161d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1162d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "sent_cts_cnt:", 1163d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(cck->sent_cts_cnt), 1164d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_cck->sent_cts_cnt, delta_cck->sent_cts_cnt, 1165d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_cck->sent_cts_cnt); 1166d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1167d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "sent_ba_rsp_cnt:", 1168d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(cck->sent_ba_rsp_cnt), 1169d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_cck->sent_ba_rsp_cnt, 1170d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_cck->sent_ba_rsp_cnt, 1171d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_cck->sent_ba_rsp_cnt); 1172d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1173d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "dsp_self_kill:", 1174d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(cck->dsp_self_kill), 1175d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_cck->dsp_self_kill, delta_cck->dsp_self_kill, 1176d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_cck->dsp_self_kill); 1177d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1178d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "mh_format_err:", 1179d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(cck->mh_format_err), 1180d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_cck->mh_format_err, delta_cck->mh_format_err, 1181d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_cck->mh_format_err); 1182d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1183d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "re_acq_main_rssi_sum:", 1184d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(cck->re_acq_main_rssi_sum), 1185d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_cck->re_acq_main_rssi_sum, 1186d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_cck->re_acq_main_rssi_sum, 1187d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_cck->re_acq_main_rssi_sum); 1188d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy 1189d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1190d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_header, "Statistics_Rx - GENERAL:"); 1191d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1192d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "bogus_cts:", 1193d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(general->bogus_cts), 1194d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_general->bogus_cts, delta_general->bogus_cts, 1195d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_general->bogus_cts); 1196d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1197d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "bogus_ack:", 1198d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(general->bogus_ack), 1199d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_general->bogus_ack, delta_general->bogus_ack, 1200d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_general->bogus_ack); 1201d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1202d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "non_bssid_frames:", 1203d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(general->non_bssid_frames), 1204d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_general->non_bssid_frames, 1205d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_general->non_bssid_frames, 1206d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_general->non_bssid_frames); 1207d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1208d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "filtered_frames:", 1209d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(general->filtered_frames), 1210d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_general->filtered_frames, 1211d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_general->filtered_frames, 1212d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_general->filtered_frames); 1213d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1214d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "non_channel_beacons:", 1215d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(general->non_channel_beacons), 1216d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_general->non_channel_beacons, 1217d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_general->non_channel_beacons, 1218d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_general->non_channel_beacons); 1219d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1220d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "channel_beacons:", 1221d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(general->channel_beacons), 1222d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_general->channel_beacons, 1223d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_general->channel_beacons, 1224d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_general->channel_beacons); 1225d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1226d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "num_missed_bcon:", 1227d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(general->num_missed_bcon), 1228d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_general->num_missed_bcon, 1229d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_general->num_missed_bcon, 1230d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_general->num_missed_bcon); 1231d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1232d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "adc_rx_saturation_time:", 1233d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(general->adc_rx_saturation_time), 1234d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_general->adc_rx_saturation_time, 1235d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_general->adc_rx_saturation_time, 1236d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_general->adc_rx_saturation_time); 1237d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1238d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "ina_detect_search_tm:", 1239d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(general->ina_detection_search_time), 1240d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_general->ina_detection_search_time, 1241d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_general->ina_detection_search_time, 1242d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_general->ina_detection_search_time); 1243d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1244d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "beacon_silence_rssi_a:", 1245d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(general->beacon_silence_rssi_a), 1246d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_general->beacon_silence_rssi_a, 1247d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_general->beacon_silence_rssi_a, 1248d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_general->beacon_silence_rssi_a); 1249d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1250d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "beacon_silence_rssi_b:", 1251d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(general->beacon_silence_rssi_b), 1252d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_general->beacon_silence_rssi_b, 1253d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_general->beacon_silence_rssi_b, 1254d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_general->beacon_silence_rssi_b); 1255d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1256d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "beacon_silence_rssi_c:", 1257d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(general->beacon_silence_rssi_c), 1258d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_general->beacon_silence_rssi_c, 1259d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_general->beacon_silence_rssi_c, 1260d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_general->beacon_silence_rssi_c); 1261d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1262d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "interference_data_flag:", 1263d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(general->interference_data_flag), 1264d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_general->interference_data_flag, 1265d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_general->interference_data_flag, 1266d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_general->interference_data_flag); 1267d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1268d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "channel_load:", 1269d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(general->channel_load), 1270d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_general->channel_load, 1271d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_general->channel_load, 1272d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_general->channel_load); 1273d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1274d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "dsp_false_alarms:", 1275d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(general->dsp_false_alarms), 1276d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_general->dsp_false_alarms, 1277d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_general->dsp_false_alarms, 1278d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_general->dsp_false_alarms); 1279d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1280d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "beacon_rssi_a:", 1281d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(general->beacon_rssi_a), 1282d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_general->beacon_rssi_a, 1283d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_general->beacon_rssi_a, 1284d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_general->beacon_rssi_a); 1285d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1286d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "beacon_rssi_b:", 1287d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(general->beacon_rssi_b), 1288d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_general->beacon_rssi_b, 1289d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_general->beacon_rssi_b, 1290d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_general->beacon_rssi_b); 1291d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1292d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "beacon_rssi_c:", 1293d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(general->beacon_rssi_c), 1294d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_general->beacon_rssi_c, 1295d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_general->beacon_rssi_c, 1296d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_general->beacon_rssi_c); 1297d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1298d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "beacon_energy_a:", 1299d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(general->beacon_energy_a), 1300d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_general->beacon_energy_a, 1301d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_general->beacon_energy_a, 1302d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_general->beacon_energy_a); 1303d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1304d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "beacon_energy_b:", 1305d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(general->beacon_energy_b), 1306d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_general->beacon_energy_b, 1307d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_general->beacon_energy_b, 1308d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_general->beacon_energy_b); 1309d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1310d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "beacon_energy_c:", 1311d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(general->beacon_energy_c), 1312d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_general->beacon_energy_c, 1313d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_general->beacon_energy_c, 1314d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_general->beacon_energy_c); 1315d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy 1316d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1317d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_header, "Statistics_Rx - OFDM_HT:"); 1318d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1319d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "plcp_err:", 1320d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(ht->plcp_err), accum_ht->plcp_err, 1321d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_ht->plcp_err, max_ht->plcp_err); 1322d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1323d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "overrun_err:", 1324d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(ht->overrun_err), accum_ht->overrun_err, 1325d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_ht->overrun_err, max_ht->overrun_err); 1326d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1327d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "early_overrun_err:", 1328d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(ht->early_overrun_err), 1329d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_ht->early_overrun_err, 1330d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_ht->early_overrun_err, 1331d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_ht->early_overrun_err); 1332d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1333d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "crc32_good:", 1334d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(ht->crc32_good), accum_ht->crc32_good, 1335d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_ht->crc32_good, max_ht->crc32_good); 1336d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1337d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "crc32_err:", 1338d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(ht->crc32_err), accum_ht->crc32_err, 1339d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_ht->crc32_err, max_ht->crc32_err); 1340d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1341d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "mh_format_err:", 1342d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(ht->mh_format_err), 1343d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_ht->mh_format_err, 1344d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_ht->mh_format_err, max_ht->mh_format_err); 1345d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1346d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "agg_crc32_good:", 1347d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(ht->agg_crc32_good), 1348d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_ht->agg_crc32_good, 1349d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_ht->agg_crc32_good, max_ht->agg_crc32_good); 1350d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1351d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "agg_mpdu_cnt:", 1352d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(ht->agg_mpdu_cnt), 1353d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_ht->agg_mpdu_cnt, 1354d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_ht->agg_mpdu_cnt, max_ht->agg_mpdu_cnt); 1355d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1356d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "agg_cnt:", 1357d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(ht->agg_cnt), accum_ht->agg_cnt, 1358d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_ht->agg_cnt, max_ht->agg_cnt); 1359d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1360d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "unsupport_mcs:", 1361d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(ht->unsupport_mcs), 1362d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_ht->unsupport_mcs, 1363d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_ht->unsupport_mcs, max_ht->unsupport_mcs); 1364d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy 1365d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy ret = simple_read_from_buffer(user_buf, count, ppos, buf, pos); 1366d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy kfree(buf); 1367d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy return ret; 1368e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guy} 1369e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guy 1370e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guystatic ssize_t iwl_dbgfs_ucode_tx_stats_read(struct file *file, 1371e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guy char __user *user_buf, 1372e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guy size_t count, loff_t *ppos) 1373e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guy{ 137428f63a4bb744ea81030219aba2337fddb10b380bH Hartley Sweeten struct iwl_priv *priv = file->private_data; 1375d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy int pos = 0; 1376d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy char *buf; 1377d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy int bufsz = (sizeof(struct statistics_tx) * 48) + 250; 1378d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy ssize_t ret; 1379d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy struct statistics_tx *tx, *accum_tx, *delta_tx, *max_tx; 1380d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy 1381845a9c0d8acea87dede740bc5feb9ec2d00505d9Emmanuel Grumbach if (!iwl_is_alive(priv->shrd)) 1382d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy return -EAGAIN; 1383d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy 1384d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy buf = kzalloc(bufsz, GFP_KERNEL); 1385d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy if (!buf) { 1386d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy IWL_ERR(priv, "Can not allocate Buffer\n"); 1387d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy return -ENOMEM; 1388d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy } 1389d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy 1390d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy /* the statistic information display here is based on 1391d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy * the last statistics notification from uCode 1392d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy * might not reflect the current uCode activity 1393d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy */ 1394d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy tx = &priv->statistics.tx; 1395d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_tx = &priv->accum_stats.tx; 1396d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_tx = &priv->delta_stats.tx; 1397d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_tx = &priv->max_delta_stats.tx; 1398d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy 1399d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += iwl_statistics_flag(priv, buf, bufsz); 1400d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1401d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_header, "Statistics_Tx:"); 1402d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1403d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "preamble:", 1404d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(tx->preamble_cnt), 1405d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_tx->preamble_cnt, 1406d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_tx->preamble_cnt, max_tx->preamble_cnt); 1407d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1408d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "rx_detected_cnt:", 1409d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(tx->rx_detected_cnt), 1410d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_tx->rx_detected_cnt, 1411d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_tx->rx_detected_cnt, max_tx->rx_detected_cnt); 1412d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1413d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "bt_prio_defer_cnt:", 1414d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(tx->bt_prio_defer_cnt), 1415d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_tx->bt_prio_defer_cnt, 1416d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_tx->bt_prio_defer_cnt, 1417d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_tx->bt_prio_defer_cnt); 1418d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1419d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "bt_prio_kill_cnt:", 1420d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(tx->bt_prio_kill_cnt), 1421d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_tx->bt_prio_kill_cnt, 1422d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_tx->bt_prio_kill_cnt, 1423d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_tx->bt_prio_kill_cnt); 1424d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1425d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "few_bytes_cnt:", 1426d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(tx->few_bytes_cnt), 1427d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_tx->few_bytes_cnt, 1428d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_tx->few_bytes_cnt, max_tx->few_bytes_cnt); 1429d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1430d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "cts_timeout:", 1431d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(tx->cts_timeout), accum_tx->cts_timeout, 1432d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_tx->cts_timeout, max_tx->cts_timeout); 1433d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1434d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "ack_timeout:", 1435d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(tx->ack_timeout), 1436d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_tx->ack_timeout, 1437d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_tx->ack_timeout, max_tx->ack_timeout); 1438d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1439d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "expected_ack_cnt:", 1440d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(tx->expected_ack_cnt), 1441d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_tx->expected_ack_cnt, 1442d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_tx->expected_ack_cnt, 1443d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_tx->expected_ack_cnt); 1444d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1445d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "actual_ack_cnt:", 1446d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(tx->actual_ack_cnt), 1447d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_tx->actual_ack_cnt, 1448d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_tx->actual_ack_cnt, 1449d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_tx->actual_ack_cnt); 1450d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1451d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "dump_msdu_cnt:", 1452d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(tx->dump_msdu_cnt), 1453d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_tx->dump_msdu_cnt, 1454d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_tx->dump_msdu_cnt, 1455d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_tx->dump_msdu_cnt); 1456d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1457d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "abort_nxt_frame_mismatch:", 1458d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(tx->burst_abort_next_frame_mismatch_cnt), 1459d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_tx->burst_abort_next_frame_mismatch_cnt, 1460d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_tx->burst_abort_next_frame_mismatch_cnt, 1461d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_tx->burst_abort_next_frame_mismatch_cnt); 1462d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1463d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "abort_missing_nxt_frame:", 1464d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(tx->burst_abort_missing_next_frame_cnt), 1465d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_tx->burst_abort_missing_next_frame_cnt, 1466d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_tx->burst_abort_missing_next_frame_cnt, 1467d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_tx->burst_abort_missing_next_frame_cnt); 1468d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1469d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "cts_timeout_collision:", 1470d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(tx->cts_timeout_collision), 1471d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_tx->cts_timeout_collision, 1472d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_tx->cts_timeout_collision, 1473d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_tx->cts_timeout_collision); 1474d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1475d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "ack_ba_timeout_collision:", 1476d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(tx->ack_or_ba_timeout_collision), 1477d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_tx->ack_or_ba_timeout_collision, 1478d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_tx->ack_or_ba_timeout_collision, 1479d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_tx->ack_or_ba_timeout_collision); 1480d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1481d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "agg ba_timeout:", 1482d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(tx->agg.ba_timeout), 1483d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_tx->agg.ba_timeout, 1484d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_tx->agg.ba_timeout, 1485d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_tx->agg.ba_timeout); 1486d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1487d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "agg ba_resched_frames:", 1488d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(tx->agg.ba_reschedule_frames), 1489d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_tx->agg.ba_reschedule_frames, 1490d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_tx->agg.ba_reschedule_frames, 1491d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_tx->agg.ba_reschedule_frames); 1492d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1493d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "agg scd_query_agg_frame:", 1494d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(tx->agg.scd_query_agg_frame_cnt), 1495d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_tx->agg.scd_query_agg_frame_cnt, 1496d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_tx->agg.scd_query_agg_frame_cnt, 1497d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_tx->agg.scd_query_agg_frame_cnt); 1498d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1499d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "agg scd_query_no_agg:", 1500d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(tx->agg.scd_query_no_agg), 1501d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_tx->agg.scd_query_no_agg, 1502d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_tx->agg.scd_query_no_agg, 1503d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_tx->agg.scd_query_no_agg); 1504d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1505d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "agg scd_query_agg:", 1506d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(tx->agg.scd_query_agg), 1507d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_tx->agg.scd_query_agg, 1508d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_tx->agg.scd_query_agg, 1509d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_tx->agg.scd_query_agg); 1510d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1511d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "agg scd_query_mismatch:", 1512d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(tx->agg.scd_query_mismatch), 1513d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_tx->agg.scd_query_mismatch, 1514d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_tx->agg.scd_query_mismatch, 1515d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_tx->agg.scd_query_mismatch); 1516d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1517d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "agg frame_not_ready:", 1518d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(tx->agg.frame_not_ready), 1519d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_tx->agg.frame_not_ready, 1520d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_tx->agg.frame_not_ready, 1521d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_tx->agg.frame_not_ready); 1522d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1523d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "agg underrun:", 1524d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(tx->agg.underrun), 1525d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_tx->agg.underrun, 1526d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_tx->agg.underrun, max_tx->agg.underrun); 1527d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1528d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "agg bt_prio_kill:", 1529d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(tx->agg.bt_prio_kill), 1530d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_tx->agg.bt_prio_kill, 1531d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_tx->agg.bt_prio_kill, 1532d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_tx->agg.bt_prio_kill); 1533d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1534d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "agg rx_ba_rsp_cnt:", 1535d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(tx->agg.rx_ba_rsp_cnt), 1536d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_tx->agg.rx_ba_rsp_cnt, 1537d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_tx->agg.rx_ba_rsp_cnt, 1538d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_tx->agg.rx_ba_rsp_cnt); 1539d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy 1540d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy if (tx->tx_power.ant_a || tx->tx_power.ant_b || tx->tx_power.ant_c) { 1541d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1542d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy "tx power: (1/2 dB step)\n"); 15433862241945026a8fa165ab73c57739df77b8e1fbDon Fry if ((cfg(priv)->valid_tx_ant & ANT_A) && tx->tx_power.ant_a) 1544d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1545d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_hex, "antenna A:", 1546d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy tx->tx_power.ant_a); 15473862241945026a8fa165ab73c57739df77b8e1fbDon Fry if ((cfg(priv)->valid_tx_ant & ANT_B) && tx->tx_power.ant_b) 1548d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1549d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_hex, "antenna B:", 1550d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy tx->tx_power.ant_b); 15513862241945026a8fa165ab73c57739df77b8e1fbDon Fry if ((cfg(priv)->valid_tx_ant & ANT_C) && tx->tx_power.ant_c) 1552d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1553d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_hex, "antenna C:", 1554d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy tx->tx_power.ant_c); 1555d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy } 1556d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy ret = simple_read_from_buffer(user_buf, count, ppos, buf, pos); 1557d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy kfree(buf); 1558d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy return ret; 1559e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guy} 1560e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guy 1561e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guystatic ssize_t iwl_dbgfs_ucode_general_stats_read(struct file *file, 1562e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guy char __user *user_buf, 1563e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guy size_t count, loff_t *ppos) 1564e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guy{ 156528f63a4bb744ea81030219aba2337fddb10b380bH Hartley Sweeten struct iwl_priv *priv = file->private_data; 1566d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy int pos = 0; 1567d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy char *buf; 1568d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy int bufsz = sizeof(struct statistics_general) * 10 + 300; 1569d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy ssize_t ret; 1570d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy struct statistics_general_common *general, *accum_general; 1571d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy struct statistics_general_common *delta_general, *max_general; 1572d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy struct statistics_dbg *dbg, *accum_dbg, *delta_dbg, *max_dbg; 1573d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy struct statistics_div *div, *accum_div, *delta_div, *max_div; 1574d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy 1575845a9c0d8acea87dede740bc5feb9ec2d00505d9Emmanuel Grumbach if (!iwl_is_alive(priv->shrd)) 1576d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy return -EAGAIN; 1577d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy 1578d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy buf = kzalloc(bufsz, GFP_KERNEL); 1579d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy if (!buf) { 1580d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy IWL_ERR(priv, "Can not allocate Buffer\n"); 1581d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy return -ENOMEM; 1582d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy } 1583d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy 1584d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy /* the statistic information display here is based on 1585d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy * the last statistics notification from uCode 1586d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy * might not reflect the current uCode activity 1587d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy */ 1588d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy general = &priv->statistics.common; 1589d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy dbg = &priv->statistics.common.dbg; 1590d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy div = &priv->statistics.common.div; 1591d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_general = &priv->accum_stats.common; 1592d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_dbg = &priv->accum_stats.common.dbg; 1593d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_div = &priv->accum_stats.common.div; 1594d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_general = &priv->delta_stats.common; 1595d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_general = &priv->max_delta_stats.common; 1596d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_dbg = &priv->delta_stats.common.dbg; 1597d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_dbg = &priv->max_delta_stats.common.dbg; 1598d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_div = &priv->delta_stats.common.div; 1599d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_div = &priv->max_delta_stats.common.div; 1600d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy 1601d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += iwl_statistics_flag(priv, buf, bufsz); 1602d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1603d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_header, "Statistics_General:"); 1604d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1605d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_value, "temperature:", 1606d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(general->temperature)); 1607d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1608d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_value, "temperature_m:", 1609d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(general->temperature_m)); 1610d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1611d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_value, "ttl_timestamp:", 1612d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(general->ttl_timestamp)); 1613d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1614d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "burst_check:", 1615d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(dbg->burst_check), 1616d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_dbg->burst_check, 1617d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_dbg->burst_check, max_dbg->burst_check); 1618d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1619d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "burst_count:", 1620d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(dbg->burst_count), 1621d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_dbg->burst_count, 1622d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_dbg->burst_count, max_dbg->burst_count); 1623d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1624d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "wait_for_silence_timeout_count:", 1625d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(dbg->wait_for_silence_timeout_cnt), 1626d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_dbg->wait_for_silence_timeout_cnt, 1627d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_dbg->wait_for_silence_timeout_cnt, 1628d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_dbg->wait_for_silence_timeout_cnt); 1629d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1630d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "sleep_time:", 1631d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(general->sleep_time), 1632d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_general->sleep_time, 1633d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_general->sleep_time, max_general->sleep_time); 1634d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1635d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "slots_out:", 1636d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(general->slots_out), 1637d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_general->slots_out, 1638d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_general->slots_out, max_general->slots_out); 1639d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1640d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "slots_idle:", 1641d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(general->slots_idle), 1642d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_general->slots_idle, 1643d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_general->slots_idle, max_general->slots_idle); 1644d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1645d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "tx_on_a:", 1646d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(div->tx_on_a), accum_div->tx_on_a, 1647d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_div->tx_on_a, max_div->tx_on_a); 1648d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1649d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "tx_on_b:", 1650d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(div->tx_on_b), accum_div->tx_on_b, 1651d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_div->tx_on_b, max_div->tx_on_b); 1652d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1653d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "exec_time:", 1654d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(div->exec_time), accum_div->exec_time, 1655d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_div->exec_time, max_div->exec_time); 1656d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1657d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "probe_time:", 1658d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(div->probe_time), accum_div->probe_time, 1659d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_div->probe_time, max_div->probe_time); 1660d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1661d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "rx_enable_counter:", 1662d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(general->rx_enable_counter), 1663d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_general->rx_enable_counter, 1664d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_general->rx_enable_counter, 1665d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_general->rx_enable_counter); 1666d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1667d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "num_of_sos_states:", 1668d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(general->num_of_sos_states), 1669d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_general->num_of_sos_states, 1670d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_general->num_of_sos_states, 1671d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_general->num_of_sos_states); 1672d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy ret = simple_read_from_buffer(user_buf, count, ppos, buf, pos); 1673d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy kfree(buf); 1674d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy return ret; 1675d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy} 1676d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy 1677d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guystatic ssize_t iwl_dbgfs_ucode_bt_stats_read(struct file *file, 1678d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy char __user *user_buf, 1679d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy size_t count, loff_t *ppos) 1680d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy{ 1681d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy struct iwl_priv *priv = (struct iwl_priv *)file->private_data; 1682d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy int pos = 0; 1683d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy char *buf; 1684d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy int bufsz = (sizeof(struct statistics_bt_activity) * 24) + 200; 1685d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy ssize_t ret; 1686d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy struct statistics_bt_activity *bt, *accum_bt; 1687d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy 1688845a9c0d8acea87dede740bc5feb9ec2d00505d9Emmanuel Grumbach if (!iwl_is_alive(priv->shrd)) 1689d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy return -EAGAIN; 1690d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy 1691d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy if (!priv->bt_enable_flag) 1692d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy return -EINVAL; 1693d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy 1694d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy /* make request to uCode to retrieve statistics information */ 16956ac2f839b0b21225a65f41802c5f0df5eff4f16cEmmanuel Grumbach mutex_lock(&priv->shrd->mutex); 1696d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy ret = iwl_send_statistics_request(priv, CMD_SYNC, false); 16976ac2f839b0b21225a65f41802c5f0df5eff4f16cEmmanuel Grumbach mutex_unlock(&priv->shrd->mutex); 1698d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy 1699d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy if (ret) { 1700d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy IWL_ERR(priv, 1701d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy "Error sending statistics request: %zd\n", ret); 1702d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy return -EAGAIN; 1703d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy } 1704d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy buf = kzalloc(bufsz, GFP_KERNEL); 1705d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy if (!buf) { 1706d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy IWL_ERR(priv, "Can not allocate Buffer\n"); 1707d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy return -ENOMEM; 1708d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy } 1709d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy 1710d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy /* 1711d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy * the statistic information display here is based on 1712d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy * the last statistics notification from uCode 1713d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy * might not reflect the current uCode activity 1714d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy */ 1715d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy bt = &priv->statistics.bt_activity; 1716d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_bt = &priv->accum_stats.bt_activity; 1717d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy 1718d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += iwl_statistics_flag(priv, buf, bufsz); 1719d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "Statistics_BT:\n"); 1720d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1721d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy "\t\t\tcurrent\t\t\taccumulative\n"); 1722d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1723d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy "hi_priority_tx_req_cnt:\t\t%u\t\t\t%u\n", 1724d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(bt->hi_priority_tx_req_cnt), 1725d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_bt->hi_priority_tx_req_cnt); 1726d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1727d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy "hi_priority_tx_denied_cnt:\t%u\t\t\t%u\n", 1728d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(bt->hi_priority_tx_denied_cnt), 1729d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_bt->hi_priority_tx_denied_cnt); 1730d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1731d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy "lo_priority_tx_req_cnt:\t\t%u\t\t\t%u\n", 1732d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(bt->lo_priority_tx_req_cnt), 1733d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_bt->lo_priority_tx_req_cnt); 1734d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1735d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy "lo_priority_tx_denied_cnt:\t%u\t\t\t%u\n", 1736d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(bt->lo_priority_tx_denied_cnt), 1737d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_bt->lo_priority_tx_denied_cnt); 1738d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1739d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy "hi_priority_rx_req_cnt:\t\t%u\t\t\t%u\n", 1740d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(bt->hi_priority_rx_req_cnt), 1741d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_bt->hi_priority_rx_req_cnt); 1742d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1743d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy "hi_priority_rx_denied_cnt:\t%u\t\t\t%u\n", 1744d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(bt->hi_priority_rx_denied_cnt), 1745d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_bt->hi_priority_rx_denied_cnt); 1746d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1747d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy "lo_priority_rx_req_cnt:\t\t%u\t\t\t%u\n", 1748d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(bt->lo_priority_rx_req_cnt), 1749d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_bt->lo_priority_rx_req_cnt); 1750d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1751d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy "lo_priority_rx_denied_cnt:\t%u\t\t\t%u\n", 1752d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(bt->lo_priority_rx_denied_cnt), 1753d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_bt->lo_priority_rx_denied_cnt); 1754d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy 1755d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1756d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy "(rx)num_bt_kills:\t\t%u\t\t\t%u\n", 1757d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(priv->statistics.num_bt_kills), 1758d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy priv->statistics.accum_num_bt_kills); 1759d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy 1760d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy ret = simple_read_from_buffer(user_buf, count, ppos, buf, pos); 1761d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy kfree(buf); 1762d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy return ret; 1763d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy} 1764d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy 1765d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guystatic ssize_t iwl_dbgfs_reply_tx_error_read(struct file *file, 1766d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy char __user *user_buf, 1767d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy size_t count, loff_t *ppos) 1768d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy{ 1769d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy struct iwl_priv *priv = (struct iwl_priv *)file->private_data; 1770d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy int pos = 0; 1771d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy char *buf; 1772d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy int bufsz = (sizeof(struct reply_tx_error_statistics) * 24) + 1773d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy (sizeof(struct reply_agg_tx_error_statistics) * 24) + 200; 1774d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy ssize_t ret; 1775d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy 1776845a9c0d8acea87dede740bc5feb9ec2d00505d9Emmanuel Grumbach if (!iwl_is_alive(priv->shrd)) 1777d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy return -EAGAIN; 1778d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy 1779d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy buf = kzalloc(bufsz, GFP_KERNEL); 1780d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy if (!buf) { 1781d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy IWL_ERR(priv, "Can not allocate Buffer\n"); 1782d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy return -ENOMEM; 1783d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy } 1784d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy 1785d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "Statistics_TX_Error:\n"); 1786d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "%s:\t\t\t\t%u\n", 1787d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy iwl_get_tx_fail_reason(TX_STATUS_POSTPONE_DELAY), 1788898ed67be047d0762cc7592f67bf1313dff53ca9Wey-Yi Guy priv->reply_tx_stats.pp_delay); 1789d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "%s:\t\t\t%u\n", 1790d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy iwl_get_tx_fail_reason(TX_STATUS_POSTPONE_FEW_BYTES), 1791898ed67be047d0762cc7592f67bf1313dff53ca9Wey-Yi Guy priv->reply_tx_stats.pp_few_bytes); 1792d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "%s:\t\t\t%u\n", 1793d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy iwl_get_tx_fail_reason(TX_STATUS_POSTPONE_BT_PRIO), 1794898ed67be047d0762cc7592f67bf1313dff53ca9Wey-Yi Guy priv->reply_tx_stats.pp_bt_prio); 1795d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "%s:\t\t\t%u\n", 1796d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy iwl_get_tx_fail_reason(TX_STATUS_POSTPONE_QUIET_PERIOD), 1797898ed67be047d0762cc7592f67bf1313dff53ca9Wey-Yi Guy priv->reply_tx_stats.pp_quiet_period); 1798d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "%s:\t\t\t%u\n", 1799d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy iwl_get_tx_fail_reason(TX_STATUS_POSTPONE_CALC_TTAK), 1800898ed67be047d0762cc7592f67bf1313dff53ca9Wey-Yi Guy priv->reply_tx_stats.pp_calc_ttak); 1801d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "%s:\t\t%u\n", 1802d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy iwl_get_tx_fail_reason( 1803d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy TX_STATUS_FAIL_INTERNAL_CROSSED_RETRY), 1804898ed67be047d0762cc7592f67bf1313dff53ca9Wey-Yi Guy priv->reply_tx_stats.int_crossed_retry); 1805d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "%s:\t\t\t%u\n", 1806d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy iwl_get_tx_fail_reason(TX_STATUS_FAIL_SHORT_LIMIT), 1807898ed67be047d0762cc7592f67bf1313dff53ca9Wey-Yi Guy priv->reply_tx_stats.short_limit); 1808d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "%s:\t\t\t%u\n", 1809d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy iwl_get_tx_fail_reason(TX_STATUS_FAIL_LONG_LIMIT), 1810898ed67be047d0762cc7592f67bf1313dff53ca9Wey-Yi Guy priv->reply_tx_stats.long_limit); 1811d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "%s:\t\t\t%u\n", 1812d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy iwl_get_tx_fail_reason(TX_STATUS_FAIL_FIFO_UNDERRUN), 1813898ed67be047d0762cc7592f67bf1313dff53ca9Wey-Yi Guy priv->reply_tx_stats.fifo_underrun); 1814d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "%s:\t\t\t%u\n", 1815d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy iwl_get_tx_fail_reason(TX_STATUS_FAIL_DRAIN_FLOW), 1816898ed67be047d0762cc7592f67bf1313dff53ca9Wey-Yi Guy priv->reply_tx_stats.drain_flow); 1817d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "%s:\t\t\t%u\n", 1818d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy iwl_get_tx_fail_reason(TX_STATUS_FAIL_RFKILL_FLUSH), 1819898ed67be047d0762cc7592f67bf1313dff53ca9Wey-Yi Guy priv->reply_tx_stats.rfkill_flush); 1820d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "%s:\t\t\t%u\n", 1821d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy iwl_get_tx_fail_reason(TX_STATUS_FAIL_LIFE_EXPIRE), 1822898ed67be047d0762cc7592f67bf1313dff53ca9Wey-Yi Guy priv->reply_tx_stats.life_expire); 1823d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "%s:\t\t\t%u\n", 1824d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy iwl_get_tx_fail_reason(TX_STATUS_FAIL_DEST_PS), 1825898ed67be047d0762cc7592f67bf1313dff53ca9Wey-Yi Guy priv->reply_tx_stats.dest_ps); 1826d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "%s:\t\t\t%u\n", 1827d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy iwl_get_tx_fail_reason(TX_STATUS_FAIL_HOST_ABORTED), 1828898ed67be047d0762cc7592f67bf1313dff53ca9Wey-Yi Guy priv->reply_tx_stats.host_abort); 1829d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "%s:\t\t\t%u\n", 1830d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy iwl_get_tx_fail_reason(TX_STATUS_FAIL_BT_RETRY), 1831898ed67be047d0762cc7592f67bf1313dff53ca9Wey-Yi Guy priv->reply_tx_stats.pp_delay); 1832d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "%s:\t\t\t%u\n", 1833d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy iwl_get_tx_fail_reason(TX_STATUS_FAIL_STA_INVALID), 1834898ed67be047d0762cc7592f67bf1313dff53ca9Wey-Yi Guy priv->reply_tx_stats.sta_invalid); 1835d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "%s:\t\t\t%u\n", 1836d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy iwl_get_tx_fail_reason(TX_STATUS_FAIL_FRAG_DROPPED), 1837898ed67be047d0762cc7592f67bf1313dff53ca9Wey-Yi Guy priv->reply_tx_stats.frag_drop); 1838d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "%s:\t\t\t%u\n", 1839d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy iwl_get_tx_fail_reason(TX_STATUS_FAIL_TID_DISABLE), 1840898ed67be047d0762cc7592f67bf1313dff53ca9Wey-Yi Guy priv->reply_tx_stats.tid_disable); 1841d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "%s:\t\t\t%u\n", 1842d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy iwl_get_tx_fail_reason(TX_STATUS_FAIL_FIFO_FLUSHED), 1843898ed67be047d0762cc7592f67bf1313dff53ca9Wey-Yi Guy priv->reply_tx_stats.fifo_flush); 1844d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "%s:\t\t%u\n", 1845d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy iwl_get_tx_fail_reason( 1846d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy TX_STATUS_FAIL_INSUFFICIENT_CF_POLL), 1847898ed67be047d0762cc7592f67bf1313dff53ca9Wey-Yi Guy priv->reply_tx_stats.insuff_cf_poll); 1848d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "%s:\t\t\t%u\n", 1849d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy iwl_get_tx_fail_reason(TX_STATUS_FAIL_PASSIVE_NO_RX), 1850898ed67be047d0762cc7592f67bf1313dff53ca9Wey-Yi Guy priv->reply_tx_stats.fail_hw_drop); 1851d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "%s:\t\t%u\n", 1852d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy iwl_get_tx_fail_reason( 1853d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy TX_STATUS_FAIL_NO_BEACON_ON_RADAR), 1854898ed67be047d0762cc7592f67bf1313dff53ca9Wey-Yi Guy priv->reply_tx_stats.sta_color_mismatch); 1855d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "UNKNOWN:\t\t\t%u\n", 1856898ed67be047d0762cc7592f67bf1313dff53ca9Wey-Yi Guy priv->reply_tx_stats.unknown); 1857d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy 1858d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1859d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy "\nStatistics_Agg_TX_Error:\n"); 1860d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy 1861d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "%s:\t\t\t%u\n", 1862d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy iwl_get_agg_tx_fail_reason(AGG_TX_STATE_UNDERRUN_MSK), 1863898ed67be047d0762cc7592f67bf1313dff53ca9Wey-Yi Guy priv->reply_agg_tx_stats.underrun); 1864d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "%s:\t\t\t%u\n", 1865d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy iwl_get_agg_tx_fail_reason(AGG_TX_STATE_BT_PRIO_MSK), 1866898ed67be047d0762cc7592f67bf1313dff53ca9Wey-Yi Guy priv->reply_agg_tx_stats.bt_prio); 1867d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "%s:\t\t\t%u\n", 1868d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy iwl_get_agg_tx_fail_reason(AGG_TX_STATE_FEW_BYTES_MSK), 1869898ed67be047d0762cc7592f67bf1313dff53ca9Wey-Yi Guy priv->reply_agg_tx_stats.few_bytes); 1870d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "%s:\t\t\t%u\n", 1871d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy iwl_get_agg_tx_fail_reason(AGG_TX_STATE_ABORT_MSK), 1872898ed67be047d0762cc7592f67bf1313dff53ca9Wey-Yi Guy priv->reply_agg_tx_stats.abort); 1873d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "%s:\t\t%u\n", 1874d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy iwl_get_agg_tx_fail_reason( 1875d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy AGG_TX_STATE_LAST_SENT_TTL_MSK), 1876898ed67be047d0762cc7592f67bf1313dff53ca9Wey-Yi Guy priv->reply_agg_tx_stats.last_sent_ttl); 1877d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "%s:\t\t%u\n", 1878d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy iwl_get_agg_tx_fail_reason( 1879d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy AGG_TX_STATE_LAST_SENT_TRY_CNT_MSK), 1880898ed67be047d0762cc7592f67bf1313dff53ca9Wey-Yi Guy priv->reply_agg_tx_stats.last_sent_try); 1881d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "%s:\t\t%u\n", 1882d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy iwl_get_agg_tx_fail_reason( 1883d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy AGG_TX_STATE_LAST_SENT_BT_KILL_MSK), 1884898ed67be047d0762cc7592f67bf1313dff53ca9Wey-Yi Guy priv->reply_agg_tx_stats.last_sent_bt_kill); 1885d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "%s:\t\t\t%u\n", 1886d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy iwl_get_agg_tx_fail_reason(AGG_TX_STATE_SCD_QUERY_MSK), 1887898ed67be047d0762cc7592f67bf1313dff53ca9Wey-Yi Guy priv->reply_agg_tx_stats.scd_query); 1888d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "%s:\t\t%u\n", 1889d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy iwl_get_agg_tx_fail_reason( 1890d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy AGG_TX_STATE_TEST_BAD_CRC32_MSK), 1891898ed67be047d0762cc7592f67bf1313dff53ca9Wey-Yi Guy priv->reply_agg_tx_stats.bad_crc32); 1892d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "%s:\t\t\t%u\n", 1893d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy iwl_get_agg_tx_fail_reason(AGG_TX_STATE_RESPONSE_MSK), 1894898ed67be047d0762cc7592f67bf1313dff53ca9Wey-Yi Guy priv->reply_agg_tx_stats.response); 1895d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "%s:\t\t\t%u\n", 1896d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy iwl_get_agg_tx_fail_reason(AGG_TX_STATE_DUMP_TX_MSK), 1897898ed67be047d0762cc7592f67bf1313dff53ca9Wey-Yi Guy priv->reply_agg_tx_stats.dump_tx); 1898d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "%s:\t\t\t%u\n", 1899d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy iwl_get_agg_tx_fail_reason(AGG_TX_STATE_DELAY_TX_MSK), 1900898ed67be047d0762cc7592f67bf1313dff53ca9Wey-Yi Guy priv->reply_agg_tx_stats.delay_tx); 1901d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "UNKNOWN:\t\t\t%u\n", 1902898ed67be047d0762cc7592f67bf1313dff53ca9Wey-Yi Guy priv->reply_agg_tx_stats.unknown); 1903d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy 1904d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy ret = simple_read_from_buffer(user_buf, count, ppos, buf, pos); 1905d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy kfree(buf); 1906d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy return ret; 1907e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guy} 1908e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guy 19095225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guystatic ssize_t iwl_dbgfs_sensitivity_read(struct file *file, 19105225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy char __user *user_buf, 19115225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy size_t count, loff_t *ppos) { 19125225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy 191328f63a4bb744ea81030219aba2337fddb10b380bH Hartley Sweeten struct iwl_priv *priv = file->private_data; 19145225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy int pos = 0; 19155225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy int cnt = 0; 19165225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy char *buf; 19175225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy int bufsz = sizeof(struct iwl_sensitivity_data) * 4 + 100; 19185225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy ssize_t ret; 19195225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy struct iwl_sensitivity_data *data; 19205225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy 19215225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy data = &priv->sensitivity_data; 19225225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy buf = kzalloc(bufsz, GFP_KERNEL); 19235225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy if (!buf) { 19245225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy IWL_ERR(priv, "Can not allocate Buffer\n"); 19255225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy return -ENOMEM; 19265225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy } 19275225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy 19285225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "auto_corr_ofdm:\t\t\t %u\n", 19295225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy data->auto_corr_ofdm); 19305225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 19315225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy "auto_corr_ofdm_mrc:\t\t %u\n", 19325225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy data->auto_corr_ofdm_mrc); 19335225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "auto_corr_ofdm_x1:\t\t %u\n", 19345225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy data->auto_corr_ofdm_x1); 19355225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 19365225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy "auto_corr_ofdm_mrc_x1:\t\t %u\n", 19375225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy data->auto_corr_ofdm_mrc_x1); 19385225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "auto_corr_cck:\t\t\t %u\n", 19395225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy data->auto_corr_cck); 19405225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "auto_corr_cck_mrc:\t\t %u\n", 19415225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy data->auto_corr_cck_mrc); 19425225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 19435225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy "last_bad_plcp_cnt_ofdm:\t\t %u\n", 19445225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy data->last_bad_plcp_cnt_ofdm); 19455225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "last_fa_cnt_ofdm:\t\t %u\n", 19465225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy data->last_fa_cnt_ofdm); 19475225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 19485225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy "last_bad_plcp_cnt_cck:\t\t %u\n", 19495225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy data->last_bad_plcp_cnt_cck); 19505225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "last_fa_cnt_cck:\t\t %u\n", 19515225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy data->last_fa_cnt_cck); 19525225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "nrg_curr_state:\t\t\t %u\n", 19535225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy data->nrg_curr_state); 19545225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "nrg_prev_state:\t\t\t %u\n", 19555225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy data->nrg_prev_state); 19565225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "nrg_value:\t\t\t"); 19575225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy for (cnt = 0; cnt < 10; cnt++) { 19585225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, " %u", 19595225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy data->nrg_value[cnt]); 19605225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy } 19615225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "\n"); 19625225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "nrg_silence_rssi:\t\t"); 19635225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy for (cnt = 0; cnt < NRG_NUM_PREV_STAT_L; cnt++) { 19645225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, " %u", 19655225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy data->nrg_silence_rssi[cnt]); 19665225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy } 19675225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "\n"); 19685225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "nrg_silence_ref:\t\t %u\n", 19695225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy data->nrg_silence_ref); 19705225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "nrg_energy_idx:\t\t\t %u\n", 19715225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy data->nrg_energy_idx); 19725225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "nrg_silence_idx:\t\t %u\n", 19735225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy data->nrg_silence_idx); 19745225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "nrg_th_cck:\t\t\t %u\n", 19755225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy data->nrg_th_cck); 19765225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 19775225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy "nrg_auto_corr_silence_diff:\t %u\n", 19785225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy data->nrg_auto_corr_silence_diff); 19795225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "num_in_cck_no_fa:\t\t %u\n", 19805225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy data->num_in_cck_no_fa); 19815225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "nrg_th_ofdm:\t\t\t %u\n", 19825225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy data->nrg_th_ofdm); 19835225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy 19845225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy ret = simple_read_from_buffer(user_buf, count, ppos, buf, pos); 19855225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy kfree(buf); 19865225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy return ret; 19875225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy} 19885225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy 19895225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy 19905225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guystatic ssize_t iwl_dbgfs_chain_noise_read(struct file *file, 19915225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy char __user *user_buf, 19925225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy size_t count, loff_t *ppos) { 19935225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy 199428f63a4bb744ea81030219aba2337fddb10b380bH Hartley Sweeten struct iwl_priv *priv = file->private_data; 19955225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy int pos = 0; 19965225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy int cnt = 0; 19975225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy char *buf; 19985225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy int bufsz = sizeof(struct iwl_chain_noise_data) * 4 + 100; 19995225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy ssize_t ret; 20005225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy struct iwl_chain_noise_data *data; 20015225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy 20025225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy data = &priv->chain_noise_data; 20035225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy buf = kzalloc(bufsz, GFP_KERNEL); 20045225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy if (!buf) { 20055225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy IWL_ERR(priv, "Can not allocate Buffer\n"); 20065225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy return -ENOMEM; 20075225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy } 20085225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy 20095225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "active_chains:\t\t\t %u\n", 20105225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy data->active_chains); 20115225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "chain_noise_a:\t\t\t %u\n", 20125225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy data->chain_noise_a); 20135225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "chain_noise_b:\t\t\t %u\n", 20145225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy data->chain_noise_b); 20155225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "chain_noise_c:\t\t\t %u\n", 20165225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy data->chain_noise_c); 20175225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "chain_signal_a:\t\t\t %u\n", 20185225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy data->chain_signal_a); 20195225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "chain_signal_b:\t\t\t %u\n", 20205225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy data->chain_signal_b); 20215225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "chain_signal_c:\t\t\t %u\n", 20225225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy data->chain_signal_c); 20235225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "beacon_count:\t\t\t %u\n", 20245225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy data->beacon_count); 20255225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy 20265225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "disconn_array:\t\t\t"); 20275225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy for (cnt = 0; cnt < NUM_RX_CHAINS; cnt++) { 20285225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, " %u", 20295225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy data->disconn_array[cnt]); 20305225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy } 20315225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "\n"); 20325225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "delta_gain_code:\t\t"); 20335225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy for (cnt = 0; cnt < NUM_RX_CHAINS; cnt++) { 20345225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, " %u", 20355225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy data->delta_gain_code[cnt]); 20365225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy } 20375225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "\n"); 20385225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "radio_write:\t\t\t %u\n", 20395225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy data->radio_write); 20405225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "state:\t\t\t\t %u\n", 20415225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy data->state); 20425225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy 20435225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy ret = simple_read_from_buffer(user_buf, count, ppos, buf, pos); 20445225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy kfree(buf); 20455225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy return ret; 20465225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy} 20475225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy 2048c09430abed4159e5c56aaea257d040f7452daba6Wey-Yi Guystatic ssize_t iwl_dbgfs_power_save_status_read(struct file *file, 2049c09430abed4159e5c56aaea257d040f7452daba6Wey-Yi Guy char __user *user_buf, 2050c09430abed4159e5c56aaea257d040f7452daba6Wey-Yi Guy size_t count, loff_t *ppos) 2051c09430abed4159e5c56aaea257d040f7452daba6Wey-Yi Guy{ 205228f63a4bb744ea81030219aba2337fddb10b380bH Hartley Sweeten struct iwl_priv *priv = file->private_data; 2053c09430abed4159e5c56aaea257d040f7452daba6Wey-Yi Guy char buf[60]; 2054c09430abed4159e5c56aaea257d040f7452daba6Wey-Yi Guy int pos = 0; 2055c09430abed4159e5c56aaea257d040f7452daba6Wey-Yi Guy const size_t bufsz = sizeof(buf); 2056c09430abed4159e5c56aaea257d040f7452daba6Wey-Yi Guy u32 pwrsave_status; 2057c09430abed4159e5c56aaea257d040f7452daba6Wey-Yi Guy 205883ed90155f98bd949735c2cc22d832b557a6d7d1Emmanuel Grumbach pwrsave_status = iwl_read32(bus(priv), CSR_GP_CNTRL) & 2059c09430abed4159e5c56aaea257d040f7452daba6Wey-Yi Guy CSR_GP_REG_POWER_SAVE_STATUS_MSK; 2060c09430abed4159e5c56aaea257d040f7452daba6Wey-Yi Guy 2061c09430abed4159e5c56aaea257d040f7452daba6Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "Power Save Status: "); 2062c09430abed4159e5c56aaea257d040f7452daba6Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "%s\n", 2063c09430abed4159e5c56aaea257d040f7452daba6Wey-Yi Guy (pwrsave_status == CSR_GP_REG_NO_POWER_SAVE) ? "none" : 2064c09430abed4159e5c56aaea257d040f7452daba6Wey-Yi Guy (pwrsave_status == CSR_GP_REG_MAC_POWER_SAVE) ? "MAC" : 2065c09430abed4159e5c56aaea257d040f7452daba6Wey-Yi Guy (pwrsave_status == CSR_GP_REG_PHY_POWER_SAVE) ? "PHY" : 2066c09430abed4159e5c56aaea257d040f7452daba6Wey-Yi Guy "error"); 2067c09430abed4159e5c56aaea257d040f7452daba6Wey-Yi Guy 2068c09430abed4159e5c56aaea257d040f7452daba6Wey-Yi Guy return simple_read_from_buffer(user_buf, count, ppos, buf, pos); 2069c09430abed4159e5c56aaea257d040f7452daba6Wey-Yi Guy} 2070c09430abed4159e5c56aaea257d040f7452daba6Wey-Yi Guy 20717163b8a4ec995dabda3e92c6fed7b8600060618cWey-Yi Guystatic ssize_t iwl_dbgfs_clear_ucode_statistics_write(struct file *file, 2072ef8d5529b015d4c5db7fad1adfc91edfd5abad56Wey-Yi Guy const char __user *user_buf, 2073ef8d5529b015d4c5db7fad1adfc91edfd5abad56Wey-Yi Guy size_t count, loff_t *ppos) 2074ef8d5529b015d4c5db7fad1adfc91edfd5abad56Wey-Yi Guy{ 2075ef8d5529b015d4c5db7fad1adfc91edfd5abad56Wey-Yi Guy struct iwl_priv *priv = file->private_data; 2076ef8d5529b015d4c5db7fad1adfc91edfd5abad56Wey-Yi Guy char buf[8]; 2077ef8d5529b015d4c5db7fad1adfc91edfd5abad56Wey-Yi Guy int buf_size; 2078ef8d5529b015d4c5db7fad1adfc91edfd5abad56Wey-Yi Guy int clear; 2079ef8d5529b015d4c5db7fad1adfc91edfd5abad56Wey-Yi Guy 2080ef8d5529b015d4c5db7fad1adfc91edfd5abad56Wey-Yi Guy memset(buf, 0, sizeof(buf)); 2081ef8d5529b015d4c5db7fad1adfc91edfd5abad56Wey-Yi Guy buf_size = min(count, sizeof(buf) - 1); 2082ef8d5529b015d4c5db7fad1adfc91edfd5abad56Wey-Yi Guy if (copy_from_user(buf, user_buf, buf_size)) 2083ef8d5529b015d4c5db7fad1adfc91edfd5abad56Wey-Yi Guy return -EFAULT; 2084ef8d5529b015d4c5db7fad1adfc91edfd5abad56Wey-Yi Guy if (sscanf(buf, "%d", &clear) != 1) 2085ef8d5529b015d4c5db7fad1adfc91edfd5abad56Wey-Yi Guy return -EFAULT; 2086ef8d5529b015d4c5db7fad1adfc91edfd5abad56Wey-Yi Guy 2087ef8d5529b015d4c5db7fad1adfc91edfd5abad56Wey-Yi Guy /* make request to uCode to retrieve statistics information */ 20886ac2f839b0b21225a65f41802c5f0df5eff4f16cEmmanuel Grumbach mutex_lock(&priv->shrd->mutex); 2089ef8d5529b015d4c5db7fad1adfc91edfd5abad56Wey-Yi Guy iwl_send_statistics_request(priv, CMD_SYNC, true); 20906ac2f839b0b21225a65f41802c5f0df5eff4f16cEmmanuel Grumbach mutex_unlock(&priv->shrd->mutex); 2091ef8d5529b015d4c5db7fad1adfc91edfd5abad56Wey-Yi Guy 2092ef8d5529b015d4c5db7fad1adfc91edfd5abad56Wey-Yi Guy return count; 2093ef8d5529b015d4c5db7fad1adfc91edfd5abad56Wey-Yi Guy} 2094ef8d5529b015d4c5db7fad1adfc91edfd5abad56Wey-Yi Guy 2095a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guystatic ssize_t iwl_dbgfs_ucode_tracing_read(struct file *file, 2096a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy char __user *user_buf, 2097a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy size_t count, loff_t *ppos) { 2098a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy 209957674308d00b5ebb639ce53d388e61728e0c7f72Joe Perches struct iwl_priv *priv = file->private_data; 2100a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy int pos = 0; 2101a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy char buf[128]; 2102a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy const size_t bufsz = sizeof(buf); 2103a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy 2104a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "ucode trace timer is %s\n", 2105a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy priv->event_log.ucode_trace ? "On" : "Off"); 2106a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "non_wraps_count:\t\t %u\n", 2107a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy priv->event_log.non_wraps_count); 2108a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "wraps_once_count:\t\t %u\n", 2109a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy priv->event_log.wraps_once_count); 2110a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "wraps_more_count:\t\t %u\n", 2111a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy priv->event_log.wraps_more_count); 2112a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy 21134967c31677cf3c6c49aadf205f1a31d15d7610daWey-Yi Guy return simple_read_from_buffer(user_buf, count, ppos, buf, pos); 2114a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy} 2115a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy 2116a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guystatic ssize_t iwl_dbgfs_ucode_tracing_write(struct file *file, 2117a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy const char __user *user_buf, 2118a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy size_t count, loff_t *ppos) 2119a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy{ 2120a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy struct iwl_priv *priv = file->private_data; 2121a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy char buf[8]; 2122a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy int buf_size; 2123a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy int trace; 2124a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy 2125a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy memset(buf, 0, sizeof(buf)); 2126a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy buf_size = min(count, sizeof(buf) - 1); 2127a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy if (copy_from_user(buf, user_buf, buf_size)) 2128a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy return -EFAULT; 2129a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy if (sscanf(buf, "%d", &trace) != 1) 2130a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy return -EFAULT; 2131a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy 2132a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy if (trace) { 2133a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy priv->event_log.ucode_trace = true; 2134a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy /* schedule the ucode timer to occur in UCODE_TRACE_PERIOD */ 2135a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy mod_timer(&priv->ucode_trace, 2136a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy jiffies + msecs_to_jiffies(UCODE_TRACE_PERIOD)); 2137a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy } else { 2138a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy priv->event_log.ucode_trace = false; 2139a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy del_timer_sync(&priv->ucode_trace); 2140a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy } 2141a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy 2142a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy return count; 2143a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy} 2144a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy 214560987206cba0dbb547bce2d23c3a3338c5aaf5acJohannes Bergstatic ssize_t iwl_dbgfs_rxon_flags_read(struct file *file, 214660987206cba0dbb547bce2d23c3a3338c5aaf5acJohannes Berg char __user *user_buf, 214760987206cba0dbb547bce2d23c3a3338c5aaf5acJohannes Berg size_t count, loff_t *ppos) { 214860987206cba0dbb547bce2d23c3a3338c5aaf5acJohannes Berg 214957674308d00b5ebb639ce53d388e61728e0c7f72Joe Perches struct iwl_priv *priv = file->private_data; 215060987206cba0dbb547bce2d23c3a3338c5aaf5acJohannes Berg int len = 0; 215160987206cba0dbb547bce2d23c3a3338c5aaf5acJohannes Berg char buf[20]; 215260987206cba0dbb547bce2d23c3a3338c5aaf5acJohannes Berg 2153246ed355221076884d225f9d8a4c30a048be8162Johannes Berg len = sprintf(buf, "0x%04X\n", 2154246ed355221076884d225f9d8a4c30a048be8162Johannes Berg le32_to_cpu(priv->contexts[IWL_RXON_CTX_BSS].active.flags)); 215560987206cba0dbb547bce2d23c3a3338c5aaf5acJohannes Berg return simple_read_from_buffer(user_buf, count, ppos, buf, len); 215660987206cba0dbb547bce2d23c3a3338c5aaf5acJohannes Berg} 215760987206cba0dbb547bce2d23c3a3338c5aaf5acJohannes Berg 215860987206cba0dbb547bce2d23c3a3338c5aaf5acJohannes Bergstatic ssize_t iwl_dbgfs_rxon_filter_flags_read(struct file *file, 215960987206cba0dbb547bce2d23c3a3338c5aaf5acJohannes Berg char __user *user_buf, 216060987206cba0dbb547bce2d23c3a3338c5aaf5acJohannes Berg size_t count, loff_t *ppos) { 216160987206cba0dbb547bce2d23c3a3338c5aaf5acJohannes Berg 216257674308d00b5ebb639ce53d388e61728e0c7f72Joe Perches struct iwl_priv *priv = file->private_data; 216360987206cba0dbb547bce2d23c3a3338c5aaf5acJohannes Berg int len = 0; 216460987206cba0dbb547bce2d23c3a3338c5aaf5acJohannes Berg char buf[20]; 216560987206cba0dbb547bce2d23c3a3338c5aaf5acJohannes Berg 216660987206cba0dbb547bce2d23c3a3338c5aaf5acJohannes Berg len = sprintf(buf, "0x%04X\n", 2167246ed355221076884d225f9d8a4c30a048be8162Johannes Berg le32_to_cpu(priv->contexts[IWL_RXON_CTX_BSS].active.filter_flags)); 216860987206cba0dbb547bce2d23c3a3338c5aaf5acJohannes Berg return simple_read_from_buffer(user_buf, count, ppos, buf, len); 216960987206cba0dbb547bce2d23c3a3338c5aaf5acJohannes Berg} 217060987206cba0dbb547bce2d23c3a3338c5aaf5acJohannes Berg 2171a13d276f1e49ae0bc4ad18ce8ea3c90656c9e8d4Wey-Yi Guystatic ssize_t iwl_dbgfs_missed_beacon_read(struct file *file, 2172a13d276f1e49ae0bc4ad18ce8ea3c90656c9e8d4Wey-Yi Guy char __user *user_buf, 2173a13d276f1e49ae0bc4ad18ce8ea3c90656c9e8d4Wey-Yi Guy size_t count, loff_t *ppos) { 2174a13d276f1e49ae0bc4ad18ce8ea3c90656c9e8d4Wey-Yi Guy 2175a13d276f1e49ae0bc4ad18ce8ea3c90656c9e8d4Wey-Yi Guy struct iwl_priv *priv = file->private_data; 2176a13d276f1e49ae0bc4ad18ce8ea3c90656c9e8d4Wey-Yi Guy int pos = 0; 2177a13d276f1e49ae0bc4ad18ce8ea3c90656c9e8d4Wey-Yi Guy char buf[12]; 2178a13d276f1e49ae0bc4ad18ce8ea3c90656c9e8d4Wey-Yi Guy const size_t bufsz = sizeof(buf); 2179a13d276f1e49ae0bc4ad18ce8ea3c90656c9e8d4Wey-Yi Guy 2180a13d276f1e49ae0bc4ad18ce8ea3c90656c9e8d4Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "%d\n", 2181a13d276f1e49ae0bc4ad18ce8ea3c90656c9e8d4Wey-Yi Guy priv->missed_beacon_threshold); 2182a13d276f1e49ae0bc4ad18ce8ea3c90656c9e8d4Wey-Yi Guy 21834967c31677cf3c6c49aadf205f1a31d15d7610daWey-Yi Guy return simple_read_from_buffer(user_buf, count, ppos, buf, pos); 2184a13d276f1e49ae0bc4ad18ce8ea3c90656c9e8d4Wey-Yi Guy} 2185a13d276f1e49ae0bc4ad18ce8ea3c90656c9e8d4Wey-Yi Guy 2186a13d276f1e49ae0bc4ad18ce8ea3c90656c9e8d4Wey-Yi Guystatic ssize_t iwl_dbgfs_missed_beacon_write(struct file *file, 2187a13d276f1e49ae0bc4ad18ce8ea3c90656c9e8d4Wey-Yi Guy const char __user *user_buf, 2188a13d276f1e49ae0bc4ad18ce8ea3c90656c9e8d4Wey-Yi Guy size_t count, loff_t *ppos) 2189a13d276f1e49ae0bc4ad18ce8ea3c90656c9e8d4Wey-Yi Guy{ 2190a13d276f1e49ae0bc4ad18ce8ea3c90656c9e8d4Wey-Yi Guy struct iwl_priv *priv = file->private_data; 2191a13d276f1e49ae0bc4ad18ce8ea3c90656c9e8d4Wey-Yi Guy char buf[8]; 2192a13d276f1e49ae0bc4ad18ce8ea3c90656c9e8d4Wey-Yi Guy int buf_size; 2193a13d276f1e49ae0bc4ad18ce8ea3c90656c9e8d4Wey-Yi Guy int missed; 2194a13d276f1e49ae0bc4ad18ce8ea3c90656c9e8d4Wey-Yi Guy 2195a13d276f1e49ae0bc4ad18ce8ea3c90656c9e8d4Wey-Yi Guy memset(buf, 0, sizeof(buf)); 2196a13d276f1e49ae0bc4ad18ce8ea3c90656c9e8d4Wey-Yi Guy buf_size = min(count, sizeof(buf) - 1); 2197a13d276f1e49ae0bc4ad18ce8ea3c90656c9e8d4Wey-Yi Guy if (copy_from_user(buf, user_buf, buf_size)) 2198a13d276f1e49ae0bc4ad18ce8ea3c90656c9e8d4Wey-Yi Guy return -EFAULT; 2199a13d276f1e49ae0bc4ad18ce8ea3c90656c9e8d4Wey-Yi Guy if (sscanf(buf, "%d", &missed) != 1) 2200a13d276f1e49ae0bc4ad18ce8ea3c90656c9e8d4Wey-Yi Guy return -EINVAL; 2201a13d276f1e49ae0bc4ad18ce8ea3c90656c9e8d4Wey-Yi Guy 2202a13d276f1e49ae0bc4ad18ce8ea3c90656c9e8d4Wey-Yi Guy if (missed < IWL_MISSED_BEACON_THRESHOLD_MIN || 2203a13d276f1e49ae0bc4ad18ce8ea3c90656c9e8d4Wey-Yi Guy missed > IWL_MISSED_BEACON_THRESHOLD_MAX) 2204a13d276f1e49ae0bc4ad18ce8ea3c90656c9e8d4Wey-Yi Guy priv->missed_beacon_threshold = 2205a13d276f1e49ae0bc4ad18ce8ea3c90656c9e8d4Wey-Yi Guy IWL_MISSED_BEACON_THRESHOLD_DEF; 2206a13d276f1e49ae0bc4ad18ce8ea3c90656c9e8d4Wey-Yi Guy else 2207a13d276f1e49ae0bc4ad18ce8ea3c90656c9e8d4Wey-Yi Guy priv->missed_beacon_threshold = missed; 2208a13d276f1e49ae0bc4ad18ce8ea3c90656c9e8d4Wey-Yi Guy 2209a13d276f1e49ae0bc4ad18ce8ea3c90656c9e8d4Wey-Yi Guy return count; 2210a13d276f1e49ae0bc4ad18ce8ea3c90656c9e8d4Wey-Yi Guy} 2211a13d276f1e49ae0bc4ad18ce8ea3c90656c9e8d4Wey-Yi Guy 22123e4fb5faefb57824f2e42305b3d5907845af978cTrieu 'Andrew' Nguyenstatic ssize_t iwl_dbgfs_plcp_delta_read(struct file *file, 22133e4fb5faefb57824f2e42305b3d5907845af978cTrieu 'Andrew' Nguyen char __user *user_buf, 22143e4fb5faefb57824f2e42305b3d5907845af978cTrieu 'Andrew' Nguyen size_t count, loff_t *ppos) { 22153e4fb5faefb57824f2e42305b3d5907845af978cTrieu 'Andrew' Nguyen 221657674308d00b5ebb639ce53d388e61728e0c7f72Joe Perches struct iwl_priv *priv = file->private_data; 22173e4fb5faefb57824f2e42305b3d5907845af978cTrieu 'Andrew' Nguyen int pos = 0; 22183e4fb5faefb57824f2e42305b3d5907845af978cTrieu 'Andrew' Nguyen char buf[12]; 22193e4fb5faefb57824f2e42305b3d5907845af978cTrieu 'Andrew' Nguyen const size_t bufsz = sizeof(buf); 22203e4fb5faefb57824f2e42305b3d5907845af978cTrieu 'Andrew' Nguyen 22213e4fb5faefb57824f2e42305b3d5907845af978cTrieu 'Andrew' Nguyen pos += scnprintf(buf + pos, bufsz - pos, "%u\n", 22223862241945026a8fa165ab73c57739df77b8e1fbDon Fry cfg(priv)->base_params->plcp_delta_threshold); 22233e4fb5faefb57824f2e42305b3d5907845af978cTrieu 'Andrew' Nguyen 22244967c31677cf3c6c49aadf205f1a31d15d7610daWey-Yi Guy return simple_read_from_buffer(user_buf, count, ppos, buf, pos); 22253e4fb5faefb57824f2e42305b3d5907845af978cTrieu 'Andrew' Nguyen} 22263e4fb5faefb57824f2e42305b3d5907845af978cTrieu 'Andrew' Nguyen 22273e4fb5faefb57824f2e42305b3d5907845af978cTrieu 'Andrew' Nguyenstatic ssize_t iwl_dbgfs_plcp_delta_write(struct file *file, 22283e4fb5faefb57824f2e42305b3d5907845af978cTrieu 'Andrew' Nguyen const char __user *user_buf, 22293e4fb5faefb57824f2e42305b3d5907845af978cTrieu 'Andrew' Nguyen size_t count, loff_t *ppos) { 22303e4fb5faefb57824f2e42305b3d5907845af978cTrieu 'Andrew' Nguyen 22313e4fb5faefb57824f2e42305b3d5907845af978cTrieu 'Andrew' Nguyen struct iwl_priv *priv = file->private_data; 22323e4fb5faefb57824f2e42305b3d5907845af978cTrieu 'Andrew' Nguyen char buf[8]; 22333e4fb5faefb57824f2e42305b3d5907845af978cTrieu 'Andrew' Nguyen int buf_size; 22343e4fb5faefb57824f2e42305b3d5907845af978cTrieu 'Andrew' Nguyen int plcp; 22353e4fb5faefb57824f2e42305b3d5907845af978cTrieu 'Andrew' Nguyen 22363e4fb5faefb57824f2e42305b3d5907845af978cTrieu 'Andrew' Nguyen memset(buf, 0, sizeof(buf)); 22373e4fb5faefb57824f2e42305b3d5907845af978cTrieu 'Andrew' Nguyen buf_size = min(count, sizeof(buf) - 1); 22383e4fb5faefb57824f2e42305b3d5907845af978cTrieu 'Andrew' Nguyen if (copy_from_user(buf, user_buf, buf_size)) 22393e4fb5faefb57824f2e42305b3d5907845af978cTrieu 'Andrew' Nguyen return -EFAULT; 22403e4fb5faefb57824f2e42305b3d5907845af978cTrieu 'Andrew' Nguyen if (sscanf(buf, "%d", &plcp) != 1) 22413e4fb5faefb57824f2e42305b3d5907845af978cTrieu 'Andrew' Nguyen return -EINVAL; 2242680788aca3dcc24b932eb7a4219ab921ac5bf2d0Wey-Yi Guy if ((plcp < IWL_MAX_PLCP_ERR_THRESHOLD_MIN) || 22433e4fb5faefb57824f2e42305b3d5907845af978cTrieu 'Andrew' Nguyen (plcp > IWL_MAX_PLCP_ERR_THRESHOLD_MAX)) 22443862241945026a8fa165ab73c57739df77b8e1fbDon Fry cfg(priv)->base_params->plcp_delta_threshold = 2245680788aca3dcc24b932eb7a4219ab921ac5bf2d0Wey-Yi Guy IWL_MAX_PLCP_ERR_THRESHOLD_DISABLE; 22463e4fb5faefb57824f2e42305b3d5907845af978cTrieu 'Andrew' Nguyen else 22473862241945026a8fa165ab73c57739df77b8e1fbDon Fry cfg(priv)->base_params->plcp_delta_threshold = plcp; 22483e4fb5faefb57824f2e42305b3d5907845af978cTrieu 'Andrew' Nguyen return count; 22493e4fb5faefb57824f2e42305b3d5907845af978cTrieu 'Andrew' Nguyen} 22503e4fb5faefb57824f2e42305b3d5907845af978cTrieu 'Andrew' Nguyen 2251528c3126a98e75f47fc9fa11b243c82a59271d0dWey-Yi Guystatic ssize_t iwl_dbgfs_force_reset_read(struct file *file, 2252528c3126a98e75f47fc9fa11b243c82a59271d0dWey-Yi Guy char __user *user_buf, 2253ca934b6715c134573da5acea01e9258eb0bf7c27Johannes Berg size_t count, loff_t *ppos) 2254ca934b6715c134573da5acea01e9258eb0bf7c27Johannes Berg{ 2255528c3126a98e75f47fc9fa11b243c82a59271d0dWey-Yi Guy struct iwl_priv *priv = file->private_data; 2256528c3126a98e75f47fc9fa11b243c82a59271d0dWey-Yi Guy int i, pos = 0; 2257528c3126a98e75f47fc9fa11b243c82a59271d0dWey-Yi Guy char buf[300]; 2258528c3126a98e75f47fc9fa11b243c82a59271d0dWey-Yi Guy const size_t bufsz = sizeof(buf); 2259528c3126a98e75f47fc9fa11b243c82a59271d0dWey-Yi Guy struct iwl_force_reset *force_reset; 2260528c3126a98e75f47fc9fa11b243c82a59271d0dWey-Yi Guy 2261528c3126a98e75f47fc9fa11b243c82a59271d0dWey-Yi Guy for (i = 0; i < IWL_MAX_FORCE_RESET; i++) { 2262528c3126a98e75f47fc9fa11b243c82a59271d0dWey-Yi Guy force_reset = &priv->force_reset[i]; 2263528c3126a98e75f47fc9fa11b243c82a59271d0dWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 2264528c3126a98e75f47fc9fa11b243c82a59271d0dWey-Yi Guy "Force reset method %d\n", i); 2265528c3126a98e75f47fc9fa11b243c82a59271d0dWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 2266528c3126a98e75f47fc9fa11b243c82a59271d0dWey-Yi Guy "\tnumber of reset request: %d\n", 2267528c3126a98e75f47fc9fa11b243c82a59271d0dWey-Yi Guy force_reset->reset_request_count); 2268528c3126a98e75f47fc9fa11b243c82a59271d0dWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 2269528c3126a98e75f47fc9fa11b243c82a59271d0dWey-Yi Guy "\tnumber of reset request success: %d\n", 2270528c3126a98e75f47fc9fa11b243c82a59271d0dWey-Yi Guy force_reset->reset_success_count); 2271528c3126a98e75f47fc9fa11b243c82a59271d0dWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 2272528c3126a98e75f47fc9fa11b243c82a59271d0dWey-Yi Guy "\tnumber of reset request reject: %d\n", 2273528c3126a98e75f47fc9fa11b243c82a59271d0dWey-Yi Guy force_reset->reset_reject_count); 2274528c3126a98e75f47fc9fa11b243c82a59271d0dWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 2275528c3126a98e75f47fc9fa11b243c82a59271d0dWey-Yi Guy "\treset duration: %lu\n", 2276528c3126a98e75f47fc9fa11b243c82a59271d0dWey-Yi Guy force_reset->reset_duration); 2277528c3126a98e75f47fc9fa11b243c82a59271d0dWey-Yi Guy } 2278528c3126a98e75f47fc9fa11b243c82a59271d0dWey-Yi Guy return simple_read_from_buffer(user_buf, count, ppos, buf, pos); 2279528c3126a98e75f47fc9fa11b243c82a59271d0dWey-Yi Guy} 2280528c3126a98e75f47fc9fa11b243c82a59271d0dWey-Yi Guy 228104cafd7fa74d5f70efc93bef36f118177057ff74Wey-Yi Guystatic ssize_t iwl_dbgfs_force_reset_write(struct file *file, 228204cafd7fa74d5f70efc93bef36f118177057ff74Wey-Yi Guy const char __user *user_buf, 228304cafd7fa74d5f70efc93bef36f118177057ff74Wey-Yi Guy size_t count, loff_t *ppos) { 228404cafd7fa74d5f70efc93bef36f118177057ff74Wey-Yi Guy 228504cafd7fa74d5f70efc93bef36f118177057ff74Wey-Yi Guy struct iwl_priv *priv = file->private_data; 228604cafd7fa74d5f70efc93bef36f118177057ff74Wey-Yi Guy char buf[8]; 228704cafd7fa74d5f70efc93bef36f118177057ff74Wey-Yi Guy int buf_size; 228804cafd7fa74d5f70efc93bef36f118177057ff74Wey-Yi Guy int reset, ret; 228904cafd7fa74d5f70efc93bef36f118177057ff74Wey-Yi Guy 229004cafd7fa74d5f70efc93bef36f118177057ff74Wey-Yi Guy memset(buf, 0, sizeof(buf)); 229104cafd7fa74d5f70efc93bef36f118177057ff74Wey-Yi Guy buf_size = min(count, sizeof(buf) - 1); 229204cafd7fa74d5f70efc93bef36f118177057ff74Wey-Yi Guy if (copy_from_user(buf, user_buf, buf_size)) 229304cafd7fa74d5f70efc93bef36f118177057ff74Wey-Yi Guy return -EFAULT; 229404cafd7fa74d5f70efc93bef36f118177057ff74Wey-Yi Guy if (sscanf(buf, "%d", &reset) != 1) 229504cafd7fa74d5f70efc93bef36f118177057ff74Wey-Yi Guy return -EINVAL; 229604cafd7fa74d5f70efc93bef36f118177057ff74Wey-Yi Guy switch (reset) { 229704cafd7fa74d5f70efc93bef36f118177057ff74Wey-Yi Guy case IWL_RF_RESET: 229804cafd7fa74d5f70efc93bef36f118177057ff74Wey-Yi Guy case IWL_FW_RESET: 2299c04f9f220300da83f71698fa7be24714152faf0dWey-Yi Guy ret = iwl_force_reset(priv, reset, true); 230004cafd7fa74d5f70efc93bef36f118177057ff74Wey-Yi Guy break; 230104cafd7fa74d5f70efc93bef36f118177057ff74Wey-Yi Guy default: 230204cafd7fa74d5f70efc93bef36f118177057ff74Wey-Yi Guy return -EINVAL; 230304cafd7fa74d5f70efc93bef36f118177057ff74Wey-Yi Guy } 230404cafd7fa74d5f70efc93bef36f118177057ff74Wey-Yi Guy return ret ? ret : count; 230504cafd7fa74d5f70efc93bef36f118177057ff74Wey-Yi Guy} 230604cafd7fa74d5f70efc93bef36f118177057ff74Wey-Yi Guy 23074bf49a90bc0bda131ef353cca631025849f36b4eWey-Yi Guystatic ssize_t iwl_dbgfs_txfifo_flush_write(struct file *file, 23084bf49a90bc0bda131ef353cca631025849f36b4eWey-Yi Guy const char __user *user_buf, 23094bf49a90bc0bda131ef353cca631025849f36b4eWey-Yi Guy size_t count, loff_t *ppos) { 23104bf49a90bc0bda131ef353cca631025849f36b4eWey-Yi Guy 23114bf49a90bc0bda131ef353cca631025849f36b4eWey-Yi Guy struct iwl_priv *priv = file->private_data; 23124bf49a90bc0bda131ef353cca631025849f36b4eWey-Yi Guy char buf[8]; 23134bf49a90bc0bda131ef353cca631025849f36b4eWey-Yi Guy int buf_size; 23144bf49a90bc0bda131ef353cca631025849f36b4eWey-Yi Guy int flush; 23154bf49a90bc0bda131ef353cca631025849f36b4eWey-Yi Guy 23164bf49a90bc0bda131ef353cca631025849f36b4eWey-Yi Guy memset(buf, 0, sizeof(buf)); 23174bf49a90bc0bda131ef353cca631025849f36b4eWey-Yi Guy buf_size = min(count, sizeof(buf) - 1); 23184bf49a90bc0bda131ef353cca631025849f36b4eWey-Yi Guy if (copy_from_user(buf, user_buf, buf_size)) 23194bf49a90bc0bda131ef353cca631025849f36b4eWey-Yi Guy return -EFAULT; 23204bf49a90bc0bda131ef353cca631025849f36b4eWey-Yi Guy if (sscanf(buf, "%d", &flush) != 1) 23214bf49a90bc0bda131ef353cca631025849f36b4eWey-Yi Guy return -EINVAL; 23224bf49a90bc0bda131ef353cca631025849f36b4eWey-Yi Guy 2323845a9c0d8acea87dede740bc5feb9ec2d00505d9Emmanuel Grumbach if (iwl_is_rfkill(priv->shrd)) 23244bf49a90bc0bda131ef353cca631025849f36b4eWey-Yi Guy return -EFAULT; 23254bf49a90bc0bda131ef353cca631025849f36b4eWey-Yi Guy 2326c68744fb935400964f7af4835017cad5014c8c88Wey-Yi Guy iwlagn_dev_txfifo_flush(priv, IWL_DROP_ALL); 23274bf49a90bc0bda131ef353cca631025849f36b4eWey-Yi Guy 23284bf49a90bc0bda131ef353cca631025849f36b4eWey-Yi Guy return count; 23294bf49a90bc0bda131ef353cca631025849f36b4eWey-Yi Guy} 23304bf49a90bc0bda131ef353cca631025849f36b4eWey-Yi Guy 233122de94de7de78b8de2fb1f2df5aa85b5556cfcfdStanislaw Gruszkastatic ssize_t iwl_dbgfs_wd_timeout_write(struct file *file, 23327bdc473c7a52497af9fe8c73e4745615a2825aaaWey-Yi Guy const char __user *user_buf, 2333ca934b6715c134573da5acea01e9258eb0bf7c27Johannes Berg size_t count, loff_t *ppos) 2334ca934b6715c134573da5acea01e9258eb0bf7c27Johannes Berg{ 23357bdc473c7a52497af9fe8c73e4745615a2825aaaWey-Yi Guy struct iwl_priv *priv = file->private_data; 23367bdc473c7a52497af9fe8c73e4745615a2825aaaWey-Yi Guy char buf[8]; 23377bdc473c7a52497af9fe8c73e4745615a2825aaaWey-Yi Guy int buf_size; 233822de94de7de78b8de2fb1f2df5aa85b5556cfcfdStanislaw Gruszka int timeout; 23397bdc473c7a52497af9fe8c73e4745615a2825aaaWey-Yi Guy 23407bdc473c7a52497af9fe8c73e4745615a2825aaaWey-Yi Guy memset(buf, 0, sizeof(buf)); 23417bdc473c7a52497af9fe8c73e4745615a2825aaaWey-Yi Guy buf_size = min(count, sizeof(buf) - 1); 23427bdc473c7a52497af9fe8c73e4745615a2825aaaWey-Yi Guy if (copy_from_user(buf, user_buf, buf_size)) 23437bdc473c7a52497af9fe8c73e4745615a2825aaaWey-Yi Guy return -EFAULT; 234422de94de7de78b8de2fb1f2df5aa85b5556cfcfdStanislaw Gruszka if (sscanf(buf, "%d", &timeout) != 1) 23457bdc473c7a52497af9fe8c73e4745615a2825aaaWey-Yi Guy return -EINVAL; 234622de94de7de78b8de2fb1f2df5aa85b5556cfcfdStanislaw Gruszka if (timeout < 0 || timeout > IWL_MAX_WD_TIMEOUT) 234722de94de7de78b8de2fb1f2df5aa85b5556cfcfdStanislaw Gruszka timeout = IWL_DEF_WD_TIMEOUT; 23487bdc473c7a52497af9fe8c73e4745615a2825aaaWey-Yi Guy 23493862241945026a8fa165ab73c57739df77b8e1fbDon Fry cfg(priv)->base_params->wd_timeout = timeout; 235022de94de7de78b8de2fb1f2df5aa85b5556cfcfdStanislaw Gruszka iwl_setup_watchdog(priv); 23517bdc473c7a52497af9fe8c73e4745615a2825aaaWey-Yi Guy return count; 23527bdc473c7a52497af9fe8c73e4745615a2825aaaWey-Yi Guy} 23537bdc473c7a52497af9fe8c73e4745615a2825aaaWey-Yi Guy 2354befe8c469baebe8a0fb5bd9b7cd4afd8c54ebbd5Wey-Yi Guystatic ssize_t iwl_dbgfs_bt_traffic_read(struct file *file, 2355befe8c469baebe8a0fb5bd9b7cd4afd8c54ebbd5Wey-Yi Guy char __user *user_buf, 2356befe8c469baebe8a0fb5bd9b7cd4afd8c54ebbd5Wey-Yi Guy size_t count, loff_t *ppos) { 2357befe8c469baebe8a0fb5bd9b7cd4afd8c54ebbd5Wey-Yi Guy 2358befe8c469baebe8a0fb5bd9b7cd4afd8c54ebbd5Wey-Yi Guy struct iwl_priv *priv = (struct iwl_priv *)file->private_data; 2359befe8c469baebe8a0fb5bd9b7cd4afd8c54ebbd5Wey-Yi Guy int pos = 0; 2360befe8c469baebe8a0fb5bd9b7cd4afd8c54ebbd5Wey-Yi Guy char buf[200]; 2361befe8c469baebe8a0fb5bd9b7cd4afd8c54ebbd5Wey-Yi Guy const size_t bufsz = sizeof(buf); 2362befe8c469baebe8a0fb5bd9b7cd4afd8c54ebbd5Wey-Yi Guy 2363f21dd005df95e0fc6a578342c61b5333ce2abc2bWey-Yi Guy if (!priv->bt_enable_flag) { 2364f21dd005df95e0fc6a578342c61b5333ce2abc2bWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "BT coex disabled\n"); 236508960dea6c736280a03cb947f445fdb94fdaa2eeJohannes Berg return simple_read_from_buffer(user_buf, count, ppos, buf, pos); 2366f21dd005df95e0fc6a578342c61b5333ce2abc2bWey-Yi Guy } 2367f21dd005df95e0fc6a578342c61b5333ce2abc2bWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "BT enable flag: 0x%x\n", 2368f21dd005df95e0fc6a578342c61b5333ce2abc2bWey-Yi Guy priv->bt_enable_flag); 2369befe8c469baebe8a0fb5bd9b7cd4afd8c54ebbd5Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "BT in %s mode\n", 2370befe8c469baebe8a0fb5bd9b7cd4afd8c54ebbd5Wey-Yi Guy priv->bt_full_concurrent ? "full concurrency" : "3-wire"); 2371befe8c469baebe8a0fb5bd9b7cd4afd8c54ebbd5Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "BT status: %s, " 2372befe8c469baebe8a0fb5bd9b7cd4afd8c54ebbd5Wey-Yi Guy "last traffic notif: %d\n", 237366e863a527f9ed3a871797862aaf0d62b0954813Wey-Yi Guy priv->bt_status ? "On" : "Off", priv->last_bt_traffic_load); 2374befe8c469baebe8a0fb5bd9b7cd4afd8c54ebbd5Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "ch_announcement: %d, " 2375187bc4f6b2f81e1c8f6b1e9d5dee3e8e9018ebbfWey-Yi Guy "kill_ack_mask: %x, kill_cts_mask: %x\n", 2376187bc4f6b2f81e1c8f6b1e9d5dee3e8e9018ebbfWey-Yi Guy priv->bt_ch_announce, priv->kill_ack_mask, 2377187bc4f6b2f81e1c8f6b1e9d5dee3e8e9018ebbfWey-Yi Guy priv->kill_cts_mask); 2378befe8c469baebe8a0fb5bd9b7cd4afd8c54ebbd5Wey-Yi Guy 2379befe8c469baebe8a0fb5bd9b7cd4afd8c54ebbd5Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "bluetooth traffic load: "); 2380befe8c469baebe8a0fb5bd9b7cd4afd8c54ebbd5Wey-Yi Guy switch (priv->bt_traffic_load) { 2381befe8c469baebe8a0fb5bd9b7cd4afd8c54ebbd5Wey-Yi Guy case IWL_BT_COEX_TRAFFIC_LOAD_CONTINUOUS: 2382befe8c469baebe8a0fb5bd9b7cd4afd8c54ebbd5Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "Continuous\n"); 2383befe8c469baebe8a0fb5bd9b7cd4afd8c54ebbd5Wey-Yi Guy break; 2384befe8c469baebe8a0fb5bd9b7cd4afd8c54ebbd5Wey-Yi Guy case IWL_BT_COEX_TRAFFIC_LOAD_HIGH: 2385befe8c469baebe8a0fb5bd9b7cd4afd8c54ebbd5Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "High\n"); 2386befe8c469baebe8a0fb5bd9b7cd4afd8c54ebbd5Wey-Yi Guy break; 2387befe8c469baebe8a0fb5bd9b7cd4afd8c54ebbd5Wey-Yi Guy case IWL_BT_COEX_TRAFFIC_LOAD_LOW: 2388befe8c469baebe8a0fb5bd9b7cd4afd8c54ebbd5Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "Low\n"); 2389befe8c469baebe8a0fb5bd9b7cd4afd8c54ebbd5Wey-Yi Guy break; 2390befe8c469baebe8a0fb5bd9b7cd4afd8c54ebbd5Wey-Yi Guy case IWL_BT_COEX_TRAFFIC_LOAD_NONE: 2391befe8c469baebe8a0fb5bd9b7cd4afd8c54ebbd5Wey-Yi Guy default: 2392befe8c469baebe8a0fb5bd9b7cd4afd8c54ebbd5Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "None\n"); 2393befe8c469baebe8a0fb5bd9b7cd4afd8c54ebbd5Wey-Yi Guy break; 2394befe8c469baebe8a0fb5bd9b7cd4afd8c54ebbd5Wey-Yi Guy } 2395befe8c469baebe8a0fb5bd9b7cd4afd8c54ebbd5Wey-Yi Guy 239608960dea6c736280a03cb947f445fdb94fdaa2eeJohannes Berg return simple_read_from_buffer(user_buf, count, ppos, buf, pos); 2397befe8c469baebe8a0fb5bd9b7cd4afd8c54ebbd5Wey-Yi Guy} 2398befe8c469baebe8a0fb5bd9b7cd4afd8c54ebbd5Wey-Yi Guy 2399c6abdc0dc3440b9b6ae00a59c3560ab2160c7c7dWey-Yi Guystatic ssize_t iwl_dbgfs_protection_mode_read(struct file *file, 2400c6abdc0dc3440b9b6ae00a59c3560ab2160c7c7dWey-Yi Guy char __user *user_buf, 2401c6abdc0dc3440b9b6ae00a59c3560ab2160c7c7dWey-Yi Guy size_t count, loff_t *ppos) 2402c6abdc0dc3440b9b6ae00a59c3560ab2160c7c7dWey-Yi Guy{ 2403c6abdc0dc3440b9b6ae00a59c3560ab2160c7c7dWey-Yi Guy struct iwl_priv *priv = (struct iwl_priv *)file->private_data; 2404c6abdc0dc3440b9b6ae00a59c3560ab2160c7c7dWey-Yi Guy 2405c6abdc0dc3440b9b6ae00a59c3560ab2160c7c7dWey-Yi Guy int pos = 0; 2406c6abdc0dc3440b9b6ae00a59c3560ab2160c7c7dWey-Yi Guy char buf[40]; 2407c6abdc0dc3440b9b6ae00a59c3560ab2160c7c7dWey-Yi Guy const size_t bufsz = sizeof(buf); 2408c6abdc0dc3440b9b6ae00a59c3560ab2160c7c7dWey-Yi Guy 24093862241945026a8fa165ab73c57739df77b8e1fbDon Fry if (cfg(priv)->ht_params) 24107cb1b0887fcc61918e3d64827fbef968bb67a57aWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 24117cb1b0887fcc61918e3d64827fbef968bb67a57aWey-Yi Guy "use %s for aggregation\n", 24123862241945026a8fa165ab73c57739df77b8e1fbDon Fry (cfg(priv)->ht_params->use_rts_for_aggregation) ? 24137cb1b0887fcc61918e3d64827fbef968bb67a57aWey-Yi Guy "rts/cts" : "cts-to-self"); 24147cb1b0887fcc61918e3d64827fbef968bb67a57aWey-Yi Guy else 24157cb1b0887fcc61918e3d64827fbef968bb67a57aWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "N/A"); 24167cb1b0887fcc61918e3d64827fbef968bb67a57aWey-Yi Guy 2417c6abdc0dc3440b9b6ae00a59c3560ab2160c7c7dWey-Yi Guy return simple_read_from_buffer(user_buf, count, ppos, buf, pos); 2418c6abdc0dc3440b9b6ae00a59c3560ab2160c7c7dWey-Yi Guy} 2419c6abdc0dc3440b9b6ae00a59c3560ab2160c7c7dWey-Yi Guy 2420c6abdc0dc3440b9b6ae00a59c3560ab2160c7c7dWey-Yi Guystatic ssize_t iwl_dbgfs_protection_mode_write(struct file *file, 2421c6abdc0dc3440b9b6ae00a59c3560ab2160c7c7dWey-Yi Guy const char __user *user_buf, 2422c6abdc0dc3440b9b6ae00a59c3560ab2160c7c7dWey-Yi Guy size_t count, loff_t *ppos) { 2423c6abdc0dc3440b9b6ae00a59c3560ab2160c7c7dWey-Yi Guy 2424c6abdc0dc3440b9b6ae00a59c3560ab2160c7c7dWey-Yi Guy struct iwl_priv *priv = file->private_data; 2425c6abdc0dc3440b9b6ae00a59c3560ab2160c7c7dWey-Yi Guy char buf[8]; 2426c6abdc0dc3440b9b6ae00a59c3560ab2160c7c7dWey-Yi Guy int buf_size; 2427c6abdc0dc3440b9b6ae00a59c3560ab2160c7c7dWey-Yi Guy int rts; 2428c6abdc0dc3440b9b6ae00a59c3560ab2160c7c7dWey-Yi Guy 24293862241945026a8fa165ab73c57739df77b8e1fbDon Fry if (!cfg(priv)->ht_params) 24307cb1b0887fcc61918e3d64827fbef968bb67a57aWey-Yi Guy return -EINVAL; 24317cb1b0887fcc61918e3d64827fbef968bb67a57aWey-Yi Guy 2432c6abdc0dc3440b9b6ae00a59c3560ab2160c7c7dWey-Yi Guy memset(buf, 0, sizeof(buf)); 2433c6abdc0dc3440b9b6ae00a59c3560ab2160c7c7dWey-Yi Guy buf_size = min(count, sizeof(buf) - 1); 2434c6abdc0dc3440b9b6ae00a59c3560ab2160c7c7dWey-Yi Guy if (copy_from_user(buf, user_buf, buf_size)) 2435c6abdc0dc3440b9b6ae00a59c3560ab2160c7c7dWey-Yi Guy return -EFAULT; 2436c6abdc0dc3440b9b6ae00a59c3560ab2160c7c7dWey-Yi Guy if (sscanf(buf, "%d", &rts) != 1) 2437c6abdc0dc3440b9b6ae00a59c3560ab2160c7c7dWey-Yi Guy return -EINVAL; 2438c6abdc0dc3440b9b6ae00a59c3560ab2160c7c7dWey-Yi Guy if (rts) 24393862241945026a8fa165ab73c57739df77b8e1fbDon Fry cfg(priv)->ht_params->use_rts_for_aggregation = true; 2440c6abdc0dc3440b9b6ae00a59c3560ab2160c7c7dWey-Yi Guy else 24413862241945026a8fa165ab73c57739df77b8e1fbDon Fry cfg(priv)->ht_params->use_rts_for_aggregation = false; 2442c6abdc0dc3440b9b6ae00a59c3560ab2160c7c7dWey-Yi Guy return count; 2443c6abdc0dc3440b9b6ae00a59c3560ab2160c7c7dWey-Yi Guy} 2444c6abdc0dc3440b9b6ae00a59c3560ab2160c7c7dWey-Yi Guy 24457e4005cc4ae49100582ee1c97368dd79474f0a82Wey-Yi Guystatic ssize_t iwl_dbgfs_echo_test_write(struct file *file, 24467e4005cc4ae49100582ee1c97368dd79474f0a82Wey-Yi Guy const char __user *user_buf, 24477e4005cc4ae49100582ee1c97368dd79474f0a82Wey-Yi Guy size_t count, loff_t *ppos) 24487e4005cc4ae49100582ee1c97368dd79474f0a82Wey-Yi Guy{ 24497e4005cc4ae49100582ee1c97368dd79474f0a82Wey-Yi Guy struct iwl_priv *priv = file->private_data; 24507e4005cc4ae49100582ee1c97368dd79474f0a82Wey-Yi Guy char buf[8]; 24517e4005cc4ae49100582ee1c97368dd79474f0a82Wey-Yi Guy int buf_size; 24527e4005cc4ae49100582ee1c97368dd79474f0a82Wey-Yi Guy 24537e4005cc4ae49100582ee1c97368dd79474f0a82Wey-Yi Guy memset(buf, 0, sizeof(buf)); 24547e4005cc4ae49100582ee1c97368dd79474f0a82Wey-Yi Guy buf_size = min(count, sizeof(buf) - 1); 24557e4005cc4ae49100582ee1c97368dd79474f0a82Wey-Yi Guy if (copy_from_user(buf, user_buf, buf_size)) 24567e4005cc4ae49100582ee1c97368dd79474f0a82Wey-Yi Guy return -EFAULT; 24577e4005cc4ae49100582ee1c97368dd79474f0a82Wey-Yi Guy 24587e4005cc4ae49100582ee1c97368dd79474f0a82Wey-Yi Guy iwl_cmd_echo_test(priv); 24597e4005cc4ae49100582ee1c97368dd79474f0a82Wey-Yi Guy return count; 24607e4005cc4ae49100582ee1c97368dd79474f0a82Wey-Yi Guy} 24617e4005cc4ae49100582ee1c97368dd79474f0a82Wey-Yi Guy 24627163b8a4ec995dabda3e92c6fed7b8600060618cWey-Yi GuyDEBUGFS_READ_FILE_OPS(rx_statistics); 24637163b8a4ec995dabda3e92c6fed7b8600060618cWey-Yi GuyDEBUGFS_READ_FILE_OPS(tx_statistics); 246441f5e0475c7c04b17b207736146187636b04eb4cEmmanuel GrumbachDEBUGFS_READ_WRITE_FILE_OPS(traffic_log); 2465e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi GuyDEBUGFS_READ_FILE_OPS(ucode_rx_stats); 2466e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi GuyDEBUGFS_READ_FILE_OPS(ucode_tx_stats); 2467e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi GuyDEBUGFS_READ_FILE_OPS(ucode_general_stats); 24685225935b53ce1eafb222c644230d03ad6011d357Wey-Yi GuyDEBUGFS_READ_FILE_OPS(sensitivity); 24695225935b53ce1eafb222c644230d03ad6011d357Wey-Yi GuyDEBUGFS_READ_FILE_OPS(chain_noise); 2470c09430abed4159e5c56aaea257d040f7452daba6Wey-Yi GuyDEBUGFS_READ_FILE_OPS(power_save_status); 24717163b8a4ec995dabda3e92c6fed7b8600060618cWey-Yi GuyDEBUGFS_WRITE_FILE_OPS(clear_ucode_statistics); 24727163b8a4ec995dabda3e92c6fed7b8600060618cWey-Yi GuyDEBUGFS_WRITE_FILE_OPS(clear_traffic_statistics); 2473a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi GuyDEBUGFS_READ_WRITE_FILE_OPS(ucode_tracing); 2474a13d276f1e49ae0bc4ad18ce8ea3c90656c9e8d4Wey-Yi GuyDEBUGFS_READ_WRITE_FILE_OPS(missed_beacon); 24753e4fb5faefb57824f2e42305b3d5907845af978cTrieu 'Andrew' NguyenDEBUGFS_READ_WRITE_FILE_OPS(plcp_delta); 2476528c3126a98e75f47fc9fa11b243c82a59271d0dWey-Yi GuyDEBUGFS_READ_WRITE_FILE_OPS(force_reset); 247760987206cba0dbb547bce2d23c3a3338c5aaf5acJohannes BergDEBUGFS_READ_FILE_OPS(rxon_flags); 247860987206cba0dbb547bce2d23c3a3338c5aaf5acJohannes BergDEBUGFS_READ_FILE_OPS(rxon_filter_flags); 24794bf49a90bc0bda131ef353cca631025849f36b4eWey-Yi GuyDEBUGFS_WRITE_FILE_OPS(txfifo_flush); 2480ffb7d896b3bc21e09d77fed45b52b2ff4ce213e5Wey-Yi GuyDEBUGFS_READ_FILE_OPS(ucode_bt_stats); 248122de94de7de78b8de2fb1f2df5aa85b5556cfcfdStanislaw GruszkaDEBUGFS_WRITE_FILE_OPS(wd_timeout); 2482befe8c469baebe8a0fb5bd9b7cd4afd8c54ebbd5Wey-Yi GuyDEBUGFS_READ_FILE_OPS(bt_traffic); 2483c6abdc0dc3440b9b6ae00a59c3560ab2160c7c7dWey-Yi GuyDEBUGFS_READ_WRITE_FILE_OPS(protection_mode); 248454a9aa65f749673f851ef86481940394185c1b0eWey-Yi GuyDEBUGFS_READ_FILE_OPS(reply_tx_error); 24857e4005cc4ae49100582ee1c97368dd79474f0a82Wey-Yi GuyDEBUGFS_WRITE_FILE_OPS(echo_test); 248620594eb0daa67f7a0cc19d74a1bafceb1bb09f4aWey-Yi Guy 2487ca934b6715c134573da5acea01e9258eb0bf7c27Johannes Berg#ifdef CONFIG_IWLWIFI_DEBUG 2488ca934b6715c134573da5acea01e9258eb0bf7c27Johannes Bergstatic ssize_t iwl_dbgfs_debug_level_read(struct file *file, 2489ca934b6715c134573da5acea01e9258eb0bf7c27Johannes Berg char __user *user_buf, 2490ca934b6715c134573da5acea01e9258eb0bf7c27Johannes Berg size_t count, loff_t *ppos) 2491ca934b6715c134573da5acea01e9258eb0bf7c27Johannes Berg{ 2492ca934b6715c134573da5acea01e9258eb0bf7c27Johannes Berg struct iwl_priv *priv = file->private_data; 2493ca934b6715c134573da5acea01e9258eb0bf7c27Johannes Berg struct iwl_shared *shrd = priv->shrd; 2494ca934b6715c134573da5acea01e9258eb0bf7c27Johannes Berg char buf[11]; 2495ca934b6715c134573da5acea01e9258eb0bf7c27Johannes Berg int len; 2496ca934b6715c134573da5acea01e9258eb0bf7c27Johannes Berg 2497ca934b6715c134573da5acea01e9258eb0bf7c27Johannes Berg len = scnprintf(buf, sizeof(buf), "0x%.8x", 2498ca934b6715c134573da5acea01e9258eb0bf7c27Johannes Berg iwl_get_debug_level(shrd)); 2499ca934b6715c134573da5acea01e9258eb0bf7c27Johannes Berg 2500ca934b6715c134573da5acea01e9258eb0bf7c27Johannes Berg return simple_read_from_buffer(user_buf, count, ppos, buf, len); 2501ca934b6715c134573da5acea01e9258eb0bf7c27Johannes Berg} 2502ca934b6715c134573da5acea01e9258eb0bf7c27Johannes Berg 2503ca934b6715c134573da5acea01e9258eb0bf7c27Johannes Bergstatic ssize_t iwl_dbgfs_debug_level_write(struct file *file, 2504ca934b6715c134573da5acea01e9258eb0bf7c27Johannes Berg const char __user *user_buf, 2505ca934b6715c134573da5acea01e9258eb0bf7c27Johannes Berg size_t count, loff_t *ppos) 2506ca934b6715c134573da5acea01e9258eb0bf7c27Johannes Berg{ 2507ca934b6715c134573da5acea01e9258eb0bf7c27Johannes Berg struct iwl_priv *priv = file->private_data; 2508ca934b6715c134573da5acea01e9258eb0bf7c27Johannes Berg struct iwl_shared *shrd = priv->shrd; 2509ca934b6715c134573da5acea01e9258eb0bf7c27Johannes Berg char buf[11]; 2510ca934b6715c134573da5acea01e9258eb0bf7c27Johannes Berg unsigned long val; 2511ca934b6715c134573da5acea01e9258eb0bf7c27Johannes Berg int ret; 2512ca934b6715c134573da5acea01e9258eb0bf7c27Johannes Berg 2513ca934b6715c134573da5acea01e9258eb0bf7c27Johannes Berg if (count > sizeof(buf)) 2514ca934b6715c134573da5acea01e9258eb0bf7c27Johannes Berg return -EINVAL; 2515ca934b6715c134573da5acea01e9258eb0bf7c27Johannes Berg 2516ca934b6715c134573da5acea01e9258eb0bf7c27Johannes Berg memset(buf, 0, sizeof(buf)); 2517ca934b6715c134573da5acea01e9258eb0bf7c27Johannes Berg if (copy_from_user(buf, user_buf, count)) 2518ca934b6715c134573da5acea01e9258eb0bf7c27Johannes Berg return -EFAULT; 2519ca934b6715c134573da5acea01e9258eb0bf7c27Johannes Berg 2520ca934b6715c134573da5acea01e9258eb0bf7c27Johannes Berg ret = strict_strtoul(buf, 0, &val); 2521ca934b6715c134573da5acea01e9258eb0bf7c27Johannes Berg if (ret) 2522ca934b6715c134573da5acea01e9258eb0bf7c27Johannes Berg return ret; 2523ca934b6715c134573da5acea01e9258eb0bf7c27Johannes Berg 2524ca934b6715c134573da5acea01e9258eb0bf7c27Johannes Berg shrd->dbg_level_dev = val; 2525ca934b6715c134573da5acea01e9258eb0bf7c27Johannes Berg if (iwl_alloc_traffic_mem(priv)) 2526ca934b6715c134573da5acea01e9258eb0bf7c27Johannes Berg IWL_ERR(priv, "Not enough memory to generate traffic log\n"); 2527ca934b6715c134573da5acea01e9258eb0bf7c27Johannes Berg 2528ca934b6715c134573da5acea01e9258eb0bf7c27Johannes Berg return count; 2529ca934b6715c134573da5acea01e9258eb0bf7c27Johannes Berg} 2530ca934b6715c134573da5acea01e9258eb0bf7c27Johannes BergDEBUGFS_READ_WRITE_FILE_OPS(debug_level); 2531ca934b6715c134573da5acea01e9258eb0bf7c27Johannes Berg#endif /* CONFIG_IWLWIFI_DEBUG */ 2532ca934b6715c134573da5acea01e9258eb0bf7c27Johannes Berg 2533712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler/* 2534712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler * Create the debugfs files and directories 2535712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler * 2536712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler */ 2537712b6cf57a53da608a682b5f782c5785bda76001Tomas Winklerint iwl_dbgfs_register(struct iwl_priv *priv, const char *name) 2538712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler{ 253995b1a8224abf6230899856753c5506a3f737a65bZhu Yi struct dentry *phyd = priv->hw->wiphy->debugfsdir; 25404c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg struct dentry *dir_drv, *dir_data, *dir_rf, *dir_debug; 2541712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 25424c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg dir_drv = debugfs_create_dir(name, phyd); 25434c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg if (!dir_drv) 25444c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg return -ENOMEM; 2545712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 25464c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg priv->debugfs_dir = dir_drv; 25474c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg 25484c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg dir_data = debugfs_create_dir("data", dir_drv); 25494c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg if (!dir_data) 25504c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg goto err; 25514c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg dir_rf = debugfs_create_dir("rf", dir_drv); 25524c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg if (!dir_rf) 25534c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg goto err; 25544c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg dir_debug = debugfs_create_dir("debug", dir_drv); 25554c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg if (!dir_debug) 2556712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler goto err; 2557712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 25584c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg DEBUGFS_ADD_FILE(nvm, dir_data, S_IRUSR); 25594c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg DEBUGFS_ADD_FILE(sram, dir_data, S_IWUSR | S_IRUSR); 2560c8ac61cf6e53fefb3b439fc58390fb65d2730e63Johannes Berg DEBUGFS_ADD_FILE(wowlan_sram, dir_data, S_IRUSR); 25614c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg DEBUGFS_ADD_FILE(stations, dir_data, S_IRUSR); 25624c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg DEBUGFS_ADD_FILE(channels, dir_data, S_IRUSR); 25634c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg DEBUGFS_ADD_FILE(status, dir_data, S_IRUSR); 25641f7b6172db86e9ab2b4cd794441bb2c40ab287fcEmmanuel Grumbach DEBUGFS_ADD_FILE(rx_handlers, dir_data, S_IWUSR | S_IRUSR); 25654c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg DEBUGFS_ADD_FILE(qos, dir_data, S_IRUSR); 256623c0fcc66b4345ea97ae588c2e01f10c994652baWey-Yi Guy DEBUGFS_ADD_FILE(sleep_level_override, dir_data, S_IWUSR | S_IRUSR); 256723c0fcc66b4345ea97ae588c2e01f10c994652baWey-Yi Guy DEBUGFS_ADD_FILE(current_sleep_command, dir_data, S_IRUSR); 25684c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg DEBUGFS_ADD_FILE(thermal_throttling, dir_data, S_IRUSR); 25694c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg DEBUGFS_ADD_FILE(disable_ht40, dir_data, S_IWUSR | S_IRUSR); 2570511afa3bfbb421ff0e87086725367f762587ab87Emmanuel Grumbach DEBUGFS_ADD_FILE(temperature, dir_data, S_IRUSR); 2571ca934b6715c134573da5acea01e9258eb0bf7c27Johannes Berg 25724c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg DEBUGFS_ADD_FILE(rx_statistics, dir_debug, S_IRUSR); 25734c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg DEBUGFS_ADD_FILE(tx_statistics, dir_debug, S_IRUSR); 257441f5e0475c7c04b17b207736146187636b04eb4cEmmanuel Grumbach DEBUGFS_ADD_FILE(traffic_log, dir_debug, S_IWUSR | S_IRUSR); 25754c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg DEBUGFS_ADD_FILE(power_save_status, dir_debug, S_IRUSR); 25764c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg DEBUGFS_ADD_FILE(clear_ucode_statistics, dir_debug, S_IWUSR); 25774c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg DEBUGFS_ADD_FILE(clear_traffic_statistics, dir_debug, S_IWUSR); 25784c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg DEBUGFS_ADD_FILE(missed_beacon, dir_debug, S_IWUSR); 25794c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg DEBUGFS_ADD_FILE(plcp_delta, dir_debug, S_IWUSR | S_IRUSR); 2580528c3126a98e75f47fc9fa11b243c82a59271d0dWey-Yi Guy DEBUGFS_ADD_FILE(force_reset, dir_debug, S_IWUSR | S_IRUSR); 2581b8c76267cfb9a025afdd122bc2a8942dbf493dd1Abhijeet Kolekar DEBUGFS_ADD_FILE(ucode_rx_stats, dir_debug, S_IRUSR); 2582b8c76267cfb9a025afdd122bc2a8942dbf493dd1Abhijeet Kolekar DEBUGFS_ADD_FILE(ucode_tx_stats, dir_debug, S_IRUSR); 2583b8c76267cfb9a025afdd122bc2a8942dbf493dd1Abhijeet Kolekar DEBUGFS_ADD_FILE(ucode_general_stats, dir_debug, S_IRUSR); 2584c68744fb935400964f7af4835017cad5014c8c88Wey-Yi Guy DEBUGFS_ADD_FILE(txfifo_flush, dir_debug, S_IWUSR); 2585c6abdc0dc3440b9b6ae00a59c3560ab2160c7c7dWey-Yi Guy DEBUGFS_ADD_FILE(protection_mode, dir_debug, S_IWUSR | S_IRUSR); 2586703bc583cb98a24eeedd297ee59dfa12852897d1Wey-Yi Guy DEBUGFS_ADD_FILE(sensitivity, dir_debug, S_IRUSR); 2587703bc583cb98a24eeedd297ee59dfa12852897d1Wey-Yi Guy DEBUGFS_ADD_FILE(chain_noise, dir_debug, S_IRUSR); 2588b7af6a99690503a48c63ce5e587b4e4555f31cdbWey-Yi Guy DEBUGFS_ADD_FILE(ucode_tracing, dir_debug, S_IWUSR | S_IRUSR); 25890da0e5bf1522d75d446f5124e17016628d0a149eJohannes Berg DEBUGFS_ADD_FILE(ucode_bt_stats, dir_debug, S_IRUSR); 259054a9aa65f749673f851ef86481940394185c1b0eWey-Yi Guy DEBUGFS_ADD_FILE(reply_tx_error, dir_debug, S_IRUSR); 259160987206cba0dbb547bce2d23c3a3338c5aaf5acJohannes Berg DEBUGFS_ADD_FILE(rxon_flags, dir_debug, S_IWUSR); 259260987206cba0dbb547bce2d23c3a3338c5aaf5acJohannes Berg DEBUGFS_ADD_FILE(rxon_filter_flags, dir_debug, S_IWUSR); 259322de94de7de78b8de2fb1f2df5aa85b5556cfcfdStanislaw Gruszka DEBUGFS_ADD_FILE(wd_timeout, dir_debug, S_IWUSR); 25947e4005cc4ae49100582ee1c97368dd79474f0a82Wey-Yi Guy DEBUGFS_ADD_FILE(echo_test, dir_debug, S_IWUSR); 259588e58fc5d940c3463c7070a2a7a8a0ce65af3fdcStanislaw Gruszka if (iwl_advanced_bt_coexist(priv)) 2596befe8c469baebe8a0fb5bd9b7cd4afd8c54ebbd5Wey-Yi Guy DEBUGFS_ADD_FILE(bt_traffic, dir_debug, S_IRUSR); 2597ca934b6715c134573da5acea01e9258eb0bf7c27Johannes Berg#ifdef CONFIG_IWLWIFI_DEBUG 2598ca934b6715c134573da5acea01e9258eb0bf7c27Johannes Berg DEBUGFS_ADD_FILE(debug_level, dir_debug, S_IRUSR | S_IWUSR); 2599ca934b6715c134573da5acea01e9258eb0bf7c27Johannes Berg#endif 2600ca934b6715c134573da5acea01e9258eb0bf7c27Johannes Berg 2601703bc583cb98a24eeedd297ee59dfa12852897d1Wey-Yi Guy DEBUGFS_ADD_BOOL(disable_sensitivity, dir_rf, 2602703bc583cb98a24eeedd297ee59dfa12852897d1Wey-Yi Guy &priv->disable_sens_cal); 2603703bc583cb98a24eeedd297ee59dfa12852897d1Wey-Yi Guy DEBUGFS_ADD_BOOL(disable_chain_noise, dir_rf, 2604703bc583cb98a24eeedd297ee59dfa12852897d1Wey-Yi Guy &priv->disable_chain_noise_cal); 260587e5666c0722d5f4cad3560ab5c180c8bba62b8bEmmanuel Grumbach 260687e5666c0722d5f4cad3560ab5c180c8bba62b8bEmmanuel Grumbach if (iwl_trans_dbgfs_register(trans(priv), dir_debug)) 260787e5666c0722d5f4cad3560ab5c180c8bba62b8bEmmanuel Grumbach goto err; 2608712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler return 0; 2609712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 2610712b6cf57a53da608a682b5f782c5785bda76001Tomas Winklererr: 26114c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg IWL_ERR(priv, "Can't create the debugfs directory\n"); 2612712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler iwl_dbgfs_unregister(priv); 26134c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg return -ENOMEM; 2614712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler} 2615712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 2616712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler/** 2617712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler * Remove the debugfs files and directories 2618712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler * 2619712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler */ 2620712b6cf57a53da608a682b5f782c5785bda76001Tomas Winklervoid iwl_dbgfs_unregister(struct iwl_priv *priv) 2621712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler{ 26224c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg if (!priv->debugfs_dir) 2623712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler return; 2624712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 26254c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg debugfs_remove_recursive(priv->debugfs_dir); 26264c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg priv->debugfs_dir = NULL; 2627712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler} 2628