diff options
Diffstat (limited to 'sys/dev/ata/ata-dma.c')
-rw-r--r-- | sys/dev/ata/ata-dma.c | 115 |
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; |