summaryrefslogtreecommitdiffstats
path: root/sys/dev/ata/ata-dma.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/dev/ata/ata-dma.c')
-rw-r--r--sys/dev/ata/ata-dma.c115
1 files changed, 59 insertions, 56 deletions
diff --git a/sys/dev/ata/ata-dma.c b/sys/dev/ata/ata-dma.c
index 974fb7d..98e35a1 100644
--- a/sys/dev/ata/ata-dma.c
+++ b/sys/dev/ata/ata-dma.c
@@ -1,5 +1,5 @@
/*-
- * Copyright (c) 1998 - 2004 Søren Schmidt <sos@FreeBSD.org>
+ * Copyright (c) 1998 - 2005 Søren Schmidt <sos@FreeBSD.org>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -57,8 +57,8 @@ static int ata_dmaunload(struct ata_channel *);
static MALLOC_DEFINE(M_ATADMA, "ATA DMA", "ATA driver DMA");
/* misc defines */
-#define MAXTABSZ PAGE_SIZE
-#define MAXWSPCSZ PAGE_SIZE
+#define MAXTABSZ PAGE_SIZE
+#define MAXWSPCSZ PAGE_SIZE
struct ata_dc_cb_args {
bus_addr_t maddr;
@@ -104,51 +104,51 @@ ata_dmaalloc(struct ata_channel *ch)
if (bus_dma_tag_create(ch->dma->dmatag, PAGE_SIZE, PAGE_SIZE,
BUS_SPACE_MAXADDR_32BIT, BUS_SPACE_MAXADDR,
NULL, NULL, MAXTABSZ, 1, MAXTABSZ,
- 0, NULL, NULL, &ch->dma->cdmatag))
+ 0, NULL, NULL, &ch->dma->sg_tag))
goto error;
if (bus_dma_tag_create(ch->dma->dmatag,ch->dma->alignment,ch->dma->boundary,
BUS_SPACE_MAXADDR_32BIT, BUS_SPACE_MAXADDR,
NULL, NULL, 256 * DEV_BSIZE,
ATA_DMA_ENTRIES, ch->dma->max_iosize,
- BUS_DMA_ALLOCNOW, NULL, NULL, &ch->dma->ddmatag))
+ BUS_DMA_ALLOCNOW, NULL, NULL, &ch->dma->data_tag))
goto error;
- if (bus_dmamem_alloc(ch->dma->cdmatag, (void **)&ch->dma->dmatab, 0,
- &ch->dma->cdmamap))
+ if (bus_dmamem_alloc(ch->dma->sg_tag, (void **)&ch->dma->sg, 0,
+ &ch->dma->sg_map))
goto error;
- if (bus_dmamap_load(ch->dma->cdmatag, ch->dma->cdmamap, ch->dma->dmatab,
+ if (bus_dmamap_load(ch->dma->sg_tag, ch->dma->sg_map, ch->dma->sg,
MAXTABSZ, ata_dmasetupc_cb, &ccba, 0) || ccba.error) {
- bus_dmamem_free(ch->dma->cdmatag, ch->dma->dmatab, ch->dma->cdmamap);
+ bus_dmamem_free(ch->dma->sg_tag, ch->dma->sg, ch->dma->sg_map);
goto error;
}
- ch->dma->mdmatab = ccba.maddr;
+ ch->dma->sg_bus = ccba.maddr;
- if (bus_dmamap_create(ch->dma->ddmatag, 0, &ch->dma->ddmamap))
+ if (bus_dmamap_create(ch->dma->data_tag, 0, &ch->dma->data_map))
goto error;
if (bus_dma_tag_create(ch->dma->dmatag, PAGE_SIZE, PAGE_SIZE,
BUS_SPACE_MAXADDR_32BIT, BUS_SPACE_MAXADDR,
NULL, NULL, MAXWSPCSZ, 1, MAXWSPCSZ,
- 0, NULL, NULL, &ch->dma->wdmatag))
+ 0, NULL, NULL, &ch->dma->work_tag))
goto error;
- if (bus_dmamem_alloc(ch->dma->wdmatag, (void **)&ch->dma->workspace, 0,
- &ch->dma->wdmamap))
+ if (bus_dmamem_alloc(ch->dma->work_tag, (void **)&ch->dma->work, 0,
+ &ch->dma->work_map))
goto error;
- if (bus_dmamap_load(ch->dma->wdmatag, ch->dma->wdmamap, ch->dma->workspace,
+ if (bus_dmamap_load(ch->dma->work_tag, ch->dma->work_map,ch->dma->work,
MAXWSPCSZ, ata_dmasetupc_cb, &ccba, 0) || ccba.error) {
- bus_dmamem_free(ch->dma->wdmatag, ch->dma->workspace, ch->dma->wdmamap);
+ bus_dmamem_free(ch->dma->work_tag,ch->dma->work, ch->dma->work_map);
goto error;
}
- ch->dma->wdmatab = ccba.maddr;
+ ch->dma->work_bus = ccba.maddr;
return;
error:
- ata_printf(ch, -1, "WARNING - DMA allocation failed, disabling DMA\n");
+ device_printf(ch->dev, "WARNING - DMA allocation failed, disabling DMA\n");
ata_dmafree(ch);
free(ch->dma, M_ATADMA);
ch->dma = NULL;
@@ -157,35 +157,35 @@ error:
static void
ata_dmafree(struct ata_channel *ch)
{
- if (ch->dma->wdmatab) {
- bus_dmamap_unload(ch->dma->wdmatag, ch->dma->wdmamap);
- bus_dmamem_free(ch->dma->wdmatag, ch->dma->workspace, ch->dma->wdmamap);
- ch->dma->wdmatab = 0;
- ch->dma->wdmamap = NULL;
- ch->dma->workspace = NULL;
+ if (ch->dma->work_bus) {
+ bus_dmamap_unload(ch->dma->work_tag, ch->dma->work_map);
+ bus_dmamem_free(ch->dma->work_tag, ch->dma->work, ch->dma->work_map);
+ ch->dma->work_bus = 0;
+ ch->dma->work_map = NULL;
+ ch->dma->work = NULL;
}
- if (ch->dma->wdmatag) {
- bus_dma_tag_destroy(ch->dma->wdmatag);
- ch->dma->wdmatag = NULL;
+ if (ch->dma->work_tag) {
+ bus_dma_tag_destroy(ch->dma->work_tag);
+ ch->dma->work_tag = NULL;
}
- if (ch->dma->mdmatab) {
- bus_dmamap_unload(ch->dma->cdmatag, ch->dma->cdmamap);
- bus_dmamem_free(ch->dma->cdmatag, ch->dma->dmatab, ch->dma->cdmamap);
- ch->dma->mdmatab = 0;
- ch->dma->cdmamap = NULL;
- ch->dma->dmatab = NULL;
+ if (ch->dma->sg_bus) {
+ bus_dmamap_unload(ch->dma->sg_tag, ch->dma->sg_map);
+ bus_dmamem_free(ch->dma->sg_tag, ch->dma->sg, ch->dma->sg_map);
+ ch->dma->sg_bus = 0;
+ ch->dma->sg_map = NULL;
+ ch->dma->sg = NULL;
}
- if (ch->dma->ddmamap) {
- bus_dmamap_destroy(ch->dma->ddmatag, ch->dma->ddmamap);
- ch->dma->ddmamap = NULL;
+ if (ch->dma->data_map) {
+ bus_dmamap_destroy(ch->dma->data_tag, ch->dma->data_map);
+ ch->dma->data_map = NULL;
}
- if (ch->dma->cdmatag) {
- bus_dma_tag_destroy(ch->dma->cdmatag);
- ch->dma->cdmatag = NULL;
+ if (ch->dma->sg_tag) {
+ bus_dma_tag_destroy(ch->dma->sg_tag);
+ ch->dma->sg_tag = NULL;
}
- if (ch->dma->ddmatag) {
- bus_dma_tag_destroy(ch->dma->ddmatag);
- ch->dma->ddmatag = NULL;
+ if (ch->dma->data_tag) {
+ bus_dma_tag_destroy(ch->dma->data_tag);
+ ch->dma->data_tag = NULL;
}
if (ch->dma->dmatag) {
bus_dma_tag_destroy(ch->dma->dmatag);
@@ -213,38 +213,41 @@ ata_dmasetprd(void *xsc, bus_dma_segment_t *segs, int nsegs, int error)
static int
ata_dmaload(struct ata_device *atadev, caddr_t data, int32_t count, int dir)
{
- struct ata_channel *ch = atadev->channel;
+ struct ata_channel *ch = device_get_softc(device_get_parent(atadev->dev));
struct ata_dmasetprd_args cba;
if (ch->dma->flags & ATA_DMA_LOADED) {
- ata_prtdev(atadev, "FAILURE - already active DMA on this device\n");
+ device_printf(atadev->dev,
+ "FAILURE - already active DMA on this device\n");
return -1;
}
if (!count) {
- ata_prtdev(atadev, "FAILURE - zero length DMA transfer attempted\n");
+ device_printf(atadev->dev,
+ "FAILURE - zero length DMA transfer attempted\n");
return -1;
}
if (((uintptr_t)data & (ch->dma->alignment - 1)) ||
(count & (ch->dma->alignment - 1))) {
- ata_prtdev(atadev, "FAILURE - non aligned DMA transfer attempted\n");
+ device_printf(atadev->dev,
+ "FAILURE - non aligned DMA transfer attempted\n");
return -1;
}
if (count > ch->dma->max_iosize) {
- ata_prtdev(atadev,
- "FAILURE - oversized DMA transfer attempted %d > %d\n",
- count, ch->dma->max_iosize);
+ device_printf(atadev->dev,
+ "FAILURE - oversized DMA transfer attempted %d > %d\n",
+ count, ch->dma->max_iosize);
return -1;
}
- cba.dmatab = ch->dma->dmatab;
+ cba.dmatab = ch->dma->sg;
- bus_dmamap_sync(ch->dma->cdmatag, ch->dma->cdmamap, BUS_DMASYNC_PREWRITE);
+ bus_dmamap_sync(ch->dma->sg_tag, ch->dma->sg_map, BUS_DMASYNC_PREWRITE);
- if (bus_dmamap_load(ch->dma->ddmatag, ch->dma->ddmamap, data, count,
+ if (bus_dmamap_load(ch->dma->data_tag, ch->dma->data_map, data, count,
ch->dma->setprd, &cba, 0) || cba.error)
return -1;
- bus_dmamap_sync(ch->dma->ddmatag, ch->dma->ddmamap,
+ bus_dmamap_sync(ch->dma->data_tag, ch->dma->data_map,
dir ? BUS_DMASYNC_PREREAD : BUS_DMASYNC_PREWRITE);
ch->dma->cur_iosize = count;
@@ -255,12 +258,12 @@ ata_dmaload(struct ata_device *atadev, caddr_t data, int32_t count, int dir)
int
ata_dmaunload(struct ata_channel *ch)
{
- bus_dmamap_sync(ch->dma->cdmatag, ch->dma->cdmamap, BUS_DMASYNC_POSTWRITE);
+ bus_dmamap_sync(ch->dma->sg_tag, ch->dma->sg_map, BUS_DMASYNC_POSTWRITE);
- bus_dmamap_sync(ch->dma->ddmatag, ch->dma->ddmamap,
+ bus_dmamap_sync(ch->dma->data_tag, ch->dma->data_map,
(ch->dma->flags & ATA_DMA_READ) != 0 ?
BUS_DMASYNC_POSTREAD : BUS_DMASYNC_POSTWRITE);
- bus_dmamap_unload(ch->dma->ddmatag, ch->dma->ddmamap);
+ bus_dmamap_unload(ch->dma->data_tag, ch->dma->data_map);
ch->dma->cur_iosize = 0;
ch->dma->flags &= ~ATA_DMA_LOADED;
OpenPOWER on IntegriCloud