freebsd_network: Clean up bus_dma code.

* Turn lastaddrp into a reference instead of a pointer.
 * Use PAGESIZE instead of B_PAGE_SIZE for consistency.
 * Rename "nsegs" variables to "seg" as it is an offset and not a count.

No functional change intended.
This commit is contained in:
Augustin Cavalier
2022-06-13 14:54:40 -04:00
parent ed666fb497
commit 73603a5163
+12 -14
View File
@@ -332,11 +332,10 @@ _validate_address(bus_dma_tag_t dmat, bus_addr_t paddr)
static int static int
_bus_load_buffer(bus_dma_tag_t dmat, void* buf, bus_size_t buflen, _bus_load_buffer(bus_dma_tag_t dmat, void* buf, bus_size_t buflen,
int flags, bus_addr_t* lastaddrp, bus_dma_segment_t* segs, int flags, bus_addr_t& last_phys_addr, bus_dma_segment_t* segs,
int& seg, bool first) int& seg, bool first)
{ {
vm_offset_t virtual_addr = (vm_offset_t)buf; vm_offset_t virtual_addr = (vm_offset_t)buf;
bus_addr_t last_phys_addr = *lastaddrp;
const bus_addr_t boundary_mask = ~(dmat->boundary - 1); const bus_addr_t boundary_mask = ~(dmat->boundary - 1);
while (buflen > 0) { while (buflen > 0) {
@@ -344,7 +343,7 @@ _bus_load_buffer(bus_dma_tag_t dmat, void* buf, bus_size_t buflen,
if (!_validate_address(dmat, phys_addr)) if (!_validate_address(dmat, phys_addr))
return ERANGE; return ERANGE;
bus_size_t segment_size = B_PAGE_SIZE - (phys_addr & PAGE_MASK); bus_size_t segment_size = PAGESIZE - (phys_addr & PAGE_MASK);
if (segment_size > buflen) if (segment_size > buflen)
segment_size = buflen; segment_size = buflen;
if (segment_size > dmat->maxsegsz) if (segment_size > dmat->maxsegsz)
@@ -383,7 +382,6 @@ _bus_load_buffer(bus_dma_tag_t dmat, void* buf, bus_size_t buflen,
buflen -= segment_size; buflen -= segment_size;
} }
*lastaddrp = last_phys_addr;
return (buflen != 0 ? EFBIG : 0); return (buflen != 0 ? EFBIG : 0);
} }
@@ -394,13 +392,13 @@ bus_dmamap_load(bus_dma_tag_t dmat, bus_dmamap_t map, void *buf,
void *callback_arg, int flags) void *callback_arg, int flags)
{ {
bus_addr_t lastaddr = 0; bus_addr_t lastaddr = 0;
int error, nsegs = 0; int error, seg = 0;
if (buflen > dmat->maxsize) if (buflen > dmat->maxsize)
return EINVAL; return EINVAL;
error = _bus_load_buffer(dmat, buf, buflen, flags, error = _bus_load_buffer(dmat, buf, buflen, flags,
&lastaddr, map->segments, nsegs, true); lastaddr, map->segments, seg, true);
if (error != 0) { if (error != 0) {
// Try again using a bounce buffer. // Try again using a bounce buffer.
@@ -412,15 +410,15 @@ bus_dmamap_load(bus_dma_tag_t dmat, bus_dmamap_t map, void *buf,
map->buffer = buf; map->buffer = buf;
map->buffer_length = buflen; map->buffer_length = buflen;
nsegs = lastaddr = 0; seg = lastaddr = 0;
error = _bus_load_buffer(dmat, map->bounce_buffer, buflen, flags, error = _bus_load_buffer(dmat, map->bounce_buffer, buflen, flags,
&lastaddr, map->segments, nsegs, true); lastaddr, map->segments, seg, true);
} }
if (error) if (error)
(*callback)(callback_arg, map->segments, 0, error); (*callback)(callback_arg, map->segments, 0, error);
else else
(*callback)(callback_arg, map->segments, nsegs + 1, 0); (*callback)(callback_arg, map->segments, seg + 1, 0);
// ENOMEM is returned; all other errors are only sent to the callback. // ENOMEM is returned; all other errors are only sent to the callback.
if (error == ENOMEM) if (error == ENOMEM)
@@ -438,7 +436,7 @@ bus_dmamap_load_mbuf_sg(bus_dma_tag_t dmat, bus_dmamap_t map, struct mbuf* mb,
if (mb->m_pkthdr.len > dmat->maxsize) if (mb->m_pkthdr.len > dmat->maxsize)
return EINVAL; return EINVAL;
int nsegs = 0, error = 0; int seg = 0, error = 0;
bool first = true; bool first = true;
bus_addr_t lastaddr = 0; bus_addr_t lastaddr = 0;
flags |= BUS_DMA_NOWAIT; flags |= BUS_DMA_NOWAIT;
@@ -448,7 +446,7 @@ bus_dmamap_load_mbuf_sg(bus_dma_tag_t dmat, bus_dmamap_t map, struct mbuf* mb,
continue; continue;
error = _bus_load_buffer(dmat, m->m_data, m->m_len, error = _bus_load_buffer(dmat, m->m_data, m->m_len,
flags, &lastaddr, segs, nsegs, first); flags, lastaddr, segs, seg, first);
first = false; first = false;
} }
@@ -461,12 +459,12 @@ bus_dmamap_load_mbuf_sg(bus_dma_tag_t dmat, bus_dmamap_t map, struct mbuf* mb,
map->buffer_type = bus_dmamap::BUFFER_TYPE_MBUF; map->buffer_type = bus_dmamap::BUFFER_TYPE_MBUF;
map->mbuf = mb; map->mbuf = mb;
nsegs = lastaddr = 0; seg = lastaddr = 0;
error = _bus_load_buffer(dmat, map->bounce_buffer, mb->m_pkthdr.len, flags, error = _bus_load_buffer(dmat, map->bounce_buffer, mb->m_pkthdr.len, flags,
&lastaddr, segs, nsegs, true); lastaddr, segs, seg, true);
} }
*_nsegs = nsegs + 1; *_nsegs = seg + 1;
return error; return error;
} }