Apply by doing
	cd /sys
	patch -p0 < esp.patch

Index: arch/sparc/dev/dma.c
===================================================================
RCS file: /cvs/src/sys/arch/sparc/dev/dma.c,v
retrieving revision 1.9
diff -u -r1.9 dma.c
--- dma.c	1997/09/17 06:47:08	1.9
+++ dma.c	1998/02/05 19:06:36
@@ -1,4 +1,4 @@
-/*	$OpenBSD: dma.c,v 1.9 1997/09/17 06:47:08 downsj Exp $	*/
+/*	$OpenBSD: dma.c,v 1.11 1998/02/05 19:02:30 jason Exp $	*/
 /*	$NetBSD: dma.c,v 1.46 1997/08/27 11:24:16 bouyer Exp $ */
 
 /*
@@ -307,13 +307,27 @@
 	DMAWAIT(sc, sc->sc_regs->csr & D_DRAINING, "DRAINING", dontpanic);\
 } while(0)
 
+#define DMA_FLUSH(sc, dontpanic) do {					\
+	int csr;							\
+	/*								\
+	 * DMA rev0 & rev1: we are not allowed to touch the DMA "flush"	\
+	 *     and "drain" bits while it is still thinking about a	\
+	 *     request.							\
+	 * other revs: D_R_PEND bit reads as 0				\
+	 */								\
+	DMAWAIT(sc, sc->sc_regs->csr & D_R_PEND, "R_PEND", dontpanic);	\
+	csr = DMACSR(sc);						\
+	csr &= ~(D_WRITE|D_EN_DMA);					\
+	csr |= D_INVALIDATE;						\
+	DMACSR(sc) = csr;						\
+} while(0)
+
 void
 dma_reset(sc, isledma)
 	struct dma_softc *sc;
 	int isledma;
 {
-	DMA_DRAIN(sc, 1);
-	DMACSR(sc) &= ~D_EN_DMA;		/* Stop DMA */
+	DMA_FLUSH(sc, 1);
 	DMACSR(sc) |= D_RESET;			/* reset DMA */
 	DELAY(200);				/* what should this be ? */
 	/*DMAWAIT1(sc); why was this here? */
@@ -390,7 +404,7 @@
 {
 	u_long csr;
 
-	DMA_DRAIN(sc, 0);
+	DMA_FLUSH(sc, 0);
 
 #if 0
 	DMACSR(sc) &= ~D_INT_EN;
Index: arch/sparc/fpu/fpu.c
===================================================================
RCS file: /cvs/src/sys/arch/sparc/fpu/fpu.c,v
retrieving revision 1.7
diff -u -r1.7 fpu.c
--- fpu.c	1997/08/08 08:25:46	1.7
+++ fpu.c	1998/02/05 19:06:37
@@ -1,4 +1,4 @@
-/*	$OpenBSD: fpu.c,v 1.7 1997/08/08 08:25:46 downsj Exp $	*/
+/*	$OpenBSD: fpu.c,v 1.8 1998/01/13 22:54:36 jason Exp $	*/
 /*	$NetBSD: fpu.c,v 1.6 1997/07/29 10:09:51 fair Exp $	*/
 
 /*
@@ -117,7 +117,14 @@
 	switch ((fsr >> FSR_FTT_SHIFT) & FSR_FTT_MASK) {
 
 	case FSR_TT_NONE:
-		panic("fpu_cleanup 1");	/* ??? */
+#if 0
+		/* XXX I'm not sure how we get here, but ignoring the trap */
+		/* XXX seems to work in my limited tests		   */
+		/* XXX More research to be done =)			   */
+		panic("fpu_cleanup 1"); /* ??? */
+#else
+		printf("fpu_cleanup 1\n");
+#endif
 		break;
 
 	case FSR_TT_IEEE:
Index: arch/sparc/sparc/memreg.c
===================================================================
RCS file: /cvs/src/sys/arch/sparc/sparc/memreg.c,v
retrieving revision 1.5
diff -u -r1.5 memreg.c
--- memreg.c	1997/08/08 08:27:32	1.5
+++ memreg.c	1998/02/05 19:06:38
@@ -1,4 +1,4 @@
-/*	$OpenBSD: memreg.c,v 1.5 1997/08/08 08:27:32 downsj Exp $	*/
+/*	$OpenBSD: memreg.c,v 1.7 1997/11/11 10:53:12 niklas Exp $	*/
 /*	$NetBSD: memreg.c,v 1.21 1997/07/29 09:42:08 fair Exp $ */
 
 /*
@@ -62,8 +62,8 @@
 #include <machine/reg.h>	/* for trapframe */
 #include <machine/trap.h>	/* for trap types */
 
-static int memregmatch __P((struct device *, void *, void *));
-static void memregattach __P((struct device *, struct device *, void *));
+int memregmatch __P((struct device *, void *, void *));
+void memregattach __P((struct device *, struct device *, void *));
 
 struct cfattach memreg_ca = {
 	sizeof(struct device), memregmatch, memregattach
@@ -75,31 +75,31 @@
 
 void memerr __P((int, u_int, u_int, u_int, u_int));
 #if defined(SUN4M)
-static void hardmemerr4m __P((int, u_int, u_int));
+void hardmemerr4m __P((int, u_int, u_int));
 #endif
 
 /*
  * The OPENPROM calls this "memory-error".
  */
-static int
+int
 memregmatch(parent, vcf, aux)
 	struct device *parent;
 	void *vcf, *aux;
 {
-	register struct cfdata *cf;
+	register struct cfdata *cf = vcf;
 	register struct confargs *ca = aux;
 
 	if (CPU_ISSUN4) {
 		if (ca->ca_bustype == BUS_OBIO)
 			return (strcmp(cf->cf_driver->cd_name,
-				       ca->ca_ra.ra_name) == 0);
+			    ca->ca_ra.ra_name) == 0);
 		return (0);
 	}
 	return (strcmp("memory-error", ca->ca_ra.ra_name) == 0);
 }
 
 /* ARGSUSED */
-static void
+void
 memregattach(parent, self, aux)
 	struct device *parent, *self;
 	void *aux;
@@ -188,7 +188,7 @@
  * of the error register are printed.
  */
 
-static void
+void
 hardmemerr4m(issync, fsr, faddr)
 	int issync;
 	u_int fsr, faddr;
@@ -224,8 +224,8 @@
  * once, and then fail if we get called again.
  */
 
-static int addrold = (int) 0xdeadbeef; /* We pick an unlikely address */
-static int addroldtop = (int) 0xdeadbeef;
+static int addrold = (int)0xdeadbeef; /* We pick an unlikely address */
+static int addroldtop = (int)0xdeadbeef;
 static int oldtype = -1;
 
 void
Index: dev/ic/ncr53c9x.c
===================================================================
RCS file: /cvs/src/sys/dev/ic/ncr53c9x.c,v
retrieving revision 1.2
diff -u -r1.2 ncr53c9x.c
--- ncr53c9x.c	1997/08/08 08:13:05	1.2
+++ ncr53c9x.c	1998/02/05 19:06:58
@@ -1,5 +1,5 @@
-/*	$OpenBSD: ncr53c9x.c,v 1.2 1997/08/08 08:13:05 downsj Exp $	*/
-/*	$NetBSD: ncr53c9x.c,v 1.16 1997/07/30 12:01:53 pk Exp $	*/
+/*	$OpenBSD: ncr53c9x.c,v 1.3 1998/02/03 22:02:46 jason Exp $	*/
+/*	$NetBSD: ncr53c9x.c,v 1.22 1998/01/24 15:33:35 pk Exp $	*/
 
 /*
  * Copyright (c) 1996 Charles M. Hannum.  All rights reserved.
@@ -134,6 +134,7 @@
 	"NCR53C96",
 	"ESP406",
 	"FAS408",
+	"FAS216",
 };
 
 /*
@@ -238,6 +239,7 @@
 	case NCR_VARIANT_ESP406:
 	case NCR_VARIANT_FAS408:
 		NCR_SCSIREGS(sc);
+	case NCR_VARIANT_FAS216:
 	case NCR_VARIANT_NCR53C94:
 	case NCR_VARIANT_NCR53C96:
 	case NCR_VARIANT_ESP200:
@@ -423,13 +425,13 @@
 	struct scsi_link *sc_link = ecb->xs->sc_link;
 	int target = sc_link->target;
 	struct ncr53c9x_tinfo *ti = &sc->sc_tinfo[target];
+	int tiflags = ti->flags;
 	u_char *cmd;
 	int clen;
 
 	NCR_TRACE(("[ncr53c9x_select(t%d,l%d,cmd:%x)] ",
-	    sc_link->target, sc_link->lun, ecb->cmd.cmd.opcode));
+		   sc_link->target, sc_link->lun, ecb->cmd.cmd.opcode));
 
-	/* new state NCR_SELECTING */
 	sc->sc_state = NCR_SELECTING;
 
 	/*
@@ -441,8 +443,6 @@
 		timeout(ncr53c9x_timeout, ecb,
 		    (ecb->timeout * hz) / 1000);
 
-	NCRCMD(sc, NCRCMD_FLUSH);
-
 	/*
 	 * The docs say the target register is never reset, and I
 	 * can't think of a better place to set it
@@ -450,29 +450,34 @@
 	NCR_WRITE_REG(sc, NCR_SELID, target);
 	ncr53c9x_setsync(sc, ti);
 
-	if (ncr53c9x_dmaselect && (ti->flags & T_NEGOTIATE) == 0) {
-		size_t dmacl;
+	if (ncr53c9x_dmaselect && (tiflags & T_NEGOTIATE) == 0) {
+		size_t dmasize;
+
 		ecb->cmd.id = 
 		    MSG_IDENTIFY(sc_link->lun, (ti->flags & T_RSELECTOFF)?0:1);
 
 		/* setup DMA transfer for command */
-		clen = ecb->clen + 1;
+		dmasize = clen = ecb->clen + 1;
 		sc->sc_cmdlen = clen;
 		sc->sc_cmdp = (caddr_t)&ecb->cmd;
-		dmacl = clen;
-		NCRDMA_SETUP(sc, &sc->sc_cmdp, &sc->sc_cmdlen, 0, &dmacl);
+		NCRDMA_SETUP(sc, &sc->sc_cmdp, &sc->sc_cmdlen, 0, &dmasize);
+
 		/* Program the SCSI counter */
-		NCR_WRITE_REG(sc, NCR_TCL, clen);
-		NCR_WRITE_REG(sc, NCR_TCM, clen >> 8);
+		NCR_WRITE_REG(sc, NCR_TCL, dmasize);
+		NCR_WRITE_REG(sc, NCR_TCM, dmasize >> 8);
 		if (sc->sc_cfg2 & NCRCFG2_FE) {
-			NCR_WRITE_REG(sc, NCR_TCH, clen >> 16);
+			NCR_WRITE_REG(sc, NCR_TCH, dmasize >> 16);
 		}
 
+		/* load the count in */
+		NCRCMD(sc, NCRCMD_NOP|NCRCMD_DMA);
+
 		/* And get the targets attention */
 		NCRCMD(sc, NCRCMD_SELATN | NCRCMD_DMA);
 		NCRDMA_GO(sc);
 		return;
 	}
