summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSreekanth Reddy <sreekanth.reddy@avagotech.com>2015-11-11 07:00:27 -0500
committerMartin K. Petersen <martin.petersen@oracle.com>2015-11-11 18:45:56 -0500
commit16e179bda58f0931854a669c9a70fd9139015899 (patch)
treea9b22e2d43f3d4e99d5d5866612069930ba54488
parent42081173c74e0867b996f5fd6b46d3c1606377c7 (diff)
mpt3sas: fix for driver fails EEH, recovery from injected pci bus error
This patch stops the driver to invoke kthread (which remove the dead ioc) for some time while EEH recovery has started. This patch is a port of commit b4730fb6e54a ("mpt2sas: fix for driver fails EEH, recovery from injected pci bus error")'. Signed-off-by: Sreekanth Reddy <Sreekanth.Reddy@avagotech.com> Acked-by: Christoph Hellwig <hch@lst.de> Reviewed-by: Hannes Reinecke <hare@suse.de> Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
-rw-r--r--drivers/scsi/mpt3sas/mpt3sas_base.c19
-rw-r--r--drivers/scsi/mpt3sas/mpt3sas_base.h1
2 files changed, 19 insertions, 1 deletions
diff --git a/drivers/scsi/mpt3sas/mpt3sas_base.c b/drivers/scsi/mpt3sas/mpt3sas_base.c
index 2b33e48eea90..b5b1eb260750 100644
--- a/drivers/scsi/mpt3sas/mpt3sas_base.c
+++ b/drivers/scsi/mpt3sas/mpt3sas_base.c
@@ -157,7 +157,7 @@ _base_fault_reset_work(struct work_struct *work)
157 157
158 158
159 spin_lock_irqsave(&ioc->ioc_reset_in_progress_lock, flags); 159 spin_lock_irqsave(&ioc->ioc_reset_in_progress_lock, flags);
160 if (ioc->shost_recovery) 160 if (ioc->shost_recovery || ioc->pci_error_recovery)
161 goto rearm_timer; 161 goto rearm_timer;
162 spin_unlock_irqrestore(&ioc->ioc_reset_in_progress_lock, flags); 162 spin_unlock_irqrestore(&ioc->ioc_reset_in_progress_lock, flags);
163 163
@@ -166,6 +166,20 @@ _base_fault_reset_work(struct work_struct *work)
166 pr_err(MPT3SAS_FMT "SAS host is non-operational !!!!\n", 166 pr_err(MPT3SAS_FMT "SAS host is non-operational !!!!\n",
167 ioc->name); 167 ioc->name);
168 168
169 /* It may be possible that EEH recovery can resolve some of
170 * pci bus failure issues rather removing the dead ioc function
171 * by considering controller is in a non-operational state. So
172 * here priority is given to the EEH recovery. If it doesn't
173 * not resolve this issue, mpt3sas driver will consider this
174 * controller to non-operational state and remove the dead ioc
175 * function.
176 */
177 if (ioc->non_operational_loop++ < 5) {
178 spin_lock_irqsave(&ioc->ioc_reset_in_progress_lock,
179 flags);
180 goto rearm_timer;
181 }
182
169 /* 183 /*
170 * Call _scsih_flush_pending_cmds callback so that we flush all 184 * Call _scsih_flush_pending_cmds callback so that we flush all
171 * pending commands back to OS. This call is required to aovid 185 * pending commands back to OS. This call is required to aovid
@@ -193,6 +207,8 @@ _base_fault_reset_work(struct work_struct *work)
193 return; /* don't rearm timer */ 207 return; /* don't rearm timer */
194 } 208 }
195 209
210 ioc->non_operational_loop = 0;
211
196 if ((doorbell & MPI2_IOC_STATE_MASK) != MPI2_IOC_STATE_OPERATIONAL) { 212 if ((doorbell & MPI2_IOC_STATE_MASK) != MPI2_IOC_STATE_OPERATIONAL) {
197 rc = mpt3sas_base_hard_reset_handler(ioc, CAN_SLEEP, 213 rc = mpt3sas_base_hard_reset_handler(ioc, CAN_SLEEP,
198 FORCE_BIG_HAMMER); 214 FORCE_BIG_HAMMER);
@@ -5162,6 +5178,7 @@ mpt3sas_base_attach(struct MPT3SAS_ADAPTER *ioc)
5162 if (r) 5178 if (r)
5163 goto out_free_resources; 5179 goto out_free_resources;
5164 5180
5181 ioc->non_operational_loop = 0;
5165 return 0; 5182 return 0;
5166 5183
5167 out_free_resources: 5184 out_free_resources:
diff --git a/drivers/scsi/mpt3sas/mpt3sas_base.h b/drivers/scsi/mpt3sas/mpt3sas_base.h
index 08f46a7bb00c..a0d1f1304b44 100644
--- a/drivers/scsi/mpt3sas/mpt3sas_base.h
+++ b/drivers/scsi/mpt3sas/mpt3sas_base.h
@@ -845,6 +845,7 @@ struct MPT3SAS_ADAPTER {
845 u16 cpu_msix_table_sz; 845 u16 cpu_msix_table_sz;
846 u32 ioc_reset_count; 846 u32 ioc_reset_count;
847 MPT3SAS_FLUSH_RUNNING_CMDS schedule_dead_ioc_flush_running_cmds; 847 MPT3SAS_FLUSH_RUNNING_CMDS schedule_dead_ioc_flush_running_cmds;
848 u32 non_operational_loop;
848 849
849 /* internal commands, callback index */ 850 /* internal commands, callback index */
850 u8 scsi_io_cb_idx; 851 u8 scsi_io_cb_idx;