diff options
author | Kashyap Desai <kashyap.desai@broadcom.com> | 2021-05-20 17:25:36 +0200 |
---|---|---|
committer | Martin K. Petersen <martin.petersen@oracle.com> | 2021-06-02 06:56:17 +0200 |
commit | 82141ddba90a88df8ebde782c5b24c7cc5a9926e (patch) | |
tree | f0837e448f32f339bc74df5f8c8f2e86fdce7bc0 /drivers/scsi/mpi3mr/mpi3mr_os.c | |
parent | scsi: mpi3mr: Add change queue depth support (diff) | |
download | linux-82141ddba90a88df8ebde782c5b24c7cc5a9926e.tar.xz linux-82141ddba90a88df8ebde782c5b24c7cc5a9926e.zip |
scsi: mpi3mr: Allow certain commands during pci-remove hook
Instead of driver returning DID_NO_CONNECT during driver unload allow SSU
and Sync Cache commands to be sent to the controller to flush any cached
data from the drive.
Link: https://lore.kernel.org/r/20210520152545.2710479-16-kashyap.desai@broadcom.com
Cc: sathya.prakash@broadcom.com
Reviewed-by: Hannes Reinecke <hare@suse.de>
Reviewed-by: Tomas Henzl <thenzl@redhat.com>
Reviewed-by: Himanshu Madhani <himanshu.madhani@oracle.com>
Signed-off-by: Kashyap Desai <kashyap.desai@broadcom.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
Diffstat (limited to '')
-rw-r--r-- | drivers/scsi/mpi3mr/mpi3mr_os.c | 23 |
1 files changed, 22 insertions, 1 deletions
diff --git a/drivers/scsi/mpi3mr/mpi3mr_os.c b/drivers/scsi/mpi3mr/mpi3mr_os.c index 0a0e42d3eb77..221a850ae153 100644 --- a/drivers/scsi/mpi3mr/mpi3mr_os.c +++ b/drivers/scsi/mpi3mr/mpi3mr_os.c @@ -2768,6 +2768,26 @@ static int mpi3mr_target_alloc(struct scsi_target *starget) } /** + * mpi3mr_allow_scmd_to_fw - Command is allowed during shutdown + * @scmd: SCSI Command reference + * + * Checks whether a cdb is allowed during shutdown or not. + * + * Return: TRUE for allowed commands, FALSE otherwise. + */ + +inline bool mpi3mr_allow_scmd_to_fw(struct scsi_cmnd *scmd) +{ + switch (scmd->cmnd[0]) { + case SYNCHRONIZE_CACHE: + case START_STOP: + return true; + default: + return false; + } +} + +/** * mpi3mr_qcmd - I/O request despatcher * @shost: SCSI Host reference * @scmd: SCSI Command reference @@ -2802,7 +2822,8 @@ static int mpi3mr_qcmd(struct Scsi_Host *shost, goto out; } - if (mrioc->stop_drv_processing) { + if (mrioc->stop_drv_processing && + !(mpi3mr_allow_scmd_to_fw(scmd))) { scmd->result = DID_NO_CONNECT << 16; scmd->scsi_done(scmd); goto out; |