summaryrefslogtreecommitdiff
path: root/usr/src
diff options
context:
space:
mode:
authorJesse Butler <jesse.butler@oracle.com>2010-08-12 14:52:21 -0600
committerJesse Butler <jesse.butler@oracle.com>2010-08-12 14:52:21 -0600
commit827ab345d60a068feceedd00074fed206c7f154c (patch)
tree893e9ac91842e2fc6972917b260416ac12725890 /usr/src
parent0b2a8171b47dd85552e914b19eea8ce3c3c731ff (diff)
downloadillumos-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.c6
-rw-r--r--usr/src/uts/common/io/scsi/adapters/pmcs/pmcs_subr.c18
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) {