iwlwifi: pcie: stop the firmware when we restart it
authorEmmanuel Grumbach <emmanuel.grumbach@intel.com>
Wed, 12 Feb 2014 06:51:54 +0000 (08:51 +0200)
committerEmmanuel Grumbach <emmanuel.grumbach@intel.com>
Thu, 20 Feb 2014 17:19:14 +0000 (19:19 +0200)
In case the firmware didn't assert but we want to restart
it, e.g. we didn't get the reply for a host command, or the
Tx queues are stuck, we should stop the firmware by
provoking an interrupt. This allows to better debug the
firmware in these bad scenarios.

Signed-off-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
drivers/net/wireless/iwlwifi/pcie/tx.c

index e476d9eda61ad296cf497369b2e484751cd1c601..3b0c72c1005446d2d93f7eb15ed6d3207e1c3ea1 100644 (file)
@@ -207,7 +207,7 @@ static void iwl_pcie_txq_stuck_timer(unsigned long data)
                IWL_ERR(trans, "scratch %d = 0x%08x\n", i,
                        le32_to_cpu(txq->scratchbufs[i].scratch));
 
-       iwl_trans_fw_error(trans);
+       iwl_write_prph(trans, DEVICE_SET_NMI_REG, 1);
 }
 
 /*
@@ -1024,7 +1024,7 @@ static void iwl_pcie_cmdq_reclaim(struct iwl_trans *trans, int txq_id, int idx)
                if (nfreed++ > 0) {
                        IWL_ERR(trans, "HCMD skipped: index (%d) %d %d\n",
                                idx, q->write_ptr, q->read_ptr);
-                       iwl_trans_fw_error(trans);
+                       iwl_write_prph(trans, DEVICE_SET_NMI_REG, 1);
                }
        }
 
@@ -1583,6 +1583,7 @@ static int iwl_pcie_send_hcmd_sync(struct iwl_trans *trans,
                               get_cmd_string(trans_pcie, cmd->id));
                ret = -ETIMEDOUT;
 
+               iwl_write_prph(trans, DEVICE_SET_NMI_REG, 1);
                iwl_trans_fw_error(trans);
 
                goto cancel;