Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 7 Dec 2012 06:05:35 +0000 (UTC)
From:      Jeff Roberson <jeff@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject:   svn commit: r243972 - in projects/physbio/sys: arm/arm ia64/ia64 powerpc/powerpc sparc64/sparc64 x86/x86
Message-ID:  <201212070605.qB765Z3X030060@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: jeff
Date: Fri Dec  7 06:05:34 2012
New Revision: 243972
URL: http://svnweb.freebsd.org/changeset/base/243972

Log:
   - Eliminate the 'first' argument required by some load_buffer()
     implementations by requiring that the segment count is -1 on entry.
  
  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/powerpc/powerpc/busdma_machdep.c
  projects/physbio/sys/sparc64/sparc64/bus_machdep.c
  projects/physbio/sys/sparc64/sparc64/iommu.c
  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	Fri Dec  7 05:55:48 2012	(r243971)
+++ projects/physbio/sys/arm/arm/busdma_machdep-v6.c	Fri Dec  7 06:05:34 2012	(r243972)
@@ -713,7 +713,6 @@ _bus_dmamap_count_pages(bus_dma_tag_t dm
 /*
  * Utility function to load a linear buffer.  segp contains
  * the starting segment on entrace, and the ending segment on exit.
- * first indicates if this is the first invocation of this function.
  */
 static __inline int
 _bus_dmamap_load_buffer(bus_dma_tag_t dmat,
@@ -721,8 +720,7 @@ _bus_dmamap_load_buffer(bus_dma_tag_t dm
 			void *buf, bus_size_t buflen,
 			int flags,
 			bus_dma_segment_t *segs,
-			int *segp,
-			int first)
+			int *segp)
 {
 	bus_size_t sgsize;
 	bus_addr_t curaddr, baddr, bmask;
@@ -803,10 +801,10 @@ _bus_dmamap_load_buffer(bus_dma_tag_t dm
 		 * Insert chunk into a segment, coalescing with
 		 * previous segment if possible.
 		 */
-		if (first) {
+		if (seg == -1) {
+			seg = 0;
 			segs[seg].ds_addr = curaddr;
 			segs[seg].ds_len = sgsize;
-			first = 0;
 		} else {
 			if (curaddr == segs[seg].ds_addr + segs[seg].ds_len &&
 			    (segs[seg].ds_len + sgsize) <= dmat->maxsegsz &&
@@ -845,7 +843,7 @@ bus_dmamap_load(bus_dma_tag_t dmat, bus_
 		bus_size_t buflen, bus_dmamap_callback_t *callback,
 		void *callback_arg, int flags)
 {
-	int			error, nsegs = 0;
+	int			error, nsegs = -1;
 
 	flags |= BUS_DMA_WAITOK;
 	map->callback = callback;
@@ -853,7 +851,7 @@ bus_dmamap_load(bus_dma_tag_t dmat, bus_
 	map->pmap = kernel_pmap;
 
 	error = _bus_dmamap_load_buffer(dmat, map, buf, buflen, flags,
-		     dmat->segments, &nsegs, 1);
+		     dmat->segments, &nsegs);
 
 	CTR5(KTR_BUSDMA, "%s: tag %p tag flags 0x%x error %d nsegs %d",
 	    __func__, dmat, dmat->flags, error, nsegs + 1);
@@ -892,18 +890,16 @@ _bus_dmamap_load_mbuf_sg(bus_dma_tag_t d
 	map->pmap = kernel_pmap;
 
 	flags |= BUS_DMA_NOWAIT;
-	*nsegs = 0;
+	*nsegs = -1;
 	error = 0;
 	if (m0->m_pkthdr.len <= dmat->maxsize) {
-		int first = 1;
 		struct mbuf *m;
 
 		for (m = m0; m != NULL && error == 0; m = m->m_next) {
 			if (m->m_len > 0) {
 				error = _bus_dmamap_load_buffer(dmat, map,
 						m->m_data, m->m_len,
-						flags, segs, nsegs, first);
-				first = 0;
+						flags, segs, nsegs);
 			}
 		}
 	} else {
@@ -958,7 +954,7 @@ bus_dmamap_load_uio(bus_dma_tag_t dmat, 
 		    bus_dmamap_callback2_t *callback, void *callback_arg,
 		    int flags)
 {
-	int nsegs, error, first, i;
+	int nsegs, error, i;
 	bus_size_t resid;
 	struct iovec *iov;
 
@@ -973,9 +969,8 @@ bus_dmamap_load_uio(bus_dma_tag_t dmat, 
 	} else
 		map->pmap = kernel_pmap;
 
-	nsegs = 0;
+	nsegs = -1;
 	error = 0;
-	first = 1;
 	for (i = 0; i < uio->uio_iovcnt && resid != 0 && !error; i++) {
 		/*
 		 * Now at the first iovec to load.  Load each iovec
@@ -988,8 +983,7 @@ bus_dmamap_load_uio(bus_dma_tag_t dmat, 
 		if (minlen > 0) {
 			error = _bus_dmamap_load_buffer(dmat, map,
 					addr, minlen, flags,
-					dmat->segments, &nsegs, first);
-			first = 0;
+					dmat->segments, &nsegs);
 			resid -= minlen;
 		}
 	}

Modified: projects/physbio/sys/arm/arm/busdma_machdep.c
==============================================================================
--- projects/physbio/sys/arm/arm/busdma_machdep.c	Fri Dec  7 05:55:48 2012	(r243971)
+++ projects/physbio/sys/arm/arm/busdma_machdep.c	Fri Dec  7 06:05:34 2012	(r243972)
@@ -748,7 +748,6 @@ _bus_dmamap_count_pages(bus_dma_tag_t dm
 /*
  * Utility function to load a linear buffer.  segp contains
  * the starting segment on entrance, and the ending segment on exit.
- * first indicates if this is the first invocation of this function.
  */
 static __inline int
 bus_dmamap_load_buffer(bus_dma_tag_t dmat, bus_dma_segment_t *segs,

Modified: projects/physbio/sys/ia64/ia64/busdma_machdep.c
==============================================================================
--- projects/physbio/sys/ia64/ia64/busdma_machdep.c	Fri Dec  7 05:55:48 2012	(r243971)
+++ projects/physbio/sys/ia64/ia64/busdma_machdep.c	Fri Dec  7 06:05:34 2012	(r243972)
@@ -483,12 +483,11 @@ bus_dmamem_free(bus_dma_tag_t dmat, void
 /*
  * Utility function to load a linear buffer.  segp contains
  * the starting segment on entrace, and the ending segment on exit.
- * first indicates if this is the first invocation of this function.
  */
 static int
 _bus_dmamap_load_buffer(bus_dma_tag_t dmat, bus_dmamap_t map, void *buf,
     bus_size_t buflen, struct thread *td, int flags,
-    bus_dma_segment_t *segs, int *segp, int first)
+    bus_dma_segment_t *segs, int *segp)
 {
 	bus_size_t sgsize;
 	bus_addr_t curaddr, baddr, bmask;
@@ -589,10 +588,10 @@ _bus_dmamap_load_buffer(bus_dma_tag_t dm
 		 * Insert chunk into a segment, coalescing with
 		 * previous segment if possible.
 		 */
-		if (first) {
+		if (seg == -1) {
+			seg = 0;
 			segs[seg].ds_addr = curaddr;
 			segs[seg].ds_len = sgsize;
-			first = 0;
 		} else {
 			if (curaddr == segs[seg].ds_addr + segs[seg].ds_len &&
 			    (segs[seg].ds_len + sgsize) <= dmat->maxsegsz &&
@@ -627,7 +626,7 @@ bus_dmamap_load(bus_dma_tag_t dmat, bus_
     bus_size_t buflen, bus_dmamap_callback_t *callback, void *callback_arg,
     int flags)
 {
-	int error, nsegs = 0;
+	int error, nsegs = -1;
 
 	if (map != NULL) {
 		flags |= BUS_DMA_WAITOK;
@@ -636,7 +635,7 @@ bus_dmamap_load(bus_dma_tag_t dmat, bus_
 	}
 
 	error = _bus_dmamap_load_buffer(dmat, map, buf, buflen, NULL, flags,
-	    dmat->segments, &nsegs, 1);
+	    dmat->segments, &nsegs);
 
 	if (error == EINPROGRESS)
 		return (error);
@@ -661,18 +660,16 @@ bus_dmamap_load_mbuf(bus_dma_tag_t dmat,
 	M_ASSERTPKTHDR(m0);
 
 	flags |= BUS_DMA_NOWAIT;
-	nsegs = 0;
+	nsegs = -1;
 	error = 0;
 	if (m0->m_pkthdr.len <= dmat->maxsize) {
-		int first = 1;
 		struct mbuf *m;
 
 		for (m = m0; m != NULL && error == 0; m = m->m_next) {
 			if (m->m_len > 0) {
 				error = _bus_dmamap_load_buffer(dmat, map,
 				    m->m_data, m->m_len, NULL, flags,
-				    dmat->segments, &nsegs, first);
-				first = 0;
+				    dmat->segments, &nsegs);
 			}
 		}
 	} else {
@@ -698,18 +695,16 @@ bus_dmamap_load_mbuf_sg(bus_dma_tag_t dm
 	M_ASSERTPKTHDR(m0);
 
 	flags |= BUS_DMA_NOWAIT;
-	*nsegs = 0;
+	*nsegs = -1;
 	error = 0;
 	if (m0->m_pkthdr.len <= dmat->maxsize) {
-		int first = 1;
 		struct mbuf *m;
 
 		for (m = m0; m != NULL && error == 0; m = m->m_next) {
 			if (m->m_len > 0) {
 				error = _bus_dmamap_load_buffer(dmat, map,
 				    m->m_data, m->m_len, NULL, flags,
-				    segs, nsegs, first);
-				first = 0;
+				    segs, nsegs);
 			}
 		}
 		++*nsegs;
@@ -727,7 +722,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)
 {
-	int nsegs, error, first, i;
+	int nsegs, error, i;
 	bus_size_t resid;
 	struct iovec *iov;
 	struct thread *td = NULL;
@@ -742,9 +737,8 @@ bus_dmamap_load_uio(bus_dma_tag_t dmat, 
 			("bus_dmamap_load_uio: USERSPACE but no proc"));
 	}
 
-	nsegs = 0;
+	nsegs = -1;
 	error = 0;
-	first = 1;
 	for (i = 0; i < uio->uio_iovcnt && resid != 0 && !error; i++) {
 		/*
 		 * Now at the first iovec to load.  Load each iovec
@@ -757,9 +751,7 @@ bus_dmamap_load_uio(bus_dma_tag_t dmat, 
 		if (minlen > 0) {
 			error = _bus_dmamap_load_buffer(dmat, map, addr,
 			    minlen, td, flags, dmat->segments,
-			    &nsegs, first);
-			first = 0;
-
+			    &nsegs);
 			resid -= minlen;
 		}
 	}

Modified: projects/physbio/sys/powerpc/powerpc/busdma_machdep.c
==============================================================================
--- projects/physbio/sys/powerpc/powerpc/busdma_machdep.c	Fri Dec  7 05:55:48 2012	(r243971)
+++ projects/physbio/sys/powerpc/powerpc/busdma_machdep.c	Fri Dec  7 06:05:34 2012	(r243972)
@@ -567,7 +567,6 @@ bus_dmamem_free(bus_dma_tag_t dmat, void
 /*
  * Utility function to load a linear buffer.  segp contains
  * the starting segment on entrance, and the ending segment on exit.
- * first indicates if this is the first invocation of this function.
  */
 static __inline int
 _bus_dmamap_load_buffer(bus_dma_tag_t dmat,
@@ -576,8 +575,7 @@ _bus_dmamap_load_buffer(bus_dma_tag_t dm
 			pmap_t pmap,
 			int flags,
 			bus_dma_segment_t *segs,
-			int *segp,
-			int first)
+			int *segp)
 {
 	bus_size_t sgsize;
 	bus_addr_t curaddr, baddr, bmask;
@@ -679,10 +677,10 @@ _bus_dmamap_load_buffer(bus_dma_tag_t dm
 		 * Insert chunk into a segment, coalescing with
 		 * previous segment if possible.
 		 */
-		if (first) {
+		if (seg == -1) {
+			seg = 0;
 			segs[seg].ds_addr = curaddr;
 			segs[seg].ds_len = sgsize;
-			first = 0;
 		} else {
 			if (curaddr == segs[seg].ds_addr + segs[seg].ds_len &&
 			    (segs[seg].ds_len + sgsize) <= dmat->maxsegsz &&
@@ -725,9 +723,9 @@ bus_dmamap_load(bus_dma_tag_t dmat, bus_
 		map->callback_arg = callback_arg;
 	}
 
-	map->nsegs = 0;
+	map->nsegs = -1;
 	error = _bus_dmamap_load_buffer(dmat, map, buf, buflen, NULL, flags,
-	     map->segments, &map->nsegs, 1);
+	     map->segments, &map->nsegs);
 	map->nsegs++;
 
 	CTR5(KTR_BUSDMA, "%s: tag %p tag flags 0x%x error %d nsegs %d",
@@ -772,10 +770,9 @@ bus_dmamap_load_mbuf(bus_dma_tag_t dmat,
 	M_ASSERTPKTHDR(m0);
 
 	flags |= BUS_DMA_NOWAIT;
-	map->nsegs = 0;
+	map->nsegs = -1;
 	error = 0;
 	if (m0->m_pkthdr.len <= dmat->maxsize) {
-		int first = 1;
 		struct mbuf *m;
 
 		for (m = m0; m != NULL && error == 0; m = m->m_next) {
@@ -783,8 +780,7 @@ bus_dmamap_load_mbuf(bus_dma_tag_t dmat,
 				error = _bus_dmamap_load_buffer(dmat, map,
 						m->m_data, m->m_len,
 						NULL, flags,
-						map->segments, &map->nsegs, first);
-				first = 0;
+						map->segments, &map->nsegs);
 			}
 		}
 	} else {
@@ -819,10 +815,9 @@ bus_dmamap_load_mbuf_sg(bus_dma_tag_t dm
 	M_ASSERTPKTHDR(m0);
 
 	flags |= BUS_DMA_NOWAIT;
-	*nsegs = 0;
+	*nsegs = -1;
 	error = 0;
 	if (m0->m_pkthdr.len <= dmat->maxsize) {
-		int first = 1;
 		struct mbuf *m;
 
 		for (m = m0; m != NULL && error == 0; m = m->m_next) {
@@ -830,8 +825,7 @@ bus_dmamap_load_mbuf_sg(bus_dma_tag_t dm
 				error = _bus_dmamap_load_buffer(dmat, map,
 						m->m_data, m->m_len,
 						NULL, flags,
-						segs, nsegs, first);
-				first = 0;
+						segs, nsegs);
 			}
 		}
 	} else {
@@ -863,7 +857,7 @@ bus_dmamap_load_uio(bus_dma_tag_t dmat, 
 		    bus_dmamap_callback2_t *callback, void *callback_arg,
 		    int flags)
 {
-	int error, first, i;
+	int error, i;
 	bus_size_t resid;
 	struct iovec *iov;
 	pmap_t pmap;
@@ -879,9 +873,8 @@ bus_dmamap_load_uio(bus_dma_tag_t dmat, 
 	} else
 		pmap = NULL;
 
-	map->nsegs = 0;
+	map->nsegs = -1;
 	error = 0;
-	first = 1;
 	for (i = 0; i < uio->uio_iovcnt && resid != 0 && !error; i++) {
 		/*
 		 * Now at the first iovec to load.  Load each iovec
@@ -894,8 +887,7 @@ bus_dmamap_load_uio(bus_dma_tag_t dmat, 
 		if (minlen > 0) {
 			error = _bus_dmamap_load_buffer(dmat, map,
 					addr, minlen, pmap, flags,
-					map->segments, &map->nsegs, first);
-			first = 0;
+					map->segments, &map->nsegs);
 
 			resid -= minlen;
 		}

Modified: projects/physbio/sys/sparc64/sparc64/bus_machdep.c
==============================================================================
--- projects/physbio/sys/sparc64/sparc64/bus_machdep.c	Fri Dec  7 05:55:48 2012	(r243971)
+++ projects/physbio/sys/sparc64/sparc64/bus_machdep.c	Fri Dec  7 06:05:34 2012	(r243972)
@@ -328,12 +328,11 @@ nexus_dmamap_destroy(bus_dma_tag_t dmat,
 /*
  * Utility function to load a linear buffer.  segp contains
  * the starting segment on entrace, and the ending segment on exit.
- * first indicates if this is the first invocation of this function.
  */
 static int
 _nexus_dmamap_load_buffer(bus_dma_tag_t dmat, void *buf, bus_size_t buflen,
     struct thread *td, int flags,
-    bus_dma_segment_t *segs, int *segp, int first)
+    bus_dma_segment_t *segs, int *segp)
 {
 	bus_size_t sgsize;
 	bus_addr_t curaddr, baddr, bmask;
@@ -379,10 +378,10 @@ _nexus_dmamap_load_buffer(bus_dma_tag_t 
 		 * Insert chunk into a segment, coalescing with
 		 * previous segment if possible.
 		 */
-		if (first) {
+		if (seg == -1) {
+			seg = 0;
 			segs[seg].ds_addr = curaddr;
 			segs[seg].ds_len = sgsize;
-			first = 0;
 		} else {
 			if (curaddr == segs[seg].ds_addr + segs[seg].ds_len &&
 			    (segs[seg].ds_len + sgsize) <= dmat->dt_maxsegsz &&
@@ -426,8 +425,9 @@ nexus_dmamap_load(bus_dma_tag_t dmat, bu
 {
 	int error, nsegs;
 
+	nsegs = -1;
 	error = _nexus_dmamap_load_buffer(dmat, buf, buflen, NULL, flags,
-	    dmat->dt_segments, &nsegs, 1);
+	    dmat->dt_segments, &nsegs);
 
 	if (error == 0) {
 		(*callback)(callback_arg, dmat->dt_segments, nsegs + 1, 0);
@@ -449,18 +449,16 @@ nexus_dmamap_load_mbuf(bus_dma_tag_t dma
 
 	M_ASSERTPKTHDR(m0);
 
-	nsegs = 0;
+	nsegs = -1;
 	error = 0;
 	if (m0->m_pkthdr.len <= dmat->dt_maxsize) {
-		int first = 1;
 		struct mbuf *m;
 
 		for (m = m0; m != NULL && error == 0; m = m->m_next) {
 			if (m->m_len > 0) {
 				error = _nexus_dmamap_load_buffer(dmat,
 				    m->m_data, m->m_len,NULL, flags,
-				    dmat->dt_segments, &nsegs, first);
-				first = 0;
+				    dmat->dt_segments, &nsegs);
 			}
 		}
 	} else {
@@ -486,18 +484,16 @@ nexus_dmamap_load_mbuf_sg(bus_dma_tag_t 
 
 	M_ASSERTPKTHDR(m0);
 
-	*nsegs = 0;
+	*nsegs = -1;
 	error = 0;
 	if (m0->m_pkthdr.len <= dmat->dt_maxsize) {
-		int first = 1;
 		struct mbuf *m;
 
 		for (m = m0; m != NULL && error == 0; m = m->m_next) {
 			if (m->m_len > 0) {
 				error = _nexus_dmamap_load_buffer(dmat,
-				    m->m_data, m->m_len,NULL, flags,
-				    segs, nsegs, first);
-				first = 0;
+				    m->m_data, m->m_len, NULL, flags,
+				    segs, nsegs);
 			}
 		}
 	} else {
@@ -515,7 +511,7 @@ static int
 nexus_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)
 {
-	int nsegs, error, first, i;
+	int nsegs, error, i;
 	bus_size_t resid;
 	struct iovec *iov;
 	struct thread *td = NULL;
@@ -528,9 +524,8 @@ nexus_dmamap_load_uio(bus_dma_tag_t dmat
 		KASSERT(td != NULL, ("%s: USERSPACE but no proc", __func__));
 	}
 
-	nsegs = 0;
+	nsegs = -1;
 	error = 0;
-	first = 1;
 	for (i = 0; i < uio->uio_iovcnt && resid != 0 && !error; i++) {
 		/*
 		 * Now at the first iovec to load.  Load each iovec
@@ -542,10 +537,7 @@ nexus_dmamap_load_uio(bus_dma_tag_t dmat
 
 		if (minlen > 0) {
 			error = _nexus_dmamap_load_buffer(dmat, addr, minlen,
-			    td, flags, dmat->dt_segments, &nsegs,
-			    first);
-			first = 0;
-
+			    td, flags, dmat->dt_segments, &nsegs);
 			resid -= minlen;
 		}
 	}

Modified: projects/physbio/sys/sparc64/sparc64/iommu.c
==============================================================================
--- projects/physbio/sys/sparc64/sparc64/iommu.c	Fri Dec  7 05:55:48 2012	(r243971)
+++ projects/physbio/sys/sparc64/sparc64/iommu.c	Fri Dec  7 06:05:34 2012	(r243972)
@@ -852,7 +852,7 @@ iommu_dvmamap_destroy(bus_dma_tag_t dt, 
 static int
 iommu_dvmamap_load_buffer(bus_dma_tag_t dt, struct iommu_state *is,
     bus_dmamap_t map, void *buf, bus_size_t buflen, struct thread *td,
-    int flags, bus_dma_segment_t *segs, int *segp, int align)
+    int flags, bus_dma_segment_t *segs, int *segp)
 {
 	bus_addr_t amask, dvmaddr, dvmoffs;
 	bus_size_t sgsize, esize;
@@ -871,7 +871,7 @@ iommu_dvmamap_load_buffer(bus_dma_tag_t 
 
 	vaddr = (vm_offset_t)buf;
 	voffs = vaddr & IO_PAGE_MASK;
-	amask = align ? dt->dt_alignment - 1 : 0;
+	amask = (*segp == -1) ? dt->dt_alignment - 1 : 0;
 
 	/* Try to find a slab that is large enough. */
 	error = iommu_dvma_vallocseg(dt, is, map, voffs, buflen, amask,
@@ -974,7 +974,7 @@ iommu_dvmamap_load(bus_dma_tag_t dt, bus
 	IS_UNLOCK(is);
 
 	error = iommu_dvmamap_load_buffer(dt, is, map, buf, buflen, NULL,
-	    flags, dt->dt_segments, &seg, 1);
+	    flags, dt->dt_segments, &seg);
 
 	IS_LOCK(is);
 	iommu_map_insq(is, map);
@@ -997,7 +997,7 @@ iommu_dvmamap_load_mbuf(bus_dma_tag_t dt
 {
 	struct iommu_state *is = dt->dt_cookie;
 	struct mbuf *m;
-	int error = 0, first = 1, nsegs = -1;
+	int error = 0, nsegs = -1;
 
 	M_ASSERTPKTHDR(m0);
 
@@ -1018,8 +1018,7 @@ iommu_dvmamap_load_mbuf(bus_dma_tag_t dt
 				continue;
 			error = iommu_dvmamap_load_buffer(dt, is, map,
 			    m->m_data, m->m_len, NULL, flags, dt->dt_segments,
-			    &nsegs, first);
-			first = 0;
+			    &nsegs);
 		}
 	} else
 		error = EINVAL;
@@ -1045,7 +1044,7 @@ iommu_dvmamap_load_mbuf_sg(bus_dma_tag_t
 {
 	struct iommu_state *is = dt->dt_cookie;
 	struct mbuf *m;
-	int error = 0, first = 1;
+	int error = 0;
 
 	M_ASSERTPKTHDR(m0);
 
@@ -1067,8 +1066,7 @@ iommu_dvmamap_load_mbuf_sg(bus_dma_tag_t
 				continue;
 			error = iommu_dvmamap_load_buffer(dt, is, map,
 			    m->m_data, m->m_len, NULL, flags, segs,
-			    nsegs, first);
-			first = 0;
+			    nsegs);
 		}
 	} else
 		error = EINVAL;
@@ -1094,7 +1092,7 @@ iommu_dvmamap_load_uio(bus_dma_tag_t dt,
 	struct iovec *iov;
 	struct thread *td = NULL;
 	bus_size_t minlen, resid;
-	int nsegs = -1, error = 0, first = 1, i;
+	int nsegs = -1, error = 0, i;
 
 	if ((map->dm_flags & DMF_LOADED) != 0) {
 #ifdef DIAGNOSTIC
@@ -1127,9 +1125,7 @@ iommu_dvmamap_load_uio(bus_dma_tag_t dt,
 
 		error = iommu_dvmamap_load_buffer(dt, is, map,
 		    iov[i].iov_base, minlen, td, flags, dt->dt_segments,
-		    &nsegs, first);
-		first = 0;
-
+		    &nsegs);
 		resid -= minlen;
 	}
 

Modified: projects/physbio/sys/x86/x86/busdma_machdep.c
==============================================================================
--- projects/physbio/sys/x86/x86/busdma_machdep.c	Fri Dec  7 05:55:48 2012	(r243971)
+++ projects/physbio/sys/x86/x86/busdma_machdep.c	Fri Dec  7 06:05:34 2012	(r243972)
@@ -647,7 +647,6 @@ _bus_dmamap_count_pages(bus_dma_tag_t dm
 /*
  * Utility function to load a linear buffer.  segp contains
  * the starting segment on entrace, and the ending segment on exit.
- * first indicates if this is the first invocation of this function.
  */
 static __inline int
 _bus_dmamap_load_buffer(bus_dma_tag_t dmat,
@@ -656,8 +655,7 @@ _bus_dmamap_load_buffer(bus_dma_tag_t dm
 			pmap_t pmap,
 			int flags,
 			bus_dma_segment_t *segs,
-			int *segp,
-			int first)
+			int *segp)
 {
 	bus_size_t sgsize;
 	bus_addr_t curaddr, baddr, bmask;
@@ -714,10 +712,10 @@ _bus_dmamap_load_buffer(bus_dma_tag_t dm
 		 * Insert chunk into a segment, coalescing with
 		 * previous segment if possible.
 		 */
-		if (first) {
+		if (seg == -1) {
+			seg = 0;
 			segs[seg].ds_addr = curaddr;
 			segs[seg].ds_len = sgsize;
-			first = 0;
 		} else {
 			if (curaddr == segs[seg].ds_addr + segs[seg].ds_len &&
 			    (segs[seg].ds_len + sgsize) <= dmat->maxsegsz &&
@@ -752,7 +750,7 @@ bus_dmamap_load(bus_dma_tag_t dmat, bus_
 		bus_size_t buflen, bus_dmamap_callback_t *callback,
 		void *callback_arg, int flags)
 {
-	int			error, nsegs = 0;
+	int			error, nsegs = -1;
 
 	if (map != NULL) {
 		flags |= BUS_DMA_WAITOK;
@@ -761,7 +759,7 @@ bus_dmamap_load(bus_dma_tag_t dmat, bus_
 	}
 
 	error = _bus_dmamap_load_buffer(dmat, map, buf, buflen, NULL, flags,
-	     dmat->segments, &nsegs, 1);
+	     dmat->segments, &nsegs);
 
 	CTR5(KTR_BUSDMA, "%s: tag %p tag flags 0x%x error %d nsegs %d",
 	    __func__, dmat, dmat->flags, error, nsegs + 1);
@@ -799,10 +797,9 @@ _bus_dmamap_load_mbuf_sg(bus_dma_tag_t d
 	M_ASSERTPKTHDR(m0);
 
 	flags |= BUS_DMA_NOWAIT;
-	*nsegs = 0;
+	*nsegs = -1;
 	error = 0;
 	if (m0->m_pkthdr.len <= dmat->maxsize) {
-		int first = 1;
 		struct mbuf *m;
 
 		for (m = m0; m != NULL && error == 0; m = m->m_next) {
@@ -810,8 +807,7 @@ _bus_dmamap_load_mbuf_sg(bus_dma_tag_t d
 				error = _bus_dmamap_load_buffer(dmat, map,
 						m->m_data, m->m_len,
 						NULL, flags,
-						segs, nsegs, first);
-				first = 0;
+						segs, nsegs);
 			}
 		}
 	} else {
@@ -865,7 +861,7 @@ bus_dmamap_load_uio(bus_dma_tag_t dmat, 
 		    bus_dmamap_callback2_t *callback, void *callback_arg,
 		    int flags)
 {
-	int nsegs, error, first, i;
+	int nsegs, error, i;
 	bus_size_t resid;
 	struct iovec *iov;
 	pmap_t pmap;
@@ -881,9 +877,8 @@ bus_dmamap_load_uio(bus_dma_tag_t dmat, 
 	} else
 		pmap = NULL;
 
-	nsegs = 0;
+	nsegs = -1;
 	error = 0;
-	first = 1;
 	for (i = 0; i < uio->uio_iovcnt && resid != 0 && !error; i++) {
 		/*
 		 * Now at the first iovec to load.  Load each iovec
@@ -896,9 +891,7 @@ bus_dmamap_load_uio(bus_dma_tag_t dmat, 
 		if (minlen > 0) {
 			error = _bus_dmamap_load_buffer(dmat, map,
 					addr, minlen, pmap, flags,
-					dmat->segments, &nsegs, first);
-			first = 0;
-
+					dmat->segments, &nsegs);
 			resid -= minlen;
 		}
 	}



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201212070605.qB765Z3X030060>