scsi: mpi3mr: Scan the devices during resume time
authorSreekanth Reddy <sreekanth.reddy@broadcom.com>
Mon, 12 Sep 2022 13:57:40 +0000 (19:27 +0530)
committerMartin K. Petersen <martin.petersen@oracle.com>
Sun, 25 Sep 2022 17:49:52 +0000 (13:49 -0400)
Scan the target devices during system resume time and add or remove the
target device with the SML if the corresponding target device is newly
added or removed respectively.

Link: https://lore.kernel.org/r/20220912135742.11764-8-sreekanth.reddy@broadcom.com
Signed-off-by: Sreekanth Reddy <sreekanth.reddy@broadcom.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/mpi3mr/mpi3mr.h
drivers/scsi/mpi3mr/mpi3mr_fw.c
drivers/scsi/mpi3mr/mpi3mr_os.c

index 883ed59..5b10504 100644 (file)
@@ -132,6 +132,8 @@ extern atomic64_t event_counter;
 
 #define MPI3MR_DEFAULT_CFG_PAGE_SZ             1024 /* in bytes */
 
+#define MPI3MR_RESET_TOPOLOGY_SETTLE_TIME      10
+
 #define MPI3MR_SCMD_TIMEOUT    (60 * HZ)
 #define MPI3MR_EH_SCMD_TIMEOUT (60 * HZ)
 
index e3df044..f841a44 100644 (file)
@@ -4042,10 +4042,8 @@ retry_init:
                goto out_failed;
        }
 
-       if (!is_resume) {
-               mrioc->device_refresh_on = 1;
-               mpi3mr_add_event_wait_for_device_refresh(mrioc);
-       }
+       mrioc->device_refresh_on = 1;
+       mpi3mr_add_event_wait_for_device_refresh(mrioc);
 
        ioc_info(mrioc, "sending port enable\n");
        retval = mpi3mr_issue_port_enable(mrioc, 1);
@@ -4912,7 +4910,7 @@ int mpi3mr_soft_reset_handler(struct mpi3mr_ioc *mrioc,
                    mrioc->name, reset_reason);
                goto out;
        }
-       ssleep(10);
+       ssleep(MPI3MR_RESET_TOPOLOGY_SETTLE_TIME);
 
 out:
        if (!retval) {
index 282ec4b..d61837f 100644 (file)
@@ -5228,13 +5228,17 @@ mpi3mr_resume(struct device *dev)
        }
 
        mrioc->stop_drv_processing = 0;
+       mpi3mr_invalidate_devhandles(mrioc);
+       mpi3mr_free_enclosure_list(mrioc);
        mpi3mr_memset_buffers(mrioc);
        r = mpi3mr_reinit_ioc(mrioc, 1);
        if (r) {
                ioc_err(mrioc, "resuming controller failed[%d]\n", r);
                return r;
        }
+       ssleep(MPI3MR_RESET_TOPOLOGY_SETTLE_TIME);
        scsi_unblock_requests(shost);
+       mrioc->device_refresh_on = 0;
        mpi3mr_start_watchdog(mrioc);
 
        return 0;