From 036b730e5fb33ed8842ca8ce0b35160492f13946 Mon Sep 17 00:00:00 2001 From: Taylor R Campbell Date: Sun, 13 Feb 2022 14:05:51 +0000 Subject: [PATCH] eqos(4): Membar audit. --- sys/dev/ic/dwc_eqos.c | 32 +++++++++++++++++++++++--------- 1 file changed, 23 insertions(+), 9 deletions(-) diff --git a/sys/dev/ic/dwc_eqos.c b/sys/dev/ic/dwc_eqos.c index 264037e55299..32b204eb7966 100644 --- a/sys/dev/ic/dwc_eqos.c +++ b/sys/dev/ic/dwc_eqos.c @@ -269,7 +269,7 @@ eqos_setup_txbuf(struct eqos_softc *sc, int index, struct mbuf *m) { bus_dma_segment_t *segs; int error, nsegs, cur, i; - uint32_t flags; + uint32_t flags, tdes3; bool nospace; /* at least one descriptor free ? */ @@ -322,10 +322,12 @@ eqos_setup_txbuf(struct eqos_softc *sc, int index, struct mbuf *m) /* * Defer setting OWN bit on the first descriptor until all - * descriptors have been updated. + * descriptors have been updated. Store-release here pairs + * with load-acquire in load-acquire in eqos_txintr. */ - membar_sync(); - sc->sc_tx.desc_ring[index].tdes3 |= htole32(EQOS_TDES3_OWN); + tdes3 = sc->sc_tx.desc_ring[index].tdes3; + tdes3 |= htole32(EQOS_TDES3_OWN); + atomic_store_release(&sc->sc_tx.desc_ring[index].tdes3, tdes3); return nsegs; } @@ -333,12 +335,15 @@ eqos_setup_txbuf(struct eqos_softc *sc, int index, struct mbuf *m) static void eqos_setup_rxdesc(struct eqos_softc *sc, int index, bus_addr_t paddr) { + uint32_t tdes3; + sc->sc_rx.desc_ring[index].tdes0 = htole32((uint32_t)paddr); sc->sc_rx.desc_ring[index].tdes1 = htole32((uint32_t)(paddr >> 32)); sc->sc_rx.desc_ring[index].tdes2 = htole32(0); - membar_sync(); - sc->sc_rx.desc_ring[index].tdes3 = - htole32(EQOS_TDES3_OWN | EQOS_TDES3_IOC | EQOS_TDES3_BUF1V); + tdes3 = sc->sc_rx.desc_ring[index].tdes3; + tdes3 |= htole32(EQOS_TDES3_OWN | EQOS_TDES3_IOC | EQOS_TDES3_BUF1V); + /* Store-release here pairs with load-acquire in eqos_rxintr. */ + atomic_store_release(&sc->sc_rx.desc_ring[index].tdes3, tdes3); } static int @@ -694,7 +699,12 @@ eqos_rxintr(struct eqos_softc *sc, int qid) index, index + 1, RX_DESC_COUNT, BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE); - tdes3 = le32toh(sc->sc_rx.desc_ring[index].tdes3); + /* + * Load-acquire here pairs with store-release in + * eqos_setup_rxdesc. + */ + tdes3 = atomic_load_acquire(&sc->sc_rx.desc_ring[index].tdes3); + tdes3 = le32toh(tdes3); if ((tdes3 & EQOS_TDES3_OWN) != 0) { break; } @@ -760,7 +770,11 @@ eqos_txintr(struct eqos_softc *sc, int qid) i, i + 1, TX_DESC_COUNT, BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE); desc = &sc->sc_tx.desc_ring[i]; - tdes3 = le32toh(desc->tdes3); + /* + * Load-acquire here pairs with store-release in + * eqos_setup_txdesc. + */ + tdes3 = le32toh(atomic_load_acquire(&desc->tdes3)); if ((tdes3 & EQOS_TDES3_OWN) != 0) { break; }