summaryrefslogtreecommitdiff
path: root/drivers/net/wireless/intel/iwlwifi/fw/dbg.c
diff options
context:
space:
mode:
authorShahar S Matityahu <shahar.s.matityahu@intel.com>2018-11-22 09:12:08 +0200
committerLuca Coelho <luciano.coelho@intel.com>2019-02-04 12:27:18 +0200
commit67b8261c49a050dccd776f13b28816dcea226d0c (patch)
tree8b878c0f1ad371c645345fb536699d3affd283b1 /drivers/net/wireless/intel/iwlwifi/fw/dbg.c
parent74a102521208554e0daf52b0aeb742c066ad1e34 (diff)
iwlwifi: differentiate between alive timeout and alive flow failure
There are two cases that can cause the alive flow to fail, an assert or a timeout. Currently we mask any incoming asserts when we wait for alive. Solve this by differentiating between the two cases: 1. Let the regular error handling to handle a received assert 2. Do a dump collection in the case of a timeout Signed-off-by: Shahar S Matityahu <shahar.s.matityahu@intel.com> Fixes: f38efdb29389 ("iwlwifi: add dump collection in case alive flow fails") Signed-off-by: Luca Coelho <luciano.coelho@intel.com>
Diffstat (limited to 'drivers/net/wireless/intel/iwlwifi/fw/dbg.c')
-rw-r--r--drivers/net/wireless/intel/iwlwifi/fw/dbg.c31
1 files changed, 18 insertions, 13 deletions
diff --git a/drivers/net/wireless/intel/iwlwifi/fw/dbg.c b/drivers/net/wireless/intel/iwlwifi/fw/dbg.c
index d16a8a4f0c3f..0edc5bcdfb82 100644
--- a/drivers/net/wireless/intel/iwlwifi/fw/dbg.c
+++ b/drivers/net/wireless/intel/iwlwifi/fw/dbg.c
@@ -1373,29 +1373,35 @@ void iwl_fw_assert_error_dump(struct iwl_fw_runtime *fwrt)
}
IWL_EXPORT_SYMBOL(iwl_fw_assert_error_dump);
-void iwl_fw_alive_error_dump(struct iwl_fw_runtime *fwrt)
+void iwl_fw_alive_timeout_dump(struct iwl_fw_runtime *fwrt)
{
- struct iwl_fw_dump_desc *iwl_dump_desc_no_alive =
- kmalloc(sizeof(*iwl_dump_desc_no_alive), GFP_KERNEL);
+ struct iwl_fw_dump_desc *iwl_dump_desc_alive_timeout;
- if (!iwl_dump_desc_no_alive)
+ if (test_and_set_bit(IWL_FWRT_STATUS_DUMPING, &fwrt->status))
return;
- iwl_dump_desc_no_alive->trig_desc.type =
- cpu_to_le32(FW_DBG_TRIGGER_NO_ALIVE);
- iwl_dump_desc_no_alive->len = 0;
+ iwl_dump_desc_alive_timeout =
+ kmalloc(sizeof(*iwl_dump_desc_alive_timeout), GFP_KERNEL);
+ if (!iwl_dump_desc_alive_timeout)
+ return;
+
+ iwl_dump_desc_alive_timeout->trig_desc.type =
+ cpu_to_le32(FW_DBG_TRIGGER_ALIVE_TIMEOUT);
+ iwl_dump_desc_alive_timeout->len = 0;
if (WARN_ON(fwrt->dump.desc))
iwl_fw_free_dump_desc(fwrt);
IWL_WARN(fwrt, "Collecting data: trigger %d fired.\n",
- FW_DBG_TRIGGER_NO_ALIVE);
+ FW_DBG_TRIGGER_ALIVE_TIMEOUT);
+
+ /* set STATUS_FW_ERROR to collect all memory regions. */
+ set_bit(STATUS_FW_ERROR, &fwrt->trans->status);
- fwrt->dump.desc = iwl_dump_desc_no_alive;
+ fwrt->dump.desc = iwl_dump_desc_alive_timeout;
iwl_fw_error_dump(fwrt);
- clear_bit(IWL_FWRT_STATUS_WAIT_ALIVE, &fwrt->status);
}
-IWL_EXPORT_SYMBOL(iwl_fw_alive_error_dump);
+IWL_EXPORT_SYMBOL(iwl_fw_alive_timeout_dump);
int iwl_fw_dbg_collect_desc(struct iwl_fw_runtime *fwrt,
const struct iwl_fw_dump_desc *desc,
@@ -1418,8 +1424,7 @@ int iwl_fw_dbg_collect_desc(struct iwl_fw_runtime *fwrt,
fwrt->smem_cfg.num_lmacs)
return -EIO;
- if (test_and_set_bit(IWL_FWRT_STATUS_DUMPING, &fwrt->status) ||
- test_bit(IWL_FWRT_STATUS_WAIT_ALIVE, &fwrt->status))
+ if (test_and_set_bit(IWL_FWRT_STATUS_DUMPING, &fwrt->status))
return -EBUSY;
if (WARN_ON(fwrt->dump.desc))