iwlwifi: fix fw_restart module parameter
[deliverable/linux.git] / drivers / net / wireless / iwlwifi / iwl-core.c
index a56fb466d0b6437d69de229c85724b74a4e5f507..f73eb08a949450959bd2d403346781af6fe28ff0 100644 (file)
@@ -2627,7 +2627,7 @@ static void iwl_force_rf_reset(struct iwl_priv *priv)
 }
 
 
-int iwl_force_reset(struct iwl_priv *priv, int mode)
+int iwl_force_reset(struct iwl_priv *priv, int mode, bool external)
 {
        struct iwl_force_reset *force_reset;
 
@@ -2640,12 +2640,14 @@ int iwl_force_reset(struct iwl_priv *priv, int mode)
        }
        force_reset = &priv->force_reset[mode];
        force_reset->reset_request_count++;
-       if (force_reset->last_force_reset_jiffies &&
-           time_after(force_reset->last_force_reset_jiffies +
-           force_reset->reset_duration, jiffies)) {
-               IWL_DEBUG_INFO(priv, "force reset rejected\n");
-               force_reset->reset_reject_count++;
-               return -EAGAIN;
+       if (!external) {
+               if (force_reset->last_force_reset_jiffies &&
+                   time_after(force_reset->last_force_reset_jiffies +
+                   force_reset->reset_duration, jiffies)) {
+                       IWL_DEBUG_INFO(priv, "force reset rejected\n");
+                       force_reset->reset_reject_count++;
+                       return -EAGAIN;
+               }
        }
        force_reset->reset_success_count++;
        force_reset->last_force_reset_jiffies = jiffies;
@@ -2655,6 +2657,19 @@ int iwl_force_reset(struct iwl_priv *priv, int mode)
                iwl_force_rf_reset(priv);
                break;
        case IWL_FW_RESET:
+               /*
+                * if the request is from external(ex: debugfs),
+                * then always perform the request in regardless the module
+                * parameter setting
+                * if the request is from internal (uCode error or driver
+                * detect failure), then fw_restart module parameter
+                * need to be check before performing firmware reload
+                */
+               if (!external && !priv->cfg->mod_params->restart_fw) {
+                       IWL_DEBUG_INFO(priv, "Cancel firmware reload based on "
+                                      "module parameter setting\n");
+                       break;
+               }
                IWL_ERR(priv, "On demand firmware reload\n");
                /* Set the FW error flag -- cleared on iwl_down */
                set_bit(STATUS_FW_ERROR, &priv->status);
@@ -2713,7 +2728,7 @@ static int iwl_check_stuck_queue(struct iwl_priv *priv, int cnt)
                                        "queue %d stuck %d time. Fw reload.\n",
                                        q->id, q->repeat_same_read_ptr);
                                q->repeat_same_read_ptr = 0;
-                               iwl_force_reset(priv, IWL_FW_RESET);
+                               iwl_force_reset(priv, IWL_FW_RESET, false);
                        } else {
                                q->repeat_same_read_ptr++;
                                IWL_DEBUG_RADIO(priv,
This page took 0.026359 seconds and 5 git commands to generate.