From 4bf4717f9dcf45b07bb04cd8ddd7c86d02ce38bd Mon Sep 17 00:00:00 2001 From: David Gwynne Date: Wed, 13 Apr 2011 07:28:36 +0000 Subject: to quote from the gospel of bus_dma.9: Synchronization operations are expressed from the perspective of the host RAM, e.g., a device -> memory operation is a READ and a memory -> device operation is a WRITE. the status block that the isr reads is written to by the device. the chip writes to memory, it is therefore a READ. this also adds the preread sync when the map is set up and the postread sync when the map is torn down for better symmetry. there are probably more issues like this in the code, but this is a start. discovered while discussing another diff with claudio@ --- sys/dev/pci/if_bnx.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) (limited to 'sys/dev/pci/if_bnx.c') diff --git a/sys/dev/pci/if_bnx.c b/sys/dev/pci/if_bnx.c index 5388e3fffee..bd17cadb39d 100644 --- a/sys/dev/pci/if_bnx.c +++ b/sys/dev/pci/if_bnx.c @@ -1,4 +1,4 @@ -/* $OpenBSD: if_bnx.c,v 1.92 2011/04/05 18:01:21 henning Exp $ */ +/* $OpenBSD: if_bnx.c,v 1.93 2011/04/13 07:28:35 dlg Exp $ */ /*- * Copyright (c) 2006 Broadcom Corporation @@ -2286,6 +2286,8 @@ bnx_dma_free(struct bnx_softc *sc) /* Destroy the status block. */ if (sc->status_block != NULL && sc->status_map != NULL) { + bus_dmamap_sync(sc->bnx_dmatag, sc->status_map, 0, + sc->status_map->dm_mapsize, BUS_DMASYNC_POSTREAD); bus_dmamap_unload(sc->bnx_dmatag, sc->status_map); bus_dmamem_unmap(sc->bnx_dmatag, (caddr_t)sc->status_block, BNX_STATUS_BLK_SZ); @@ -2424,6 +2426,9 @@ bnx_dma_alloc(struct bnx_softc *sc) goto bnx_dma_alloc_exit; } + bus_dmamap_sync(sc->bnx_dmatag, sc->status_map, 0, + sc->status_map->dm_mapsize, BUS_DMASYNC_PREREAD); + sc->status_block_paddr = sc->status_map->dm_segs[0].ds_addr; /* DRC - Fix for 64 bit addresses. */ @@ -5152,7 +5157,7 @@ bnx_intr(void *xsc) DBRUNIF(1, sc->interrupts_generated++); bus_dmamap_sync(sc->bnx_dmatag, sc->status_map, 0, - sc->status_map->dm_mapsize, BUS_DMASYNC_POSTWRITE); + sc->status_map->dm_mapsize, BUS_DMASYNC_POSTREAD); /* * If the hardware status block index @@ -5232,7 +5237,7 @@ bnx_intr(void *xsc) } bus_dmamap_sync(sc->bnx_dmatag, sc->status_map, 0, - sc->status_map->dm_mapsize, BUS_DMASYNC_PREWRITE); + sc->status_map->dm_mapsize, BUS_DMASYNC_PREREAD); /* Re-enable interrupts. */ REG_WR(sc, BNX_PCICFG_INT_ACK_CMD, -- cgit v1.2.3