+
 	/*
 	 * Who am I. This is where we tell the target that we are
 	 * happy for it to disconnect etc.
@@ -671,7 +676,8 @@
 			break;
 		} else
 			NCR_MISC(("%d:%d busy\n",
-			    sc_link->target, sc_link->lun));
+				  sc_link->target,
+				  sc_link->lun));
 	}
 }
 
@@ -1089,8 +1095,7 @@
 					printf("max sync rate %d.%02dMb/s\n",
 						r, s);
 #endif
-					if ((sc->sc_flags&NCR_SYNCHNEGO)
-					    == 0) {
+					if ((sc->sc_flags&NCR_SYNCHNEGO) == 0) {
 						/*
 						 * target initiated negotiation
 						 */
@@ -1174,6 +1179,13 @@
 	NCR_TRACE(("[ncr53c9x_msgout(priq:%x, prevphase:%x)]",
 	    sc->sc_msgpriq, sc->sc_prevphase));
 
+	/*
+	 * XXX - the NCR_ATN flag is not in sync with the actual ATN
+	 *	 condition on the SCSI bus. The 53c9x chip
+	 *	 automatically turns off ATN before sending the
+	 *	 message byte.  (see also the comment below in the
+	 *	 default case when picking out a message to send)
+	 */
 	if (sc->sc_flags & NCR_ATN) {
 		if (sc->sc_prevphase != MESSAGE_OUT_PHASE) {
 		new:
@@ -1244,7 +1256,19 @@
 			sc->sc_omess[0] = MSG_MESSAGE_REJECT;
 			break;
 		default:
-			NCRCMD(sc, NCRCMD_RSTATN);
+			/*
+			 * We normally do not get here, since the chip
+			 * automatically turns off ATN before the last
+			 * byte of a message is sent to the target.
+			 * However, if the target rejects our (multi-byte)
+			 * message early by switching to MSG IN phase
+			 * ATN remains on, so the target may return to
+			 * MSG OUT phase. If there are no scheduled messages
+			 * left we send a NO-OP.
+			 *
+			 * XXX - Note that this leaves no useful purpose for
+			 * the NCR_ATN flag.
+			 */
 			sc->sc_flags &= ~NCR_ATN;
 			sc->sc_omess[0] = MSG_NOOP;
 			break;
@@ -1252,7 +1276,6 @@
 		sc->sc_omp = sc->sc_omess;
 	}
 
-#if 1
 	/* (re)send the message */
 	size = min(sc->sc_omlen, sc->sc_maxxfer);
 	NCRDMA_SETUP(sc, &sc->sc_omp, &sc->sc_omlen, 0, &size);
@@ -1262,18 +1285,10 @@
 	if (sc->sc_cfg2 & NCRCFG2_FE) {
 		NCR_WRITE_REG(sc, NCR_TCH, size >> 16);
 	}
-	/* load the count in */
+	/* Load the count in and start the message-out transfer */
 	NCRCMD(sc, NCRCMD_NOP|NCRCMD_DMA);
 	NCRCMD(sc, NCRCMD_TRANS|NCRCMD_DMA);
 	NCRDMA_GO(sc);
-#else
-	{	int i;
-		for (i = 0; i < sc->sc_omlen; i++)
-			NCR_WRITE_REG(sc, FIFO, sc->sc_omess[i]);
-		NCRCMD(sc, NCRCMD_TRANS);
-		sc->sc_omlen = 0;
-	}
-#endif
 }
 
 /*
@@ -1394,7 +1409,16 @@
 
 			if (sc->sc_espintr & NCRINTR_ILL) {
 				if (sc->sc_flags & NCR_EXPECT_ILLCMD) {
-printf("%s: ILL: ESP100 work-around activated\n", sc->sc_dev.dv_xname);
+					/*
+					 * Eat away "Illegal command" interrupt
+					 * on a ESP100 caused by a re-selection
+					 * while we were trying to select
+					 * another target.
+					 */
+#ifdef DEBUG
+					printf("%s: ESP100 work-around activated\n",
+						sc->sc_dev.dv_xname);
+#endif
 					sc->sc_flags &= ~NCR_EXPECT_ILLCMD;
 					continue;
 				}
