diff options
Diffstat (limited to 'sys/dev/ic')
| -rw-r--r-- | sys/dev/ic/wdc.c | 35 |
1 files changed, 33 insertions, 2 deletions
diff --git a/sys/dev/ic/wdc.c b/sys/dev/ic/wdc.c index 2dc11adc4f3..b858ee32164 100644 --- a/sys/dev/ic/wdc.c +++ b/sys/dev/ic/wdc.c @@ -1,4 +1,4 @@ -/* $NetBSD: wdc.c,v 1.69 1999/07/30 14:59:10 bouyer Exp $ */ +/* $NetBSD: wdc.c,v 1.70 1999/08/06 12:00:25 bouyer Exp $ */ /* @@ -533,7 +533,6 @@ wdcintr(arg) } WDCDEBUG_PRINT(("wdcintr\n"), DEBUG_INTR); - untimeout(wdctimeout, chp); chp->ch_flags &= ~WDCF_IRQ_WAIT; xfer = chp->ch_queue->sc_xfer.tqh_first; return xfer->c_intr(chp, xfer, 1); @@ -595,16 +594,32 @@ __wdcwait_reset(chp, drv_mask) { int timeout; u_int8_t st0, st1; +#ifdef WDCDEBUG + u_int8_t sc0, sn0, cl0, ch0; + u_int8_t sc1, sn1, cl1, ch1; +#endif /* wait for BSY to deassert */ for (timeout = 0; timeout < WDCNDELAY_RST;timeout++) { bus_space_write_1(chp->cmd_iot, chp->cmd_ioh, wd_sdh, WDSD_IBM); /* master */ delay(10); st0 = bus_space_read_1(chp->cmd_iot, chp->cmd_ioh, wd_status); +#ifdef WDCDEBUG + sc0 = bus_space_read_1(chp->cmd_iot, chp->cmd_ioh, wd_seccnt); + sn0 = bus_space_read_1(chp->cmd_iot, chp->cmd_ioh, wd_sector); + cl0 = bus_space_read_1(chp->cmd_iot, chp->cmd_ioh, wd_cyl_lo); + ch0 = bus_space_read_1(chp->cmd_iot, chp->cmd_ioh, wd_cyl_hi); +#endif bus_space_write_1(chp->cmd_iot, chp->cmd_ioh, wd_sdh, WDSD_IBM | 0x10); /* slave */ delay(10); st1 = bus_space_read_1(chp->cmd_iot, chp->cmd_ioh, wd_status); +#ifdef WDCDEBUG + sc1 = bus_space_read_1(chp->cmd_iot, chp->cmd_ioh, wd_seccnt); + sn1 = bus_space_read_1(chp->cmd_iot, chp->cmd_ioh, wd_sector); + cl1 = bus_space_read_1(chp->cmd_iot, chp->cmd_ioh, wd_cyl_lo); + ch1 = bus_space_read_1(chp->cmd_iot, chp->cmd_ioh, wd_cyl_hi); +#endif if ((drv_mask & 0x01) == 0) { /* no master */ @@ -632,6 +647,15 @@ __wdcwait_reset(chp, drv_mask) if (st1 & WDCS_BSY) drv_mask &= ~0x02; end: + WDCDEBUG_PRINT(("%s:%d:0: after reset, sc=0x%x sn=0x%x " + "cl=0x%x ch=0x%x\n", + chp->wdc ? chp->wdc->sc_dev.dv_xname : "wdcprobe", + chp->channel, sc0, sn0, cl0, ch0), DEBUG_PROBE); + WDCDEBUG_PRINT(("%s:%d:1: after reset, sc=0x%x sn=0x%x " + "cl=0x%x ch=0x%x\n", + chp->wdc ? chp->wdc->sc_dev.dv_xname : "wdcprobe", + chp->channel, sc1, sn1, cl1, ch1), DEBUG_PROBE); + WDCDEBUG_PRINT(("%s:%d: wdcwait_reset() end, st0=0x%x, st1=0x%x\n", chp->wdc ? chp->wdc->sc_dev.dv_xname : "wdcprobe", chp->channel, st0, st1), DEBUG_PROBE); @@ -717,7 +741,11 @@ wdctimeout(arg) * Call the interrupt routine. If we just missed and interrupt, * it will do what's needed. Else, it will take the needed * action (reset the device). + * Before that we need to reinstall the timeout callback, + * in case it will miss another irq while in this transfer + * We arbitray chose it to be 1s */ + timeout(wdctimeout, chp, hz); xfer->c_flags |= C_TIMEOU; chp->ch_flags &= ~WDCF_IRQ_WAIT; xfer->c_intr(chp, xfer, 1); @@ -1121,6 +1149,9 @@ __wdccommand_done(chp, xfer) WDCDEBUG_PRINT(("__wdccommand_done %s:%d:%d\n", chp->wdc->sc_dev.dv_xname, chp->channel, xfer->drive), DEBUG_FUNCS); + + untimeout(wdctimeout, chp); + if (chp->ch_status & WDCS_DWF) wdc_c->flags |= AT_DF; if (chp->ch_status & WDCS_ERR) { |
