summaryrefslogtreecommitdiff
path: root/sys/dev
diff options
context:
space:
mode:
authorbouyer <bouyer@NetBSD.org>2004-05-17 18:37:02 +0000
committerbouyer <bouyer@NetBSD.org>2004-05-17 18:37:02 +0000
commit83478e12f329f4bd506a4e92affee4a2ee2ba45a (patch)
treeb745f43bbf1044b9146cd5739944963d135632cb /sys/dev
parentf8dc59869d70bdce602bc775eecd715dc2a63b3f (diff)
when an unexpected disconnect occurs only compute the resid; do the
real save data pointers when we get the message (or rather, at disconnect time following the message). Factor out code to do this, and to deal with xs->resid, in siop_common.c.
Diffstat (limited to 'sys/dev')
-rw-r--r--sys/dev/ic/esiop.c114
-rw-r--r--sys/dev/ic/esiopvar.h2
-rw-r--r--sys/dev/ic/siop.c79
-rw-r--r--sys/dev/ic/siop_common.c121
-rw-r--r--sys/dev/ic/siopvar_common.h8
-rw-r--r--sys/dev/microcode/siop/esiop.ss6
-rw-r--r--sys/dev/microcode/siop/siop.ss6
7 files changed, 173 insertions, 163 deletions
diff --git a/sys/dev/ic/esiop.c b/sys/dev/ic/esiop.c
index 496103dd5fd..2b6982ad12e 100644
--- a/sys/dev/ic/esiop.c
+++ b/sys/dev/ic/esiop.c
@@ -1,4 +1,4 @@
-/* $NetBSD: esiop.c,v 1.28 2004/05/17 11:10:24 bouyer Exp $ */
+/* $NetBSD: esiop.c,v 1.29 2004/05/17 18:37:02 bouyer Exp $ */
/*
* Copyright (c) 2002 Manuel Bouyer.
@@ -33,7 +33,7 @@
/* SYM53c7/8xx PCI-SCSI I/O Processors driver */
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: esiop.c,v 1.28 2004/05/17 11:10:24 bouyer Exp $");
+__KERNEL_RCSID(0, "$NetBSD: esiop.c,v 1.29 2004/05/17 18:37:02 bouyer Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -82,7 +82,7 @@ __KERNEL_RCSID(0, "$NetBSD: esiop.c,v 1.28 2004/05/17 11:10:24 bouyer Exp $");
void esiop_reset __P((struct esiop_softc *));
void esiop_checkdone __P((struct esiop_softc *));
void esiop_handle_reset __P((struct esiop_softc *));
-void esiop_scsicmd_end __P((struct esiop_cmd *));
+void esiop_scsicmd_end __P((struct esiop_cmd *, int));
void esiop_unqueue __P((struct esiop_softc *, int, int));
int esiop_handle_qtag_reject __P((struct esiop_cmd *));
static void esiop_start __P((struct esiop_softc *, struct esiop_cmd *));
@@ -623,37 +623,31 @@ none:
/*
* previous phase may be aborted for any reason
* ( for example, the target has less data to
- * transfer than requested). Just go to status
- * and the command should terminate.
+ * transfer than requested). Compute resid and
+ * just go to status, the command should
+ * terminate.
*/
INCSTAT(esiop_stat_intr_shortxfer);
- /*
- * sdp not needed here, but this
- * will cause xs->resid to be adjusted
- */
if (scratchc0 & A_f_c_data)
- siop_sdp(&esiop_cmd->cmd_c);
+ siop_ma(&esiop_cmd->cmd_c);
else if ((dstat & DSTAT_DFE) == 0)
siop_clearfifo(&sc->sc_c);
- /* no table to flush here */
CALL_SCRIPT(Ent_status);
return 1;
case SSTAT1_PHASE_MSGIN:
- /*
- * target may be ready to disconnect
- * Save data pointers just in case.
- */
+ /*
+ * target may be ready to disconnect
+ * Compute resid which would be used later
+ * if a save data pointer is needed.
+ */
INCSTAT(esiop_stat_intr_xferdisc);
if (scratchc0 & A_f_c_data)
- siop_sdp(&esiop_cmd->cmd_c);
+ siop_ma(&esiop_cmd->cmd_c);
else if ((dstat & DSTAT_DFE) == 0)
siop_clearfifo(&sc->sc_c);
bus_space_write_1(sc->sc_c.sc_rt,
sc->sc_c.sc_rh, SIOP_SCRATCHC,
scratchc0 & ~A_f_c_data);
- esiop_table_sync(esiop_cmd,
- BUS_DMASYNC_PREREAD |
- BUS_DMASYNC_PREWRITE);
CALL_SCRIPT(Ent_msgin);
return 1;
}
@@ -715,7 +709,7 @@ none:
esiop_cmd->cmd_c.status = CMDST_DONE;
xs->error = XS_SELTIMEOUT;
freetarget = 1;
- goto end_nodata;
+ goto end;
} else {
printf("%s: selection timeout without "
"command, target %d (sdid 0x%x), "
@@ -734,7 +728,7 @@ none:
if (esiop_cmd) {
esiop_cmd->cmd_tables->status =
htole32(SCSI_CHECK);
- goto end_nodata;
+ goto end;
}
printf("%s: unexpected disconnect without "
"command\n", sc->sc_c.sc_dev.dv_xname);
@@ -772,7 +766,7 @@ none:
if (esiop_cmd) {
esiop_cmd->cmd_c.status = CMDST_DONE;
xs->error = XS_SELTIMEOUT;
- goto end_nodata;
+ goto end;
}
need_reset = 1;
}
@@ -817,7 +811,7 @@ scintr:
sc->sc_c.sc_rh, SIOP_DSP) - sc->sc_c.sc_scriptaddr));
if (xs) {
xs->error = XS_SELTIMEOUT;
- goto end_nodata;
+ goto end;
} else {
goto reset;
}
@@ -1045,32 +1039,9 @@ scintr:
#ifdef SIOP_DEBUG_DR
printf("disconnect offset %d\n", offset);
#endif
- if (offset > SIOP_NSG) {
- printf("%s: bad offset for disconnect (%d)\n",
- sc->sc_c.sc_dev.dv_xname, offset);
- goto reset;
- }
- /*
- * offset == SIOP_NSG may be a valid condition if
- * we get a sdp when the xfer is done.
- * Don't call memmove in this case.
- */
- if (offset < SIOP_NSG) {
- int i;
- /*
- * adjust xs->resid for already-transfered
- * data
- */
- for (i = 0; i < offset; i++)
- xs->resid -= le32toh(
- esiop_cmd->cmd_tables->data[i].count
- );
- memmove(&esiop_cmd->cmd_tables->data[0],
- &esiop_cmd->cmd_tables->data[offset],
- (SIOP_NSG - offset) * sizeof(scr_table_t));
- esiop_table_sync(esiop_cmd,
- BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
- }
+ siop_sdp(&esiop_cmd->cmd_c, offset);
+ esiop_table_sync(esiop_cmd,
+ BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
CALL_SCRIPT(Ent_script_sched);
return 1;
case A_int_resfail:
@@ -1098,7 +1069,7 @@ scintr:
printf("unknown irqcode %x\n", irqcode);
if (xs) {
xs->error = XS_SELTIMEOUT;
- goto end_nodata;
+ goto end;
}
goto reset;
}
@@ -1107,12 +1078,6 @@ scintr:
/* We just should't get there */
panic("siop_intr: I shouldn't be there !");
-end_nodata:
- /*
- * no data was transfered, and the script didn't update tlp with the
- * current offset (which is still 0)
- */
- ((struct esiop_xfer *)esiop_cmd->cmd_tables)->tlq = 0;
end:
/*
* restart the script now if command completed properly
@@ -1127,7 +1092,9 @@ end:
esiop_lun->tactive[tag] = NULL;
else
esiop_lun->active = NULL;
- esiop_scsicmd_end(esiop_cmd);
+ offset = bus_space_read_1(sc->sc_c.sc_rt, sc->sc_c.sc_rh,
+ SIOP_SCRATCHA + 1);
+ esiop_scsicmd_end(esiop_cmd, offset);
if (freetarget && esiop_target->target_c.status == TARST_PROBING)
esiop_del_dev(sc, target, lun);
CALL_SCRIPT(Ent_script_sched);
@@ -1135,26 +1102,14 @@ end:
}
void
-esiop_scsicmd_end(esiop_cmd)
+esiop_scsicmd_end(esiop_cmd, offset)
struct esiop_cmd *esiop_cmd;
+ int offset;
{
struct scsipi_xfer *xs = esiop_cmd->cmd_c.xs;
struct esiop_softc *sc = (struct esiop_softc *)esiop_cmd->cmd_c.siop_sc;
- int offset, i;
- /* scratcha was saved in tlq by script. fetch offset from it */
- offset =
- (le32toh(((struct esiop_xfer *)esiop_cmd->cmd_tables)->tlq) >> 8)
- & 0xff;
- /*
- * update resid. If we completed a xfer with
- * some data transfers, offset will be at last 1.
- * If it's 0 then either no data was transfered at
- * all, or resid was already adjusted by a save
- * data pointer, or a phase mismatch.
- */
- for (i = 0; i < offset; i++)
- xs->resid -= le32toh(esiop_cmd->cmd_tables->data[i].count);
+ siop_update_resid(&esiop_cmd->cmd_c, offset);
switch(xs->status) {
case SCSI_OK:
@@ -1209,6 +1164,10 @@ esiop_scsicmd_end(esiop_cmd)
callout_stop(&esiop_cmd->cmd_c.xs->xs_callout);
esiop_cmd->cmd_c.status = CMDST_FREE;
TAILQ_INSERT_TAIL(&sc->free_list, esiop_cmd, next);
+#if 0
+ if (xs->resid != 0)
+ printf("resid %d datalen %d\n", xs->resid, xs->datalen);
+#endif
scsipi_done (xs);
}
@@ -1304,7 +1263,10 @@ next:
esiop_lun->tactive[tag] = NULL;
else
esiop_lun->active = NULL;
- esiop_scsicmd_end(esiop_cmd);
+ /* 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);
goto next;
}
@@ -1341,7 +1303,7 @@ esiop_unqueue(sc, target, lun)
esiop_cmd->cmd_c.xs->error = XS_REQUEUE;
esiop_cmd->cmd_c.xs->status = SCSI_SIOP_NOCHECK;
esiop_lun->tactive[tag] = NULL;
- esiop_scsicmd_end(esiop_cmd);
+ esiop_scsicmd_end(esiop_cmd, 0);
break;
}
}
@@ -1455,7 +1417,7 @@ esiop_handle_reset(sc)
else
esiop_lun->active = NULL;
esiop_cmd->cmd_c.status = CMDST_DONE;
- esiop_scsicmd_end(esiop_cmd);
+ esiop_scsicmd_end(esiop_cmd, 0);
}
}
sc->sc_c.targets[target]->status = TARST_ASYNC;
@@ -1713,7 +1675,7 @@ esiop_start(sc, esiop_cmd)
BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE);
esiop_cmd->cmd_c.xs->error = XS_REQUEUE;
esiop_cmd->cmd_c.xs->status = SCSI_SIOP_NOCHECK;
- esiop_scsicmd_end(esiop_cmd);
+ esiop_scsicmd_end(esiop_cmd, 0);
return;
}
/* OK, we can use this slot */
diff --git a/sys/dev/ic/esiopvar.h b/sys/dev/ic/esiopvar.h
index ddef75d84d9..8612ea6dfa4 100644
--- a/sys/dev/ic/esiopvar.h
+++ b/sys/dev/ic/esiopvar.h
@@ -1,4 +1,4 @@
-/* $NetBSD: esiopvar.h,v 1.9 2004/05/17 11:10:24 bouyer Exp $ */
+/* $NetBSD: esiopvar.h,v 1.10 2004/05/17 18:37:02 bouyer Exp $ */
/*
* Copyright (c) 2002 Manuel Bouyer.
diff --git a/sys/dev/ic/siop.c b/sys/dev/ic/siop.c
index 5332aff165f..1f4c09650fe 100644
--- a/sys/dev/ic/siop.c
+++ b/sys/dev/ic/siop.c
@@ -1,4 +1,4 @@
-/* $NetBSD: siop.c,v 1.73 2004/05/17 11:10:24 bouyer Exp $ */
+/* $NetBSD: siop.c,v 1.74 2004/05/17 18:37:02 bouyer Exp $ */
/*
* Copyright (c) 2000 Manuel Bouyer.
@@ -33,7 +33,7 @@
/* SYM53c7/8xx PCI-SCSI I/O Processors driver */
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: siop.c,v 1.73 2004/05/17 11:10:24 bouyer Exp $");
+__KERNEL_RCSID(0, "$NetBSD: siop.c,v 1.74 2004/05/17 18:37:02 bouyer Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -490,37 +490,31 @@ siop_intr(v)
/*
* previous phase may be aborted for any reason
* ( for example, the target has less data to
- * transfer than requested). Just go to status
- * and the command should terminate.
+ * transfer than requested). Compute resid and
+ * just go to status, the command should
+ * terminate.
*/
INCSTAT(siop_stat_intr_shortxfer);
- /*
- * sdp not needed here, but this
- * will cause xs->resid to be adjusted
- */
if (scratcha0 & A_flag_data)
- siop_sdp(&siop_cmd->cmd_c);
+ siop_ma(&siop_cmd->cmd_c);
else if ((dstat & DSTAT_DFE) == 0)
siop_clearfifo(&sc->sc_c);
- /* no table to flush here */
CALL_SCRIPT(Ent_status);
return 1;
case SSTAT1_PHASE_MSGIN:
- /*
- * target may be ready to disconnect
- * Save data pointers just in case.
- */
+ /*
+ * target may be ready to disconnect
+ * Compute resid which would be used later
+ * if a save data pointer is needed.
+ */
INCSTAT(siop_stat_intr_xferdisc);
if (scratcha0 & A_flag_data)
- siop_sdp(&siop_cmd->cmd_c);
+ siop_ma(&siop_cmd->cmd_c);
else if ((dstat & DSTAT_DFE) == 0)
siop_clearfifo(&sc->sc_c);
bus_space_write_1(sc->sc_c.sc_rt,
sc->sc_c.sc_rh, SIOP_SCRATCHA,
scratcha0 & ~A_flag_data);
- siop_table_sync(siop_cmd,
- BUS_DMASYNC_PREREAD |
- BUS_DMASYNC_PREWRITE);
CALL_SCRIPT(Ent_msgin);
return 1;
}
@@ -884,32 +878,9 @@ scintr:
#ifdef SIOP_DEBUG_DR
printf("disconnect offset %d\n", offset);
#endif
- if (offset > SIOP_NSG) {
- printf("%s: bad offset for disconnect (%d)\n",
- sc->sc_c.sc_dev.dv_xname, offset);
- goto reset;
- }
- /*
- * offset == SIOP_NSG may be a valid condition if
- * we get a sdp when the xfer is done.
- * Don't call memmove in this case.
- */
- if (offset < SIOP_NSG) {
- int i;
- /*
- * adjust xs->resid for already-transfered
- * data
- */
- for (i = 0; i < offset; i++)
- xs->resid -= le32toh(
- siop_cmd->cmd_tables->data[i].count
- );
- memmove(&siop_cmd->cmd_tables->data[0],
- &siop_cmd->cmd_tables->data[offset],
- (SIOP_NSG - offset) * sizeof(scr_table_t));
- siop_table_sync(siop_cmd,
- BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
- }
+ siop_sdp(&siop_cmd->cmd_c, offset);
+ siop_table_sync(siop_cmd,
+ BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
CALL_SCRIPT(Ent_script_sched);
return 1;
case A_int_resfail:
@@ -933,22 +904,10 @@ scintr:
le32toh(siop_cmd->cmd_tables->status));
#endif
INCSTAT(siop_stat_intr_done);
- /*
- * update resid. If we completed a xfer with
- * some data transfers, offset will be at last 1.
- * If it's 0 then either no data was transfered at
- * all, or resid was already adjusted by a save
- * data pointer, or a phase mismatch.
- */
+ /* update resid. */
offset = bus_space_read_1(sc->sc_c.sc_rt,
sc->sc_c.sc_rh, SIOP_SCRATCHA + 1);
- {
- int i;
- for (i = 0; i < offset; i++)
- xs->resid -= le32toh(
- siop_cmd->cmd_tables->data[i].count
- );
- }
+ siop_update_resid(&siop_cmd->cmd_c, offset);
siop_cmd->cmd_c.status = CMDST_DONE;
goto end;
default:
@@ -1048,6 +1007,10 @@ siop_scsicmd_end(siop_cmd)
callout_stop(&siop_cmd->cmd_c.xs->xs_callout);
siop_cmd->cmd_c.status = CMDST_FREE;
TAILQ_INSERT_TAIL(&sc->free_list, siop_cmd, next);
+#if 0
+ if (xs->resid != 0)
+ printf("resid %d datalen %d\n", xs->resid, xs->datalen);
+#endif
scsipi_done (xs);
}
diff --git a/sys/dev/ic/siop_common.c b/sys/dev/ic/siop_common.c
index 11d84e61493..ecf89f889b7 100644
--- a/sys/dev/ic/siop_common.c
+++ b/sys/dev/ic/siop_common.c
@@ -1,4 +1,4 @@
-/* $NetBSD: siop_common.c,v 1.34 2004/05/17 11:10:24 bouyer Exp $ */
+/* $NetBSD: siop_common.c,v 1.35 2004/05/17 18:37:02 bouyer Exp $ */
/*
* Copyright (c) 2000, 2002 Manuel Bouyer.
@@ -33,7 +33,7 @@
/* SYM53c7/8xx PCI-SCSI I/O Processors driver */
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: siop_common.c,v 1.34 2004/05/17 11:10:24 bouyer Exp $");
+__KERNEL_RCSID(0, "$NetBSD: siop_common.c,v 1.35 2004/05/17 18:37:02 bouyer Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -732,20 +732,21 @@ siop_ioctl(chan, cmd, arg, flag, p)
}
void
-siop_sdp(siop_cmd)
+siop_ma(siop_cmd)
struct siop_common_cmd *siop_cmd;
{
- /*
- * Save data pointer when a phase mistmatch occurs. We need to compute
- * how much of the current table was written.
- */
int offset, dbc, sstat;
struct siop_common_softc *sc = siop_cmd->siop_sc;
- scr_table_t *table; /* table to patch */
+ scr_table_t *table; /* table with partial xfer */
+ /*
+ * compute how much of the current table didn't get handled when
+ * a phase mismatch occurs
+ */
if ((siop_cmd->xs->xs_control & (XS_CTL_DATA_OUT | XS_CTL_DATA_IN))
== 0)
- return; /* no data pointers to save */
+ return; /* no valid data transfer */
+
offset = bus_space_read_1(sc->sc_rt, sc->sc_rh, SIOP_SCRATCHA + 1);
if (offset >= SIOP_NSG) {
printf("%s: bad offset in siop_sdp (%d)\n",
@@ -754,7 +755,7 @@ siop_sdp(siop_cmd)
}
table = &siop_cmd->siop_tables->data[offset];
#ifdef DEBUG_DR
- printf("sdp: offset %d count=%d addr=0x%x ", offset,
+ printf("siop_ma: offset %d count=%d addr=0x%x ", offset,
table->count, table->addr);
#endif
dbc = bus_space_read_4(sc->sc_rt, sc->sc_rh, SIOP_DBC) & 0x00ffffff;
@@ -793,15 +794,99 @@ siop_sdp(siop_cmd)
bus_space_read_1(sc->sc_rt, sc->sc_rh, SIOP_CTEST3) |
CTEST3_CLF);
}
- /* correct xs->resid for this partial transfer */
- siop_cmd->xs->resid -= le32toh(table->count) - dbc;
- /* "cut" already transfered data from this table */
- table->addr =
- htole32(le32toh(table->addr) + le32toh(table->count) - dbc);
- table->count = htole32(dbc);
-#ifdef DEBUG_DR
- printf("now count=%d addr=0x%x\n", table->count, table->addr);
+ siop_cmd->flags |= CMDFL_RESID;
+ siop_cmd->resid = dbc;
+}
+
+void
+siop_sdp(siop_cmd, offset)
+ struct siop_common_cmd *siop_cmd;
+ int offset;
+{
+ scr_table_t *table;
+
+ if ((siop_cmd->xs->xs_control & (XS_CTL_DATA_OUT | XS_CTL_DATA_IN))
+ == 0)
+ return; /* no data pointers to save */
+
+ /*
+ * offset == SIOP_NSG may be a valid condition if we get a Save data
+ * pointer when the xfer is done. Just ignore the Save data pointer
+ * in this case
+ */
+ if (offset == SIOP_NSG)
+ return;
+#ifdef DIAGNOSTIC
+ if (offset > SIOP_NSG) {
+ scsipi_printaddr(siop_cmd->xs->xs_periph);
+ printf(": offset %d > %d\n", offset, SIOP_NSG);
+ panic("siop_sdp: offset");
+ }
#endif
+ /*
+ * Save data pointer. We do this by adjusting the tables to point
+ * at the begginning of the data not yet transfered.
+ * offset points to the first table with untransfered data.
+ */
+
+ /*
+ * before doing that we decrease resid from the ammount of data which
+ * has been transfered.
+ */
+ siop_update_resid(siop_cmd, offset);
+
+ /*
+ * First let see if we have a resid from a phase mismatch. If so,
+ * we have to adjst the table at offset to remove transfered data.
+ */
+ if (siop_cmd->flags & CMDFL_RESID) {
+ siop_cmd->flags &= ~CMDFL_RESID;
+ table = &siop_cmd->siop_tables->data[offset];
+ /* "cut" already transfered data from this table */
+ table->addr =
+ htole32(le32toh(table->addr) +
+ le32toh(table->count) - siop_cmd->resid);
+ table->count = htole32(siop_cmd->resid);
+ }
+
+ /*
+ * now we can remove entries which have been transfered.
+ * We just move the entries with data left at the beggining of the
+ * tables
+ */
+ memmove(&siop_cmd->siop_tables->data[0],
+ &siop_cmd->siop_tables->data[offset],
+ (SIOP_NSG - offset) * sizeof(scr_table_t));
+}
+
+void
+siop_update_resid(siop_cmd, offset)
+ struct siop_common_cmd *siop_cmd;
+ int offset;
+{
+ scr_table_t *table;
+ int i;
+
+ if ((siop_cmd->xs->xs_control & (XS_CTL_DATA_OUT | XS_CTL_DATA_IN))
+ == 0)
+ return; /* no data to transfer */
+
+ /*
+ * update resid. First account for the table entries which have
+ * been fully completed.
+ */
+ for (i = 0; i < offset; i++)
+ siop_cmd->xs->resid -=
+ le32toh(siop_cmd->siop_tables->data[i].count);
+ /*
+ * if CMDFL_RESID is set, the last table (pointed by offset) is a
+ * partial transfers. If not, offset points to the entry folloing
+ * the last full transfer.
+ */
+ if (siop_cmd->flags & CMDFL_RESID) {
+ table = &siop_cmd->siop_tables->data[offset];
+ siop_cmd->xs->resid -= le32toh(table->count) - siop_cmd->resid;
+ }
}
void
diff --git a/sys/dev/ic/siopvar_common.h b/sys/dev/ic/siopvar_common.h
index 26efc181768..4716448b487 100644
--- a/sys/dev/ic/siopvar_common.h
+++ b/sys/dev/ic/siopvar_common.h
@@ -1,4 +1,4 @@
-/* $NetBSD: siopvar_common.h,v 1.27 2004/03/10 22:02:53 bouyer Exp $ */
+/* $NetBSD: siopvar_common.h,v 1.28 2004/05/17 18:37:02 bouyer Exp $ */
/*
* Copyright (c) 2000 Manuel Bouyer.
@@ -86,6 +86,7 @@ struct siop_common_cmd {
int status;
int flags;
int tag; /* tag used for tagged command queuing */
+ int resid; /* valid when CMDFL_RESID is set */
};
/* status defs */
@@ -96,6 +97,7 @@ struct siop_common_cmd {
/* flags defs */
#define CMDFL_TIMEOUT 0x0001 /* cmd timed out */
#define CMDFL_TAG 0x0002 /* tagged cmd */
+#define CMDFL_RESID 0x0004 /* current offset in table is partial */
/* per-target struct */
struct siop_common_target {
@@ -198,6 +200,8 @@ void siop_update_xfer_mode __P((struct siop_common_softc *, int));
void siop_minphys __P((struct buf *));
int siop_ioctl __P((struct scsipi_channel *, u_long,
caddr_t, int, struct proc *));
-void siop_sdp __P((struct siop_common_cmd *));
+void siop_ma __P((struct siop_common_cmd *));
+void siop_sdp __P((struct siop_common_cmd *, int));
+void siop_update_resid __P((struct siop_common_cmd *, int));
void siop_clearfifo __P((struct siop_common_softc *));
void siop_resetbus __P((struct siop_common_softc *));
diff --git a/sys/dev/microcode/siop/esiop.ss b/sys/dev/microcode/siop/esiop.ss
index 81aaf085f0b..7fda2cc0141 100644
--- a/sys/dev/microcode/siop/esiop.ss
+++ b/sys/dev/microcode/siop/esiop.ss
@@ -1,4 +1,4 @@
-; $NetBSD: esiop.ss,v 1.17 2004/05/17 11:10:24 bouyer Exp $
+; $NetBSD: esiop.ss,v 1.18 2004/05/17 18:37:02 bouyer Exp $
;
; Copyright (c) 2002 Manuel Bouyer.
@@ -342,11 +342,9 @@ handle_msgin:
JUMP REL(handle_extin), IF 0x01 ; extended message
INT int_msgin, IF NOT 0x04;
CALL REL(disconnect) ; disconnect message
-; if we didn't get sdp, or if offset is 0, no need to interrupt
+; if we didn't get sdp, no need to interrupt
MOVE SCRATCHC0 & f_c_sdp TO SFBR;
JUMP REL(script_sched), if 0x00;
- MOVE SCRATCHA1 TO SFBR;
- JUMP REL(script_sched), if 0x00;
; Ok, we need to save data pointers
INT int_disc;
diff --git a/sys/dev/microcode/siop/siop.ss b/sys/dev/microcode/siop/siop.ss
index 4c9f5810eda..982552a99be 100644
--- a/sys/dev/microcode/siop/siop.ss
+++ b/sys/dev/microcode/siop/siop.ss
@@ -1,4 +1,4 @@
-; $NetBSD: siop.ss,v 1.17 2002/07/26 14:11:34 wiz Exp $
+; $NetBSD: siop.ss,v 1.18 2004/05/17 18:37:02 bouyer Exp $
;
; Copyright (c) 2000 Manuel Bouyer.
@@ -260,11 +260,9 @@ handle_msgin:
JUMP REL(handle_extin), IF 0x01 ; extended message
INT int_msgin, IF not 0x04;
CALL REL(disconnect) ; disconnect message;
-; if we didn't get sdp, or if offset is 0, no need to interrupt
+; if we didn't get sdp, no need to interrupt
MOVE SCRATCHA0 & flag_sdp TO SFBR;
JUMP REL(script_sched), if 0x00;
- MOVE SCRATCHA1 TO SFBR;
- JUMP REL(script_sched), if 0x00;
; Ok, we need to save data pointers
INT int_disc;
msgin_ack: