summaryrefslogtreecommitdiffstats
path: root/sys/dev/ata/atapi-all.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/dev/ata/atapi-all.c')
-rw-r--r--sys/dev/ata/atapi-all.c46
1 files changed, 13 insertions, 33 deletions
diff --git a/sys/dev/ata/atapi-all.c b/sys/dev/ata/atapi-all.c
index 56e124b..d39c69b 100644
--- a/sys/dev/ata/atapi-all.c
+++ b/sys/dev/ata/atapi-all.c
@@ -1,5 +1,5 @@
/*-
- * Copyright (c) 1998,1999,2000,2001,2002 Søren Schmidt <sos@FreeBSD.org>
+ * Copyright (c) 1998 - 2003 Søren Schmidt <sos@FreeBSD.org>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -72,18 +72,10 @@ atapi_attach(struct ata_device *atadev)
ata_umode(atadev->param), atadev->param->support_dma);
ATA_SLEEPLOCK_CH(atadev->channel, ATA_CONTROL);
- if (atapi_dma && !(atadev->param->drq_type == ATAPI_DRQT_INTR)) {
- ata_dmainit(atadev,
- (ata_pmode(atadev->param) < 0) ?
- (atadev->param->support_dma ? 4:0):ata_pmode(atadev->param),
- (ata_wmode(atadev->param) < 0) ?
- (atadev->param->support_dma ? 2:0):ata_wmode(atadev->param),
- ata_umode(atadev->param));
- }
+ if (atapi_dma && !(atadev->param->drq_type == ATAPI_DRQT_INTR))
+ atadev->setmode(atadev, ATA_DMA_MAX);
else
- ata_dmainit(atadev,
- ata_pmode(atadev->param) < 0 ? 0 : ata_pmode(atadev->param),
- -1, -1);
+ atadev->setmode(atadev, ATA_PIO_MAX);
ATA_UNLOCK_CH(atadev->channel);
if (!(atadev->result = malloc(sizeof(struct atapi_reqsense), M_ATAPI,
@@ -154,7 +146,7 @@ atapi_detach(struct ata_device *atadev)
}
free(request, M_ATAPI);
}
- ata_dmafree(atadev);
+ atadev->channel->dma->free(atadev);
free(atadev->result, M_ATAPI);
atadev->driver = NULL;
atadev->flags = 0;
@@ -186,7 +178,7 @@ atapi_queue_cmd(struct ata_device *atadev, int8_t *ccb, caddr_t data,
request->driver = driver;
}
if (atadev->mode >= ATA_DMA) {
- if (ata_dmaalloc(atadev))
+ if (atadev->channel->dma->alloc(atadev))
atadev->mode = ATA_PIO;
}
@@ -282,7 +274,7 @@ atapi_transfer(struct atapi_request *request)
((request->ccb[0] == ATAPI_WRITE ||
request->ccb[0] == ATAPI_WRITE_BIG) &&
!(atadev->channel->flags & ATA_ATAPI_DMA_RO))) &&
- !ata_dmasetup(atadev, (void *)request->data, request->bytecount)) {
+ !atadev->channel->dma->setup(atadev, (void *)request->data, request->bytecount)) {
request->flags |= ATPR_F_DMA_USED;
}
@@ -294,7 +286,7 @@ atapi_transfer(struct atapi_request *request)
ata_prtdev(atadev, "failure to send ATAPI packet command\n");
if (request->flags & ATPR_F_DMA_USED)
- ata_dmastart(atadev, request->data, request->bytecount,
+ atadev->channel->dma->start(atadev, request->data, request->bytecount,
request->flags & ATPR_F_READ);
/* command interrupt device ? just return */
@@ -324,7 +316,7 @@ atapi_transfer(struct atapi_request *request)
/* send actual command */
ATA_OUTSW_STRM(atadev->channel->r_io, ATA_DATA, (int16_t *)request->ccb,
- request->ccbsize / sizeof(int16_t));
+ request->ccbsize / sizeof(int16_t));
return ATA_OP_CONTINUES;
}
@@ -352,7 +344,7 @@ atapi_interrupt(struct atapi_request *request)
}
if (request->flags & ATPR_F_DMA_USED) {
- dma_stat = ata_dmadone(atadev);
+ dma_stat = atadev->channel->dma->stop(atadev);
if ((atadev->channel->status & (ATA_S_ERROR | ATA_S_DWF)) ||
dma_stat & ATA_BMSTAT_ERROR) {
request->result = ATA_INB(atadev->channel->r_io, ATA_ERROR);
@@ -473,17 +465,7 @@ void
atapi_reinit(struct ata_device *atadev)
{
/* reinit device parameters */
- if (atadev->mode >= ATA_DMA)
- ata_dmainit(atadev,
- (ata_pmode(atadev->param) < 0) ?
- (atadev->param->support_dma ? 4:0):ata_pmode(atadev->param),
- (ata_wmode(atadev->param) < 0) ?
- (atadev->param->support_dma ? 2:0):ata_wmode(atadev->param),
- ata_umode(atadev->param));
- else
- ata_dmainit(atadev,
- ata_pmode(atadev->param)<0 ? 0 : ata_pmode(atadev->param),
- -1, -1);
+ atadev->setmode(atadev, atadev->mode);
}
int
@@ -608,11 +590,9 @@ atapi_timeout(struct atapi_request *request)
atapi_cmd2str(request->ccb[0]));
if (request->flags & ATPR_F_DMA_USED) {
- ata_dmadone(atadev);
+ atadev->channel->dma->stop(atadev);
if (request->retries == ATAPI_MAX_RETRIES) {
- ata_dmainit(atadev,
- (ata_pmode(atadev->param) < 0) ? 0 :
- ata_pmode(atadev->param), -1, -1);
+ atadev->setmode(atadev, ATA_PIO_MAX);
ata_prtdev(atadev, "trying fallback to PIO mode\n");
request->retries = 0;
}
OpenPOWER on IntegriCloud