wait_for_completion_timeout(&mrioc->init_cmds.done,
            (MPI3MR_INTADMCMD_TIMEOUT * HZ));
        if (!(mrioc->init_cmds.state & MPI3MR_CMD_COMPLETE)) {
-               ioc_err(mrioc, "Issue DelRepQ: command timed out\n");
-               mpi3mr_set_diagsave(mrioc);
-               mpi3mr_issue_reset(mrioc,
-                   MPI3_SYSIF_HOST_DIAG_RESET_ACTION_DIAG_FAULT,
+               ioc_err(mrioc, "delete reply queue timed out\n");
+               mpi3mr_check_rh_fault_ioc(mrioc,
                    MPI3MR_RESET_FROM_DELREPQ_TIMEOUT);
-               mrioc->unrecoverable = 1;
-
                retval = -1;
                goto out_unlock;
        }
        wait_for_completion_timeout(&mrioc->init_cmds.done,
            (MPI3MR_INTADMCMD_TIMEOUT * HZ));
        if (!(mrioc->init_cmds.state & MPI3MR_CMD_COMPLETE)) {
-               ioc_err(mrioc, "CreateRepQ: command timed out\n");
-               mpi3mr_set_diagsave(mrioc);
-               mpi3mr_issue_reset(mrioc,
-                   MPI3_SYSIF_HOST_DIAG_RESET_ACTION_DIAG_FAULT,
+               ioc_err(mrioc, "create reply queue timed out\n");
+               mpi3mr_check_rh_fault_ioc(mrioc,
                    MPI3MR_RESET_FROM_CREATEREPQ_TIMEOUT);
-               mrioc->unrecoverable = 1;
                retval = -1;
                goto out_unlock;
        }
        wait_for_completion_timeout(&mrioc->init_cmds.done,
            (MPI3MR_INTADMCMD_TIMEOUT * HZ));
        if (!(mrioc->init_cmds.state & MPI3MR_CMD_COMPLETE)) {
-               ioc_err(mrioc, "CreateReqQ: command timed out\n");
-               mpi3mr_set_diagsave(mrioc);
-               if (mpi3mr_issue_reset(mrioc,
-                   MPI3_SYSIF_HOST_DIAG_RESET_ACTION_DIAG_FAULT,
-                   MPI3MR_RESET_FROM_CREATEREQQ_TIMEOUT))
-                       mrioc->unrecoverable = 1;
+               ioc_err(mrioc, "create request queue timed out\n");
+               mpi3mr_check_rh_fault_ioc(mrioc,
+                   MPI3MR_RESET_FROM_CREATEREQQ_TIMEOUT);
                retval = -1;
                goto out_unlock;
        }
        return retval;
 }
 
+/**
+ * mpi3mr_check_rh_fault_ioc - check reset history and fault
+ * controller
+ * @mrioc: Adapter instance reference
+ * @reason_code, reason code for the fault.
+ *
+ * This routine will save snapdump and fault the controller with
+ * the given reason code if it is not already in the fault or
+ * not asynchronosuly reset. This will be used to handle
+ * initilaization time faults/resets/timeout as in those cases
+ * immediate soft reset invocation is not required.
+ *
+ * Return:  None.
+ */
+void mpi3mr_check_rh_fault_ioc(struct mpi3mr_ioc *mrioc, u32 reason_code)
+{
+       u32 ioc_status, host_diagnostic, timeout;
+
+       ioc_status = readl(&mrioc->sysif_regs->ioc_status);
+       if ((ioc_status & MPI3_SYSIF_IOC_STATUS_RESET_HISTORY) ||
+           (ioc_status & MPI3_SYSIF_IOC_STATUS_FAULT)) {
+               mpi3mr_print_fault_info(mrioc);
+               return;
+       }
+       mpi3mr_set_diagsave(mrioc);
+       mpi3mr_issue_reset(mrioc, MPI3_SYSIF_HOST_DIAG_RESET_ACTION_DIAG_FAULT,
+           reason_code);
+       timeout = MPI3_SYSIF_DIAG_SAVE_TIMEOUT * 10;
+       do {
+               host_diagnostic = readl(&mrioc->sysif_regs->host_diagnostic);
+               if (!(host_diagnostic & MPI3_SYSIF_HOST_DIAG_SAVE_IN_PROGRESS))
+                       break;
+               msleep(100);
+       } while (--timeout);
+}
+
 /**
  * mpi3mr_sync_timestamp - Issue time stamp sync request
  * @mrioc: Adapter reference
            (MPI3MR_INTADMCMD_TIMEOUT * HZ));
        if (!(mrioc->init_cmds.state & MPI3MR_CMD_COMPLETE)) {
                ioc_err(mrioc, "get package version timed out\n");
+               mpi3mr_check_rh_fault_ioc(mrioc,
+                   MPI3MR_RESET_FROM_GETPKGVER_TIMEOUT);
                retval = -1;
                goto out_unlock;
        }
        wait_for_completion_timeout(&mrioc->init_cmds.done,
            (MPI3MR_INTADMCMD_TIMEOUT * HZ));
        if (!(mrioc->init_cmds.state & MPI3MR_CMD_COMPLETE)) {
-               ioc_err(mrioc, "Issue IOCFacts: command timed out\n");
-               mpi3mr_set_diagsave(mrioc);
-               mpi3mr_issue_reset(mrioc,
-                   MPI3_SYSIF_HOST_DIAG_RESET_ACTION_DIAG_FAULT,
+               ioc_err(mrioc, "ioc_facts timed out\n");
+               mpi3mr_check_rh_fault_ioc(mrioc,
                    MPI3MR_RESET_FROM_IOCFACTS_TIMEOUT);
-               mrioc->unrecoverable = 1;
                retval = -1;
                goto out_unlock;
        }
        wait_for_completion_timeout(&mrioc->init_cmds.done,
            (MPI3MR_INTADMCMD_TIMEOUT * HZ));
        if (!(mrioc->init_cmds.state & MPI3MR_CMD_COMPLETE)) {
-               mpi3mr_set_diagsave(mrioc);
-               mpi3mr_issue_reset(mrioc,
-                   MPI3_SYSIF_HOST_DIAG_RESET_ACTION_DIAG_FAULT,
+               mpi3mr_check_rh_fault_ioc(mrioc,
                    MPI3MR_RESET_FROM_IOCINIT_TIMEOUT);
-               mrioc->unrecoverable = 1;
-               ioc_err(mrioc, "Issue IOCInit: command timed out\n");
+               ioc_err(mrioc, "ioc_init timed out\n");
                retval = -1;
                goto out_unlock;
        }
        wait_for_completion_timeout(&mrioc->init_cmds.done,
            (MPI3MR_INTADMCMD_TIMEOUT * HZ));
        if (!(mrioc->init_cmds.state & MPI3MR_CMD_COMPLETE)) {
-               ioc_err(mrioc, "Issue EvtNotify: command timed out\n");
-               mpi3mr_set_diagsave(mrioc);
-               mpi3mr_issue_reset(mrioc,
-                   MPI3_SYSIF_HOST_DIAG_RESET_ACTION_DIAG_FAULT,
+               ioc_err(mrioc, "event notification timed out\n");
+               mpi3mr_check_rh_fault_ioc(mrioc,
                    MPI3MR_RESET_FROM_EVTNOTIFY_TIMEOUT);
-               mrioc->unrecoverable = 1;
                retval = -1;
                goto out_unlock;
        }
                ioc_err(mrioc, "Issue PortEnable: Admin Post failed\n");
                goto out_unlock;
        }
-       if (!async) {
-               wait_for_completion_timeout(&mrioc->init_cmds.done,
-                   (pe_timeout * HZ));
-               if (!(mrioc->init_cmds.state & MPI3MR_CMD_COMPLETE)) {
-                       ioc_err(mrioc, "Issue PortEnable: command timed out\n");
-                       retval = -1;
-                       mrioc->scan_failed = MPI3_IOCSTATUS_INTERNAL_ERROR;
-                       mpi3mr_set_diagsave(mrioc);
-                       mpi3mr_issue_reset(mrioc,
-                           MPI3_SYSIF_HOST_DIAG_RESET_ACTION_DIAG_FAULT,
-                           MPI3MR_RESET_FROM_PE_TIMEOUT);
-                       mrioc->unrecoverable = 1;
-                       goto out_unlock;
-               }
-               mpi3mr_port_enable_complete(mrioc, &mrioc->init_cmds);
+       if (async) {
+               mutex_unlock(&mrioc->init_cmds.mutex);
+               goto out;
        }
+
+       wait_for_completion_timeout(&mrioc->init_cmds.done, (pe_timeout * HZ));
+       if (!(mrioc->init_cmds.state & MPI3MR_CMD_COMPLETE)) {
+               ioc_err(mrioc, "port enable timed out\n");
+               retval = -1;
+               mpi3mr_check_rh_fault_ioc(mrioc, MPI3MR_RESET_FROM_PE_TIMEOUT);
+               goto out_unlock;
+       }
+       mpi3mr_port_enable_complete(mrioc, &mrioc->init_cmds);
+
 out_unlock:
+       mrioc->init_cmds.state = MPI3MR_CMD_NOTUSED;
        mutex_unlock(&mrioc->init_cmds.mutex);
 out:
        return retval;
 }
 
-/* Protocol type to name mapper structure*/
+/* Protocol type to name mapper structure */
 static const struct {
        u8 protocol;
        char *name;