Date: Wed, 18 Oct 2006 20:30:12 GMT From: Matt Jacob <mjacob@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 108066 for review Message-ID: <200610182030.k9IKUC9N000542@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=108066 Change 108066 by mjacob@newisp on 2006/10/18 20:29:41 ISR reads should have the semaphore and mailbox pointers as pointers to 16 bit quantities- not 32 bit quantities. Put in PTISP stuff again, but conditionalized on a tag set in sdparam by the outerlayer. *Don't* call isp_intr from isp_start except for ZIO capable cards (23XX/24XX). When getting interrupted when not ready, only disable ints for the 24XX. This needs a better solution, really. Make isp_parse_status/isp_parse_status_24xx take a pointer to a residual so we can do things like setting the residual to the xfer count for things like selection timeout instead of getting some completely bogus value from the status IOCB. Affected files ... .. //depot/projects/newisp/dev/isp/isp.c#17 edit Differences ... ==== //depot/projects/newisp/dev/isp/isp.c#17 (text+ko) ==== @@ -100,9 +100,9 @@ static int isp_handle_other_response(ispsoftc_t *, int, isphdr_t *, uint32_t *); static void -isp_parse_status(ispsoftc_t *, ispstatusreq_t *, XS_T *); +isp_parse_status(ispsoftc_t *, ispstatusreq_t *, XS_T *, long *); static void -isp_parse_status_24xx(ispsoftc_t *, isp24xx_statusreq_t *, XS_T *); +isp_parse_status_24xx(ispsoftc_t *, isp24xx_statusreq_t *, XS_T *, long *); static void isp_fastpost_complete(ispsoftc_t *, uint16_t); static int isp_mbox_continue(ispsoftc_t *); static void isp_scsi_init(ispsoftc_t *); @@ -638,7 +638,22 @@ ISP_SETBITS(isp, CDMA_CONF, DMA_ENABLE_BURST); ISP_SETBITS(isp, DDMA_CONF, DMA_ENABLE_BURST); } - ISP_WRITE(isp, RISC_MTR, 0x1212); + if (SDPARAM(isp)->isp_ptisp) { + if (SDPARAM(isp)->isp_ultramode) { + while (ISP_READ(isp, RISC_MTR) != 0x1313) { + ISP_WRITE(isp, RISC_MTR, 0x1313); + ISP_WRITE(isp, HCCR, HCCR_CMD_STEP); + } + } else { + ISP_WRITE(isp, RISC_MTR, 0x1212); + } + /* + * PTI specific register + */ + ISP_WRITE(isp, RISC_EMB, DUAL_BANK); + } else { + ISP_WRITE(isp, RISC_MTR, 0x1212); + } ISP_WRITE(isp, HCCR, HCCR_CMD_RELEASE); } else { ISP_WRITE(isp, RISC_MTR2100, 0x1212); @@ -3869,7 +3884,8 @@ isp_start(XS_T *xs) { ispsoftc_t *isp; - uint32_t nxti, optr, handle, isr, sema, mbox; + uint32_t nxti, optr, handle, isr; + uint16_t sema, mbox; uint8_t local[QENTRY_LEN]; ispreq_t *reqp, *qep; void *cdbp; @@ -3981,6 +3997,7 @@ MEMZERO(m, QENTRY_LEN); m->mrk_header.rqs_entry_count = 1; m->mrk_header.rqs_entry_type = RQSTYPE_MARKER; + m->mrk_target = (i << 7); /* bus # */ m->mrk_modifier = SYNC_ALL; isp_put_marker(isp, m, (isp_marker_t *) qep); ISP_ADD_REQUEST(isp, nxti); @@ -4125,8 +4142,10 @@ (long) XS_XFRLEN(xs)); ISP_ADD_REQUEST(isp, nxti); isp->isp_nactive++; - if (ISP_READ_ISR(isp, &isr, &sema, &mbox)) { - isp_intr(isp, isr, sema, mbox); + if (IS_23XX(isp) || IS_24XX(isp)) { + if (ISP_READ_ISR(isp, &isr, &sema, &mbox)) { + isp_intr(isp, isr, sema, mbox); + } } return (CMD_QUEUED); } @@ -4157,8 +4176,7 @@ */ mbs.param[0] = MBOX_BUS_RESET; if (IS_SCSI(isp)) { - mbs.param[1] = - ((sdparam *) isp->isp_param)->isp_bus_reset_delay; + mbs.param[1] = SDPARAM(isp)->isp_bus_reset_delay; if (mbs.param[1] < 2) { mbs.param[1] = 2; } @@ -4345,7 +4363,7 @@ #endif void -isp_intr(ispsoftc_t *isp, uint32_t isr, uint32_t sema, uint16_t mbox) +isp_intr(ispsoftc_t *isp, uint32_t isr, uint16_t sema, uint16_t mbox) { XS_T *complist[MAX_REQUESTQ_COMPLETIONS], *xs; uint32_t iptr, optr, junk; @@ -4402,7 +4420,9 @@ */ ISP_WRITE(isp, isp->isp_respoutrp, ISP_READ(isp, isp->isp_respinrp)); - ISP_DISABLE_INTS(isp); + if (IS_24XX(isp)) { + ISP_DISABLE_INTS(isp); + } goto out; } @@ -4718,9 +4738,9 @@ XS_SET_STATE_STAT(isp, xs, sp); if (IS_24XX(isp)) { isp_parse_status_24xx(isp, - (isp24xx_statusreq_t *)sp, xs); + (isp24xx_statusreq_t *)sp, xs, &resid); } else { - isp_parse_status(isp, (void *)sp, xs); + isp_parse_status(isp, (void *)sp, xs, &resid); } if ((XS_NOERR(xs) || XS_ERR(xs) == HBA_NOERROR) && (*XS_STSP(xs) == SCSI_BUSY)) { @@ -5318,7 +5338,7 @@ } static void -isp_parse_status(ispsoftc_t *isp, ispstatusreq_t *sp, XS_T *xs) +isp_parse_status(ispsoftc_t *isp, ispstatusreq_t *sp, XS_T *xs, long *rp) { switch (sp->req_completion_status & 0xff) { case RQCS_COMPLETE: @@ -5334,6 +5354,7 @@ XS_CHANNEL(xs), XS_TGT(xs), XS_LUN(xs)); if (XS_NOERR(xs)) { XS_SETERR(xs, HBA_SELTIMEOUT); + *rp = XS_XFRLEN(xs); } return; } @@ -5346,6 +5367,7 @@ case RQCS_DMA_ERROR: isp_prt(isp, ISP_LOGERR, "DMA error for command on %d.%d.%d", XS_CHANNEL(xs), XS_TGT(xs), XS_LUN(xs)); + *rp = XS_XFRLEN(xs); break; case RQCS_TRANSPORT_ERROR: @@ -5401,6 +5423,7 @@ isp_prt(isp, ISP_LOGERR, "%s", buf); isp_prt(isp, ISP_LOGERR, "transport error for %d.%d.%d:\n%s", XS_CHANNEL(xs), XS_TGT(xs), XS_LUN(xs), buf); + *rp = XS_XFRLEN(xs); break; } case RQCS_RESET_OCCURRED: @@ -5411,6 +5434,7 @@ if (XS_NOERR(xs)) { XS_SETERR(xs, HBA_BUSRESET); } + *rp = XS_XFRLEN(xs); return; case RQCS_ABORTED: @@ -5705,7 +5729,8 @@ } static void -isp_parse_status_24xx(ispsoftc_t *isp, isp24xx_statusreq_t *sp, XS_T *xs) +isp_parse_status_24xx(ispsoftc_t *isp, isp24xx_statusreq_t *sp, + XS_T *xs, long *rp) { switch (sp->req_completion_status) { case RQCS_COMPLETE: @@ -5766,6 +5791,7 @@ if (XS_NOERR(xs)) { XS_SETERR(xs, HBA_ABORTED); } + *rp = XS_XFRLEN(xs); return; case RQCS_24XX_TABORT: /* aborted by target */
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200610182030.k9IKUC9N000542>