| From 10c07dd7daffb304c66a01826ab94a05115d422a Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Wed, 31 Oct 2018 18:53:36 +0530 |
| Subject: scsi: mpt3sas: Fix Sync cache command failure during driver unload |
| |
| From: Suganath Prabu <suganath-prabu.subramani@broadcom.com> |
| |
| [ Upstream commit 9029a72500b95578a35877a43473b82cb0386c53 ] |
| |
| This is to fix SYNC CACHE and START STOP command failures with |
| DID_NO_CONNECT during driver unload. |
| |
| In driver's IO submission patch (i.e. in driver's .queuecommand()) driver |
| won't allow any SCSI commands to the IOC when ioc->remove_host flag is set |
| and hence SYNC CACHE commands which are issued to the target drives (where |
| write cache is enabled) during driver unload time is failed with |
| DID_NO_CONNECT status. |
| |
| Now modified the driver to allow SYNC CACHE and START STOP commands to IOC, |
| even when remove_host flag is set. |
| |
| Signed-off-by: Suganath Prabu <suganath-prabu.subramani@broadcom.com> |
| Reviewed-by: Bjorn Helgaas <bhelgaas@google.com> |
| Reviewed-by: Andy Shevchenko <andy.shevchenko@gmail.com> |
| Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/scsi/mpt3sas/mpt3sas_scsih.c | 36 +++++++++++++++++++++++++++- |
| 1 file changed, 35 insertions(+), 1 deletion(-) |
| |
| diff --git a/drivers/scsi/mpt3sas/mpt3sas_scsih.c b/drivers/scsi/mpt3sas/mpt3sas_scsih.c |
| index 73d661a0ecbb9..d3c944d997039 100644 |
| --- a/drivers/scsi/mpt3sas/mpt3sas_scsih.c |
| +++ b/drivers/scsi/mpt3sas/mpt3sas_scsih.c |
| @@ -3791,6 +3791,40 @@ _scsih_tm_tr_complete(struct MPT3SAS_ADAPTER *ioc, u16 smid, u8 msix_index, |
| return _scsih_check_for_pending_tm(ioc, smid); |
| } |
| |
| +/** _scsih_allow_scmd_to_device - check whether scmd needs to |
| + * issue to IOC or not. |
| + * @ioc: per adapter object |
| + * @scmd: pointer to scsi command object |
| + * |
| + * Returns true if scmd can be issued to IOC otherwise returns false. |
| + */ |
| +inline bool _scsih_allow_scmd_to_device(struct MPT3SAS_ADAPTER *ioc, |
| + struct scsi_cmnd *scmd) |
| +{ |
| + |
| + if (ioc->pci_error_recovery) |
| + return false; |
| + |
| + if (ioc->hba_mpi_version_belonged == MPI2_VERSION) { |
| + if (ioc->remove_host) |
| + return false; |
| + |
| + return true; |
| + } |
| + |
| + if (ioc->remove_host) { |
| + |
| + switch (scmd->cmnd[0]) { |
| + case SYNCHRONIZE_CACHE: |
| + case START_STOP: |
| + return true; |
| + default: |
| + return false; |
| + } |
| + } |
| + |
| + return true; |
| +} |
| |
| /** |
| * _scsih_sas_control_complete - completion routine |
| @@ -4623,7 +4657,7 @@ scsih_qcmd(struct Scsi_Host *shost, struct scsi_cmnd *scmd) |
| return 0; |
| } |
| |
| - if (ioc->pci_error_recovery || ioc->remove_host) { |
| + if (!(_scsih_allow_scmd_to_device(ioc, scmd))) { |
| scmd->result = DID_NO_CONNECT << 16; |
| scmd->scsi_done(scmd); |
| return 0; |
| -- |
| 2.20.1 |
| |