コード例 #1
0
ファイル: ata_dbdma.c プロジェクト: 2asoft/freebsd
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;
}
コード例 #2
0
ファイル: ata_dbdma.c プロジェクト: 2asoft/freebsd
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;
}
コード例 #3
0
uint8_t
dbdma_get_device_status(dbdma_channel_t *chan)
{
    return (dbdma_get_chan_status(chan) & 0x00ff);
}