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 |
