return r;
 }
 
+/**
+ * mpt3sas_wait_for_ioc - IOC's operational state is checked here.
+ * @ioc: per adapter object
+ * @wait_count: timeout in seconds
+ *
+ * Return: Waits up to timeout seconds for the IOC to
+ * become operational. Returns 0 if IOC is present
+ * and operational; otherwise returns -EFAULT.
+ */
+
+int
+mpt3sas_wait_for_ioc(struct MPT3SAS_ADAPTER *ioc, int timeout)
+{
+       int wait_state_count = 0;
+       u32 ioc_state;
+
+       ioc_state = mpt3sas_base_get_iocstate(ioc, 1);
+       while (ioc_state != MPI2_IOC_STATE_OPERATIONAL) {
+
+               if (wait_state_count++ == timeout) {
+                       ioc_err(ioc, "%s: failed due to ioc not operational\n",
+                               __func__);
+                       return -EFAULT;
+               }
+               ssleep(1);
+               ioc_state = mpt3sas_base_get_iocstate(ioc, 1);
+               ioc_info(ioc, "%s: waiting for operational state(count=%d)\n",
+                        __func__, wait_state_count);
+       }
+       if (wait_state_count)
+               ioc_info(ioc, "ioc is operational\n");
+
+       return 0;
+}
+
 /**
  * _base_handshake_req_reply_wait - send request thru doorbell interface
  * @ioc: per adapter object
        Mpi2SasIoUnitControlRequest_t *mpi_request)
 {
        u16 smid;
-       u32 ioc_state;
        u8 issue_reset = 0;
        int rc;
        void *request;
-       u16 wait_state_count;
 
        dinitprintk(ioc, ioc_info(ioc, "%s\n", __func__));
 
                goto out;
        }
 
-       wait_state_count = 0;
-       ioc_state = mpt3sas_base_get_iocstate(ioc, 1);
-       while (ioc_state != MPI2_IOC_STATE_OPERATIONAL) {
-               if (wait_state_count++ == IOC_OPERATIONAL_WAIT_COUNT) {
-                       ioc_err(ioc, "%s: failed due to ioc not operational\n",
-                               __func__);
-                       rc = -EFAULT;
-                       goto out;
-               }
-               ssleep(1);
-               ioc_state = mpt3sas_base_get_iocstate(ioc, 1);
-               ioc_info(ioc, "%s: waiting for operational state(count=%d)\n",
-                        __func__, wait_state_count);
-       }
+       rc = mpt3sas_wait_for_ioc(ioc, IOC_OPERATIONAL_WAIT_COUNT);
+       if (rc)
+               goto out;
 
        smid = mpt3sas_base_get_smid(ioc, ioc->base_cb_idx);
        if (!smid) {
        Mpi2SepReply_t *mpi_reply, Mpi2SepRequest_t *mpi_request)
 {
        u16 smid;
-       u32 ioc_state;
        u8 issue_reset = 0;
        int rc;
        void *request;
-       u16 wait_state_count;
 
        dinitprintk(ioc, ioc_info(ioc, "%s\n", __func__));
 
                goto out;
        }
 
-       wait_state_count = 0;
-       ioc_state = mpt3sas_base_get_iocstate(ioc, 1);
-       while (ioc_state != MPI2_IOC_STATE_OPERATIONAL) {
-               if (wait_state_count++ == IOC_OPERATIONAL_WAIT_COUNT) {
-                       ioc_err(ioc, "%s: failed due to ioc not operational\n",
-                               __func__);
-                       rc = -EFAULT;
-                       goto out;
-               }
-               ssleep(1);
-               ioc_state = mpt3sas_base_get_iocstate(ioc, 1);
-               ioc_info(ioc, "%s: waiting for operational state(count=%d)\n",
-                        __func__, wait_state_count);
-       }
+       rc = mpt3sas_wait_for_ioc(ioc, IOC_OPERATIONAL_WAIT_COUNT);
+       if (rc)
+               goto out;
 
        smid = mpt3sas_base_get_smid(ioc, ioc->base_cb_idx);
        if (!smid) {
 
 
 u8 mpt3sas_base_check_cmd_timeout(struct MPT3SAS_ADAPTER *ioc,
        u8 status, void *mpi_request, int sz);
+int mpt3sas_wait_for_ioc(struct MPT3SAS_ADAPTER *ioc, int wait_count);
 
 /* scsih shared API */
 struct scsi_cmnd *mpt3sas_scsih_scsi_lookup_get(struct MPT3SAS_ADAPTER *ioc,
 
        void *config_page, u16 config_page_sz)
 {
        u16 smid;
-       u32 ioc_state;
        Mpi2ConfigRequest_t *config_request;
        int r;
        u8 retry_count, issue_host_reset = 0;
-       u16 wait_state_count;
        struct config_request mem;
        u32 ioc_status = UINT_MAX;
 
                ioc_info(ioc, "%s: attempting retry (%d)\n",
                         __func__, retry_count);
        }
