On Tue, Sep 22, 2015 at 01:23:17PM -0400, Ted Unangst wrote:
> Stefan Sperling wrote:
> > Properly reset the RX ring by clearing RX buffer status exposed to hardware.
> > Found by Matthew Dillon while porting FreeBSD's iwm(4) to Dragonfly.
> >
> > ok?
> >
> > Index: if_iwm.c
> > ===================================================================
> > RCS file: /cvs/src/sys/dev/pci/if_iwm.c,v
> > retrieving revision 1.46
> > diff -u -p -r1.46 if_iwm.c
> > --- if_iwm.c 19 Jul 2015 21:40:00 -0000 1.46
> > +++ if_iwm.c 22 Sep 2015 16:52:10 -0000
> > @@ -1046,6 +1046,7 @@ iwm_reset_rx_ring(struct iwm_softc *sc,
> > iwm_nic_unlock(sc);
> > }
> > ring->cur = 0;
> > + memset(ring->stat, 0, sizeof(*ring->stat));
> > }
>
> do we need any sort of dma sync?
Seems like a good idea, yes.
Index: if_iwm.c
===================================================================
RCS file: /cvs/src/sys/dev/pci/if_iwm.c,v
retrieving revision 1.46
diff -u -p -r1.46 if_iwm.c
--- if_iwm.c 19 Jul 2015 21:40:00 -0000 1.46
+++ if_iwm.c 22 Sep 2015 17:49:41 -0000
@@ -1046,6 +1046,12 @@ iwm_reset_rx_ring(struct iwm_softc *sc,
iwm_nic_unlock(sc);
}
ring->cur = 0;
+ bus_dmamap_sync(sc->sc_dmat, ring->stat_dma.map, 0,
+ ring->stat_dma.size, BUS_DMASYNC_PREWRITE);
+ memset(ring->stat, 0, sizeof(*ring->stat));
+ bus_dmamap_sync(sc->sc_dmat, ring->stat_dma.map, 0,
+ ring->stat_dma.size, BUS_DMASYNC_POSTWRITE);
+
}
void