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);
 }

Reply via email to