summaryrefslogtreecommitdiffstats
path: root/sys/arm
diff options
context:
space:
mode:
authorcognet <cognet@FreeBSD.org>2005-01-15 19:07:23 +0000
committercognet <cognet@FreeBSD.org>2005-01-15 19:07:23 +0000
commit072c5193867a33c12c0ce1a85cc9afe2b0dfa8b6 (patch)
tree33559cf04163966407c60a52b8a5818a6df5f25f /sys/arm
parent5435311167caebf5b9f856465d620c8676b26e4e (diff)
downloadFreeBSD-src-072c5193867a33c12c0ce1a85cc9afe2b0dfa8b6.zip
FreeBSD-src-072c5193867a33c12c0ce1a85cc9afe2b0dfa8b6.tar.gz
MFi386: add bus_dmamap_load_mbuf_sg().
Diffstat (limited to 'sys/arm')
-rw-r--r--sys/arm/arm/busdma_machdep.c36
1 files changed, 36 insertions, 0 deletions
diff --git a/sys/arm/arm/busdma_machdep.c b/sys/arm/arm/busdma_machdep.c
index 03f211a..f48ed75 100644
--- a/sys/arm/arm/busdma_machdep.c
+++ b/sys/arm/arm/busdma_machdep.c
@@ -46,6 +46,7 @@ __FBSDID("$FreeBSD$");
#include <sys/mutex.h>
#include <sys/mbuf.h>
#include <sys/uio.h>
+#include <sys/ktr.h>
#include <vm/vm.h>
#include <vm/vm_page.h>
@@ -566,6 +567,41 @@ bus_dmamap_load_mbuf(bus_dma_tag_t dmat, bus_dmamap_t map, struct mbuf *m0,
return (error);
}
+int
+bus_dmamap_load_mbuf_sg(bus_dma_tag_t dmat, bus_dmamap_t map,
+ struct mbuf *m0, bus_dma_segment_t *segs, int *nsegs,
+ int flags)
+{
+ int error = 0;
+ M_ASSERTPKTHDR(m0);
+
+ flags |= BUS_DMA_NOWAIT;
+ *nsegs = -1;
+ if (m0->m_pkthdr.len <= dmat->maxsize) {
+ int first = 1;
+ 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,
+ nsegs);
+ first = 0;
+ }
+ }
+ } else {
+ error = EINVAL;
+ }
+
+ /* XXX FIXME: Having to increment nsegs is really annoying */
+ ++*nsegs;
+ CTR4(KTR_BUSDMA, "bus_dmamap_load_mbuf: tag %p tag flags 0x%x "
+ "error %d nsegs %d", dmat, dmat->flags, error, *nsegs);
+ return (error);
+}
+
/*
* Like bus_dmamap_load(), but for uios.
*/
OpenPOWER on IntegriCloud