-       wait_state_count = 0;
-       ioc_state = mpt3sas_base_get_iocstate(ioc, 1);
-       while (ioc_state != MPI2_IOC_STATE_OPERATIONAL) {
-               if (wait_state_count++ == MPT3_CONFIG_PAGE_DEFAULT_TIMEOUT) {
-                       ioc_err(ioc, "%s: failed due to ioc not operational\n",
-                               __func__);
-                       ioc->config_cmds.status = MPT3_CMD_NOT_USED;
-                       r = -EFAULT;
-                       goto free_mem;
-               }
-               ssleep(1);
-               ioc_state = mpt3sas_base_get_iocstate(ioc, 1);
-               ioc_info(ioc, "%s: waiting for operational state(count=%d)\n",
-                        __func__, wait_state_count);
-       }
-       if (wait_state_count)
-               ioc_info(ioc, "%s: ioc is operational\n", __func__);
+
+       r = mpt3sas_wait_for_ioc(ioc, MPT3_CONFIG_PAGE_DEFAULT_TIMEOUT);
+       if (r)
+               goto free_mem;
 
        smid = mpt3sas_base_get_smid(ioc, ioc->config_cb_idx);
        if (!smid) {
 
        MPI2DefaultReply_t *mpi_reply;
        Mpi26NVMeEncapsulatedRequest_t *nvme_encap_request = NULL;
        struct _pcie_device *pcie_device = NULL;
-       u32 ioc_state;
        u16 smid;
        u8 timeout;
        u8 issue_reset;
        dma_addr_t data_in_dma = 0;
        size_t data_in_sz = 0;
        long ret;
-       u16 wait_state_count;
        u16 device_handle = MPT3SAS_INVALID_DEVICE_HANDLE;
        u8 tr_method = MPI26_SCSITASKMGMT_MSGFLAGS_PROTOCOL_LVL_RST_PCIE;
 
                goto out;
        }
 
