Download raw body.
vmx 64-bit dma
vmx(4) works with 64-bit DMA. Tested with
vmx0 at pci11 dev 0 function 0 "VMware VMXNET3" rev 0x01: msix, 8 queues, address 00:0c:29:96:8e:d5
Index: if_vmx.c
===================================================================
RCS file: /cvs/src/sys/dev/pci/if_vmx.c,v
retrieving revision 1.94
diff -u -p -u -p -U7 -r1.94 if_vmx.c
--- if_vmx.c 11 Nov 2025 17:43:18 -0000 1.94
+++ if_vmx.c 26 Feb 2026 01:06:35 -0000
@@ -611,15 +611,16 @@ vmxnet3_alloc_txring(struct vmxnet3_soft
if (vmx_dmamem_alloc(sc, &comp_ring->dmamem,
NTXCOMPDESC * sizeof(comp_ring->txcd[0]), 512) != 0)
return -1;
comp_ring->txcd = VMX_DMA_KVA(&comp_ring->dmamem);
for (idx = 0; idx < NTXDESC; idx++) {
if (bus_dmamap_create(sc->sc_dmat, MAXMCLBYTES, NTXSEGS,
- VMXNET3_TX_LEN_M, 0, BUS_DMA_NOWAIT, &ring->dmap[idx]))
+ VMXNET3_TX_LEN_M, 0, BUS_DMA_NOWAIT | BUS_DMA_64BIT,
+ &ring->dmap[idx]))
return -1;
}
ts = tq->ts;
bzero(ts, sizeof *ts);
ts->npending = 0;
ts->intr_threshold = 1;
@@ -661,15 +662,16 @@ vmxnet3_alloc_rxring(struct vmxnet3_soft
ring = &rq->cmd_ring[i];
ring->sc = sc;
ring->rid = i;
mtx_init(&ring->mtx, IPL_NET);
timeout_set(&ring->refill, vmxnet3_rxfill_tick, ring);
for (idx = 0; idx < NRXDESC; idx++) {
if (bus_dmamap_create(sc->sc_dmat, JUMBO_LEN, 1,
- JUMBO_LEN, 0, BUS_DMA_NOWAIT, &ring->dmap[idx]))
+ JUMBO_LEN, 0, BUS_DMA_NOWAIT | BUS_DMA_64BIT,
+ &ring->dmap[idx]))
return -1;
}
ring->rs = rq->rs;
ring->rxh = (i == 0) ?
VMXNET3_BAR0_RXH1(queue) : VMXNET3_BAR0_RXH2(queue);
}
@@ -1805,19 +1807,21 @@ vmxnet3_dma_allocmem(struct vmxnet3_soft
{
bus_dma_tag_t t = sc->sc_dmat;
bus_dma_segment_t segs[1];
bus_dmamap_t map;
caddr_t va;
int n;
- if (bus_dmamem_alloc(t, size, align, 0, segs, 1, &n, BUS_DMA_NOWAIT))
+ if (bus_dmamem_alloc(t, size, align, 0, segs, 1, &n,
+ BUS_DMA_NOWAIT | BUS_DMA_64BIT))
return NULL;
if (bus_dmamem_map(t, segs, 1, size, &va, BUS_DMA_NOWAIT))
return NULL;
- if (bus_dmamap_create(t, size, 1, size, 0, BUS_DMA_NOWAIT, &map))
+ if (bus_dmamap_create(t, size, 1, size, 0,
+ BUS_DMA_NOWAIT | BUS_DMA_64BIT, &map))
return NULL;
if (bus_dmamap_load(t, map, va, size, NULL, BUS_DMA_NOWAIT))
return NULL;
bzero(va, size);
*pa = DMAADDR(map);
bus_dmamap_unload(t, map);
bus_dmamap_destroy(t, map);
@@ -1833,15 +1837,15 @@ vmx_dmamem_alloc(struct vmxnet3_softc *s
if (bus_dmamap_create(sc->sc_dmat, vdm->vdm_size, 1,
vdm->vdm_size, 0,
BUS_DMA_WAITOK | BUS_DMA_ALLOCNOW | BUS_DMA_64BIT,
&vdm->vdm_map) != 0)
return (1);
if (bus_dmamem_alloc(sc->sc_dmat, vdm->vdm_size,
align, 0, &vdm->vdm_seg, 1, &vdm->vdm_nsegs,
- BUS_DMA_WAITOK | BUS_DMA_ZERO) != 0)
+ BUS_DMA_WAITOK | BUS_DMA_ZERO | BUS_DMA_64BIT) != 0)
goto destroy;
if (bus_dmamem_map(sc->sc_dmat, &vdm->vdm_seg, vdm->vdm_nsegs,
vdm->vdm_size, &vdm->vdm_kva, BUS_DMA_WAITOK) != 0)
goto free;
if (bus_dmamap_load(sc->sc_dmat, vdm->vdm_map, vdm->vdm_kva,
vdm->vdm_size, NULL, BUS_DMA_WAITOK) != 0)
goto unmap;
vmx 64-bit dma