diff --git a/sys/dev/ata/ata_wdc.c b/sys/dev/ata/ata_wdc.c index 7791acbb7480..3da44e2b24ca 100644 --- a/sys/dev/ata/ata_wdc.c +++ b/sys/dev/ata/ata_wdc.c @@ -1,4 +1,4 @@ -/* $NetBSD: ata_wdc.c,v 1.27 2000/05/15 08:32:07 bouyer Exp $ */ +/* $NetBSD: ata_wdc.c,v 1.28 2000/06/12 21:10:40 bouyer Exp $ */ /* * Copyright (c) 1998 Manuel Bouyer. @@ -457,6 +457,8 @@ wdc_ata_bio_intr(chp, xfer, irq) wdc_ata_bio_done(chp, xfer); return 1; } + if (chp->wdc->cap & WDC_CAPABILITY_IRQACK) + chp->wdc->irqack(chp); drv_err = wdc_ata_err(drvp, ata_bio); @@ -654,6 +656,8 @@ again: errstring = "recal"; if (wdcwait(chp, WDCS_DRDY, WDCS_DRDY, delay)) goto timeout; + if (chp->wdc->cap & WDC_CAPABILITY_IRQACK) + chp->wdc->irqack(chp); if (chp->ch_status & (WDCS_ERR | WDCS_DWF)) goto error; /* fall through */ @@ -674,6 +678,8 @@ again: errstring = "piomode"; if (wdcwait(chp, WDCS_DRDY, WDCS_DRDY, delay)) goto timeout; + if (chp->wdc->cap & WDC_CAPABILITY_IRQACK) + chp->wdc->irqack(chp); if (chp->ch_status & (WDCS_ERR | WDCS_DWF)) goto error; /* fall through */ @@ -694,6 +700,8 @@ again: errstring = "dmamode"; if (wdcwait(chp, WDCS_DRDY, WDCS_DRDY, delay)) goto timeout; + if (chp->wdc->cap & WDC_CAPABILITY_IRQACK) + chp->wdc->irqack(chp); if (chp->ch_status & (WDCS_ERR | WDCS_DWF)) goto error; /* fall through */ @@ -714,6 +722,8 @@ again: errstring = "geometry"; if (wdcwait(chp, WDCS_DRDY, WDCS_DRDY, delay)) goto timeout; + if (chp->wdc->cap & WDC_CAPABILITY_IRQACK) + chp->wdc->irqack(chp); if (chp->ch_status & (WDCS_ERR | WDCS_DWF)) goto error; /* fall through */ @@ -731,6 +741,8 @@ again: errstring = "setmulti"; if (wdcwait(chp, WDCS_DRDY, WDCS_DRDY, delay)) goto timeout; + if (chp->wdc->cap & WDC_CAPABILITY_IRQACK) + chp->wdc->irqack(chp); if (chp->ch_status & (WDCS_ERR | WDCS_DWF)) goto error; /* fall through */ diff --git a/sys/dev/ic/wdc.c b/sys/dev/ic/wdc.c index 7aadd59677f1..f1e0076993b8 100644 --- a/sys/dev/ic/wdc.c +++ b/sys/dev/ic/wdc.c @@ -1,4 +1,4 @@ -/* $NetBSD: wdc.c,v 1.90 2000/06/11 17:09:34 bouyer Exp $ */ +/* $NetBSD: wdc.c,v 1.91 2000/06/12 21:10:41 bouyer Exp $ */ /* @@ -1323,6 +1323,8 @@ __wdccommand_intr(chp, xfer, irq) __wdccommand_done(chp, xfer); return 1; } + if (chp->wdc->cap & WDC_CAPABILITY_IRQACK) + chp->wdc->irqack(chp); if (wdc_c->flags & AT_READ) { if (chp->ch_drive[xfer->drive].drive_flags & DRIVE_CAP32) { bus_space_read_multi_4(chp->data32iot, chp->data32ioh, diff --git a/sys/dev/ic/wdcvar.h b/sys/dev/ic/wdcvar.h index 4f42e0d46668..ffc856ebd338 100644 --- a/sys/dev/ic/wdcvar.h +++ b/sys/dev/ic/wdcvar.h @@ -1,4 +1,4 @@ -/* $NetBSD: wdcvar.h,v 1.24 2000/04/01 14:32:22 bouyer Exp $ */ +/* $NetBSD: wdcvar.h,v 1.25 2000/06/12 21:10:41 bouyer Exp $ */ /*- * Copyright (c) 1998 The NetBSD Foundation, Inc. @@ -98,6 +98,7 @@ struct wdc_softc { /* Per controller state */ #define WDC_CAPABILITY_ATAPI_NOSTREAM 0x0080 /* Don't use stream f on ATAPI */ #define WDC_CAPABILITY_NO_EXTRA_RESETS 0x0100 /* only reset once */ #define WDC_CAPABILITY_PREATA 0x0200 /* ctrl can be a pre-ata one */ +#define WDC_CAPABILITY_IRQACK 0x0400 /* callback to ack interrupt */ u_int8_t PIO_cap; /* highest PIO mode supported */ u_int8_t DMA_cap; /* highest DMA mode supported */ u_int8_t UDMA_cap; /* highest UDMA mode supported */ @@ -129,6 +130,9 @@ struct wdc_softc { /* Per controller state */ /* if WDC_CAPABILITY_MODE set in 'cap' */ void (*set_modes) __P((struct channel_softc *)); + + /* if WDC_CAPABILITY_IRQACK set in 'cap' */ + void (*irqack) __P((struct channel_softc *)); }; /* diff --git a/sys/dev/scsipi/atapi_wdc.c b/sys/dev/scsipi/atapi_wdc.c index ba6aa7ceb94b..505fed83f3d9 100644 --- a/sys/dev/scsipi/atapi_wdc.c +++ b/sys/dev/scsipi/atapi_wdc.c @@ -1,4 +1,4 @@ -/* $NetBSD: atapi_wdc.c,v 1.35 2000/05/15 08:48:25 bouyer Exp $ */ +/* $NetBSD: atapi_wdc.c,v 1.36 2000/06/12 21:10:40 bouyer Exp $ */ /* * Copyright (c) 1998 Manuel Bouyer. @@ -467,6 +467,9 @@ wdc_atapi_intr(chp, xfer, irq) wdc_atapi_reset(chp, xfer); return 1; } + if (chp->wdc->cap & WDC_CAPABILITY_IRQACK) + chp->wdc->irqack(chp); + /* If we missed an IRQ and were using DMA, flag it as a DMA error */ if ((xfer->c_flags & C_TIMEOU) && (xfer->c_flags & C_DMA)) { ata_dmaerr(drvp); @@ -847,6 +850,8 @@ piomode: errstring = "piomode"; if (wait_for_unbusy(chp, delay)) goto timeout; + if (chp->wdc->cap & WDC_CAPABILITY_IRQACK) + chp->wdc->irqack(chp); if (chp->ch_status & WDCS_ERR) { if (drvp->PIO_mode < 3) { drvp->PIO_mode = 3; @@ -873,6 +878,8 @@ piomode: errstring = "dmamode"; if (wait_for_unbusy(chp, delay)) goto timeout; + if (chp->wdc->cap & WDC_CAPABILITY_IRQACK) + chp->wdc->irqack(chp); if (chp->ch_status & WDCS_ERR) goto error; /* fall through */