@@ -1432,23 +1456,53 @@
 			if (NCRDMA_ISACTIVE(sc))
 				return 1;
 
-			/*
-			 * Note that this can happen during normal operation
-			 * if we are reselected while using DMA to select
-			 * a target.  If this is the case, don't issue the
-			 * warning.
-			 */
-			if (sc->sc_dleft == 0 &&
-			    (sc->sc_espstat & NCRSTAT_TC) == 0 &&
-			    sc->sc_state != NCR_SELECTING)
-				printf("%s: !TC [intr %x, stat %x, step %d]"
-				       " prevphase %x, resid %x\n",
-					sc->sc_dev.dv_xname,
-					sc->sc_espintr,
-					sc->sc_espstat,
-					sc->sc_espstep,
-					sc->sc_prevphase,
-					ecb?ecb->dleft:-1);
+			if ((sc->sc_espstat & NCRSTAT_TC) == 0) {
+				/*
+				 * DMA not completed.  If we can not find a
+				 * acceptable explanation, print a diagnostic.
+				 */
+				if (sc->sc_state == NCR_SELECTING)
+					/*
+					 * This can happen if we are reselected
+					 * while using DMA to select a target.
+					 */
+					/*void*/;
+				else if (sc->sc_prevphase == MESSAGE_OUT_PHASE){
+					/*
+					 * Our (multi-byte) message (eg SDTR)
+					 * was interrupted by the target to
+					 * send a MSG REJECT.
+					 * Print diagnostic if current phase
+					 * is not MESSAGE IN.
+					 */
+					if (sc->sc_phase != MESSAGE_IN_PHASE)
+					    printf("%s: !TC on MSG OUT"
+					       " [intr %x, stat %x, step %d]"
+					       " prevphase %x, resid %x\n",
+						sc->sc_dev.dv_xname,
+						sc->sc_espintr,
+						sc->sc_espstat,
+						sc->sc_espstep,
+						sc->sc_prevphase,
+						sc->sc_omlen);
+				} else if (sc->sc_dleft == 0) {
+					/*
+					 * The DMA operation was started for
+					 * a DATA transfer. Print a diagnostic
+					 * if the DMA counter and TC bit
+					 * appear to be out of sync.
+					 */
+					printf("%s: !TC on DATA XFER"
+					       " [intr %x, stat %x, step %d]"
+					       " prevphase %x, resid %x\n",
+						sc->sc_dev.dv_xname,
+						sc->sc_espintr,
+						sc->sc_espstat,
+						sc->sc_espstep,
+						sc->sc_prevphase,
+						ecb?ecb->dleft:-1);
+				}
+			}
 		}
 
 #if 0	/* Unreliable on some NCR revisions? */
