diff --git a/sys/dev/ata/ata-all.h b/sys/dev/ata/ata-all.h index 3bf3d15..7ff6298 100644 --- a/sys/dev/ata/ata-all.h +++ b/sys/dev/ata/ata-all.h @@ -376,6 +376,9 @@ struct ata_request { struct ata_dmaslot *dma; /* DMA slot of this request */ u_int8_t status; /* ATA status */ u_int8_t error; /* ATA error */ + u_int8_t dma_status; /* DMA status + * (after dma has been unloaded) + */ u_int32_t donecount; /* bytes transferred */ int result; /* result error code */ void (*callback)(struct ata_request *request); diff --git a/sys/dev/ata/ata-dma.c b/sys/dev/ata/ata-dma.c index e8f9f7a..e01e1f6 100644 --- a/sys/dev/ata/ata-dma.c +++ b/sys/dev/ata/ata-dma.c @@ -332,6 +332,7 @@ ata_dmaunload(struct ata_request *request) BUS_DMASYNC_POSTREAD : BUS_DMASYNC_POSTWRITE); bus_dmamap_unload(request->dma->data_tag, request->dma->data_map); + request->dma_status = request->dma->status; request->dma = NULL; } return 0; diff --git a/sys/dev/ata/ata-queue.c b/sys/dev/ata/ata-queue.c index 7d87f82..74c4693 100644 --- a/sys/dev/ata/ata-queue.c +++ b/sys/dev/ata/ata-queue.c @@ -358,8 +358,8 @@ ata_completed(void *context, int dummy) "\4MEDIA_CHANGE_REQEST" "\3ABORTED\2NO_MEDIA\1ILLEGAL_LENGTH"); if ((request->flags & ATA_R_DMA) && - (request->dma->status & ATA_BMSTAT_ERROR)) - printf(" dma=0x%02x", request->dma->status); + (request->dma_status & ATA_BMSTAT_ERROR)) + printf(" dma=0x%02x", request->dma_status); if (!(request->flags & (ATA_R_ATAPI | ATA_R_CONTROL))) printf(" LBA=%ju", request->u.ata.lba); printf("\n");