diff options
Diffstat (limited to 'usr/src')
| -rw-r--r-- | usr/src/uts/common/io/scsi/adapters/pmcs/pmcs_ds.c | 16 | ||||
| -rw-r--r-- | usr/src/uts/common/io/scsi/adapters/pmcs/pmcs_scsa.c | 7 | ||||
| -rw-r--r-- | usr/src/uts/common/io/scsi/adapters/pmcs/pmcs_subr.c | 71 | 
3 files changed, 49 insertions, 45 deletions
| diff --git a/usr/src/uts/common/io/scsi/adapters/pmcs/pmcs_ds.c b/usr/src/uts/common/io/scsi/adapters/pmcs/pmcs_ds.c index 998159524e..e4447752f2 100644 --- a/usr/src/uts/common/io/scsi/adapters/pmcs/pmcs_ds.c +++ b/usr/src/uts/common/io/scsi/adapters/pmcs/pmcs_ds.c @@ -599,7 +599,7 @@ no_action:   * it involves sending multiple commands to device and we should not do it   * in the interrupt context.   * If it is failure of a recovery command, let the recovery thread deal with it. - * Called with pmcwork lock held. + * Called with the work lock held.   */  void  pmcs_start_ssp_event_recovery(pmcs_hw_t *pwp, pmcwork_t *pwrk, uint32_t *iomb, @@ -642,7 +642,10 @@ pmcs_start_ssp_event_recovery(pmcs_hw_t *pwp, pmcwork_t *pwrk, uint32_t *iomb,  		RESTART_DISCOVERY(pwp);  		return;  	} else { +		/* We have a phy pointer, we'll need to lock it */ +		mutex_exit(&pwrk->lock);  		pmcs_lock_phy(pptr); +		mutex_enter(&pwrk->lock);  		if (tgt != NULL) {  			mutex_enter(&tgt->statlock);  		} @@ -659,8 +662,8 @@ pmcs_start_ssp_event_recovery(pmcs_hw_t *pwp, pmcwork_t *pwrk, uint32_t *iomb,  			if (tgt != NULL) {  				mutex_exit(&tgt->statlock);  			} -			pmcs_unlock_phy(pptr);  			mutex_exit(&pwrk->lock); +			pmcs_unlock_phy(pptr);  			SCHEDULE_WORK(pwp, PMCS_WORK_ABORT_HANDLE);  			RESTART_DISCOVERY(pwp);  			return; @@ -681,8 +684,8 @@ pmcs_start_ssp_event_recovery(pmcs_hw_t *pwp, pmcwork_t *pwrk, uint32_t *iomb,  			if (tgt != NULL) {  				mutex_exit(&tgt->statlock);  			} +			mutex_exit(&pwrk->lock);  			pmcs_unlock_phy(pptr); -			mutex_exit(&pwrk->lock); /* XXX: Is this right??? */  			return;  		} @@ -691,6 +694,8 @@ pmcs_start_ssp_event_recovery(pmcs_hw_t *pwp, pmcwork_t *pwrk, uint32_t *iomb,  			    "%s: Not scheduling SSP event recovery for NULL tgt"  			    " pwrk(%p) tag(0x%x)", __func__, (void *)pwrk,  			    pwrk->htag); +			mutex_exit(&pwrk->lock); +			pmcs_unlock_phy(pptr);  			return;  		} @@ -706,6 +711,7 @@ pmcs_start_ssp_event_recovery(pmcs_hw_t *pwp, pmcwork_t *pwrk, uint32_t *iomb,  			    __func__, pwrk->htag);  			mutex_exit(&tgt->statlock); +			/* Note: work remains locked for the callback */  			pmcs_unlock_phy(pptr);  			pwrk->ssp_event = event;  			callback = (pmcs_cb_t)pwrk->ptr; @@ -719,13 +725,13 @@ pmcs_start_ssp_event_recovery(pmcs_hw_t *pwp, pmcwork_t *pwrk, uint32_t *iomb,  		 */  		tgt->event_recovery = 1;  		mutex_exit(&tgt->statlock); -		pmcs_unlock_phy(pptr);  		pwrk->ssp_event = event; +		mutex_exit(&pwrk->lock); +		pmcs_unlock_phy(pptr);  		pmcs_prt(pwp, PMCS_PRT_DEBUG, pptr, tgt,  		    "%s: Scheduling SSP event recovery for tgt(0x%p) "  		    "pwrk(%p) tag(0x%x)", __func__, (void *)tgt, (void *)pwrk,  		    pwrk->htag); -		mutex_exit(&pwrk->lock);  		SCHEDULE_WORK(pwp, PMCS_WORK_SSP_EVT_RECOVERY);  	} diff --git a/usr/src/uts/common/io/scsi/adapters/pmcs/pmcs_scsa.c b/usr/src/uts/common/io/scsi/adapters/pmcs/pmcs_scsa.c index 7b10179b82..75053888d2 100644 --- a/usr/src/uts/common/io/scsi/adapters/pmcs/pmcs_scsa.c +++ b/usr/src/uts/common/io/scsi/adapters/pmcs/pmcs_scsa.c @@ -1120,10 +1120,7 @@ pmcs_smp_start(struct smp_pkt *smp_pkt)  	pmcs_unlock_phy(pptr);  	WAIT_FOR(pwrk, smp_pkt->smp_pkt_timeout * 1000, result);  	pmcs_pwork(pwp, pwrk); -	pmcs_smp_release(iport); -	pmcs_rele_iport(iport);  	pmcs_lock_phy(pptr); -  	if (result) {  		pmcs_timed_out(pwp, htag, __func__);  		if (pmcs_abort(pwp, pptr, htag, 0, 0)) { @@ -1135,11 +1132,15 @@ pmcs_smp_start(struct smp_pkt *smp_pkt)  			    "%s: Issuing SMP ABORT for htag 0x%08x",  			    __func__, htag);  		} +		pmcs_smp_release(iport); +		pmcs_rele_iport(iport);  		pmcs_unlock_phy(pptr);  		pmcs_release_scratch(pwp);  		smp_pkt->smp_pkt_reason = ETIMEDOUT;  		return (DDI_FAILURE);  	} +	pmcs_smp_release(iport); +	pmcs_rele_iport(iport);  	status = LE_32(msg[2]);  	if (status == PMCOUT_STATUS_OVERFLOW) {  		status = PMCOUT_STATUS_OK; diff --git a/usr/src/uts/common/io/scsi/adapters/pmcs/pmcs_subr.c b/usr/src/uts/common/io/scsi/adapters/pmcs/pmcs_subr.c index 01458b0874..c8ff35abe7 100644 --- a/usr/src/uts/common/io/scsi/adapters/pmcs/pmcs_subr.c +++ b/usr/src/uts/common/io/scsi/adapters/pmcs/pmcs_subr.c @@ -846,10 +846,7 @@ pmcs_reset_phy(pmcs_hw_t *pwp, pmcs_phy_t *pptr, uint8_t type)  	pmcs_unlock_phy(pptr);  	WAIT_FOR(pwrk, 1000, result);  	pmcs_pwork(pwp, pwrk); -	pmcs_smp_release(iport); -	pmcs_rele_iport(iport);  	pmcs_lock_phy(pptr); -  	if (result) {  		pmcs_prt(pwp, PMCS_PRT_DEBUG, pptr, NULL, pmcs_timeo, __func__); @@ -862,8 +859,12 @@ pmcs_reset_phy(pmcs_hw_t *pwp, pmcs_phy_t *pptr, uint8_t type)  			    "%s: Issuing SMP ABORT for htag 0x%08x",  			    __func__, htag);  		} +		pmcs_smp_release(iport); +		pmcs_rele_iport(iport);  		return (EIO);  	} +	pmcs_smp_release(iport); +	pmcs_rele_iport(iport);  	status = LE_32(iomb[stsoff]);  	if (status != PMCOUT_STATUS_OK) { @@ -4218,10 +4219,23 @@ again:  	pmcs_unlock_phy(pptr);  	WAIT_FOR(pwrk, 1000, result);  	pmcs_pwork(pwp, pwrk); +	pmcs_lock_phy(pptr); +	if (result) { +		pmcs_timed_out(pwp, htag, __func__); +		pmcs_prt(pwp, PMCS_PRT_DEBUG_CONFIG, pptr, NULL, +		    "%s: Issuing SMP ABORT for htag 0x%08x", __func__, htag); +		if (pmcs_abort(pwp, pptr, htag, 0, 1)) { +			pmcs_prt(pwp, PMCS_PRT_DEBUG_CONFIG, pptr, NULL, +			    "%s: SMP ABORT failed for cmd (htag 0x%08x)", +			    __func__, htag); +		} +		pmcs_smp_release(iport); +		pmcs_rele_iport(iport); +		result = 0; +		goto out; +	}  	pmcs_smp_release(iport);  	pmcs_rele_iport(iport); -	pmcs_lock_phy(pptr); -  	mutex_enter(&pwp->config_lock);  	if (pwp->config_changed) { @@ -4232,22 +4246,6 @@ again:  	}  	mutex_exit(&pwp->config_lock); -	if (result) { -		pmcs_timed_out(pwp, htag, __func__); -		pmcs_prt(pwp, PMCS_PRT_DEBUG_CONFIG, pptr, NULL, -		    "%s: Issuing SMP ABORT for htag 0x%08x", __func__, htag); -		if (pmcs_abort(pwp, pptr, htag, 0, 0)) { -			pmcs_prt(pwp, PMCS_PRT_DEBUG_CONFIG, pptr, NULL, -			    "%s: Unable to issue SMP ABORT for htag 0x%08x", -			    __func__, htag); -		} else { -			pmcs_prt(pwp, PMCS_PRT_DEBUG_CONFIG, pptr, NULL, -			    "%s: Issuing SMP ABORT for htag 0x%08x", -			    __func__, htag); -		} -		result = 0; -		goto out; -	}  	ptr = (void *)pwp->scratch;  	status = LE_32(ptr[2]);  	if (status == PMCOUT_STATUS_UNDERFLOW || @@ -4457,9 +4455,22 @@ pmcs_expander_content_discover(pmcs_hw_t *pwp, pmcs_phy_t *expander,  	pmcs_unlock_phy(expander);  	WAIT_FOR(pwrk, 1000, result);  	pmcs_pwork(pwp, pwrk); +	pmcs_lock_phy(expander); +	if (result) { +		pmcs_prt(pwp, PMCS_PRT_DEBUG_CONFIG, pptr, NULL, +		    "%s: Issuing SMP ABORT for htag 0x%08x", __func__, htag); +		if (pmcs_abort(pwp, pptr, htag, 0, 1)) { +			pmcs_prt(pwp, PMCS_PRT_DEBUG_CONFIG, pptr, NULL, +			    "%s: SMP ABORT failed for cmd (htag 0x%08x)", +			    __func__, htag); +		} +		pmcs_smp_release(iport); +		pmcs_rele_iport(iport); +		result = -ETIMEDOUT; +		goto out; +	}  	pmcs_smp_release(iport);  	pmcs_rele_iport(iport); -	pmcs_lock_phy(expander);  	mutex_enter(&pwp->config_lock);  	if (pwp->config_changed) { @@ -4468,22 +4479,8 @@ pmcs_expander_content_discover(pmcs_hw_t *pwp, pmcs_phy_t *expander,  		result = 0;  		goto out;  	} -	mutex_exit(&pwp->config_lock); -	if (result) { -		pmcs_prt(pwp, PMCS_PRT_DEBUG, pptr, NULL, pmcs_timeo, __func__); -		if (pmcs_abort(pwp, expander, htag, 0, 0)) { -			pmcs_prt(pwp, PMCS_PRT_DEBUG_CONFIG, pptr, NULL, -			    "%s: Unable to issue SMP ABORT for htag 0x%08x", -			    __func__, htag); -		} else { -			pmcs_prt(pwp, PMCS_PRT_DEBUG_CONFIG, pptr, NULL, -			    "%s: Issuing SMP ABORT for htag 0x%08x", -			    __func__, htag); -		} -		result = -ETIMEDOUT; -		goto out; -	} +	mutex_exit(&pwp->config_lock);  	ptr = (void *)pwp->scratch;  	/*  	 * Point roff to the DMA offset for returned data | 
