freebsd_network: Add an extended bus_dmamap_sync API for partial syncs.

To preserve proper semantics with the OpenBSD layer, this is needed.
This commit is contained in:
Augustin Cavalier
2022-07-01 23:15:07 -04:00
parent 7ff2f10462
commit b12b802c4d
2 changed files with 42 additions and 8 deletions
+40 -8
View File
@@ -486,6 +486,36 @@ bus_dmamap_unload(bus_dma_tag_t dmat, bus_dmamap_t map)
extern "C" void
bus_dmamap_sync(bus_dma_tag_t dmat, bus_dmamap_t map, bus_dmasync_op_t op)
{
if (map == NULL)
return;
bus_size_t length = 0;
switch (map->buffer_type) {
case bus_dmamap::BUFFER_NONE:
case bus_dmamap::BUFFER_PROHIBITED:
// Nothing to do.
return;
case bus_dmamap::BUFFER_TYPE_SIMPLE:
length = map->buffer_length;
break;
case bus_dmamap::BUFFER_TYPE_MBUF:
length = map->mbuf->m_pkthdr.len;
break;
default:
panic("unknown buffer type");
}
bus_dmamap_sync_etc(dmat, map, 0, length, op);
}
extern "C" void
bus_dmamap_sync_etc(bus_dma_tag_t dmat, bus_dmamap_t map,
bus_addr_t offset, bus_size_t length, bus_dmasync_op_t op)
{
if (map == NULL)
return;
@@ -499,13 +529,14 @@ bus_dmamap_sync(bus_dma_tag_t dmat, bus_dmamap_t map, bus_dmasync_op_t op)
break;
case bus_dmamap::BUFFER_TYPE_SIMPLE:
memcpy(map->bounce_buffer,
map->buffer, map->buffer_length);
KASSERT((offset + length) <= map->buffer_length, ("mis-sized sync"));
memcpy((caddr_t)map->bounce_buffer + offset,
(caddr_t)map->buffer + offset, length);
break;
case bus_dmamap::BUFFER_TYPE_MBUF:
m_copydata(map->mbuf, 0, map->mbuf->m_pkthdr.len,
(caddr_t)map->bounce_buffer);
m_copydata(map->mbuf, offset, length,
(caddr_t)map->bounce_buffer + offset);
break;
default:
@@ -526,13 +557,14 @@ bus_dmamap_sync(bus_dma_tag_t dmat, bus_dmamap_t map, bus_dmasync_op_t op)
break;
case bus_dmamap::BUFFER_TYPE_SIMPLE:
memcpy(map->buffer,
map->bounce_buffer, map->buffer_length);
KASSERT((offset + length) <= map->buffer_length, ("mis-sized sync"));
memcpy((caddr_t)map->buffer + offset,
(caddr_t)map->bounce_buffer + offset, length);
break;
case bus_dmamap::BUFFER_TYPE_MBUF:
m_copyback(map->mbuf, 0, map->mbuf->m_pkthdr.len,
(caddr_t)map->bounce_buffer);
m_copyback(map->mbuf, offset, length,
(caddr_t)map->bounce_buffer + offset);
break;
default:
@@ -245,6 +245,8 @@ int bus_dmamap_load_uio(bus_dma_tag_t dmat, bus_dmamap_t map,
* is NULL we have a fully IO-coherent system.
*/
void bus_dmamap_sync(bus_dma_tag_t dmat, bus_dmamap_t dmamap, bus_dmasync_op_t op);
void bus_dmamap_sync_etc(bus_dma_tag_t dmat, bus_dmamap_t dmamap,
bus_addr_t offset, bus_size_t length, bus_dmasync_op_t op); /* Haiku extension */
/*
* Release the mapping held by map.