diff options
Diffstat (limited to 'drivers/scsi/mpt2sas/mpt2sas_base.c')
| -rw-r--r-- | drivers/scsi/mpt2sas/mpt2sas_base.c | 13 | 
1 files changed, 11 insertions, 2 deletions
diff --git a/drivers/scsi/mpt2sas/mpt2sas_base.c b/drivers/scsi/mpt2sas/mpt2sas_base.c index a11ac670104..9ead0399808 100644 --- a/drivers/scsi/mpt2sas/mpt2sas_base.c +++ b/drivers/scsi/mpt2sas/mpt2sas_base.c @@ -3941,6 +3941,8 @@ mpt2sas_base_detach(struct MPT2SAS_ADAPTER *ioc)  static void  _base_reset_handler(struct MPT2SAS_ADAPTER *ioc, int reset_phase)  { +	mpt2sas_scsih_reset_handler(ioc, reset_phase); +	mpt2sas_ctl_reset_handler(ioc, reset_phase);  	switch (reset_phase) {  	case MPT2_IOC_PRE_RESET:  		dtmprintk(ioc, printk(MPT2SAS_INFO_FMT "%s: " @@ -3971,8 +3973,6 @@ _base_reset_handler(struct MPT2SAS_ADAPTER *ioc, int reset_phase)  		    "MPT2_IOC_DONE_RESET\n", ioc->name, __func__));  		break;  	} -	mpt2sas_scsih_reset_handler(ioc, reset_phase); -	mpt2sas_ctl_reset_handler(ioc, reset_phase);  }  /** @@ -4026,6 +4026,7 @@ mpt2sas_base_hard_reset_handler(struct MPT2SAS_ADAPTER *ioc, int sleep_flag,  {  	int r;  	unsigned long flags; +	u8 pe_complete = ioc->wait_for_port_enable_to_complete;  	dtmprintk(ioc, printk(MPT2SAS_INFO_FMT "%s: enter\n", ioc->name,  	    __func__)); @@ -4068,6 +4069,14 @@ mpt2sas_base_hard_reset_handler(struct MPT2SAS_ADAPTER *ioc, int sleep_flag,  	if (r)  		goto out;  	_base_reset_handler(ioc, MPT2_IOC_AFTER_RESET); + +	/* If this hard reset is called while port enable is active, then +	 * there is no reason to call make_ioc_operational +	 */ +	if (pe_complete) { +		r = -EFAULT; +		goto out; +	}  	r = _base_make_ioc_operational(ioc, sleep_flag);  	if (!r)  		_base_reset_handler(ioc, MPT2_IOC_DONE_RESET);  |