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:
@@ -486,6 +486,36 @@ bus_dmamap_unload(bus_dma_tag_t dmat, bus_dmamap_t map)
|
|||||||
|
|
||||||
extern "C" void
|
extern "C" void
|
||||||
bus_dmamap_sync(bus_dma_tag_t dmat, bus_dmamap_t map, bus_dmasync_op_t op)
|
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)
|
if (map == NULL)
|
||||||
return;
|
return;
|
||||||
@@ -499,13 +529,14 @@ bus_dmamap_sync(bus_dma_tag_t dmat, bus_dmamap_t map, bus_dmasync_op_t op)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case bus_dmamap::BUFFER_TYPE_SIMPLE:
|
case bus_dmamap::BUFFER_TYPE_SIMPLE:
|
||||||
memcpy(map->bounce_buffer,
|
KASSERT((offset + length) <= map->buffer_length, ("mis-sized sync"));
|
||||||
map->buffer, map->buffer_length);
|
memcpy((caddr_t)map->bounce_buffer + offset,
|
||||||
|
(caddr_t)map->buffer + offset, length);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case bus_dmamap::BUFFER_TYPE_MBUF:
|
case bus_dmamap::BUFFER_TYPE_MBUF:
|
||||||
m_copydata(map->mbuf, 0, map->mbuf->m_pkthdr.len,
|
m_copydata(map->mbuf, offset, length,
|
||||||
(caddr_t)map->bounce_buffer);
|
(caddr_t)map->bounce_buffer + offset);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
@@ -526,13 +557,14 @@ bus_dmamap_sync(bus_dma_tag_t dmat, bus_dmamap_t map, bus_dmasync_op_t op)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case bus_dmamap::BUFFER_TYPE_SIMPLE:
|
case bus_dmamap::BUFFER_TYPE_SIMPLE:
|
||||||
memcpy(map->buffer,
|
KASSERT((offset + length) <= map->buffer_length, ("mis-sized sync"));
|
||||||
map->bounce_buffer, map->buffer_length);
|
memcpy((caddr_t)map->buffer + offset,
|
||||||
|
(caddr_t)map->bounce_buffer + offset, length);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case bus_dmamap::BUFFER_TYPE_MBUF:
|
case bus_dmamap::BUFFER_TYPE_MBUF:
|
||||||
m_copyback(map->mbuf, 0, map->mbuf->m_pkthdr.len,
|
m_copyback(map->mbuf, offset, length,
|
||||||
(caddr_t)map->bounce_buffer);
|
(caddr_t)map->bounce_buffer + offset);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
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.
|
* 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(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.
|
* Release the mapping held by map.
|
||||||
|
|||||||
Reference in New Issue
Block a user