diff options
author | cognet <cognet@FreeBSD.org> | 2005-01-15 19:07:23 +0000 |
---|---|---|
committer | cognet <cognet@FreeBSD.org> | 2005-01-15 19:07:23 +0000 |
commit | 072c5193867a33c12c0ce1a85cc9afe2b0dfa8b6 (patch) | |
tree | 33559cf04163966407c60a52b8a5818a6df5f25f | |
parent | 5435311167caebf5b9f856465d620c8676b26e4e (diff) | |
download | FreeBSD-src-072c5193867a33c12c0ce1a85cc9afe2b0dfa8b6.zip FreeBSD-src-072c5193867a33c12c0ce1a85cc9afe2b0dfa8b6.tar.gz |
MFi386: add bus_dmamap_load_mbuf_sg().
-rw-r--r-- | sys/arm/arm/busdma_machdep.c | 36 |
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. */ |