What is interesting is that if I add the following bit of debug to
ata/ata_wdc.c:
Index: ata/ata_wdc.c
===================================================================
RCS file: /cvsroot/src/sys/dev/ata/ata_wdc.c,v
retrieving revision 1.87
diff -u -p -b -u -p -r1.87 ata_wdc.c
--- ata/ata_wdc.c 19 Oct 2007 11:59:36 -0000 1.87
+++ ata/ata_wdc.c 14 Feb 2008 18:57:03 -0000
@@ -687,6 +687,9 @@ wdc_ata_bio_intr(struct ata_channel *chp
}
if (wdc->dma_status != 0) {
if (drv_err != WDC_ATA_ERR) {
+ printf("%s:%d:%d: DMA error (st=0x%x,
er=0x%x)\n
",
+ atac->atac_dev.dv_xname,
chp->ch_channel,
+ xfer->c_drive, wdc->dma_status,
ata_bio->r_error);
ata_bio->error = ERR_DMA;
drv_err = WDC_ATA_ERR;
}
I see that wdc->dma_status is always 0x04 (WDC_DMAST_UNDER), which is a
synthetic error generated only by pciide_dma_finish().