diff options
Diffstat (limited to 'sys/dev')
| -rw-r--r-- | sys/dev/ic/esiop.c | 114 | ||||
| -rw-r--r-- | sys/dev/ic/esiopvar.h | 2 | ||||
| -rw-r--r-- | sys/dev/ic/siop.c | 79 | ||||
| -rw-r--r-- | sys/dev/ic/siop_common.c | 121 | ||||
| -rw-r--r-- | sys/dev/ic/siopvar_common.h | 8 | ||||
| -rw-r--r-- | sys/dev/microcode/siop/esiop.ss | 6 | ||||
| -rw-r--r-- | sys/dev/microcode/siop/siop.ss | 6 |
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: |