-       wait_state_count = 0;
-       ioc_state = mpt3sas_base_get_iocstate(ioc, 1);
-       while (ioc_state != MPI2_IOC_STATE_OPERATIONAL) {
-               if (wait_state_count++ == IOC_OPERATIONAL_WAIT_COUNT) {
-                       ioc_err(ioc, "%s: failed due to ioc not operational\n",
-                               __func__);
-                       ret = -EFAULT;
-                       goto out;
-               }
-               ssleep(1);
-               ioc_state = mpt3sas_base_get_iocstate(ioc, 1);
-               ioc_info(ioc, "%s: waiting for operational state(count=%d)\n",
-                        __func__, wait_state_count);
-       }
-       if (wait_state_count)
-               ioc_info(ioc, "%s: ioc is operational\n", __func__);
+       ret = mpt3sas_wait_for_ioc(ioc, IOC_OPERATIONAL_WAIT_COUNT);
+       if (ret)
+               goto out;
 
        mpi_request = kzalloc(ioc->request_sz, GFP_KERNEL);
        if (!mpi_request) {
 
        struct rep_manu_request *manufacture_request;
        int rc;
        u16 smid;
-       u32 ioc_state;
        void *psge;
        u8 issue_reset = 0;
        void *data_out = NULL;
        dma_addr_t data_in_dma;
        size_t data_in_sz;
        size_t data_out_sz;
-       u16 wait_state_count;
 
        if (ioc->shost_recovery || ioc->pci_error_recovery) {
                ioc_info(ioc, "%s: host reset in progress!\n", __func__);
        }
        ioc->transport_cmds.status = MPT3_CMD_PENDING;
 
-       wait_state_count = 0;
-       ioc_state = mpt3sas_base_get_iocstate(ioc, 1);
-       while (ioc_state != MPI2_IOC_STATE_OPERATIONAL) {
-               if (wait_state_count++ == IOC_OPERATIONAL_WAIT_COUNT) {
-                       ioc_err(ioc, "%s: failed due to ioc not operational\n",
-                               __func__);
-                       rc = -EFAULT;
-                       goto out;
-               }
-               ssleep(1);
-               ioc_state = mpt3sas_base_get_iocstate(ioc, 1);
-               ioc_info(ioc, "%s: waiting for operational state(count=%d)\n",
-                        __func__, wait_state_count);
-       }
-       if (wait_state_count)
-               ioc_info(ioc, "%s: ioc is operational\n", __func__);
+       rc = mpt3sas_wait_for_ioc(ioc, IOC_OPERATIONAL_WAIT_COUNT);
+       if (rc)
+               goto out;
 
        smid = mpt3sas_base_get_smid(ioc, ioc->transport_cb_idx);
        if (!smid) {
        struct phy_error_log_reply *phy_error_log_reply;
        int rc;
        u16 smid;
-       u32 ioc_state;
        void *psge;
        u8 issue_reset = 0;
        void *data_out = NULL;
        dma_addr_t data_out_dma;
        u32 sz;
-       u16 wait_state_count;
 
        if (ioc->shost_recovery || ioc->pci_error_recovery) {
                ioc_info(ioc, "%s: host reset in progress!\n", __func__);
        }
        ioc->transport_cmds.status = MPT3_CMD_PENDING;
 
-       wait_state_count = 0;
-       ioc_state = mpt3sas_base_get_iocstate(ioc, 1);
-       while (ioc_state != MPI2_IOC_STATE_OPERATIONAL) {
-               if (wait_state_count++ == IOC_OPERATIONAL_WAIT_COUNT) {
-                       ioc_err(ioc, "%s: failed due to ioc not operational\n",
-                               __func__);
-                       rc = -EFAULT;
-                       goto out;
-               }
-               ssleep(1);
-               ioc_state = mpt3sas_base_get_iocstate(ioc, 1);
-               ioc_info(ioc, "%s: waiting for operational state(count=%d)\n",
-                        __func__, wait_state_count);
-       }
-       if (wait_state_count)
-               ioc_info(ioc, "%s: ioc is operational\n", __func__);
+       rc = mpt3sas_wait_for_ioc(ioc, IOC_OPERATIONAL_WAIT_COUNT);
+       if (rc)
+               goto out;
 
        smid = mpt3sas_base_get_smid(ioc, ioc->transport_cb_idx);
        if (!smid) {
        struct phy_control_reply *phy_control_reply;
        int rc;
        u16 smid;
-       u32 ioc_state;
        void *psge;
        u8 issue_reset = 0;
        void *data_out = NULL;
        dma_addr_t data_out_dma;
        u32 sz;
-       u16 wait_state_count;
 
        if (ioc->shost_recovery || ioc->pci_error_recovery) {
                ioc_info(ioc, "%s: host reset in progress!\n", __func__);
        }
        ioc->transport_cmds.status = MPT3_CMD_PENDING;
 
-       wait_state_count = 0;
-       ioc_state = mpt3sas_base_get_iocstate(ioc, 1);
-       while (ioc_state != MPI2_IOC_STATE_OPERATIONAL) {
-               if (wait_state_count++ == IOC_OPERATIONAL_WAIT_COUNT) {
-                       ioc_err(ioc, "%s: failed due to ioc not operational\n",
-                               __func__);
-                       rc = -EFAULT;
-                       goto out;
-               }
-               ssleep(1);
-               ioc_state = mpt3sas_base_get_iocstate(ioc, 1);
-               ioc_info(ioc, "%s: waiting for operational state(count=%d)\n",
-                        __func__, wait_state_count);
-       }
-       if (wait_state_count)
-               ioc_info(ioc, "%s: ioc is operational\n", __func__);
+       rc = mpt3sas_wait_for_ioc(ioc, IOC_OPERATIONAL_WAIT_COUNT);
+       if (rc)
+               goto out;
 
        smid = mpt3sas_base_get_smid(ioc, ioc->transport_cb_idx);
        if (!smid) {
        Mpi2SmpPassthroughReply_t *mpi_reply;
        int rc;
        u16 smid;
-       u32 ioc_state;
        void *psge;
        dma_addr_t dma_addr_in;
        dma_addr_t dma_addr_out;
        void *addr_out = NULL;
        size_t dma_len_in;
        size_t dma_len_out;
-       u16 wait_state_count;
        unsigned int reslen = 0;
 
        if (ioc->shost_recovery || ioc->pci_error_recovery) {
        if (rc)
                goto unmap_out;
 
-       wait_state_count = 0;
-       ioc_state = mpt3sas_base_get_iocstate(ioc, 1);
-       while (ioc_state != MPI2_IOC_STATE_OPERATIONAL) {
-               if (wait_state_count++ == IOC_OPERATIONAL_WAIT_COUNT) {
-                       ioc_err(ioc, "%s: failed due to ioc not operational\n",
-                               __func__);
-                       rc = -EFAULT;
-                       goto unmap_in;
-               }
-               ssleep(1);
-               ioc_state = mpt3sas_base_get_iocstate(ioc, 1);
-               ioc_info(ioc, "%s: waiting for operational state(count=%d)\n",
-                        __func__, wait_state_count);
-       }
-       if (wait_state_count)
-               ioc_info(ioc, "%s: ioc is operational\n", __func__);
+       rc = mpt3sas_wait_for_ioc(ioc, IOC_OPERATIONAL_WAIT_COUNT);
+       if (rc)
+               goto unmap_in;
 
        smid = mpt3sas_base_get_smid(ioc, ioc->transport_cb_idx);
        if (!smid) {