|
@@ -2119,6 +2119,65 @@ int iwl_dump_nic_event_log(struct iwl_priv *priv, bool full_log,
|
|
|
return pos;
|
|
|
}
|
|
|
|
|
|
+static void iwlagn_fw_error(struct iwl_priv *priv, bool ondemand)
|
|
|
+{
|
|
|
+ unsigned int reload_msec;
|
|
|
+ unsigned long reload_jiffies;
|
|
|
+
|
|
|
+#ifdef CONFIG_IWLWIFI_DEBUG
|
|
|
+ if (iwl_have_debug_level(IWL_DL_FW_ERRORS))
|
|
|
+ iwl_print_rx_config_cmd(priv, IWL_RXON_CTX_BSS);
|
|
|
+#endif
|
|
|
+
|
|
|
+ /* uCode is no longer loaded. */
|
|
|
+ priv->ucode_loaded = false;
|
|
|
+
|
|
|
+ /* Set the FW error flag -- cleared on iwl_down */
|
|
|
+ set_bit(STATUS_FW_ERROR, &priv->status);
|
|
|
+
|
|
|
+ /* Cancel currently queued command. */
|
|
|
+ clear_bit(STATUS_HCMD_ACTIVE, &priv->shrd->status);
|
|
|
+
|
|
|
+ iwl_abort_notification_waits(&priv->notif_wait);
|
|
|
+
|
|
|
+ /* Keep the restart process from trying to send host
|
|
|
+ * commands by clearing the ready bit */
|
|
|
+ clear_bit(STATUS_READY, &priv->status);
|
|
|
+
|
|
|
+ wake_up(&trans(priv)->wait_command_queue);
|
|
|
+
|
|
|
+ if (!ondemand) {
|
|
|
+ /*
|
|
|
+ * If firmware keep reloading, then it indicate something
|
|
|
+ * serious wrong and firmware having problem to recover
|
|
|
+ * from it. Instead of keep trying which will fill the syslog
|
|
|
+ * and hang the system, let's just stop it
|
|
|
+ */
|
|
|
+ reload_jiffies = jiffies;
|
|
|
+ reload_msec = jiffies_to_msecs((long) reload_jiffies -
|
|
|
+ (long) priv->reload_jiffies);
|
|
|
+ priv->reload_jiffies = reload_jiffies;
|
|
|
+ if (reload_msec <= IWL_MIN_RELOAD_DURATION) {
|
|
|
+ priv->reload_count++;
|
|
|
+ if (priv->reload_count >= IWL_MAX_CONTINUE_RELOAD_CNT) {
|
|
|
+ IWL_ERR(priv, "BUG_ON, Stop restarting\n");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ } else
|
|
|
+ priv->reload_count = 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (!test_bit(STATUS_EXIT_PENDING, &priv->status)) {
|
|
|
+ if (iwlagn_mod_params.restart_fw) {
|
|
|
+ IWL_DEBUG_FW_ERRORS(priv,
|
|
|
+ "Restarting adapter due to uCode error.\n");
|
|
|
+ queue_work(priv->workqueue, &priv->restart);
|
|
|
+ } else
|
|
|
+ IWL_DEBUG_FW_ERRORS(priv,
|
|
|
+ "Detected FW error, but not restarting\n");
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
static void iwl_nic_error(struct iwl_op_mode *op_mode)
|
|
|
{
|
|
|
struct iwl_priv *priv = IWL_OP_MODE_GET_DVM(op_mode);
|