static int ata_dbdma_stop(struct ata_request *request) { struct ata_dbdma_channel *sc = device_get_softc(request->parent); uint16_t status; status = dbdma_get_chan_status(sc->dbdma); dbdma_pause(sc->dbdma); sc->sc_ch.dma.flags &= ~ATA_DMA_ACTIVE; if (status & DBDMA_STATUS_DEAD) { device_printf(request->parent,"DBDMA dead, resetting " "channel...\n"); ata_dbdma_reset(request->parent); return ATA_S_ERROR; } if (!(status & DBDMA_STATUS_RUN)) { device_printf(request->parent,"DBDMA confused, stop called " "when channel is not running!\n"); return ATA_S_ERROR; } if (status & DBDMA_STATUS_ACTIVE) { device_printf(request->parent,"DBDMA channel stopped " "prematurely\n"); return ATA_S_ERROR; } return 0; }
static int ata_dbdma_status(device_t dev) { struct ata_dbdma_channel *sc = device_get_softc(dev); struct ata_channel *ch = device_get_softc(dev); if (sc->sc_ch.dma.flags & ATA_DMA_ACTIVE) { return (!(dbdma_get_chan_status(sc->dbdma) & DBDMA_STATUS_ACTIVE)); } if (ATA_IDX_INB(ch, ATA_ALTSTAT) & ATA_S_BUSY) { DELAY(100); if (ATA_IDX_INB(ch, ATA_ALTSTAT) & ATA_S_BUSY) return 0; } return 1; }
uint8_t dbdma_get_device_status(dbdma_channel_t *chan) { return (dbdma_get_chan_status(chan) & 0x00ff); }