Date: Mon, 24 Dec 2012 01:00:37 +0000 (UTC) From: Jeff Roberson <jeff@FreeBSD.org> To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r244649 - in projects/physbio/sys: arm/arm ia64/ia64 kern mips/mips powerpc/powerpc sparc64/include sparc64/sparc64 sys x86/x86 Message-ID: <201212240100.qBO10blO001892@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: jeff Date: Mon Dec 24 01:00:36 2012 New Revision: 244649 URL: http://svnweb.freebsd.org/changeset/base/244649 Log: - Simplify the bus_dma backend API by eliminating turning the three complete variants into a single variant and have the caller do the callbacks. This eliminates a lot of redundant code. - Add missing slist initializations. Pointed out by Ian Lepore. Sponsored by: EMC / Isilon Storage Division Modified: projects/physbio/sys/arm/arm/busdma_machdep-v6.c projects/physbio/sys/arm/arm/busdma_machdep.c projects/physbio/sys/ia64/ia64/busdma_machdep.c projects/physbio/sys/kern/subr_busdma.c projects/physbio/sys/mips/mips/busdma_machdep.c projects/physbio/sys/powerpc/powerpc/busdma_machdep.c projects/physbio/sys/sparc64/include/bus_dma.h projects/physbio/sys/sparc64/sparc64/bus_machdep.c projects/physbio/sys/sparc64/sparc64/iommu.c projects/physbio/sys/sys/bus_dma.h projects/physbio/sys/x86/x86/busdma_machdep.c Modified: projects/physbio/sys/arm/arm/busdma_machdep-v6.c ============================================================================== --- projects/physbio/sys/arm/arm/busdma_machdep-v6.c Mon Dec 24 00:46:34 2012 (r244648) +++ projects/physbio/sys/arm/arm/busdma_machdep-v6.c Mon Dec 24 01:00:36 2012 (r244649) @@ -838,43 +838,21 @@ cleanup: void __bus_dmamap_mayblock(bus_dma_tag_t dmat, bus_dmamap_t map, - bus_dmamap_callback_t *callback, void *callback_arg, - int *flags) + bus_dmamap_callback_t *callback, void *callback_arg) { - (*flags) |= BUS_DMA_WAITOK; map->callback = callback; map->callback_arg = callback_arg; } -void +bus_dma_segment_t * _bus_dmamap_complete(bus_dma_tag_t dmat, bus_dmamap_t map, - bus_dmamap_callback_t *callback, void *callback_arg, - int nsegs, int error) -{ - - if (error) - (*callback)(callback_arg, dmat->segments, 0, error); - else - (*callback)(callback_arg, dmat->segments, nsegs, 0); -} - -void -_bus_dmamap_complete2(bus_dma_tag_t dmat, bus_dmamap_t map, - bus_dmamap_callback2_t *callback, - void *callback_arg, int nsegs, bus_size_t len, int error) + bus_dma_segment_t *segs, int nsegs, int error) { - if (error) - (*callback)(callback_arg, dmat->segments, 0, 0, error); - else - (*callback)(callback_arg, dmat->segments, nsegs, len, error); -} - -void -_bus_dmamap_directseg(bus_dma_tag_t dmat, bus_dmamap_t map, - bus_dma_segment_t *segs, int nsegs, int error) -{ + if (segs == NULL) + segs = dmat->segments; + return (segs); } /* Modified: projects/physbio/sys/arm/arm/busdma_machdep.c ============================================================================== --- projects/physbio/sys/arm/arm/busdma_machdep.c Mon Dec 24 00:46:34 2012 (r244648) +++ projects/physbio/sys/arm/arm/busdma_machdep.c Mon Dec 24 01:00:36 2012 (r244649) @@ -310,9 +310,10 @@ _busdma_alloc_dmamap(bus_dma_tag_t dmat) map->flags = DMAMAP_ALLOCATED; } else map->flags = 0; - if (map != NULL) + if (map != NULL) { STAILQ_INIT(&map->bpages); - else + map->slist = slist; + } else free(slist, M_DEVBUF); return (map); } @@ -916,45 +917,23 @@ cleanup: void __bus_dmamap_mayblock(bus_dma_tag_t dmat, bus_dmamap_t map, - bus_dmamap_callback_t *callback, void *callback_arg, - int *flags) + bus_dmamap_callback_t *callback, void *callback_arg) { KASSERT(dmat != NULL, ("dmatag is NULL")); KASSERT(map != NULL, ("dmamap is NULL")); - (*flags) |= BUS_DMA_WAITOK; map->callback = callback; map->callback_arg = callback_arg; } -void +bus_dma_segment_t * _bus_dmamap_complete(bus_dma_tag_t dmat, bus_dmamap_t map, - bus_dmamap_callback_t *callback, void *callback_arg, - int nsegs, int error) -{ - - if (error) - (*callback)(callback_arg, dmat->segments, 0, error); - else - (*callback)(callback_arg, dmat->segments, nsegs, 0); -} - -void -_bus_dmamap_complete2(bus_dma_tag_t dmat, bus_dmamap_t map, - bus_dmamap_callback2_t *callback, - void *callback_arg, int nsegs, bus_size_t len, int error) + bus_dma_segment_t *segs, int nsegs, int error) { - if (error) - (*callback)(callback_arg, dmat->segments, 0, 0, error); - else - (*callback)(callback_arg, dmat->segments, nsegs, len, error); -} - -void -_bus_dmamap_directseg(bus_dma_tag_t dmat, bus_dmamap_t map, - bus_dma_segment_t *segs, int nsegs, int error) -{ + if (segs == NULL) + segs = dmat->segments; + return (segs); } /* Modified: projects/physbio/sys/ia64/ia64/busdma_machdep.c ============================================================================== --- projects/physbio/sys/ia64/ia64/busdma_machdep.c Mon Dec 24 00:46:34 2012 (r244648) +++ projects/physbio/sys/ia64/ia64/busdma_machdep.c Mon Dec 24 01:00:36 2012 (r244649) @@ -616,42 +616,22 @@ _bus_dmamap_load_buffer(bus_dma_tag_t dm void __bus_dmamap_mayblock(bus_dma_tag_t dmat, bus_dmamap_t map, - bus_dmamap_callback_t *callback, void *callback_arg, int *flags) + bus_dmamap_callback_t *callback, void *callback_arg) { if (map != NULL) { - (*flags) |= BUS_DMA_WAITOK; map->callback = callback; map->callback_arg = callback_arg; } } -void +bus_dma_segment_t * _bus_dmamap_complete(bus_dma_tag_t dmat, bus_dmamap_t map, - bus_dmamap_callback_t *callback, void *callback_arg, int nsegs, int error) -{ - - if (error) - (*callback)(callback_arg, dmat->segments, 0, error); - else - (*callback)(callback_arg, dmat->segments, nsegs, 0); -} - -void -_bus_dmamap_complete2(bus_dma_tag_t dmat, bus_dmamap_t map, - bus_dmamap_callback2_t *callback, - void *callback_arg, int nsegs, bus_size_t len, int error) + bus_dma_segment_t *segs, int nsegs, int error) { - if (error) - (*callback)(callback_arg, dmat->segments, 0, 0, error); - else - (*callback)(callback_arg, dmat->segments, nsegs, len, error); -} - -void -_bus_dmamap_directseg(bus_dma_tag_t dmat, bus_dmamap_t map, - bus_dma_segment_t *segs, int nsegs, int error) -{ + if (segs == NULL) + segs = dmat->segments; + return (segs); } /* Modified: projects/physbio/sys/kern/subr_busdma.c ============================================================================== --- projects/physbio/sys/kern/subr_busdma.c Mon Dec 24 00:46:34 2012 (r244648) +++ projects/physbio/sys/kern/subr_busdma.c Mon Dec 24 01:00:36 2012 (r244649) @@ -60,10 +60,12 @@ bus_dmamap_load(bus_dma_tag_t dmat, bus_ bus_size_t buflen, bus_dmamap_callback_t *callback, void *callback_arg, int flags) { + bus_dma_segment_t *segs; int error; int nsegs; - _bus_dmamap_mayblock(dmat, map, callback, callback_arg, &flags); + if ((flags & BUS_DMA_NOWAIT) == 0) + _bus_dmamap_mayblock(dmat, map, callback, callback_arg); nsegs = -1; error = _bus_dmamap_load_buffer(dmat, map, buf, buflen, kernel_pmap, @@ -76,7 +78,11 @@ bus_dmamap_load(bus_dma_tag_t dmat, bus_ if (error == EINPROGRESS) return (error); - _bus_dmamap_complete(dmat, map, callback, callback_arg, nsegs, error); + segs = _bus_dmamap_complete(dmat, map, NULL, nsegs, error); + if (error) + (*callback)(callback_arg, segs, 0, error); + else + (*callback)(callback_arg, segs, nsegs, 0); /* * Return ENOMEM to the caller so that it can pass it up the stack. @@ -121,12 +127,16 @@ int bus_dmamap_load_mbuf(bus_dma_tag_t dmat, bus_dmamap_t map, struct mbuf *m0, bus_dmamap_callback2_t *callback, void *callback_arg, int flags) { + bus_dma_segment_t *segs; int nsegs, error; error = _bus_dmamap_load_mbuf_sg(dmat, map, m0, NULL, &nsegs, flags); - _bus_dmamap_complete2(dmat, map, callback, callback_arg, nsegs, - m0->m_pkthdr.len, error); + segs = _bus_dmamap_complete(dmat, map, NULL, nsegs, error); + if (error) + (*callback)(callback_arg, segs, 0, 0, error); + else + (*callback)(callback_arg, segs, nsegs, m0->m_pkthdr.len, error); CTR5(KTR_BUSDMA, "%s: tag %p tag flags 0x%x error %d nsegs %d", __func__, dmat, flags, error, nsegs); @@ -140,7 +150,7 @@ bus_dmamap_load_mbuf_sg(bus_dma_tag_t dm int error; error = _bus_dmamap_load_mbuf_sg(dmat, map, m0, segs, nsegs, flags); - _bus_dmamap_directseg(dmat, map, segs, *nsegs, error); + _bus_dmamap_complete(dmat, map, segs, *nsegs, error); return (error); } @@ -151,6 +161,7 @@ int bus_dmamap_load_uio(bus_dma_tag_t dmat, bus_dmamap_t map, struct uio *uio, bus_dmamap_callback2_t *callback, void *callback_arg, int flags) { + bus_dma_segment_t *segs; int nsegs, error, i; bus_size_t resid; bus_size_t minlen; @@ -186,8 +197,11 @@ bus_dmamap_load_uio(bus_dma_tag_t dmat, } } - _bus_dmamap_complete2(dmat, map, callback, callback_arg, nsegs, - uio->uio_resid, error); + segs = _bus_dmamap_complete(dmat, map, NULL, nsegs, error); + if (error) + (*callback)(callback_arg, segs, 0, 0, error); + else + (*callback)(callback_arg, segs, nsegs, uio->uio_resid, error); CTR5(KTR_BUSDMA, "%s: tag %p tag flags 0x%x error %d nsegs %d", __func__, dmat, dmat, error, nsegs + 1); @@ -240,7 +254,7 @@ bus_dmamap_load_ccb(bus_dma_tag_t dmat, callback_arg, /*flags*/0); case CAM_DATA_PADDR: { - struct bus_dma_segment seg; + bus_dma_segment_t seg; seg.ds_addr = (bus_addr_t)(vm_offset_t)data_ptr; seg.ds_len = dxfer_len; @@ -248,13 +262,13 @@ bus_dmamap_load_ccb(bus_dma_tag_t dmat, break; } case CAM_DATA_SG: { - struct bus_dma_segment *segs; + bus_dma_segment_t *segs; int nsegs; int error; int i; flags |= BUS_DMA_NOWAIT; - segs = (struct bus_dma_segment *)data_ptr; + segs = (bus_dma_segment_t *)data_ptr; nsegs = -1; error = 0; for (i = 0; i < sglist_cnt && error == 0; i++) { @@ -263,16 +277,20 @@ bus_dmamap_load_ccb(bus_dma_tag_t dmat, kernel_pmap, flags, NULL, &nsegs); } nsegs++; - _bus_dmamap_complete(dmat, map, callback, callback_arg, nsegs, - error); + segs = _bus_dmamap_complete(dmat, map, NULL, nsegs, error); + if (error) + (*callback)(callback_arg, segs, 0, error); + else + (*callback)(callback_arg, segs, nsegs, error); + if (error == ENOMEM) return (error); break; } case CAM_DATA_SG_PADDR: { - struct bus_dma_segment *segs; + bus_dma_segment_t *segs; /* Just use the segments provided */ - segs = (struct bus_dma_segment *)data_ptr; + segs = (bus_dma_segment_t *)data_ptr; callback(callback_arg, segs, sglist_cnt, 0); break; } Modified: projects/physbio/sys/mips/mips/busdma_machdep.c ============================================================================== --- projects/physbio/sys/mips/mips/busdma_machdep.c Mon Dec 24 00:46:34 2012 (r244648) +++ projects/physbio/sys/mips/mips/busdma_machdep.c Mon Dec 24 01:00:36 2012 (r244649) @@ -288,9 +288,10 @@ _busdma_alloc_dmamap(bus_dma_tag_t dmat) map->flags = DMAMAP_ALLOCATED; } else map->flags = 0; - if (map != NULL) + if (map != NULL) { STAILQ_INIT(&map->bpages); - else + map->slist = slist; + } else free(slist, M_DEVBUF); return (map); } @@ -858,45 +859,23 @@ cleanup: void __bus_dmamap_mayblock(bus_dma_tag_t dmat, bus_dmamap_t map, - bus_dmamap_callback_t *callback, void *callback_arg, - int *flags) + bus_dmamap_callback_t *callback, void *callback_arg) { KASSERT(dmat != NULL, ("dmatag is NULL")); KASSERT(map != NULL, ("dmamap is NULL")); - (*flags) |= BUS_DMA_WAITOK; map->callback = callback; map->callback_arg = callback_arg; } -void -_bus_dmamap_complete(bus_dma_tag_t dmat, bus_dmamap_t map, - bus_dmamap_callback_t *callback, void *callback_arg, - int nsegs, int error) -{ - - if (error) - (*callback)(callback_arg, dmat->segments, 0, error); - else - (*callback)(callback_arg, dmat->segments, nsegs, 0); -} - -void -_bus_dmamap_complete2(bus_dma_tag_t dmat, bus_dmamap_t map, - bus_dmamap_callback2_t *callback, - void *callback_arg, int nsegs, bus_size_t len, int error) -{ - - if (error) - (*callback)(callback_arg, dmat->segments, 0, 0, error); - else - (*callback)(callback_arg, dmat->segments, nsegs, len, error); -} - -void +bus_dma_segment_t * _bus_dmamap_directseg(bus_dma_tag_t dmat, bus_dmamap_t map, - bus_dma_segment_t *segs, int nsegs, int error) + bus_dma_segment_t *segs, int nsegs, int error) { + + if (segs == NULL) + segs = dmat->segments; + return (segs); } /* Modified: projects/physbio/sys/powerpc/powerpc/busdma_machdep.c ============================================================================== --- projects/physbio/sys/powerpc/powerpc/busdma_machdep.c Mon Dec 24 00:46:34 2012 (r244648) +++ projects/physbio/sys/powerpc/powerpc/busdma_machdep.c Mon Dec 24 01:00:36 2012 (r244649) @@ -711,65 +711,31 @@ _bus_dmamap_load_buffer(bus_dma_tag_t dm void __bus_dmamap_mayblock(bus_dma_tag_t dmat, bus_dmamap_t map, - bus_dmamap_callback_t *callback, void *callback_arg, - int *flags) + bus_dmamap_callback_t *callback, void *callback_arg) { if (dmat->flags & BUS_DMA_COULD_BOUNCE) { - (*flags) |= BUS_DMA_WAITOK; map->callback = callback; map->callback_arg = callback_arg; } } -void +bus_dma_segment_t * _bus_dmamap_complete(bus_dma_tag_t dmat, bus_dmamap_t map, - bus_dmamap_callback_t *callback, void *callback_arg, - int nsegs, int error) + bus_dma_segment_t *segs, int nsegs, int error) { - map->nsegs = nsegs; - if (dmat->iommu != NULL) - IOMMU_MAP(dmat->iommu, map->segments, &map->nsegs, - dmat->lowaddr, dmat->highaddr, dmat->alignment, - dmat->boundary, dmat->iommu_cookie); - - if (error) - (*callback)(callback_arg, map->segments, 0, error); + if (segs != NULL) + memcpy(map->segments, segs, map->nsegs*sizeof(segs[0])); else - (*callback)(callback_arg, map->segments, nsegs, 0); -} - -void -_bus_dmamap_complete2(bus_dma_tag_t dmat, bus_dmamap_t map, - bus_dmamap_callback2_t *callback, - void *callback_arg, int nsegs, bus_size_t len, int error) -{ - + segs = map->segments; map->nsegs = nsegs; if (dmat->iommu != NULL) IOMMU_MAP(dmat->iommu, map->segments, &map->nsegs, dmat->lowaddr, dmat->highaddr, dmat->alignment, dmat->boundary, dmat->iommu_cookie); - if (error) - (*callback)(callback_arg, map->segments, 0, 0, error); - else - (*callback)(callback_arg, map->segments, nsegs, len, error); -} - -void -_bus_dmamap_directseg(bus_dma_tag_t dmat, bus_dmamap_t map, - bus_dma_segment_t *segs, int nsegs, int error) -{ - - map->nsegs = nsegs; - if (dmat->iommu != NULL) - IOMMU_MAP(dmat->iommu, segs, &map->nsegs, dmat->lowaddr, - dmat->highaddr, dmat->alignment, dmat->boundary, - dmat->iommu_cookie); - - memcpy(map->segments, segs, map->nsegs*sizeof(segs[0])); + return (segs); } /* Modified: projects/physbio/sys/sparc64/include/bus_dma.h ============================================================================== --- projects/physbio/sys/sparc64/include/bus_dma.h Mon Dec 24 00:46:34 2012 (r244648) +++ projects/physbio/sys/sparc64/include/bus_dma.h Mon Dec 24 01:00:36 2012 (r244649) @@ -82,15 +82,9 @@ struct bus_dma_methods { void *buf, bus_size_t buflen, struct pmap *pmap, int flags, bus_dma_segment_t *segs, int *segp); void (*dm_dmamap_mayblock)(bus_dma_tag_t dmat, bus_dmamap_t map, - bus_dmamap_callback_t *callback, void *callback_arg, int *flags); - void (*dm_dmamap_complete)(bus_dma_tag_t dmat, bus_dmamap_t map, - bus_dmamap_callback_t *callback, void *callback_arg, int nsegs, - int error); - void (*dm_dmamap_complete2)(bus_dma_tag_t dmat, bus_dmamap_t map, - bus_dmamap_callback2_t *callback2, void *callback_arg, int nsegs, - bus_size_t len, int error); - void (*dm_dmamap_directseg)(bus_dma_tag_t dmat, bus_dmamap_t map, - bus_dma_segment_t *segs, int nsegs, int error); + bus_dmamap_callback_t *callback, void *callback_arg); + bus_dma_segment_t *(*dm_dmamap_complete)(bus_dma_tag_t dmat, + bus_dmamap_t map, bus_dma_segment_t *segs, int nsegs, int error); void (*dm_dmamap_unload)(bus_dma_tag_t, bus_dmamap_t); void (*dm_dmamap_sync)(bus_dma_tag_t, bus_dmamap_t, bus_dmasync_op_t); @@ -133,14 +127,10 @@ struct bus_dma_tag { #define _bus_dmamap_load_buffer(t, m, b, l, p, f, s, sp) \ ((t)->dt_mt->dm_dmamap_load_buffer((t), (m), (b), (l), (p), \ (f), (s), (sp))) -#define _bus_dmamap_mayblock(t, m, c, ca, f) \ - ((t)->dt_mt->dm_dmamap_mayblock((t), (m), (c), (ca), (f))) -#define _bus_dmamap_complete(t, m, c, ca, n, e) \ - ((t)->dt_mt->dm_dmamap_complete((t), (m), (c), (ca), (n), (e))) -#define _bus_dmamap_complete2(t, m, c, ca, n, l, e) \ - ((t)->dt_mt->dm_dmamap_complete2((t), (m), (c), (ca), (n), (l), (e))) -#define _bus_dmamap_directseg(t, m, s, n, e) \ - ((t)->dt_mt->dm_dmamap_directseg((t), (m), (s), (n), (e))) +#define _bus_dmamap_mayblock(t, m, c, ca) \ + ((t)->dt_mt->dm_dmamap_mayblock((t), (m), (c), (ca))) +#define _bus_dmamap_complete(t, m, s, n, e) \ + ((t)->dt_mt->dm_dmamap_complete((t), (m), (s), (n), (e))) #define bus_dmamap_unload(t, p) \ ((t)->dt_mt->dm_dmamap_unload((t), (p))) #define bus_dmamap_sync(t, m, op) \ Modified: projects/physbio/sys/sparc64/sparc64/bus_machdep.c ============================================================================== --- projects/physbio/sys/sparc64/sparc64/bus_machdep.c Mon Dec 24 00:46:34 2012 (r244648) +++ projects/physbio/sys/sparc64/sparc64/bus_machdep.c Mon Dec 24 01:00:36 2012 (r244649) @@ -405,42 +405,19 @@ nexus_dmamap_load_buffer(bus_dma_tag_t d static void nexus_dmamap_mayblock(bus_dma_tag_t dmat, bus_dmamap_t map, - bus_dmamap_callback_t *callback, void *callback_arg, int *flags) + bus_dmamap_callback_t *callback, void *callback_arg) { } -static void +static bus_dma_segment_t * nexus_dmamap_complete(bus_dma_tag_t dmat, bus_dmamap_t map, - bus_dmamap_callback_t *callback, void *callback_arg, int nsegs, int error) -{ - - if (error) { - (*callback)(callback_arg, dmat->dt_segments, 0, error); - } else { - map->dm_flags |= DMF_LOADED; - (*callback)(callback_arg, dmat->dt_segments, nsegs, 0); - } -} - -static void -nexus_dmamap_complete2(bus_dma_tag_t dmat, bus_dmamap_t map, - bus_dmamap_callback2_t *callback, void *callback_arg, int nsegs, - bus_size_t len, int error) -{ - - if (error) { - (*callback)(callback_arg, dmat->dt_segments, 0, 0, error); - } else { - map->dm_flags |= DMF_LOADED; - (*callback)(callback_arg, dmat->dt_segments, nsegs, len, error); - } -} - -static void -nexus_dmamap_directseg(bus_dma_tag_t dmat, bus_dmamap_t map, bus_dma_segment_t *segs, int nsegs, int error) { + + if (segs == NULL) + segs = dmat->dt_segments; + return (segs); } /* @@ -546,8 +523,6 @@ static struct bus_dma_methods nexus_dma_ nexus_dmamap_load_buffer, nexus_dmamap_mayblock, nexus_dmamap_complete, - nexus_dmamap_complete2, - nexus_dmamap_directseg, nexus_dmamap_unload, nexus_dmamap_sync, nexus_dmamem_alloc, Modified: projects/physbio/sys/sparc64/sparc64/iommu.c ============================================================================== --- projects/physbio/sys/sparc64/sparc64/iommu.c Mon Dec 24 00:46:34 2012 (r244648) +++ projects/physbio/sys/sparc64/sparc64/iommu.c Mon Dec 24 01:00:36 2012 (r244649) @@ -971,51 +971,12 @@ iommu_dvmamap_load_buffer(bus_dma_tag_t static void iommu_dvmamap_mayblock(bus_dma_tag_t dmat, bus_dmamap_t map, - bus_dmamap_callback_t *callback, void *callback_arg, int *flags) + bus_dmamap_callback_t *callback, void *callback_arg) { } -static void +static bus_dma_segment_t * iommu_dvmamap_complete(bus_dma_tag_t dt, bus_dmamap_t map, - bus_dmamap_callback_t *callback, void *callback_arg, int nsegs, int error) -{ - struct iommu_state *is = dt->dt_cookie; - - IS_LOCK(is); - iommu_map_insq(is, map); - if (error != 0) { - iommu_dvmamap_vunload(is, map); - IS_UNLOCK(is); - (*callback)(callback_arg, dt->dt_segments, 0, error); - } else { - IS_UNLOCK(is); - map->dm_flags |= DMF_LOADED; - (*callback)(callback_arg, dt->dt_segments, nsegs, 0); - } -} - -static void -iommu_dvmamap_complete2(bus_dma_tag_t dt, bus_dmamap_t map, - bus_dmamap_callback2_t *callback, void *callback_arg, int nsegs, - bus_size_t len, int error) -{ - struct iommu_state *is = dt->dt_cookie; - - IS_LOCK(is); - iommu_map_insq(is, map); - if (error != 0) { - iommu_dvmamap_vunload(is, map); - IS_UNLOCK(is); - (*callback)(callback_arg, dt->dt_segments, 0, 0, error); - } else { - IS_UNLOCK(is); - map->dm_flags |= DMF_LOADED; - (*callback)(callback_arg, dt->dt_segments, nsegs, len, 0); - } -} - -static void -iommu_dvmamap_directseg(bus_dma_tag_t dt, bus_dmamap_t map, bus_dma_segment_t *segs, int nsegs, int error) { struct iommu_state *is = dt->dt_cookie; @@ -1029,6 +990,9 @@ iommu_dvmamap_directseg(bus_dma_tag_t dt IS_UNLOCK(is); map->dm_flags |= DMF_LOADED; } + if (segs == NULL) + segs = dt->dt_segments; + return (segs); } static void @@ -1127,8 +1091,6 @@ struct bus_dma_methods iommu_dma_methods iommu_dvmamap_load_buffer, iommu_dvmamap_mayblock, iommu_dvmamap_complete, - iommu_dvmamap_complete2, - iommu_dvmamap_directseg, iommu_dvmamap_unload, iommu_dvmamap_sync, iommu_dvmamem_alloc, Modified: projects/physbio/sys/sys/bus_dma.h ============================================================================== --- projects/physbio/sys/sys/bus_dma.h Mon Dec 24 00:46:34 2012 (r244648) +++ projects/physbio/sys/sys/bus_dma.h Mon Dec 24 01:00:36 2012 (r244649) @@ -287,31 +287,23 @@ void _bus_dmamap_unload(bus_dma_tag_t dm * software. */ void __bus_dmamap_mayblock(bus_dma_tag_t dmat, bus_dmamap_t map, - bus_dmamap_callback_t *callback, void *callback_arg, - int *flags); + bus_dmamap_callback_t *callback, void *callback_arg); -#define _bus_dmamap_mayblock(dmat, map, callback, callback_arg, flags) \ +#define _bus_dmamap_mayblock(dmat, map, callback, callback_arg) \ do { \ if ((map) != NULL) \ __bus_dmamap_mayblock(dmat, map, callback, \ - callback_arg, flags); \ + callback_arg); \ } while (0); int _bus_dmamap_load_buffer(bus_dma_tag_t dmat, bus_dmamap_t map, void *buf, bus_size_t buflen, struct pmap *pmap, int flags, bus_dma_segment_t *segs, int *segp); -void _bus_dmamap_complete(bus_dma_tag_t dmat, bus_dmamap_t map, - bus_dmamap_callback_t *callback, void *callback_arg, - int nsegs, int error); - -void _bus_dmamap_complete2(bus_dma_tag_t dmat, bus_dmamap_t map, - bus_dmamap_callback2_t *callback2, - void *callback_arg, int nsegs, bus_size_t len, - int error); - -void _bus_dmamap_directseg(bus_dma_tag_t dmat, bus_dmamap_t map, - bus_dma_segment_t *segs, int nsegs, int error); +bus_dma_segment_t *_bus_dmamap_complete(bus_dma_tag_t dmat, + bus_dmamap_t map, + bus_dma_segment_t *segs, + int nsegs, int error); #endif /* __sparc64__ */ Modified: projects/physbio/sys/x86/x86/busdma_machdep.c ============================================================================== --- projects/physbio/sys/x86/x86/busdma_machdep.c Mon Dec 24 00:46:34 2012 (r244648) +++ projects/physbio/sys/x86/x86/busdma_machdep.c Mon Dec 24 01:00:36 2012 (r244649) @@ -745,44 +745,22 @@ _bus_dmamap_load_buffer(bus_dma_tag_t dm void __bus_dmamap_mayblock(bus_dma_tag_t dmat, bus_dmamap_t map, - bus_dmamap_callback_t *callback, void *callback_arg, - int *flags) + bus_dmamap_callback_t *callback, void *callback_arg) { if (map != NULL) { - (*flags) |= BUS_DMA_WAITOK; map->callback = callback; map->callback_arg = callback_arg; } } -void +bus_dma_segment_t * _bus_dmamap_complete(bus_dma_tag_t dmat, bus_dmamap_t map, - bus_dmamap_callback_t *callback, void *callback_arg, - int nsegs, int error) -{ - - if (error) - (*callback)(callback_arg, dmat->segments, 0, error); - else - (*callback)(callback_arg, dmat->segments, nsegs, 0); -} - -void -_bus_dmamap_complete2(bus_dma_tag_t dmat, bus_dmamap_t map, - bus_dmamap_callback2_t *callback, - void *callback_arg, int nsegs, bus_size_t len, int error) -{ - - if (error) - (*callback)(callback_arg, dmat->segments, 0, 0, error); - else - (*callback)(callback_arg, dmat->segments, nsegs, len, error); -} - -void -_bus_dmamap_directseg(bus_dma_tag_t dmat, bus_dmamap_t map, bus_dma_segment_t *segs, int nsegs, int error) { + + if (segs == NULL) + segs = dmat->segments; + return (segs); } /*
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201212240100.qBO10blO001892>