Skip site navigation (1)Skip section navigation (2)
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>