Commit c666d3be authored by Sreekanth Reddy's avatar Sreekanth Reddy Committed by Martin K. Petersen

scsi: mpt3sas: wait for and flush running commands on shutdown/unload

This patch finishes all outstanding SCSI IO commands (but not other commands,
e.g., task management) in the shutdown and unload paths.

It first waits for the commands to complete (this is done after setting
'ioc->remove_host = 1 ', which prevents new commands to be queued) then it
flushes commands that might still be running.

This avoids triggering error handling (e.g., abort command) for all commands
possibly completed by the adapter after interrupts disabled.

[mauricfo: introduced something in commit message.]
Signed-off-by: default avatarSreekanth Reddy <sreekanth.reddy@broadcom.com>
Tested-by: default avatarMauricio Faria de Oliveira <mauricfo@linux.vnet.ibm.com>
Signed-off-by: default avatarMauricio Faria de Oliveira <mauricfo@linux.vnet.ibm.com>
Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
parent 9ff549ff
...@@ -6297,14 +6297,14 @@ _base_reset_handler(struct MPT3SAS_ADAPTER *ioc, int reset_phase) ...@@ -6297,14 +6297,14 @@ _base_reset_handler(struct MPT3SAS_ADAPTER *ioc, int reset_phase)
} }
/** /**
* _wait_for_commands_to_complete - reset controller * mpt3sas_wait_for_commands_to_complete - reset controller
* @ioc: Pointer to MPT_ADAPTER structure * @ioc: Pointer to MPT_ADAPTER structure
* *
* This function is waiting 10s for all pending commands to complete * This function is waiting 10s for all pending commands to complete
* prior to putting controller in reset. * prior to putting controller in reset.
*/ */
static void void
_wait_for_commands_to_complete(struct MPT3SAS_ADAPTER *ioc) mpt3sas_wait_for_commands_to_complete(struct MPT3SAS_ADAPTER *ioc)
{ {
u32 ioc_state; u32 ioc_state;
...@@ -6377,7 +6377,7 @@ mpt3sas_base_hard_reset_handler(struct MPT3SAS_ADAPTER *ioc, ...@@ -6377,7 +6377,7 @@ mpt3sas_base_hard_reset_handler(struct MPT3SAS_ADAPTER *ioc,
is_fault = 1; is_fault = 1;
} }
_base_reset_handler(ioc, MPT3_IOC_PRE_RESET); _base_reset_handler(ioc, MPT3_IOC_PRE_RESET);
_wait_for_commands_to_complete(ioc); mpt3sas_wait_for_commands_to_complete(ioc);
_base_mask_interrupts(ioc); _base_mask_interrupts(ioc);
r = _base_make_ioc_ready(ioc, type); r = _base_make_ioc_ready(ioc, type);
if (r) if (r)
......
...@@ -1433,6 +1433,9 @@ void mpt3sas_base_update_missing_delay(struct MPT3SAS_ADAPTER *ioc, ...@@ -1433,6 +1433,9 @@ void mpt3sas_base_update_missing_delay(struct MPT3SAS_ADAPTER *ioc,
int mpt3sas_port_enable(struct MPT3SAS_ADAPTER *ioc); int mpt3sas_port_enable(struct MPT3SAS_ADAPTER *ioc);
void
mpt3sas_wait_for_commands_to_complete(struct MPT3SAS_ADAPTER *ioc);
/* scsih shared API */ /* scsih shared API */
struct scsi_cmnd *mpt3sas_scsih_scsi_lookup_get(struct MPT3SAS_ADAPTER *ioc, struct scsi_cmnd *mpt3sas_scsih_scsi_lookup_get(struct MPT3SAS_ADAPTER *ioc,
......
...@@ -4456,7 +4456,7 @@ _scsih_flush_running_cmds(struct MPT3SAS_ADAPTER *ioc) ...@@ -4456,7 +4456,7 @@ _scsih_flush_running_cmds(struct MPT3SAS_ADAPTER *ioc)
st = scsi_cmd_priv(scmd); st = scsi_cmd_priv(scmd);
mpt3sas_base_clear_st(ioc, st); mpt3sas_base_clear_st(ioc, st);
scsi_dma_unmap(scmd); scsi_dma_unmap(scmd);
if (ioc->pci_error_recovery) if (ioc->pci_error_recovery || ioc->remove_host)
scmd->result = DID_NO_CONNECT << 16; scmd->result = DID_NO_CONNECT << 16;
else else
scmd->result = DID_RESET << 16; scmd->result = DID_RESET << 16;
...@@ -9742,6 +9742,10 @@ static void scsih_remove(struct pci_dev *pdev) ...@@ -9742,6 +9742,10 @@ static void scsih_remove(struct pci_dev *pdev)
unsigned long flags; unsigned long flags;
ioc->remove_host = 1; ioc->remove_host = 1;
mpt3sas_wait_for_commands_to_complete(ioc);
_scsih_flush_running_cmds(ioc);
_scsih_fw_event_cleanup_queue(ioc); _scsih_fw_event_cleanup_queue(ioc);
spin_lock_irqsave(&ioc->fw_event_lock, flags); spin_lock_irqsave(&ioc->fw_event_lock, flags);
...@@ -9818,6 +9822,10 @@ scsih_shutdown(struct pci_dev *pdev) ...@@ -9818,6 +9822,10 @@ scsih_shutdown(struct pci_dev *pdev)
unsigned long flags; unsigned long flags;
ioc->remove_host = 1; ioc->remove_host = 1;
mpt3sas_wait_for_commands_to_complete(ioc);
_scsih_flush_running_cmds(ioc);
_scsih_fw_event_cleanup_queue(ioc); _scsih_fw_event_cleanup_queue(ioc);
spin_lock_irqsave(&ioc->fw_event_lock, flags); spin_lock_irqsave(&ioc->fw_event_lock, flags);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment