Add bus_dmamap_load_mbuf_sg() to ia64

This commit is contained in:
Scott Long 2005-01-15 19:26:17 +00:00
parent 5134102b9d
commit 33072f4de7
2 changed files with 41 additions and 6 deletions

View File

@ -498,10 +498,10 @@ _bus_dmamap_load_buffer(bus_dma_tag_t dmat,
struct thread *td, struct thread *td,
int flags, int flags,
bus_addr_t *lastaddrp, bus_addr_t *lastaddrp,
bus_dma_segment_t *segs;
int *segp, int *segp,
int first) int first)
{ {
bus_dma_segment_t *segs;
bus_size_t sgsize; bus_size_t sgsize;
bus_addr_t curaddr, lastaddr, baddr, bmask; bus_addr_t curaddr, lastaddr, baddr, bmask;
vm_offset_t vaddr; vm_offset_t vaddr;
@ -510,8 +510,6 @@ _bus_dmamap_load_buffer(bus_dma_tag_t dmat,
int seg; int seg;
pmap_t pmap; pmap_t pmap;
segs = dmat->segments;
if (map == NULL) if (map == NULL)
map = &nobounce_dmamap; map = &nobounce_dmamap;
@ -652,7 +650,7 @@ bus_dmamap_load(bus_dma_tag_t dmat, bus_dmamap_t map, void *buf,
} }
error = _bus_dmamap_load_buffer(dmat, map, buf, buflen, NULL, flags, error = _bus_dmamap_load_buffer(dmat, map, buf, buflen, NULL, flags,
&lastaddr, &nsegs, 1); &lastaddr, dmat->segments, &nsegs, 1);
if (error == EINPROGRESS) if (error == EINPROGRESS)
return (error); return (error);
@ -691,7 +689,7 @@ bus_dmamap_load_mbuf(bus_dma_tag_t dmat, bus_dmamap_t map,
error = _bus_dmamap_load_buffer(dmat, map, error = _bus_dmamap_load_buffer(dmat, map,
m->m_data, m->m_len, m->m_data, m->m_len,
NULL, flags, &lastaddr, NULL, flags, &lastaddr,
&nsegs, first); dmat->segments, &nsegs, first);
first = 0; first = 0;
} }
} }
@ -709,6 +707,40 @@ bus_dmamap_load_mbuf(bus_dma_tag_t dmat, bus_dmamap_t map,
return (error); 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 nsegs, error;
M_ASSERTPKTHDR(m0);
flags |= BUS_DMA_NOWAIT;
nsegs = 0;
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);
first = 0;
}
}
++*nsegs;
} else {
error = EINVAL;
}
return (error);
}
/* /*
* Like _bus_dmamap_load(), but for uios. * Like _bus_dmamap_load(), but for uios.
*/ */
@ -748,7 +780,8 @@ bus_dmamap_load_uio(bus_dma_tag_t dmat, bus_dmamap_t map,
if (minlen > 0) { if (minlen > 0) {
error = _bus_dmamap_load_buffer(dmat, map, addr, error = _bus_dmamap_load_buffer(dmat, map, addr,
minlen, td, flags, &lastaddr, &nsegs, first); minlen, td, flags, &lastaddr, dmat->segments,
&nsegs, first);
first = 0; first = 0;
resid -= minlen; resid -= minlen;

View File

@ -1010,6 +1010,8 @@ typedef void bus_dmamap_callback2_t(void *, bus_dma_segment_t *, int,
int bus_dmamap_load_mbuf(bus_dma_tag_t dmat, bus_dmamap_t map, 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, struct mbuf *mbuf, bus_dmamap_callback2_t *callback, void *callback_arg,
int flags); 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 * Like bus_dmamap_load but for uios. Note the use of the