|
@@ -155,7 +155,7 @@ _base_fault_reset_work(struct work_struct *work)
|
|
|
struct task_struct *p;
|
|
|
|
|
|
spin_lock_irqsave(&ioc->ioc_reset_in_progress_lock, flags);
|
|
|
- if (ioc->shost_recovery)
|
|
|
+ if (ioc->shost_recovery || ioc->pci_error_recovery)
|
|
|
goto rearm_timer;
|
|
|
spin_unlock_irqrestore(&ioc->ioc_reset_in_progress_lock, flags);
|
|
|
|
|
@@ -164,6 +164,20 @@ _base_fault_reset_work(struct work_struct *work)
|
|
|
printk(MPT2SAS_INFO_FMT "%s : SAS host is non-operational !!!!\n",
|
|
|
ioc->name, __func__);
|
|
|
|
|
|
+ /* It may be possible that EEH recovery can resolve some of
|
|
|
+ * pci bus failure issues rather removing the dead ioc function
|
|
|
+ * by considering controller is in a non-operational state. So
|
|
|
+ * here priority is given to the EEH recovery. If it doesn't
|
|
|
+ * not resolve this issue, mpt2sas driver will consider this
|
|
|
+ * controller to non-operational state and remove the dead ioc
|
|
|
+ * function.
|
|
|
+ */
|
|
|
+ if (ioc->non_operational_loop++ < 5) {
|
|
|
+ spin_lock_irqsave(&ioc->ioc_reset_in_progress_lock,
|
|
|
+ flags);
|
|
|
+ goto rearm_timer;
|
|
|
+ }
|
|
|
+
|
|
|
/*
|
|
|
* Call _scsih_flush_pending_cmds callback so that we flush all
|
|
|
* pending commands back to OS. This call is required to aovid
|
|
@@ -193,6 +207,8 @@ _base_fault_reset_work(struct work_struct *work)
|
|
|
return; /* don't rearm timer */
|
|
|
}
|
|
|
|
|
|
+ ioc->non_operational_loop = 0;
|
|
|
+
|
|
|
if ((doorbell & MPI2_IOC_STATE_MASK) == MPI2_IOC_STATE_FAULT) {
|
|
|
rc = mpt2sas_base_hard_reset_handler(ioc, CAN_SLEEP,
|
|
|
FORCE_BIG_HAMMER);
|
|
@@ -4386,6 +4402,7 @@ mpt2sas_base_attach(struct MPT2SAS_ADAPTER *ioc)
|
|
|
if (missing_delay[0] != -1 && missing_delay[1] != -1)
|
|
|
_base_update_missing_delay(ioc, missing_delay[0],
|
|
|
missing_delay[1]);
|
|
|
+ ioc->non_operational_loop = 0;
|
|
|
|
|
|
return 0;
|
|
|
|