summaryrefslogtreecommitdiffstats
path: root/sys/dev/ata/atapi-all.c
diff options
context:
space:
mode:
authorsos <sos@FreeBSD.org>2003-02-20 20:02:32 +0000
committersos <sos@FreeBSD.org>2003-02-20 20:02:32 +0000
commit93c9b5f5d15135bbb2fbe83962364b1b8d98dd7b (patch)
tree21f00885355e44a0cfacbbf172b07133dc03eb36 /sys/dev/ata/atapi-all.c
parent465aae958c94f33f1c58bf6e4932b8bbb8ac7c73 (diff)
downloadFreeBSD-src-93c9b5f5d15135bbb2fbe83962364b1b8d98dd7b.zip
FreeBSD-src-93c9b5f5d15135bbb2fbe83962364b1b8d98dd7b.tar.gz
First round off updates/fixes to the ATA driver.
This moves all chipset specific code to a new file 'ata-chipset.c'. Extensive use of tables and pointers to avoid having the same switch on chipset type in several places, and to allow substituting various functions for different HW arch needs. Added PIO mode setup and all DMA modes. Support for all known SiS chipsets. Thanks to Christoph Kukulies for sponsoring a nice ASUS P4S8X SiS648 based board for this work! Tested on: i386, PC98, alpha and sparc64
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