aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless
diff options
context:
space:
mode:
authorEmmanuel Grumbach <emmanuel.grumbach@intel.com>2014-12-04 03:07:47 -0500
committerEmmanuel Grumbach <emmanuel.grumbach@intel.com>2014-12-28 13:00:13 -0500
commit8c23f95cca0efd2b6e0a8fedd9c9285b352579c8 (patch)
tree5eab328d64d5f5b46c1f1a7e5546f1485ae16905 /drivers/net/wireless
parentb7aaeae478d352bca5e877f97898a9668c2c74fb (diff)
iwlwifi: mvm: add debugfs to trigger fw debug logs collection
This allows to collect the logs even if the firmware hasn't crashed. Of course, crashing the firmware is an option, but this is easier and nicer. Signed-off-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
Diffstat (limited to 'drivers/net/wireless')
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-prph.h4
-rw-r--r--drivers/net/wireless/iwlwifi/mvm/debugfs.c54
-rw-r--r--drivers/net/wireless/iwlwifi/mvm/fw.c23
-rw-r--r--drivers/net/wireless/iwlwifi/mvm/mvm.h3
4 files changed, 82 insertions, 2 deletions
diff --git a/drivers/net/wireless/iwlwifi/iwl-prph.h b/drivers/net/wireless/iwlwifi/iwl-prph.h
index ea3b9706cbd8..83ab4239082c 100644
--- a/drivers/net/wireless/iwlwifi/iwl-prph.h
+++ b/drivers/net/wireless/iwlwifi/iwl-prph.h
@@ -366,11 +366,15 @@ enum secure_load_status_reg {
366#define RXF_FIFO_RD_FENCE_ADDR (0xa00c0c) 366#define RXF_FIFO_RD_FENCE_ADDR (0xa00c0c)
367 367
368/* FW monitor */ 368/* FW monitor */
369#define MON_BUFF_SAMPLE_CTL (0xa03c00)
369#define MON_BUFF_BASE_ADDR (0xa03c3c) 370#define MON_BUFF_BASE_ADDR (0xa03c3c)
370#define MON_BUFF_END_ADDR (0xa03c40) 371#define MON_BUFF_END_ADDR (0xa03c40)
371#define MON_BUFF_WRPTR (0xa03c44) 372#define MON_BUFF_WRPTR (0xa03c44)
372#define MON_BUFF_CYCLE_CNT (0xa03c48) 373#define MON_BUFF_CYCLE_CNT (0xa03c48)
373 374
375#define DBGC_IN_SAMPLE (0xa03c00)
376#define DBGC_OUT_CTRL (0xa03c0c)
377
374/* FW chicken bits */ 378/* FW chicken bits */
375#define LMPM_CHICK 0xA01FF8 379#define LMPM_CHICK 0xA01FF8
376enum { 380enum {
diff --git a/drivers/net/wireless/iwlwifi/mvm/debugfs.c b/drivers/net/wireless/iwlwifi/mvm/debugfs.c
index 0507647228af..a1b276c4dee0 100644
--- a/drivers/net/wireless/iwlwifi/mvm/debugfs.c
+++ b/drivers/net/wireless/iwlwifi/mvm/debugfs.c
@@ -945,6 +945,56 @@ iwl_dbgfs_scan_ant_rxchain_write(struct iwl_mvm *mvm, char *buf,
945 return count; 945 return count;
946} 946}
947 947
948static ssize_t iwl_dbgfs_fw_dbg_conf_read(struct file *file,
949 char __user *user_buf,
950 size_t count, loff_t *ppos)
951{
952 struct iwl_mvm *mvm = file->private_data;
953 enum iwl_fw_dbg_conf conf;
954 char buf[8];
955 const size_t bufsz = sizeof(buf);
956 int pos = 0;
957
958 mutex_lock(&mvm->mutex);
959 conf = mvm->fw_dbg_conf;
960 mutex_unlock(&mvm->mutex);
961
962 pos += scnprintf(buf + pos, bufsz - pos, "%d\n", conf);
963
964 return simple_read_from_buffer(user_buf, count, ppos, buf, pos);
965}
966
967static ssize_t iwl_dbgfs_fw_dbg_conf_write(struct iwl_mvm *mvm,
968 char *buf, size_t count,
969 loff_t *ppos)
970{
971 int ret, conf_id;
972
973 ret = kstrtoint(buf, 0, &conf_id);
974 if (ret)
975 return ret;
976
977 if (WARN_ON(conf_id >= FW_DBG_MAX))
978 return -EINVAL;
979
980 mutex_lock(&mvm->mutex);
981 ret = iwl_mvm_start_fw_dbg_conf(mvm, conf_id);
982 mutex_unlock(&mvm->mutex);
983
984 return ret ?: count;
985}
986
987static ssize_t iwl_dbgfs_fw_dbg_collect_write(struct iwl_mvm *mvm,
988 char *buf, size_t count,
989 loff_t *ppos)
990{
991 mutex_lock(&mvm->mutex);
992 iwl_mvm_fw_dbg_collect(mvm);
993 mutex_unlock(&mvm->mutex);
994
995 return count;
996}
997
948#define ADD_TEXT(...) pos += scnprintf(buf + pos, bufsz - pos, __VA_ARGS__) 998#define ADD_TEXT(...) pos += scnprintf(buf + pos, bufsz - pos, __VA_ARGS__)
949#ifdef CONFIG_IWLWIFI_BCAST_FILTERING 999#ifdef CONFIG_IWLWIFI_BCAST_FILTERING
950static ssize_t iwl_dbgfs_bcast_filters_read(struct file *file, 1000static ssize_t iwl_dbgfs_bcast_filters_read(struct file *file,
@@ -1459,6 +1509,8 @@ MVM_DEBUGFS_WRITE_FILE_OPS(bt_tx_prio, 10);
1459MVM_DEBUGFS_WRITE_FILE_OPS(bt_force_ant, 10); 1509MVM_DEBUGFS_WRITE_FILE_OPS(bt_force_ant, 10);
1460MVM_DEBUGFS_READ_WRITE_FILE_OPS(scan_ant_rxchain, 8); 1510MVM_DEBUGFS_READ_WRITE_FILE_OPS(scan_ant_rxchain, 8);
1461MVM_DEBUGFS_READ_WRITE_FILE_OPS(d0i3_refs, 8); 1511MVM_DEBUGFS_READ_WRITE_FILE_OPS(d0i3_refs, 8);
1512MVM_DEBUGFS_READ_WRITE_FILE_OPS(fw_dbg_conf, 8);
1513MVM_DEBUGFS_WRITE_FILE_OPS(fw_dbg_collect, 8);
1462 1514
1463#ifdef CONFIG_IWLWIFI_BCAST_FILTERING 1515#ifdef CONFIG_IWLWIFI_BCAST_FILTERING
1464MVM_DEBUGFS_READ_WRITE_FILE_OPS(bcast_filters, 256); 1516MVM_DEBUGFS_READ_WRITE_FILE_OPS(bcast_filters, 256);
@@ -1500,6 +1552,8 @@ int iwl_mvm_dbgfs_register(struct iwl_mvm *mvm, struct dentry *dbgfs_dir)
1500 S_IWUSR | S_IRUSR); 1552 S_IWUSR | S_IRUSR);
1501 MVM_DEBUGFS_ADD_FILE(prph_reg, mvm->debugfs_dir, S_IWUSR | S_IRUSR); 1553 MVM_DEBUGFS_ADD_FILE(prph_reg, mvm->debugfs_dir, S_IWUSR | S_IRUSR);
1502 MVM_DEBUGFS_ADD_FILE(d0i3_refs, mvm->debugfs_dir, S_IRUSR | S_IWUSR); 1554 MVM_DEBUGFS_ADD_FILE(d0i3_refs, mvm->debugfs_dir, S_IRUSR | S_IWUSR);
1555 MVM_DEBUGFS_ADD_FILE(fw_dbg_conf, mvm->debugfs_dir, S_IRUSR | S_IWUSR);
1556 MVM_DEBUGFS_ADD_FILE(fw_dbg_collect, mvm->debugfs_dir, S_IWUSR);
1503 1557
1504#ifdef CONFIG_IWLWIFI_BCAST_FILTERING 1558#ifdef CONFIG_IWLWIFI_BCAST_FILTERING
1505 if (mvm->fw->ucode_capa.flags & IWL_UCODE_TLV_FLAGS_BCAST_FILTERING) { 1559 if (mvm->fw->ucode_capa.flags & IWL_UCODE_TLV_FLAGS_BCAST_FILTERING) {
diff --git a/drivers/net/wireless/iwlwifi/mvm/fw.c b/drivers/net/wireless/iwlwifi/mvm/fw.c
index 60d0c9fdc2e7..534ee3123a63 100644
--- a/drivers/net/wireless/iwlwifi/mvm/fw.c
+++ b/drivers/net/wireless/iwlwifi/mvm/fw.c
@@ -70,6 +70,7 @@
70#include "iwl-debug.h" 70#include "iwl-debug.h"
71#include "iwl-csr.h" /* for iwl_mvm_rx_card_state_notif */ 71#include "iwl-csr.h" /* for iwl_mvm_rx_card_state_notif */
72#include "iwl-io.h" /* for iwl_mvm_rx_card_state_notif */ 72#include "iwl-io.h" /* for iwl_mvm_rx_card_state_notif */
73#include "iwl-prph.h"
73#include "iwl-eeprom-parse.h" 74#include "iwl-eeprom-parse.h"
74 75
75#include "mvm.h" 76#include "mvm.h"
@@ -399,8 +400,26 @@ out:
399 return ret; 400 return ret;
400} 401}
401 402
402static int iwl_mvm_start_fw_dbg_conf(struct iwl_mvm *mvm, 403void iwl_mvm_fw_dbg_collect(struct iwl_mvm *mvm)
403 enum iwl_fw_dbg_conf conf_id) 404{
405 lockdep_assert_held(&mvm->mutex);
406
407 /* stop recording */
408 if (mvm->cfg->device_family == IWL_DEVICE_FAMILY_7000) {
409 iwl_set_bits_prph(mvm->trans, MON_BUFF_SAMPLE_CTL, 0x100);
410 } else {
411 iwl_write_prph(mvm->trans, DBGC_IN_SAMPLE, 0);
412 iwl_write_prph(mvm->trans, DBGC_OUT_CTRL, 0);
413 }
414
415 iwl_mvm_fw_error_dump(mvm);
416
417 /* start recording again */
418 WARN_ON_ONCE(mvm->fw->dbg_dest_tlv &&
419 iwl_mvm_start_fw_dbg_conf(mvm, mvm->fw_dbg_conf));
420}
421
422int iwl_mvm_start_fw_dbg_conf(struct iwl_mvm *mvm, enum iwl_fw_dbg_conf conf_id)
404{ 423{
405 u8 *ptr; 424 u8 *ptr;
406 int ret; 425 int ret;
diff --git a/drivers/net/wireless/iwlwifi/mvm/mvm.h b/drivers/net/wireless/iwlwifi/mvm/mvm.h
index f3cb08976e23..ff1a40970ac1 100644
--- a/drivers/net/wireless/iwlwifi/mvm/mvm.h
+++ b/drivers/net/wireless/iwlwifi/mvm/mvm.h
@@ -1371,4 +1371,7 @@ struct ieee80211_vif *iwl_mvm_get_bss_vif(struct iwl_mvm *mvm);
1371void iwl_mvm_nic_restart(struct iwl_mvm *mvm, bool fw_error); 1371void iwl_mvm_nic_restart(struct iwl_mvm *mvm, bool fw_error);
1372void iwl_mvm_fw_error_dump(struct iwl_mvm *mvm); 1372void iwl_mvm_fw_error_dump(struct iwl_mvm *mvm);
1373 1373
1374int iwl_mvm_start_fw_dbg_conf(struct iwl_mvm *mvm, enum iwl_fw_dbg_conf id);
1375void iwl_mvm_fw_dbg_collect(struct iwl_mvm *mvm);
1376
1374#endif /* __IWL_MVM_H__ */ 1377#endif /* __IWL_MVM_H__ */