Introduce mpt3sas_wait_for_ioc_to_operational.

This section of code "wait for IOC to be operational"
is used in many places across the driver,
and hence moved this section of code in to the function
"mpt3sas_wait_for_ioc_to_operational".

Also added HBA hot unplug checks, and this returns with
error code EFAULT, if it detects HBA is hot unplugged
or IOC is not in operational state.

Signed-off-by: Suganath Prabu S <suganath-prabu.subram...@broadcom.com>
---
 drivers/scsi/mpt3sas/mpt3sas_base.c      | 92 +++++++++++++++++++-------------
 drivers/scsi/mpt3sas/mpt3sas_base.h      |  4 ++
 drivers/scsi/mpt3sas/mpt3sas_config.c    | 28 +++-------
 drivers/scsi/mpt3sas/mpt3sas_ctl.c       | 26 ++-------
 drivers/scsi/mpt3sas/mpt3sas_transport.c | 75 +++++---------------------
 5 files changed, 81 insertions(+), 144 deletions(-)

diff --git a/drivers/scsi/mpt3sas/mpt3sas_base.c 
b/drivers/scsi/mpt3sas/mpt3sas_base.c
index 6c8a30f..a46ded8 100644
--- a/drivers/scsi/mpt3sas/mpt3sas_base.c
+++ b/drivers/scsi/mpt3sas/mpt3sas_base.c
@@ -5289,6 +5289,53 @@ _base_send_ioc_reset(struct MPT3SAS_ADAPTER *ioc, u8 
reset_type, int timeout)
 }
 
 /**
+ * mpt3sas_wait_for_ioc_to_operational - IOC's operational
+ *             state and HBA hot unplug status are checked here.
+ * @ioc: per adapter object
+ * @wait_count: timeout in seconds
+ *
+ * Return:  Returns EFAULT, if HBA is hot unplugged or IOC is
+ * not in operational state, within the wait_count.
+ * And returns 0, If not hot unplugged Or ioc is in
+ * operational state.
+ */
+
+int
+mpt3sas_wait_for_ioc_to_operational(struct MPT3SAS_ADAPTER *ioc,
+       int wait_count)
+{
+       int wait_state_count = 0;
+       u32 ioc_state;
+
+       if (mpt3sas_base_pci_device_is_unplugged(ioc))
+               return -EFAULT;
+
+       ioc_state = mpt3sas_base_get_iocstate(ioc, 1);
+       while (ioc_state != MPI2_IOC_STATE_OPERATIONAL) {
+
+               if (mpt3sas_base_pci_device_is_unplugged(ioc))
+                       return -EFAULT;
+
+               if (wait_state_count++ == wait_count) {
+                       pr_err(MPT3SAS_FMT
+                           "%s: failed due to ioc not operational\n",
+                           ioc->name, __func__);
+                       return -EFAULT;
+               }
+               ssleep(1);
+               ioc_state = mpt3sas_base_get_iocstate(ioc, 1);
+               pr_info(MPT3SAS_FMT "%s: waiting for "
+                   "operational state(count=%d)\n", ioc->name,
+                   __func__, wait_state_count);
+       }
+       if (wait_state_count)
+               pr_info(MPT3SAS_FMT "%s: ioc is operational\n",
+                   ioc->name, __func__);
+
+       return 0;
+}
+
+/**
  * _base_handshake_req_reply_wait - send request thru doorbell interface
  * @ioc: per adapter object
  * @request_bytes: request length
@@ -5429,11 +5476,9 @@ mpt3sas_base_sas_iounit_control(struct MPT3SAS_ADAPTER 
*ioc,
        Mpi2SasIoUnitControlRequest_t *mpi_request)
 {
        u16 smid;
-       u32 ioc_state;
        u8 issue_reset = 0;
        int rc;
        void *request;
-       u16 wait_state_count;
 
        dinitprintk(ioc, pr_info(MPT3SAS_FMT "%s\n", ioc->name,
            __func__));
@@ -5447,22 +5492,10 @@ mpt3sas_base_sas_iounit_control(struct MPT3SAS_ADAPTER 
*ioc,
                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++ == 10) {
-                       pr_err(MPT3SAS_FMT
-                           "%s: failed due to ioc not operational\n",
-                           ioc->name, __func__);
-                       rc = -EFAULT;
-                       goto out;
-               }
-               ssleep(1);
-               ioc_state = mpt3sas_base_get_iocstate(ioc, 1);
-               pr_info(MPT3SAS_FMT
-                       "%s: waiting for operational state(count=%d)\n",
-                       ioc->name, __func__, wait_state_count);
-       }
+       rc = mpt3sas_wait_for_ioc_to_operational(ioc,
+                                       IOC_OPERATIONAL_WAIT_COUNT);
+       if (rc)
+               goto out;
 
        smid = mpt3sas_base_get_smid(ioc, ioc->base_cb_idx);
        if (!smid) {
@@ -5529,11 +5562,9 @@ mpt3sas_base_scsi_enclosure_processor(struct 
MPT3SAS_ADAPTER *ioc,
        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, pr_info(MPT3SAS_FMT "%s\n", ioc->name,
            __func__));
@@ -5547,23 +5578,10 @@ mpt3sas_base_scsi_enclosure_processor(struct 
MPT3SAS_ADAPTER *ioc,
                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++ == 10) {
-                       pr_err(MPT3SAS_FMT
-                           "%s: failed due to ioc not operational\n",
-                           ioc->name, __func__);
-                       rc = -EFAULT;
-                       goto out;
-               }
-               ssleep(1);
-               ioc_state = mpt3sas_base_get_iocstate(ioc, 1);
-               pr_info(MPT3SAS_FMT
-                       "%s: waiting for operational state(count=%d)\n",
-                       ioc->name,
-                   __func__, wait_state_count);
-       }
+       rc = mpt3sas_wait_for_ioc_to_operational(ioc,
+                                       IOC_OPERATIONAL_WAIT_COUNT);
+       if (rc)
+               goto out;
 
        smid = mpt3sas_base_get_smid(ioc, ioc->base_cb_idx);
        if (!smid) {
diff --git a/drivers/scsi/mpt3sas/mpt3sas_base.h 
b/drivers/scsi/mpt3sas/mpt3sas_base.h
index 4186bc9..8b2cc66 100644
--- a/drivers/scsi/mpt3sas/mpt3sas_base.h
+++ b/drivers/scsi/mpt3sas/mpt3sas_base.h
@@ -139,6 +139,8 @@
 #define DEFAULT_NUM_FWCHAIN_ELEMTS     8
 
 #define FW_IMG_HDR_READ_TIMEOUT        15
+
+#define IOC_OPERATIONAL_WAIT_COUNT     10
 /*
  * NVMe defines
  */
