Subject: Re: kern/31990: esiop leaves b_resid non-zero (newfs troubles, etc ...)
To: Roy Bixler , edwin <edwin@spacebugs.nl>
From: Manuel Bouyer <bouyer@antioche.eu.org>
List: netbsd-bugs
Date: 11/17/2005 18:41:01
--OgqxwSJOaUobr8KG
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline

Hi,
my previous patch was still not right, I forgot a case where b_resid would
not be properly updated. I reworked the code, and now the code path used
to handle drives which don't issue a save data pointer after the last data
transfers is also used, in some case, for drives which do.
This means that I can test part of the code on my system, and it's more
likely to work on yours :)

Please test this new patch

-- 
Manuel Bouyer <bouyer@antioche.eu.org>
     NetBSD: 26 ans d'experience feront toujours la difference
--

--OgqxwSJOaUobr8KG
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment; filename=diff-current

Index: ic/esiop.c
===================================================================
RCS file: /cvsroot/src/sys/dev/ic/esiop.c,v
retrieving revision 1.33
diff -u -r1.33 esiop.c
--- ic/esiop.c	23 Mar 2005 21:23:15 -0000	1.33
+++ ic/esiop.c	17 Nov 2005 17:23:29 -0000
@@ -252,6 +252,14 @@
 			    sizeof(struct siop_common_xfer));
 		}
 		for (j = 0; j <
+		    (sizeof(E_saved_offset_offset_Used) /
+		     sizeof(E_saved_offset_offset_Used[0]));
+		    j++) {
+			bus_space_write_4(sc->sc_c.sc_ramt, sc->sc_c.sc_ramh,
+			    E_saved_offset_offset_Used[j] * 4,
+			    sizeof(struct siop_common_xfer) + 4);
+		}
+		for (j = 0; j <
 		    (sizeof(E_abs_msgin2_Used) / sizeof(E_abs_msgin2_Used[0]));
 		    j++) {
 			bus_space_write_4(sc->sc_c.sc_ramt, sc->sc_c.sc_ramh,
@@ -290,6 +298,13 @@
 			    htole32(sizeof(struct siop_common_xfer));
 		}
 		for (j = 0; j <
+		    (sizeof(E_saved_offset_offset_Used) /
+		     sizeof(E_saved_offset_offset_Used[0]));
+		    j++) {
+			sc->sc_c.sc_script[E_saved_offset_offset_Used[j]] =
+			    htole32(sizeof(struct siop_common_xfer) + 4);
+		}
+		for (j = 0; j <
 		    (sizeof(E_abs_msgin2_Used) / sizeof(E_abs_msgin2_Used[0]));
 		    j++) {
 			sc->sc_c.sc_script[E_abs_msgin2_Used[j]] =
@@ -1071,6 +1086,9 @@
 			printf("disconnect offset %d\n", offset);
 #endif
 			siop_sdp(&esiop_cmd->cmd_c, offset);
+			/* we start again with no offset */
+			ESIOP_XFER(esiop_cmd, saved_offset) =
+			    htole32(SIOP_NOOFFSET);
 			esiop_table_sync(esiop_cmd,
 			    BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
 			CALL_SCRIPT(Ent_script_sched);
@@ -1125,6 +1143,17 @@
 		esiop_lun->active = NULL;
 	offset = bus_space_read_1(sc->sc_c.sc_rt, sc->sc_c.sc_rh,
 	    SIOP_SCRATCHA + 1);
+	/*
+	 * if we got a disconnect between the last data phase
+	 * and the status phase, offset will be 0. In this
+	 * case, cmd_tables->saved_offset will have the proper value 
+	 * if it got updated by the controller
+	 */
+	if (offset == 0 &&
+	    ESIOP_XFER(esiop_cmd, saved_offset) != htole32(SIOP_NOOFFSET))
+		offset =
+		    (le32toh(ESIOP_XFER(esiop_cmd, saved_offset)) >> 8) & 0xff;
+
 	esiop_scsicmd_end(esiop_cmd, offset);
 	if (freetarget && esiop_target->target_c.status == TARST_PROBING)
 		esiop_del_dev(sc, target, lun);
@@ -1213,7 +1242,7 @@
 	u_int32_t slot;
 	int needsync = 0;
 	int status;
-	u_int32_t sem;
+	u_int32_t sem, offset;
 
 	esiop_script_sync(sc, BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE);
 	sem = esiop_script_read(sc, sc->sc_semoffset);
@@ -1294,10 +1323,15 @@
 		esiop_lun->tactive[tag] = NULL;
 	else
 		esiop_lun->active = NULL;
-	/* scratcha was saved in tlq by script. fetch offset from it */
-	esiop_scsicmd_end(esiop_cmd,
-	    (le32toh(((struct esiop_xfer *)esiop_cmd->cmd_tables)->tlq) >> 8)
-	    & 0xff);
+	/*
+	 * scratcha was eventually saved in saved_offset by script.
+	 * fetch offset from it
+	 */
+	offset = 0;
+	if (ESIOP_XFER(esiop_cmd, saved_offset) != htole32(SIOP_NOOFFSET))
+		offset =
+		    (le32toh(ESIOP_XFER(esiop_cmd, saved_offset)) >> 8) & 0xff;
+	esiop_scsicmd_end(esiop_cmd, offset);
 	goto next;
 }
 
@@ -1603,14 +1637,13 @@
 		else
 			esiop_cmd->cmd_c.tag = -1;
 		siop_setuptables(&esiop_cmd->cmd_c);
-		((struct esiop_xfer *)esiop_cmd->cmd_tables)->tlq =
-		    htole32(A_f_c_target | A_f_c_lun);
-		((struct esiop_xfer *)esiop_cmd->cmd_tables)->tlq |=
+		ESIOP_XFER(esiop_cmd, saved_offset) = htole32(SIOP_NOOFFSET);
+		ESIOP_XFER(esiop_cmd, tlq) = htole32(A_f_c_target | A_f_c_lun);
+		ESIOP_XFER(esiop_cmd, tlq) |=
 		    htole32((target << 8) | (lun << 16));
 		if (esiop_cmd->cmd_c.flags & CMDFL_TAG) {
-			((struct esiop_xfer *)esiop_cmd->cmd_tables)->tlq |=
-			    htole32(A_f_c_tag);
-			((struct esiop_xfer *)esiop_cmd->cmd_tables)->tlq |=
+			ESIOP_XFER(esiop_cmd, tlq) |= htole32(A_f_c_tag);
+			ESIOP_XFER(esiop_cmd, tlq) |=
 			    htole32(esiop_cmd->cmd_c.tag << 24);
 		}
 
@@ -1958,10 +1991,12 @@
 		TAILQ_INSERT_TAIL(&sc->free_list, &newcbd->cmds[i], next);
 		splx(s);
 #ifdef SIOP_DEBUG
-		printf("tables[%d]: in=0x%x out=0x%x status=0x%x\n", i,
+		printf("tables[%d]: in=0x%x out=0x%x status=0x%x "
+		    "offset=0x%x\n", i,
 		    le32toh(newcbd->cmds[i].cmd_tables->t_msgin.addr),
 		    le32toh(newcbd->cmds[i].cmd_tables->t_msgout.addr),
-		    le32toh(newcbd->cmds[i].cmd_tables->t_status.addr));
+		    le32toh(newcbd->cmds[i].cmd_tables->t_status.addr,
+		    le32toh(newcbd->cmds[i].cmd_tables->t_offset.addr));
 #endif
 	}
 	s = splbio();
Index: ic/esiopvar.h
===================================================================
RCS file: /cvsroot/src/sys/dev/ic/esiopvar.h,v
retrieving revision 1.12
diff -u -r1.12 esiopvar.h
--- ic/esiopvar.h	27 Feb 2005 00:27:01 -0000	1.12
+++ ic/esiopvar.h	17 Nov 2005 17:23:29 -0000
@@ -53,9 +53,11 @@
 struct esiop_xfer {
 	struct siop_common_xfer siop_tables;
 	u_int32_t tlq; /* target/lun/tag loaded in scratchC by script */
-		      /* will also containt scratcha at end of command */
+	u_int32_t saved_offset;/* contains scratchA if script saved an offset */
 } __attribute__((__packed__));
 
+#define ESIOP_XFER(cmd, m) (((struct esiop_xfer *)((cmd)->cmd_tables))->m)
+
 /*
  * This describes a command handled by the SCSI controller
  * These are chained in either a free list or a active list
Index: ic/siop.c
===================================================================
RCS file: /cvsroot/src/sys/dev/ic/siop.c,v
retrieving revision 1.78
diff -u -r1.78 siop.c
--- ic/siop.c	27 Feb 2005 00:27:02 -0000	1.78
+++ ic/siop.c	17 Nov 2005 17:23:29 -0000
@@ -103,6 +103,7 @@
 static int siop_stat_intr = 0;
 static int siop_stat_intr_shortxfer = 0;
 static int siop_stat_intr_sdp = 0;
+static int siop_stat_intr_saveoffset = 0;
 static int siop_stat_intr_done = 0;
 static int siop_stat_intr_xferdisc = 0;
 static int siop_stat_intr_lunresel = 0;
@@ -911,10 +912,22 @@
 			printf("disconnect offset %d\n", offset);
 #endif
 			siop_sdp(&siop_cmd->cmd_c, offset);
+			/* we start again with no offset */
+			siop_cmd->saved_offset = SIOP_NOOFFSET;
 			siop_table_sync(siop_cmd,
 			    BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
 			CALL_SCRIPT(Ent_script_sched);
 			return 1;
+		case A_int_saveoffset:
+			INCSTAT(siop_stat_intr_saveoffset);
+			offset = bus_space_read_1(sc->sc_c.sc_rt,
+			    sc->sc_c.sc_rh, SIOP_SCRATCHA + 1);
+#ifdef SIOP_DEBUG_DR
+			printf("saveoffset offset %d\n", offset);
+#endif
+			siop_cmd->saved_offset = offset;
+			CALL_SCRIPT(Ent_script_sched);
+			return 1;
 		case A_int_resfail:
 			printf("reselect failed\n");
 			CALL_SCRIPT(Ent_script_sched);
@@ -939,6 +952,15 @@
 			/* update resid.  */
 			offset = bus_space_read_1(sc->sc_c.sc_rt,
 			    sc->sc_c.sc_rh, SIOP_SCRATCHA + 1);
+			/*
+			 * if we got a disconnect between the last data phase
+			 * and the status phase, offset will be 0. In this
+			 * case, siop_cmd->saved_offset will have the proper
+			 * value if it got updated by the controller
+			 */
+			if (offset == 0 && 
+			    siop_cmd->saved_offset != SIOP_NOOFFSET)
+				offset = siop_cmd->saved_offset;
 			siop_update_resid(&siop_cmd->cmd_c, offset);
 			siop_cmd->cmd_c.status = CMDST_DONE;
 			goto end;
@@ -1348,6 +1370,7 @@
 			siop_cmd->cmd_c.tag = 0;
 		}
 		siop_setuptables(&siop_cmd->cmd_c);
+		siop_cmd->saved_offset = SIOP_NOOFFSET;
 		siop_table_sync(siop_cmd,
 		    BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
 		siop_start(sc, siop_cmd);
@@ -1717,10 +1740,12 @@
 		TAILQ_INSERT_TAIL(&sc->free_list, &newcbd->cmds[i], next);
 		splx(s);
 #ifdef SIOP_DEBUG
-		printf("tables[%d]: in=0x%x out=0x%x status=0x%x\n", i,
+		printf("tables[%d]: in=0x%x out=0x%x status=0x%x "
+		    "offset=0x%x\n", i,
 		    le32toh(newcbd->cmds[i].cmd_tables->t_msgin.addr),
 		    le32toh(newcbd->cmds[i].cmd_tables->t_msgout.addr),
-		    le32toh(newcbd->cmds[i].cmd_tables->t_status.addr));
+		    le32toh(newcbd->cmds[i].cmd_tables->t_status.addr),
+		    le32toh(newcbd->cmds[i].cmd_tables->t_offset.addr));
 #endif
 	}
 	s = splbio();
@@ -2002,6 +2027,7 @@
 	printf("siop_stat_intr_shortxfer %d\n", siop_stat_intr_shortxfer);
 	printf("siop_stat_intr_xferdisc %d\n", siop_stat_intr_xferdisc);
 	printf("siop_stat_intr_sdp %d\n", siop_stat_intr_sdp);
+	printf("siop_stat_intr_saveoffset %d\n", siop_stat_intr_saveoffset);
 	printf("siop_stat_intr_done %d\n", siop_stat_intr_done);
 	printf("siop_stat_intr_lunresel %d\n", siop_stat_intr_lunresel);
 	printf("siop_stat_intr_qfull %d\n", siop_stat_intr_qfull);
Index: ic/siopvar.h
===================================================================
RCS file: /cvsroot/src/sys/dev/ic/siopvar.h,v
retrieving revision 1.21
diff -u -r1.21 siopvar.h
--- ic/siopvar.h	27 Feb 2005 00:27:02 -0000	1.21
+++ ic/siopvar.h	17 Nov 2005 17:23:29 -0000
@@ -56,6 +56,7 @@
 	struct siop_common_cmd cmd_c;
 	struct siop_cbd *siop_cbdp; /* pointer to our siop_cbd */
 	int reselslot;
+	u_int32_t saved_offset; /* offset in table after disc without sdp */
 };
 #define cmd_tables cmd_c.siop_tables
 
Index: ic/siopvar_common.h
===================================================================
RCS file: /cvsroot/src/sys/dev/ic/siopvar_common.h,v
retrieving revision 1.32
diff -u -r1.32 siopvar_common.h
--- ic/siopvar_common.h	27 Feb 2005 00:27:02 -0000	1.32
+++ ic/siopvar_common.h	17 Nov 2005 17:23:29 -0000
@@ -56,7 +56,7 @@
 	u_int8_t msg_out[16];	/* 0 */
 	u_int8_t msg_in[16];	/* 16 */
 	u_int32_t status;	/* 32 */
-	u_int32_t pad1;		/* 36 */
+	u_int32_t pad1; 	/* 36 */
 	u_int32_t id;		/* 40 */
 	u_int32_t pad2;		/* 44 */
 	scr_table_t t_msgin;	/* 48 */
@@ -72,6 +72,9 @@
 #define SCSI_SIOP_NOCHECK	0xfe	/* don't check the scsi status */
 #define SCSI_SIOP_NOSTATUS	0xff	/* device didn't report status */
 
+/* offset is initialised to SIOP_NOOFFSET, used to check if it was updated */
+#define SIOP_NOOFFSET 0xffffffff
+
 /*
  * This describes a command handled by the SCSI controller
  */
Index: microcode/siop/esiop.out
===================================================================
RCS file: /cvsroot/src/sys/dev/microcode/siop/esiop.out,v
retrieving revision 1.13
diff -u -r1.13 esiop.out
--- microcode/siop/esiop.out	17 May 2004 18:38:22 -0000	1.13
+++ microcode/siop/esiop.out	17 Nov 2005 17:23:29 -0000
@@ -1,7 +1,7 @@
-/*	$NetBSD: esiop.out,v 1.13 2004/05/17 18:38:22 bouyer Exp $	*/
+/*	$NetBSD: ncr53cxxx.c,v 1.14 2005/02/11 06:21:22 simonb Exp $	*/
 /*
  *	DO NOT EDIT - this file is automatically generated.
- *	created from esiop.ss on Mon May 17 20:37:26 2004
+ *	created from esiop.ss on Thu Nov 17 17:54:10 2005
  */
 const u_int32_t esiop_script[] = {
 	0xe15c0004, 0x00000000,			/* 000 -   0 */
@@ -13,7 +13,7 @@
 	0x78600000, 0x00000000,			/* 030 -  48 */
 	0x7869ff00, 0x00000000,			/* 038 -  56 */
 	0x80000000, 0x00000000,			/* 040 -  64 */
-	0x54000000, 0x000002e8,			/* 048 -  72 */
+	0x54000000, 0x000002f8,			/* 048 -  72 */
 	0x80000000, 0x00000000,			/* 050 -  80 */
 	0x740a0f00, 0x00000000,			/* 058 -  88 */
 	0x6a610000, 0x00000000,			/* 060 -  96 */
@@ -46,12 +46,12 @@
 	0x87830000, 0x000000c8,			/* 138 - 312 */
 	0x0f000001, 0x00000000,			/* 140 - 320 */
 	0x60000040, 0x00000000,			/* 148 - 328 */
-	0x80840020, 0x000003b8,			/* 150 - 336 */
+	0x80840020, 0x000003c8,			/* 150 - 336 */
 	0x0f000001, 0x00000000,			/* 158 - 344 */
 	0x6a360000, 0x00000000,			/* 160 - 352 */
 	0x6a630000, 0x00000000,			/* 168 - 360 */
 	0x7a600400, 0x00000000,			/* 170 - 368 */
-	0x88880000, 0x00000500,			/* 178 - 376 */
+	0x88880000, 0x00000528,			/* 178 - 376 */
 	0x78370000, 0x00000000,			/* 180 - 384 */
 	0x60000400, 0x00000000,			/* 188 - 392 */
 	0x79360000, 0x00000000,			/* 190 - 400 */
@@ -69,169 +69,174 @@
 	0x7f130000, 0x00000000,			/* 1f0 - 496 */
 	0xf1100004, 0x00000000,			/* 1f8 - 504 */
 	0x60000040, 0x00000000,			/* 200 - 512 */
-	0x868b0000, 0x000002c8,			/* 208 - 520 */
-	0x878b0000, 0x000002e8,			/* 210 - 528 */
-	0x808b0000, 0x000003b8,			/* 218 - 536 */
-	0x818b0000, 0x00000350,			/* 220 - 544 */
-	0x828b0000, 0x00000320,			/* 228 - 552 */
-	0x838b0000, 0x00000328,			/* 230 - 560 */
+	0x868b0000, 0x000002d8,			/* 208 - 520 */
+	0x878b0000, 0x000002f8,			/* 210 - 528 */
+	0x808b0000, 0x000003e0,			/* 218 - 536 */
+	0x818b0000, 0x00000378,			/* 220 - 544 */
+	0x828b0000, 0x00000348,			/* 228 - 552 */
+	0x838b0000, 0x00000350,			/* 230 - 560 */
 	0x98080000, 0x0000ffff,			/* 238 - 568 */
-	0x88880000, 0x00000480,			/* 240 - 576 */
-	0xf2340004, 0x00000000,			/* 248 - 584 */
-	0x72690000, 0x00000000,			/* 250 - 592 */
-	0x98040000, 0x0000ff00,			/* 258 - 600 */
-	0x726c0000, 0x00000000,			/* 260 - 608 */
-	0x6a100000, 0x00000000,			/* 268 - 616 */
-	0x726d0000, 0x00000000,			/* 270 - 624 */
-	0x6a110000, 0x00000000,			/* 278 - 632 */
-	0x726e0000, 0x00000000,			/* 280 - 640 */
-	0x6a120000, 0x00000000,			/* 288 - 648 */
-	0x726f0000, 0x00000000,			/* 290 - 656 */
-	0x6a130000, 0x00000000,			/* 298 - 664 */
-	0xf1340001, 0x00000000,			/* 2a0 - 672 */
-	0x72340000, 0x00000000,			/* 2a8 - 680 */
-	0x80840000, 0xffffffe8,			/* 2b0 - 688 */
-	0xf2600004, 0x00000000,			/* 2b8 - 696 */
-	0x7e6c0400, 0x00000000,			/* 2c0 - 704 */
-	0x7f6d0000, 0x00000000,			/* 2c8 - 712 */
-	0x7f6e0000, 0x00000000,			/* 2d0 - 720 */
-	0x7f6f0000, 0x00000000,			/* 2d8 - 728 */
-	0x7e6a0100, 0x00000000,			/* 2e0 - 736 */
-	0x726a0000, 0x00000000,			/* 2e8 - 744 */
-	0x80840000, 0x00000028,			/* 2f0 - 752 */
-	0x786cff00, 0x00000000,			/* 2f8 - 760 */
-	0x786dff00, 0x00000000,			/* 300 - 768 */
-	0x786eff00, 0x00000000,			/* 308 - 776 */
-	0x786fff00, 0x00000000,			/* 310 - 784 */
-	0x786a0000, 0x00000000,			/* 318 - 792 */
-	0xe15c0004, 0x00000000,			/* 320 - 800 */
-	0x7a5c0100, 0x00000000,			/* 328 - 808 */
-	0xe25c0004, 0x00000000,			/* 330 - 816 */
-	0x741a4000, 0x00000000,			/* 338 - 824 */
-	0x72640000, 0x00000000,			/* 340 - 832 */
-	0x6a100000, 0x00000000,			/* 348 - 840 */
-	0x72650000, 0x00000000,			/* 350 - 848 */
-	0x6a110000, 0x00000000,			/* 358 - 856 */
-	0x72660000, 0x00000000,			/* 360 - 864 */
-	0x6a120000, 0x00000000,			/* 368 - 872 */
-	0x72670000, 0x00000000,			/* 370 - 880 */
-	0x6a130000, 0x00000000,			/* 378 - 888 */
-	0xf1100004, 0x00000000,			/* 380 - 896 */
-	0x74100100, 0x00000000,			/* 388 - 904 */
-	0x80840000, 0xfffffc68,			/* 390 - 912 */
-	0x74100200, 0x00000000,			/* 398 - 920 */
-	0x80840000, 0x00000018,			/* 3a0 - 928 */
-	0xf1600004, 0x00000000,			/* 3a8 - 936 */
-	0x47000028, 0xfffffc70,			/* 3b0 - 944 */
-	0x9e030000, 0x0000ffff,			/* 3b8 - 952 */
-	0x72640000, 0x00000000,			/* 3c0 - 960 */
-	0x6a100000, 0x00000000,			/* 3c8 - 968 */
-	0x72650000, 0x00000000,			/* 3d0 - 976 */
-	0x6a110000, 0x00000000,			/* 3d8 - 984 */
-	0x72660000, 0x00000000,			/* 3e0 - 992 */
-	0x6a120000, 0x00000000,			/* 3e8 - 1000 */
-	0x72670000, 0x00000000,			/* 3f0 - 1008 */
-	0x6a130000, 0x00000000,			/* 3f8 - 1016 */
-	0x7e680100, 0x00000000,			/* 400 - 1024 */
-	0x7e640400, 0x00000000,			/* 408 - 1032 */
-	0x7f650000, 0x00000000,			/* 410 - 1040 */
-	0x7f660000, 0x00000000,			/* 418 - 1048 */
-	0x7f670000, 0x00000000,			/* 420 - 1056 */
-	0x72680000, 0x00000000,			/* 428 - 1064 */
-	0x80840000, 0x00000028,			/* 430 - 1072 */
-	0x7864ff00, 0x00000000,			/* 438 - 1080 */
-	0x7865ff00, 0x00000000,			/* 440 - 1088 */
-	0x7866ff00, 0x00000000,			/* 448 - 1096 */
-	0x7867ff00, 0x00000000,			/* 450 - 1104 */
-	0x78680000, 0x00000000,			/* 458 - 1112 */
-	0xf15c0004, 0x00000000,			/* 460 - 1120 */
-	0x7a5c0100, 0x00000000,			/* 468 - 1128 */
-	0xf25c0004, 0x00000000,			/* 470 - 1136 */
-	0x745c0200, 0x00000000,			/* 478 - 1144 */
-	0x80840000, 0xfffffeb8,			/* 480 - 1152 */
-	0x7c5cfc00, 0x00000000,			/* 488 - 1160 */
-	0x88880000, 0x000001e8,			/* 490 - 1168 */
-	0xe15c0004, 0x00000000,			/* 498 - 1176 */
-	0x7a5c0200, 0x00000000,			/* 4a0 - 1184 */
-	0xe25c0004, 0x00000000,			/* 4a8 - 1192 */
-	0x80000000, 0x00000000,			/* 4b0 - 1200 */
-	0x78350000, 0x00000000,			/* 4b8 - 1208 */
-	0x7869ff00, 0x00000000,			/* 4c0 - 1216 */
-	0x58000008, 0x00000000,			/* 4c8 - 1224 */
-	0x60000040, 0x00000000,			/* 4d0 - 1232 */
-	0x1e000048, 0x00000048,			/* 4d8 - 1240 */
-	0x60000008, 0x00000000,			/* 4e0 - 1248 */
-	0x80880000, 0xfffffd18,			/* 4e8 - 1256 */
-	0x60000040, 0x00000000,			/* 4f0 - 1264 */
-	0x7a601000, 0x00000000,			/* 4f8 - 1272 */
-	0x60000008, 0x00000000,			/* 500 - 1280 */
-	0x1f000030, 0x00000030,			/* 508 - 1288 */
-	0x808c0000, 0xfffffd28,			/* 510 - 1296 */
-	0x808c0002, 0xffffffd0,			/* 518 - 1304 */
-	0x808c0001, 0x000001c8,			/* 520 - 1312 */
-	0x98040004, 0x0000ff01,			/* 528 - 1320 */
-	0x88880000, 0x00000190,			/* 530 - 1328 */
-	0x74601000, 0x00000000,			/* 538 - 1336 */
-	0x808c0000, 0xfffffdf8,			/* 540 - 1344 */
-	0x98080000, 0x0000ff04,			/* 548 - 1352 */
-	0x1a000050, 0x00000050,			/* 550 - 1360 */
-	0x80880000, 0xfffffca8,			/* 558 - 1368 */
-	0x1b000058, 0x00000058,			/* 560 - 1376 */
-	0x6a690000, 0x00000000,			/* 568 - 1384 */
-	0x80880000, 0xfffffc90,			/* 570 - 1392 */
-	0x88880000, 0x000000b8,			/* 578 - 1400 */
-	0x7a600800, 0x00000000,			/* 580 - 1408 */
-	0x19000060, 0x00000060,			/* 588 - 1416 */
-	0x7e350100, 0x00000000,			/* 590 - 1424 */
-	0x7e100800, 0x00000000,			/* 598 - 1432 */
-	0x7f110000, 0x00000000,			/* 5a0 - 1440 */
-	0x7f120000, 0x00000000,			/* 5a8 - 1448 */
-	0x7f130000, 0x00000000,			/* 5b0 - 1456 */
-	0x818b0000, 0xffffffc8,			/* 5b8 - 1464 */
-	0x88880000, 0x000000b8,			/* 5c0 - 1472 */
-	0x7c60f700, 0x00000000,			/* 5c8 - 1480 */
-	0x80880000, 0xfffffc30,			/* 5d0 - 1488 */
-	0x88880000, 0x00000058,			/* 5d8 - 1496 */
-	0x7a600800, 0x00000000,			/* 5e0 - 1504 */
-	0x18000060, 0x00000060,			/* 5e8 - 1512 */
-	0x7e350100, 0x00000000,			/* 5f0 - 1520 */
-	0x7e100800, 0x00000000,			/* 5f8 - 1528 */
-	0x7f110000, 0x00000000,			/* 600 - 1536 */
-	0x7f120000, 0x00000000,			/* 608 - 1544 */
-	0x7f130000, 0x00000000,			/* 610 - 1552 */
-	0x808b0000, 0xffffffc8,			/* 618 - 1560 */
-	0x88880000, 0x00000058,			/* 620 - 1568 */
-	0x7c60f700, 0x00000000,			/* 628 - 1576 */
-	0x80880000, 0xfffffbd0,			/* 630 - 1584 */
-	0x72100000, 0x00000000,			/* 638 - 1592 */
-	0x6a5c0000, 0x00000000,			/* 640 - 1600 */
-	0x72110000, 0x00000000,			/* 648 - 1608 */
-	0x6a5d0000, 0x00000000,			/* 650 - 1616 */
-	0x72120000, 0x00000000,			/* 658 - 1624 */
-	0x6a5e0000, 0x00000000,			/* 660 - 1632 */
-	0x72130000, 0x00000000,			/* 668 - 1640 */
-	0x6a5f0000, 0x00000000,			/* 670 - 1648 */
-	0x90080000, 0x00000000,			/* 678 - 1656 */
-	0x725c0000, 0x00000000,			/* 680 - 1664 */
-	0x6a100000, 0x00000000,			/* 688 - 1672 */
-	0x725d0000, 0x00000000,			/* 690 - 1680 */
-	0x6a110000, 0x00000000,			/* 698 - 1688 */
-	0x725e0000, 0x00000000,			/* 6a0 - 1696 */
-	0x6a120000, 0x00000000,			/* 6a8 - 1704 */
-	0x725f0000, 0x00000000,			/* 6b0 - 1712 */
-	0x6a130000, 0x00000000,			/* 6b8 - 1720 */
-	0x90080000, 0x00000000,			/* 6c0 - 1728 */
-	0x7c027f00, 0x00000000,			/* 6c8 - 1736 */
-	0x60000008, 0x00000000,			/* 6d0 - 1744 */
-	0x60000040, 0x00000000,			/* 6d8 - 1752 */
-	0x48000000, 0x00000000,			/* 6e0 - 1760 */
+	0x88880000, 0x000004a8,			/* 240 - 576 */
+	0x72350000, 0x00000000,			/* 248 - 584 */
+	0x808c0000, 0x00000008,			/* 250 - 592 */
+	0xf2340004, 0x00000000,			/* 258 - 600 */
+	0x72690000, 0x00000000,			/* 260 - 608 */
+	0x98040000, 0x0000ff00,			/* 268 - 616 */
+	0x726c0000, 0x00000000,			/* 270 - 624 */
+	0x6a100000, 0x00000000,			/* 278 - 632 */
+	0x726d0000, 0x00000000,			/* 280 - 640 */
+	0x6a110000, 0x00000000,			/* 288 - 648 */
+	0x726e0000, 0x00000000,			/* 290 - 656 */
+	0x6a120000, 0x00000000,			/* 298 - 664 */
+	0x726f0000, 0x00000000,			/* 2a0 - 672 */
+	0x6a130000, 0x00000000,			/* 2a8 - 680 */
+	0xf1340001, 0x00000000,			/* 2b0 - 688 */
+	0x72340000, 0x00000000,			/* 2b8 - 696 */
+	0x80840000, 0xffffffe8,			/* 2c0 - 704 */
+	0xf2600004, 0x00000000,			/* 2c8 - 712 */
+	0x7e6c0400, 0x00000000,			/* 2d0 - 720 */
+	0x7f6d0000, 0x00000000,			/* 2d8 - 728 */
+	0x7f6e0000, 0x00000000,			/* 2e0 - 736 */
+	0x7f6f0000, 0x00000000,			/* 2e8 - 744 */
+	0x7e6a0100, 0x00000000,			/* 2f0 - 752 */
+	0x726a0000, 0x00000000,			/* 2f8 - 760 */
+	0x80840000, 0x00000028,			/* 300 - 768 */
+	0x786cff00, 0x00000000,			/* 308 - 776 */
+	0x786dff00, 0x00000000,			/* 310 - 784 */
+	0x786eff00, 0x00000000,			/* 318 - 792 */
+	0x786fff00, 0x00000000,			/* 320 - 800 */
+	0x786a0000, 0x00000000,			/* 328 - 808 */
+	0xe15c0004, 0x00000000,			/* 330 - 816 */
+	0x7a5c0100, 0x00000000,			/* 338 - 824 */
+	0xe25c0004, 0x00000000,			/* 340 - 832 */
+	0x741a4000, 0x00000000,			/* 348 - 840 */
+	0x72640000, 0x00000000,			/* 350 - 848 */
+	0x6a100000, 0x00000000,			/* 358 - 856 */
+	0x72650000, 0x00000000,			/* 360 - 864 */
+	0x6a110000, 0x00000000,			/* 368 - 872 */
+	0x72660000, 0x00000000,			/* 370 - 880 */
+	0x6a120000, 0x00000000,			/* 378 - 888 */
+	0x72670000, 0x00000000,			/* 380 - 896 */
+	0x6a130000, 0x00000000,			/* 388 - 904 */
+	0xf1100004, 0x00000000,			/* 390 - 912 */
+	0x74100100, 0x00000000,			/* 398 - 920 */
+	0x80840000, 0xfffffc58,			/* 3a0 - 928 */
+	0x74100200, 0x00000000,			/* 3a8 - 936 */
+	0x80840000, 0x00000018,			/* 3b0 - 944 */
+	0xf1600004, 0x00000000,			/* 3b8 - 952 */
+	0x47000028, 0xfffffc60,			/* 3c0 - 960 */
+	0x9e030000, 0x0000ffff,			/* 3c8 - 968 */
+	0x72640000, 0x00000000,			/* 3d0 - 976 */
+	0x6a100000, 0x00000000,			/* 3d8 - 984 */
+	0x72650000, 0x00000000,			/* 3e0 - 992 */
+	0x6a110000, 0x00000000,			/* 3e8 - 1000 */
+	0x72660000, 0x00000000,			/* 3f0 - 1008 */
+	0x6a120000, 0x00000000,			/* 3f8 - 1016 */
+	0x72670000, 0x00000000,			/* 400 - 1024 */
+	0x6a130000, 0x00000000,			/* 408 - 1032 */
+	0x7e680100, 0x00000000,			/* 410 - 1040 */
+	0x7e640400, 0x00000000,			/* 418 - 1048 */
+	0x7f650000, 0x00000000,			/* 420 - 1056 */
+	0x7f660000, 0x00000000,			/* 428 - 1064 */
+	0x7f670000, 0x00000000,			/* 430 - 1072 */
+	0x72680000, 0x00000000,			/* 438 - 1080 */
+	0x80840000, 0x00000028,			/* 440 - 1088 */
+	0x7864ff00, 0x00000000,			/* 448 - 1096 */
+	0x7865ff00, 0x00000000,			/* 450 - 1104 */
+	0x7866ff00, 0x00000000,			/* 458 - 1112 */
+	0x7867ff00, 0x00000000,			/* 460 - 1120 */
+	0x78680000, 0x00000000,			/* 468 - 1128 */
+	0xf15c0004, 0x00000000,			/* 470 - 1136 */
+	0x7a5c0100, 0x00000000,			/* 478 - 1144 */
+	0xf25c0004, 0x00000000,			/* 480 - 1152 */
+	0x745c0200, 0x00000000,			/* 488 - 1160 */
+	0x80840000, 0xfffffeb8,			/* 490 - 1168 */
+	0x7c5cfc00, 0x00000000,			/* 498 - 1176 */
+	0x88880000, 0x00000200,			/* 4a0 - 1184 */
+	0xe15c0004, 0x00000000,			/* 4a8 - 1192 */
+	0x7a5c0200, 0x00000000,			/* 4b0 - 1200 */
+	0xe25c0004, 0x00000000,			/* 4b8 - 1208 */
+	0x80000000, 0x00000000,			/* 4c0 - 1216 */
+	0x78350000, 0x00000000,			/* 4c8 - 1224 */
+	0x7869ff00, 0x00000000,			/* 4d0 - 1232 */
+	0x58000008, 0x00000000,			/* 4d8 - 1240 */
+	0x60000040, 0x00000000,			/* 4e0 - 1248 */
+	0x1e000048, 0x00000048,			/* 4e8 - 1256 */
+	0x60000008, 0x00000000,			/* 4f0 - 1264 */
+	0x80880000, 0xfffffd08,			/* 4f8 - 1272 */
+	0x60000040, 0x00000000,			/* 500 - 1280 */
+	0x7a601000, 0x00000000,			/* 508 - 1288 */
+	0x60000008, 0x00000000,			/* 510 - 1296 */
+	0x1f000030, 0x00000030,			/* 518 - 1304 */
+	0x808c0000, 0xfffffd18,			/* 520 - 1312 */
+	0x808c0002, 0xffffffd0,			/* 528 - 1320 */
+	0x808c0001, 0x000001e0,			/* 530 - 1328 */
+	0x98040004, 0x0000ff01,			/* 538 - 1336 */
+	0x88880000, 0x000001a8,			/* 540 - 1344 */
+	0x74601000, 0x00000000,			/* 548 - 1352 */
+	0x98040000, 0x0000ff04,			/* 550 - 1360 */
+	0x72350000, 0x00000000,			/* 558 - 1368 */
+	0x808c0000, 0xfffffde8,			/* 560 - 1376 */
+	0xf2340004, 0x00000000,			/* 568 - 1384 */
+	0x80880000, 0xfffffdd8,			/* 570 - 1392 */
+	0x1a000050, 0x00000050,			/* 578 - 1400 */
+	0x80880000, 0xfffffc80,			/* 580 - 1408 */
+	0x1b000058, 0x00000058,			/* 588 - 1416 */
+	0x6a690000, 0x00000000,			/* 590 - 1424 */
+	0x80880000, 0xfffffc68,			/* 598 - 1432 */
+	0x88880000, 0x000000b8,			/* 5a0 - 1440 */
+	0x7a600800, 0x00000000,			/* 5a8 - 1448 */
+	0x19000060, 0x00000060,			/* 5b0 - 1456 */
+	0x7e350100, 0x00000000,			/* 5b8 - 1464 */
+	0x7e100800, 0x00000000,			/* 5c0 - 1472 */
+	0x7f110000, 0x00000000,			/* 5c8 - 1480 */
+	0x7f120000, 0x00000000,			/* 5d0 - 1488 */
+	0x7f130000, 0x00000000,			/* 5d8 - 1496 */
+	0x818b0000, 0xffffffc8,			/* 5e0 - 1504 */
+	0x88880000, 0x000000b8,			/* 5e8 - 1512 */
+	0x7c60f700, 0x00000000,			/* 5f0 - 1520 */
+	0x80880000, 0xfffffc08,			/* 5f8 - 1528 */
+	0x88880000, 0x00000058,			/* 600 - 1536 */
+	0x7a600800, 0x00000000,			/* 608 - 1544 */
+	0x18000060, 0x00000060,			/* 610 - 1552 */
+	0x7e350100, 0x00000000,			/* 618 - 1560 */
+	0x7e100800, 0x00000000,			/* 620 - 1568 */
+	0x7f110000, 0x00000000,			/* 628 - 1576 */
+	0x7f120000, 0x00000000,			/* 630 - 1584 */
+	0x7f130000, 0x00000000,			/* 638 - 1592 */
+	0x808b0000, 0xffffffc8,			/* 640 - 1600 */
+	0x88880000, 0x00000058,			/* 648 - 1608 */
+	0x7c60f700, 0x00000000,			/* 650 - 1616 */
+	0x80880000, 0xfffffba8,			/* 658 - 1624 */
+	0x72100000, 0x00000000,			/* 660 - 1632 */
+	0x6a5c0000, 0x00000000,			/* 668 - 1640 */
+	0x72110000, 0x00000000,			/* 670 - 1648 */
+	0x6a5d0000, 0x00000000,			/* 678 - 1656 */
+	0x72120000, 0x00000000,			/* 680 - 1664 */
+	0x6a5e0000, 0x00000000,			/* 688 - 1672 */
+	0x72130000, 0x00000000,			/* 690 - 1680 */
+	0x6a5f0000, 0x00000000,			/* 698 - 1688 */
+	0x90080000, 0x00000000,			/* 6a0 - 1696 */
+	0x725c0000, 0x00000000,			/* 6a8 - 1704 */
+	0x6a100000, 0x00000000,			/* 6b0 - 1712 */
+	0x725d0000, 0x00000000,			/* 6b8 - 1720 */
+	0x6a110000, 0x00000000,			/* 6c0 - 1728 */
+	0x725e0000, 0x00000000,			/* 6c8 - 1736 */
+	0x6a120000, 0x00000000,			/* 6d0 - 1744 */
+	0x725f0000, 0x00000000,			/* 6d8 - 1752 */
+	0x6a130000, 0x00000000,			/* 6e0 - 1760 */
 	0x90080000, 0x00000000,			/* 6e8 - 1768 */
-	0x60000040, 0x00000000,			/* 6f0 - 1776 */
-	0x1f000038, 0x00000038,			/* 6f8 - 1784 */
-	0x98080000, 0x0000ff02,			/* 700 - 1792 */
-	0x60000040, 0x00000000,			/* 708 - 1800 */
-	0x1f000040, 0x00000040,			/* 710 - 1808 */
-	0x98080000, 0x0000ff03,			/* 718 - 1816 */
+	0x7c027f00, 0x00000000,			/* 6f0 - 1776 */
+	0x60000008, 0x00000000,			/* 6f8 - 1784 */
+	0x60000040, 0x00000000,			/* 700 - 1792 */
+	0x48000000, 0x00000000,			/* 708 - 1800 */
+	0x90080000, 0x00000000,			/* 710 - 1808 */
+	0x60000040, 0x00000000,			/* 718 - 1816 */
+	0x1f000038, 0x00000038,			/* 720 - 1824 */
+	0x98080000, 0x0000ff02,			/* 728 - 1832 */
+	0x60000040, 0x00000000,			/* 730 - 1840 */
+	0x1f000040, 0x00000040,			/* 738 - 1848 */
+	0x98080000, 0x0000ff03,			/* 740 - 1856 */
 };
 
 const u_int32_t esiop_led_on[] = {
@@ -274,29 +279,34 @@
 #define	A_cmd_slot_size	0x00000004
 #define	A_ndone_slots	0x00000100
 #define	A_ndone_slots_last	0x00000000
-#define	Ent_cmdr0	0x00000438
-#define	Ent_cmdr1	0x00000440
-#define	Ent_cmdr2	0x00000448
-#define	Ent_cmdr3	0x00000450
-#define	Ent_doner0	0x000002f8
-#define	Ent_doner1	0x00000300
-#define	Ent_doner2	0x00000308
-#define	Ent_doner3	0x00000310
+#define	Ent_cmdr0	0x00000448
+#define	Ent_cmdr1	0x00000450
+#define	Ent_cmdr2	0x00000458
+#define	Ent_cmdr3	0x00000460
+#define	Ent_doner0	0x00000308
+#define	Ent_doner1	0x00000310
+#define	Ent_doner2	0x00000318
+#define	Ent_doner3	0x00000320
 #define	Ent_reselect	0x00000028
-#define	Ent_led_on1	0x000004b0
+#define	Ent_led_on1	0x000004c0
 #define	Ent_led_on2	0x00000050
 #define	Ent_led_off	0x00000040
-#define	Ent_status	0x00000560
-#define	Ent_msgin	0x00000500
+#define	Ent_status	0x00000588
+#define	Ent_msgin	0x00000510
 #define	Ent_msgin_ack	0x00000200
-#define	Ent_get_extmsgdata	0x00000708
-#define	Ent_send_msgout	0x000004c8
-#define	Ent_script_sched	0x00000340
+#define	Ent_get_extmsgdata	0x00000730
+#define	Ent_send_msgout	0x000004d8
+#define	Ent_script_sched	0x00000350
 #define	Ent_load_targtable	0x000000a0
 #define	E_tlq_offset	0x00000000
 u_int32_t E_tlq_offset_Used[] = {
-	0x00000093,
-	0x000000eb,
+	0x000000ef,
+};
+
+#define	E_saved_offset_offset	0x00000000
+u_int32_t E_saved_offset_offset_Used[] = {
+	0x00000097,
+	0x0000015b,
 };
 
 #define	E_abs_msgin2	0x00000000
@@ -310,10 +320,10 @@
 u_int32_t E_abs_sem_Used[] = {
 	0x00000001,
 	0x00000009,
-	0x000000c9,
 	0x000000cd,
-	0x00000127,
+	0x000000d1,
 	0x0000012b,
+	0x0000012f,
 };
 
 #define	A_sem_done	0x00000001
Index: microcode/siop/esiop.ss
===================================================================
RCS file: /cvsroot/src/sys/dev/microcode/siop/esiop.ss,v
retrieving revision 1.19
diff -u -r1.19 esiop.ss
--- microcode/siop/esiop.ss	27 Feb 2005 00:27:29 -0000	1.19
+++ microcode/siop/esiop.ss	17 Nov 2005 17:23:29 -0000
@@ -112,6 +112,7 @@
 ENTRY load_targtable;
 
 EXTERN tlq_offset;
+EXTERN saved_offset_offset;
 EXTERN abs_msgin2;
 
 EXTERN abs_sem; a 32bits word used a semaphore between script and driver
@@ -208,7 +209,11 @@
 
 handle_cmpl:
 	CALL REL(disconnect);
-	STORE NOFLUSH SCRATCHA0, 4, from tlq_offset; save current offset
+; update offset if we did some data transfer
+	MOVE SCRATCHA1 TO SFBR;
+	JUMP REL(handle_cmpl_noxfer), if 0x00;
+	STORE NOFLUSH SCRATCHA0, 4, FROM saved_offset_offset;
+handle_cmpl_noxfer:
 	MOVE SCRATCHE1 to SFBR;
 	INT int_done, IF NOT 0x00; if status is not "done", let host handle it
 	MOVE SCRATCHF0 to SFBR; load pointer in done ring
@@ -344,9 +349,12 @@
 	CALL REL(disconnect)		; disconnect message
 ; if we didn't get sdp, no need to interrupt
 	MOVE SCRATCHC0 & f_c_sdp TO SFBR;
+	INT int_disc, IF not 0x00;
+; update offset if we did some data transfer
+	MOVE SCRATCHA1 TO SFBR;
 	JUMP REL(script_sched), if 0x00;
-; Ok, we need to save data pointers
-	INT int_disc;
+	STORE NOFLUSH SCRATCHA0, 4, FROM saved_offset_offset;
+	JUMP REL(script_sched);
 
 cmdout:
         MOVE FROM t_cmd, WHEN CMD;
Index: microcode/siop/siop.out
===================================================================
RCS file: /cvsroot/src/sys/dev/microcode/siop/siop.out,v
retrieving revision 1.15
diff -u -r1.15 siop.out
--- microcode/siop/siop.out	17 May 2004 18:38:02 -0000	1.15
+++ microcode/siop/siop.out	17 Nov 2005 17:23:29 -0000
@@ -1,19 +1,19 @@
-/*	$NetBSD: siop.out,v 1.15 2004/05/17 18:38:02 bouyer Exp $	*/
+/*	$NetBSD: ncr53cxxx.c,v 1.14 2005/02/11 06:21:22 simonb Exp $	*/
 /*
  *	DO NOT EDIT - this file is automatically generated.
- *	created from siop.ss on Mon May 17 20:37:26 2004
+ *	created from siop.ss on Thu Nov 17 17:43:46 2005
  */
 const u_int32_t siop_script[] = {
 	0x78340000, 0x00000000,			/* 000 -   0 */
 	0x78350000, 0x00000000,			/* 008 -   8 */
 	0x72370000, 0x00000000,			/* 010 -  16 */
 	0x80840020, 0x00000318,			/* 018 -  24 */
-	0x868b0000, 0x00000370,			/* 020 -  32 */
+	0x868b0000, 0x00000380,			/* 020 -  32 */
 	0x878b0000, 0x000002f8,			/* 028 -  40 */
-	0x808b0000, 0x000003f8,			/* 030 -  48 */
-	0x818b0000, 0x00000390,			/* 038 -  56 */
-	0x828b0000, 0x00000368,			/* 040 -  64 */
-	0x838b0000, 0x00000370,			/* 048 -  72 */
+	0x808b0000, 0x00000408,			/* 030 -  48 */
+	0x818b0000, 0x000003a0,			/* 038 -  56 */
+	0x828b0000, 0x00000378,			/* 040 -  64 */
+	0x838b0000, 0x00000380,			/* 048 -  72 */
 	0x98080000, 0x0000ffff,			/* 050 -  80 */
 	0x741a4000, 0x00000000,			/* 058 -  88 */
 	0x980c0000, 0x0000ff83,			/* 060 -  96 */
@@ -107,81 +107,83 @@
 	0x7a340100, 0x00000000,			/* 320 - 800 */
 	0x60000008, 0x00000000,			/* 328 - 808 */
 	0x1f000030, 0x00000030,			/* 330 - 816 */
-	0x808c0000, 0x00000208,			/* 338 - 824 */
+	0x808c0000, 0x00000218,			/* 338 - 824 */
 	0x808c0002, 0xffffffd0,			/* 340 - 832 */
-	0x808c0001, 0x00000208,			/* 348 - 840 */
+	0x808c0001, 0x00000218,			/* 348 - 840 */
 	0x98040004, 0x0000ff01,			/* 350 - 848 */
-	0x88880000, 0x000001c0,			/* 358 - 856 */
+	0x88880000, 0x000001d0,			/* 358 - 856 */
 	0x74340100, 0x00000000,			/* 360 - 864 */
-	0x808c0000, 0xfffffd00,			/* 368 - 872 */
-	0x98080000, 0x0000ff04,			/* 370 - 880 */
-	0x60000040, 0x00000000,			/* 378 - 888 */
-	0x80880000, 0xfffffc98,			/* 380 - 896 */
-	0x58000008, 0x00000000,			/* 388 - 904 */
-	0x60000040, 0x00000000,			/* 390 - 912 */
-	0x1e000048, 0x00000048,			/* 398 - 920 */
-	0x60000008, 0x00000000,			/* 3a0 - 928 */
-	0x80880000, 0xfffffc70,			/* 3a8 - 936 */
-	0x1a000050, 0x00000050,			/* 3b0 - 944 */
+	0x98040000, 0x0000ff04,			/* 368 - 872 */
+	0x72350000, 0x00000000,			/* 370 - 880 */
+	0x808c0000, 0xfffffcf0,			/* 378 - 888 */
+	0x98080000, 0x0000ff05,			/* 380 - 896 */
+	0x60000040, 0x00000000,			/* 388 - 904 */
+	0x80880000, 0xfffffc88,			/* 390 - 912 */
+	0x58000008, 0x00000000,			/* 398 - 920 */
+	0x60000040, 0x00000000,			/* 3a0 - 928 */
+	0x1e000048, 0x00000048,			/* 3a8 - 936 */
+	0x60000008, 0x00000000,			/* 3b0 - 944 */
 	0x80880000, 0xfffffc60,			/* 3b8 - 952 */
-	0x1b000058, 0x00000058,			/* 3c0 - 960 */
+	0x1a000050, 0x00000050,			/* 3c0 - 960 */
 	0x80880000, 0xfffffc50,			/* 3c8 - 968 */
-	0x88880000, 0x000000b8,			/* 3d0 - 976 */
-	0x7a340200, 0x00000000,			/* 3d8 - 984 */
-	0x19000060, 0x00000060,			/* 3e0 - 992 */
-	0x7e350100, 0x00000000,			/* 3e8 - 1000 */
-	0x7e100800, 0x00000000,			/* 3f0 - 1008 */
-	0x7f110000, 0x00000000,			/* 3f8 - 1016 */
-	0x7f120000, 0x00000000,			/* 400 - 1024 */
-	0x7f130000, 0x00000000,			/* 408 - 1032 */
-	0x818b0000, 0xffffffc8,			/* 410 - 1040 */
-	0x88880000, 0x000000b8,			/* 418 - 1048 */
-	0x7c34fd00, 0x00000000,			/* 420 - 1056 */
-	0x80880000, 0xfffffbf0,			/* 428 - 1064 */
-	0x88880000, 0x00000058,			/* 430 - 1072 */
-	0x7a340200, 0x00000000,			/* 438 - 1080 */
-	0x18000060, 0x00000060,			/* 440 - 1088 */
-	0x7e350100, 0x00000000,			/* 448 - 1096 */
-	0x7e100800, 0x00000000,			/* 450 - 1104 */
-	0x7f110000, 0x00000000,			/* 458 - 1112 */
-	0x7f120000, 0x00000000,			/* 460 - 1120 */
-	0x7f130000, 0x00000000,			/* 468 - 1128 */
-	0x808b0000, 0xffffffc8,			/* 470 - 1136 */
-	0x88880000, 0x00000058,			/* 478 - 1144 */
-	0x7c34fd00, 0x00000000,			/* 480 - 1152 */
-	0x80880000, 0xfffffb90,			/* 488 - 1160 */
-	0x72100000, 0x00000000,			/* 490 - 1168 */
-	0x6a5c0000, 0x00000000,			/* 498 - 1176 */
-	0x72110000, 0x00000000,			/* 4a0 - 1184 */
-	0x6a5d0000, 0x00000000,			/* 4a8 - 1192 */
-	0x72120000, 0x00000000,			/* 4b0 - 1200 */
-	0x6a5e0000, 0x00000000,			/* 4b8 - 1208 */
-	0x72130000, 0x00000000,			/* 4c0 - 1216 */
-	0x6a5f0000, 0x00000000,			/* 4c8 - 1224 */
-	0x90080000, 0x00000000,			/* 4d0 - 1232 */
-	0x725c0000, 0x00000000,			/* 4d8 - 1240 */
-	0x6a100000, 0x00000000,			/* 4e0 - 1248 */
-	0x725d0000, 0x00000000,			/* 4e8 - 1256 */
-	0x6a110000, 0x00000000,			/* 4f0 - 1264 */
-	0x725e0000, 0x00000000,			/* 4f8 - 1272 */
-	0x6a120000, 0x00000000,			/* 500 - 1280 */
-	0x725f0000, 0x00000000,			/* 508 - 1288 */
-	0x6a130000, 0x00000000,			/* 510 - 1296 */
-	0x90080000, 0x00000000,			/* 518 - 1304 */
-	0x7c027f00, 0x00000000,			/* 520 - 1312 */
-	0x60000008, 0x00000000,			/* 528 - 1320 */
-	0x60000040, 0x00000000,			/* 530 - 1328 */
-	0x48000000, 0x00000000,			/* 538 - 1336 */
-	0x90080000, 0x00000000,			/* 540 - 1344 */
-	0x88880000, 0xffffffd0,			/* 548 - 1352 */
-	0x98080000, 0x0000ff00,			/* 550 - 1360 */
-	0x60000040, 0x00000000,			/* 558 - 1368 */
-	0x1f000038, 0x00000038,			/* 560 - 1376 */
-	0x98080000, 0x0000ff02,			/* 568 - 1384 */
-	0x60000040, 0x00000000,			/* 570 - 1392 */
-	0x1f000040, 0x00000040,			/* 578 - 1400 */
-	0x98080000, 0x0000ff03,			/* 580 - 1408 */
-	0x80000000, 0x00000000,			/* 588 - 1416 */
+	0x1b000058, 0x00000058,			/* 3d0 - 976 */
+	0x80880000, 0xfffffc40,			/* 3d8 - 984 */
+	0x88880000, 0x000000b8,			/* 3e0 - 992 */
+	0x7a340200, 0x00000000,			/* 3e8 - 1000 */
+	0x19000060, 0x00000060,			/* 3f0 - 1008 */
+	0x7e350100, 0x00000000,			/* 3f8 - 1016 */
+	0x7e100800, 0x00000000,			/* 400 - 1024 */
+	0x7f110000, 0x00000000,			/* 408 - 1032 */
+	0x7f120000, 0x00000000,			/* 410 - 1040 */
+	0x7f130000, 0x00000000,			/* 418 - 1048 */
+	0x818b0000, 0xffffffc8,			/* 420 - 1056 */
+	0x88880000, 0x000000b8,			/* 428 - 1064 */
+	0x7c34fd00, 0x00000000,			/* 430 - 1072 */
+	0x80880000, 0xfffffbe0,			/* 438 - 1080 */
+	0x88880000, 0x00000058,			/* 440 - 1088 */
+	0x7a340200, 0x00000000,			/* 448 - 1096 */
+	0x18000060, 0x00000060,			/* 450 - 1104 */
+	0x7e350100, 0x00000000,			/* 458 - 1112 */
+	0x7e100800, 0x00000000,			/* 460 - 1120 */
+	0x7f110000, 0x00000000,			/* 468 - 1128 */
+	0x7f120000, 0x00000000,			/* 470 - 1136 */
+	0x7f130000, 0x00000000,			/* 478 - 1144 */
+	0x808b0000, 0xffffffc8,			/* 480 - 1152 */
+	0x88880000, 0x00000058,			/* 488 - 1160 */
+	0x7c34fd00, 0x00000000,			/* 490 - 1168 */
+	0x80880000, 0xfffffb80,			/* 498 - 1176 */
+	0x72100000, 0x00000000,			/* 4a0 - 1184 */
+	0x6a5c0000, 0x00000000,			/* 4a8 - 1192 */
+	0x72110000, 0x00000000,			/* 4b0 - 1200 */
+	0x6a5d0000, 0x00000000,			/* 4b8 - 1208 */
+	0x72120000, 0x00000000,			/* 4c0 - 1216 */
+	0x6a5e0000, 0x00000000,			/* 4c8 - 1224 */
+	0x72130000, 0x00000000,			/* 4d0 - 1232 */
+	0x6a5f0000, 0x00000000,			/* 4d8 - 1240 */
+	0x90080000, 0x00000000,			/* 4e0 - 1248 */
+	0x725c0000, 0x00000000,			/* 4e8 - 1256 */
+	0x6a100000, 0x00000000,			/* 4f0 - 1264 */
+	0x725d0000, 0x00000000,			/* 4f8 - 1272 */
+	0x6a110000, 0x00000000,			/* 500 - 1280 */
+	0x725e0000, 0x00000000,			/* 508 - 1288 */
+	0x6a120000, 0x00000000,			/* 510 - 1296 */
+	0x725f0000, 0x00000000,			/* 518 - 1304 */
+	0x6a130000, 0x00000000,			/* 520 - 1312 */
+	0x90080000, 0x00000000,			/* 528 - 1320 */
+	0x7c027f00, 0x00000000,			/* 530 - 1328 */
+	0x60000008, 0x00000000,			/* 538 - 1336 */
+	0x60000040, 0x00000000,			/* 540 - 1344 */
+	0x48000000, 0x00000000,			/* 548 - 1352 */
+	0x90080000, 0x00000000,			/* 550 - 1360 */
+	0x88880000, 0xffffffd0,			/* 558 - 1368 */
+	0x98080000, 0x0000ff00,			/* 560 - 1376 */
+	0x60000040, 0x00000000,			/* 568 - 1384 */
+	0x1f000038, 0x00000038,			/* 570 - 1392 */
+	0x98080000, 0x0000ff02,			/* 578 - 1400 */
+	0x60000040, 0x00000000,			/* 580 - 1408 */
+	0x1f000040, 0x00000040,			/* 588 - 1416 */
+	0x98080000, 0x0000ff03,			/* 590 - 1424 */
+	0x80000000, 0x00000000,			/* 598 - 1432 */
 };
 
 const u_int32_t lun_switch[] = {
@@ -250,6 +252,7 @@
 #define	A_int_extmsgin	0x0000ff02
 #define	A_int_extmsgdata	0x0000ff03
 #define	A_int_disc	0x0000ff04
+#define	A_int_saveoffset	0x0000ff05
 #define	A_int_reseltarg	0x0000ff80
 #define	A_int_resellun	0x0000ff81
 #define	A_int_reseltag	0x0000ff82
@@ -259,24 +262,24 @@
 #define	A_flag_data	0x00000002
 #define	A_flag_data_mask	0x000000fd
 #define	Ent_waitphase	0x00000020
-#define	Ent_send_msgout	0x00000388
-#define	Ent_msgout	0x00000398
+#define	Ent_send_msgout	0x00000398
+#define	Ent_msgout	0x000003a8
 #define	Ent_msgin	0x00000328
 #define	Ent_handle_msgin	0x00000338
-#define	Ent_msgin_ack	0x00000378
-#define	Ent_dataout	0x00000430
-#define	Ent_datain	0x000003d0
-#define	Ent_cmdout	0x000003b0
-#define	Ent_status	0x000003c0
-#define	Ent_disconnect	0x00000520
+#define	Ent_msgin_ack	0x00000388
+#define	Ent_dataout	0x00000440
+#define	Ent_datain	0x000003e0
+#define	Ent_cmdout	0x000003c0
+#define	Ent_status	0x000003d0
+#define	Ent_disconnect	0x00000530
 #define	Ent_reselect	0x000001e0
 #define	Ent_reselected	0x00000000
-#define	Ent_selected	0x00000378
+#define	Ent_selected	0x00000388
 #define	Ent_script_sched	0x00000070
 #define	Ent_script_sched_slot0	0x000000a0
-#define	Ent_get_extmsgdata	0x00000570
+#define	Ent_get_extmsgdata	0x00000580
 #define	Ent_resel_targ0	0x00000238
-#define	Ent_msgin_space	0x00000588
+#define	Ent_msgin_space	0x00000598
 #define	Ent_lunsw_return	0x000002b8
 #define	Ent_led_on1	0x00000068
 #define	Ent_led_on2	0x00000220
Index: microcode/siop/siop.ss
===================================================================
RCS file: /cvsroot/src/sys/dev/microcode/siop/siop.ss,v
retrieving revision 1.19
diff -u -r1.19 siop.ss
--- microcode/siop/siop.ss	27 Feb 2005 00:27:29 -0000	1.19
+++ microcode/siop/siop.ss	17 Nov 2005 17:23:29 -0000
@@ -47,6 +47,7 @@
 ABSOLUTE int_extmsgin	= 0xff02;
 ABSOLUTE int_extmsgdata	= 0xff03;
 ABSOLUTE int_disc	= 0xff04;
+ABSOLUTE int_saveoffset	= 0xff05;
 ; interrupts that don't have a valid DSA
 ABSOLUTE int_reseltarg	= 0xff80;
 ABSOLUTE int_resellun	= 0xff81;
@@ -262,9 +263,12 @@
 	CALL REL(disconnect)                  ; disconnect message;
 ; if we didn't get sdp, no need to interrupt
 	MOVE SCRATCHA0 & flag_sdp TO SFBR;
+	INT int_disc, IF not 0x00;
+; update offset if we did some data transfer
+	MOVE SCRATCHA1 TO SFBR;
 	JUMP REL(script_sched), if 0x00;
-; Ok, we need to save data pointers
-	INT int_disc;
+	INT int_saveoffset;
+
 msgin_ack:
 selected:
 	CLEAR ACK;

--OgqxwSJOaUobr8KG
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment; filename=diff-2

Index: ic/esiop.c
===================================================================
RCS file: /cvsroot/src/sys/dev/ic/esiop.c,v
retrieving revision 1.27.4.5
diff -u -r1.27.4.5 esiop.c
--- ic/esiop.c	16 May 2005 05:15:48 -0000	1.27.4.5
+++ ic/esiop.c	17 Nov 2005 17:28:53 -0000
@@ -253,6 +253,14 @@
 			    sizeof(struct siop_common_xfer));
 		}
 		for (j = 0; j <
+		    (sizeof(E_saved_offset_offset_Used) /
+		     sizeof(E_saved_offset_offset_Used[0]));
+		    j++) {
+			bus_space_write_4(sc->sc_c.sc_ramt, sc->sc_c.sc_ramh,
+			    E_saved_offset_offset_Used[j] * 4,
+			    sizeof(struct siop_common_xfer) + 4);
+		}
+		for (j = 0; j <
 		    (sizeof(E_abs_msgin2_Used) / sizeof(E_abs_msgin2_Used[0]));
 		    j++) {
 			bus_space_write_4(sc->sc_c.sc_ramt, sc->sc_c.sc_ramh,
@@ -291,6 +299,13 @@
 			    htole32(sizeof(struct siop_common_xfer));
 		}
 		for (j = 0; j <
+		    (sizeof(E_saved_offset_offset_Used) /
+		     sizeof(E_saved_offset_offset_Used[0]));
+		    j++) {
+			sc->sc_c.sc_script[E_saved_offset_offset_Used[j]] =
+			    htole32(sizeof(struct siop_common_xfer) + 4);
+		}
+		for (j = 0; j <
 		    (sizeof(E_abs_msgin2_Used) / sizeof(E_abs_msgin2_Used[0]));
 		    j++) {
 			sc->sc_c.sc_script[E_abs_msgin2_Used[j]] =
@@ -1072,6 +1087,9 @@
 			printf("disconnect offset %d\n", offset);
 #endif
 			siop_sdp(&esiop_cmd->cmd_c, offset);
+			/* we start again with no offset */
+			ESIOP_XFER(esiop_cmd, saved_offset) =
+			    htole32(SIOP_NOOFFSET);
 			esiop_table_sync(esiop_cmd,
 			    BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
 			CALL_SCRIPT(Ent_script_sched);
@@ -1126,6 +1144,17 @@
 		esiop_lun->active = NULL;
 	offset = bus_space_read_1(sc->sc_c.sc_rt, sc->sc_c.sc_rh,
 	    SIOP_SCRATCHA + 1);
+	/*
+	 * if we got a disconnect between the last data phase
+	 * and the status phase, offset will be 0. In this
+	 * case, cmd_tables->saved_offset will have the proper value 
+	 * if it got updated by the controller
+	 */
+	if (offset == 0 &&
+	    ESIOP_XFER(esiop_cmd, saved_offset) != htole32(SIOP_NOOFFSET))
+		offset =
+		    (le32toh(ESIOP_XFER(esiop_cmd, saved_offset)) >> 8) & 0xff;
+
 	esiop_scsicmd_end(esiop_cmd, offset);
 	if (freetarget && esiop_target->target_c.status == TARST_PROBING)
 		esiop_del_dev(sc, target, lun);
@@ -1214,7 +1243,7 @@
 	u_int32_t slot;
 	int needsync = 0;
 	int status;
-	u_int32_t sem;
+	u_int32_t sem, offset;
 
 	esiop_script_sync(sc, BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE);
 	sem = esiop_script_read(sc, sc->sc_semoffset);
@@ -1295,10 +1324,15 @@
 		esiop_lun->tactive[tag] = NULL;
 	else
 		esiop_lun->active = NULL;
-	/* scratcha was saved in tlq by script. fetch offset from it */
-	esiop_scsicmd_end(esiop_cmd,
-	    (le32toh(((struct esiop_xfer *)esiop_cmd->cmd_tables)->tlq) >> 8)
-	    & 0xff);
+	/*
+	 * scratcha was eventually saved in saved_offset by script.
+	 * fetch offset from it
+	 */
+	offset = 0;
+	if (ESIOP_XFER(esiop_cmd, saved_offset) != htole32(SIOP_NOOFFSET))
+		offset =
+		    (le32toh(ESIOP_XFER(esiop_cmd, saved_offset)) >> 8) & 0xff;
+	esiop_scsicmd_end(esiop_cmd, offset);
 	goto next;
 }
 
@@ -1604,14 +1638,13 @@
 		else
 			esiop_cmd->cmd_c.tag = -1;
 		siop_setuptables(&esiop_cmd->cmd_c);
-		((struct esiop_xfer *)esiop_cmd->cmd_tables)->tlq =
-		    htole32(A_f_c_target | A_f_c_lun);
-		((struct esiop_xfer *)esiop_cmd->cmd_tables)->tlq |=
+		ESIOP_XFER(esiop_cmd, saved_offset) = htole32(SIOP_NOOFFSET);
+		ESIOP_XFER(esiop_cmd, tlq) = htole32(A_f_c_target | A_f_c_lun);
+		ESIOP_XFER(esiop_cmd, tlq) |=
 		    htole32((target << 8) | (lun << 16));
 		if (esiop_cmd->cmd_c.flags & CMDFL_TAG) {
-			((struct esiop_xfer *)esiop_cmd->cmd_tables)->tlq |=
-			    htole32(A_f_c_tag);
-			((struct esiop_xfer *)esiop_cmd->cmd_tables)->tlq |=
+			ESIOP_XFER(esiop_cmd, tlq) |= htole32(A_f_c_tag);
+			ESIOP_XFER(esiop_cmd, tlq) |=
 			    htole32(esiop_cmd->cmd_c.tag << 24);
 		}
 
@@ -1959,10 +1992,12 @@
 		TAILQ_INSERT_TAIL(&sc->free_list, &newcbd->cmds[i], next);
 		splx(s);
 #ifdef SIOP_DEBUG
-		printf("tables[%d]: in=0x%x out=0x%x status=0x%x\n", i,
+		printf("tables[%d]: in=0x%x out=0x%x status=0x%x "
+		    "offset=0x%x\n", i,
 		    le32toh(newcbd->cmds[i].cmd_tables->t_msgin.addr),
 		    le32toh(newcbd->cmds[i].cmd_tables->t_msgout.addr),
-		    le32toh(newcbd->cmds[i].cmd_tables->t_status.addr));
+		    le32toh(newcbd->cmds[i].cmd_tables->t_status.addr,
+		    le32toh(newcbd->cmds[i].cmd_tables->t_offset.addr));
 #endif
 	}
 	s = splbio();
Index: ic/esiopvar.h
===================================================================
RCS file: /cvsroot/src/sys/dev/ic/esiopvar.h,v
retrieving revision 1.8.4.1
diff -u -r1.8.4.1 esiopvar.h
--- ic/esiopvar.h	11 May 2005 03:19:58 -0000	1.8.4.1
+++ ic/esiopvar.h	17 Nov 2005 17:28:53 -0000
@@ -53,9 +53,11 @@
 struct esiop_xfer {
 	struct siop_common_xfer siop_tables;
 	u_int32_t tlq; /* target/lun/tag loaded in scratchC by script */
-		      /* will also containt scratcha at end of command */
+	u_int32_t saved_offset;/* contains scratchA if script saved an offset */
 } __attribute__((__packed__));
 
+#define ESIOP_XFER(cmd, m) (((struct esiop_xfer *)((cmd)->cmd_tables))->m)
+
 /*
  * This describes a command handled by the SCSI controller
  * These are chained in either a free list or a active list
Index: ic/siop.c
===================================================================
RCS file: /cvsroot/src/sys/dev/ic/siop.c,v
retrieving revision 1.72.4.4
diff -u -r1.72.4.4 siop.c
--- ic/siop.c	11 May 2005 04:06:08 -0000	1.72.4.4
+++ ic/siop.c	17 Nov 2005 17:28:53 -0000
@@ -103,6 +103,7 @@
 static int siop_stat_intr = 0;
 static int siop_stat_intr_shortxfer = 0;
 static int siop_stat_intr_sdp = 0;
+static int siop_stat_intr_saveoffset = 0;
 static int siop_stat_intr_done = 0;
 static int siop_stat_intr_xferdisc = 0;
 static int siop_stat_intr_lunresel = 0;
@@ -911,10 +912,22 @@
 			printf("disconnect offset %d\n", offset);
 #endif
 			siop_sdp(&siop_cmd->cmd_c, offset);
+			/* we start again with no offset */
+			siop_cmd->saved_offset = SIOP_NOOFFSET;
 			siop_table_sync(siop_cmd,
 			    BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
 			CALL_SCRIPT(Ent_script_sched);
 			return 1;
+		case A_int_saveoffset:
+			INCSTAT(siop_stat_intr_saveoffset);
+			offset = bus_space_read_1(sc->sc_c.sc_rt,
+			    sc->sc_c.sc_rh, SIOP_SCRATCHA + 1);
+#ifdef SIOP_DEBUG_DR
+			printf("saveoffset offset %d\n", offset);
+#endif
+			siop_cmd->saved_offset = offset;
+			CALL_SCRIPT(Ent_script_sched);
+			return 1;
 		case A_int_resfail:
 			printf("reselect failed\n");
 			CALL_SCRIPT(Ent_script_sched);
@@ -939,6 +952,15 @@
 			/* update resid.  */
 			offset = bus_space_read_1(sc->sc_c.sc_rt,
 			    sc->sc_c.sc_rh, SIOP_SCRATCHA + 1);
+			/*
+			 * if we got a disconnect between the last data phase
+			 * and the status phase, offset will be 0. In this
+			 * case, siop_cmd->saved_offset will have the proper
+			 * value if it got updated by the controller
+			 */
+			if (offset == 0 && 
+			    siop_cmd->saved_offset != SIOP_NOOFFSET)
+				offset = siop_cmd->saved_offset;
 			siop_update_resid(&siop_cmd->cmd_c, offset);
 			siop_cmd->cmd_c.status = CMDST_DONE;
 			goto end;
@@ -1348,6 +1370,7 @@
 			siop_cmd->cmd_c.tag = 0;
 		}
 		siop_setuptables(&siop_cmd->cmd_c);
+		siop_cmd->saved_offset = SIOP_NOOFFSET;
 		siop_table_sync(siop_cmd,
 		    BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
 		siop_start(sc, siop_cmd);
@@ -1717,10 +1740,12 @@
 		TAILQ_INSERT_TAIL(&sc->free_list, &newcbd->cmds[i], next);
 		splx(s);
 #ifdef SIOP_DEBUG
-		printf("tables[%d]: in=0x%x out=0x%x status=0x%x\n", i,
+		printf("tables[%d]: in=0x%x out=0x%x status=0x%x "
+		    "offset=0x%x\n", i,
 		    le32toh(newcbd->cmds[i].cmd_tables->t_msgin.addr),
 		    le32toh(newcbd->cmds[i].cmd_tables->t_msgout.addr),
-		    le32toh(newcbd->cmds[i].cmd_tables->t_status.addr));
+		    le32toh(newcbd->cmds[i].cmd_tables->t_status.addr),
+		    le32toh(newcbd->cmds[i].cmd_tables->t_offset.addr));
 #endif
 	}
 	s = splbio();
@@ -2002,6 +2027,7 @@
 	printf("siop_stat_intr_shortxfer %d\n", siop_stat_intr_shortxfer);
 	printf("siop_stat_intr_xferdisc %d\n", siop_stat_intr_xferdisc);
 	printf("siop_stat_intr_sdp %d\n", siop_stat_intr_sdp);
+	printf("siop_stat_intr_saveoffset %d\n", siop_stat_intr_saveoffset);
 	printf("siop_stat_intr_done %d\n", siop_stat_intr_done);
 	printf("siop_stat_intr_lunresel %d\n", siop_stat_intr_lunresel);
 	printf("siop_stat_intr_qfull %d\n", siop_stat_intr_qfull);
Index: ic/siopvar.h
===================================================================
RCS file: /cvsroot/src/sys/dev/ic/siopvar.h,v
retrieving revision 1.19
diff -u -r1.19 siopvar.h
--- ic/siopvar.h	2 Nov 2003 11:07:46 -0000	1.19
+++ ic/siopvar.h	17 Nov 2005 17:28:53 -0000
@@ -56,6 +56,7 @@
 	struct siop_common_cmd cmd_c;
 	struct siop_cbd *siop_cbdp; /* pointer to our siop_cbd */
 	int reselslot;
+	u_int32_t saved_offset; /* offset in table after disc without sdp */
 };
 #define cmd_tables cmd_c.siop_tables
 
Index: ic/siopvar_common.h
===================================================================
RCS file: /cvsroot/src/sys/dev/ic/siopvar_common.h,v
retrieving revision 1.27.4.2
diff -u -r1.27.4.2 siopvar_common.h
--- ic/siopvar_common.h	11 May 2005 03:59:14 -0000	1.27.4.2
+++ ic/siopvar_common.h	17 Nov 2005 17:28:53 -0000
@@ -56,7 +56,7 @@
 	u_int8_t msg_out[16];	/* 0 */
 	u_int8_t msg_in[16];	/* 16 */
 	u_int32_t status;	/* 32 */
-	u_int32_t pad1;		/* 36 */
+	u_int32_t pad1; 	/* 36 */
 	u_int32_t id;		/* 40 */
 	u_int32_t pad2;		/* 44 */
 	scr_table_t t_msgin;	/* 48 */
@@ -72,6 +72,9 @@
 #define SCSI_SIOP_NOCHECK	0xfe	/* don't check the scsi status */
 #define SCSI_SIOP_NOSTATUS	0xff	/* device didn't report status */
 
+/* offset is initialised to SIOP_NOOFFSET, used to check if it was updated */
+#define SIOP_NOOFFSET 0xffffffff
+
 /*
  * This describes a command handled by the SCSI controller
  */
Index: microcode/siop/esiop.out
===================================================================
RCS file: /cvsroot/src/sys/dev/microcode/siop/esiop.out,v
retrieving revision 1.11.4.2
diff -u -r1.11.4.2 esiop.out
--- microcode/siop/esiop.out	11 May 2005 03:50:26 -0000	1.11.4.2
+++ microcode/siop/esiop.out	17 Nov 2005 17:28:53 -0000
@@ -1,7 +1,7 @@
-/*	$NetBSD: esiop.out,v 1.11.4.2 2005/05/11 03:50:26 snj Exp $	*/
+/*	$NetBSD: ncr53cxxx.c,v 1.12.2.1 2004/05/20 09:41:26 tron Exp $	*/
 /*
  *	DO NOT EDIT - this file is automatically generated.
- *	created from esiop.ss on Tue May 10 12:49:57 2005
+ *	created from esiop.ss on Thu Nov 17 18:28:34 2005
  */
 const u_int32_t esiop_script[] = {
 	0xe15c0004, 0x00000000,			/* 000 -   0 */
@@ -13,7 +13,7 @@
 	0x78600000, 0x00000000,			/* 030 -  48 */
 	0x7869ff00, 0x00000000,			/* 038 -  56 */
 	0x80000000, 0x00000000,			/* 040 -  64 */
-	0x54000000, 0x000002e8,			/* 048 -  72 */
+	0x54000000, 0x000002f8,			/* 048 -  72 */
 	0x80000000, 0x00000000,			/* 050 -  80 */
 	0x740a0f00, 0x00000000,			/* 058 -  88 */
 	0x6a610000, 0x00000000,			/* 060 -  96 */
@@ -46,12 +46,12 @@
 	0x87830000, 0x000000c8,			/* 138 - 312 */
 	0x0f000001, 0x00000000,			/* 140 - 320 */
 	0x60000040, 0x00000000,			/* 148 - 328 */
-	0x80840020, 0x000003b8,			/* 150 - 336 */
+	0x80840020, 0x000003c8,			/* 150 - 336 */
 	0x0f000001, 0x00000000,			/* 158 - 344 */
 	0x6a360000, 0x00000000,			/* 160 - 352 */
 	0x6a630000, 0x00000000,			/* 168 - 360 */
 	0x7a600400, 0x00000000,			/* 170 - 368 */
-	0x88880000, 0x00000500,			/* 178 - 376 */
+	0x88880000, 0x00000528,			/* 178 - 376 */
 	0x78370000, 0x00000000,			/* 180 - 384 */
 	0x60000400, 0x00000000,			/* 188 - 392 */
 	0x79360000, 0x00000000,			/* 190 - 400 */
@@ -69,169 +69,174 @@
 	0x7f130000, 0x00000000,			/* 1f0 - 496 */
 	0xf1100004, 0x00000000,			/* 1f8 - 504 */
 	0x60000040, 0x00000000,			/* 200 - 512 */
-	0x868b0000, 0x000002c8,			/* 208 - 520 */
-	0x878b0000, 0x000002e8,			/* 210 - 528 */
-	0x808b0000, 0x000003b8,			/* 218 - 536 */
-	0x818b0000, 0x00000350,			/* 220 - 544 */
-	0x828b0000, 0x00000320,			/* 228 - 552 */
-	0x838b0000, 0x00000328,			/* 230 - 560 */
+	0x868b0000, 0x000002d8,			/* 208 - 520 */
+	0x878b0000, 0x000002f8,			/* 210 - 528 */
+	0x808b0000, 0x000003e0,			/* 218 - 536 */
+	0x818b0000, 0x00000378,			/* 220 - 544 */
+	0x828b0000, 0x00000348,			/* 228 - 552 */
+	0x838b0000, 0x00000350,			/* 230 - 560 */
 	0x98080000, 0x0000ffff,			/* 238 - 568 */
-	0x88880000, 0x00000480,			/* 240 - 576 */
-	0xf2340004, 0x00000000,			/* 248 - 584 */
-	0x72690000, 0x00000000,			/* 250 - 592 */
-	0x98040000, 0x0000ff00,			/* 258 - 600 */
-	0x726c0000, 0x00000000,			/* 260 - 608 */
-	0x6a100000, 0x00000000,			/* 268 - 616 */
-	0x726d0000, 0x00000000,			/* 270 - 624 */
-	0x6a110000, 0x00000000,			/* 278 - 632 */
-	0x726e0000, 0x00000000,			/* 280 - 640 */
-	0x6a120000, 0x00000000,			/* 288 - 648 */
-	0x726f0000, 0x00000000,			/* 290 - 656 */
-	0x6a130000, 0x00000000,			/* 298 - 664 */
-	0xf1340001, 0x00000000,			/* 2a0 - 672 */
-	0x72340000, 0x00000000,			/* 2a8 - 680 */
-	0x80840000, 0xffffffe8,			/* 2b0 - 688 */
-	0xf2600004, 0x00000000,			/* 2b8 - 696 */
-	0x7e6c0400, 0x00000000,			/* 2c0 - 704 */
-	0x7f6d0000, 0x00000000,			/* 2c8 - 712 */
-	0x7f6e0000, 0x00000000,			/* 2d0 - 720 */
-	0x7f6f0000, 0x00000000,			/* 2d8 - 728 */
-	0x7e6a0100, 0x00000000,			/* 2e0 - 736 */
-	0x726a0000, 0x00000000,			/* 2e8 - 744 */
-	0x80840000, 0x00000028,			/* 2f0 - 752 */
-	0x786cff00, 0x00000000,			/* 2f8 - 760 */
-	0x786dff00, 0x00000000,			/* 300 - 768 */
-	0x786eff00, 0x00000000,			/* 308 - 776 */
-	0x786fff00, 0x00000000,			/* 310 - 784 */
-	0x786a0000, 0x00000000,			/* 318 - 792 */
-	0xe15c0004, 0x00000000,			/* 320 - 800 */
-	0x7a5c0100, 0x00000000,			/* 328 - 808 */
-	0xe25c0004, 0x00000000,			/* 330 - 816 */
-	0x741a4000, 0x00000000,			/* 338 - 824 */
-	0x72640000, 0x00000000,			/* 340 - 832 */
-	0x6a100000, 0x00000000,			/* 348 - 840 */
-	0x72650000, 0x00000000,			/* 350 - 848 */
-	0x6a110000, 0x00000000,			/* 358 - 856 */
-	0x72660000, 0x00000000,			/* 360 - 864 */
-	0x6a120000, 0x00000000,			/* 368 - 872 */
-	0x72670000, 0x00000000,			/* 370 - 880 */
-	0x6a130000, 0x00000000,			/* 378 - 888 */
-	0xf1100004, 0x00000000,			/* 380 - 896 */
-	0x74100100, 0x00000000,			/* 388 - 904 */
-	0x80840000, 0xfffffc68,			/* 390 - 912 */
-	0x74100200, 0x00000000,			/* 398 - 920 */
-	0x80840000, 0x00000018,			/* 3a0 - 928 */
-	0xf1600004, 0x00000000,			/* 3a8 - 936 */
-	0x47000028, 0xfffffc70,			/* 3b0 - 944 */
-	0x9e030000, 0x0000ffff,			/* 3b8 - 952 */
-	0x72640000, 0x00000000,			/* 3c0 - 960 */
-	0x6a100000, 0x00000000,			/* 3c8 - 968 */
-	0x72650000, 0x00000000,			/* 3d0 - 976 */
-	0x6a110000, 0x00000000,			/* 3d8 - 984 */
-	0x72660000, 0x00000000,			/* 3e0 - 992 */
-	0x6a120000, 0x00000000,			/* 3e8 - 1000 */
-	0x72670000, 0x00000000,			/* 3f0 - 1008 */
-	0x6a130000, 0x00000000,			/* 3f8 - 1016 */
-	0x7e680100, 0x00000000,			/* 400 - 1024 */
-	0x7e640400, 0x00000000,			/* 408 - 1032 */
-	0x7f650000, 0x00000000,			/* 410 - 1040 */
-	0x7f660000, 0x00000000,			/* 418 - 1048 */
-	0x7f670000, 0x00000000,			/* 420 - 1056 */
-	0x72680000, 0x00000000,			/* 428 - 1064 */
-	0x80840000, 0x00000028,			/* 430 - 1072 */
-	0x7864ff00, 0x00000000,			/* 438 - 1080 */
-	0x7865ff00, 0x00000000,			/* 440 - 1088 */
-	0x7866ff00, 0x00000000,			/* 448 - 1096 */
-	0x7867ff00, 0x00000000,			/* 450 - 1104 */
-	0x78680000, 0x00000000,			/* 458 - 1112 */
-	0xf15c0004, 0x00000000,			/* 460 - 1120 */
-	0x7a5c0100, 0x00000000,			/* 468 - 1128 */
-	0xf25c0004, 0x00000000,			/* 470 - 1136 */
-	0x745c0200, 0x00000000,			/* 478 - 1144 */
-	0x80840000, 0xfffffeb8,			/* 480 - 1152 */
-	0x7c5cfc00, 0x00000000,			/* 488 - 1160 */
-	0x88880000, 0x000001e8,			/* 490 - 1168 */
-	0xe15c0004, 0x00000000,			/* 498 - 1176 */
-	0x7a5c0200, 0x00000000,			/* 4a0 - 1184 */
-	0xe25c0004, 0x00000000,			/* 4a8 - 1192 */
-	0x80000000, 0x00000000,			/* 4b0 - 1200 */
-	0x78350000, 0x00000000,			/* 4b8 - 1208 */
-	0x7869ff00, 0x00000000,			/* 4c0 - 1216 */
-	0x58000008, 0x00000000,			/* 4c8 - 1224 */
-	0x60000040, 0x00000000,			/* 4d0 - 1232 */
-	0x1e000048, 0x00000048,			/* 4d8 - 1240 */
-	0x60000008, 0x00000000,			/* 4e0 - 1248 */
-	0x80880000, 0xfffffd18,			/* 4e8 - 1256 */
-	0x60000040, 0x00000000,			/* 4f0 - 1264 */
-	0x7a601000, 0x00000000,			/* 4f8 - 1272 */
-	0x60000008, 0x00000000,			/* 500 - 1280 */
-	0x1f000030, 0x00000030,			/* 508 - 1288 */
-	0x808c0000, 0xfffffd28,			/* 510 - 1296 */
-	0x808c0002, 0xffffffd0,			/* 518 - 1304 */
-	0x808c0001, 0x000001c8,			/* 520 - 1312 */
-	0x98040004, 0x0000ff01,			/* 528 - 1320 */
-	0x88880000, 0x00000190,			/* 530 - 1328 */
-	0x74601000, 0x00000000,			/* 538 - 1336 */
-	0x808c0000, 0xfffffdf8,			/* 540 - 1344 */
-	0x98080000, 0x0000ff04,			/* 548 - 1352 */
-	0x1a000050, 0x00000050,			/* 550 - 1360 */
-	0x80880000, 0xfffffca8,			/* 558 - 1368 */
-	0x1b000058, 0x00000058,			/* 560 - 1376 */
-	0x6a690000, 0x00000000,			/* 568 - 1384 */
-	0x80880000, 0xfffffc90,			/* 570 - 1392 */
-	0x88880000, 0x000000b8,			/* 578 - 1400 */
-	0x7a600800, 0x00000000,			/* 580 - 1408 */
-	0x19000060, 0x00000060,			/* 588 - 1416 */
-	0x7e350100, 0x00000000,			/* 590 - 1424 */
-	0x7e100800, 0x00000000,			/* 598 - 1432 */
-	0x7f110000, 0x00000000,			/* 5a0 - 1440 */
-	0x7f120000, 0x00000000,			/* 5a8 - 1448 */
-	0x7f130000, 0x00000000,			/* 5b0 - 1456 */
-	0x818b0000, 0xffffffc8,			/* 5b8 - 1464 */
-	0x88880000, 0x000000b8,			/* 5c0 - 1472 */
-	0x7c60f700, 0x00000000,			/* 5c8 - 1480 */
-	0x80880000, 0xfffffc30,			/* 5d0 - 1488 */
-	0x88880000, 0x00000058,			/* 5d8 - 1496 */
-	0x7a600800, 0x00000000,			/* 5e0 - 1504 */
-	0x18000060, 0x00000060,			/* 5e8 - 1512 */
-	0x7e350100, 0x00000000,			/* 5f0 - 1520 */
-	0x7e100800, 0x00000000,			/* 5f8 - 1528 */
-	0x7f110000, 0x00000000,			/* 600 - 1536 */
-	0x7f120000, 0x00000000,			/* 608 - 1544 */
-	0x7f130000, 0x00000000,			/* 610 - 1552 */
-	0x808b0000, 0xffffffc8,			/* 618 - 1560 */
-	0x88880000, 0x00000058,			/* 620 - 1568 */
-	0x7c60f700, 0x00000000,			/* 628 - 1576 */
-	0x80880000, 0xfffffbd0,			/* 630 - 1584 */
-	0x72100000, 0x00000000,			/* 638 - 1592 */
-	0x6a5c0000, 0x00000000,			/* 640 - 1600 */
-	0x72110000, 0x00000000,			/* 648 - 1608 */
-	0x6a5d0000, 0x00000000,			/* 650 - 1616 */
-	0x72120000, 0x00000000,			/* 658 - 1624 */
-	0x6a5e0000, 0x00000000,			/* 660 - 1632 */
-	0x72130000, 0x00000000,			/* 668 - 1640 */
-	0x6a5f0000, 0x00000000,			/* 670 - 1648 */
-	0x90080000, 0x00000000,			/* 678 - 1656 */
-	0x725c0000, 0x00000000,			/* 680 - 1664 */
-	0x6a100000, 0x00000000,			/* 688 - 1672 */
-	0x725d0000, 0x00000000,			/* 690 - 1680 */
-	0x6a110000, 0x00000000,			/* 698 - 1688 */
-	0x725e0000, 0x00000000,			/* 6a0 - 1696 */
-	0x6a120000, 0x00000000,			/* 6a8 - 1704 */
-	0x725f0000, 0x00000000,			/* 6b0 - 1712 */
-	0x6a130000, 0x00000000,			/* 6b8 - 1720 */
-	0x90080000, 0x00000000,			/* 6c0 - 1728 */
-	0x7c027f00, 0x00000000,			/* 6c8 - 1736 */
-	0x60000008, 0x00000000,			/* 6d0 - 1744 */
-	0x60000040, 0x00000000,			/* 6d8 - 1752 */
-	0x48000000, 0x00000000,			/* 6e0 - 1760 */
+	0x88880000, 0x000004a8,			/* 240 - 576 */
+	0x72350000, 0x00000000,			/* 248 - 584 */
+	0x808c0000, 0x00000008,			/* 250 - 592 */
+	0xf2340004, 0x00000000,			/* 258 - 600 */
+	0x72690000, 0x00000000,			/* 260 - 608 */
+	0x98040000, 0x0000ff00,			/* 268 - 616 */
+	0x726c0000, 0x00000000,			/* 270 - 624 */
+	0x6a100000, 0x00000000,			/* 278 - 632 */
+	0x726d0000, 0x00000000,			/* 280 - 640 */
+	0x6a110000, 0x00000000,			/* 288 - 648 */
+	0x726e0000, 0x00000000,			/* 290 - 656 */
+	0x6a120000, 0x00000000,			/* 298 - 664 */
+	0x726f0000, 0x00000000,			/* 2a0 - 672 */
+	0x6a130000, 0x00000000,			/* 2a8 - 680 */
+	0xf1340001, 0x00000000,			/* 2b0 - 688 */
+	0x72340000, 0x00000000,			/* 2b8 - 696 */
+	0x80840000, 0xffffffe8,			/* 2c0 - 704 */
+	0xf2600004, 0x00000000,			/* 2c8 - 712 */
+	0x7e6c0400, 0x00000000,			/* 2d0 - 720 */
+	0x7f6d0000, 0x00000000,			/* 2d8 - 728 */
+	0x7f6e0000, 0x00000000,			/* 2e0 - 736 */
+	0x7f6f0000, 0x00000000,			/* 2e8 - 744 */
+	0x7e6a0100, 0x00000000,			/* 2f0 - 752 */
+	0x726a0000, 0x00000000,			/* 2f8 - 760 */
+	0x80840000, 0x00000028,			/* 300 - 768 */
+	0x786cff00, 0x00000000,			/* 308 - 776 */
+	0x786dff00, 0x00000000,			/* 310 - 784 */
+	0x786eff00, 0x00000000,			/* 318 - 792 */
+	0x786fff00, 0x00000000,			/* 320 - 800 */
+	0x786a0000, 0x00000000,			/* 328 - 808 */
+	0xe15c0004, 0x00000000,			/* 330 - 816 */
+	0x7a5c0100, 0x00000000,			/* 338 - 824 */
+	0xe25c0004, 0x00000000,			/* 340 - 832 */
+	0x741a4000, 0x00000000,			/* 348 - 840 */
+	0x72640000, 0x00000000,			/* 350 - 848 */
+	0x6a100000, 0x00000000,			/* 358 - 856 */
+	0x72650000, 0x00000000,			/* 360 - 864 */
+	0x6a110000, 0x00000000,			/* 368 - 872 */
+	0x72660000, 0x00000000,			/* 370 - 880 */
+	0x6a120000, 0x00000000,			/* 378 - 888 */
+	0x72670000, 0x00000000,			/* 380 - 896 */
+	0x6a130000, 0x00000000,			/* 388 - 904 */
+	0xf1100004, 0x00000000,			/* 390 - 912 */
+	0x74100100, 0x00000000,			/* 398 - 920 */
+	0x80840000, 0xfffffc58,			/* 3a0 - 928 */
+	0x74100200, 0x00000000,			/* 3a8 - 936 */
+	0x80840000, 0x00000018,			/* 3b0 - 944 */
+	0xf1600004, 0x00000000,			/* 3b8 - 952 */
+	0x47000028, 0xfffffc60,			/* 3c0 - 960 */
+	0x9e030000, 0x0000ffff,			/* 3c8 - 968 */
+	0x72640000, 0x00000000,			/* 3d0 - 976 */
+	0x6a100000, 0x00000000,			/* 3d8 - 984 */
+	0x72650000, 0x00000000,			/* 3e0 - 992 */
+	0x6a110000, 0x00000000,			/* 3e8 - 1000 */
+	0x72660000, 0x00000000,			/* 3f0 - 1008 */
+	0x6a120000, 0x00000000,			/* 3f8 - 1016 */
+	0x72670000, 0x00000000,			/* 400 - 1024 */
+	0x6a130000, 0x00000000,			/* 408 - 1032 */
+	0x7e680100, 0x00000000,			/* 410 - 1040 */
+	0x7e640400, 0x00000000,			/* 418 - 1048 */
+	0x7f650000, 0x00000000,			/* 420 - 1056 */
+	0x7f660000, 0x00000000,			/* 428 - 1064 */
+	0x7f670000, 0x00000000,			/* 430 - 1072 */
+	0x72680000, 0x00000000,			/* 438 - 1080 */
+	0x80840000, 0x00000028,			/* 440 - 1088 */
+	0x7864ff00, 0x00000000,			/* 448 - 1096 */
+	0x7865ff00, 0x00000000,			/* 450 - 1104 */
+	0x7866ff00, 0x00000000,			/* 458 - 1112 */
+	0x7867ff00, 0x00000000,			/* 460 - 1120 */
+	0x78680000, 0x00000000,			/* 468 - 1128 */
+	0xf15c0004, 0x00000000,			/* 470 - 1136 */
+	0x7a5c0100, 0x00000000,			/* 478 - 1144 */
+	0xf25c0004, 0x00000000,			/* 480 - 1152 */
+	0x745c0200, 0x00000000,			/* 488 - 1160 */
+	0x80840000, 0xfffffeb8,			/* 490 - 1168 */
+	0x7c5cfc00, 0x00000000,			/* 498 - 1176 */
+	0x88880000, 0x00000200,			/* 4a0 - 1184 */
+	0xe15c0004, 0x00000000,			/* 4a8 - 1192 */
+	0x7a5c0200, 0x00000000,			/* 4b0 - 1200 */
+	0xe25c0004, 0x00000000,			/* 4b8 - 1208 */
+	0x80000000, 0x00000000,			/* 4c0 - 1216 */
+	0x78350000, 0x00000000,			/* 4c8 - 1224 */
+	0x7869ff00, 0x00000000,			/* 4d0 - 1232 */
+	0x58000008, 0x00000000,			/* 4d8 - 1240 */
+	0x60000040, 0x00000000,			/* 4e0 - 1248 */
+	0x1e000048, 0x00000048,			/* 4e8 - 1256 */
+	0x60000008, 0x00000000,			/* 4f0 - 1264 */
+	0x80880000, 0xfffffd08,			/* 4f8 - 1272 */
+	0x60000040, 0x00000000,			/* 500 - 1280 */
+	0x7a601000, 0x00000000,			/* 508 - 1288 */
+	0x60000008, 0x00000000,			/* 510 - 1296 */
+	0x1f000030, 0x00000030,			/* 518 - 1304 */
+	0x808c0000, 0xfffffd18,			/* 520 - 1312 */
+	0x808c0002, 0xffffffd0,			/* 528 - 1320 */
+	0x808c0001, 0x000001e0,			/* 530 - 1328 */
+	0x98040004, 0x0000ff01,			/* 538 - 1336 */
+	0x88880000, 0x000001a8,			/* 540 - 1344 */
+	0x74601000, 0x00000000,			/* 548 - 1352 */
+	0x98040000, 0x0000ff04,			/* 550 - 1360 */
+	0x72350000, 0x00000000,			/* 558 - 1368 */
+	0x808c0000, 0xfffffde8,			/* 560 - 1376 */
+	0xf2340004, 0x00000000,			/* 568 - 1384 */
+	0x80880000, 0xfffffdd8,			/* 570 - 1392 */
+	0x1a000050, 0x00000050,			/* 578 - 1400 */
+	0x80880000, 0xfffffc80,			/* 580 - 1408 */
+	0x1b000058, 0x00000058,			/* 588 - 1416 */
+	0x6a690000, 0x00000000,			/* 590 - 1424 */
+	0x80880000, 0xfffffc68,			/* 598 - 1432 */
+	0x88880000, 0x000000b8,			/* 5a0 - 1440 */
+	0x7a600800, 0x00000000,			/* 5a8 - 1448 */
+	0x19000060, 0x00000060,			/* 5b0 - 1456 */
+	0x7e350100, 0x00000000,			/* 5b8 - 1464 */
+	0x7e100800, 0x00000000,			/* 5c0 - 1472 */
+	0x7f110000, 0x00000000,			/* 5c8 - 1480 */
+	0x7f120000, 0x00000000,			/* 5d0 - 1488 */
+	0x7f130000, 0x00000000,			/* 5d8 - 1496 */
+	0x818b0000, 0xffffffc8,			/* 5e0 - 1504 */
+	0x88880000, 0x000000b8,			/* 5e8 - 1512 */
+	0x7c60f700, 0x00000000,			/* 5f0 - 1520 */
+	0x80880000, 0xfffffc08,			/* 5f8 - 1528 */
+	0x88880000, 0x00000058,			/* 600 - 1536 */
+	0x7a600800, 0x00000000,			/* 608 - 1544 */
+	0x18000060, 0x00000060,			/* 610 - 1552 */
+	0x7e350100, 0x00000000,			/* 618 - 1560 */
+	0x7e100800, 0x00000000,			/* 620 - 1568 */
+	0x7f110000, 0x00000000,			/* 628 - 1576 */
+	0x7f120000, 0x00000000,			/* 630 - 1584 */
+	0x7f130000, 0x00000000,			/* 638 - 1592 */
+	0x808b0000, 0xffffffc8,			/* 640 - 1600 */
+	0x88880000, 0x00000058,			/* 648 - 1608 */
+	0x7c60f700, 0x00000000,			/* 650 - 1616 */
+	0x80880000, 0xfffffba8,			/* 658 - 1624 */
+	0x72100000, 0x00000000,			/* 660 - 1632 */
+	0x6a5c0000, 0x00000000,			/* 668 - 1640 */
+	0x72110000, 0x00000000,			/* 670 - 1648 */
+	0x6a5d0000, 0x00000000,			/* 678 - 1656 */
+	0x72120000, 0x00000000,			/* 680 - 1664 */
+	0x6a5e0000, 0x00000000,			/* 688 - 1672 */
+	0x72130000, 0x00000000,			/* 690 - 1680 */
+	0x6a5f0000, 0x00000000,			/* 698 - 1688 */
+	0x90080000, 0x00000000,			/* 6a0 - 1696 */
+	0x725c0000, 0x00000000,			/* 6a8 - 1704 */
+	0x6a100000, 0x00000000,			/* 6b0 - 1712 */
+	0x725d0000, 0x00000000,			/* 6b8 - 1720 */
+	0x6a110000, 0x00000000,			/* 6c0 - 1728 */
+	0x725e0000, 0x00000000,			/* 6c8 - 1736 */
+	0x6a120000, 0x00000000,			/* 6d0 - 1744 */
+	0x725f0000, 0x00000000,			/* 6d8 - 1752 */
+	0x6a130000, 0x00000000,			/* 6e0 - 1760 */
 	0x90080000, 0x00000000,			/* 6e8 - 1768 */
-	0x60000040, 0x00000000,			/* 6f0 - 1776 */
-	0x1f000038, 0x00000038,			/* 6f8 - 1784 */
-	0x98080000, 0x0000ff02,			/* 700 - 1792 */
-	0x60000040, 0x00000000,			/* 708 - 1800 */
-	0x1f000040, 0x00000040,			/* 710 - 1808 */
-	0x98080000, 0x0000ff03,			/* 718 - 1816 */
+	0x7c027f00, 0x00000000,			/* 6f0 - 1776 */
+	0x60000008, 0x00000000,			/* 6f8 - 1784 */
+	0x60000040, 0x00000000,			/* 700 - 1792 */
+	0x48000000, 0x00000000,			/* 708 - 1800 */
+	0x90080000, 0x00000000,			/* 710 - 1808 */
+	0x60000040, 0x00000000,			/* 718 - 1816 */
+	0x1f000038, 0x00000038,			/* 720 - 1824 */
+	0x98080000, 0x0000ff02,			/* 728 - 1832 */
+	0x60000040, 0x00000000,			/* 730 - 1840 */
+	0x1f000040, 0x00000040,			/* 738 - 1848 */
+	0x98080000, 0x0000ff03,			/* 740 - 1856 */
 };
 
 const u_int32_t esiop_led_on[] = {
@@ -274,29 +279,34 @@
 #define	A_cmd_slot_size	0x00000004
 #define	A_ndone_slots	0x00000100
 #define	A_ndone_slots_last	0x00000000
-#define	Ent_cmdr0	0x00000438
-#define	Ent_cmdr1	0x00000440
-#define	Ent_cmdr2	0x00000448
-#define	Ent_cmdr3	0x00000450
-#define	Ent_doner0	0x000002f8
-#define	Ent_doner1	0x00000300
-#define	Ent_doner2	0x00000308
-#define	Ent_doner3	0x00000310
+#define	Ent_cmdr0	0x00000448
+#define	Ent_cmdr1	0x00000450
+#define	Ent_cmdr2	0x00000458
+#define	Ent_cmdr3	0x00000460
+#define	Ent_doner0	0x00000308
+#define	Ent_doner1	0x00000310
+#define	Ent_doner2	0x00000318
+#define	Ent_doner3	0x00000320
 #define	Ent_reselect	0x00000028
-#define	Ent_led_on1	0x000004b0
+#define	Ent_led_on1	0x000004c0
 #define	Ent_led_on2	0x00000050
 #define	Ent_led_off	0x00000040
-#define	Ent_status	0x00000560
-#define	Ent_msgin	0x00000500
+#define	Ent_status	0x00000588
+#define	Ent_msgin	0x00000510
 #define	Ent_msgin_ack	0x00000200
-#define	Ent_get_extmsgdata	0x00000708
-#define	Ent_send_msgout	0x000004c8
-#define	Ent_script_sched	0x00000340
+#define	Ent_get_extmsgdata	0x00000730
+#define	Ent_send_msgout	0x000004d8
+#define	Ent_script_sched	0x00000350
 #define	Ent_load_targtable	0x000000a0
 #define	E_tlq_offset	0x00000000
 u_int32_t E_tlq_offset_Used[] = {
-	0x00000093,
-	0x000000eb,
+	0x000000ef,
+};
+
+#define	E_saved_offset_offset	0x00000000
+u_int32_t E_saved_offset_offset_Used[] = {
+	0x00000097,
+	0x0000015b,
 };
 
 #define	E_abs_msgin2	0x00000000
@@ -310,10 +320,10 @@
 u_int32_t E_abs_sem_Used[] = {
 	0x00000001,
 	0x00000009,
-	0x000000c9,
 	0x000000cd,
-	0x00000127,
+	0x000000d1,
 	0x0000012b,
+	0x0000012f,
 };
 
 #define	A_sem_done	0x00000001
Index: microcode/siop/esiop.ss
===================================================================
RCS file: /cvsroot/src/sys/dev/microcode/siop/esiop.ss,v
retrieving revision 1.16.4.2
diff -u -r1.16.4.2 esiop.ss
--- microcode/siop/esiop.ss	11 May 2005 03:48:47 -0000	1.16.4.2
+++ microcode/siop/esiop.ss	17 Nov 2005 17:28:53 -0000
@@ -112,6 +112,7 @@
 ENTRY load_targtable;
 
 EXTERN tlq_offset;
+EXTERN saved_offset_offset;
 EXTERN abs_msgin2;
 
 EXTERN abs_sem; a 32bits word used a semaphore between script and driver
@@ -208,7 +209,11 @@
 
 handle_cmpl:
 	CALL REL(disconnect);
-	STORE NOFLUSH SCRATCHA0, 4, from tlq_offset; save current offset
+; update offset if we did some data transfer
+	MOVE SCRATCHA1 TO SFBR;
+	JUMP REL(handle_cmpl_noxfer), if 0x00;
+	STORE NOFLUSH SCRATCHA0, 4, FROM saved_offset_offset;
+handle_cmpl_noxfer:
 	MOVE SCRATCHE1 to SFBR;
 	INT int_done, IF NOT 0x00; if status is not "done", let host handle it
 	MOVE SCRATCHF0 to SFBR; load pointer in done ring
@@ -344,9 +349,12 @@
 	CALL REL(disconnect)		; disconnect message
 ; if we didn't get sdp, no need to interrupt
 	MOVE SCRATCHC0 & f_c_sdp TO SFBR;
+	INT int_disc, IF not 0x00;
+; update offset if we did some data transfer
+	MOVE SCRATCHA1 TO SFBR;
 	JUMP REL(script_sched), if 0x00;
-; Ok, we need to save data pointers
-	INT int_disc;
+	STORE NOFLUSH SCRATCHA0, 4, FROM saved_offset_offset;
+	JUMP REL(script_sched);
 
 cmdout:
         MOVE FROM t_cmd, WHEN CMD; 
Index: microcode/siop/siop.out
===================================================================
RCS file: /cvsroot/src/sys/dev/microcode/siop/siop.out,v
retrieving revision 1.14.14.1
diff -u -r1.14.14.1 siop.out
--- microcode/siop/siop.out	11 May 2005 03:50:26 -0000	1.14.14.1
+++ microcode/siop/siop.out	17 Nov 2005 17:28:53 -0000
@@ -1,19 +1,19 @@
-/*	$NetBSD: siop.out,v 1.14.14.1 2005/05/11 03:50:26 snj Exp $	*/
+/*	$NetBSD: ncr53cxxx.c,v 1.12.2.1 2004/05/20 09:41:26 tron Exp $	*/
 /*
  *	DO NOT EDIT - this file is automatically generated.
- *	created from siop.ss on Tue May 10 12:46:01 2005
+ *	created from siop.ss on Thu Nov 17 18:28:18 2005
  */
 const u_int32_t siop_script[] = {
 	0x78340000, 0x00000000,			/* 000 -   0 */
 	0x78350000, 0x00000000,			/* 008 -   8 */
 	0x72370000, 0x00000000,			/* 010 -  16 */
 	0x80840020, 0x00000318,			/* 018 -  24 */
-	0x868b0000, 0x00000370,			/* 020 -  32 */
+	0x868b0000, 0x00000380,			/* 020 -  32 */
 	0x878b0000, 0x000002f8,			/* 028 -  40 */
-	0x808b0000, 0x000003f8,			/* 030 -  48 */
-	0x818b0000, 0x00000390,			/* 038 -  56 */
-	0x828b0000, 0x00000368,			/* 040 -  64 */
-	0x838b0000, 0x00000370,			/* 048 -  72 */
+	0x808b0000, 0x00000408,			/* 030 -  48 */
+	0x818b0000, 0x000003a0,			/* 038 -  56 */
+	0x828b0000, 0x00000378,			/* 040 -  64 */
+	0x838b0000, 0x00000380,			/* 048 -  72 */
 	0x98080000, 0x0000ffff,			/* 050 -  80 */
 	0x741a4000, 0x00000000,			/* 058 -  88 */
 	0x980c0000, 0x0000ff83,			/* 060 -  96 */
@@ -107,81 +107,83 @@
 	0x7a340100, 0x00000000,			/* 320 - 800 */
 	0x60000008, 0x00000000,			/* 328 - 808 */
 	0x1f000030, 0x00000030,			/* 330 - 816 */
-	0x808c0000, 0x00000208,			/* 338 - 824 */
+	0x808c0000, 0x00000218,			/* 338 - 824 */
 	0x808c0002, 0xffffffd0,			/* 340 - 832 */
-	0x808c0001, 0x00000208,			/* 348 - 840 */
+	0x808c0001, 0x00000218,			/* 348 - 840 */
 	0x98040004, 0x0000ff01,			/* 350 - 848 */
-	0x88880000, 0x000001c0,			/* 358 - 856 */
+	0x88880000, 0x000001d0,			/* 358 - 856 */
 	0x74340100, 0x00000000,			/* 360 - 864 */
-	0x808c0000, 0xfffffd00,			/* 368 - 872 */
-	0x98080000, 0x0000ff04,			/* 370 - 880 */
-	0x60000040, 0x00000000,			/* 378 - 888 */
-	0x80880000, 0xfffffc98,			/* 380 - 896 */
-	0x58000008, 0x00000000,			/* 388 - 904 */
-	0x60000040, 0x00000000,			/* 390 - 912 */
-	0x1e000048, 0x00000048,			/* 398 - 920 */
-	0x60000008, 0x00000000,			/* 3a0 - 928 */
-	0x80880000, 0xfffffc70,			/* 3a8 - 936 */
-	0x1a000050, 0x00000050,			/* 3b0 - 944 */
+	0x98040000, 0x0000ff04,			/* 368 - 872 */
+	0x72350000, 0x00000000,			/* 370 - 880 */
+	0x808c0000, 0xfffffcf0,			/* 378 - 888 */
+	0x98080000, 0x0000ff05,			/* 380 - 896 */
+	0x60000040, 0x00000000,			/* 388 - 904 */
+	0x80880000, 0xfffffc88,			/* 390 - 912 */
+	0x58000008, 0x00000000,			/* 398 - 920 */
+	0x60000040, 0x00000000,			/* 3a0 - 928 */
+	0x1e000048, 0x00000048,			/* 3a8 - 936 */
+	0x60000008, 0x00000000,			/* 3b0 - 944 */
 	0x80880000, 0xfffffc60,			/* 3b8 - 952 */
-	0x1b000058, 0x00000058,			/* 3c0 - 960 */
+	0x1a000050, 0x00000050,			/* 3c0 - 960 */
 	0x80880000, 0xfffffc50,			/* 3c8 - 968 */
-	0x88880000, 0x000000b8,			/* 3d0 - 976 */
-	0x7a340200, 0x00000000,			/* 3d8 - 984 */
-	0x19000060, 0x00000060,			/* 3e0 - 992 */
-	0x7e350100, 0x00000000,			/* 3e8 - 1000 */
-	0x7e100800, 0x00000000,			/* 3f0 - 1008 */
-	0x7f110000, 0x00000000,			/* 3f8 - 1016 */
-	0x7f120000, 0x00000000,			/* 400 - 1024 */
-	0x7f130000, 0x00000000,			/* 408 - 1032 */
-	0x818b0000, 0xffffffc8,			/* 410 - 1040 */
-	0x88880000, 0x000000b8,			/* 418 - 1048 */
-	0x7c34fd00, 0x00000000,			/* 420 - 1056 */
-	0x80880000, 0xfffffbf0,			/* 428 - 1064 */
-	0x88880000, 0x00000058,			/* 430 - 1072 */
-	0x7a340200, 0x00000000,			/* 438 - 1080 */
-	0x18000060, 0x00000060,			/* 440 - 1088 */
-	0x7e350100, 0x00000000,			/* 448 - 1096 */
-	0x7e100800, 0x00000000,			/* 450 - 1104 */
-	0x7f110000, 0x00000000,			/* 458 - 1112 */
-	0x7f120000, 0x00000000,			/* 460 - 1120 */
-	0x7f130000, 0x00000000,			/* 468 - 1128 */
-	0x808b0000, 0xffffffc8,			/* 470 - 1136 */
-	0x88880000, 0x00000058,			/* 478 - 1144 */
-	0x7c34fd00, 0x00000000,			/* 480 - 1152 */
-	0x80880000, 0xfffffb90,			/* 488 - 1160 */
-	0x72100000, 0x00000000,			/* 490 - 1168 */
-	0x6a5c0000, 0x00000000,			/* 498 - 1176 */
-	0x72110000, 0x00000000,			/* 4a0 - 1184 */
-	0x6a5d0000, 0x00000000,			/* 4a8 - 1192 */
-	0x72120000, 0x00000000,			/* 4b0 - 1200 */
-	0x6a5e0000, 0x00000000,			/* 4b8 - 1208 */
-	0x72130000, 0x00000000,			/* 4c0 - 1216 */
-	0x6a5f0000, 0x00000000,			/* 4c8 - 1224 */
-	0x90080000, 0x00000000,			/* 4d0 - 1232 */
-	0x725c0000, 0x00000000,			/* 4d8 - 1240 */
-	0x6a100000, 0x00000000,			/* 4e0 - 1248 */
-	0x725d0000, 0x00000000,			/* 4e8 - 1256 */
-	0x6a110000, 0x00000000,			/* 4f0 - 1264 */
-	0x725e0000, 0x00000000,			/* 4f8 - 1272 */
-	0x6a120000, 0x00000000,			/* 500 - 1280 */
-	0x725f0000, 0x00000000,			/* 508 - 1288 */
-	0x6a130000, 0x00000000,			/* 510 - 1296 */
-	0x90080000, 0x00000000,			/* 518 - 1304 */
-	0x7c027f00, 0x00000000,			/* 520 - 1312 */
-	0x60000008, 0x00000000,			/* 528 - 1320 */
-	0x60000040, 0x00000000,			/* 530 - 1328 */
-	0x48000000, 0x00000000,			/* 538 - 1336 */
-	0x90080000, 0x00000000,			/* 540 - 1344 */
-	0x88880000, 0xffffffd0,			/* 548 - 1352 */
-	0x98080000, 0x0000ff00,			/* 550 - 1360 */
-	0x60000040, 0x00000000,			/* 558 - 1368 */
-	0x1f000038, 0x00000038,			/* 560 - 1376 */
-	0x98080000, 0x0000ff02,			/* 568 - 1384 */
-	0x60000040, 0x00000000,			/* 570 - 1392 */
-	0x1f000040, 0x00000040,			/* 578 - 1400 */
-	0x98080000, 0x0000ff03,			/* 580 - 1408 */
-	0x80000000, 0x00000000,			/* 588 - 1416 */
+	0x1b000058, 0x00000058,			/* 3d0 - 976 */
+	0x80880000, 0xfffffc40,			/* 3d8 - 984 */
+	0x88880000, 0x000000b8,			/* 3e0 - 992 */
+	0x7a340200, 0x00000000,			/* 3e8 - 1000 */
+	0x19000060, 0x00000060,			/* 3f0 - 1008 */
+	0x7e350100, 0x00000000,			/* 3f8 - 1016 */
+	0x7e100800, 0x00000000,			/* 400 - 1024 */
+	0x7f110000, 0x00000000,			/* 408 - 1032 */
+	0x7f120000, 0x00000000,			/* 410 - 1040 */
+	0x7f130000, 0x00000000,			/* 418 - 1048 */
+	0x818b0000, 0xffffffc8,			/* 420 - 1056 */
+	0x88880000, 0x000000b8,			/* 428 - 1064 */
+	0x7c34fd00, 0x00000000,			/* 430 - 1072 */
+	0x80880000, 0xfffffbe0,			/* 438 - 1080 */
+	0x88880000, 0x00000058,			/* 440 - 1088 */
+	0x7a340200, 0x00000000,			/* 448 - 1096 */
+	0x18000060, 0x00000060,			/* 450 - 1104 */
+	0x7e350100, 0x00000000,			/* 458 - 1112 */
+	0x7e100800, 0x00000000,			/* 460 - 1120 */
+	0x7f110000, 0x00000000,			/* 468 - 1128 */
+	0x7f120000, 0x00000000,			/* 470 - 1136 */
+	0x7f130000, 0x00000000,			/* 478 - 1144 */
+	0x808b0000, 0xffffffc8,			/* 480 - 1152 */
+	0x88880000, 0x00000058,			/* 488 - 1160 */
+	0x7c34fd00, 0x00000000,			/* 490 - 1168 */
+	0x80880000, 0xfffffb80,			/* 498 - 1176 */
+	0x72100000, 0x00000000,			/* 4a0 - 1184 */
+	0x6a5c0000, 0x00000000,			/* 4a8 - 1192 */
+	0x72110000, 0x00000000,			/* 4b0 - 1200 */
+	0x6a5d0000, 0x00000000,			/* 4b8 - 1208 */
+	0x72120000, 0x00000000,			/* 4c0 - 1216 */
+	0x6a5e0000, 0x00000000,			/* 4c8 - 1224 */
+	0x72130000, 0x00000000,			/* 4d0 - 1232 */
+	0x6a5f0000, 0x00000000,			/* 4d8 - 1240 */
+	0x90080000, 0x00000000,			/* 4e0 - 1248 */
+	0x725c0000, 0x00000000,			/* 4e8 - 1256 */
+	0x6a100000, 0x00000000,			/* 4f0 - 1264 */
+	0x725d0000, 0x00000000,			/* 4f8 - 1272 */
+	0x6a110000, 0x00000000,			/* 500 - 1280 */
+	0x725e0000, 0x00000000,			/* 508 - 1288 */
+	0x6a120000, 0x00000000,			/* 510 - 1296 */
+	0x725f0000, 0x00000000,			/* 518 - 1304 */
+	0x6a130000, 0x00000000,			/* 520 - 1312 */
+	0x90080000, 0x00000000,			/* 528 - 1320 */
+	0x7c027f00, 0x00000000,			/* 530 - 1328 */
+	0x60000008, 0x00000000,			/* 538 - 1336 */
+	0x60000040, 0x00000000,			/* 540 - 1344 */
+	0x48000000, 0x00000000,			/* 548 - 1352 */
+	0x90080000, 0x00000000,			/* 550 - 1360 */
+	0x88880000, 0xffffffd0,			/* 558 - 1368 */
+	0x98080000, 0x0000ff00,			/* 560 - 1376 */
+	0x60000040, 0x00000000,			/* 568 - 1384 */
+	0x1f000038, 0x00000038,			/* 570 - 1392 */
+	0x98080000, 0x0000ff02,			/* 578 - 1400 */
+	0x60000040, 0x00000000,			/* 580 - 1408 */
+	0x1f000040, 0x00000040,			/* 588 - 1416 */
+	0x98080000, 0x0000ff03,			/* 590 - 1424 */
+	0x80000000, 0x00000000,			/* 598 - 1432 */
 };
 
 const u_int32_t lun_switch[] = {
@@ -250,6 +252,7 @@
 #define	A_int_extmsgin	0x0000ff02
 #define	A_int_extmsgdata	0x0000ff03
 #define	A_int_disc	0x0000ff04
+#define	A_int_saveoffset	0x0000ff05
 #define	A_int_reseltarg	0x0000ff80
 #define	A_int_resellun	0x0000ff81
 #define	A_int_reseltag	0x0000ff82
@@ -259,24 +262,24 @@
 #define	A_flag_data	0x00000002
 #define	A_flag_data_mask	0x000000fd
 #define	Ent_waitphase	0x00000020
-#define	Ent_send_msgout	0x00000388
-#define	Ent_msgout	0x00000398
+#define	Ent_send_msgout	0x00000398
+#define	Ent_msgout	0x000003a8
 #define	Ent_msgin	0x00000328
 #define	Ent_handle_msgin	0x00000338
-#define	Ent_msgin_ack	0x00000378
-#define	Ent_dataout	0x00000430
-#define	Ent_datain	0x000003d0
-#define	Ent_cmdout	0x000003b0
-#define	Ent_status	0x000003c0
-#define	Ent_disconnect	0x00000520
+#define	Ent_msgin_ack	0x00000388
+#define	Ent_dataout	0x00000440
+#define	Ent_datain	0x000003e0
+#define	Ent_cmdout	0x000003c0
+#define	Ent_status	0x000003d0
+#define	Ent_disconnect	0x00000530
 #define	Ent_reselect	0x000001e0
 #define	Ent_reselected	0x00000000
-#define	Ent_selected	0x00000378
+#define	Ent_selected	0x00000388
 #define	Ent_script_sched	0x00000070
 #define	Ent_script_sched_slot0	0x000000a0
-#define	Ent_get_extmsgdata	0x00000570
+#define	Ent_get_extmsgdata	0x00000580
 #define	Ent_resel_targ0	0x00000238
-#define	Ent_msgin_space	0x00000588
+#define	Ent_msgin_space	0x00000598
 #define	Ent_lunsw_return	0x000002b8
 #define	Ent_led_on1	0x00000068
 #define	Ent_led_on2	0x00000220
Index: microcode/siop/siop.ss
===================================================================
RCS file: /cvsroot/src/sys/dev/microcode/siop/siop.ss,v
retrieving revision 1.17.10.1
diff -u -r1.17.10.1 siop.ss
--- microcode/siop/siop.ss	11 May 2005 03:48:47 -0000	1.17.10.1
+++ microcode/siop/siop.ss	17 Nov 2005 17:28:53 -0000
@@ -47,6 +47,7 @@
 ABSOLUTE int_extmsgin	= 0xff02;
 ABSOLUTE int_extmsgdata	= 0xff03;
 ABSOLUTE int_disc	= 0xff04;
+ABSOLUTE int_saveoffset	= 0xff05;
 ; interrupts that don't have a valid DSA
 ABSOLUTE int_reseltarg	= 0xff80;
 ABSOLUTE int_resellun	= 0xff81;
@@ -262,9 +263,12 @@
 	CALL REL(disconnect)                  ; disconnect message;
 ; if we didn't get sdp, no need to interrupt
 	MOVE SCRATCHA0 & flag_sdp TO SFBR;
+	INT int_disc, IF not 0x00;
+; update offset if we did some data transfer
+	MOVE SCRATCHA1 TO SFBR;
 	JUMP REL(script_sched), if 0x00; 
-; Ok, we need to save data pointers
-	INT int_disc;
+	INT int_saveoffset;
+
 msgin_ack:
 selected:
 	CLEAR ACK;

--OgqxwSJOaUobr8KG--