Module Name: src Committed By: jmcneill Date: Tue Aug 5 21:54:39 UTC 2014
Modified Files: src/sys/dev/pci: if_wpi.c if_wpivar.h Log Message: bus_dmamap_sync for rx descriptors too, derived from openbsd driver To generate a diff of this commit: cvs rdiff -u -r1.63 -r1.64 src/sys/dev/pci/if_wpi.c cvs rdiff -u -r1.15 -r1.16 src/sys/dev/pci/if_wpivar.h 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_wpi.c diff -u src/sys/dev/pci/if_wpi.c:1.63 src/sys/dev/pci/if_wpi.c:1.64 --- src/sys/dev/pci/if_wpi.c:1.63 Tue Aug 5 17:25:16 2014 +++ src/sys/dev/pci/if_wpi.c Tue Aug 5 21:54:39 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: if_wpi.c,v 1.63 2014/08/05 17:25:16 jmcneill Exp $ */ +/* $NetBSD: if_wpi.c,v 1.64 2014/08/05 21:54:39 jmcneill Exp $ */ /*- * Copyright (c) 2006, 2007 @@ -18,7 +18,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_wpi.c,v 1.63 2014/08/05 17:25:16 jmcneill Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_wpi.c,v 1.64 2014/08/05 21:54:39 jmcneill Exp $"); /* * Driver for Intel PRO/Wireless 3945ABG 802.11 network adapters. @@ -628,6 +628,14 @@ wpi_alloc_rx_ring(struct wpi_softc *sc, struct wpi_rx_data *data = &ring->data[i]; struct wpi_rbuf *rbuf; + error = bus_dmamap_create(sc->sc_dmat, WPI_RBUF_SIZE, 1, + WPI_RBUF_SIZE, 0, BUS_DMA_NOWAIT, &data->map); + if (error) { + aprint_error_dev(sc->sc_dev, + "could not allocate rx dma map\n"); + goto fail; + } + MGETHDR(data->m, M_DONTWAIT, MT_DATA); if (data->m == NULL) { aprint_error_dev(sc->sc_dev, @@ -648,6 +656,15 @@ wpi_alloc_rx_ring(struct wpi_softc *sc, rbuf); data->m->m_flags |= M_EXT_RW; + error = bus_dmamap_load(sc->sc_dmat, data->map, + mtod(data->m, void *), WPI_RBUF_SIZE, NULL, + BUS_DMA_NOWAIT | BUS_DMA_READ); + if (error) { + aprint_error_dev(sc->sc_dev, + "could not load mbuf: %d\n", error); + goto fail; + } + ring->desc[i] = htole32(rbuf->paddr); } @@ -690,8 +707,13 @@ wpi_free_rx_ring(struct wpi_softc *sc, s wpi_dma_contig_free(&ring->desc_dma); for (i = 0; i < WPI_RX_RING_COUNT; i++) { - if (ring->data[i].m != NULL) + if (ring->data[i].m != NULL) { + bus_dmamap_unload(sc->sc_dmat, ring->data[i].map); m_freem(ring->data[i].m); + } + if (ring->data[i].map != NULL) { + bus_dmamap_destroy(sc->sc_dmat, ring->data[i].map); + } } } @@ -1451,6 +1473,8 @@ wpi_rx_intr(struct wpi_softc *sc, struct struct mbuf *m, *mnew; int data_off; + bus_dmamap_sync(sc->sc_dmat, data->map, 0, data->map->dm_mapsize, + BUS_DMASYNC_POSTREAD); stat = (struct wpi_rx_stat *)(desc + 1); if (stat->len > WPI_STAT_MAXLEN) { @@ -1506,6 +1530,7 @@ wpi_rx_intr(struct wpi_softc *sc, struct return; } } else { + int error; MGETHDR(mnew, M_DONTWAIT, MT_DATA); if (mnew == NULL) { @@ -1521,11 +1546,23 @@ wpi_rx_intr(struct wpi_softc *sc, struct rbuf); mnew->m_flags |= M_EXT_RW; + bus_dmamap_unload(sc->sc_dmat, data->map); m = data->m; data->m = mnew; + error = bus_dmamap_load(sc->sc_dmat, data->map, + mtod(data->m, void *), WPI_RBUF_SIZE, NULL, + BUS_DMA_NOWAIT | BUS_DMA_READ); + if (error) { + panic("%s: bus_dmamap_load failed: %d\n", + device_xname(sc->sc_dev), error); + } + /* update Rx descriptor */ ring->desc[ring->cur] = htole32(rbuf->paddr); + bus_dmamap_sync(sc->sc_dmat, ring->desc_dma.map, 0, + ring->desc_dma.size, + BUS_DMASYNC_PREWRITE); m->m_data = (char*)m->m_data + data_off; m->m_pkthdr.len = m->m_len = le16toh(head->len); @@ -1655,11 +1692,17 @@ wpi_notif_intr(struct wpi_softc *sc) struct ifnet *ifp = ic->ic_ifp; uint32_t hw; + bus_dmamap_sync(sc->sc_dmat, sc->shared_dma.map, 0, + sizeof(struct wpi_shared), BUS_DMASYNC_POSTREAD); + hw = le32toh(sc->shared->next); while (sc->rxq.cur != hw) { struct wpi_rx_data *data = &sc->rxq.data[sc->rxq.cur]; struct wpi_rx_desc *desc = mtod(data->m, struct wpi_rx_desc *); + bus_dmamap_sync(sc->sc_dmat, data->map, 0, data->map->dm_mapsize, + BUS_DMASYNC_POSTREAD); + DPRINTFN(4, ("rx notification qid=%x idx=%d flags=%x type=%d " "len=%d\n", desc->qid, desc->idx, desc->flags, desc->type, le32toh(desc->len))); Index: src/sys/dev/pci/if_wpivar.h diff -u src/sys/dev/pci/if_wpivar.h:1.15 src/sys/dev/pci/if_wpivar.h:1.16 --- src/sys/dev/pci/if_wpivar.h:1.15 Tue Jan 19 22:07:02 2010 +++ src/sys/dev/pci/if_wpivar.h Tue Aug 5 21:54:39 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: if_wpivar.h,v 1.15 2010/01/19 22:07:02 pooka Exp $ */ +/* $NetBSD: if_wpivar.h,v 1.16 2014/08/05 21:54:39 jmcneill Exp $ */ /*- * Copyright (c) 2006 @@ -92,7 +92,8 @@ struct wpi_rbuf { }; struct wpi_rx_data { - struct mbuf *m; + bus_dmamap_t map; + struct mbuf *m; }; struct wpi_rx_ring {