Skip site navigation (1)Skip section navigation (2)
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>