diff options
author | Emmanuel Grumbach <emmanuel.grumbach@intel.com> | 2012-06-10 12:36:18 -0400 |
---|---|---|
committer | Johannes Berg <johannes.berg@intel.com> | 2012-06-13 03:01:02 -0400 |
commit | f22d33289ae61c79aa27170f7b9e4b2b2e95281d (patch) | |
tree | 868620482f5afaf38a41ab9e745973e7c90e8db6 /drivers/net/wireless/iwlwifi/pcie/trans.c | |
parent | e4b1681eafa62e2b34710f70ab3494c89cc03130 (diff) |
iwlwifi: print more info when a queue is stuck
Print some more info from the SCD's SRAM and dump the TRB
from the FH.
Signed-off-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Diffstat (limited to 'drivers/net/wireless/iwlwifi/pcie/trans.c')
-rw-r--r-- | drivers/net/wireless/iwlwifi/pcie/trans.c | 13 |
1 files changed, 12 insertions, 1 deletions
diff --git a/drivers/net/wireless/iwlwifi/pcie/trans.c b/drivers/net/wireless/iwlwifi/pcie/trans.c index 1eabb834e32a..1904fdaf3177 100644 --- a/drivers/net/wireless/iwlwifi/pcie/trans.c +++ b/drivers/net/wireless/iwlwifi/pcie/trans.c | |||
@@ -298,6 +298,10 @@ static void iwl_trans_pcie_queue_stuck_timer(unsigned long data) | |||
298 | struct iwl_tx_queue *txq = (void *)data; | 298 | struct iwl_tx_queue *txq = (void *)data; |
299 | struct iwl_trans_pcie *trans_pcie = txq->trans_pcie; | 299 | struct iwl_trans_pcie *trans_pcie = txq->trans_pcie; |
300 | struct iwl_trans *trans = iwl_trans_pcie_get_trans(trans_pcie); | 300 | struct iwl_trans *trans = iwl_trans_pcie_get_trans(trans_pcie); |
301 | u32 scd_sram_addr = trans_pcie->scd_base_addr + | ||
302 | SCD_TX_STTS_MEM_LOWER_BOUND + (16 * txq->q.id); | ||
303 | u8 buf[16]; | ||
304 | int i; | ||
301 | 305 | ||
302 | spin_lock(&txq->lock); | 306 | spin_lock(&txq->lock); |
303 | /* check if triggered erroneously */ | 307 | /* check if triggered erroneously */ |
@@ -307,7 +311,6 @@ static void iwl_trans_pcie_queue_stuck_timer(unsigned long data) | |||
307 | } | 311 | } |
308 | spin_unlock(&txq->lock); | 312 | spin_unlock(&txq->lock); |
309 | 313 | ||
310 | |||
311 | IWL_ERR(trans, "Queue %d stuck for %u ms.\n", txq->q.id, | 314 | IWL_ERR(trans, "Queue %d stuck for %u ms.\n", txq->q.id, |
312 | jiffies_to_msecs(trans_pcie->wd_timeout)); | 315 | jiffies_to_msecs(trans_pcie->wd_timeout)); |
313 | IWL_ERR(trans, "Current SW read_ptr %d write_ptr %d\n", | 316 | IWL_ERR(trans, "Current SW read_ptr %d write_ptr %d\n", |
@@ -317,6 +320,14 @@ static void iwl_trans_pcie_queue_stuck_timer(unsigned long data) | |||
317 | & (TFD_QUEUE_SIZE_MAX - 1), | 320 | & (TFD_QUEUE_SIZE_MAX - 1), |
318 | iwl_read_prph(trans, SCD_QUEUE_WRPTR(txq->q.id))); | 321 | iwl_read_prph(trans, SCD_QUEUE_WRPTR(txq->q.id))); |
319 | 322 | ||
323 | iwl_read_targ_mem_bytes(trans, scd_sram_addr, buf, sizeof(buf)); | ||
324 | |||
325 | iwl_print_hex_error(trans, buf, sizeof(buf)); | ||
326 | |||
327 | for (i = 0; i < FH_TCSR_CHNL_NUM; i++) | ||
328 | IWL_ERR(trans, "FH TRBs(%d) = 0x%08x\n", i, | ||
329 | iwl_read_direct32(trans, FH_TX_TRB_REG(i))); | ||
330 | |||
320 | iwl_op_mode_nic_error(trans->op_mode); | 331 | iwl_op_mode_nic_error(trans->op_mode); |
321 | } | 332 | } |
322 | 333 | ||