iwl-debugfs.c revision 83ed90155f98bd949735c2cc22d832b557a6d7d1
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 67712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler/* file operation */ 68712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler#define DEBUGFS_READ_FUNC(name) \ 69712b6cf57a53da608a682b5f782c5785bda76001Tomas Winklerstatic ssize_t iwl_dbgfs_##name##_read(struct file *file, \ 70712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler char __user *user_buf, \ 71712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler size_t count, loff_t *ppos); 72712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 73712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler#define DEBUGFS_WRITE_FUNC(name) \ 74712b6cf57a53da608a682b5f782c5785bda76001Tomas Winklerstatic ssize_t iwl_dbgfs_##name##_write(struct file *file, \ 75712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler const char __user *user_buf, \ 76712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler size_t count, loff_t *ppos); 77712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 78712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 79712b6cf57a53da608a682b5f782c5785bda76001Tomas Winklerstatic int iwl_dbgfs_open_file_generic(struct inode *inode, struct file *file) 80712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler{ 81712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler file->private_data = inode->i_private; 82712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler return 0; 83712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler} 84712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 85712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler#define DEBUGFS_READ_FILE_OPS(name) \ 86712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler DEBUGFS_READ_FUNC(name); \ 87712b6cf57a53da608a682b5f782c5785bda76001Tomas Winklerstatic const struct file_operations iwl_dbgfs_##name##_ops = { \ 88712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler .read = iwl_dbgfs_##name##_read, \ 89712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler .open = iwl_dbgfs_open_file_generic, \ 902b18ab36cf7e956fb5b5ee12847e94fc66d496f4Arnd Bergmann .llseek = generic_file_llseek, \ 91712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler}; 92712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 93189a2b5942d62bd18e1e01772c4c784253f5dd16Ester Kummer#define DEBUGFS_WRITE_FILE_OPS(name) \ 94189a2b5942d62bd18e1e01772c4c784253f5dd16Ester Kummer DEBUGFS_WRITE_FUNC(name); \ 95189a2b5942d62bd18e1e01772c4c784253f5dd16Ester Kummerstatic const struct file_operations iwl_dbgfs_##name##_ops = { \ 96189a2b5942d62bd18e1e01772c4c784253f5dd16Ester Kummer .write = iwl_dbgfs_##name##_write, \ 97189a2b5942d62bd18e1e01772c4c784253f5dd16Ester Kummer .open = iwl_dbgfs_open_file_generic, \ 982b18ab36cf7e956fb5b5ee12847e94fc66d496f4Arnd Bergmann .llseek = generic_file_llseek, \ 99189a2b5942d62bd18e1e01772c4c784253f5dd16Ester Kummer}; 100189a2b5942d62bd18e1e01772c4c784253f5dd16Ester Kummer 101189a2b5942d62bd18e1e01772c4c784253f5dd16Ester Kummer 102712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler#define DEBUGFS_READ_WRITE_FILE_OPS(name) \ 103712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler DEBUGFS_READ_FUNC(name); \ 104712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler DEBUGFS_WRITE_FUNC(name); \ 105712b6cf57a53da608a682b5f782c5785bda76001Tomas Winklerstatic const struct file_operations iwl_dbgfs_##name##_ops = { \ 106712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler .write = iwl_dbgfs_##name##_write, \ 107712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler .read = iwl_dbgfs_##name##_read, \ 108712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler .open = iwl_dbgfs_open_file_generic, \ 1092b18ab36cf7e956fb5b5ee12847e94fc66d496f4Arnd Bergmann .llseek = generic_file_llseek, \ 110712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler}; 111712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 112712b6cf57a53da608a682b5f782c5785bda76001Tomas Winklerstatic ssize_t iwl_dbgfs_tx_statistics_read(struct file *file, 113712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler char __user *user_buf, 114712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler size_t count, loff_t *ppos) { 115712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 11628f63a4bb744ea81030219aba2337fddb10b380bH Hartley Sweeten struct iwl_priv *priv = file->private_data; 11722fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy char *buf; 118712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler int pos = 0; 119712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 12022fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy int cnt; 12122fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy ssize_t ret; 12298a7b43be19faa7b92576c62614c45e38517331cWey-Yi Guy const size_t bufsz = 100 + 12398a7b43be19faa7b92576c62614c45e38517331cWey-Yi Guy sizeof(char) * 50 * (MANAGEMENT_MAX + CONTROL_MAX); 12422fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy buf = kzalloc(bufsz, GFP_KERNEL); 12522fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy if (!buf) 12622fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy return -ENOMEM; 12722fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "Management:\n"); 12822fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy for (cnt = 0; cnt < MANAGEMENT_MAX; cnt++) { 12922fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 13098a7b43be19faa7b92576c62614c45e38517331cWey-Yi Guy "\t%25s\t\t: %u\n", 13122fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy get_mgmt_string(cnt), 13222fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy priv->tx_stats.mgmt[cnt]); 13322fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy } 13422fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "Control\n"); 13522fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy for (cnt = 0; cnt < CONTROL_MAX; cnt++) { 13622fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 13798a7b43be19faa7b92576c62614c45e38517331cWey-Yi Guy "\t%25s\t\t: %u\n", 13822fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy get_ctrl_string(cnt), 13922fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy priv->tx_stats.ctrl[cnt]); 14022fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy } 14122fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "Data:\n"); 14222fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "\tcnt: %u\n", 14322fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy priv->tx_stats.data_cnt); 14422fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "\tbytes: %llu\n", 14522fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy priv->tx_stats.data_bytes); 14622fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy ret = simple_read_from_buffer(user_buf, count, ppos, buf, pos); 14722fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy kfree(buf); 14822fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy return ret; 14922fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy} 15022fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy 1517163b8a4ec995dabda3e92c6fed7b8600060618cWey-Yi Guystatic ssize_t iwl_dbgfs_clear_traffic_statistics_write(struct file *file, 15222fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy const char __user *user_buf, 15322fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy size_t count, loff_t *ppos) 15422fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy{ 15522fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy struct iwl_priv *priv = file->private_data; 15622fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy u32 clear_flag; 15722fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy char buf[8]; 15822fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy int buf_size; 159712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 16022fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy memset(buf, 0, sizeof(buf)); 16122fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy buf_size = min(count, sizeof(buf) - 1); 16222fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy if (copy_from_user(buf, user_buf, buf_size)) 16322fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy return -EFAULT; 16422fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy if (sscanf(buf, "%x", &clear_flag) != 1) 16522fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy return -EFAULT; 1667163b8a4ec995dabda3e92c6fed7b8600060618cWey-Yi Guy iwl_clear_traffic_stats(priv); 16722fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy 16822fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy return count; 169712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler} 170712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 171712b6cf57a53da608a682b5f782c5785bda76001Tomas Winklerstatic ssize_t iwl_dbgfs_rx_statistics_read(struct file *file, 172712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler char __user *user_buf, 173712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler size_t count, loff_t *ppos) { 174712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 17528f63a4bb744ea81030219aba2337fddb10b380bH Hartley Sweeten struct iwl_priv *priv = file->private_data; 17622fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy char *buf; 177712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler int pos = 0; 17822fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy int cnt; 17922fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy ssize_t ret; 18022fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy const size_t bufsz = 100 + 18198a7b43be19faa7b92576c62614c45e38517331cWey-Yi Guy sizeof(char) * 50 * (MANAGEMENT_MAX + CONTROL_MAX); 18222fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy buf = kzalloc(bufsz, GFP_KERNEL); 18322fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy if (!buf) 18422fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy return -ENOMEM; 185712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 18622fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "Management:\n"); 18722fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy for (cnt = 0; cnt < MANAGEMENT_MAX; cnt++) { 18822fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 18998a7b43be19faa7b92576c62614c45e38517331cWey-Yi Guy "\t%25s\t\t: %u\n", 19022fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy get_mgmt_string(cnt), 19122fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy priv->rx_stats.mgmt[cnt]); 19222fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy } 19322fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "Control:\n"); 19422fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy for (cnt = 0; cnt < CONTROL_MAX; cnt++) { 19522fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 19698a7b43be19faa7b92576c62614c45e38517331cWey-Yi Guy "\t%25s\t\t: %u\n", 19722fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy get_ctrl_string(cnt), 19822fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy priv->rx_stats.ctrl[cnt]); 19922fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy } 20022fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "Data:\n"); 20122fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "\tcnt: %u\n", 20222fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy priv->rx_stats.data_cnt); 20322fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "\tbytes: %llu\n", 20422fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy priv->rx_stats.data_bytes); 205712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 20622fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy ret = simple_read_from_buffer(user_buf, count, ppos, buf, pos); 20722fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy kfree(buf); 20822fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy return ret; 20922fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy} 21022fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy 211712b6cf57a53da608a682b5f782c5785bda76001Tomas Winklerstatic ssize_t iwl_dbgfs_sram_read(struct file *file, 212712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler char __user *user_buf, 213712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler size_t count, loff_t *ppos) 214712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler{ 21524834d2c8455a6eeee82e007d41d7e05986d134fJay Sternberg u32 val = 0; 2162943f136ffe29adb08162197b129bf8106e8191cWey-Yi Guy char *buf; 217712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler ssize_t ret; 21824834d2c8455a6eeee82e007d41d7e05986d134fJay Sternberg int i = 0; 21924834d2c8455a6eeee82e007d41d7e05986d134fJay Sternberg bool device_format = false; 22024834d2c8455a6eeee82e007d41d7e05986d134fJay Sternberg int offset = 0; 22124834d2c8455a6eeee82e007d41d7e05986d134fJay Sternberg int len = 0; 222712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler int pos = 0; 22324834d2c8455a6eeee82e007d41d7e05986d134fJay Sternberg int sram; 22428f63a4bb744ea81030219aba2337fddb10b380bH Hartley Sweeten struct iwl_priv *priv = file->private_data; 2252943f136ffe29adb08162197b129bf8106e8191cWey-Yi Guy size_t bufsz; 226712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 2275ade1e4dd1df436c3a441d17321c24aac8497306Wey-Yi Guy /* default is to dump the entire data segment */ 2284c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg if (!priv->dbgfs_sram_offset && !priv->dbgfs_sram_len) { 2294c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg priv->dbgfs_sram_offset = 0x800000; 230872907bb17fe2d8d01d0e9723f72f91cb4ea103fJohannes Berg if (priv->ucode_type == IWL_UCODE_INIT) 231dbf28e21ca391110e90ccad05dda79d2e2f60e0eJohannes Berg priv->dbgfs_sram_len = priv->ucode_init.data.len; 2325ade1e4dd1df436c3a441d17321c24aac8497306Wey-Yi Guy else 233dbf28e21ca391110e90ccad05dda79d2e2f60e0eJohannes Berg priv->dbgfs_sram_len = priv->ucode_rt.data.len; 2345ade1e4dd1df436c3a441d17321c24aac8497306Wey-Yi Guy } 23524834d2c8455a6eeee82e007d41d7e05986d134fJay Sternberg len = priv->dbgfs_sram_len; 23624834d2c8455a6eeee82e007d41d7e05986d134fJay Sternberg 23724834d2c8455a6eeee82e007d41d7e05986d134fJay Sternberg if (len == -4) { 23824834d2c8455a6eeee82e007d41d7e05986d134fJay Sternberg device_format = true; 23924834d2c8455a6eeee82e007d41d7e05986d134fJay Sternberg len = 4; 24024834d2c8455a6eeee82e007d41d7e05986d134fJay Sternberg } 24124834d2c8455a6eeee82e007d41d7e05986d134fJay Sternberg 24224834d2c8455a6eeee82e007d41d7e05986d134fJay Sternberg bufsz = 50 + len * 4; 2432943f136ffe29adb08162197b129bf8106e8191cWey-Yi Guy buf = kmalloc(bufsz, GFP_KERNEL); 2442943f136ffe29adb08162197b129bf8106e8191cWey-Yi Guy if (!buf) 2452943f136ffe29adb08162197b129bf8106e8191cWey-Yi Guy return -ENOMEM; 24624834d2c8455a6eeee82e007d41d7e05986d134fJay Sternberg 2475ade1e4dd1df436c3a441d17321c24aac8497306Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "sram_len: 0x%x\n", 24824834d2c8455a6eeee82e007d41d7e05986d134fJay Sternberg len); 2495ade1e4dd1df436c3a441d17321c24aac8497306Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "sram_offset: 0x%x\n", 2504c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg priv->dbgfs_sram_offset); 25124834d2c8455a6eeee82e007d41d7e05986d134fJay Sternberg 25224834d2c8455a6eeee82e007d41d7e05986d134fJay Sternberg /* adjust sram address since reads are only on even u32 boundaries */ 25324834d2c8455a6eeee82e007d41d7e05986d134fJay Sternberg offset = priv->dbgfs_sram_offset & 0x3; 25424834d2c8455a6eeee82e007d41d7e05986d134fJay Sternberg sram = priv->dbgfs_sram_offset & ~0x3; 25524834d2c8455a6eeee82e007d41d7e05986d134fJay Sternberg 25624834d2c8455a6eeee82e007d41d7e05986d134fJay Sternberg /* read the first u32 from sram */ 25783ed90155f98bd949735c2cc22d832b557a6d7d1Emmanuel Grumbach val = iwl_read_targ_mem(bus(priv), sram); 25824834d2c8455a6eeee82e007d41d7e05986d134fJay Sternberg 25924834d2c8455a6eeee82e007d41d7e05986d134fJay Sternberg for (; len; len--) { 26024834d2c8455a6eeee82e007d41d7e05986d134fJay Sternberg /* put the address at the start of every line */ 26124834d2c8455a6eeee82e007d41d7e05986d134fJay Sternberg if (i == 0) 26224834d2c8455a6eeee82e007d41d7e05986d134fJay Sternberg pos += scnprintf(buf + pos, bufsz - pos, 26324834d2c8455a6eeee82e007d41d7e05986d134fJay Sternberg "%08X: ", sram + offset); 26424834d2c8455a6eeee82e007d41d7e05986d134fJay Sternberg 26524834d2c8455a6eeee82e007d41d7e05986d134fJay Sternberg if (device_format) 26624834d2c8455a6eeee82e007d41d7e05986d134fJay Sternberg pos += scnprintf(buf + pos, bufsz - pos, 26724834d2c8455a6eeee82e007d41d7e05986d134fJay Sternberg "%02x", (val >> (8 * (3 - offset))) & 0xff); 26824834d2c8455a6eeee82e007d41d7e05986d134fJay Sternberg else 26924834d2c8455a6eeee82e007d41d7e05986d134fJay Sternberg pos += scnprintf(buf + pos, bufsz - pos, 27024834d2c8455a6eeee82e007d41d7e05986d134fJay Sternberg "%02x ", (val >> (8 * offset)) & 0xff); 27124834d2c8455a6eeee82e007d41d7e05986d134fJay Sternberg 27224834d2c8455a6eeee82e007d41d7e05986d134fJay Sternberg /* if all bytes processed, read the next u32 from sram */ 27324834d2c8455a6eeee82e007d41d7e05986d134fJay Sternberg if (++offset == 4) { 27424834d2c8455a6eeee82e007d41d7e05986d134fJay Sternberg sram += 4; 27524834d2c8455a6eeee82e007d41d7e05986d134fJay Sternberg offset = 0; 27683ed90155f98bd949735c2cc22d832b557a6d7d1Emmanuel Grumbach val = iwl_read_targ_mem(bus(priv), sram); 277712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler } 27824834d2c8455a6eeee82e007d41d7e05986d134fJay Sternberg 27924834d2c8455a6eeee82e007d41d7e05986d134fJay Sternberg /* put in extra spaces and split lines for human readability */ 28024834d2c8455a6eeee82e007d41d7e05986d134fJay Sternberg if (++i == 16) { 28124834d2c8455a6eeee82e007d41d7e05986d134fJay Sternberg i = 0; 2822943f136ffe29adb08162197b129bf8106e8191cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "\n"); 28324834d2c8455a6eeee82e007d41d7e05986d134fJay Sternberg } else if (!(i & 7)) { 28424834d2c8455a6eeee82e007d41d7e05986d134fJay Sternberg pos += scnprintf(buf + pos, bufsz - pos, " "); 28524834d2c8455a6eeee82e007d41d7e05986d134fJay Sternberg } else if (!(i & 3)) { 28624834d2c8455a6eeee82e007d41d7e05986d134fJay Sternberg pos += scnprintf(buf + pos, bufsz - pos, " "); 28724834d2c8455a6eeee82e007d41d7e05986d134fJay Sternberg } 288712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler } 28924834d2c8455a6eeee82e007d41d7e05986d134fJay Sternberg if (i) 29024834d2c8455a6eeee82e007d41d7e05986d134fJay Sternberg pos += scnprintf(buf + pos, bufsz - pos, "\n"); 291712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 292712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler ret = simple_read_from_buffer(user_buf, count, ppos, buf, pos); 2932943f136ffe29adb08162197b129bf8106e8191cWey-Yi Guy kfree(buf); 294712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler return ret; 295712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler} 296712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 297712b6cf57a53da608a682b5f782c5785bda76001Tomas Winklerstatic ssize_t iwl_dbgfs_sram_write(struct file *file, 298712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler const char __user *user_buf, 299712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler size_t count, loff_t *ppos) 300712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler{ 301712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler struct iwl_priv *priv = file->private_data; 302712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler char buf[64]; 303712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler int buf_size; 304712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler u32 offset, len; 305712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 306712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler memset(buf, 0, sizeof(buf)); 307712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler buf_size = min(count, sizeof(buf) - 1); 308712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler if (copy_from_user(buf, user_buf, buf_size)) 309712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler return -EFAULT; 310712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 311712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler if (sscanf(buf, "%x,%x", &offset, &len) == 2) { 3124c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg priv->dbgfs_sram_offset = offset; 3134c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg priv->dbgfs_sram_len = len; 31424834d2c8455a6eeee82e007d41d7e05986d134fJay Sternberg } else if (sscanf(buf, "%x", &offset) == 1) { 31524834d2c8455a6eeee82e007d41d7e05986d134fJay Sternberg priv->dbgfs_sram_offset = offset; 31624834d2c8455a6eeee82e007d41d7e05986d134fJay Sternberg priv->dbgfs_sram_len = -4; 317712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler } else { 3184c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg priv->dbgfs_sram_offset = 0; 3194c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg priv->dbgfs_sram_len = 0; 320712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler } 321712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 322712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler return count; 323712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler} 324712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 325c8ac61cf6e53fefb3b439fc58390fb65d2730e63Johannes Bergstatic ssize_t iwl_dbgfs_wowlan_sram_read(struct file *file, 326c8ac61cf6e53fefb3b439fc58390fb65d2730e63Johannes Berg char __user *user_buf, 327c8ac61cf6e53fefb3b439fc58390fb65d2730e63Johannes Berg size_t count, loff_t *ppos) 328c8ac61cf6e53fefb3b439fc58390fb65d2730e63Johannes Berg{ 329c8ac61cf6e53fefb3b439fc58390fb65d2730e63Johannes Berg struct iwl_priv *priv = file->private_data; 330c8ac61cf6e53fefb3b439fc58390fb65d2730e63Johannes Berg 331c8ac61cf6e53fefb3b439fc58390fb65d2730e63Johannes Berg if (!priv->wowlan_sram) 332c8ac61cf6e53fefb3b439fc58390fb65d2730e63Johannes Berg return -ENODATA; 333c8ac61cf6e53fefb3b439fc58390fb65d2730e63Johannes Berg 334c8ac61cf6e53fefb3b439fc58390fb65d2730e63Johannes Berg return simple_read_from_buffer(user_buf, count, ppos, 335c8ac61cf6e53fefb3b439fc58390fb65d2730e63Johannes Berg priv->wowlan_sram, 336c8ac61cf6e53fefb3b439fc58390fb65d2730e63Johannes Berg priv->ucode_wowlan.data.len); 337c8ac61cf6e53fefb3b439fc58390fb65d2730e63Johannes Berg} 338712b6cf57a53da608a682b5f782c5785bda76001Tomas Winklerstatic ssize_t iwl_dbgfs_stations_read(struct file *file, char __user *user_buf, 339712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler size_t count, loff_t *ppos) 340712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler{ 34128f63a4bb744ea81030219aba2337fddb10b380bH Hartley Sweeten struct iwl_priv *priv = file->private_data; 3426def9761f72501e638e79eebcd70afea12a3a93dTomas Winkler struct iwl_station_entry *station; 343d618912417fbce4f6514fe1cbef7df2e73bdb6c2Emmanuel Grumbach int max_sta = hw_params(priv).max_stations; 344712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler char *buf; 345712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler int i, j, pos = 0; 346712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler ssize_t ret; 347712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler /* Add 30 for initial string */ 348712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler const size_t bufsz = 30 + sizeof(char) * 500 * (priv->num_stations); 349712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 350712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler buf = kmalloc(bufsz, GFP_KERNEL); 3513ac7f14694dd38273d9d96f1c873233d71190c15Tomas Winkler if (!buf) 352712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler return -ENOMEM; 353712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 354db0589f3b9443f2b57ea6daaec09c1ab0ac99cb0Abhijeet Kolekar pos += scnprintf(buf + pos, bufsz - pos, "num of stations: %d\n\n", 355712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler priv->num_stations); 356712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 357712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler for (i = 0; i < max_sta; i++) { 358712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler station = &priv->stations[i]; 359da73511d4316c4e3efe903e123286c5b55a1999fJohannes Berg if (!station->used) 360da73511d4316c4e3efe903e123286c5b55a1999fJohannes Berg continue; 361da73511d4316c4e3efe903e123286c5b55a1999fJohannes Berg pos += scnprintf(buf + pos, bufsz - pos, 362da73511d4316c4e3efe903e123286c5b55a1999fJohannes Berg "station %d - addr: %pM, flags: %#x\n", 363da73511d4316c4e3efe903e123286c5b55a1999fJohannes Berg i, station->sta.sta.addr, 364da73511d4316c4e3efe903e123286c5b55a1999fJohannes Berg station->sta.station_flags_msk); 365da73511d4316c4e3efe903e123286c5b55a1999fJohannes Berg pos += scnprintf(buf + pos, bufsz - pos, 366da73511d4316c4e3efe903e123286c5b55a1999fJohannes Berg "TID\tseq_num\ttxq_id\tframes\ttfds\t"); 367da73511d4316c4e3efe903e123286c5b55a1999fJohannes Berg pos += scnprintf(buf + pos, bufsz - pos, 368da73511d4316c4e3efe903e123286c5b55a1999fJohannes Berg "start_idx\tbitmap\t\t\trate_n_flags\n"); 369712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 370da73511d4316c4e3efe903e123286c5b55a1999fJohannes Berg for (j = 0; j < MAX_TID_COUNT; j++) { 371da73511d4316c4e3efe903e123286c5b55a1999fJohannes Berg pos += scnprintf(buf + pos, bufsz - pos, 372da73511d4316c4e3efe903e123286c5b55a1999fJohannes Berg "%d:\t%#x\t%#x\t%u\t%u\t%u\t\t%#.16llx\t%#x", 373da73511d4316c4e3efe903e123286c5b55a1999fJohannes Berg j, station->tid[j].seq_number, 374da73511d4316c4e3efe903e123286c5b55a1999fJohannes Berg station->tid[j].agg.txq_id, 375da73511d4316c4e3efe903e123286c5b55a1999fJohannes Berg station->tid[j].agg.frame_count, 376da73511d4316c4e3efe903e123286c5b55a1999fJohannes Berg station->tid[j].tfds_in_queue, 377da73511d4316c4e3efe903e123286c5b55a1999fJohannes Berg station->tid[j].agg.start_idx, 378da73511d4316c4e3efe903e123286c5b55a1999fJohannes Berg station->tid[j].agg.bitmap, 379da73511d4316c4e3efe903e123286c5b55a1999fJohannes Berg station->tid[j].agg.rate_n_flags); 380da73511d4316c4e3efe903e123286c5b55a1999fJohannes Berg 381da73511d4316c4e3efe903e123286c5b55a1999fJohannes Berg if (station->tid[j].agg.wait_for_ba) 382db0589f3b9443f2b57ea6daaec09c1ab0ac99cb0Abhijeet Kolekar pos += scnprintf(buf + pos, bufsz - pos, 383da73511d4316c4e3efe903e123286c5b55a1999fJohannes Berg " - waitforba"); 384db0589f3b9443f2b57ea6daaec09c1ab0ac99cb0Abhijeet Kolekar pos += scnprintf(buf + pos, bufsz - pos, "\n"); 385712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler } 386da73511d4316c4e3efe903e123286c5b55a1999fJohannes Berg 387da73511d4316c4e3efe903e123286c5b55a1999fJohannes Berg pos += scnprintf(buf + pos, bufsz - pos, "\n"); 388712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler } 389712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 390712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler ret = simple_read_from_buffer(user_buf, count, ppos, buf, pos); 391712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler kfree(buf); 392712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler return ret; 393712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler} 394712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 3950848e297c2107dbc12a91a1709c879c73bd188d8Wey-Yi Guystatic ssize_t iwl_dbgfs_nvm_read(struct file *file, 3968dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler char __user *user_buf, 3978dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler size_t count, 3988dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler loff_t *ppos) 3998dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler{ 4008dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler ssize_t ret; 40128f63a4bb744ea81030219aba2337fddb10b380bH Hartley Sweeten struct iwl_priv *priv = file->private_data; 4028dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler int pos = 0, ofs = 0, buf_size = 0; 4038dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler const u8 *ptr; 4048dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler char *buf; 405e307ddce394ee7bcec41fb74330ac89eafaea1d9Wey-Yi Guy u16 eeprom_ver; 4067cb1b0887fcc61918e3d64827fbef968bb67a57aWey-Yi Guy size_t eeprom_len = priv->cfg->base_params->eeprom_size; 4078dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler buf_size = 4 * eeprom_len + 256; 4088dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler 4098dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler if (eeprom_len % 16) { 4100848e297c2107dbc12a91a1709c879c73bd188d8Wey-Yi Guy IWL_ERR(priv, "NVM size is not multiple of 16.\n"); 4118dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler return -ENODATA; 4128dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler } 4138dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler 414c37457e69ffd7d3c94cbfcc1c39be9a45dd7ad21Julia Lawall ptr = priv->eeprom; 415c37457e69ffd7d3c94cbfcc1c39be9a45dd7ad21Julia Lawall if (!ptr) { 416c37457e69ffd7d3c94cbfcc1c39be9a45dd7ad21Julia Lawall IWL_ERR(priv, "Invalid EEPROM/OTP memory\n"); 417c37457e69ffd7d3c94cbfcc1c39be9a45dd7ad21Julia Lawall return -ENOMEM; 418c37457e69ffd7d3c94cbfcc1c39be9a45dd7ad21Julia Lawall } 419c37457e69ffd7d3c94cbfcc1c39be9a45dd7ad21Julia Lawall 4208dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler /* 4 characters for byte 0xYY */ 4218dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler buf = kzalloc(buf_size, GFP_KERNEL); 4228dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler if (!buf) { 42315b1687cb4f45b87ddbe4dfc7759ff5bb69497d2Winkler, Tomas IWL_ERR(priv, "Can not allocate Buffer\n"); 4248dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler return -ENOMEM; 4258dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler } 426e307ddce394ee7bcec41fb74330ac89eafaea1d9Wey-Yi Guy eeprom_ver = iwl_eeprom_query16(priv, EEPROM_VERSION); 427e307ddce394ee7bcec41fb74330ac89eafaea1d9Wey-Yi Guy pos += scnprintf(buf + pos, buf_size - pos, "NVM Type: %s, " 428e307ddce394ee7bcec41fb74330ac89eafaea1d9Wey-Yi Guy "version: 0x%x\n", 4290848e297c2107dbc12a91a1709c879c73bd188d8Wey-Yi Guy (priv->nvm_device_type == NVM_DEVICE_TYPE_OTP) 430e307ddce394ee7bcec41fb74330ac89eafaea1d9Wey-Yi Guy ? "OTP" : "EEPROM", eeprom_ver); 4318dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler for (ofs = 0 ; ofs < eeprom_len ; ofs += 16) { 4328dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler pos += scnprintf(buf + pos, buf_size - pos, "0x%.4x ", ofs); 4338dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler hex_dump_to_buffer(ptr + ofs, 16 , 16, 2, buf + pos, 4348dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler buf_size - pos, 0); 4352fac9717a05fc4b4824422d2c439c1260807c110Reinette Chatre pos += strlen(buf + pos); 4368dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler if (buf_size - pos > 0) 4378dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler buf[pos++] = '\n'; 4388dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler } 4398dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler 4408dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler ret = simple_read_from_buffer(user_buf, count, ppos, buf, pos); 4418dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler kfree(buf); 4428dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler return ret; 4438dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler} 444712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 445d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomasstatic ssize_t iwl_dbgfs_channels_read(struct file *file, char __user *user_buf, 446d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomas size_t count, loff_t *ppos) 447d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomas{ 44828f63a4bb744ea81030219aba2337fddb10b380bH Hartley Sweeten struct iwl_priv *priv = file->private_data; 449d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomas struct ieee80211_channel *channels = NULL; 450d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomas const struct ieee80211_supported_band *supp_band = NULL; 451d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomas int pos = 0, i, bufsz = PAGE_SIZE; 452d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomas char *buf; 453d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomas ssize_t ret; 454d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomas 45563013ae30159c90d2a873e20e680e7810fa533faEmmanuel Grumbach if (!test_bit(STATUS_GEO_CONFIGURED, &priv->shrd->status)) 456d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomas return -EAGAIN; 457d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomas 458d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomas buf = kzalloc(bufsz, GFP_KERNEL); 459d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomas if (!buf) { 46015b1687cb4f45b87ddbe4dfc7759ff5bb69497d2Winkler, Tomas IWL_ERR(priv, "Can not allocate Buffer\n"); 461d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomas return -ENOMEM; 462d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomas } 463d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomas 464d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomas supp_band = iwl_get_hw_mode(priv, IEEE80211_BAND_2GHZ); 465a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy if (supp_band) { 466a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy channels = supp_band->channels; 467d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomas 468d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomas pos += scnprintf(buf + pos, bufsz - pos, 469a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy "Displaying %d channels in 2.4GHz band 802.11bg):\n", 470a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy supp_band->n_channels); 471d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomas 472a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy for (i = 0; i < supp_band->n_channels; i++) 473a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 474a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy "%d: %ddBm: BSS%s%s, %s.\n", 47581e95430aaa898799421617c2db2882386bab69aShanyu Zhao channels[i].hw_value, 476a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy channels[i].max_power, 477a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy channels[i].flags & IEEE80211_CHAN_RADAR ? 478a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy " (IEEE 802.11h required)" : "", 479a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy ((channels[i].flags & IEEE80211_CHAN_NO_IBSS) 480a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy || (channels[i].flags & 481a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy IEEE80211_CHAN_RADAR)) ? "" : 482a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy ", IBSS", 483a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy channels[i].flags & 484a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy IEEE80211_CHAN_PASSIVE_SCAN ? 485a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy "passive only" : "active/passive"); 486a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy } 487d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomas supp_band = iwl_get_hw_mode(priv, IEEE80211_BAND_5GHZ); 488a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy if (supp_band) { 489a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy channels = supp_band->channels; 490d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomas 491d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomas pos += scnprintf(buf + pos, bufsz - pos, 492a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy "Displaying %d channels in 5.2GHz band (802.11a)\n", 493a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy supp_band->n_channels); 494a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy 495a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy for (i = 0; i < supp_band->n_channels; i++) 496a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 497a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy "%d: %ddBm: BSS%s%s, %s.\n", 49881e95430aaa898799421617c2db2882386bab69aShanyu Zhao channels[i].hw_value, 499a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy channels[i].max_power, 500a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy channels[i].flags & IEEE80211_CHAN_RADAR ? 501a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy " (IEEE 802.11h required)" : "", 502a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy ((channels[i].flags & IEEE80211_CHAN_NO_IBSS) 503a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy || (channels[i].flags & 504a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy IEEE80211_CHAN_RADAR)) ? "" : 505a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy ", IBSS", 506a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy channels[i].flags & 507a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy IEEE80211_CHAN_PASSIVE_SCAN ? 508a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy "passive only" : "active/passive"); 509a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy } 510d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomas ret = simple_read_from_buffer(user_buf, count, ppos, buf, pos); 511d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomas kfree(buf); 512d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomas return ret; 513d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomas} 514d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomas 51508df05aa9b25f3079585855506022bb33a011183Wey-Yi Guystatic ssize_t iwl_dbgfs_status_read(struct file *file, 51608df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy char __user *user_buf, 51708df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy size_t count, loff_t *ppos) { 51808df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy 51928f63a4bb744ea81030219aba2337fddb10b380bH Hartley Sweeten struct iwl_priv *priv = file->private_data; 52008df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy char buf[512]; 52108df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy int pos = 0; 52208df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy const size_t bufsz = sizeof(buf); 52308df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy 52408df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "STATUS_HCMD_ACTIVE:\t %d\n", 52563013ae30159c90d2a873e20e680e7810fa533faEmmanuel Grumbach test_bit(STATUS_HCMD_ACTIVE, &priv->shrd->status)); 52608df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "STATUS_INT_ENABLED:\t %d\n", 52763013ae30159c90d2a873e20e680e7810fa533faEmmanuel Grumbach test_bit(STATUS_INT_ENABLED, &priv->shrd->status)); 52808df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "STATUS_RF_KILL_HW:\t %d\n", 52963013ae30159c90d2a873e20e680e7810fa533faEmmanuel Grumbach test_bit(STATUS_RF_KILL_HW, &priv->shrd->status)); 5307812b16730ccebce71a3b2228ac08dd4f8b39469Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "STATUS_CT_KILL:\t\t %d\n", 53163013ae30159c90d2a873e20e680e7810fa533faEmmanuel Grumbach test_bit(STATUS_CT_KILL, &priv->shrd->status)); 53208df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "STATUS_INIT:\t\t %d\n", 53363013ae30159c90d2a873e20e680e7810fa533faEmmanuel Grumbach test_bit(STATUS_INIT, &priv->shrd->status)); 53408df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "STATUS_ALIVE:\t\t %d\n", 53563013ae30159c90d2a873e20e680e7810fa533faEmmanuel Grumbach test_bit(STATUS_ALIVE, &priv->shrd->status)); 53608df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "STATUS_READY:\t\t %d\n", 53763013ae30159c90d2a873e20e680e7810fa533faEmmanuel Grumbach test_bit(STATUS_READY, &priv->shrd->status)); 53808df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "STATUS_TEMPERATURE:\t %d\n", 53963013ae30159c90d2a873e20e680e7810fa533faEmmanuel Grumbach test_bit(STATUS_TEMPERATURE, &priv->shrd->status)); 54008df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "STATUS_GEO_CONFIGURED:\t %d\n", 54163013ae30159c90d2a873e20e680e7810fa533faEmmanuel Grumbach test_bit(STATUS_GEO_CONFIGURED, &priv->shrd->status)); 54208df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "STATUS_EXIT_PENDING:\t %d\n", 54363013ae30159c90d2a873e20e680e7810fa533faEmmanuel Grumbach test_bit(STATUS_EXIT_PENDING, &priv->shrd->status)); 54408df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "STATUS_STATISTICS:\t %d\n", 54563013ae30159c90d2a873e20e680e7810fa533faEmmanuel Grumbach test_bit(STATUS_STATISTICS, &priv->shrd->status)); 54608df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "STATUS_SCANNING:\t %d\n", 54763013ae30159c90d2a873e20e680e7810fa533faEmmanuel Grumbach test_bit(STATUS_SCANNING, &priv->shrd->status)); 54808df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "STATUS_SCAN_ABORTING:\t %d\n", 54963013ae30159c90d2a873e20e680e7810fa533faEmmanuel Grumbach test_bit(STATUS_SCAN_ABORTING, &priv->shrd->status)); 55008df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "STATUS_SCAN_HW:\t\t %d\n", 55163013ae30159c90d2a873e20e680e7810fa533faEmmanuel Grumbach test_bit(STATUS_SCAN_HW, &priv->shrd->status)); 55208df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "STATUS_POWER_PMI:\t %d\n", 55363013ae30159c90d2a873e20e680e7810fa533faEmmanuel Grumbach test_bit(STATUS_POWER_PMI, &priv->shrd->status)); 55408df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "STATUS_FW_ERROR:\t %d\n", 55563013ae30159c90d2a873e20e680e7810fa533faEmmanuel Grumbach test_bit(STATUS_FW_ERROR, &priv->shrd->status)); 55608df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy return simple_read_from_buffer(user_buf, count, ppos, buf, pos); 55708df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy} 55808df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy 5591f7b6172db86e9ab2b4cd794441bb2c40ab287fcEmmanuel Grumbachstatic ssize_t iwl_dbgfs_rx_handlers_read(struct file *file, 560a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy char __user *user_buf, 561a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy size_t count, loff_t *ppos) { 562a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy 56328f63a4bb744ea81030219aba2337fddb10b380bH Hartley Sweeten struct iwl_priv *priv = file->private_data; 5641f7b6172db86e9ab2b4cd794441bb2c40ab287fcEmmanuel Grumbach 565a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy int pos = 0; 566a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy int cnt = 0; 567a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy char *buf; 568a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy int bufsz = 24 * 64; /* 24 items * 64 char per item */ 569a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy ssize_t ret; 570a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy 571a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy buf = kzalloc(bufsz, GFP_KERNEL); 572a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy if (!buf) { 573a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy IWL_ERR(priv, "Can not allocate Buffer\n"); 574a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy return -ENOMEM; 575a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy } 576a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy 577a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy for (cnt = 0; cnt < REPLY_MAX; cnt++) { 5781f7b6172db86e9ab2b4cd794441bb2c40ab287fcEmmanuel Grumbach if (priv->rx_handlers_stats[cnt] > 0) 579a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 580a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy "\tRx handler[%36s]:\t\t %u\n", 581a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy get_cmd_string(cnt), 5821f7b6172db86e9ab2b4cd794441bb2c40ab287fcEmmanuel Grumbach priv->rx_handlers_stats[cnt]); 583a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy } 584a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy 585a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy ret = simple_read_from_buffer(user_buf, count, ppos, buf, pos); 586a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy kfree(buf); 587a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy return ret; 588a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy} 589a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy 5901f7b6172db86e9ab2b4cd794441bb2c40ab287fcEmmanuel Grumbachstatic ssize_t iwl_dbgfs_rx_handlers_write(struct file *file, 591a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy const char __user *user_buf, 592a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy size_t count, loff_t *ppos) 593a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy{ 594a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy struct iwl_priv *priv = file->private_data; 5951f7b6172db86e9ab2b4cd794441bb2c40ab287fcEmmanuel Grumbach 596a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy char buf[8]; 597a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy int buf_size; 598a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy u32 reset_flag; 599a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy 600a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy memset(buf, 0, sizeof(buf)); 601a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy buf_size = min(count, sizeof(buf) - 1); 602a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy if (copy_from_user(buf, user_buf, buf_size)) 603a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy return -EFAULT; 604a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy if (sscanf(buf, "%x", &reset_flag) != 1) 605a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy return -EFAULT; 606a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy if (reset_flag == 0) 6071f7b6172db86e9ab2b4cd794441bb2c40ab287fcEmmanuel Grumbach memset(&priv->rx_handlers_stats[0], 0, 6081f7b6172db86e9ab2b4cd794441bb2c40ab287fcEmmanuel Grumbach sizeof(priv->rx_handlers_stats)); 609a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy 610a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy return count; 611a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy} 612a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy 613f5ad69fa47e7b204d0032d569812544cd9a351fbWey-Yi Guystatic ssize_t iwl_dbgfs_qos_read(struct file *file, char __user *user_buf, 614f5ad69fa47e7b204d0032d569812544cd9a351fbWey-Yi Guy size_t count, loff_t *ppos) 615f5ad69fa47e7b204d0032d569812544cd9a351fbWey-Yi Guy{ 61628f63a4bb744ea81030219aba2337fddb10b380bH Hartley Sweeten struct iwl_priv *priv = file->private_data; 6178dfdb9d5757424f7018a643258065c4fc8e6a439Johannes Berg struct iwl_rxon_context *ctx; 618f5ad69fa47e7b204d0032d569812544cd9a351fbWey-Yi Guy int pos = 0, i; 6198dfdb9d5757424f7018a643258065c4fc8e6a439Johannes Berg char buf[256 * NUM_IWL_RXON_CTX]; 620f5ad69fa47e7b204d0032d569812544cd9a351fbWey-Yi Guy const size_t bufsz = sizeof(buf); 621f5ad69fa47e7b204d0032d569812544cd9a351fbWey-Yi Guy 6228dfdb9d5757424f7018a643258065c4fc8e6a439Johannes Berg for_each_context(priv, ctx) { 6238dfdb9d5757424f7018a643258065c4fc8e6a439Johannes Berg pos += scnprintf(buf + pos, bufsz - pos, "context %d:\n", 6248dfdb9d5757424f7018a643258065c4fc8e6a439Johannes Berg ctx->ctxid); 6258dfdb9d5757424f7018a643258065c4fc8e6a439Johannes Berg for (i = 0; i < AC_NUM; i++) { 6268dfdb9d5757424f7018a643258065c4fc8e6a439Johannes Berg pos += scnprintf(buf + pos, bufsz - pos, 6278dfdb9d5757424f7018a643258065c4fc8e6a439Johannes Berg "\tcw_min\tcw_max\taifsn\ttxop\n"); 6288dfdb9d5757424f7018a643258065c4fc8e6a439Johannes Berg pos += scnprintf(buf + pos, bufsz - pos, 629f5ad69fa47e7b204d0032d569812544cd9a351fbWey-Yi Guy "AC[%d]\t%u\t%u\t%u\t%u\n", i, 6308dfdb9d5757424f7018a643258065c4fc8e6a439Johannes Berg ctx->qos_data.def_qos_parm.ac[i].cw_min, 6318dfdb9d5757424f7018a643258065c4fc8e6a439Johannes Berg ctx->qos_data.def_qos_parm.ac[i].cw_max, 6328dfdb9d5757424f7018a643258065c4fc8e6a439Johannes Berg ctx->qos_data.def_qos_parm.ac[i].aifsn, 6338dfdb9d5757424f7018a643258065c4fc8e6a439Johannes Berg ctx->qos_data.def_qos_parm.ac[i].edca_txop); 6348dfdb9d5757424f7018a643258065c4fc8e6a439Johannes Berg } 6358dfdb9d5757424f7018a643258065c4fc8e6a439Johannes Berg pos += scnprintf(buf + pos, bufsz - pos, "\n"); 636f5ad69fa47e7b204d0032d569812544cd9a351fbWey-Yi Guy } 6374967c31677cf3c6c49aadf205f1a31d15d7610daWey-Yi Guy return simple_read_from_buffer(user_buf, count, ppos, buf, pos); 638f5ad69fa47e7b204d0032d569812544cd9a351fbWey-Yi Guy} 639a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy 640fbf3a2af3834e8e93e9c2876de62c5b49988e352Wey-Yi Guystatic ssize_t iwl_dbgfs_thermal_throttling_read(struct file *file, 641fbf3a2af3834e8e93e9c2876de62c5b49988e352Wey-Yi Guy char __user *user_buf, 642fbf3a2af3834e8e93e9c2876de62c5b49988e352Wey-Yi Guy size_t count, loff_t *ppos) 643fbf3a2af3834e8e93e9c2876de62c5b49988e352Wey-Yi Guy{ 64428f63a4bb744ea81030219aba2337fddb10b380bH Hartley Sweeten struct iwl_priv *priv = file->private_data; 6453ad3b92a5517c043ef30e4b95c4c39a35bbc36beJohannes Berg struct iwl_tt_mgmt *tt = &priv->thermal_throttle; 646fbf3a2af3834e8e93e9c2876de62c5b49988e352Wey-Yi Guy struct iwl_tt_restriction *restriction; 647fbf3a2af3834e8e93e9c2876de62c5b49988e352Wey-Yi Guy char buf[100]; 648fbf3a2af3834e8e93e9c2876de62c5b49988e352Wey-Yi Guy int pos = 0; 649fbf3a2af3834e8e93e9c2876de62c5b49988e352Wey-Yi Guy const size_t bufsz = sizeof(buf); 650fbf3a2af3834e8e93e9c2876de62c5b49988e352Wey-Yi Guy 651fbf3a2af3834e8e93e9c2876de62c5b49988e352Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 652fbf3a2af3834e8e93e9c2876de62c5b49988e352Wey-Yi Guy "Thermal Throttling Mode: %s\n", 6533ad3b92a5517c043ef30e4b95c4c39a35bbc36beJohannes Berg tt->advanced_tt ? "Advance" : "Legacy"); 654fbf3a2af3834e8e93e9c2876de62c5b49988e352Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 655fbf3a2af3834e8e93e9c2876de62c5b49988e352Wey-Yi Guy "Thermal Throttling State: %d\n", 656fbf3a2af3834e8e93e9c2876de62c5b49988e352Wey-Yi Guy tt->state); 6573ad3b92a5517c043ef30e4b95c4c39a35bbc36beJohannes Berg if (tt->advanced_tt) { 658fbf3a2af3834e8e93e9c2876de62c5b49988e352Wey-Yi Guy restriction = tt->restriction + tt->state; 659fbf3a2af3834e8e93e9c2876de62c5b49988e352Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 660fbf3a2af3834e8e93e9c2876de62c5b49988e352Wey-Yi Guy "Tx mode: %d\n", 661fbf3a2af3834e8e93e9c2876de62c5b49988e352Wey-Yi Guy restriction->tx_stream); 662fbf3a2af3834e8e93e9c2876de62c5b49988e352Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 663fbf3a2af3834e8e93e9c2876de62c5b49988e352Wey-Yi Guy "Rx mode: %d\n", 664fbf3a2af3834e8e93e9c2876de62c5b49988e352Wey-Yi Guy restriction->rx_stream); 665fbf3a2af3834e8e93e9c2876de62c5b49988e352Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 666fbf3a2af3834e8e93e9c2876de62c5b49988e352Wey-Yi Guy "HT mode: %d\n", 667fbf3a2af3834e8e93e9c2876de62c5b49988e352Wey-Yi Guy restriction->is_ht); 668fbf3a2af3834e8e93e9c2876de62c5b49988e352Wey-Yi Guy } 6694967c31677cf3c6c49aadf205f1a31d15d7610daWey-Yi Guy return simple_read_from_buffer(user_buf, count, ppos, buf, pos); 670fbf3a2af3834e8e93e9c2876de62c5b49988e352Wey-Yi Guy} 671fbf3a2af3834e8e93e9c2876de62c5b49988e352Wey-Yi Guy 6721e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guystatic ssize_t iwl_dbgfs_disable_ht40_write(struct file *file, 6731e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy const char __user *user_buf, 6741e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy size_t count, loff_t *ppos) 6751e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy{ 6761e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy struct iwl_priv *priv = file->private_data; 6771e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy char buf[8]; 6781e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy int buf_size; 6791e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy int ht40; 6801e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy 6811e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy memset(buf, 0, sizeof(buf)); 6821e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy buf_size = min(count, sizeof(buf) - 1); 6831e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy if (copy_from_user(buf, user_buf, buf_size)) 6841e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy return -EFAULT; 6851e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy if (sscanf(buf, "%d", &ht40) != 1) 6861e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy return -EFAULT; 687246ed355221076884d225f9d8a4c30a048be8162Johannes Berg if (!iwl_is_any_associated(priv)) 6881e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy priv->disable_ht40 = ht40 ? true : false; 6891e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy else { 6901e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy IWL_ERR(priv, "Sta associated with AP - " 6911e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy "Change to 40MHz channel support is not allowed\n"); 6921e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy return -EINVAL; 6931e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy } 6941e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy 6951e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy return count; 6961e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy} 6971e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy 6981e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guystatic ssize_t iwl_dbgfs_disable_ht40_read(struct file *file, 6991e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy char __user *user_buf, 7001e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy size_t count, loff_t *ppos) 7011e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy{ 70228f63a4bb744ea81030219aba2337fddb10b380bH Hartley Sweeten struct iwl_priv *priv = file->private_data; 7031e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy char buf[100]; 7041e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy int pos = 0; 7051e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy const size_t bufsz = sizeof(buf); 7061e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy 7071e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 7081e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy "11n 40MHz Mode: %s\n", 7091e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy priv->disable_ht40 ? "Disabled" : "Enabled"); 7104967c31677cf3c6c49aadf205f1a31d15d7610daWey-Yi Guy return simple_read_from_buffer(user_buf, count, ppos, buf, pos); 7111e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy} 7121e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy 713e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Bergstatic ssize_t iwl_dbgfs_sleep_level_override_write(struct file *file, 714e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg const char __user *user_buf, 715e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg size_t count, loff_t *ppos) 716e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg{ 717e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg struct iwl_priv *priv = file->private_data; 718e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg char buf[8]; 719e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg int buf_size; 720e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg int value; 721e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg 722e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg memset(buf, 0, sizeof(buf)); 723e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg buf_size = min(count, sizeof(buf) - 1); 724e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg if (copy_from_user(buf, user_buf, buf_size)) 725e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg return -EFAULT; 726e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg 727e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg if (sscanf(buf, "%d", &value) != 1) 728e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg return -EINVAL; 729e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg 730e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg /* 731e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg * Our users expect 0 to be "CAM", but 0 isn't actually 732e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg * valid here. However, let's not confuse them and present 733e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg * IWL_POWER_INDEX_1 as "1", not "0". 734e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg */ 7351a34c043802a213e719420ece395cf25c85cc7c5Reinette Chatre if (value == 0) 7361a34c043802a213e719420ece395cf25c85cc7c5Reinette Chatre return -EINVAL; 7371a34c043802a213e719420ece395cf25c85cc7c5Reinette Chatre else if (value > 0) 738e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg value -= 1; 739e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg 740e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg if (value != -1 && (value < 0 || value >= IWL_POWER_NUM)) 741e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg return -EINVAL; 742e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg 743845a9c0d8acea87dede740bc5feb9ec2d00505d9Emmanuel Grumbach if (!iwl_is_ready_rf(priv->shrd)) 7444ad177b5c860dc0b1083eccc55957daf4a116b90Wey-Yi Guy return -EAGAIN; 7454ad177b5c860dc0b1083eccc55957daf4a116b90Wey-Yi Guy 746e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg priv->power_data.debug_sleep_level_override = value; 747e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg 7486ac2f839b0b21225a65f41802c5f0df5eff4f16cEmmanuel Grumbach mutex_lock(&priv->shrd->mutex); 7494ad177b5c860dc0b1083eccc55957daf4a116b90Wey-Yi Guy iwl_power_update_mode(priv, true); 7506ac2f839b0b21225a65f41802c5f0df5eff4f16cEmmanuel Grumbach mutex_unlock(&priv->shrd->mutex); 751e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg 752e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg return count; 753e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg} 754e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg 755e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Bergstatic ssize_t iwl_dbgfs_sleep_level_override_read(struct file *file, 756e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg char __user *user_buf, 757e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg size_t count, loff_t *ppos) 758e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg{ 75928f63a4bb744ea81030219aba2337fddb10b380bH Hartley Sweeten struct iwl_priv *priv = file->private_data; 760e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg char buf[10]; 761e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg int pos, value; 762e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg const size_t bufsz = sizeof(buf); 763e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg 764e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg /* see the write function */ 765e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg value = priv->power_data.debug_sleep_level_override; 766e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg if (value >= 0) 767e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg value += 1; 768e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg 769e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg pos = scnprintf(buf, bufsz, "%d\n", value); 770e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg return simple_read_from_buffer(user_buf, count, ppos, buf, pos); 771e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg} 772e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg 773e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Bergstatic ssize_t iwl_dbgfs_current_sleep_command_read(struct file *file, 774e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg char __user *user_buf, 775e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg size_t count, loff_t *ppos) 776e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg{ 77728f63a4bb744ea81030219aba2337fddb10b380bH Hartley Sweeten struct iwl_priv *priv = file->private_data; 778e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg char buf[200]; 779e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg int pos = 0, i; 780e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg const size_t bufsz = sizeof(buf); 781e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg struct iwl_powertable_cmd *cmd = &priv->power_data.sleep_cmd; 782e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg 783e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg pos += scnprintf(buf + pos, bufsz - pos, 784e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg "flags: %#.2x\n", le16_to_cpu(cmd->flags)); 785e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg pos += scnprintf(buf + pos, bufsz - pos, 786e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg "RX/TX timeout: %d/%d usec\n", 787e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg le32_to_cpu(cmd->rx_data_timeout), 788e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg le32_to_cpu(cmd->tx_data_timeout)); 789e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg for (i = 0; i < IWL_POWER_VEC_SIZE; i++) 790e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg pos += scnprintf(buf + pos, bufsz - pos, 791e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg "sleep_interval[%d]: %d\n", i, 792e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg le32_to_cpu(cmd->sleep_interval[i])); 793e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg 794e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg return simple_read_from_buffer(user_buf, count, ppos, buf, pos); 795e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg} 796e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg 797712b6cf57a53da608a682b5f782c5785bda76001Tomas WinklerDEBUGFS_READ_WRITE_FILE_OPS(sram); 798c8ac61cf6e53fefb3b439fc58390fb65d2730e63Johannes BergDEBUGFS_READ_FILE_OPS(wowlan_sram); 7990848e297c2107dbc12a91a1709c879c73bd188d8Wey-Yi GuyDEBUGFS_READ_FILE_OPS(nvm); 800712b6cf57a53da608a682b5f782c5785bda76001Tomas WinklerDEBUGFS_READ_FILE_OPS(stations); 801d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, TomasDEBUGFS_READ_FILE_OPS(channels); 80208df05aa9b25f3079585855506022bb33a011183Wey-Yi GuyDEBUGFS_READ_FILE_OPS(status); 8031f7b6172db86e9ab2b4cd794441bb2c40ab287fcEmmanuel GrumbachDEBUGFS_READ_WRITE_FILE_OPS(rx_handlers); 804f5ad69fa47e7b204d0032d569812544cd9a351fbWey-Yi GuyDEBUGFS_READ_FILE_OPS(qos); 805fbf3a2af3834e8e93e9c2876de62c5b49988e352Wey-Yi GuyDEBUGFS_READ_FILE_OPS(thermal_throttling); 8061e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi GuyDEBUGFS_READ_WRITE_FILE_OPS(disable_ht40); 807e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes BergDEBUGFS_READ_WRITE_FILE_OPS(sleep_level_override); 808e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes BergDEBUGFS_READ_FILE_OPS(current_sleep_command); 809712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 810d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guystatic const char *fmt_value = " %-30s %10u\n"; 811d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guystatic const char *fmt_hex = " %-30s 0x%02X\n"; 812d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guystatic const char *fmt_table = " %-30s %10u %10u %10u %10u\n"; 813d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guystatic const char *fmt_header = 814d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy "%-32s current cumulative delta max\n"; 815d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy 816d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guystatic int iwl_statistics_flag(struct iwl_priv *priv, char *buf, int bufsz) 817d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy{ 818d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy int p = 0; 819d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy u32 flag; 820d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy 821d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy flag = le32_to_cpu(priv->statistics.flag); 822d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy 823d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy p += scnprintf(buf + p, bufsz - p, "Statistics Flag(0x%X):\n", flag); 824d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy if (flag & UCODE_STATISTICS_CLEAR_MSK) 825d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy p += scnprintf(buf + p, bufsz - p, 826d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy "\tStatistics have been cleared\n"); 827d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy p += scnprintf(buf + p, bufsz - p, "\tOperational Frequency: %s\n", 828d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy (flag & UCODE_STATISTICS_FREQUENCY_MSK) 829d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy ? "2.4 GHz" : "5.2 GHz"); 830d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy p += scnprintf(buf + p, bufsz - p, "\tTGj Narrow Band: %s\n", 831d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy (flag & UCODE_STATISTICS_NARROW_BAND_MSK) 832d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy ? "enabled" : "disabled"); 833d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy 834d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy return p; 835d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy} 836d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy 837e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guystatic ssize_t iwl_dbgfs_ucode_rx_stats_read(struct file *file, 838e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guy char __user *user_buf, 839e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guy size_t count, loff_t *ppos) 840e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guy{ 84128f63a4bb744ea81030219aba2337fddb10b380bH Hartley Sweeten struct iwl_priv *priv = file->private_data; 842d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy int pos = 0; 843d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy char *buf; 844d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy int bufsz = sizeof(struct statistics_rx_phy) * 40 + 845d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy sizeof(struct statistics_rx_non_phy) * 40 + 846d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy sizeof(struct statistics_rx_ht_phy) * 40 + 400; 847d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy ssize_t ret; 848d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy struct statistics_rx_phy *ofdm, *accum_ofdm, *delta_ofdm, *max_ofdm; 849d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy struct statistics_rx_phy *cck, *accum_cck, *delta_cck, *max_cck; 850d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy struct statistics_rx_non_phy *general, *accum_general; 851d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy struct statistics_rx_non_phy *delta_general, *max_general; 852d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy struct statistics_rx_ht_phy *ht, *accum_ht, *delta_ht, *max_ht; 853d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy 854845a9c0d8acea87dede740bc5feb9ec2d00505d9Emmanuel Grumbach if (!iwl_is_alive(priv->shrd)) 855d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy return -EAGAIN; 856d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy 857d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy buf = kzalloc(bufsz, GFP_KERNEL); 858d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy if (!buf) { 859d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy IWL_ERR(priv, "Can not allocate Buffer\n"); 860d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy return -ENOMEM; 861d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy } 862d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy 863d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy /* 864d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy * the statistic information display here is based on 865d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy * the last statistics notification from uCode 866d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy * might not reflect the current uCode activity 867d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy */ 868d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy ofdm = &priv->statistics.rx_ofdm; 869d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy cck = &priv->statistics.rx_cck; 870d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy general = &priv->statistics.rx_non_phy; 871d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy ht = &priv->statistics.rx_ofdm_ht; 872d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_ofdm = &priv->accum_stats.rx_ofdm; 873d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_cck = &priv->accum_stats.rx_cck; 874d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_general = &priv->accum_stats.rx_non_phy; 875d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_ht = &priv->accum_stats.rx_ofdm_ht; 876d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_ofdm = &priv->delta_stats.rx_ofdm; 877d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_cck = &priv->delta_stats.rx_cck; 878d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_general = &priv->delta_stats.rx_non_phy; 879d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_ht = &priv->delta_stats.rx_ofdm_ht; 880d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_ofdm = &priv->max_delta_stats.rx_ofdm; 881d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_cck = &priv->max_delta_stats.rx_cck; 882d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_general = &priv->max_delta_stats.rx_non_phy; 883d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_ht = &priv->max_delta_stats.rx_ofdm_ht; 884d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy 885d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += iwl_statistics_flag(priv, buf, bufsz); 886d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 887d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_header, "Statistics_Rx - OFDM:"); 888d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 889d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "ina_cnt:", 890d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(ofdm->ina_cnt), 891d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_ofdm->ina_cnt, 892d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_ofdm->ina_cnt, max_ofdm->ina_cnt); 893d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 894d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "fina_cnt:", 895d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(ofdm->fina_cnt), accum_ofdm->fina_cnt, 896d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_ofdm->fina_cnt, max_ofdm->fina_cnt); 897d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 898d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "plcp_err:", 899d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(ofdm->plcp_err), accum_ofdm->plcp_err, 900d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_ofdm->plcp_err, max_ofdm->plcp_err); 901d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 902d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "crc32_err:", 903d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(ofdm->crc32_err), accum_ofdm->crc32_err, 904d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_ofdm->crc32_err, max_ofdm->crc32_err); 905d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 906d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "overrun_err:", 907d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(ofdm->overrun_err), 908d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_ofdm->overrun_err, delta_ofdm->overrun_err, 909d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_ofdm->overrun_err); 910d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 911d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "early_overrun_err:", 912d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(ofdm->early_overrun_err), 913d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_ofdm->early_overrun_err, 914d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_ofdm->early_overrun_err, 915d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_ofdm->early_overrun_err); 916d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 917d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "crc32_good:", 918d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(ofdm->crc32_good), 919d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_ofdm->crc32_good, delta_ofdm->crc32_good, 920d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_ofdm->crc32_good); 921d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 922d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "false_alarm_cnt:", 923d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(ofdm->false_alarm_cnt), 924d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_ofdm->false_alarm_cnt, 925d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_ofdm->false_alarm_cnt, 926d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_ofdm->false_alarm_cnt); 927d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 928d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "fina_sync_err_cnt:", 929d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(ofdm->fina_sync_err_cnt), 930d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_ofdm->fina_sync_err_cnt, 931d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_ofdm->fina_sync_err_cnt, 932d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_ofdm->fina_sync_err_cnt); 933d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 934d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "sfd_timeout:", 935d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(ofdm->sfd_timeout), 936d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_ofdm->sfd_timeout, delta_ofdm->sfd_timeout, 937d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_ofdm->sfd_timeout); 938d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 939d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "fina_timeout:", 940d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(ofdm->fina_timeout), 941d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_ofdm->fina_timeout, delta_ofdm->fina_timeout, 942d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_ofdm->fina_timeout); 943d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 944d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "unresponded_rts:", 945d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(ofdm->unresponded_rts), 946d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_ofdm->unresponded_rts, 947d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_ofdm->unresponded_rts, 948d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_ofdm->unresponded_rts); 949d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 950d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "rxe_frame_lmt_ovrun:", 951d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(ofdm->rxe_frame_limit_overrun), 952d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_ofdm->rxe_frame_limit_overrun, 953d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_ofdm->rxe_frame_limit_overrun, 954d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_ofdm->rxe_frame_limit_overrun); 955d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 956d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "sent_ack_cnt:", 957d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(ofdm->sent_ack_cnt), 958d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_ofdm->sent_ack_cnt, delta_ofdm->sent_ack_cnt, 959d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_ofdm->sent_ack_cnt); 960d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 961d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "sent_cts_cnt:", 962d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(ofdm->sent_cts_cnt), 963d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_ofdm->sent_cts_cnt, delta_ofdm->sent_cts_cnt, 964d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_ofdm->sent_cts_cnt); 965d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 966d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "sent_ba_rsp_cnt:", 967d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(ofdm->sent_ba_rsp_cnt), 968d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_ofdm->sent_ba_rsp_cnt, 969d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_ofdm->sent_ba_rsp_cnt, 970d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_ofdm->sent_ba_rsp_cnt); 971d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 972d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "dsp_self_kill:", 973d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(ofdm->dsp_self_kill), 974d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_ofdm->dsp_self_kill, 975d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_ofdm->dsp_self_kill, 976d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_ofdm->dsp_self_kill); 977d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 978d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "mh_format_err:", 979d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(ofdm->mh_format_err), 980d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_ofdm->mh_format_err, 981d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_ofdm->mh_format_err, 982d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_ofdm->mh_format_err); 983d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 984d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "re_acq_main_rssi_sum:", 985d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(ofdm->re_acq_main_rssi_sum), 986d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_ofdm->re_acq_main_rssi_sum, 987d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_ofdm->re_acq_main_rssi_sum, 988d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_ofdm->re_acq_main_rssi_sum); 989d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy 990d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 991d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_header, "Statistics_Rx - CCK:"); 992d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 993d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "ina_cnt:", 994d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(cck->ina_cnt), accum_cck->ina_cnt, 995d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_cck->ina_cnt, max_cck->ina_cnt); 996d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 997d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "fina_cnt:", 998d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(cck->fina_cnt), accum_cck->fina_cnt, 999d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_cck->fina_cnt, max_cck->fina_cnt); 1000d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1001d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "plcp_err:", 1002d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(cck->plcp_err), accum_cck->plcp_err, 1003d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_cck->plcp_err, max_cck->plcp_err); 1004d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1005d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "crc32_err:", 1006d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(cck->crc32_err), accum_cck->crc32_err, 1007d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_cck->crc32_err, max_cck->crc32_err); 1008d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1009d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "overrun_err:", 1010d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(cck->overrun_err), 1011d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_cck->overrun_err, delta_cck->overrun_err, 1012d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_cck->overrun_err); 1013d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1014d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "early_overrun_err:", 1015d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(cck->early_overrun_err), 1016d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_cck->early_overrun_err, 1017d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_cck->early_overrun_err, 1018d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_cck->early_overrun_err); 1019d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1020d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "crc32_good:", 1021d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(cck->crc32_good), accum_cck->crc32_good, 1022d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_cck->crc32_good, max_cck->crc32_good); 1023d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1024d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "false_alarm_cnt:", 1025d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(cck->false_alarm_cnt), 1026d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_cck->false_alarm_cnt, 1027d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_cck->false_alarm_cnt, max_cck->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(cck->fina_sync_err_cnt), 1031d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_cck->fina_sync_err_cnt, 1032d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_cck->fina_sync_err_cnt, 1033d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_cck->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(cck->sfd_timeout), 1037d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_cck->sfd_timeout, delta_cck->sfd_timeout, 1038d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_cck->sfd_timeout); 1039d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1040d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "fina_timeout:", 1041d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(cck->fina_timeout), 1042d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_cck->fina_timeout, delta_cck->fina_timeout, 1043d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_cck->fina_timeout); 1044d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1045d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "unresponded_rts:", 1046d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(cck->unresponded_rts), 1047d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_cck->unresponded_rts, delta_cck->unresponded_rts, 1048d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_cck->unresponded_rts); 1049d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1050d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "rxe_frame_lmt_ovrun:", 1051d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(cck->rxe_frame_limit_overrun), 1052d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_cck->rxe_frame_limit_overrun, 1053d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_cck->rxe_frame_limit_overrun, 1054d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_cck->rxe_frame_limit_overrun); 1055d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1056d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "sent_ack_cnt:", 1057d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(cck->sent_ack_cnt), 1058d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_cck->sent_ack_cnt, delta_cck->sent_ack_cnt, 1059d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_cck->sent_ack_cnt); 1060d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1061d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "sent_cts_cnt:", 1062d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(cck->sent_cts_cnt), 1063d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_cck->sent_cts_cnt, delta_cck->sent_cts_cnt, 1064d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_cck->sent_cts_cnt); 1065d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1066d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "sent_ba_rsp_cnt:", 1067d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(cck->sent_ba_rsp_cnt), 1068d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_cck->sent_ba_rsp_cnt, 1069d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_cck->sent_ba_rsp_cnt, 1070d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_cck->sent_ba_rsp_cnt); 1071d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1072d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "dsp_self_kill:", 1073d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(cck->dsp_self_kill), 1074d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_cck->dsp_self_kill, delta_cck->dsp_self_kill, 1075d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_cck->dsp_self_kill); 1076d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1077d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "mh_format_err:", 1078d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(cck->mh_format_err), 1079d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_cck->mh_format_err, delta_cck->mh_format_err, 1080d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_cck->mh_format_err); 1081d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1082d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "re_acq_main_rssi_sum:", 1083d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(cck->re_acq_main_rssi_sum), 1084d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_cck->re_acq_main_rssi_sum, 1085d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_cck->re_acq_main_rssi_sum, 1086d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_cck->re_acq_main_rssi_sum); 1087d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy 1088d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1089d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_header, "Statistics_Rx - GENERAL:"); 1090d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1091d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "bogus_cts:", 1092d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(general->bogus_cts), 1093d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_general->bogus_cts, delta_general->bogus_cts, 1094d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_general->bogus_cts); 1095d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1096d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "bogus_ack:", 1097d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(general->bogus_ack), 1098d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_general->bogus_ack, delta_general->bogus_ack, 1099d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_general->bogus_ack); 1100d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1101d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "non_bssid_frames:", 1102d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(general->non_bssid_frames), 1103d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_general->non_bssid_frames, 1104d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_general->non_bssid_frames, 1105d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_general->non_bssid_frames); 1106d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1107d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "filtered_frames:", 1108d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(general->filtered_frames), 1109d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_general->filtered_frames, 1110d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_general->filtered_frames, 1111d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_general->filtered_frames); 1112d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1113d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "non_channel_beacons:", 1114d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(general->non_channel_beacons), 1115d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_general->non_channel_beacons, 1116d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_general->non_channel_beacons, 1117d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_general->non_channel_beacons); 1118d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1119d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "channel_beacons:", 1120d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(general->channel_beacons), 1121d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_general->channel_beacons, 1122d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_general->channel_beacons, 1123d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_general->channel_beacons); 1124d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1125d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "num_missed_bcon:", 1126d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(general->num_missed_bcon), 1127d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_general->num_missed_bcon, 1128d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_general->num_missed_bcon, 1129d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_general->num_missed_bcon); 1130d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1131d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "adc_rx_saturation_time:", 1132d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(general->adc_rx_saturation_time), 1133d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_general->adc_rx_saturation_time, 1134d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_general->adc_rx_saturation_time, 1135d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_general->adc_rx_saturation_time); 1136d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1137d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "ina_detect_search_tm:", 1138d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(general->ina_detection_search_time), 1139d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_general->ina_detection_search_time, 1140d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_general->ina_detection_search_time, 1141d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_general->ina_detection_search_time); 1142d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1143d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "beacon_silence_rssi_a:", 1144d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(general->beacon_silence_rssi_a), 1145d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_general->beacon_silence_rssi_a, 1146d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_general->beacon_silence_rssi_a, 1147d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_general->beacon_silence_rssi_a); 1148d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1149d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "beacon_silence_rssi_b:", 1150d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(general->beacon_silence_rssi_b), 1151d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_general->beacon_silence_rssi_b, 1152d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_general->beacon_silence_rssi_b, 1153d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_general->beacon_silence_rssi_b); 1154d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1155d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "beacon_silence_rssi_c:", 1156d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(general->beacon_silence_rssi_c), 1157d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_general->beacon_silence_rssi_c, 1158d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_general->beacon_silence_rssi_c, 1159d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_general->beacon_silence_rssi_c); 1160d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1161d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "interference_data_flag:", 1162d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(general->interference_data_flag), 1163d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_general->interference_data_flag, 1164d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_general->interference_data_flag, 1165d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_general->interference_data_flag); 1166d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1167d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "channel_load:", 1168d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(general->channel_load), 1169d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_general->channel_load, 1170d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_general->channel_load, 1171d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_general->channel_load); 1172d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1173d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "dsp_false_alarms:", 1174d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(general->dsp_false_alarms), 1175d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_general->dsp_false_alarms, 1176d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_general->dsp_false_alarms, 1177d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_general->dsp_false_alarms); 1178d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1179d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "beacon_rssi_a:", 1180d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(general->beacon_rssi_a), 1181d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_general->beacon_rssi_a, 1182d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_general->beacon_rssi_a, 1183d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_general->beacon_rssi_a); 1184d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1185d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "beacon_rssi_b:", 1186d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(general->beacon_rssi_b), 1187d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_general->beacon_rssi_b, 1188d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_general->beacon_rssi_b, 1189d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_general->beacon_rssi_b); 1190d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1191d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "beacon_rssi_c:", 1192d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(general->beacon_rssi_c), 1193d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_general->beacon_rssi_c, 1194d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_general->beacon_rssi_c, 1195d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_general->beacon_rssi_c); 1196d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1197d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "beacon_energy_a:", 1198d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(general->beacon_energy_a), 1199d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_general->beacon_energy_a, 1200d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_general->beacon_energy_a, 1201d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_general->beacon_energy_a); 1202d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1203d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "beacon_energy_b:", 1204d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(general->beacon_energy_b), 1205d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_general->beacon_energy_b, 1206d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_general->beacon_energy_b, 1207d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_general->beacon_energy_b); 1208d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1209d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "beacon_energy_c:", 1210d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(general->beacon_energy_c), 1211d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_general->beacon_energy_c, 1212d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_general->beacon_energy_c, 1213d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_general->beacon_energy_c); 1214d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy 1215d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1216d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_header, "Statistics_Rx - OFDM_HT:"); 1217d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1218d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "plcp_err:", 1219d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(ht->plcp_err), accum_ht->plcp_err, 1220d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_ht->plcp_err, max_ht->plcp_err); 1221d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1222d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "overrun_err:", 1223d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(ht->overrun_err), accum_ht->overrun_err, 1224d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_ht->overrun_err, max_ht->overrun_err); 1225d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1226d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "early_overrun_err:", 1227d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(ht->early_overrun_err), 1228d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_ht->early_overrun_err, 1229d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_ht->early_overrun_err, 1230d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_ht->early_overrun_err); 1231d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1232d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "crc32_good:", 1233d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(ht->crc32_good), accum_ht->crc32_good, 1234d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_ht->crc32_good, max_ht->crc32_good); 1235d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1236d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "crc32_err:", 1237d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(ht->crc32_err), accum_ht->crc32_err, 1238d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_ht->crc32_err, max_ht->crc32_err); 1239d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1240d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "mh_format_err:", 1241d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(ht->mh_format_err), 1242d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_ht->mh_format_err, 1243d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_ht->mh_format_err, max_ht->mh_format_err); 1244d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1245d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "agg_crc32_good:", 1246d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(ht->agg_crc32_good), 1247d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_ht->agg_crc32_good, 1248d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_ht->agg_crc32_good, max_ht->agg_crc32_good); 1249d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1250d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "agg_mpdu_cnt:", 1251d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(ht->agg_mpdu_cnt), 1252d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_ht->agg_mpdu_cnt, 1253d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_ht->agg_mpdu_cnt, max_ht->agg_mpdu_cnt); 1254d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1255d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "agg_cnt:", 1256d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(ht->agg_cnt), accum_ht->agg_cnt, 1257d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_ht->agg_cnt, max_ht->agg_cnt); 1258d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1259d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "unsupport_mcs:", 1260d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(ht->unsupport_mcs), 1261d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_ht->unsupport_mcs, 1262d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_ht->unsupport_mcs, max_ht->unsupport_mcs); 1263d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy 1264d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy ret = simple_read_from_buffer(user_buf, count, ppos, buf, pos); 1265d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy kfree(buf); 1266d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy return ret; 1267e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guy} 1268e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guy 1269e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guystatic ssize_t iwl_dbgfs_ucode_tx_stats_read(struct file *file, 1270e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guy char __user *user_buf, 1271e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guy size_t count, loff_t *ppos) 1272e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guy{ 127328f63a4bb744ea81030219aba2337fddb10b380bH Hartley Sweeten struct iwl_priv *priv = file->private_data; 1274d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy int pos = 0; 1275d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy char *buf; 1276d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy int bufsz = (sizeof(struct statistics_tx) * 48) + 250; 1277d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy ssize_t ret; 1278d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy struct statistics_tx *tx, *accum_tx, *delta_tx, *max_tx; 1279d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy 1280845a9c0d8acea87dede740bc5feb9ec2d00505d9Emmanuel Grumbach if (!iwl_is_alive(priv->shrd)) 1281d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy return -EAGAIN; 1282d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy 1283d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy buf = kzalloc(bufsz, GFP_KERNEL); 1284d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy if (!buf) { 1285d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy IWL_ERR(priv, "Can not allocate Buffer\n"); 1286d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy return -ENOMEM; 1287d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy } 1288d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy 1289d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy /* the statistic information display here is based on 1290d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy * the last statistics notification from uCode 1291d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy * might not reflect the current uCode activity 1292d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy */ 1293d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy tx = &priv->statistics.tx; 1294d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_tx = &priv->accum_stats.tx; 1295d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_tx = &priv->delta_stats.tx; 1296d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_tx = &priv->max_delta_stats.tx; 1297d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy 1298d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += iwl_statistics_flag(priv, buf, bufsz); 1299d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1300d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_header, "Statistics_Tx:"); 1301d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1302d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "preamble:", 1303d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(tx->preamble_cnt), 1304d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_tx->preamble_cnt, 1305d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_tx->preamble_cnt, max_tx->preamble_cnt); 1306d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1307d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "rx_detected_cnt:", 1308d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(tx->rx_detected_cnt), 1309d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_tx->rx_detected_cnt, 1310d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_tx->rx_detected_cnt, max_tx->rx_detected_cnt); 1311d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1312d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "bt_prio_defer_cnt:", 1313d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(tx->bt_prio_defer_cnt), 1314d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_tx->bt_prio_defer_cnt, 1315d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_tx->bt_prio_defer_cnt, 1316d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_tx->bt_prio_defer_cnt); 1317d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1318d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "bt_prio_kill_cnt:", 1319d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(tx->bt_prio_kill_cnt), 1320d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_tx->bt_prio_kill_cnt, 1321d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_tx->bt_prio_kill_cnt, 1322d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_tx->bt_prio_kill_cnt); 1323d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1324d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "few_bytes_cnt:", 1325d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(tx->few_bytes_cnt), 1326d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_tx->few_bytes_cnt, 1327d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_tx->few_bytes_cnt, max_tx->few_bytes_cnt); 1328d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1329d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "cts_timeout:", 1330d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(tx->cts_timeout), accum_tx->cts_timeout, 1331d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_tx->cts_timeout, max_tx->cts_timeout); 1332d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1333d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "ack_timeout:", 1334d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(tx->ack_timeout), 1335d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_tx->ack_timeout, 1336d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_tx->ack_timeout, max_tx->ack_timeout); 1337d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1338d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "expected_ack_cnt:", 1339d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(tx->expected_ack_cnt), 1340d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_tx->expected_ack_cnt, 1341d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_tx->expected_ack_cnt, 1342d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_tx->expected_ack_cnt); 1343d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1344d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "actual_ack_cnt:", 1345d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(tx->actual_ack_cnt), 1346d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_tx->actual_ack_cnt, 1347d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_tx->actual_ack_cnt, 1348d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_tx->actual_ack_cnt); 1349d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1350d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "dump_msdu_cnt:", 1351d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(tx->dump_msdu_cnt), 1352d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_tx->dump_msdu_cnt, 1353d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_tx->dump_msdu_cnt, 1354d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_tx->dump_msdu_cnt); 1355d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1356d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "abort_nxt_frame_mismatch:", 1357d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(tx->burst_abort_next_frame_mismatch_cnt), 1358d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_tx->burst_abort_next_frame_mismatch_cnt, 1359d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_tx->burst_abort_next_frame_mismatch_cnt, 1360d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_tx->burst_abort_next_frame_mismatch_cnt); 1361d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1362d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "abort_missing_nxt_frame:", 1363d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(tx->burst_abort_missing_next_frame_cnt), 1364d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_tx->burst_abort_missing_next_frame_cnt, 1365d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_tx->burst_abort_missing_next_frame_cnt, 1366d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_tx->burst_abort_missing_next_frame_cnt); 1367d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1368d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "cts_timeout_collision:", 1369d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(tx->cts_timeout_collision), 1370d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_tx->cts_timeout_collision, 1371d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_tx->cts_timeout_collision, 1372d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_tx->cts_timeout_collision); 1373d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1374d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "ack_ba_timeout_collision:", 1375d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(tx->ack_or_ba_timeout_collision), 1376d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_tx->ack_or_ba_timeout_collision, 1377d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_tx->ack_or_ba_timeout_collision, 1378d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_tx->ack_or_ba_timeout_collision); 1379d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1380d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "agg ba_timeout:", 1381d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(tx->agg.ba_timeout), 1382d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_tx->agg.ba_timeout, 1383d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_tx->agg.ba_timeout, 1384d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_tx->agg.ba_timeout); 1385d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1386d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "agg ba_resched_frames:", 1387d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(tx->agg.ba_reschedule_frames), 1388d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_tx->agg.ba_reschedule_frames, 1389d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_tx->agg.ba_reschedule_frames, 1390d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_tx->agg.ba_reschedule_frames); 1391d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1392d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "agg scd_query_agg_frame:", 1393d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(tx->agg.scd_query_agg_frame_cnt), 1394d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_tx->agg.scd_query_agg_frame_cnt, 1395d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_tx->agg.scd_query_agg_frame_cnt, 1396d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_tx->agg.scd_query_agg_frame_cnt); 1397d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1398d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "agg scd_query_no_agg:", 1399d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(tx->agg.scd_query_no_agg), 1400d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_tx->agg.scd_query_no_agg, 1401d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_tx->agg.scd_query_no_agg, 1402d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_tx->agg.scd_query_no_agg); 1403d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1404d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "agg scd_query_agg:", 1405d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(tx->agg.scd_query_agg), 1406d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_tx->agg.scd_query_agg, 1407d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_tx->agg.scd_query_agg, 1408d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_tx->agg.scd_query_agg); 1409d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1410d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "agg scd_query_mismatch:", 1411d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(tx->agg.scd_query_mismatch), 1412d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_tx->agg.scd_query_mismatch, 1413d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_tx->agg.scd_query_mismatch, 1414d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_tx->agg.scd_query_mismatch); 1415d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1416d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "agg frame_not_ready:", 1417d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(tx->agg.frame_not_ready), 1418d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_tx->agg.frame_not_ready, 1419d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_tx->agg.frame_not_ready, 1420d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_tx->agg.frame_not_ready); 1421d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1422d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "agg underrun:", 1423d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(tx->agg.underrun), 1424d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_tx->agg.underrun, 1425d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_tx->agg.underrun, max_tx->agg.underrun); 1426d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1427d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "agg bt_prio_kill:", 1428d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(tx->agg.bt_prio_kill), 1429d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_tx->agg.bt_prio_kill, 1430d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_tx->agg.bt_prio_kill, 1431d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_tx->agg.bt_prio_kill); 1432d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1433d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "agg rx_ba_rsp_cnt:", 1434d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(tx->agg.rx_ba_rsp_cnt), 1435d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_tx->agg.rx_ba_rsp_cnt, 1436d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_tx->agg.rx_ba_rsp_cnt, 1437d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_tx->agg.rx_ba_rsp_cnt); 1438d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy 1439d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy if (tx->tx_power.ant_a || tx->tx_power.ant_b || tx->tx_power.ant_c) { 1440d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1441d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy "tx power: (1/2 dB step)\n"); 1442d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy if ((priv->cfg->valid_tx_ant & ANT_A) && tx->tx_power.ant_a) 1443d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1444d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_hex, "antenna A:", 1445d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy tx->tx_power.ant_a); 1446d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy if ((priv->cfg->valid_tx_ant & ANT_B) && tx->tx_power.ant_b) 1447d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1448d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_hex, "antenna B:", 1449d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy tx->tx_power.ant_b); 1450d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy if ((priv->cfg->valid_tx_ant & ANT_C) && tx->tx_power.ant_c) 1451d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1452d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_hex, "antenna C:", 1453d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy tx->tx_power.ant_c); 1454d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy } 1455d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy ret = simple_read_from_buffer(user_buf, count, ppos, buf, pos); 1456d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy kfree(buf); 1457d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy return ret; 1458e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guy} 1459e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guy 1460e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guystatic ssize_t iwl_dbgfs_ucode_general_stats_read(struct file *file, 1461e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guy char __user *user_buf, 1462e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guy size_t count, loff_t *ppos) 1463e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guy{ 146428f63a4bb744ea81030219aba2337fddb10b380bH Hartley Sweeten struct iwl_priv *priv = file->private_data; 1465d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy int pos = 0; 1466d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy char *buf; 1467d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy int bufsz = sizeof(struct statistics_general) * 10 + 300; 1468d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy ssize_t ret; 1469d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy struct statistics_general_common *general, *accum_general; 1470d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy struct statistics_general_common *delta_general, *max_general; 1471d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy struct statistics_dbg *dbg, *accum_dbg, *delta_dbg, *max_dbg; 1472d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy struct statistics_div *div, *accum_div, *delta_div, *max_div; 1473d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy 1474845a9c0d8acea87dede740bc5feb9ec2d00505d9Emmanuel Grumbach if (!iwl_is_alive(priv->shrd)) 1475d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy return -EAGAIN; 1476d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy 1477d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy buf = kzalloc(bufsz, GFP_KERNEL); 1478d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy if (!buf) { 1479d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy IWL_ERR(priv, "Can not allocate Buffer\n"); 1480d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy return -ENOMEM; 1481d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy } 1482d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy 1483d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy /* the statistic information display here is based on 1484d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy * the last statistics notification from uCode 1485d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy * might not reflect the current uCode activity 1486d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy */ 1487d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy general = &priv->statistics.common; 1488d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy dbg = &priv->statistics.common.dbg; 1489d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy div = &priv->statistics.common.div; 1490d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_general = &priv->accum_stats.common; 1491d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_dbg = &priv->accum_stats.common.dbg; 1492d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_div = &priv->accum_stats.common.div; 1493d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_general = &priv->delta_stats.common; 1494d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_general = &priv->max_delta_stats.common; 1495d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_dbg = &priv->delta_stats.common.dbg; 1496d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_dbg = &priv->max_delta_stats.common.dbg; 1497d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_div = &priv->delta_stats.common.div; 1498d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_div = &priv->max_delta_stats.common.div; 1499d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy 1500d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += iwl_statistics_flag(priv, buf, bufsz); 1501d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1502d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_header, "Statistics_General:"); 1503d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1504d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_value, "temperature:", 1505d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(general->temperature)); 1506d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1507d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_value, "temperature_m:", 1508d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(general->temperature_m)); 1509d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1510d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_value, "ttl_timestamp:", 1511d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(general->ttl_timestamp)); 1512d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1513d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "burst_check:", 1514d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(dbg->burst_check), 1515d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_dbg->burst_check, 1516d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_dbg->burst_check, max_dbg->burst_check); 1517d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1518d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "burst_count:", 1519d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(dbg->burst_count), 1520d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_dbg->burst_count, 1521d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_dbg->burst_count, max_dbg->burst_count); 1522d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1523d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "wait_for_silence_timeout_count:", 1524d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(dbg->wait_for_silence_timeout_cnt), 1525d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_dbg->wait_for_silence_timeout_cnt, 1526d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_dbg->wait_for_silence_timeout_cnt, 1527d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_dbg->wait_for_silence_timeout_cnt); 1528d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1529d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "sleep_time:", 1530d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(general->sleep_time), 1531d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_general->sleep_time, 1532d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_general->sleep_time, max_general->sleep_time); 1533d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1534d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "slots_out:", 1535d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(general->slots_out), 1536d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_general->slots_out, 1537d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_general->slots_out, max_general->slots_out); 1538d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1539d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "slots_idle:", 1540d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(general->slots_idle), 1541d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_general->slots_idle, 1542d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_general->slots_idle, max_general->slots_idle); 1543d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1544d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "tx_on_a:", 1545d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(div->tx_on_a), accum_div->tx_on_a, 1546d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_div->tx_on_a, max_div->tx_on_a); 1547d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1548d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "tx_on_b:", 1549d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(div->tx_on_b), accum_div->tx_on_b, 1550d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_div->tx_on_b, max_div->tx_on_b); 1551d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1552d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "exec_time:", 1553d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(div->exec_time), accum_div->exec_time, 1554d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_div->exec_time, max_div->exec_time); 1555d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1556d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "probe_time:", 1557d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(div->probe_time), accum_div->probe_time, 1558d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_div->probe_time, max_div->probe_time); 1559d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1560d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "rx_enable_counter:", 1561d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(general->rx_enable_counter), 1562d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_general->rx_enable_counter, 1563d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_general->rx_enable_counter, 1564d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_general->rx_enable_counter); 1565d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1566d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy fmt_table, "num_of_sos_states:", 1567d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(general->num_of_sos_states), 1568d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_general->num_of_sos_states, 1569d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy delta_general->num_of_sos_states, 1570d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy max_general->num_of_sos_states); 1571d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy ret = simple_read_from_buffer(user_buf, count, ppos, buf, pos); 1572d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy kfree(buf); 1573d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy return ret; 1574d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy} 1575d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy 1576d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guystatic ssize_t iwl_dbgfs_ucode_bt_stats_read(struct file *file, 1577d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy char __user *user_buf, 1578d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy size_t count, loff_t *ppos) 1579d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy{ 1580d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy struct iwl_priv *priv = (struct iwl_priv *)file->private_data; 1581d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy int pos = 0; 1582d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy char *buf; 1583d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy int bufsz = (sizeof(struct statistics_bt_activity) * 24) + 200; 1584d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy ssize_t ret; 1585d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy struct statistics_bt_activity *bt, *accum_bt; 1586d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy 1587845a9c0d8acea87dede740bc5feb9ec2d00505d9Emmanuel Grumbach if (!iwl_is_alive(priv->shrd)) 1588d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy return -EAGAIN; 1589d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy 1590d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy if (!priv->bt_enable_flag) 1591d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy return -EINVAL; 1592d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy 1593d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy /* make request to uCode to retrieve statistics information */ 15946ac2f839b0b21225a65f41802c5f0df5eff4f16cEmmanuel Grumbach mutex_lock(&priv->shrd->mutex); 1595d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy ret = iwl_send_statistics_request(priv, CMD_SYNC, false); 15966ac2f839b0b21225a65f41802c5f0df5eff4f16cEmmanuel Grumbach mutex_unlock(&priv->shrd->mutex); 1597d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy 1598d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy if (ret) { 1599d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy IWL_ERR(priv, 1600d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy "Error sending statistics request: %zd\n", ret); 1601d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy return -EAGAIN; 1602d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy } 1603d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy buf = kzalloc(bufsz, GFP_KERNEL); 1604d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy if (!buf) { 1605d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy IWL_ERR(priv, "Can not allocate Buffer\n"); 1606d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy return -ENOMEM; 1607d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy } 1608d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy 1609d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy /* 1610d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy * the statistic information display here is based on 1611d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy * the last statistics notification from uCode 1612d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy * might not reflect the current uCode activity 1613d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy */ 1614d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy bt = &priv->statistics.bt_activity; 1615d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_bt = &priv->accum_stats.bt_activity; 1616d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy 1617d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += iwl_statistics_flag(priv, buf, bufsz); 1618d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "Statistics_BT:\n"); 1619d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1620d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy "\t\t\tcurrent\t\t\taccumulative\n"); 1621d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1622d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy "hi_priority_tx_req_cnt:\t\t%u\t\t\t%u\n", 1623d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(bt->hi_priority_tx_req_cnt), 1624d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_bt->hi_priority_tx_req_cnt); 1625d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1626d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy "hi_priority_tx_denied_cnt:\t%u\t\t\t%u\n", 1627d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(bt->hi_priority_tx_denied_cnt), 1628d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_bt->hi_priority_tx_denied_cnt); 1629d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1630d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy "lo_priority_tx_req_cnt:\t\t%u\t\t\t%u\n", 1631d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(bt->lo_priority_tx_req_cnt), 1632d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_bt->lo_priority_tx_req_cnt); 1633d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1634d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy "lo_priority_tx_denied_cnt:\t%u\t\t\t%u\n", 1635d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(bt->lo_priority_tx_denied_cnt), 1636d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_bt->lo_priority_tx_denied_cnt); 1637d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1638d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy "hi_priority_rx_req_cnt:\t\t%u\t\t\t%u\n", 1639d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(bt->hi_priority_rx_req_cnt), 1640d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_bt->hi_priority_rx_req_cnt); 1641d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1642d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy "hi_priority_rx_denied_cnt:\t%u\t\t\t%u\n", 1643d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(bt->hi_priority_rx_denied_cnt), 1644d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_bt->hi_priority_rx_denied_cnt); 1645d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1646d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy "lo_priority_rx_req_cnt:\t\t%u\t\t\t%u\n", 1647d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(bt->lo_priority_rx_req_cnt), 1648d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_bt->lo_priority_rx_req_cnt); 1649d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1650d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy "lo_priority_rx_denied_cnt:\t%u\t\t\t%u\n", 1651d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(bt->lo_priority_rx_denied_cnt), 1652d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy accum_bt->lo_priority_rx_denied_cnt); 1653d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy 1654d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1655d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy "(rx)num_bt_kills:\t\t%u\t\t\t%u\n", 1656d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy le32_to_cpu(priv->statistics.num_bt_kills), 1657d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy priv->statistics.accum_num_bt_kills); 1658d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy 1659d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy ret = simple_read_from_buffer(user_buf, count, ppos, buf, pos); 1660d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy kfree(buf); 1661d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy return ret; 1662d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy} 1663d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy 1664d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guystatic ssize_t iwl_dbgfs_reply_tx_error_read(struct file *file, 1665d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy char __user *user_buf, 1666d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy size_t count, loff_t *ppos) 1667d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy{ 1668d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy struct iwl_priv *priv = (struct iwl_priv *)file->private_data; 1669d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy int pos = 0; 1670d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy char *buf; 1671d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy int bufsz = (sizeof(struct reply_tx_error_statistics) * 24) + 1672d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy (sizeof(struct reply_agg_tx_error_statistics) * 24) + 200; 1673d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy ssize_t ret; 1674d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy 1675845a9c0d8acea87dede740bc5feb9ec2d00505d9Emmanuel Grumbach if (!iwl_is_alive(priv->shrd)) 1676d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy return -EAGAIN; 1677d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy 1678d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy buf = kzalloc(bufsz, GFP_KERNEL); 1679d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy if (!buf) { 1680d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy IWL_ERR(priv, "Can not allocate Buffer\n"); 1681d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy return -ENOMEM; 1682d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy } 1683d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy 1684d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "Statistics_TX_Error:\n"); 1685d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "%s:\t\t\t\t%u\n", 1686d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy iwl_get_tx_fail_reason(TX_STATUS_POSTPONE_DELAY), 1687898ed67be047d0762cc7592f67bf1313dff53ca9Wey-Yi Guy priv->reply_tx_stats.pp_delay); 1688d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "%s:\t\t\t%u\n", 1689d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy iwl_get_tx_fail_reason(TX_STATUS_POSTPONE_FEW_BYTES), 1690898ed67be047d0762cc7592f67bf1313dff53ca9Wey-Yi Guy priv->reply_tx_stats.pp_few_bytes); 1691d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "%s:\t\t\t%u\n", 1692d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy iwl_get_tx_fail_reason(TX_STATUS_POSTPONE_BT_PRIO), 1693898ed67be047d0762cc7592f67bf1313dff53ca9Wey-Yi Guy priv->reply_tx_stats.pp_bt_prio); 1694d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "%s:\t\t\t%u\n", 1695d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy iwl_get_tx_fail_reason(TX_STATUS_POSTPONE_QUIET_PERIOD), 1696898ed67be047d0762cc7592f67bf1313dff53ca9Wey-Yi Guy priv->reply_tx_stats.pp_quiet_period); 1697d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "%s:\t\t\t%u\n", 1698d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy iwl_get_tx_fail_reason(TX_STATUS_POSTPONE_CALC_TTAK), 1699898ed67be047d0762cc7592f67bf1313dff53ca9Wey-Yi Guy priv->reply_tx_stats.pp_calc_ttak); 1700d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "%s:\t\t%u\n", 1701d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy iwl_get_tx_fail_reason( 1702d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy TX_STATUS_FAIL_INTERNAL_CROSSED_RETRY), 1703898ed67be047d0762cc7592f67bf1313dff53ca9Wey-Yi Guy priv->reply_tx_stats.int_crossed_retry); 1704d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "%s:\t\t\t%u\n", 1705d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy iwl_get_tx_fail_reason(TX_STATUS_FAIL_SHORT_LIMIT), 1706898ed67be047d0762cc7592f67bf1313dff53ca9Wey-Yi Guy priv->reply_tx_stats.short_limit); 1707d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "%s:\t\t\t%u\n", 1708d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy iwl_get_tx_fail_reason(TX_STATUS_FAIL_LONG_LIMIT), 1709898ed67be047d0762cc7592f67bf1313dff53ca9Wey-Yi Guy priv->reply_tx_stats.long_limit); 1710d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "%s:\t\t\t%u\n", 1711d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy iwl_get_tx_fail_reason(TX_STATUS_FAIL_FIFO_UNDERRUN), 1712898ed67be047d0762cc7592f67bf1313dff53ca9Wey-Yi Guy priv->reply_tx_stats.fifo_underrun); 1713d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "%s:\t\t\t%u\n", 1714d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy iwl_get_tx_fail_reason(TX_STATUS_FAIL_DRAIN_FLOW), 1715898ed67be047d0762cc7592f67bf1313dff53ca9Wey-Yi Guy priv->reply_tx_stats.drain_flow); 1716d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "%s:\t\t\t%u\n", 1717d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy iwl_get_tx_fail_reason(TX_STATUS_FAIL_RFKILL_FLUSH), 1718898ed67be047d0762cc7592f67bf1313dff53ca9Wey-Yi Guy priv->reply_tx_stats.rfkill_flush); 1719d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "%s:\t\t\t%u\n", 1720d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy iwl_get_tx_fail_reason(TX_STATUS_FAIL_LIFE_EXPIRE), 1721898ed67be047d0762cc7592f67bf1313dff53ca9Wey-Yi Guy priv->reply_tx_stats.life_expire); 1722d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "%s:\t\t\t%u\n", 1723d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy iwl_get_tx_fail_reason(TX_STATUS_FAIL_DEST_PS), 1724898ed67be047d0762cc7592f67bf1313dff53ca9Wey-Yi Guy priv->reply_tx_stats.dest_ps); 1725d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "%s:\t\t\t%u\n", 1726d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy iwl_get_tx_fail_reason(TX_STATUS_FAIL_HOST_ABORTED), 1727898ed67be047d0762cc7592f67bf1313dff53ca9Wey-Yi Guy priv->reply_tx_stats.host_abort); 1728d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "%s:\t\t\t%u\n", 1729d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy iwl_get_tx_fail_reason(TX_STATUS_FAIL_BT_RETRY), 1730898ed67be047d0762cc7592f67bf1313dff53ca9Wey-Yi Guy priv->reply_tx_stats.pp_delay); 1731d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "%s:\t\t\t%u\n", 1732d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy iwl_get_tx_fail_reason(TX_STATUS_FAIL_STA_INVALID), 1733898ed67be047d0762cc7592f67bf1313dff53ca9Wey-Yi Guy priv->reply_tx_stats.sta_invalid); 1734d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "%s:\t\t\t%u\n", 1735d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy iwl_get_tx_fail_reason(TX_STATUS_FAIL_FRAG_DROPPED), 1736898ed67be047d0762cc7592f67bf1313dff53ca9Wey-Yi Guy priv->reply_tx_stats.frag_drop); 1737d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "%s:\t\t\t%u\n", 1738d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy iwl_get_tx_fail_reason(TX_STATUS_FAIL_TID_DISABLE), 1739898ed67be047d0762cc7592f67bf1313dff53ca9Wey-Yi Guy priv->reply_tx_stats.tid_disable); 1740d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "%s:\t\t\t%u\n", 1741d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy iwl_get_tx_fail_reason(TX_STATUS_FAIL_FIFO_FLUSHED), 1742898ed67be047d0762cc7592f67bf1313dff53ca9Wey-Yi Guy priv->reply_tx_stats.fifo_flush); 1743d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "%s:\t\t%u\n", 1744d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy iwl_get_tx_fail_reason( 1745d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy TX_STATUS_FAIL_INSUFFICIENT_CF_POLL), 1746898ed67be047d0762cc7592f67bf1313dff53ca9Wey-Yi Guy priv->reply_tx_stats.insuff_cf_poll); 1747d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "%s:\t\t\t%u\n", 1748d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy iwl_get_tx_fail_reason(TX_STATUS_FAIL_PASSIVE_NO_RX), 1749898ed67be047d0762cc7592f67bf1313dff53ca9Wey-Yi Guy priv->reply_tx_stats.fail_hw_drop); 1750d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "%s:\t\t%u\n", 1751d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy iwl_get_tx_fail_reason( 1752d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy TX_STATUS_FAIL_NO_BEACON_ON_RADAR), 1753898ed67be047d0762cc7592f67bf1313dff53ca9Wey-Yi Guy priv->reply_tx_stats.sta_color_mismatch); 1754d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "UNKNOWN:\t\t\t%u\n", 1755898ed67be047d0762cc7592f67bf1313dff53ca9Wey-Yi Guy priv->reply_tx_stats.unknown); 1756d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy 1757d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 1758d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy "\nStatistics_Agg_TX_Error:\n"); 1759d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy 1760d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "%s:\t\t\t%u\n", 1761d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy iwl_get_agg_tx_fail_reason(AGG_TX_STATE_UNDERRUN_MSK), 1762898ed67be047d0762cc7592f67bf1313dff53ca9Wey-Yi Guy priv->reply_agg_tx_stats.underrun); 1763d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "%s:\t\t\t%u\n", 1764d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy iwl_get_agg_tx_fail_reason(AGG_TX_STATE_BT_PRIO_MSK), 1765898ed67be047d0762cc7592f67bf1313dff53ca9Wey-Yi Guy priv->reply_agg_tx_stats.bt_prio); 1766d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "%s:\t\t\t%u\n", 1767d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy iwl_get_agg_tx_fail_reason(AGG_TX_STATE_FEW_BYTES_MSK), 1768898ed67be047d0762cc7592f67bf1313dff53ca9Wey-Yi Guy priv->reply_agg_tx_stats.few_bytes); 1769d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "%s:\t\t\t%u\n", 1770d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy iwl_get_agg_tx_fail_reason(AGG_TX_STATE_ABORT_MSK), 1771898ed67be047d0762cc7592f67bf1313dff53ca9Wey-Yi Guy priv->reply_agg_tx_stats.abort); 1772d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "%s:\t\t%u\n", 1773d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy iwl_get_agg_tx_fail_reason( 1774d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy AGG_TX_STATE_LAST_SENT_TTL_MSK), 1775898ed67be047d0762cc7592f67bf1313dff53ca9Wey-Yi Guy priv->reply_agg_tx_stats.last_sent_ttl); 1776d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "%s:\t\t%u\n", 1777d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy iwl_get_agg_tx_fail_reason( 1778d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy AGG_TX_STATE_LAST_SENT_TRY_CNT_MSK), 1779898ed67be047d0762cc7592f67bf1313dff53ca9Wey-Yi Guy priv->reply_agg_tx_stats.last_sent_try); 1780d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "%s:\t\t%u\n", 1781d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy iwl_get_agg_tx_fail_reason( 1782d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy AGG_TX_STATE_LAST_SENT_BT_KILL_MSK), 1783898ed67be047d0762cc7592f67bf1313dff53ca9Wey-Yi Guy priv->reply_agg_tx_stats.last_sent_bt_kill); 1784d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "%s:\t\t\t%u\n", 1785d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy iwl_get_agg_tx_fail_reason(AGG_TX_STATE_SCD_QUERY_MSK), 1786898ed67be047d0762cc7592f67bf1313dff53ca9Wey-Yi Guy priv->reply_agg_tx_stats.scd_query); 1787d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "%s:\t\t%u\n", 1788d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy iwl_get_agg_tx_fail_reason( 1789d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy AGG_TX_STATE_TEST_BAD_CRC32_MSK), 1790898ed67be047d0762cc7592f67bf1313dff53ca9Wey-Yi Guy priv->reply_agg_tx_stats.bad_crc32); 1791d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "%s:\t\t\t%u\n", 1792d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy iwl_get_agg_tx_fail_reason(AGG_TX_STATE_RESPONSE_MSK), 1793898ed67be047d0762cc7592f67bf1313dff53ca9Wey-Yi Guy priv->reply_agg_tx_stats.response); 1794d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "%s:\t\t\t%u\n", 1795d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy iwl_get_agg_tx_fail_reason(AGG_TX_STATE_DUMP_TX_MSK), 1796898ed67be047d0762cc7592f67bf1313dff53ca9Wey-Yi Guy priv->reply_agg_tx_stats.dump_tx); 1797d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "%s:\t\t\t%u\n", 1798d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy iwl_get_agg_tx_fail_reason(AGG_TX_STATE_DELAY_TX_MSK), 1799898ed67be047d0762cc7592f67bf1313dff53ca9Wey-Yi Guy priv->reply_agg_tx_stats.delay_tx); 1800d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "UNKNOWN:\t\t\t%u\n", 1801898ed67be047d0762cc7592f67bf1313dff53ca9Wey-Yi Guy priv->reply_agg_tx_stats.unknown); 1802d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy 1803d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy ret = simple_read_from_buffer(user_buf, count, ppos, buf, pos); 1804d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy kfree(buf); 1805d6d023a1948d13652d719238f8039c09acceda8cWey-Yi Guy return ret; 1806e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guy} 1807e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi Guy 18085225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guystatic ssize_t iwl_dbgfs_sensitivity_read(struct file *file, 18095225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy char __user *user_buf, 18105225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy size_t count, loff_t *ppos) { 18115225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy 181228f63a4bb744ea81030219aba2337fddb10b380bH Hartley Sweeten struct iwl_priv *priv = file->private_data; 18135225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy int pos = 0; 18145225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy int cnt = 0; 18155225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy char *buf; 18165225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy int bufsz = sizeof(struct iwl_sensitivity_data) * 4 + 100; 18175225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy ssize_t ret; 18185225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy struct iwl_sensitivity_data *data; 18195225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy 18205225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy data = &priv->sensitivity_data; 18215225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy buf = kzalloc(bufsz, GFP_KERNEL); 18225225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy if (!buf) { 18235225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy IWL_ERR(priv, "Can not allocate Buffer\n"); 18245225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy return -ENOMEM; 18255225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy } 18265225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy 18275225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "auto_corr_ofdm:\t\t\t %u\n", 18285225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy data->auto_corr_ofdm); 18295225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 18305225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy "auto_corr_ofdm_mrc:\t\t %u\n", 18315225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy data->auto_corr_ofdm_mrc); 18325225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "auto_corr_ofdm_x1:\t\t %u\n", 18335225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy data->auto_corr_ofdm_x1); 18345225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 18355225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy "auto_corr_ofdm_mrc_x1:\t\t %u\n", 18365225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy data->auto_corr_ofdm_mrc_x1); 18375225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "auto_corr_cck:\t\t\t %u\n", 18385225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy data->auto_corr_cck); 18395225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "auto_corr_cck_mrc:\t\t %u\n", 18405225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy data->auto_corr_cck_mrc); 18415225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 18425225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy "last_bad_plcp_cnt_ofdm:\t\t %u\n", 18435225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy data->last_bad_plcp_cnt_ofdm); 18445225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "last_fa_cnt_ofdm:\t\t %u\n", 18455225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy data->last_fa_cnt_ofdm); 18465225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 18475225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy "last_bad_plcp_cnt_cck:\t\t %u\n", 18485225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy data->last_bad_plcp_cnt_cck); 18495225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "last_fa_cnt_cck:\t\t %u\n", 18505225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy data->last_fa_cnt_cck); 18515225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "nrg_curr_state:\t\t\t %u\n", 18525225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy data->nrg_curr_state); 18535225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "nrg_prev_state:\t\t\t %u\n", 18545225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy data->nrg_prev_state); 18555225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "nrg_value:\t\t\t"); 18565225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy for (cnt = 0; cnt < 10; cnt++) { 18575225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, " %u", 18585225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy data->nrg_value[cnt]); 18595225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy } 18605225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "\n"); 18615225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "nrg_silence_rssi:\t\t"); 18625225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy for (cnt = 0; cnt < NRG_NUM_PREV_STAT_L; cnt++) { 18635225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, " %u", 18645225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy data->nrg_silence_rssi[cnt]); 18655225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy } 18665225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "\n"); 18675225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "nrg_silence_ref:\t\t %u\n", 18685225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy data->nrg_silence_ref); 18695225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "nrg_energy_idx:\t\t\t %u\n", 18705225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy data->nrg_energy_idx); 18715225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "nrg_silence_idx:\t\t %u\n", 18725225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy data->nrg_silence_idx); 18735225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "nrg_th_cck:\t\t\t %u\n", 18745225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy data->nrg_th_cck); 18755225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 18765225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy "nrg_auto_corr_silence_diff:\t %u\n", 18775225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy data->nrg_auto_corr_silence_diff); 18785225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "num_in_cck_no_fa:\t\t %u\n", 18795225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy data->num_in_cck_no_fa); 18805225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "nrg_th_ofdm:\t\t\t %u\n", 18815225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy data->nrg_th_ofdm); 18825225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy 18835225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy ret = simple_read_from_buffer(user_buf, count, ppos, buf, pos); 18845225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy kfree(buf); 18855225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy return ret; 18865225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy} 18875225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy 18885225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy 18895225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guystatic ssize_t iwl_dbgfs_chain_noise_read(struct file *file, 18905225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy char __user *user_buf, 18915225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy size_t count, loff_t *ppos) { 18925225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy 189328f63a4bb744ea81030219aba2337fddb10b380bH Hartley Sweeten struct iwl_priv *priv = file->private_data; 18945225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy int pos = 0; 18955225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy int cnt = 0; 18965225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy char *buf; 18975225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy int bufsz = sizeof(struct iwl_chain_noise_data) * 4 + 100; 18985225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy ssize_t ret; 18995225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy struct iwl_chain_noise_data *data; 19005225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy 19015225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy data = &priv->chain_noise_data; 19025225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy buf = kzalloc(bufsz, GFP_KERNEL); 19035225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy if (!buf) { 19045225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy IWL_ERR(priv, "Can not allocate Buffer\n"); 19055225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy return -ENOMEM; 19065225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy } 19075225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy 19085225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "active_chains:\t\t\t %u\n", 19095225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy data->active_chains); 19105225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "chain_noise_a:\t\t\t %u\n", 19115225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy data->chain_noise_a); 19125225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "chain_noise_b:\t\t\t %u\n", 19135225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy data->chain_noise_b); 19145225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "chain_noise_c:\t\t\t %u\n", 19155225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy data->chain_noise_c); 19165225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "chain_signal_a:\t\t\t %u\n", 19175225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy data->chain_signal_a); 19185225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "chain_signal_b:\t\t\t %u\n", 19195225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy data->chain_signal_b); 19205225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "chain_signal_c:\t\t\t %u\n", 19215225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy data->chain_signal_c); 19225225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "beacon_count:\t\t\t %u\n", 19235225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy data->beacon_count); 19245225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy 19255225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "disconn_array:\t\t\t"); 19265225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy for (cnt = 0; cnt < NUM_RX_CHAINS; cnt++) { 19275225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, " %u", 19285225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy data->disconn_array[cnt]); 19295225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy } 19305225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "\n"); 19315225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "delta_gain_code:\t\t"); 19325225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy for (cnt = 0; cnt < NUM_RX_CHAINS; cnt++) { 19335225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, " %u", 19345225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy data->delta_gain_code[cnt]); 19355225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy } 19365225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "\n"); 19375225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "radio_write:\t\t\t %u\n", 19385225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy data->radio_write); 19395225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "state:\t\t\t\t %u\n", 19405225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy data->state); 19415225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy 19425225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy ret = simple_read_from_buffer(user_buf, count, ppos, buf, pos); 19435225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy kfree(buf); 19445225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy return ret; 19455225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy} 19465225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy 1947c09430abed4159e5c56aaea257d040f7452daba6Wey-Yi Guystatic ssize_t iwl_dbgfs_power_save_status_read(struct file *file, 1948c09430abed4159e5c56aaea257d040f7452daba6Wey-Yi Guy char __user *user_buf, 1949c09430abed4159e5c56aaea257d040f7452daba6Wey-Yi Guy size_t count, loff_t *ppos) 1950c09430abed4159e5c56aaea257d040f7452daba6Wey-Yi Guy{ 195128f63a4bb744ea81030219aba2337fddb10b380bH Hartley Sweeten struct iwl_priv *priv = file->private_data; 1952c09430abed4159e5c56aaea257d040f7452daba6Wey-Yi Guy char buf[60]; 1953c09430abed4159e5c56aaea257d040f7452daba6Wey-Yi Guy int pos = 0; 1954c09430abed4159e5c56aaea257d040f7452daba6Wey-Yi Guy const size_t bufsz = sizeof(buf); 1955c09430abed4159e5c56aaea257d040f7452daba6Wey-Yi Guy u32 pwrsave_status; 1956c09430abed4159e5c56aaea257d040f7452daba6Wey-Yi Guy 195783ed90155f98bd949735c2cc22d832b557a6d7d1Emmanuel Grumbach pwrsave_status = iwl_read32(bus(priv), CSR_GP_CNTRL) & 1958c09430abed4159e5c56aaea257d040f7452daba6Wey-Yi Guy CSR_GP_REG_POWER_SAVE_STATUS_MSK; 1959c09430abed4159e5c56aaea257d040f7452daba6Wey-Yi Guy 1960c09430abed4159e5c56aaea257d040f7452daba6Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "Power Save Status: "); 1961c09430abed4159e5c56aaea257d040f7452daba6Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "%s\n", 1962c09430abed4159e5c56aaea257d040f7452daba6Wey-Yi Guy (pwrsave_status == CSR_GP_REG_NO_POWER_SAVE) ? "none" : 1963c09430abed4159e5c56aaea257d040f7452daba6Wey-Yi Guy (pwrsave_status == CSR_GP_REG_MAC_POWER_SAVE) ? "MAC" : 1964c09430abed4159e5c56aaea257d040f7452daba6Wey-Yi Guy (pwrsave_status == CSR_GP_REG_PHY_POWER_SAVE) ? "PHY" : 1965c09430abed4159e5c56aaea257d040f7452daba6Wey-Yi Guy "error"); 1966c09430abed4159e5c56aaea257d040f7452daba6Wey-Yi Guy 1967c09430abed4159e5c56aaea257d040f7452daba6Wey-Yi Guy return simple_read_from_buffer(user_buf, count, ppos, buf, pos); 1968c09430abed4159e5c56aaea257d040f7452daba6Wey-Yi Guy} 1969c09430abed4159e5c56aaea257d040f7452daba6Wey-Yi Guy 19707163b8a4ec995dabda3e92c6fed7b8600060618cWey-Yi Guystatic ssize_t iwl_dbgfs_clear_ucode_statistics_write(struct file *file, 1971ef8d5529b015d4c5db7fad1adfc91edfd5abad56Wey-Yi Guy const char __user *user_buf, 1972ef8d5529b015d4c5db7fad1adfc91edfd5abad56Wey-Yi Guy size_t count, loff_t *ppos) 1973ef8d5529b015d4c5db7fad1adfc91edfd5abad56Wey-Yi Guy{ 1974ef8d5529b015d4c5db7fad1adfc91edfd5abad56Wey-Yi Guy struct iwl_priv *priv = file->private_data; 1975ef8d5529b015d4c5db7fad1adfc91edfd5abad56Wey-Yi Guy char buf[8]; 1976ef8d5529b015d4c5db7fad1adfc91edfd5abad56Wey-Yi Guy int buf_size; 1977ef8d5529b015d4c5db7fad1adfc91edfd5abad56Wey-Yi Guy int clear; 1978ef8d5529b015d4c5db7fad1adfc91edfd5abad56Wey-Yi Guy 1979ef8d5529b015d4c5db7fad1adfc91edfd5abad56Wey-Yi Guy memset(buf, 0, sizeof(buf)); 1980ef8d5529b015d4c5db7fad1adfc91edfd5abad56Wey-Yi Guy buf_size = min(count, sizeof(buf) - 1); 1981ef8d5529b015d4c5db7fad1adfc91edfd5abad56Wey-Yi Guy if (copy_from_user(buf, user_buf, buf_size)) 1982ef8d5529b015d4c5db7fad1adfc91edfd5abad56Wey-Yi Guy return -EFAULT; 1983ef8d5529b015d4c5db7fad1adfc91edfd5abad56Wey-Yi Guy if (sscanf(buf, "%d", &clear) != 1) 1984ef8d5529b015d4c5db7fad1adfc91edfd5abad56Wey-Yi Guy return -EFAULT; 1985ef8d5529b015d4c5db7fad1adfc91edfd5abad56Wey-Yi Guy 1986ef8d5529b015d4c5db7fad1adfc91edfd5abad56Wey-Yi Guy /* make request to uCode to retrieve statistics information */ 19876ac2f839b0b21225a65f41802c5f0df5eff4f16cEmmanuel Grumbach mutex_lock(&priv->shrd->mutex); 1988ef8d5529b015d4c5db7fad1adfc91edfd5abad56Wey-Yi Guy iwl_send_statistics_request(priv, CMD_SYNC, true); 19896ac2f839b0b21225a65f41802c5f0df5eff4f16cEmmanuel Grumbach mutex_unlock(&priv->shrd->mutex); 1990ef8d5529b015d4c5db7fad1adfc91edfd5abad56Wey-Yi Guy 1991ef8d5529b015d4c5db7fad1adfc91edfd5abad56Wey-Yi Guy return count; 1992ef8d5529b015d4c5db7fad1adfc91edfd5abad56Wey-Yi Guy} 1993ef8d5529b015d4c5db7fad1adfc91edfd5abad56Wey-Yi Guy 1994a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guystatic ssize_t iwl_dbgfs_ucode_tracing_read(struct file *file, 1995a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy char __user *user_buf, 1996a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy size_t count, loff_t *ppos) { 1997a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy 199857674308d00b5ebb639ce53d388e61728e0c7f72Joe Perches struct iwl_priv *priv = file->private_data; 1999a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy int pos = 0; 2000a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy char buf[128]; 2001a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy const size_t bufsz = sizeof(buf); 2002a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy 2003a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "ucode trace timer is %s\n", 2004a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy priv->event_log.ucode_trace ? "On" : "Off"); 2005a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "non_wraps_count:\t\t %u\n", 2006a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy priv->event_log.non_wraps_count); 2007a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "wraps_once_count:\t\t %u\n", 2008a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy priv->event_log.wraps_once_count); 2009a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "wraps_more_count:\t\t %u\n", 2010a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy priv->event_log.wraps_more_count); 2011a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy 20124967c31677cf3c6c49aadf205f1a31d15d7610daWey-Yi Guy return simple_read_from_buffer(user_buf, count, ppos, buf, pos); 2013a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy} 2014a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy 2015a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guystatic ssize_t iwl_dbgfs_ucode_tracing_write(struct file *file, 2016a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy const char __user *user_buf, 2017a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy size_t count, loff_t *ppos) 2018a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy{ 2019a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy struct iwl_priv *priv = file->private_data; 2020a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy char buf[8]; 2021a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy int buf_size; 2022a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy int trace; 2023a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy 2024a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy memset(buf, 0, sizeof(buf)); 2025a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy buf_size = min(count, sizeof(buf) - 1); 2026a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy if (copy_from_user(buf, user_buf, buf_size)) 2027a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy return -EFAULT; 2028a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy if (sscanf(buf, "%d", &trace) != 1) 2029a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy return -EFAULT; 2030a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy 2031a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy if (trace) { 2032a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy priv->event_log.ucode_trace = true; 2033a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy /* schedule the ucode timer to occur in UCODE_TRACE_PERIOD */ 2034a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy mod_timer(&priv->ucode_trace, 2035a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy jiffies + msecs_to_jiffies(UCODE_TRACE_PERIOD)); 2036a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy } else { 2037a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy priv->event_log.ucode_trace = false; 2038a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy del_timer_sync(&priv->ucode_trace); 2039a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy } 2040a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy 2041a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy return count; 2042a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy} 2043a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi Guy 204460987206cba0dbb547bce2d23c3a3338c5aaf5acJohannes Bergstatic ssize_t iwl_dbgfs_rxon_flags_read(struct file *file, 204560987206cba0dbb547bce2d23c3a3338c5aaf5acJohannes Berg char __user *user_buf, 204660987206cba0dbb547bce2d23c3a3338c5aaf5acJohannes Berg size_t count, loff_t *ppos) { 204760987206cba0dbb547bce2d23c3a3338c5aaf5acJohannes Berg 204857674308d00b5ebb639ce53d388e61728e0c7f72Joe Perches struct iwl_priv *priv = file->private_data; 204960987206cba0dbb547bce2d23c3a3338c5aaf5acJohannes Berg int len = 0; 205060987206cba0dbb547bce2d23c3a3338c5aaf5acJohannes Berg char buf[20]; 205160987206cba0dbb547bce2d23c3a3338c5aaf5acJohannes Berg 2052246ed355221076884d225f9d8a4c30a048be8162Johannes Berg len = sprintf(buf, "0x%04X\n", 2053246ed355221076884d225f9d8a4c30a048be8162Johannes Berg le32_to_cpu(priv->contexts[IWL_RXON_CTX_BSS].active.flags)); 205460987206cba0dbb547bce2d23c3a3338c5aaf5acJohannes Berg return simple_read_from_buffer(user_buf, count, ppos, buf, len); 205560987206cba0dbb547bce2d23c3a3338c5aaf5acJohannes Berg} 205660987206cba0dbb547bce2d23c3a3338c5aaf5acJohannes Berg 205760987206cba0dbb547bce2d23c3a3338c5aaf5acJohannes Bergstatic ssize_t iwl_dbgfs_rxon_filter_flags_read(struct file *file, 205860987206cba0dbb547bce2d23c3a3338c5aaf5acJohannes Berg char __user *user_buf, 205960987206cba0dbb547bce2d23c3a3338c5aaf5acJohannes Berg size_t count, loff_t *ppos) { 206060987206cba0dbb547bce2d23c3a3338c5aaf5acJohannes Berg 206157674308d00b5ebb639ce53d388e61728e0c7f72Joe Perches struct iwl_priv *priv = file->private_data; 206260987206cba0dbb547bce2d23c3a3338c5aaf5acJohannes Berg int len = 0; 206360987206cba0dbb547bce2d23c3a3338c5aaf5acJohannes Berg char buf[20]; 206460987206cba0dbb547bce2d23c3a3338c5aaf5acJohannes Berg 206560987206cba0dbb547bce2d23c3a3338c5aaf5acJohannes Berg len = sprintf(buf, "0x%04X\n", 2066246ed355221076884d225f9d8a4c30a048be8162Johannes Berg le32_to_cpu(priv->contexts[IWL_RXON_CTX_BSS].active.filter_flags)); 206760987206cba0dbb547bce2d23c3a3338c5aaf5acJohannes Berg return simple_read_from_buffer(user_buf, count, ppos, buf, len); 206860987206cba0dbb547bce2d23c3a3338c5aaf5acJohannes Berg} 206960987206cba0dbb547bce2d23c3a3338c5aaf5acJohannes Berg 2070a13d276f1e49ae0bc4ad18ce8ea3c90656c9e8d4Wey-Yi Guystatic ssize_t iwl_dbgfs_missed_beacon_read(struct file *file, 2071a13d276f1e49ae0bc4ad18ce8ea3c90656c9e8d4Wey-Yi Guy char __user *user_buf, 2072a13d276f1e49ae0bc4ad18ce8ea3c90656c9e8d4Wey-Yi Guy size_t count, loff_t *ppos) { 2073a13d276f1e49ae0bc4ad18ce8ea3c90656c9e8d4Wey-Yi Guy 2074a13d276f1e49ae0bc4ad18ce8ea3c90656c9e8d4Wey-Yi Guy struct iwl_priv *priv = file->private_data; 2075a13d276f1e49ae0bc4ad18ce8ea3c90656c9e8d4Wey-Yi Guy int pos = 0; 2076a13d276f1e49ae0bc4ad18ce8ea3c90656c9e8d4Wey-Yi Guy char buf[12]; 2077a13d276f1e49ae0bc4ad18ce8ea3c90656c9e8d4Wey-Yi Guy const size_t bufsz = sizeof(buf); 2078a13d276f1e49ae0bc4ad18ce8ea3c90656c9e8d4Wey-Yi Guy 2079a13d276f1e49ae0bc4ad18ce8ea3c90656c9e8d4Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "%d\n", 2080a13d276f1e49ae0bc4ad18ce8ea3c90656c9e8d4Wey-Yi Guy priv->missed_beacon_threshold); 2081a13d276f1e49ae0bc4ad18ce8ea3c90656c9e8d4Wey-Yi Guy 20824967c31677cf3c6c49aadf205f1a31d15d7610daWey-Yi Guy return simple_read_from_buffer(user_buf, count, ppos, buf, pos); 2083a13d276f1e49ae0bc4ad18ce8ea3c90656c9e8d4Wey-Yi Guy} 2084a13d276f1e49ae0bc4ad18ce8ea3c90656c9e8d4Wey-Yi Guy 2085a13d276f1e49ae0bc4ad18ce8ea3c90656c9e8d4Wey-Yi Guystatic ssize_t iwl_dbgfs_missed_beacon_write(struct file *file, 2086a13d276f1e49ae0bc4ad18ce8ea3c90656c9e8d4Wey-Yi Guy const char __user *user_buf, 2087a13d276f1e49ae0bc4ad18ce8ea3c90656c9e8d4Wey-Yi Guy size_t count, loff_t *ppos) 2088a13d276f1e49ae0bc4ad18ce8ea3c90656c9e8d4Wey-Yi Guy{ 2089a13d276f1e49ae0bc4ad18ce8ea3c90656c9e8d4Wey-Yi Guy struct iwl_priv *priv = file->private_data; 2090a13d276f1e49ae0bc4ad18ce8ea3c90656c9e8d4Wey-Yi Guy char buf[8]; 2091a13d276f1e49ae0bc4ad18ce8ea3c90656c9e8d4Wey-Yi Guy int buf_size; 2092a13d276f1e49ae0bc4ad18ce8ea3c90656c9e8d4Wey-Yi Guy int missed; 2093a13d276f1e49ae0bc4ad18ce8ea3c90656c9e8d4Wey-Yi Guy 2094a13d276f1e49ae0bc4ad18ce8ea3c90656c9e8d4Wey-Yi Guy memset(buf, 0, sizeof(buf)); 2095a13d276f1e49ae0bc4ad18ce8ea3c90656c9e8d4Wey-Yi Guy buf_size = min(count, sizeof(buf) - 1); 2096a13d276f1e49ae0bc4ad18ce8ea3c90656c9e8d4Wey-Yi Guy if (copy_from_user(buf, user_buf, buf_size)) 2097a13d276f1e49ae0bc4ad18ce8ea3c90656c9e8d4Wey-Yi Guy return -EFAULT; 2098a13d276f1e49ae0bc4ad18ce8ea3c90656c9e8d4Wey-Yi Guy if (sscanf(buf, "%d", &missed) != 1) 2099a13d276f1e49ae0bc4ad18ce8ea3c90656c9e8d4Wey-Yi Guy return -EINVAL; 2100a13d276f1e49ae0bc4ad18ce8ea3c90656c9e8d4Wey-Yi Guy 2101a13d276f1e49ae0bc4ad18ce8ea3c90656c9e8d4Wey-Yi Guy if (missed < IWL_MISSED_BEACON_THRESHOLD_MIN || 2102a13d276f1e49ae0bc4ad18ce8ea3c90656c9e8d4Wey-Yi Guy missed > IWL_MISSED_BEACON_THRESHOLD_MAX) 2103a13d276f1e49ae0bc4ad18ce8ea3c90656c9e8d4Wey-Yi Guy priv->missed_beacon_threshold = 2104a13d276f1e49ae0bc4ad18ce8ea3c90656c9e8d4Wey-Yi Guy IWL_MISSED_BEACON_THRESHOLD_DEF; 2105a13d276f1e49ae0bc4ad18ce8ea3c90656c9e8d4Wey-Yi Guy else 2106a13d276f1e49ae0bc4ad18ce8ea3c90656c9e8d4Wey-Yi Guy priv->missed_beacon_threshold = missed; 2107a13d276f1e49ae0bc4ad18ce8ea3c90656c9e8d4Wey-Yi Guy 2108a13d276f1e49ae0bc4ad18ce8ea3c90656c9e8d4Wey-Yi Guy return count; 2109a13d276f1e49ae0bc4ad18ce8ea3c90656c9e8d4Wey-Yi Guy} 2110a13d276f1e49ae0bc4ad18ce8ea3c90656c9e8d4Wey-Yi Guy 21113e4fb5faefb57824f2e42305b3d5907845af978cTrieu 'Andrew' Nguyenstatic ssize_t iwl_dbgfs_plcp_delta_read(struct file *file, 21123e4fb5faefb57824f2e42305b3d5907845af978cTrieu 'Andrew' Nguyen char __user *user_buf, 21133e4fb5faefb57824f2e42305b3d5907845af978cTrieu 'Andrew' Nguyen size_t count, loff_t *ppos) { 21143e4fb5faefb57824f2e42305b3d5907845af978cTrieu 'Andrew' Nguyen 211557674308d00b5ebb639ce53d388e61728e0c7f72Joe Perches struct iwl_priv *priv = file->private_data; 21163e4fb5faefb57824f2e42305b3d5907845af978cTrieu 'Andrew' Nguyen int pos = 0; 21173e4fb5faefb57824f2e42305b3d5907845af978cTrieu 'Andrew' Nguyen char buf[12]; 21183e4fb5faefb57824f2e42305b3d5907845af978cTrieu 'Andrew' Nguyen const size_t bufsz = sizeof(buf); 21193e4fb5faefb57824f2e42305b3d5907845af978cTrieu 'Andrew' Nguyen 21203e4fb5faefb57824f2e42305b3d5907845af978cTrieu 'Andrew' Nguyen pos += scnprintf(buf + pos, bufsz - pos, "%u\n", 21217cb1b0887fcc61918e3d64827fbef968bb67a57aWey-Yi Guy priv->cfg->base_params->plcp_delta_threshold); 21223e4fb5faefb57824f2e42305b3d5907845af978cTrieu 'Andrew' Nguyen 21234967c31677cf3c6c49aadf205f1a31d15d7610daWey-Yi Guy return simple_read_from_buffer(user_buf, count, ppos, buf, pos); 21243e4fb5faefb57824f2e42305b3d5907845af978cTrieu 'Andrew' Nguyen} 21253e4fb5faefb57824f2e42305b3d5907845af978cTrieu 'Andrew' Nguyen 21263e4fb5faefb57824f2e42305b3d5907845af978cTrieu 'Andrew' Nguyenstatic ssize_t iwl_dbgfs_plcp_delta_write(struct file *file, 21273e4fb5faefb57824f2e42305b3d5907845af978cTrieu 'Andrew' Nguyen const char __user *user_buf, 21283e4fb5faefb57824f2e42305b3d5907845af978cTrieu 'Andrew' Nguyen size_t count, loff_t *ppos) { 21293e4fb5faefb57824f2e42305b3d5907845af978cTrieu 'Andrew' Nguyen 21303e4fb5faefb57824f2e42305b3d5907845af978cTrieu 'Andrew' Nguyen struct iwl_priv *priv = file->private_data; 21313e4fb5faefb57824f2e42305b3d5907845af978cTrieu 'Andrew' Nguyen char buf[8]; 21323e4fb5faefb57824f2e42305b3d5907845af978cTrieu 'Andrew' Nguyen int buf_size; 21333e4fb5faefb57824f2e42305b3d5907845af978cTrieu 'Andrew' Nguyen int plcp; 21343e4fb5faefb57824f2e42305b3d5907845af978cTrieu 'Andrew' Nguyen 21353e4fb5faefb57824f2e42305b3d5907845af978cTrieu 'Andrew' Nguyen memset(buf, 0, sizeof(buf)); 21363e4fb5faefb57824f2e42305b3d5907845af978cTrieu 'Andrew' Nguyen buf_size = min(count, sizeof(buf) - 1); 21373e4fb5faefb57824f2e42305b3d5907845af978cTrieu 'Andrew' Nguyen if (copy_from_user(buf, user_buf, buf_size)) 21383e4fb5faefb57824f2e42305b3d5907845af978cTrieu 'Andrew' Nguyen return -EFAULT; 21393e4fb5faefb57824f2e42305b3d5907845af978cTrieu 'Andrew' Nguyen if (sscanf(buf, "%d", &plcp) != 1) 21403e4fb5faefb57824f2e42305b3d5907845af978cTrieu 'Andrew' Nguyen return -EINVAL; 2141680788aca3dcc24b932eb7a4219ab921ac5bf2d0Wey-Yi Guy if ((plcp < IWL_MAX_PLCP_ERR_THRESHOLD_MIN) || 21423e4fb5faefb57824f2e42305b3d5907845af978cTrieu 'Andrew' Nguyen (plcp > IWL_MAX_PLCP_ERR_THRESHOLD_MAX)) 21437cb1b0887fcc61918e3d64827fbef968bb67a57aWey-Yi Guy priv->cfg->base_params->plcp_delta_threshold = 2144680788aca3dcc24b932eb7a4219ab921ac5bf2d0Wey-Yi Guy IWL_MAX_PLCP_ERR_THRESHOLD_DISABLE; 21453e4fb5faefb57824f2e42305b3d5907845af978cTrieu 'Andrew' Nguyen else 21467cb1b0887fcc61918e3d64827fbef968bb67a57aWey-Yi Guy priv->cfg->base_params->plcp_delta_threshold = plcp; 21473e4fb5faefb57824f2e42305b3d5907845af978cTrieu 'Andrew' Nguyen return count; 21483e4fb5faefb57824f2e42305b3d5907845af978cTrieu 'Andrew' Nguyen} 21493e4fb5faefb57824f2e42305b3d5907845af978cTrieu 'Andrew' Nguyen 2150528c3126a98e75f47fc9fa11b243c82a59271d0dWey-Yi Guystatic ssize_t iwl_dbgfs_force_reset_read(struct file *file, 2151528c3126a98e75f47fc9fa11b243c82a59271d0dWey-Yi Guy char __user *user_buf, 2152528c3126a98e75f47fc9fa11b243c82a59271d0dWey-Yi Guy size_t count, loff_t *ppos) { 2153528c3126a98e75f47fc9fa11b243c82a59271d0dWey-Yi Guy 2154528c3126a98e75f47fc9fa11b243c82a59271d0dWey-Yi Guy struct iwl_priv *priv = file->private_data; 2155528c3126a98e75f47fc9fa11b243c82a59271d0dWey-Yi Guy int i, pos = 0; 2156528c3126a98e75f47fc9fa11b243c82a59271d0dWey-Yi Guy char buf[300]; 2157528c3126a98e75f47fc9fa11b243c82a59271d0dWey-Yi Guy const size_t bufsz = sizeof(buf); 2158528c3126a98e75f47fc9fa11b243c82a59271d0dWey-Yi Guy struct iwl_force_reset *force_reset; 2159528c3126a98e75f47fc9fa11b243c82a59271d0dWey-Yi Guy 2160528c3126a98e75f47fc9fa11b243c82a59271d0dWey-Yi Guy for (i = 0; i < IWL_MAX_FORCE_RESET; i++) { 2161528c3126a98e75f47fc9fa11b243c82a59271d0dWey-Yi Guy force_reset = &priv->force_reset[i]; 2162528c3126a98e75f47fc9fa11b243c82a59271d0dWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 2163528c3126a98e75f47fc9fa11b243c82a59271d0dWey-Yi Guy "Force reset method %d\n", i); 2164528c3126a98e75f47fc9fa11b243c82a59271d0dWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 2165528c3126a98e75f47fc9fa11b243c82a59271d0dWey-Yi Guy "\tnumber of reset request: %d\n", 2166528c3126a98e75f47fc9fa11b243c82a59271d0dWey-Yi Guy force_reset->reset_request_count); 2167528c3126a98e75f47fc9fa11b243c82a59271d0dWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 2168528c3126a98e75f47fc9fa11b243c82a59271d0dWey-Yi Guy "\tnumber of reset request success: %d\n", 2169528c3126a98e75f47fc9fa11b243c82a59271d0dWey-Yi Guy force_reset->reset_success_count); 2170528c3126a98e75f47fc9fa11b243c82a59271d0dWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 2171528c3126a98e75f47fc9fa11b243c82a59271d0dWey-Yi Guy "\tnumber of reset request reject: %d\n", 2172528c3126a98e75f47fc9fa11b243c82a59271d0dWey-Yi Guy force_reset->reset_reject_count); 2173528c3126a98e75f47fc9fa11b243c82a59271d0dWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 2174528c3126a98e75f47fc9fa11b243c82a59271d0dWey-Yi Guy "\treset duration: %lu\n", 2175528c3126a98e75f47fc9fa11b243c82a59271d0dWey-Yi Guy force_reset->reset_duration); 2176528c3126a98e75f47fc9fa11b243c82a59271d0dWey-Yi Guy } 2177528c3126a98e75f47fc9fa11b243c82a59271d0dWey-Yi Guy return simple_read_from_buffer(user_buf, count, ppos, buf, pos); 2178528c3126a98e75f47fc9fa11b243c82a59271d0dWey-Yi Guy} 2179528c3126a98e75f47fc9fa11b243c82a59271d0dWey-Yi Guy 218004cafd7fa74d5f70efc93bef36f118177057ff74Wey-Yi Guystatic ssize_t iwl_dbgfs_force_reset_write(struct file *file, 218104cafd7fa74d5f70efc93bef36f118177057ff74Wey-Yi Guy const char __user *user_buf, 218204cafd7fa74d5f70efc93bef36f118177057ff74Wey-Yi Guy size_t count, loff_t *ppos) { 218304cafd7fa74d5f70efc93bef36f118177057ff74Wey-Yi Guy 218404cafd7fa74d5f70efc93bef36f118177057ff74Wey-Yi Guy struct iwl_priv *priv = file->private_data; 218504cafd7fa74d5f70efc93bef36f118177057ff74Wey-Yi Guy char buf[8]; 218604cafd7fa74d5f70efc93bef36f118177057ff74Wey-Yi Guy int buf_size; 218704cafd7fa74d5f70efc93bef36f118177057ff74Wey-Yi Guy int reset, ret; 218804cafd7fa74d5f70efc93bef36f118177057ff74Wey-Yi Guy 218904cafd7fa74d5f70efc93bef36f118177057ff74Wey-Yi Guy memset(buf, 0, sizeof(buf)); 219004cafd7fa74d5f70efc93bef36f118177057ff74Wey-Yi Guy buf_size = min(count, sizeof(buf) - 1); 219104cafd7fa74d5f70efc93bef36f118177057ff74Wey-Yi Guy if (copy_from_user(buf, user_buf, buf_size)) 219204cafd7fa74d5f70efc93bef36f118177057ff74Wey-Yi Guy return -EFAULT; 219304cafd7fa74d5f70efc93bef36f118177057ff74Wey-Yi Guy if (sscanf(buf, "%d", &reset) != 1) 219404cafd7fa74d5f70efc93bef36f118177057ff74Wey-Yi Guy return -EINVAL; 219504cafd7fa74d5f70efc93bef36f118177057ff74Wey-Yi Guy switch (reset) { 219604cafd7fa74d5f70efc93bef36f118177057ff74Wey-Yi Guy case IWL_RF_RESET: 219704cafd7fa74d5f70efc93bef36f118177057ff74Wey-Yi Guy case IWL_FW_RESET: 2198c04f9f220300da83f71698fa7be24714152faf0dWey-Yi Guy ret = iwl_force_reset(priv, reset, true); 219904cafd7fa74d5f70efc93bef36f118177057ff74Wey-Yi Guy break; 220004cafd7fa74d5f70efc93bef36f118177057ff74Wey-Yi Guy default: 220104cafd7fa74d5f70efc93bef36f118177057ff74Wey-Yi Guy return -EINVAL; 220204cafd7fa74d5f70efc93bef36f118177057ff74Wey-Yi Guy } 220304cafd7fa74d5f70efc93bef36f118177057ff74Wey-Yi Guy return ret ? ret : count; 220404cafd7fa74d5f70efc93bef36f118177057ff74Wey-Yi Guy} 220504cafd7fa74d5f70efc93bef36f118177057ff74Wey-Yi Guy 22064bf49a90bc0bda131ef353cca631025849f36b4eWey-Yi Guystatic ssize_t iwl_dbgfs_txfifo_flush_write(struct file *file, 22074bf49a90bc0bda131ef353cca631025849f36b4eWey-Yi Guy const char __user *user_buf, 22084bf49a90bc0bda131ef353cca631025849f36b4eWey-Yi Guy size_t count, loff_t *ppos) { 22094bf49a90bc0bda131ef353cca631025849f36b4eWey-Yi Guy 22104bf49a90bc0bda131ef353cca631025849f36b4eWey-Yi Guy struct iwl_priv *priv = file->private_data; 22114bf49a90bc0bda131ef353cca631025849f36b4eWey-Yi Guy char buf[8]; 22124bf49a90bc0bda131ef353cca631025849f36b4eWey-Yi Guy int buf_size; 22134bf49a90bc0bda131ef353cca631025849f36b4eWey-Yi Guy int flush; 22144bf49a90bc0bda131ef353cca631025849f36b4eWey-Yi Guy 22154bf49a90bc0bda131ef353cca631025849f36b4eWey-Yi Guy memset(buf, 0, sizeof(buf)); 22164bf49a90bc0bda131ef353cca631025849f36b4eWey-Yi Guy buf_size = min(count, sizeof(buf) - 1); 22174bf49a90bc0bda131ef353cca631025849f36b4eWey-Yi Guy if (copy_from_user(buf, user_buf, buf_size)) 22184bf49a90bc0bda131ef353cca631025849f36b4eWey-Yi Guy return -EFAULT; 22194bf49a90bc0bda131ef353cca631025849f36b4eWey-Yi Guy if (sscanf(buf, "%d", &flush) != 1) 22204bf49a90bc0bda131ef353cca631025849f36b4eWey-Yi Guy return -EINVAL; 22214bf49a90bc0bda131ef353cca631025849f36b4eWey-Yi Guy 2222845a9c0d8acea87dede740bc5feb9ec2d00505d9Emmanuel Grumbach if (iwl_is_rfkill(priv->shrd)) 22234bf49a90bc0bda131ef353cca631025849f36b4eWey-Yi Guy return -EFAULT; 22244bf49a90bc0bda131ef353cca631025849f36b4eWey-Yi Guy 2225c68744fb935400964f7af4835017cad5014c8c88Wey-Yi Guy iwlagn_dev_txfifo_flush(priv, IWL_DROP_ALL); 22264bf49a90bc0bda131ef353cca631025849f36b4eWey-Yi Guy 22274bf49a90bc0bda131ef353cca631025849f36b4eWey-Yi Guy return count; 22284bf49a90bc0bda131ef353cca631025849f36b4eWey-Yi Guy} 22294bf49a90bc0bda131ef353cca631025849f36b4eWey-Yi Guy 223022de94de7de78b8de2fb1f2df5aa85b5556cfcfdStanislaw Gruszkastatic ssize_t iwl_dbgfs_wd_timeout_write(struct file *file, 22317bdc473c7a52497af9fe8c73e4745615a2825aaaWey-Yi Guy const char __user *user_buf, 22327bdc473c7a52497af9fe8c73e4745615a2825aaaWey-Yi Guy size_t count, loff_t *ppos) { 22337bdc473c7a52497af9fe8c73e4745615a2825aaaWey-Yi Guy 22347bdc473c7a52497af9fe8c73e4745615a2825aaaWey-Yi Guy struct iwl_priv *priv = file->private_data; 22357bdc473c7a52497af9fe8c73e4745615a2825aaaWey-Yi Guy char buf[8]; 22367bdc473c7a52497af9fe8c73e4745615a2825aaaWey-Yi Guy int buf_size; 223722de94de7de78b8de2fb1f2df5aa85b5556cfcfdStanislaw Gruszka int timeout; 22387bdc473c7a52497af9fe8c73e4745615a2825aaaWey-Yi Guy 22397bdc473c7a52497af9fe8c73e4745615a2825aaaWey-Yi Guy memset(buf, 0, sizeof(buf)); 22407bdc473c7a52497af9fe8c73e4745615a2825aaaWey-Yi Guy buf_size = min(count, sizeof(buf) - 1); 22417bdc473c7a52497af9fe8c73e4745615a2825aaaWey-Yi Guy if (copy_from_user(buf, user_buf, buf_size)) 22427bdc473c7a52497af9fe8c73e4745615a2825aaaWey-Yi Guy return -EFAULT; 224322de94de7de78b8de2fb1f2df5aa85b5556cfcfdStanislaw Gruszka if (sscanf(buf, "%d", &timeout) != 1) 22447bdc473c7a52497af9fe8c73e4745615a2825aaaWey-Yi Guy return -EINVAL; 224522de94de7de78b8de2fb1f2df5aa85b5556cfcfdStanislaw Gruszka if (timeout < 0 || timeout > IWL_MAX_WD_TIMEOUT) 224622de94de7de78b8de2fb1f2df5aa85b5556cfcfdStanislaw Gruszka timeout = IWL_DEF_WD_TIMEOUT; 22477bdc473c7a52497af9fe8c73e4745615a2825aaaWey-Yi Guy 224822de94de7de78b8de2fb1f2df5aa85b5556cfcfdStanislaw Gruszka priv->cfg->base_params->wd_timeout = timeout; 224922de94de7de78b8de2fb1f2df5aa85b5556cfcfdStanislaw Gruszka iwl_setup_watchdog(priv); 22507bdc473c7a52497af9fe8c73e4745615a2825aaaWey-Yi Guy return count; 22517bdc473c7a52497af9fe8c73e4745615a2825aaaWey-Yi Guy} 22527bdc473c7a52497af9fe8c73e4745615a2825aaaWey-Yi Guy 2253befe8c469baebe8a0fb5bd9b7cd4afd8c54ebbd5Wey-Yi Guystatic ssize_t iwl_dbgfs_bt_traffic_read(struct file *file, 2254befe8c469baebe8a0fb5bd9b7cd4afd8c54ebbd5Wey-Yi Guy char __user *user_buf, 2255befe8c469baebe8a0fb5bd9b7cd4afd8c54ebbd5Wey-Yi Guy size_t count, loff_t *ppos) { 2256befe8c469baebe8a0fb5bd9b7cd4afd8c54ebbd5Wey-Yi Guy 2257befe8c469baebe8a0fb5bd9b7cd4afd8c54ebbd5Wey-Yi Guy struct iwl_priv *priv = (struct iwl_priv *)file->private_data; 2258befe8c469baebe8a0fb5bd9b7cd4afd8c54ebbd5Wey-Yi Guy int pos = 0; 2259befe8c469baebe8a0fb5bd9b7cd4afd8c54ebbd5Wey-Yi Guy char buf[200]; 2260befe8c469baebe8a0fb5bd9b7cd4afd8c54ebbd5Wey-Yi Guy const size_t bufsz = sizeof(buf); 2261befe8c469baebe8a0fb5bd9b7cd4afd8c54ebbd5Wey-Yi Guy 2262f21dd005df95e0fc6a578342c61b5333ce2abc2bWey-Yi Guy if (!priv->bt_enable_flag) { 2263f21dd005df95e0fc6a578342c61b5333ce2abc2bWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "BT coex disabled\n"); 226408960dea6c736280a03cb947f445fdb94fdaa2eeJohannes Berg return simple_read_from_buffer(user_buf, count, ppos, buf, pos); 2265f21dd005df95e0fc6a578342c61b5333ce2abc2bWey-Yi Guy } 2266f21dd005df95e0fc6a578342c61b5333ce2abc2bWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "BT enable flag: 0x%x\n", 2267f21dd005df95e0fc6a578342c61b5333ce2abc2bWey-Yi Guy priv->bt_enable_flag); 2268befe8c469baebe8a0fb5bd9b7cd4afd8c54ebbd5Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "BT in %s mode\n", 2269befe8c469baebe8a0fb5bd9b7cd4afd8c54ebbd5Wey-Yi Guy priv->bt_full_concurrent ? "full concurrency" : "3-wire"); 2270befe8c469baebe8a0fb5bd9b7cd4afd8c54ebbd5Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "BT status: %s, " 2271befe8c469baebe8a0fb5bd9b7cd4afd8c54ebbd5Wey-Yi Guy "last traffic notif: %d\n", 227266e863a527f9ed3a871797862aaf0d62b0954813Wey-Yi Guy priv->bt_status ? "On" : "Off", priv->last_bt_traffic_load); 2273befe8c469baebe8a0fb5bd9b7cd4afd8c54ebbd5Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "ch_announcement: %d, " 2274187bc4f6b2f81e1c8f6b1e9d5dee3e8e9018ebbfWey-Yi Guy "kill_ack_mask: %x, kill_cts_mask: %x\n", 2275187bc4f6b2f81e1c8f6b1e9d5dee3e8e9018ebbfWey-Yi Guy priv->bt_ch_announce, priv->kill_ack_mask, 2276187bc4f6b2f81e1c8f6b1e9d5dee3e8e9018ebbfWey-Yi Guy priv->kill_cts_mask); 2277befe8c469baebe8a0fb5bd9b7cd4afd8c54ebbd5Wey-Yi Guy 2278befe8c469baebe8a0fb5bd9b7cd4afd8c54ebbd5Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "bluetooth traffic load: "); 2279befe8c469baebe8a0fb5bd9b7cd4afd8c54ebbd5Wey-Yi Guy switch (priv->bt_traffic_load) { 2280befe8c469baebe8a0fb5bd9b7cd4afd8c54ebbd5Wey-Yi Guy case IWL_BT_COEX_TRAFFIC_LOAD_CONTINUOUS: 2281befe8c469baebe8a0fb5bd9b7cd4afd8c54ebbd5Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "Continuous\n"); 2282befe8c469baebe8a0fb5bd9b7cd4afd8c54ebbd5Wey-Yi Guy break; 2283befe8c469baebe8a0fb5bd9b7cd4afd8c54ebbd5Wey-Yi Guy case IWL_BT_COEX_TRAFFIC_LOAD_HIGH: 2284befe8c469baebe8a0fb5bd9b7cd4afd8c54ebbd5Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "High\n"); 2285befe8c469baebe8a0fb5bd9b7cd4afd8c54ebbd5Wey-Yi Guy break; 2286befe8c469baebe8a0fb5bd9b7cd4afd8c54ebbd5Wey-Yi Guy case IWL_BT_COEX_TRAFFIC_LOAD_LOW: 2287befe8c469baebe8a0fb5bd9b7cd4afd8c54ebbd5Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "Low\n"); 2288befe8c469baebe8a0fb5bd9b7cd4afd8c54ebbd5Wey-Yi Guy break; 2289befe8c469baebe8a0fb5bd9b7cd4afd8c54ebbd5Wey-Yi Guy case IWL_BT_COEX_TRAFFIC_LOAD_NONE: 2290befe8c469baebe8a0fb5bd9b7cd4afd8c54ebbd5Wey-Yi Guy default: 2291befe8c469baebe8a0fb5bd9b7cd4afd8c54ebbd5Wey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "None\n"); 2292befe8c469baebe8a0fb5bd9b7cd4afd8c54ebbd5Wey-Yi Guy break; 2293befe8c469baebe8a0fb5bd9b7cd4afd8c54ebbd5Wey-Yi Guy } 2294befe8c469baebe8a0fb5bd9b7cd4afd8c54ebbd5Wey-Yi Guy 229508960dea6c736280a03cb947f445fdb94fdaa2eeJohannes Berg return simple_read_from_buffer(user_buf, count, ppos, buf, pos); 2296befe8c469baebe8a0fb5bd9b7cd4afd8c54ebbd5Wey-Yi Guy} 2297befe8c469baebe8a0fb5bd9b7cd4afd8c54ebbd5Wey-Yi Guy 2298c6abdc0dc3440b9b6ae00a59c3560ab2160c7c7dWey-Yi Guystatic ssize_t iwl_dbgfs_protection_mode_read(struct file *file, 2299c6abdc0dc3440b9b6ae00a59c3560ab2160c7c7dWey-Yi Guy char __user *user_buf, 2300c6abdc0dc3440b9b6ae00a59c3560ab2160c7c7dWey-Yi Guy size_t count, loff_t *ppos) 2301c6abdc0dc3440b9b6ae00a59c3560ab2160c7c7dWey-Yi Guy{ 2302c6abdc0dc3440b9b6ae00a59c3560ab2160c7c7dWey-Yi Guy struct iwl_priv *priv = (struct iwl_priv *)file->private_data; 2303c6abdc0dc3440b9b6ae00a59c3560ab2160c7c7dWey-Yi Guy 2304c6abdc0dc3440b9b6ae00a59c3560ab2160c7c7dWey-Yi Guy int pos = 0; 2305c6abdc0dc3440b9b6ae00a59c3560ab2160c7c7dWey-Yi Guy char buf[40]; 2306c6abdc0dc3440b9b6ae00a59c3560ab2160c7c7dWey-Yi Guy const size_t bufsz = sizeof(buf); 2307c6abdc0dc3440b9b6ae00a59c3560ab2160c7c7dWey-Yi Guy 23087cb1b0887fcc61918e3d64827fbef968bb67a57aWey-Yi Guy if (priv->cfg->ht_params) 23097cb1b0887fcc61918e3d64827fbef968bb67a57aWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, 23107cb1b0887fcc61918e3d64827fbef968bb67a57aWey-Yi Guy "use %s for aggregation\n", 23117cb1b0887fcc61918e3d64827fbef968bb67a57aWey-Yi Guy (priv->cfg->ht_params->use_rts_for_aggregation) ? 23127cb1b0887fcc61918e3d64827fbef968bb67a57aWey-Yi Guy "rts/cts" : "cts-to-self"); 23137cb1b0887fcc61918e3d64827fbef968bb67a57aWey-Yi Guy else 23147cb1b0887fcc61918e3d64827fbef968bb67a57aWey-Yi Guy pos += scnprintf(buf + pos, bufsz - pos, "N/A"); 23157cb1b0887fcc61918e3d64827fbef968bb67a57aWey-Yi Guy 2316c6abdc0dc3440b9b6ae00a59c3560ab2160c7c7dWey-Yi Guy return simple_read_from_buffer(user_buf, count, ppos, buf, pos); 2317c6abdc0dc3440b9b6ae00a59c3560ab2160c7c7dWey-Yi Guy} 2318c6abdc0dc3440b9b6ae00a59c3560ab2160c7c7dWey-Yi Guy 2319c6abdc0dc3440b9b6ae00a59c3560ab2160c7c7dWey-Yi Guystatic ssize_t iwl_dbgfs_protection_mode_write(struct file *file, 2320c6abdc0dc3440b9b6ae00a59c3560ab2160c7c7dWey-Yi Guy const char __user *user_buf, 2321c6abdc0dc3440b9b6ae00a59c3560ab2160c7c7dWey-Yi Guy size_t count, loff_t *ppos) { 2322c6abdc0dc3440b9b6ae00a59c3560ab2160c7c7dWey-Yi Guy 2323c6abdc0dc3440b9b6ae00a59c3560ab2160c7c7dWey-Yi Guy struct iwl_priv *priv = file->private_data; 2324c6abdc0dc3440b9b6ae00a59c3560ab2160c7c7dWey-Yi Guy char buf[8]; 2325c6abdc0dc3440b9b6ae00a59c3560ab2160c7c7dWey-Yi Guy int buf_size; 2326c6abdc0dc3440b9b6ae00a59c3560ab2160c7c7dWey-Yi Guy int rts; 2327c6abdc0dc3440b9b6ae00a59c3560ab2160c7c7dWey-Yi Guy 23287cb1b0887fcc61918e3d64827fbef968bb67a57aWey-Yi Guy if (!priv->cfg->ht_params) 23297cb1b0887fcc61918e3d64827fbef968bb67a57aWey-Yi Guy return -EINVAL; 23307cb1b0887fcc61918e3d64827fbef968bb67a57aWey-Yi Guy 2331c6abdc0dc3440b9b6ae00a59c3560ab2160c7c7dWey-Yi Guy memset(buf, 0, sizeof(buf)); 2332c6abdc0dc3440b9b6ae00a59c3560ab2160c7c7dWey-Yi Guy buf_size = min(count, sizeof(buf) - 1); 2333c6abdc0dc3440b9b6ae00a59c3560ab2160c7c7dWey-Yi Guy if (copy_from_user(buf, user_buf, buf_size)) 2334c6abdc0dc3440b9b6ae00a59c3560ab2160c7c7dWey-Yi Guy return -EFAULT; 2335c6abdc0dc3440b9b6ae00a59c3560ab2160c7c7dWey-Yi Guy if (sscanf(buf, "%d", &rts) != 1) 2336c6abdc0dc3440b9b6ae00a59c3560ab2160c7c7dWey-Yi Guy return -EINVAL; 2337c6abdc0dc3440b9b6ae00a59c3560ab2160c7c7dWey-Yi Guy if (rts) 23387cb1b0887fcc61918e3d64827fbef968bb67a57aWey-Yi Guy priv->cfg->ht_params->use_rts_for_aggregation = true; 2339c6abdc0dc3440b9b6ae00a59c3560ab2160c7c7dWey-Yi Guy else 23407cb1b0887fcc61918e3d64827fbef968bb67a57aWey-Yi Guy priv->cfg->ht_params->use_rts_for_aggregation = false; 2341c6abdc0dc3440b9b6ae00a59c3560ab2160c7c7dWey-Yi Guy return count; 2342c6abdc0dc3440b9b6ae00a59c3560ab2160c7c7dWey-Yi Guy} 2343c6abdc0dc3440b9b6ae00a59c3560ab2160c7c7dWey-Yi Guy 23447163b8a4ec995dabda3e92c6fed7b8600060618cWey-Yi GuyDEBUGFS_READ_FILE_OPS(rx_statistics); 23457163b8a4ec995dabda3e92c6fed7b8600060618cWey-Yi GuyDEBUGFS_READ_FILE_OPS(tx_statistics); 2346e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi GuyDEBUGFS_READ_FILE_OPS(ucode_rx_stats); 2347e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi GuyDEBUGFS_READ_FILE_OPS(ucode_tx_stats); 2348e8fe59aecb9020b06305be4f8c67d73cbf49cbd2Wey-Yi GuyDEBUGFS_READ_FILE_OPS(ucode_general_stats); 23495225935b53ce1eafb222c644230d03ad6011d357Wey-Yi GuyDEBUGFS_READ_FILE_OPS(sensitivity); 23505225935b53ce1eafb222c644230d03ad6011d357Wey-Yi GuyDEBUGFS_READ_FILE_OPS(chain_noise); 2351c09430abed4159e5c56aaea257d040f7452daba6Wey-Yi GuyDEBUGFS_READ_FILE_OPS(power_save_status); 23527163b8a4ec995dabda3e92c6fed7b8600060618cWey-Yi GuyDEBUGFS_WRITE_FILE_OPS(clear_ucode_statistics); 23537163b8a4ec995dabda3e92c6fed7b8600060618cWey-Yi GuyDEBUGFS_WRITE_FILE_OPS(clear_traffic_statistics); 2354a9e1cb6a78ea8a74c49bf76726a2942f636a833bWey-Yi GuyDEBUGFS_READ_WRITE_FILE_OPS(ucode_tracing); 2355a13d276f1e49ae0bc4ad18ce8ea3c90656c9e8d4Wey-Yi GuyDEBUGFS_READ_WRITE_FILE_OPS(missed_beacon); 23563e4fb5faefb57824f2e42305b3d5907845af978cTrieu 'Andrew' NguyenDEBUGFS_READ_WRITE_FILE_OPS(plcp_delta); 2357528c3126a98e75f47fc9fa11b243c82a59271d0dWey-Yi GuyDEBUGFS_READ_WRITE_FILE_OPS(force_reset); 235860987206cba0dbb547bce2d23c3a3338c5aaf5acJohannes BergDEBUGFS_READ_FILE_OPS(rxon_flags); 235960987206cba0dbb547bce2d23c3a3338c5aaf5acJohannes BergDEBUGFS_READ_FILE_OPS(rxon_filter_flags); 23604bf49a90bc0bda131ef353cca631025849f36b4eWey-Yi GuyDEBUGFS_WRITE_FILE_OPS(txfifo_flush); 2361ffb7d896b3bc21e09d77fed45b52b2ff4ce213e5Wey-Yi GuyDEBUGFS_READ_FILE_OPS(ucode_bt_stats); 236222de94de7de78b8de2fb1f2df5aa85b5556cfcfdStanislaw GruszkaDEBUGFS_WRITE_FILE_OPS(wd_timeout); 2363befe8c469baebe8a0fb5bd9b7cd4afd8c54ebbd5Wey-Yi GuyDEBUGFS_READ_FILE_OPS(bt_traffic); 2364c6abdc0dc3440b9b6ae00a59c3560ab2160c7c7dWey-Yi GuyDEBUGFS_READ_WRITE_FILE_OPS(protection_mode); 236554a9aa65f749673f851ef86481940394185c1b0eWey-Yi GuyDEBUGFS_READ_FILE_OPS(reply_tx_error); 236620594eb0daa67f7a0cc19d74a1bafceb1bb09f4aWey-Yi Guy 2367712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler/* 2368712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler * Create the debugfs files and directories 2369712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler * 2370712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler */ 2371712b6cf57a53da608a682b5f782c5785bda76001Tomas Winklerint iwl_dbgfs_register(struct iwl_priv *priv, const char *name) 2372712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler{ 237395b1a8224abf6230899856753c5506a3f737a65bZhu Yi struct dentry *phyd = priv->hw->wiphy->debugfsdir; 23744c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg struct dentry *dir_drv, *dir_data, *dir_rf, *dir_debug; 2375712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 23764c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg dir_drv = debugfs_create_dir(name, phyd); 23774c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg if (!dir_drv) 23784c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg return -ENOMEM; 2379712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 23804c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg priv->debugfs_dir = dir_drv; 23814c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg 23824c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg dir_data = debugfs_create_dir("data", dir_drv); 23834c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg if (!dir_data) 23844c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg goto err; 23854c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg dir_rf = debugfs_create_dir("rf", dir_drv); 23864c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg if (!dir_rf) 23874c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg goto err; 23884c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg dir_debug = debugfs_create_dir("debug", dir_drv); 23894c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg if (!dir_debug) 2390712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler goto err; 2391712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 23924c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg DEBUGFS_ADD_FILE(nvm, dir_data, S_IRUSR); 23934c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg DEBUGFS_ADD_FILE(sram, dir_data, S_IWUSR | S_IRUSR); 2394c8ac61cf6e53fefb3b439fc58390fb65d2730e63Johannes Berg DEBUGFS_ADD_FILE(wowlan_sram, dir_data, S_IRUSR); 23954c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg DEBUGFS_ADD_FILE(stations, dir_data, S_IRUSR); 23964c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg DEBUGFS_ADD_FILE(channels, dir_data, S_IRUSR); 23974c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg DEBUGFS_ADD_FILE(status, dir_data, S_IRUSR); 23981f7b6172db86e9ab2b4cd794441bb2c40ab287fcEmmanuel Grumbach DEBUGFS_ADD_FILE(rx_handlers, dir_data, S_IWUSR | S_IRUSR); 23994c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg DEBUGFS_ADD_FILE(qos, dir_data, S_IRUSR); 240023c0fcc66b4345ea97ae588c2e01f10c994652baWey-Yi Guy DEBUGFS_ADD_FILE(sleep_level_override, dir_data, S_IWUSR | S_IRUSR); 240123c0fcc66b4345ea97ae588c2e01f10c994652baWey-Yi Guy DEBUGFS_ADD_FILE(current_sleep_command, dir_data, S_IRUSR); 24024c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg DEBUGFS_ADD_FILE(thermal_throttling, dir_data, S_IRUSR); 24034c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg DEBUGFS_ADD_FILE(disable_ht40, dir_data, S_IWUSR | S_IRUSR); 24044c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg DEBUGFS_ADD_FILE(rx_statistics, dir_debug, S_IRUSR); 24054c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg DEBUGFS_ADD_FILE(tx_statistics, dir_debug, S_IRUSR); 24064c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg DEBUGFS_ADD_FILE(power_save_status, dir_debug, S_IRUSR); 24074c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg DEBUGFS_ADD_FILE(clear_ucode_statistics, dir_debug, S_IWUSR); 24084c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg DEBUGFS_ADD_FILE(clear_traffic_statistics, dir_debug, S_IWUSR); 24094c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg DEBUGFS_ADD_FILE(missed_beacon, dir_debug, S_IWUSR); 24104c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg DEBUGFS_ADD_FILE(plcp_delta, dir_debug, S_IWUSR | S_IRUSR); 2411528c3126a98e75f47fc9fa11b243c82a59271d0dWey-Yi Guy DEBUGFS_ADD_FILE(force_reset, dir_debug, S_IWUSR | S_IRUSR); 2412b8c76267cfb9a025afdd122bc2a8942dbf493dd1Abhijeet Kolekar DEBUGFS_ADD_FILE(ucode_rx_stats, dir_debug, S_IRUSR); 2413b8c76267cfb9a025afdd122bc2a8942dbf493dd1Abhijeet Kolekar DEBUGFS_ADD_FILE(ucode_tx_stats, dir_debug, S_IRUSR); 2414b8c76267cfb9a025afdd122bc2a8942dbf493dd1Abhijeet Kolekar DEBUGFS_ADD_FILE(ucode_general_stats, dir_debug, S_IRUSR); 2415c68744fb935400964f7af4835017cad5014c8c88Wey-Yi Guy DEBUGFS_ADD_FILE(txfifo_flush, dir_debug, S_IWUSR); 2416c6abdc0dc3440b9b6ae00a59c3560ab2160c7c7dWey-Yi Guy DEBUGFS_ADD_FILE(protection_mode, dir_debug, S_IWUSR | S_IRUSR); 2417b8c76267cfb9a025afdd122bc2a8942dbf493dd1Abhijeet Kolekar 2418703bc583cb98a24eeedd297ee59dfa12852897d1Wey-Yi Guy DEBUGFS_ADD_FILE(sensitivity, dir_debug, S_IRUSR); 2419703bc583cb98a24eeedd297ee59dfa12852897d1Wey-Yi Guy DEBUGFS_ADD_FILE(chain_noise, dir_debug, S_IRUSR); 2420b7af6a99690503a48c63ce5e587b4e4555f31cdbWey-Yi Guy DEBUGFS_ADD_FILE(ucode_tracing, dir_debug, S_IWUSR | S_IRUSR); 24210da0e5bf1522d75d446f5124e17016628d0a149eJohannes Berg DEBUGFS_ADD_FILE(ucode_bt_stats, dir_debug, S_IRUSR); 242254a9aa65f749673f851ef86481940394185c1b0eWey-Yi Guy DEBUGFS_ADD_FILE(reply_tx_error, dir_debug, S_IRUSR); 242360987206cba0dbb547bce2d23c3a3338c5aaf5acJohannes Berg DEBUGFS_ADD_FILE(rxon_flags, dir_debug, S_IWUSR); 242460987206cba0dbb547bce2d23c3a3338c5aaf5acJohannes Berg DEBUGFS_ADD_FILE(rxon_filter_flags, dir_debug, S_IWUSR); 242522de94de7de78b8de2fb1f2df5aa85b5556cfcfdStanislaw Gruszka DEBUGFS_ADD_FILE(wd_timeout, dir_debug, S_IWUSR); 242688e58fc5d940c3463c7070a2a7a8a0ce65af3fdcStanislaw Gruszka if (iwl_advanced_bt_coexist(priv)) 2427befe8c469baebe8a0fb5bd9b7cd4afd8c54ebbd5Wey-Yi Guy DEBUGFS_ADD_FILE(bt_traffic, dir_debug, S_IRUSR); 2428703bc583cb98a24eeedd297ee59dfa12852897d1Wey-Yi Guy DEBUGFS_ADD_BOOL(disable_sensitivity, dir_rf, 2429703bc583cb98a24eeedd297ee59dfa12852897d1Wey-Yi Guy &priv->disable_sens_cal); 2430703bc583cb98a24eeedd297ee59dfa12852897d1Wey-Yi Guy DEBUGFS_ADD_BOOL(disable_chain_noise, dir_rf, 2431703bc583cb98a24eeedd297ee59dfa12852897d1Wey-Yi Guy &priv->disable_chain_noise_cal); 243287e5666c0722d5f4cad3560ab5c180c8bba62b8bEmmanuel Grumbach 243387e5666c0722d5f4cad3560ab5c180c8bba62b8bEmmanuel Grumbach if (iwl_trans_dbgfs_register(trans(priv), dir_debug)) 243487e5666c0722d5f4cad3560ab5c180c8bba62b8bEmmanuel Grumbach goto err; 2435712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler return 0; 2436712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 2437712b6cf57a53da608a682b5f782c5785bda76001Tomas Winklererr: 24384c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg IWL_ERR(priv, "Can't create the debugfs directory\n"); 2439712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler iwl_dbgfs_unregister(priv); 24404c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg return -ENOMEM; 2441712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler} 2442712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 2443712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler/** 2444712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler * Remove the debugfs files and directories 2445712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler * 2446712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler */ 2447712b6cf57a53da608a682b5f782c5785bda76001Tomas Winklervoid iwl_dbgfs_unregister(struct iwl_priv *priv) 2448712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler{ 24494c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg if (!priv->debugfs_dir) 2450712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler return; 2451712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 24524c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg debugfs_remove_recursive(priv->debugfs_dir); 24534c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg priv->debugfs_dir = NULL; 2454712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler} 2455712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 2456712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 2457445c2dff409ef9de5d2f964d20917ab238fd266fTomas Winkler 2458