Module Name: src
Committed By: maya
Date: Mon Oct 15 16:29:10 UTC 2018
Modified Files:
src/sys/dev/pci: if_bwfm_pci.c
Log Message:
Apply OpenBSD if_bwfm_pci.c:1.25 by patrick:
Add bus_dmamap_sync(9) calls to bwfm(4) so that we make sure the data
is synced properly before the CPU or the WiFi chip access the supplied
memory. Makes PCIe-connected bwfm(4) work on ARM-based machines.
To generate a diff of this commit:
cvs rdiff -u -r1.3 -r1.4 src/sys/dev/pci/if_bwfm_pci.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/dev/pci/if_bwfm_pci.c
diff -u src/sys/dev/pci/if_bwfm_pci.c:1.3 src/sys/dev/pci/if_bwfm_pci.c:1.4
--- src/sys/dev/pci/if_bwfm_pci.c:1.3 Mon Sep 3 16:29:32 2018
+++ src/sys/dev/pci/if_bwfm_pci.c Mon Oct 15 16:29:10 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: if_bwfm_pci.c,v 1.3 2018/09/03 16:29:32 riastradh Exp $ */
+/* $NetBSD: if_bwfm_pci.c,v 1.4 2018/10/15 16:29:10 maya Exp $ */
/* $OpenBSD: if_bwfm_pci.c,v 1.18 2018/02/08 05:00:38 patrick Exp $ */
/*
* Copyright (c) 2010-2016 Broadcom Corporation
@@ -956,6 +956,9 @@ bwfm_pci_pktid_new(struct bwfm_pci_softc
pkts->pkts[idx].bb_map, *mp, BUS_DMA_NOWAIT) != 0)
return EFBIG;
}
+ bus_dmamap_sync(sc->sc_dmat, pkts->pkts[idx].bb_map,
+ 0, pkts->pkts[idx].bb_map->dm_mapsize,
+ BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
pkts->last = idx;
pkts->pkts[idx].bb_m = *mp;
*pktid = idx;
@@ -975,6 +978,9 @@ bwfm_pci_pktid_free(struct bwfm_pci_soft
if (pktid >= pkts->npkt || pkts->pkts[pktid].bb_m == NULL)
return NULL;
+ bus_dmamap_sync(sc->sc_dmat, pkts->pkts[pktid].bb_map, 0,
+ pkts->pkts[pktid].bb_map->dm_mapsize,
+ BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE);
bus_dmamap_unload(sc->sc_dmat, pkts->pkts[pktid].bb_map);
m = pkts->pkts[pktid].bb_m;
pkts->pkts[pktid].bb_m = NULL;
@@ -1134,6 +1140,9 @@ bwfm_pci_ring_update_rptr(struct bwfm_pc
ring->r_ptr = bus_space_read_2(sc->sc_tcm_iot,
sc->sc_tcm_ioh, ring->r_idx_addr);
} else {
+ bus_dmamap_sync(sc->sc_dmat,
+ BWFM_PCI_DMA_MAP(sc->sc_dma_idx_buf), ring->r_idx_addr,
+ sizeof(uint16_t), BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE);
ring->r_ptr = *(uint16_t *)(BWFM_PCI_DMA_KVA(sc->sc_dma_idx_buf)
+ ring->r_idx_addr);
}
@@ -1185,6 +1194,9 @@ bwfm_pci_ring_update_wptr(struct bwfm_pc
} else {
ring->w_ptr = *(uint16_t *)(BWFM_PCI_DMA_KVA(sc->sc_dma_idx_buf)
+ ring->w_idx_addr);
+ bus_dmamap_sync(sc->sc_dmat,
+ BWFM_PCI_DMA_MAP(sc->sc_dma_idx_buf), ring->w_idx_addr,
+ sizeof(uint16_t), BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE);
}
}
@@ -1198,6 +1210,9 @@ bwfm_pci_ring_write_rptr(struct bwfm_pci
} else {
*(uint16_t *)(BWFM_PCI_DMA_KVA(sc->sc_dma_idx_buf)
+ ring->r_idx_addr) = ring->r_ptr;
+ bus_dmamap_sync(sc->sc_dmat,
+ BWFM_PCI_DMA_MAP(sc->sc_dma_idx_buf), ring->r_idx_addr,
+ sizeof(uint16_t), BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
}
}
@@ -1211,6 +1226,9 @@ bwfm_pci_ring_write_wptr(struct bwfm_pci
} else {
*(uint16_t *)(BWFM_PCI_DMA_KVA(sc->sc_dma_idx_buf)
+ ring->w_idx_addr) = ring->w_ptr;
+ bus_dmamap_sync(sc->sc_dmat,
+ BWFM_PCI_DMA_MAP(sc->sc_dma_idx_buf), ring->w_idx_addr,
+ sizeof(uint16_t), BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
}
}
@@ -1286,7 +1304,9 @@ bwfm_pci_ring_read_avail(struct bwfm_pci
if (*avail == 0)
return NULL;
-
+ bus_dmamap_sync(sc->sc_dmat, BWFM_PCI_DMA_MAP(ring->ring),
+ ring->r_ptr * ring->itemsz, *avail * ring->itemsz,
+ BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE);
return BWFM_PCI_DMA_KVA(ring->ring) + (ring->r_ptr * ring->itemsz);
}
@@ -1310,6 +1330,9 @@ void
bwfm_pci_ring_write_commit(struct bwfm_pci_softc *sc,
struct bwfm_pci_msgring *ring)
{
+ bus_dmamap_sync(sc->sc_dmat, BWFM_PCI_DMA_MAP(ring->ring),
+ 0, BWFM_PCI_DMA_LEN(ring->ring), BUS_DMASYNC_PREREAD |
+ BUS_DMASYNC_PREWRITE);
bwfm_pci_ring_write_wptr(sc, ring);
bwfm_pci_ring_bell(sc, ring);
}