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

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

Log:
   - Eliminate the 'lastaddrp' argument to the load_buffer() routines.  It is
     surely less error prone and less expensive to recalculate than it is to
     remember.  This is a step towards moving all of these functions to the
     same prototype.
  
  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/mips/mips/busdma_machdep.c
  projects/physbio/sys/powerpc/powerpc/busdma_machdep.c
  projects/physbio/sys/sparc64/sparc64/bus_machdep.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:40:45 2012	(r243969)
+++ projects/physbio/sys/arm/arm/busdma_machdep-v6.c	Fri Dec  7 05:42:00 2012	(r243970)
@@ -711,8 +711,7 @@ _bus_dmamap_count_pages(bus_dma_tag_t dm
 }
 
 /*
- * Utility function to load a linear buffer. lastaddrp holds state
- * between invocations (for multiple-buffer loads).  segp contains
+ * 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.
  */
@@ -721,13 +720,12 @@ _bus_dmamap_load_buffer(bus_dma_tag_t dm
 			bus_dmamap_t map,
 			void *buf, bus_size_t buflen,
 			int flags,
-			bus_addr_t *lastaddrp,
 			bus_dma_segment_t *segs,
 			int *segp,
 			int first)
 {
 	bus_size_t sgsize;
-	bus_addr_t curaddr, lastaddr, baddr, bmask;
+	bus_addr_t curaddr, baddr, bmask;
 	vm_offset_t vaddr;
 	struct sync_list *sl;
 	int seg, error;
@@ -740,7 +738,6 @@ _bus_dmamap_load_buffer(bus_dma_tag_t dm
 
 	sl = NULL;
 	vaddr = (vm_offset_t)buf;
-	lastaddr = *lastaddrp;
 	bmask = ~(dmat->boundary - 1);
 
 	for (seg = *segp; buflen > 0 ; ) {
@@ -811,7 +808,7 @@ _bus_dmamap_load_buffer(bus_dma_tag_t dm
 			segs[seg].ds_len = sgsize;
 			first = 0;
 		} else {
-			if (curaddr == lastaddr &&
+			if (curaddr == segs[seg].ds_addr + segs[seg].ds_len &&
 			    (segs[seg].ds_len + sgsize) <= dmat->maxsegsz &&
 			    (dmat->boundary == 0 ||
 			     (segs[seg].ds_addr & bmask) == (curaddr & bmask)))
@@ -824,13 +821,11 @@ _bus_dmamap_load_buffer(bus_dma_tag_t dm
 			}
 		}
 
-		lastaddr = curaddr + sgsize;
 		vaddr += sgsize;
 		buflen -= sgsize;
 	}
 
 	*segp = seg;
-	*lastaddrp = lastaddr;
 cleanup:
 	/*
 	 * Did we fit?
@@ -850,7 +845,6 @@ bus_dmamap_load(bus_dma_tag_t dmat, bus_
 		bus_size_t buflen, bus_dmamap_callback_t *callback,
 		void *callback_arg, int flags)
 {
-	bus_addr_t		lastaddr = 0;
 	int			error, nsegs = 0;
 
 	flags |= BUS_DMA_WAITOK;
@@ -859,7 +853,7 @@ bus_dmamap_load(bus_dma_tag_t dmat, bus_
 	map->pmap = kernel_pmap;
 
 	error = _bus_dmamap_load_buffer(dmat, map, buf, buflen, flags,
-		     &lastaddr, dmat->segments, &nsegs, 1);
+		     dmat->segments, &nsegs, 1);
 
 	CTR5(KTR_BUSDMA, "%s: tag %p tag flags 0x%x error %d nsegs %d",
 	    __func__, dmat, dmat->flags, error, nsegs + 1);
@@ -902,15 +896,13 @@ _bus_dmamap_load_mbuf_sg(bus_dma_tag_t d
 	error = 0;
 	if (m0->m_pkthdr.len <= dmat->maxsize) {
 		int first = 1;
-		bus_addr_t lastaddr = 0;
 		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, &lastaddr,
-						segs, nsegs, first);
+						flags, segs, nsegs, first);
 				first = 0;
 			}
 		}
@@ -966,7 +958,6 @@ bus_dmamap_load_uio(bus_dma_tag_t dmat, 
 		    bus_dmamap_callback2_t *callback, void *callback_arg,
 		    int flags)
 {
-	bus_addr_t lastaddr;
 	int nsegs, error, first, i;
 	bus_size_t resid;
 	struct iovec *iov;
@@ -985,7 +976,6 @@ bus_dmamap_load_uio(bus_dma_tag_t dmat, 
 	nsegs = 0;
 	error = 0;
 	first = 1;
-	lastaddr = (bus_addr_t) 0;
 	for (i = 0; i < uio->uio_iovcnt && resid != 0 && !error; i++) {
 		/*
 		 * Now at the first iovec to load.  Load each iovec
@@ -997,7 +987,7 @@ bus_dmamap_load_uio(bus_dma_tag_t dmat, 
 
 		if (minlen > 0) {
 			error = _bus_dmamap_load_buffer(dmat, map,
-					addr, minlen, flags, &lastaddr,
+					addr, minlen, flags,
 					dmat->segments, &nsegs, first);
 			first = 0;
 			resid -= minlen;

Modified: projects/physbio/sys/arm/arm/busdma_machdep.c
==============================================================================
--- projects/physbio/sys/arm/arm/busdma_machdep.c	Fri Dec  7 05:40:45 2012	(r243969)
+++ projects/physbio/sys/arm/arm/busdma_machdep.c	Fri Dec  7 05:42:00 2012	(r243970)
@@ -224,7 +224,7 @@ SYSINIT(busdma, SI_SUB_VM, SI_ORDER_ANY,
 static __inline int
 bus_dmamap_load_buffer(bus_dma_tag_t dmat, bus_dma_segment_t *segs,
     bus_dmamap_t map, void *buf, bus_size_t buflen, struct pmap *pmap,
-    int flags, vm_offset_t *lastaddrp, int *segp);
+    int flags, int *segp);
 
 static __inline int
 _bus_dma_can_bounce(vm_offset_t lowaddr, vm_offset_t highaddr)
@@ -746,18 +746,17 @@ _bus_dmamap_count_pages(bus_dma_tag_t dm
 }
 
 /*
- * Utility function to load a linear buffer.  lastaddrp holds state
- * between invocations (for multiple-buffer loads).  segp contains
+ * 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,
     bus_dmamap_t map, void *buf, bus_size_t buflen, struct pmap *pmap,
-    int flags, vm_offset_t *lastaddrp, int *segp)
+    int flags, int *segp)
 {
 	bus_size_t sgsize;
-	bus_addr_t curaddr, lastaddr, baddr, bmask;
+	bus_addr_t curaddr, baddr, bmask;
 	vm_offset_t vaddr = (vm_offset_t)buf;
 	int seg;
 	int error = 0;
@@ -765,7 +764,6 @@ bus_dmamap_load_buffer(bus_dma_tag_t dma
 	pt_entry_t pte;
 	pt_entry_t *ptep;
 
-	lastaddr = *lastaddrp;
 	bmask = ~(dmat->boundary - 1);
 
 	if ((dmat->flags & BUS_DMA_COULD_BOUNCE) != 0) {
@@ -866,7 +864,8 @@ bus_dmamap_load_buffer(bus_dma_tag_t dma
 		 * Insert chunk into a segment, coalescing with
 		 * the previous segment if possible.
 		 */
-		if (seg >= 0 && curaddr == lastaddr &&
+		if (seg >= 0 &&
+		    curaddr == segs[seg].ds_addr + segs[seg].ds_len &&
 		    (segs[seg].ds_len + sgsize) <= dmat->maxsegsz &&
 		    (dmat->boundary == 0 ||
 		     (segs[seg].ds_addr & bmask) ==
@@ -882,13 +881,11 @@ bus_dmamap_load_buffer(bus_dma_tag_t dma
 		if (error)
 			break;
 segdone:
-		lastaddr = curaddr + sgsize;
 		vaddr += sgsize;
 		buflen -= sgsize;
 	}
 
 	*segp = seg;
-	*lastaddrp = lastaddr;
 
 	/*
 	 * Did we fit?
@@ -906,7 +903,6 @@ bus_dmamap_load(bus_dma_tag_t dmat, bus_
                 bus_size_t buflen, bus_dmamap_callback_t *callback,
                 void *callback_arg, int flags)
 {
-     	vm_offset_t	lastaddr = 0;
 	int		error, nsegs = -1;
 
 	KASSERT(dmat != NULL, ("dmatag is NULL"));
@@ -919,7 +915,7 @@ bus_dmamap_load(bus_dma_tag_t dmat, bus_
 	map->len = buflen;
 	error = bus_dmamap_load_buffer(dmat,
 	    dmat->segments, map, buf, buflen, kernel_pmap,
-	    flags, &lastaddr, &nsegs);
+	    flags, &nsegs);
 	if (error == EINPROGRESS)
 		return (error);
 	if (error)
@@ -950,14 +946,13 @@ bus_dmamap_load_mbuf(bus_dma_tag_t dmat,
 	map->buffer = m0;
 	map->len = 0;
 	if (m0->m_pkthdr.len <= dmat->maxsize) {
-		vm_offset_t lastaddr = 0;
 		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,
 				    dmat->segments, map, m->m_data, m->m_len,
-				    pmap_kernel(), flags, &lastaddr, &nsegs);
+				    pmap_kernel(), flags, &nsegs);
 				map->len += m->m_len;
 			}
 		}
@@ -995,14 +990,13 @@ bus_dmamap_load_mbuf_sg(bus_dma_tag_t dm
 	map->buffer = m0;			
 	map->len = 0;
 	if (m0->m_pkthdr.len <= dmat->maxsize) {
-		vm_offset_t lastaddr = 0;
 		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, segs, map,
 						m->m_data, m->m_len,
-						pmap_kernel(), flags, &lastaddr,
+						pmap_kernel(), flags,
 						nsegs);
 				map->len += m->m_len;
 			}
@@ -1026,7 +1020,6 @@ bus_dmamap_load_uio(bus_dma_tag_t dmat, 
     bus_dmamap_callback2_t *callback, void *callback_arg,
     int flags)
 {
-	vm_offset_t lastaddr = 0;
 	int nsegs, i, error;
 	bus_size_t resid;
 	struct iovec *iov;
@@ -1059,7 +1052,7 @@ bus_dmamap_load_uio(bus_dma_tag_t dmat, 
 
 		if (minlen > 0) {
 			error = bus_dmamap_load_buffer(dmat, dmat->segments,
-			    map, addr, minlen, pmap, flags, &lastaddr, &nsegs);
+			    map, addr, minlen, pmap, flags, &nsegs);
 
 			map->len += minlen;
 			resid -= minlen;

Modified: projects/physbio/sys/ia64/ia64/busdma_machdep.c
==============================================================================
--- projects/physbio/sys/ia64/ia64/busdma_machdep.c	Fri Dec  7 05:40:45 2012	(r243969)
+++ projects/physbio/sys/ia64/ia64/busdma_machdep.c	Fri Dec  7 05:42:00 2012	(r243970)
@@ -481,18 +481,17 @@ bus_dmamem_free(bus_dma_tag_t dmat, void
 }
 
 /*
- * Utility function to load a linear buffer.  lastaddrp holds state
- * between invocations (for multiple-buffer loads).  segp contains
+ * 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_addr_t *lastaddrp,
+    bus_size_t buflen, struct thread *td, int flags,
     bus_dma_segment_t *segs, int *segp, int first)
 {
 	bus_size_t sgsize;
-	bus_addr_t curaddr, lastaddr, baddr, bmask;
+	bus_addr_t curaddr, baddr, bmask;
 	vm_offset_t vaddr;
 	bus_addr_t paddr;
 	int seg;
@@ -554,7 +553,6 @@ _bus_dmamap_load_buffer(bus_dma_tag_t dm
 		mtx_unlock(&bounce_lock);
 	}
 
-	lastaddr = *lastaddrp;
 	bmask = ~(dmat->boundary - 1);
 
 	for (seg = *segp; buflen > 0 ; ) {
@@ -596,7 +594,7 @@ _bus_dmamap_load_buffer(bus_dma_tag_t dm
 			segs[seg].ds_len = sgsize;
 			first = 0;
 		} else {
-			if (curaddr == lastaddr &&
+			if (curaddr == segs[seg].ds_addr + segs[seg].ds_len &&
 			    (segs[seg].ds_len + sgsize) <= dmat->maxsegsz &&
 			    (dmat->boundary == 0 ||
 			    (segs[seg].ds_addr & bmask) == (curaddr & bmask)))
@@ -609,13 +607,11 @@ _bus_dmamap_load_buffer(bus_dma_tag_t dm
 			}
 		}
 
-		lastaddr = curaddr + sgsize;
 		vaddr += sgsize;
 		buflen -= sgsize;
 	}
 
 	*segp = seg;
-	*lastaddrp = lastaddr;
 
 	/*
 	 * Did we fit?
@@ -631,7 +627,6 @@ bus_dmamap_load(bus_dma_tag_t dmat, bus_
     bus_size_t buflen, bus_dmamap_callback_t *callback, void *callback_arg,
     int flags)
 {
-	bus_addr_t lastaddr = 0;
 	int error, nsegs = 0;
 
 	if (map != NULL) {
@@ -641,7 +636,7 @@ bus_dmamap_load(bus_dma_tag_t dmat, bus_
 	}
 
 	error = _bus_dmamap_load_buffer(dmat, map, buf, buflen, NULL, flags,
-	    &lastaddr, dmat->segments, &nsegs, 1);
+	    dmat->segments, &nsegs, 1);
 
 	if (error == EINPROGRESS)
 		return (error);
@@ -670,14 +665,13 @@ bus_dmamap_load_mbuf(bus_dma_tag_t dmat,
 	error = 0;
 	if (m0->m_pkthdr.len <= dmat->maxsize) {
 		int first = 1;
-		bus_addr_t lastaddr = 0;
 		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,
-				    &lastaddr, dmat->segments, &nsegs, first);
+				    dmat->segments, &nsegs, first);
 				first = 0;
 			}
 		}
@@ -708,14 +702,13 @@ bus_dmamap_load_mbuf_sg(bus_dma_tag_t dm
 	error = 0;
 	if (m0->m_pkthdr.len <= dmat->maxsize) {
 		int first = 1;
-		bus_addr_t lastaddr = 0;
 		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,
-				    &lastaddr, segs, nsegs, first);
+				    segs, nsegs, first);
 				first = 0;
 			}
 		}
@@ -734,7 +727,6 @@ 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_addr_t lastaddr;
 	int nsegs, error, first, i;
 	bus_size_t resid;
 	struct iovec *iov;
@@ -764,7 +756,7 @@ bus_dmamap_load_uio(bus_dma_tag_t dmat, 
 
 		if (minlen > 0) {
 			error = _bus_dmamap_load_buffer(dmat, map, addr,
-			    minlen, td, flags, &lastaddr, dmat->segments,
+			    minlen, td, flags, dmat->segments,
 			    &nsegs, first);
 			first = 0;
 

Modified: projects/physbio/sys/mips/mips/busdma_machdep.c
==============================================================================
--- projects/physbio/sys/mips/mips/busdma_machdep.c	Fri Dec  7 05:40:45 2012	(r243969)
+++ projects/physbio/sys/mips/mips/busdma_machdep.c	Fri Dec  7 05:42:00 2012	(r243970)
@@ -217,7 +217,7 @@ SYSINIT(busdma, SI_SUB_VM, SI_ORDER_ANY,
 static __inline int
 bus_dmamap_load_buffer(bus_dma_tag_t dmat, bus_dma_segment_t *segs,
     bus_dmamap_t map, void *buf, bus_size_t buflen, struct pmap *pmap,
-    int flags, vm_offset_t *lastaddrp, int *segp);
+    int flags, int *segp);
 
 static __inline int
 _bus_dma_can_bounce(vm_offset_t lowaddr, vm_offset_t highaddr)
@@ -744,23 +744,21 @@ _bus_dmamap_count_pages(bus_dma_tag_t dm
 }
 
 /*
- * Utility function to load a linear buffer.  lastaddrp holds state
- * between invocations (for multiple-buffer loads).  segp contains
+ * 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,
     bus_dmamap_t map, void *buf, bus_size_t buflen, struct pmap *pmap,
-    int flags, vm_offset_t *lastaddrp, int *segp)
+    int flags, int *segp)
 {
 	bus_size_t sgsize;
-	bus_addr_t curaddr, lastaddr, baddr, bmask;
+	bus_addr_t curaddr, baddr, bmask;
 	vm_offset_t vaddr = (vm_offset_t)buf;
 	int seg;
 	int error = 0;
 
-	lastaddr = *lastaddrp;
 	bmask = ~(dmat->boundary - 1);
 
 	if ((dmat->flags & BUS_DMA_COULD_BOUNCE) != 0) {
@@ -808,7 +806,8 @@ bus_dmamap_load_buffer(bus_dma_tag_t dma
 		 * Insert chunk into a segment, coalescing with
 		 * the previous segment if possible.
 		 */
-		if (seg >= 0 && curaddr == lastaddr &&
+		if (seg >= 0 &&
+		    curaddr == segs[seg].ds_addr + segs[seg].ds_len &&
 		    (segs[seg].ds_len + sgsize) <= dmat->maxsegsz &&
 		    (dmat->boundary == 0 ||
 		     (segs[seg].ds_addr & bmask) == 
@@ -824,13 +823,11 @@ bus_dmamap_load_buffer(bus_dma_tag_t dma
 		if (error)
 			break;
 segdone:
-		lastaddr = curaddr + sgsize;
 		vaddr += sgsize;
 		buflen -= sgsize;
 	}
 
 	*segp = seg;
-	*lastaddrp = lastaddr;
 
 	/*
 	 * Did we fit?
@@ -848,7 +845,6 @@ bus_dmamap_load(bus_dma_tag_t dmat, bus_
     bus_size_t buflen, bus_dmamap_callback_t *callback,
     void *callback_arg, int flags)
 {
-	vm_offset_t	lastaddr = 0;
 	int		error, nsegs = -1;
 
 	KASSERT(dmat != NULL, ("dmatag is NULL"));
@@ -861,7 +857,7 @@ bus_dmamap_load(bus_dma_tag_t dmat, bus_
 	map->len = buflen;
 	error = bus_dmamap_load_buffer(dmat,
 	    dmat->segments, map, buf, buflen, kernel_pmap,
-	    flags, &lastaddr, &nsegs);
+	    flags, &nsegs);
 	if (error == EINPROGRESS)
 		return (error);
 	if (error)
@@ -892,14 +888,13 @@ bus_dmamap_load_mbuf(bus_dma_tag_t dmat,
 	map->buffer = m0;
 	map->len = 0;
 	if (m0->m_pkthdr.len <= dmat->maxsize) {
-		vm_offset_t lastaddr = 0;
 		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,
 				    dmat->segments, map, m->m_data, m->m_len, 
-				    kernel_pmap, flags, &lastaddr, &nsegs);
+				    kernel_pmap, flags, &nsegs);
 				map->len += m->m_len;
 			}
 		}
@@ -937,14 +932,13 @@ bus_dmamap_load_mbuf_sg(bus_dma_tag_t dm
 	map->buffer = m0;			
 	map->len = 0;
 	if (m0->m_pkthdr.len <= dmat->maxsize) {
-		vm_offset_t lastaddr = 0;
 		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, segs, map,
 						m->m_data, m->m_len,
-						kernel_pmap, flags, &lastaddr,
+						kernel_pmap, flags,
 						nsegs);
 				map->len += m->m_len;
 			}
@@ -968,7 +962,6 @@ bus_dmamap_load_uio(bus_dma_tag_t dmat, 
     bus_dmamap_callback2_t *callback, void *callback_arg,
     int flags)
 {
-	vm_offset_t lastaddr = 0;
 	int nsegs, i, error;
 	bus_size_t resid;
 	struct iovec *iov;
@@ -1002,7 +995,7 @@ bus_dmamap_load_uio(bus_dma_tag_t dmat, 
 
 		if (minlen > 0) {
 			error = bus_dmamap_load_buffer(dmat, dmat->segments,
-			    map, addr, minlen, pmap, flags, &lastaddr, &nsegs);
+			    map, addr, minlen, pmap, flags, &nsegs);
 
 			map->len += minlen;
 			resid -= minlen;

Modified: projects/physbio/sys/powerpc/powerpc/busdma_machdep.c
==============================================================================
--- projects/physbio/sys/powerpc/powerpc/busdma_machdep.c	Fri Dec  7 05:40:45 2012	(r243969)
+++ projects/physbio/sys/powerpc/powerpc/busdma_machdep.c	Fri Dec  7 05:42:00 2012	(r243970)
@@ -565,8 +565,7 @@ bus_dmamem_free(bus_dma_tag_t dmat, void
 }
 
 /*
- * Utility function to load a linear buffer.  lastaddrp holds state
- * between invocations (for multiple-buffer loads).  segp contains
+ * 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.
  */
@@ -576,13 +575,12 @@ _bus_dmamap_load_buffer(bus_dma_tag_t dm
 			void *buf, bus_size_t buflen,
 			pmap_t pmap,
 			int flags,
-			bus_addr_t *lastaddrp,
 			bus_dma_segment_t *segs,
 			int *segp,
 			int first)
 {
 	bus_size_t sgsize;
-	bus_addr_t curaddr, lastaddr, baddr, bmask;
+	bus_addr_t curaddr, baddr, bmask;
 	vm_offset_t vaddr;
 	bus_addr_t paddr;
 	int seg;
@@ -642,7 +640,6 @@ _bus_dmamap_load_buffer(bus_dma_tag_t dm
 	}
 
 	vaddr = (vm_offset_t)buf;
-	lastaddr = *lastaddrp;
 	bmask = ~(dmat->boundary - 1);
 
 	for (seg = *segp; buflen > 0 ; ) {
@@ -687,7 +684,7 @@ _bus_dmamap_load_buffer(bus_dma_tag_t dm
 			segs[seg].ds_len = sgsize;
 			first = 0;
 		} else {
-			if (curaddr == lastaddr &&
+			if (curaddr == segs[seg].ds_addr + segs[seg].ds_len &&
 			    (segs[seg].ds_len + sgsize) <= dmat->maxsegsz &&
 			    (dmat->boundary == 0 ||
 			     (segs[seg].ds_addr & bmask) == (curaddr & bmask)))
@@ -700,13 +697,11 @@ _bus_dmamap_load_buffer(bus_dma_tag_t dm
 			}
 		}
 
-		lastaddr = curaddr + sgsize;
 		vaddr += sgsize;
 		buflen -= sgsize;
 	}
 
 	*segp = seg;
-	*lastaddrp = lastaddr;
 
 	/*
 	 * Did we fit?
@@ -722,7 +717,6 @@ bus_dmamap_load(bus_dma_tag_t dmat, bus_
 		bus_size_t buflen, bus_dmamap_callback_t *callback,
 		void *callback_arg, int flags)
 {
-	bus_addr_t	lastaddr = 0;
 	int		error;
 
 	if (dmat->flags & BUS_DMA_COULD_BOUNCE) {
@@ -733,7 +727,7 @@ bus_dmamap_load(bus_dma_tag_t dmat, bus_
 
 	map->nsegs = 0;
 	error = _bus_dmamap_load_buffer(dmat, map, buf, buflen, NULL, flags,
-	     &lastaddr, map->segments, &map->nsegs, 1);
+	     map->segments, &map->nsegs, 1);
 	map->nsegs++;
 
 	CTR5(KTR_BUSDMA, "%s: tag %p tag flags 0x%x error %d nsegs %d",
@@ -782,14 +776,13 @@ bus_dmamap_load_mbuf(bus_dma_tag_t dmat,
 	error = 0;
 	if (m0->m_pkthdr.len <= dmat->maxsize) {
 		int first = 1;
-		bus_addr_t lastaddr = 0;
 		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, &lastaddr,
+						NULL, flags,
 						map->segments, &map->nsegs, first);
 				first = 0;
 			}
@@ -830,14 +823,13 @@ bus_dmamap_load_mbuf_sg(bus_dma_tag_t dm
 	error = 0;
 	if (m0->m_pkthdr.len <= dmat->maxsize) {
 		int first = 1;
-		bus_addr_t lastaddr = 0;
 		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, &lastaddr,
+						NULL, flags,
 						segs, nsegs, first);
 				first = 0;
 			}
@@ -871,7 +863,6 @@ bus_dmamap_load_uio(bus_dma_tag_t dmat, 
 		    bus_dmamap_callback2_t *callback, void *callback_arg,
 		    int flags)
 {
-	bus_addr_t lastaddr = 0;
 	int error, first, i;
 	bus_size_t resid;
 	struct iovec *iov;
@@ -902,7 +893,7 @@ bus_dmamap_load_uio(bus_dma_tag_t dmat, 
 
 		if (minlen > 0) {
 			error = _bus_dmamap_load_buffer(dmat, map,
-					addr, minlen, pmap, flags, &lastaddr,
+					addr, minlen, pmap, flags,
 					map->segments, &map->nsegs, first);
 			first = 0;
 

Modified: projects/physbio/sys/sparc64/sparc64/bus_machdep.c
==============================================================================
--- projects/physbio/sys/sparc64/sparc64/bus_machdep.c	Fri Dec  7 05:40:45 2012	(r243969)
+++ projects/physbio/sys/sparc64/sparc64/bus_machdep.c	Fri Dec  7 05:42:00 2012	(r243970)
@@ -326,18 +326,17 @@ nexus_dmamap_destroy(bus_dma_tag_t dmat,
 }
 
 /*
- * Utility function to load a linear buffer.  lastaddrp holds state
- * between invocations (for multiple-buffer loads).  segp contains
+ * 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_addr_t *lastaddrp,
+    struct thread *td, int flags,
     bus_dma_segment_t *segs, int *segp, int first)
 {
 	bus_size_t sgsize;
-	bus_addr_t curaddr, lastaddr, baddr, bmask;
+	bus_addr_t curaddr, baddr, bmask;
 	vm_offset_t vaddr = (vm_offset_t)buf;
 	int seg;
 	pmap_t pmap;
@@ -347,7 +346,6 @@ _nexus_dmamap_load_buffer(bus_dma_tag_t 
 	else
 		pmap = NULL;
 
-	lastaddr = *lastaddrp;
 	bmask  = ~(dmat->dt_boundary - 1);
 
 	for (seg = *segp; buflen > 0 ; ) {
@@ -386,7 +384,7 @@ _nexus_dmamap_load_buffer(bus_dma_tag_t 
 			segs[seg].ds_len = sgsize;
 			first = 0;
 		} else {
-			if (curaddr == lastaddr &&
+			if (curaddr == segs[seg].ds_addr + segs[seg].ds_len &&
 			    (segs[seg].ds_len + sgsize) <= dmat->dt_maxsegsz &&
 			    (dmat->dt_boundary == 0 ||
 			    (segs[seg].ds_addr & bmask) == (curaddr & bmask)))
@@ -399,13 +397,11 @@ _nexus_dmamap_load_buffer(bus_dma_tag_t 
 			}
 		}
 
-		lastaddr = curaddr + sgsize;
 		vaddr += sgsize;
 		buflen -= sgsize;
 	}
 
 	*segp = seg;
-	*lastaddrp = lastaddr;
 
 	/*
 	 * Did we fit?
@@ -428,11 +424,10 @@ nexus_dmamap_load(bus_dma_tag_t dmat, bu
     bus_size_t buflen, bus_dmamap_callback_t *callback, void *callback_arg,
     int flags)
 {
-	bus_addr_t lastaddr;
 	int error, nsegs;
 
 	error = _nexus_dmamap_load_buffer(dmat, buf, buflen, NULL, flags,
-	    &lastaddr, dmat->dt_segments, &nsegs, 1);
+	    dmat->dt_segments, &nsegs, 1);
 
 	if (error == 0) {
 		(*callback)(callback_arg, dmat->dt_segments, nsegs + 1, 0);
@@ -458,13 +453,12 @@ nexus_dmamap_load_mbuf(bus_dma_tag_t dma
 	error = 0;
 	if (m0->m_pkthdr.len <= dmat->dt_maxsize) {
 		int first = 1;
-		bus_addr_t lastaddr = 0;
 		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, &lastaddr,
+				    m->m_data, m->m_len,NULL, flags,
 				    dmat->dt_segments, &nsegs, first);
 				first = 0;
 			}
@@ -496,13 +490,12 @@ nexus_dmamap_load_mbuf_sg(bus_dma_tag_t 
 	error = 0;
 	if (m0->m_pkthdr.len <= dmat->dt_maxsize) {
 		int first = 1;
-		bus_addr_t lastaddr = 0;
 		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, &lastaddr,
+				    m->m_data, m->m_len,NULL, flags,
 				    segs, nsegs, first);
 				first = 0;
 			}
@@ -522,7 +515,6 @@ 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)
 {
-	bus_addr_t lastaddr;
 	int nsegs, error, first, i;
 	bus_size_t resid;
 	struct iovec *iov;
@@ -550,7 +542,7 @@ nexus_dmamap_load_uio(bus_dma_tag_t dmat
 
 		if (minlen > 0) {
 			error = _nexus_dmamap_load_buffer(dmat, addr, minlen,
-			    td, flags, &lastaddr, dmat->dt_segments, &nsegs,
+			    td, flags, dmat->dt_segments, &nsegs,
 			    first);
 			first = 0;
 

Modified: projects/physbio/sys/x86/x86/busdma_machdep.c
==============================================================================
--- projects/physbio/sys/x86/x86/busdma_machdep.c	Fri Dec  7 05:40:45 2012	(r243969)
+++ projects/physbio/sys/x86/x86/busdma_machdep.c	Fri Dec  7 05:42:00 2012	(r243970)
@@ -645,8 +645,7 @@ _bus_dmamap_count_pages(bus_dma_tag_t dm
 }
 
 /*
- * Utility function to load a linear buffer.  lastaddrp holds state
- * between invocations (for multiple-buffer loads).  segp contains
+ * 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.
  */
@@ -656,13 +655,12 @@ _bus_dmamap_load_buffer(bus_dma_tag_t dm
 			void *buf, bus_size_t buflen,
 			pmap_t pmap,
 			int flags,
-			bus_addr_t *lastaddrp,
 			bus_dma_segment_t *segs,
 			int *segp,
 			int first)
 {
 	bus_size_t sgsize;
-	bus_addr_t curaddr, lastaddr, baddr, bmask;
+	bus_addr_t curaddr, baddr, bmask;
 	vm_offset_t vaddr;
 	int seg, error;
 
@@ -676,7 +674,6 @@ _bus_dmamap_load_buffer(bus_dma_tag_t dm
 	}
 
 	vaddr = (vm_offset_t)buf;
-	lastaddr = *lastaddrp;
 	bmask = ~(dmat->boundary - 1);
 
 	for (seg = *segp; buflen > 0 ; ) {
@@ -722,7 +719,7 @@ _bus_dmamap_load_buffer(bus_dma_tag_t dm
 			segs[seg].ds_len = sgsize;
 			first = 0;
 		} else {
-			if (curaddr == lastaddr &&
+			if (curaddr == segs[seg].ds_addr + segs[seg].ds_len &&
 			    (segs[seg].ds_len + sgsize) <= dmat->maxsegsz &&
 			    (dmat->boundary == 0 ||
 			     (segs[seg].ds_addr & bmask) == (curaddr & bmask)))
@@ -735,13 +732,11 @@ _bus_dmamap_load_buffer(bus_dma_tag_t dm
 			}
 		}
 
-		lastaddr = curaddr + sgsize;
 		vaddr += sgsize;
 		buflen -= sgsize;
 	}
 
 	*segp = seg;
-	*lastaddrp = lastaddr;
 
 	/*
 	 * Did we fit?
@@ -757,7 +752,6 @@ bus_dmamap_load(bus_dma_tag_t dmat, bus_
 		bus_size_t buflen, bus_dmamap_callback_t *callback,
 		void *callback_arg, int flags)
 {
-	bus_addr_t		lastaddr = 0;
 	int			error, nsegs = 0;
 
 	if (map != NULL) {
@@ -767,7 +761,7 @@ bus_dmamap_load(bus_dma_tag_t dmat, bus_
 	}
 
 	error = _bus_dmamap_load_buffer(dmat, map, buf, buflen, NULL, flags,
-	     &lastaddr, dmat->segments, &nsegs, 1);
+	     dmat->segments, &nsegs, 1);
 
 	CTR5(KTR_BUSDMA, "%s: tag %p tag flags 0x%x error %d nsegs %d",
 	    __func__, dmat, dmat->flags, error, nsegs + 1);
@@ -809,14 +803,13 @@ _bus_dmamap_load_mbuf_sg(bus_dma_tag_t d
 	error = 0;
 	if (m0->m_pkthdr.len <= dmat->maxsize) {
 		int first = 1;
-		bus_addr_t lastaddr = 0;
 		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, &lastaddr,
+						NULL, flags,
 						segs, nsegs, first);
 				first = 0;
 			}
@@ -872,7 +865,6 @@ bus_dmamap_load_uio(bus_dma_tag_t dmat, 
 		    bus_dmamap_callback2_t *callback, void *callback_arg,
 		    int flags)
 {
-	bus_addr_t lastaddr = 0;
 	int nsegs, error, first, i;
 	bus_size_t resid;
 	struct iovec *iov;
@@ -903,7 +895,7 @@ bus_dmamap_load_uio(bus_dma_tag_t dmat, 
 
 		if (minlen > 0) {
 			error = _bus_dmamap_load_buffer(dmat, map,
-					addr, minlen, pmap, flags, &lastaddr,
+					addr, minlen, pmap, flags,
 					dmat->segments, &nsegs, first);
 			first = 0;
 



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