Mercurial > illumos > illumos-gate
changeset 13017:f651e899cbc9
6974282 pkt can get completed before timer gets set
author | Srikanth Suravajhala <srikanth.suravajhala@oracle.com> |
---|---|
date | Tue, 03 Aug 2010 15:54:52 -0700 |
parents | a45d99fb2e9b |
children | 22e6d3edaab5 |
files | usr/src/uts/common/io/scsi/adapters/pmcs/pmcs_scsa.c usr/src/uts/common/io/scsi/adapters/pmcs/pmcs_subr.c |
diffstat | 2 files changed, 19 insertions(+), 8 deletions(-) [+] |
line wrap: on
line diff
--- a/usr/src/uts/common/io/scsi/adapters/pmcs/pmcs_scsa.c Tue Aug 03 16:44:54 2010 -0600 +++ b/usr/src/uts/common/io/scsi/adapters/pmcs/pmcs_scsa.c Tue Aug 03 15:54:52 2010 -0700 @@ -1846,8 +1846,9 @@ pmcs_hw_t *pwp = CMD2PMC(sp); struct scsi_pkt *pkt = CMD2PKT(sp); pmcs_xscsi_t *xp = pwrk->xp; - uint32_t iq, *ptr; + uint32_t iq, lhtag, *ptr; sas_ssp_cmd_iu_t sc; + int sp_pkt_time = 0; ASSERT(xp != NULL); mutex_enter(&xp->statlock); @@ -1961,6 +1962,7 @@ min(SCSA_CDBLEN(sp), sizeof (sc.cdb))); (void) memcpy(&ptr[5], &sc, sizeof (sas_ssp_cmd_iu_t)); pwrk->state = PMCS_WORK_STATE_ONCHIP; + lhtag = pwrk->htag; mutex_exit(&pwrk->lock); pmcs_prt(pwp, PMCS_PRT_DEBUG2, NULL, NULL, "%s: giving pkt %p (tag %x) to the hardware", __func__, @@ -1971,11 +1973,14 @@ mutex_enter(&xp->aqlock); STAILQ_INSERT_TAIL(&xp->aq, sp, cmd_next); mutex_exit(&xp->aqlock); + sp_pkt_time = CMD2PKT(sp)->pkt_time; INC_IQ_ENTRY(pwp, iq); mutex_enter(&pwrk->lock); - pwrk->timer = US2WT(CMD2PKT(sp)->pkt_time * 1000000); - if (pwrk->timer == 0) { - pwrk->timer = US2WT(1000000); + if (lhtag == pwrk->htag) { + pwrk->timer = US2WT(sp_pkt_time * 1000000); + if (pwrk->timer == 0) { + pwrk->timer = US2WT(1000000); + } } mutex_exit(&pwrk->lock); @@ -2357,10 +2362,11 @@ struct scsi_pkt *pkt = CMD2PKT(sp); pmcs_xscsi_t *xp; uint8_t cdb_base, asc, tag; - uint32_t *ptr, iq, nblk, i, mtype; + uint32_t *ptr, lhtag, iq, nblk, i, mtype; fis_t fis; size_t amt; uint64_t lba; + int sp_pkt_time = 0; xp = pwrk->xp; ASSERT(xp != NULL); @@ -2572,6 +2578,7 @@ } pwrk->state = PMCS_WORK_STATE_ONCHIP; + lhtag = pwrk->htag; mutex_exit(&pwrk->lock); xp->tagmap |= (1 << tag); xp->actv_cnt++; @@ -2589,11 +2596,14 @@ #ifdef DEBUG pmcs_print_entry(pwp, PMCS_PRT_DEBUG3, "SATA INI Message", ptr); #endif + sp_pkt_time = CMD2PKT(sp)->pkt_time; INC_IQ_ENTRY(pwp, iq); mutex_enter(&pwrk->lock); - pwrk->timer = US2WT(CMD2PKT(sp)->pkt_time * 1000000); - if (pwrk->timer == 0) { - pwrk->timer = US2WT(1000000); + if (lhtag == pwrk->htag) { + pwrk->timer = US2WT(sp_pkt_time * 1000000); + if (pwrk->timer == 0) { + pwrk->timer = US2WT(1000000); + } } mutex_exit(&pwrk->lock);
--- a/usr/src/uts/common/io/scsi/adapters/pmcs/pmcs_subr.c Tue Aug 03 16:44:54 2010 -0600 +++ b/usr/src/uts/common/io/scsi/adapters/pmcs/pmcs_subr.c Tue Aug 03 15:54:52 2010 -0700 @@ -4761,6 +4761,7 @@ p->state = PMCS_WORK_STATE_READY; p->ssp_event = 0; p->dead = 0; + p->timer = 0; if (phyp) { p->phy = phyp;