diff options
author | scottl <scottl@FreeBSD.org> | 2005-01-15 19:55:25 +0000 |
---|---|---|
committer | scottl <scottl@FreeBSD.org> | 2005-01-15 19:55:25 +0000 |
commit | 5c70871d362bd941b1e6925ad7a1fe03e57d0ec4 (patch) | |
tree | 940cc8ebec35f6e7031497a55a94db609f424d64 | |
parent | 7c9c98e63968c9648a58d5cecd8af2062f1c72e6 (diff) | |
download | FreeBSD-src-5c70871d362bd941b1e6925ad7a1fe03e57d0ec4.zip FreeBSD-src-5c70871d362bd941b1e6925ad7a1fe03e57d0ec4.tar.gz |
Add bus_dmamap_load_mbuf_sg() to powerpc.
-rw-r--r-- | sys/powerpc/include/bus.h | 3 | ||||
-rw-r--r-- | sys/powerpc/powerpc/busdma_machdep.c | 29 |
2 files changed, 32 insertions, 0 deletions
diff --git a/sys/powerpc/include/bus.h b/sys/powerpc/include/bus.h index 19e8c41..d61d6d6 100644 --- a/sys/powerpc/include/bus.h +++ b/sys/powerpc/include/bus.h @@ -890,6 +890,9 @@ int bus_dmamap_load_mbuf(bus_dma_tag_t dmat, bus_dmamap_t map, struct mbuf *mbuf, bus_dmamap_callback2_t *callback, void *callback_arg, int flags); +int bus_dmamap_load_mbuf_sg(bus_dma_tag_t dmat, bus_dmamap_t map, + struct mbuf *mbuf, bus_dma_segment_t *segs, + int *nsegs, int flags); /* * Like bus_dmamap_load but for uios. Note the use of the * bus_dmamap_callback2_t interface. diff --git a/sys/powerpc/powerpc/busdma_machdep.c b/sys/powerpc/powerpc/busdma_machdep.c index 3f3e253..7493980 100644 --- a/sys/powerpc/powerpc/busdma_machdep.c +++ b/sys/powerpc/powerpc/busdma_machdep.c @@ -500,6 +500,35 @@ 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); + + 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, m->m_data, m->m_len, NULL, + flags, &lastaddr, nsegs, first); + first = 0; + } + } + ++*nsegs; + } else { + error = EINVAL; + } + + return (error); +} + /* * Like bus_dmamap_load(), but for uios. */ |