Index: dev/ata/ata-disk.c =================================================================== RCS file: /home/ncvs/src/sys/dev/ata/ata-disk.c,v retrieving revision 1.60.2.27 diff -u -r1.60.2.27 ata-disk.c --- dev/ata/ata-disk.c 5 Sep 2003 18:27:38 -0000 1.60.2.27 +++ dev/ata/ata-disk.c 21 Oct 2003 13:15:27 -0000 @@ -521,8 +521,16 @@ } /* start transfer, return and wait for interrupt */ - ata_dmastart(adp->device, request->data, request->bytecount, + ret = ata_dmastart(adp->device, request->data, request->bytecount, request->flags & ADR_F_READ); + /* + * another transfer is already active, bail out. + */ + if (ret == EINPROGRESS) { + ata_prtdev(adp->device, "transfer active on this device!"); + goto transfer_failed; + } + return ATA_OP_CONTINUES; } Index: dev/ata/ata-dma.c =================================================================== RCS file: /home/ncvs/src/sys/dev/ata/ata-dma.c,v retrieving revision 1.35.2.33 diff -u -r1.35.2.33 ata-dma.c --- dev/ata/ata-dma.c 5 Sep 2003 07:29:10 -0000 1.35.2.33 +++ dev/ata/ata-dma.c 21 Oct 2003 13:15:27 -0000 @@ -128,6 +128,7 @@ struct ata_dmastate *ds; ds = &atadev->dmastate; + ds->flags = 0; if (ds->mdmatab) { bus_dmamap_unload(ds->cdmatag, ds->cdmamap); bus_dmamem_free(ds->cdmatag, ds->dmatab, ds->cdmamap); @@ -1369,9 +1370,12 @@ struct ata_channel *ch = atadev->channel; struct ata_dmastate *ds = &atadev->dmastate; struct ata_dmasetup_data_cb_args cba; - +#if 0 if (ds->flags & ATA_DS_ACTIVE) panic("ata_dmasetup: transfer active on this device!"); +#endif + if (ds->flags & ATA_DS_ACTIVE) + return EINPROGRESS; cba.dmatab = ds->dmatab; bus_dmamap_sync(ds->cdmatag, ds->cdmamap, BUS_DMASYNC_PREWRITE);