Revert "wifi: iwlwifi: remove retry loops in start"
authorEmmanuel Grumbach <emmanuel.grumbach@intel.com>
Tue, 22 Oct 2024 07:22:11 +0000 (09:22 +0200)
committerJohannes Berg <johannes.berg@intel.com>
Fri, 25 Oct 2024 15:53:37 +0000 (17:53 +0200)
Revert commit dfdfe4be183b ("wifi: iwlwifi: remove retry loops in
start"), it turns out that there's an issue with the PNVM load
notification from firmware not getting processed, that this patch
has been somewhat successfully papering over. Since this is being
reported, revert the loop removal for now.

We will later at least clean this up to only attempt to retry if
there was a timeout, but currently we don't even bubble up the
failure reason to the correct layer, only returning NULL.

Fixes: dfdfe4be183b ("wifi: iwlwifi: remove retry loops in start")
Signed-off-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
Link: https://patch.msgid.link/20241022092212.4aa82a558a00.Ibdeff9c8f0d608bc97fc42024392ae763b6937b7@changeid
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
drivers/net/wireless/intel/iwlwifi/iwl-drv.c
drivers/net/wireless/intel/iwlwifi/iwl-drv.h
drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c

index 2abfc986701f8efa7012d45d4d1ec85469a692f5..c620911a11933a988df4031b1f2ded16769e834b 100644 (file)
@@ -1413,25 +1413,35 @@ _iwl_op_mode_start(struct iwl_drv *drv, struct iwlwifi_opmode_table *op)
        const struct iwl_op_mode_ops *ops = op->ops;
        struct dentry *dbgfs_dir = NULL;
        struct iwl_op_mode *op_mode = NULL;
+       int retry, max_retry = !!iwlwifi_mod_params.fw_restart * IWL_MAX_INIT_RETRY;
 
        /* also protects start/stop from racing against each other */
        lockdep_assert_held(&iwlwifi_opmode_table_mtx);
 
+       for (retry = 0; retry <= max_retry; retry++) {
+
 #ifdef CONFIG_IWLWIFI_DEBUGFS
-       drv->dbgfs_op_mode = debugfs_create_dir(op->name,
-                                               drv->dbgfs_drv);
-       dbgfs_dir = drv->dbgfs_op_mode;
+               drv->dbgfs_op_mode = debugfs_create_dir(op->name,
+                                                       drv->dbgfs_drv);
+               dbgfs_dir = drv->dbgfs_op_mode;
 #endif
 
-       op_mode = ops->start(drv->trans, drv->trans->cfg,
-                            &drv->fw, dbgfs_dir);
-       if (op_mode)
-               return op_mode;
+               op_mode = ops->start(drv->trans, drv->trans->cfg,
+                                    &drv->fw, dbgfs_dir);
+
+               if (op_mode)
+                       return op_mode;
+
+               if (test_bit(STATUS_TRANS_DEAD, &drv->trans->status))
+                       break;
+
+               IWL_ERR(drv, "retry init count %d\n", retry);
 
 #ifdef CONFIG_IWLWIFI_DEBUGFS
-       debugfs_remove_recursive(drv->dbgfs_op_mode);
-       drv->dbgfs_op_mode = NULL;
+               debugfs_remove_recursive(drv->dbgfs_op_mode);
+               drv->dbgfs_op_mode = NULL;
 #endif
+       }
 
        return NULL;
 }
index 1549ff429549788173c769239d9ebcd118a9a302..6a1d31892417b45fa24859b7ba7e133a5b8944cf 100644 (file)
@@ -98,6 +98,9 @@ void iwl_drv_stop(struct iwl_drv *drv);
 #define VISIBLE_IF_IWLWIFI_KUNIT static
 #endif
 
+/* max retry for init flow */
+#define IWL_MAX_INIT_RETRY 2
+
 #define FW_NAME_PRE_BUFSIZE    64
 struct iwl_trans;
 const char *iwl_drv_get_fwname_pre(struct iwl_trans *trans, char *buf);
index 39b8159045017bcff6d39d6de683e8bc72f19b67..80b9a115245fe87c9fcba999e16298de20a15367 100644 (file)
@@ -1293,12 +1293,14 @@ int iwl_mvm_mac_start(struct ieee80211_hw *hw)
 {
        struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw);
        int ret;
+       int retry, max_retry = 0;
 
        mutex_lock(&mvm->mutex);
 
        /* we are starting the mac not in error flow, and restart is enabled */
        if (!test_bit(IWL_MVM_STATUS_HW_RESTART_REQUESTED, &mvm->status) &&
            iwlwifi_mod_params.fw_restart) {
+               max_retry = IWL_MAX_INIT_RETRY;
                /*
                 * This will prevent mac80211 recovery flows to trigger during
                 * init failures
@@ -1306,7 +1308,13 @@ int iwl_mvm_mac_start(struct ieee80211_hw *hw)
                set_bit(IWL_MVM_STATUS_STARTING, &mvm->status);
        }
 
-       ret = __iwl_mvm_mac_start(mvm);
+       for (retry = 0; retry <= max_retry; retry++) {
+               ret = __iwl_mvm_mac_start(mvm);
+               if (!ret)
+                       break;
+
+               IWL_ERR(mvm, "mac start retry %d\n", retry);
+       }
        clear_bit(IWL_MVM_STATUS_STARTING, &mvm->status);
 
        mutex_unlock(&mvm->mutex);