diff options
Diffstat (limited to 'drivers/scsi/mpt2sas/mpt2sas_base.c')
| -rw-r--r-- | drivers/scsi/mpt2sas/mpt2sas_base.c | 27 | 
1 files changed, 26 insertions, 1 deletions
diff --git a/drivers/scsi/mpt2sas/mpt2sas_base.c b/drivers/scsi/mpt2sas/mpt2sas_base.c index ffd85c511c8..bcb23d28b3e 100644 --- a/drivers/scsi/mpt2sas/mpt2sas_base.c +++ b/drivers/scsi/mpt2sas/mpt2sas_base.c @@ -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); @@ -2007,6 +2023,14 @@ _base_display_intel_branding(struct MPT2SAS_ADAPTER *ioc)  			printk(MPT2SAS_INFO_FMT "%s\n", ioc->name,  			    MPT2SAS_INTEL_RMS25KB040_BRANDING);  			break; +		case MPT2SAS_INTEL_RMS25LB040_SSDID: +			printk(MPT2SAS_INFO_FMT "%s\n", ioc->name, +			    MPT2SAS_INTEL_RMS25LB040_BRANDING); +			break; +		case MPT2SAS_INTEL_RMS25LB080_SSDID: +			printk(MPT2SAS_INFO_FMT "%s\n", ioc->name, +			    MPT2SAS_INTEL_RMS25LB080_BRANDING); +			break;  		default:  			break;  		} @@ -4386,6 +4410,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;  |