@@ -1486,6 +1488,8 @@ mpt3sas_wait_for_commands_to_complete(struct 
MPT3SAS_ADAPTER *ioc);
 u8 mpt3sas_base_check_cmd_timeout(struct MPT3SAS_ADAPTER *ioc,
        u8 status, void *mpi_request, int sz);
 
+int mpt3sas_wait_for_ioc_to_operational(struct MPT3SAS_ADAPTER *ioc,
+       int wait_count);
 void mpt3sas_base_start_hba_unplug_watchdog(struct MPT3SAS_ADAPTER *ioc);
 void mpt3sas_base_stop_hba_unplug_watchdog(struct MPT3SAS_ADAPTER *ioc);
 /* scsih shared API */
diff --git a/drivers/scsi/mpt3sas/mpt3sas_config.c 
b/drivers/scsi/mpt3sas/mpt3sas_config.c
index d29a2dc..5713a2d 100644
--- a/drivers/scsi/mpt3sas/mpt3sas_config.c
+++ b/drivers/scsi/mpt3sas/mpt3sas_config.c
@@ -303,11 +303,10 @@ _config_request(struct MPT3SAS_ADAPTER *ioc, 
Mpi2ConfigRequest_t
        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;
 
@@ -365,26 +364,11 @@ _config_request(struct MPT3SAS_ADAPTER *ioc, 
Mpi2ConfigRequest_t
                pr_info(MPT3SAS_FMT "%s: attempting retry (%d)\n",
                    ioc->name, __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) {
-                       pr_err(MPT3SAS_FMT
-                           "%s: failed due to ioc not operational\n",
-                           ioc->name, __func__);
-                       ioc->config_cmds.status = MPT3_CMD_NOT_USED;
-                       r = -EFAULT;
-                       goto free_mem;
-               }
-               ssleep(1);
-               ioc_state = mpt3sas_base_get_iocstate(ioc, 1);
-               pr_info(MPT3SAS_FMT
-                       "%s: waiting for operational state(count=%d)\n",
-                       ioc->name, __func__, wait_state_count);
-       }
-       if (wait_state_count)
-               pr_info(MPT3SAS_FMT "%s: ioc is operational\n",
-                   ioc->name, __func__);
+
+       r = mpt3sas_wait_for_ioc_to_operational(ioc,
+                               MPT3_CONFIG_PAGE_DEFAULT_TIMEOUT);
+       if (r)
+               goto free_mem;
 
        smid = mpt3sas_base_get_smid(ioc, ioc->config_cb_idx);
        if (!smid) {
diff --git a/drivers/scsi/mpt3sas/mpt3sas_ctl.c 
b/drivers/scsi/mpt3sas/mpt3sas_ctl.c
index 5e8c059..a46039c 100644
--- a/drivers/scsi/mpt3sas/mpt3sas_ctl.c
+++ b/drivers/scsi/mpt3sas/mpt3sas_ctl.c
@@ -652,7 +652,6 @@ _ctl_do_mpt_command(struct MPT3SAS_ADAPTER *ioc, struct 
mpt3_ioctl_command karg,
        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;
@@ -665,7 +664,6 @@ _ctl_do_mpt_command(struct MPT3SAS_ADAPTER *ioc, struct 
mpt3_ioctl_command karg,
        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;
 
@@ -678,26 +676,10 @@ _ctl_do_mpt_command(struct MPT3SAS_ADAPTER *ioc, struct 
mpt3_ioctl_command karg,
                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++ == 10) {
-                       pr_err(MPT3SAS_FMT
-                           "%s: failed due to ioc not operational\n",
-                           ioc->name, __func__);
-                       ret = -EFAULT;
-                       goto out;
-               }
-               ssleep(1);
-               ioc_state = mpt3sas_base_get_iocstate(ioc, 1);
-               pr_info(MPT3SAS_FMT
-                       "%s: waiting for operational state(count=%d)\n",
-                       ioc->name,
-                   __func__, wait_state_count);
-       }
-       if (wait_state_count)
-               pr_info(MPT3SAS_FMT "%s: ioc is operational\n",
-                   ioc->name, __func__);
+       ret = mpt3sas_wait_for_ioc_to_operational(ioc,
+                                       IOC_OPERATIONAL_WAIT_COUNT);
+       if (ret)
+               goto out;
 
        mpi_request = kzalloc(ioc->request_sz, GFP_KERNEL);
        if (!mpi_request) {
diff --git a/drivers/scsi/mpt3sas/mpt3sas_transport.c 
b/drivers/scsi/mpt3sas/mpt3sas_transport.c
index f8cc267..b10d73e 100644
--- a/drivers/scsi/mpt3sas/mpt3sas_transport.c
+++ b/drivers/scsi/mpt3sas/mpt3sas_transport.c
@@ -299,7 +299,6 @@ _transport_expander_report_manufacture(struct 
MPT3SAS_ADAPTER *ioc,
        struct rep_manu_request *manufacture_request;
        int rc;
        u16 smid;
-       u32 ioc_state;
        void *psge;
        u8 issue_reset = 0;
        void *data_out = NULL;
@@ -307,7 +306,6 @@ _transport_expander_report_manufacture(struct 
MPT3SAS_ADAPTER *ioc,
        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) {
                pr_info(MPT3SAS_FMT "%s: host reset in progress!\n",
@@ -325,25 +323,10 @@ _transport_expander_report_manufacture(struct 
MPT3SAS_ADAPTER *ioc,
        }
        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++ == 10) {
-                       pr_err(MPT3SAS_FMT
-                           "%s: failed due to ioc not operational\n",
-                           ioc->name, __func__);
-                       rc = -EFAULT;
-                       goto out;
-               }
-               ssleep(1);
-               ioc_state = mpt3sas_base_get_iocstate(ioc, 1);
-               pr_info(MPT3SAS_FMT
-                       "%s: waiting for operational state(count=%d)\n",
-                       ioc->name, __func__, wait_state_count);
-       }
-       if (wait_state_count)
-               pr_info(MPT3SAS_FMT "%s: ioc is operational\n",
-                   ioc->name, __func__);
+       rc = mpt3sas_wait_for_ioc_to_operational(ioc,
+                                       IOC_OPERATIONAL_WAIT_COUNT);
+       if (rc)
+               goto out;
 
        smid = mpt3sas_base_get_smid(ioc, ioc->transport_cb_idx);
        if (!smid) {
@@ -1089,13 +1072,11 @@ _transport_get_expander_phy_error_log(struct 
MPT3SAS_ADAPTER *ioc,
        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) {
                pr_info(MPT3SAS_FMT "%s: host reset in progress!\n",
@@ -1113,25 +1094,10 @@ _transport_get_expander_phy_error_log(struct 
MPT3SAS_ADAPTER *ioc,
        }
        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++ == 10) {
-                       pr_err(MPT3SAS_FMT
-                           "%s: failed due to ioc not operational\n",
-                           ioc->name, __func__);
-                       rc = -EFAULT;
-                       goto out;
-               }
-               ssleep(1);
-               ioc_state = mpt3sas_base_get_iocstate(ioc, 1);
-               pr_info(MPT3SAS_FMT
-                       "%s: waiting for operational state(count=%d)\n",
-                       ioc->name, __func__, wait_state_count);
-       }
-       if (wait_state_count)
-               pr_info(MPT3SAS_FMT "%s: ioc is operational\n",
-                   ioc->name, __func__);
+       rc = mpt3sas_wait_for_ioc_to_operational(ioc,
+                                       IOC_OPERATIONAL_WAIT_COUNT);
+       if (rc)
+               goto out;
 
        smid = mpt3sas_base_get_smid(ioc, ioc->transport_cb_idx);
        if (!smid) {
@@ -1402,13 +1368,11 @@ _transport_expander_phy_control(struct MPT3SAS_ADAPTER 
*ioc,
        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) {
                pr_info(MPT3SAS_FMT "%s: host reset in progress!\n",
@@ -1426,25 +1390,10 @@ _transport_expander_phy_control(struct MPT3SAS_ADAPTER 
*ioc,
        }
        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++ == 10) {
-                       pr_err(MPT3SAS_FMT
-                           "%s: failed due to ioc not operational\n",
-                           ioc->name, __func__);
-                       rc = -EFAULT;
-                       goto out;
-               }
-               ssleep(1);
-               ioc_state = mpt3sas_base_get_iocstate(ioc, 1);
-               pr_info(MPT3SAS_FMT
-                       "%s: waiting for operational state(count=%d)\n",
-                       ioc->name, __func__, wait_state_count);
-       }
-       if (wait_state_count)
-               pr_info(MPT3SAS_FMT "%s: ioc is operational\n",
-                   ioc->name, __func__);
+       rc = mpt3sas_wait_for_ioc_to_operational(ioc,
+                                       IOC_OPERATIONAL_WAIT_COUNT);
+       if (rc)
+               goto out;
 
        smid = mpt3sas_base_get_smid(ioc, ioc->transport_cb_idx);
        if (!smid) {
-- 
1.8.3.1

Reply via email to