aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/scsi/mpt3sas/mpt3sas_base.c15
-rw-r--r--drivers/scsi/mpt3sas/mpt3sas_base.h3
-rw-r--r--drivers/scsi/mpt3sas/mpt3sas_scsih.c4
3 files changed, 12 insertions, 10 deletions
diff --git a/drivers/scsi/mpt3sas/mpt3sas_base.c b/drivers/scsi/mpt3sas/mpt3sas_base.c
index b7f4e664f5f3..751f13edece0 100644
--- a/drivers/scsi/mpt3sas/mpt3sas_base.c
+++ b/drivers/scsi/mpt3sas/mpt3sas_base.c
@@ -1104,18 +1104,16 @@ _base_is_controller_msix_enabled(struct MPT3SAS_ADAPTER *ioc)
1104} 1104}
1105 1105
1106/** 1106/**
1107 * mpt3sas_base_flush_reply_queues - flushing the MSIX reply queues 1107 * mpt3sas_base_sync_reply_irqs - flush pending MSIX interrupts
1108 * @ioc: per adapter object 1108 * @ioc: per adapter object
1109 * Context: ISR conext 1109 * Context: non ISR conext
1110 * 1110 *
1111 * Called when a Task Management request has completed. We want 1111 * Called when a Task Management request has completed.
1112 * to flush the other reply queues so all the outstanding IO has been
1113 * completed back to OS before we process the TM completetion.
1114 * 1112 *
1115 * Return nothing. 1113 * Return nothing.
1116 */ 1114 */
1117void 1115void
1118mpt3sas_base_flush_reply_queues(struct MPT3SAS_ADAPTER *ioc) 1116mpt3sas_base_sync_reply_irqs(struct MPT3SAS_ADAPTER *ioc)
1119{ 1117{
1120 struct adapter_reply_queue *reply_q; 1118 struct adapter_reply_queue *reply_q;
1121 1119
@@ -1126,12 +1124,13 @@ mpt3sas_base_flush_reply_queues(struct MPT3SAS_ADAPTER *ioc)
1126 return; 1124 return;
1127 1125
1128 list_for_each_entry(reply_q, &ioc->reply_queue_list, list) { 1126 list_for_each_entry(reply_q, &ioc->reply_queue_list, list) {
1129 if (ioc->shost_recovery) 1127 if (ioc->shost_recovery || ioc->remove_host ||
1128 ioc->pci_error_recovery)
1130 return; 1129 return;
1131 /* TMs are on msix_index == 0 */ 1130 /* TMs are on msix_index == 0 */
1132 if (reply_q->msix_index == 0) 1131 if (reply_q->msix_index == 0)
1133 continue; 1132 continue;
1134 _base_interrupt(reply_q->vector, (void *)reply_q); 1133 synchronize_irq(reply_q->vector);
1135 } 1134 }
1136} 1135}
1137 1136
diff --git a/drivers/scsi/mpt3sas/mpt3sas_base.h b/drivers/scsi/mpt3sas/mpt3sas_base.h
index 71b1c58fec3b..892c9be008b5 100644
--- a/drivers/scsi/mpt3sas/mpt3sas_base.h
+++ b/drivers/scsi/mpt3sas/mpt3sas_base.h
@@ -1236,7 +1236,8 @@ void *mpt3sas_base_get_msg_frame(struct MPT3SAS_ADAPTER *ioc, u16 smid);
1236void *mpt3sas_base_get_sense_buffer(struct MPT3SAS_ADAPTER *ioc, u16 smid); 1236void *mpt3sas_base_get_sense_buffer(struct MPT3SAS_ADAPTER *ioc, u16 smid);
1237__le32 mpt3sas_base_get_sense_buffer_dma(struct MPT3SAS_ADAPTER *ioc, 1237__le32 mpt3sas_base_get_sense_buffer_dma(struct MPT3SAS_ADAPTER *ioc,
1238 u16 smid); 1238 u16 smid);
1239void mpt3sas_base_flush_reply_queues(struct MPT3SAS_ADAPTER *ioc); 1239
1240void mpt3sas_base_sync_reply_irqs(struct MPT3SAS_ADAPTER *ioc);
1240 1241
1241/* hi-priority queue */ 1242/* hi-priority queue */
1242u16 mpt3sas_base_get_smid_hpr(struct MPT3SAS_ADAPTER *ioc, u8 cb_idx); 1243u16 mpt3sas_base_get_smid_hpr(struct MPT3SAS_ADAPTER *ioc, u8 cb_idx);
diff --git a/drivers/scsi/mpt3sas/mpt3sas_scsih.c b/drivers/scsi/mpt3sas/mpt3sas_scsih.c
index 7217218edbac..6a4df5a315e9 100644
--- a/drivers/scsi/mpt3sas/mpt3sas_scsih.c
+++ b/drivers/scsi/mpt3sas/mpt3sas_scsih.c
@@ -2124,7 +2124,6 @@ _scsih_tm_done(struct MPT3SAS_ADAPTER *ioc, u16 smid, u8 msix_index, u32 reply)
2124 return 1; 2124 return 1;
2125 if (ioc->tm_cmds.smid != smid) 2125 if (ioc->tm_cmds.smid != smid)
2126 return 1; 2126 return 1;
2127 mpt3sas_base_flush_reply_queues(ioc);
2128 ioc->tm_cmds.status |= MPT3_CMD_COMPLETE; 2127 ioc->tm_cmds.status |= MPT3_CMD_COMPLETE;
2129 mpi_reply = mpt3sas_base_get_reply_virt_addr(ioc, reply); 2128 mpi_reply = mpt3sas_base_get_reply_virt_addr(ioc, reply);
2130 if (mpi_reply) { 2129 if (mpi_reply) {
@@ -2309,6 +2308,9 @@ mpt3sas_scsih_issue_tm(struct MPT3SAS_ADAPTER *ioc, u16 handle, uint channel,
2309 } 2308 }
2310 } 2309 }
2311 2310
2311 /* sync IRQs in case those were busy during flush. */
2312 mpt3sas_base_sync_reply_irqs(ioc);
2313
2312 if (ioc->tm_cmds.status & MPT3_CMD_REPLY_VALID) { 2314 if (ioc->tm_cmds.status & MPT3_CMD_REPLY_VALID) {
2313 mpt3sas_trigger_master(ioc, MASTER_TRIGGER_TASK_MANAGMENT); 2315 mpt3sas_trigger_master(ioc, MASTER_TRIGGER_TASK_MANAGMENT);
2314 mpi_reply = ioc->tm_cmds.reply; 2316 mpi_reply = ioc->tm_cmds.reply;