diff options
Diffstat (limited to 'drivers/net/wireless/iwlwifi/iwl-debugfs.c')
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-debugfs.c | 105 |
1 files changed, 102 insertions, 3 deletions
diff --git a/drivers/net/wireless/iwlwifi/iwl-debugfs.c b/drivers/net/wireless/iwlwifi/iwl-debugfs.c index 21e0f6699daf..ee5aed12a4b1 100644 --- a/drivers/net/wireless/iwlwifi/iwl-debugfs.c +++ b/drivers/net/wireless/iwlwifi/iwl-debugfs.c | |||
@@ -420,6 +420,23 @@ static ssize_t iwl_dbgfs_nvm_read(struct file *file, | |||
420 | return ret; | 420 | return ret; |
421 | } | 421 | } |
422 | 422 | ||
423 | static ssize_t iwl_dbgfs_log_event_read(struct file *file, | ||
424 | char __user *user_buf, | ||
425 | size_t count, loff_t *ppos) | ||
426 | { | ||
427 | struct iwl_priv *priv = file->private_data; | ||
428 | char *buf; | ||
429 | int pos = 0; | ||
430 | ssize_t ret = -ENOMEM; | ||
431 | |||
432 | pos = priv->cfg->ops->lib->dump_nic_event_log(priv, true, &buf, true); | ||
433 | if (pos && buf) { | ||
434 | ret = simple_read_from_buffer(user_buf, count, ppos, buf, pos); | ||
435 | kfree(buf); | ||
436 | } | ||
437 | return ret; | ||
438 | } | ||
439 | |||
423 | static ssize_t iwl_dbgfs_log_event_write(struct file *file, | 440 | static ssize_t iwl_dbgfs_log_event_write(struct file *file, |
424 | const char __user *user_buf, | 441 | const char __user *user_buf, |
425 | size_t count, loff_t *ppos) | 442 | size_t count, loff_t *ppos) |
@@ -436,7 +453,8 @@ static ssize_t iwl_dbgfs_log_event_write(struct file *file, | |||
436 | if (sscanf(buf, "%d", &event_log_flag) != 1) | 453 | if (sscanf(buf, "%d", &event_log_flag) != 1) |
437 | return -EFAULT; | 454 | return -EFAULT; |
438 | if (event_log_flag == 1) | 455 | if (event_log_flag == 1) |
439 | priv->cfg->ops->lib->dump_nic_event_log(priv, true); | 456 | priv->cfg->ops->lib->dump_nic_event_log(priv, true, |
457 | NULL, false); | ||
440 | 458 | ||
441 | return count; | 459 | return count; |
442 | } | 460 | } |
@@ -859,7 +877,7 @@ static ssize_t iwl_dbgfs_current_sleep_command_read(struct file *file, | |||
859 | } | 877 | } |
860 | 878 | ||
861 | DEBUGFS_READ_WRITE_FILE_OPS(sram); | 879 | DEBUGFS_READ_WRITE_FILE_OPS(sram); |
862 | DEBUGFS_WRITE_FILE_OPS(log_event); | 880 | DEBUGFS_READ_WRITE_FILE_OPS(log_event); |
863 | DEBUGFS_READ_FILE_OPS(nvm); | 881 | DEBUGFS_READ_FILE_OPS(nvm); |
864 | DEBUGFS_READ_FILE_OPS(stations); | 882 | DEBUGFS_READ_FILE_OPS(stations); |
865 | DEBUGFS_READ_FILE_OPS(channels); | 883 | DEBUGFS_READ_FILE_OPS(channels); |
@@ -1845,6 +1863,80 @@ static ssize_t iwl_dbgfs_clear_ucode_statistics_write(struct file *file, | |||
1845 | return count; | 1863 | return count; |
1846 | } | 1864 | } |
1847 | 1865 | ||
1866 | static ssize_t iwl_dbgfs_csr_write(struct file *file, | ||
1867 | const char __user *user_buf, | ||
1868 | size_t count, loff_t *ppos) | ||
1869 | { | ||
1870 | struct iwl_priv *priv = file->private_data; | ||
1871 | char buf[8]; | ||
1872 | int buf_size; | ||
1873 | int csr; | ||
1874 | |||
1875 | memset(buf, 0, sizeof(buf)); | ||
1876 | buf_size = min(count, sizeof(buf) - 1); | ||
1877 | if (copy_from_user(buf, user_buf, buf_size)) | ||
1878 | return -EFAULT; | ||
1879 | if (sscanf(buf, "%d", &csr) != 1) | ||
1880 | return -EFAULT; | ||
1881 | |||
1882 | if (priv->cfg->ops->lib->dump_csr) | ||
1883 | priv->cfg->ops->lib->dump_csr(priv); | ||
1884 | |||
1885 | return count; | ||
1886 | } | ||
1887 | |||
1888 | static ssize_t iwl_dbgfs_ucode_tracing_read(struct file *file, | ||
1889 | char __user *user_buf, | ||
1890 | size_t count, loff_t *ppos) { | ||
1891 | |||
1892 | struct iwl_priv *priv = (struct iwl_priv *)file->private_data; | ||
1893 | int pos = 0; | ||
1894 | char buf[128]; | ||
1895 | const size_t bufsz = sizeof(buf); | ||
1896 | ssize_t ret; | ||
1897 | |||
1898 | pos += scnprintf(buf + pos, bufsz - pos, "ucode trace timer is %s\n", | ||
1899 | priv->event_log.ucode_trace ? "On" : "Off"); | ||
1900 | pos += scnprintf(buf + pos, bufsz - pos, "non_wraps_count:\t\t %u\n", | ||
1901 | priv->event_log.non_wraps_count); | ||
1902 | pos += scnprintf(buf + pos, bufsz - pos, "wraps_once_count:\t\t %u\n", | ||
1903 | priv->event_log.wraps_once_count); | ||
1904 | pos += scnprintf(buf + pos, bufsz - pos, "wraps_more_count:\t\t %u\n", | ||
1905 | priv->event_log.wraps_more_count); | ||
1906 | |||
1907 | ret = simple_read_from_buffer(user_buf, count, ppos, buf, pos); | ||
1908 | return ret; | ||
1909 | } | ||
1910 | |||
1911 | static ssize_t iwl_dbgfs_ucode_tracing_write(struct file *file, | ||
1912 | const char __user *user_buf, | ||
1913 | size_t count, loff_t *ppos) | ||
1914 | { | ||
1915 | struct iwl_priv *priv = file->private_data; | ||
1916 | char buf[8]; | ||
1917 | int buf_size; | ||
1918 | int trace; | ||
1919 | |||
1920 | memset(buf, 0, sizeof(buf)); | ||
1921 | buf_size = min(count, sizeof(buf) - 1); | ||
1922 | if (copy_from_user(buf, user_buf, buf_size)) | ||
1923 | return -EFAULT; | ||
1924 | if (sscanf(buf, "%d", &trace) != 1) | ||
1925 | return -EFAULT; | ||
1926 | |||
1927 | if (trace) { | ||
1928 | priv->event_log.ucode_trace = true; | ||
1929 | /* schedule the ucode timer to occur in UCODE_TRACE_PERIOD */ | ||
1930 | mod_timer(&priv->ucode_trace, | ||
1931 | jiffies + msecs_to_jiffies(UCODE_TRACE_PERIOD)); | ||
1932 | } else { | ||
1933 | priv->event_log.ucode_trace = false; | ||
1934 | del_timer_sync(&priv->ucode_trace); | ||
1935 | } | ||
1936 | |||
1937 | return count; | ||
1938 | } | ||
1939 | |||
1848 | DEBUGFS_READ_FILE_OPS(rx_statistics); | 1940 | DEBUGFS_READ_FILE_OPS(rx_statistics); |
1849 | DEBUGFS_READ_FILE_OPS(tx_statistics); | 1941 | DEBUGFS_READ_FILE_OPS(tx_statistics); |
1850 | DEBUGFS_READ_WRITE_FILE_OPS(traffic_log); | 1942 | DEBUGFS_READ_WRITE_FILE_OPS(traffic_log); |
@@ -1859,6 +1951,8 @@ DEBUGFS_READ_FILE_OPS(tx_power); | |||
1859 | DEBUGFS_READ_FILE_OPS(power_save_status); | 1951 | DEBUGFS_READ_FILE_OPS(power_save_status); |
1860 | DEBUGFS_WRITE_FILE_OPS(clear_ucode_statistics); | 1952 | DEBUGFS_WRITE_FILE_OPS(clear_ucode_statistics); |
1861 | DEBUGFS_WRITE_FILE_OPS(clear_traffic_statistics); | 1953 | DEBUGFS_WRITE_FILE_OPS(clear_traffic_statistics); |
1954 | DEBUGFS_WRITE_FILE_OPS(csr); | ||
1955 | DEBUGFS_READ_WRITE_FILE_OPS(ucode_tracing); | ||
1862 | 1956 | ||
1863 | /* | 1957 | /* |
1864 | * Create the debugfs files and directories | 1958 | * Create the debugfs files and directories |
@@ -1889,7 +1983,7 @@ int iwl_dbgfs_register(struct iwl_priv *priv, const char *name) | |||
1889 | DEBUGFS_ADD_DIR(debug, dbgfs->dir_drv); | 1983 | DEBUGFS_ADD_DIR(debug, dbgfs->dir_drv); |
1890 | DEBUGFS_ADD_FILE(nvm, data, S_IRUSR); | 1984 | DEBUGFS_ADD_FILE(nvm, data, S_IRUSR); |
1891 | DEBUGFS_ADD_FILE(sram, data, S_IWUSR | S_IRUSR); | 1985 | DEBUGFS_ADD_FILE(sram, data, S_IWUSR | S_IRUSR); |
1892 | DEBUGFS_ADD_FILE(log_event, data, S_IWUSR); | 1986 | DEBUGFS_ADD_FILE(log_event, data, S_IWUSR | S_IRUSR); |
1893 | DEBUGFS_ADD_FILE(stations, data, S_IRUSR); | 1987 | DEBUGFS_ADD_FILE(stations, data, S_IRUSR); |
1894 | DEBUGFS_ADD_FILE(channels, data, S_IRUSR); | 1988 | DEBUGFS_ADD_FILE(channels, data, S_IRUSR); |
1895 | DEBUGFS_ADD_FILE(status, data, S_IRUSR); | 1989 | DEBUGFS_ADD_FILE(status, data, S_IRUSR); |
@@ -1909,12 +2003,14 @@ int iwl_dbgfs_register(struct iwl_priv *priv, const char *name) | |||
1909 | DEBUGFS_ADD_FILE(power_save_status, debug, S_IRUSR); | 2003 | DEBUGFS_ADD_FILE(power_save_status, debug, S_IRUSR); |
1910 | DEBUGFS_ADD_FILE(clear_ucode_statistics, debug, S_IWUSR); | 2004 | DEBUGFS_ADD_FILE(clear_ucode_statistics, debug, S_IWUSR); |
1911 | DEBUGFS_ADD_FILE(clear_traffic_statistics, debug, S_IWUSR); | 2005 | DEBUGFS_ADD_FILE(clear_traffic_statistics, debug, S_IWUSR); |
2006 | DEBUGFS_ADD_FILE(csr, debug, S_IWUSR); | ||
1912 | if ((priv->hw_rev & CSR_HW_REV_TYPE_MSK) != CSR_HW_REV_TYPE_3945) { | 2007 | if ((priv->hw_rev & CSR_HW_REV_TYPE_MSK) != CSR_HW_REV_TYPE_3945) { |
1913 | DEBUGFS_ADD_FILE(ucode_rx_stats, debug, S_IRUSR); | 2008 | DEBUGFS_ADD_FILE(ucode_rx_stats, debug, S_IRUSR); |
1914 | DEBUGFS_ADD_FILE(ucode_tx_stats, debug, S_IRUSR); | 2009 | DEBUGFS_ADD_FILE(ucode_tx_stats, debug, S_IRUSR); |
1915 | DEBUGFS_ADD_FILE(ucode_general_stats, debug, S_IRUSR); | 2010 | DEBUGFS_ADD_FILE(ucode_general_stats, debug, S_IRUSR); |
1916 | DEBUGFS_ADD_FILE(sensitivity, debug, S_IRUSR); | 2011 | DEBUGFS_ADD_FILE(sensitivity, debug, S_IRUSR); |
1917 | DEBUGFS_ADD_FILE(chain_noise, debug, S_IRUSR); | 2012 | DEBUGFS_ADD_FILE(chain_noise, debug, S_IRUSR); |
2013 | DEBUGFS_ADD_FILE(ucode_tracing, debug, S_IWUSR | S_IRUSR); | ||
1918 | } | 2014 | } |
1919 | DEBUGFS_ADD_BOOL(disable_sensitivity, rf, &priv->disable_sens_cal); | 2015 | DEBUGFS_ADD_BOOL(disable_sensitivity, rf, &priv->disable_sens_cal); |
1920 | DEBUGFS_ADD_BOOL(disable_chain_noise, rf, | 2016 | DEBUGFS_ADD_BOOL(disable_chain_noise, rf, |
@@ -1966,6 +2062,7 @@ void iwl_dbgfs_unregister(struct iwl_priv *priv) | |||
1966 | file_clear_ucode_statistics); | 2062 | file_clear_ucode_statistics); |
1967 | DEBUGFS_REMOVE(priv->dbgfs->dbgfs_debug_files. | 2063 | DEBUGFS_REMOVE(priv->dbgfs->dbgfs_debug_files. |
1968 | file_clear_traffic_statistics); | 2064 | file_clear_traffic_statistics); |
2065 | DEBUGFS_REMOVE(priv->dbgfs->dbgfs_debug_files.file_csr); | ||
1969 | if ((priv->hw_rev & CSR_HW_REV_TYPE_MSK) != CSR_HW_REV_TYPE_3945) { | 2066 | if ((priv->hw_rev & CSR_HW_REV_TYPE_MSK) != CSR_HW_REV_TYPE_3945) { |
1970 | DEBUGFS_REMOVE(priv->dbgfs->dbgfs_debug_files. | 2067 | DEBUGFS_REMOVE(priv->dbgfs->dbgfs_debug_files. |
1971 | file_ucode_rx_stats); | 2068 | file_ucode_rx_stats); |
@@ -1977,6 +2074,8 @@ void iwl_dbgfs_unregister(struct iwl_priv *priv) | |||
1977 | file_sensitivity); | 2074 | file_sensitivity); |
1978 | DEBUGFS_REMOVE(priv->dbgfs->dbgfs_debug_files. | 2075 | DEBUGFS_REMOVE(priv->dbgfs->dbgfs_debug_files. |
1979 | file_chain_noise); | 2076 | file_chain_noise); |
2077 | DEBUGFS_REMOVE(priv->dbgfs->dbgfs_debug_files. | ||
2078 | file_ucode_tracing); | ||
1980 | } | 2079 | } |
1981 | DEBUGFS_REMOVE(priv->dbgfs->dir_debug); | 2080 | DEBUGFS_REMOVE(priv->dbgfs->dir_debug); |
1982 | DEBUGFS_REMOVE(priv->dbgfs->dbgfs_rf_files.file_disable_sensitivity); | 2081 | DEBUGFS_REMOVE(priv->dbgfs->dbgfs_rf_files.file_disable_sensitivity); |