diff options
author | Jesse Butler <jesse.butler@oracle.com> | 2010-08-12 14:52:21 -0600 |
---|---|---|
committer | Jesse Butler <jesse.butler@oracle.com> | 2010-08-12 14:52:21 -0600 |
commit | 827ab345d60a068feceedd00074fed206c7f154c (patch) | |
tree | 893e9ac91842e2fc6972917b260416ac12725890 /usr/src | |
parent | 0b2a8171b47dd85552e914b19eea8ce3c3c731ff (diff) | |
download | illumos-joyent-827ab345d60a068feceedd00074fed206c7f154c.tar.gz |
6973916 pmcs smp synchronization change causing livelocks
Diffstat (limited to 'usr/src')
-rw-r--r-- | usr/src/uts/common/io/scsi/adapters/pmcs/pmcs_scsa.c | 6 | ||||
-rw-r--r-- | usr/src/uts/common/io/scsi/adapters/pmcs/pmcs_subr.c | 18 |
2 files changed, 8 insertions, 16 deletions
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 789ba0be39..8843ea6b2d 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 @@ -1118,6 +1118,8 @@ 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__); @@ -1130,15 +1132,11 @@ 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 399e8b5cf4..36677fa4fe 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,6 +846,8 @@ 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__); @@ -859,12 +861,8 @@ 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) { @@ -4221,6 +4219,8 @@ again: 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_timed_out(pwp, htag, __func__); @@ -4231,13 +4231,9 @@ again: "%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); mutex_enter(&pwp->config_lock); if (pwp->config_changed) { @@ -4457,6 +4453,8 @@ 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_smp_release(iport); + pmcs_rele_iport(iport); pmcs_lock_phy(expander); if (result) { pmcs_prt(pwp, PMCS_PRT_DEBUG_CONFIG, pptr, NULL, @@ -4466,13 +4464,9 @@ pmcs_expander_content_discover(pmcs_hw_t *pwp, pmcs_phy_t *expander, "%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); mutex_enter(&pwp->config_lock); if (pwp->config_changed) { |