@@ -1483,6 +1537,7 @@
 			 * 250mS of a disconnect. So here you are...
 			 */
 			NCRCMD(sc, NCRCMD_ENSEL);
+
 			switch (sc->sc_state) {
 			case NCR_RESELECTED:
 				goto sched;
@@ -1571,7 +1626,6 @@
 			break;
 
 		case NCR_IDLE:
-if (sc->sc_flags & NCR_ICCS) printf("[[esp: BUMMER]]");
 		case NCR_SELECTING:
 			sc->sc_msgpriq = sc->sc_msgout = sc->sc_msgoutq = 0;
 			sc->sc_flags = 0;
@@ -1635,8 +1689,15 @@
 				/* Handle identify message */
 				ncr53c9x_msgin(sc);
 				if (nfifo != 2) {
+					/*
+					 * Note: this should not happen
+					 * with `dmaselect' on.
+					 */
 					sc->sc_flags |= NCR_EXPECT_ILLCMD;
 					NCRCMD(sc, NCRCMD_FLUSH);
+				} else if (ncr53c9x_dmaselect &&
+					   sc->sc_rev == NCR_VARIANT_ESP100) {
+					sc->sc_flags |= NCR_EXPECT_ILLCMD;
 				}
 
 				if (sc->sc_state != NCR_CONNECTED) {
@@ -1660,11 +1721,17 @@
 
 				switch (sc->sc_espstep) {
 				case 0:
-					printf("%s: select timeout/no "
-					    "disconnect\n",
-					    sc->sc_dev.dv_xname);
-					ecb->xs->error = XS_SELTIMEOUT;
-					goto finish;
+					/*
+					 * The target did not respond with a
+					 * message out phase - probably an old
+					 * device that doesn't recognize ATN.
+					 * Clear ATN and just continue, the
+					 * target should be in the command
+					 * phase.
+					 * XXXX check for command phase?
+					 */
+					NCRCMD(sc, NCRCMD_RSTATN);
+					break;
 				case 1:
 					if ((ti->flags & T_NEGOTIATE) == 0) {
 						printf("%s: step 1 & !NEG\n",
@@ -1721,11 +1788,15 @@
 					if (ncr53c9x_dmaselect &&
 					    sc->sc_cmdlen != 0)
 						printf("(%s:%d:%d): select; "
-						      "%d left in DMA buffer\n",
+						       "%d left in DMA buffer "
+						"[intr %x, stat %x, step %d]\n",
 							sc->sc_dev.dv_xname,
 							sc_link->target,
 							sc_link->lun,
-							sc->sc_cmdlen);
+							sc->sc_cmdlen,
+							sc->sc_espintr,
+							sc->sc_espstat,
+							sc->sc_espstep);
 					/* So far, everything went fine */
 					break;
 				}
@@ -1854,7 +1925,7 @@
 			 * Send the command block. Normally we don't see this
 			 * phase because the SEL_ATN command takes care of
 			 * all this. However, we end up here if either the
-			 * target or we wanted exchange some more messages
+			 * target or we wanted to exchange some more messages
 			 * first (e.g. to start negotiations).
 			 */
 
@@ -1879,6 +1950,10 @@
 					NCR_WRITE_REG(sc, NCR_TCH, size >> 16);
 				}
 
+				/* load the count in */
+				NCRCMD(sc, NCRCMD_NOP|NCRCMD_DMA);
+
+				/* start the command transfer */
 				NCRCMD(sc, NCRCMD_TRANS | NCRCMD_DMA);
 				NCRDMA_GO(sc);
 			} else {
Index: dev/ic/ncr53c9xvar.h
===================================================================
RCS file: /cvs/src/sys/dev/ic/ncr53c9xvar.h,v
retrieving revision 1.2
diff -u -r1.2 ncr53c9xvar.h
--- ncr53c9xvar.h	1997/08/08 08:13:06	1.2
+++ ncr53c9xvar.h	1998/02/05 19:07:00
@@ -1,10 +1,14 @@
-/*	$OpenBSD: ncr53c9xvar.h,v 1.2 1997/08/08 08:13:06 downsj Exp $	*/
-/*	$NetBSD: ncr53c9xvar.h,v 1.8 1997/07/30 11:48:32 pk Exp $	*/
+/*	$OpenBSD: ncr53c9xvar.h,v 1.3 1998/02/03 22:02:48 jason Exp $	*/
+/*	$NetBSD: ncr53c9xvar.h,v 1.11 1997/10/05 18:35:09 thorpej Exp $	*/
 
-/*
- * Copyright (c) 1997 Jason R. Thorpe.
+/*-
+ * Copyright (c) 1997 The NetBSD Foundation, Inc.
  * All rights reserved.
  *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Jason R. Thorpe of the Numerical Aerospace Simulation Facility,
+ * NASA Ames Research Center.
+ *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
  * are met:
@@ -15,21 +19,23 @@
  *    documentation and/or other materials provided with the distribution.
  * 3. All advertising materials mentioning features or use of this software
  *    must display the following acknowledgement:
- *	This product includes software developed for the NetBSD Project
- *	by Jason R. Thorpe.
- * 4. The name of the author may not be used to endorse or promote products
- *    derived from this software without specific prior written permission.
+ *	This product includes software developed by the NetBSD
+ *	Foundation, Inc. and its contributors.
+ * 4. Neither the name of The NetBSD Foundation nor the names of its
+ *    contributors may be used to endorse or promote products derived
+ *    from this software without specific prior written permission.
  *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
  */
 
 /*
@@ -80,7 +86,8 @@
 #define	NCR_VARIANT_NCR53C96		4
 #define	NCR_VARIANT_ESP406		5
 #define	NCR_VARIANT_FAS408		6
-#define	NCR_VARIANT_MAX			7
+#define	NCR_VARIANT_FAS216		7
+#define	NCR_VARIANT_MAX			8
 
 /*
  * ECB. Holds additional information for each SCSI command Comments: We
