Index: if_msk.c =================================================================== RCS file: /cvs/src/sys/dev/pci/if_msk.c,v retrieving revision 1.133 diff -u -p -r1.133 if_msk.c --- if_msk.c 26 Aug 2019 11:05:54 -0000 1.133 +++ if_msk.c 26 Aug 2019 11:25:31 -0000 @@ -1769,7 +1769,7 @@ msk_intr(void *xsc) MBUF_LIST_INITIALIZER(), }; struct ifnet *ifp0 = NULL, *ifp1 = NULL; - int claimed = 0; + int claimed = 0, txeof = 1; u_int32_t status; struct msk_status_desc *cur_st; @@ -1798,11 +1798,15 @@ msk_intr(void *xsc) msk_intr_yukon(sc_if1); } - MSK_CDSTSYNC(sc, sc->sk_status_idx, + bus_dmamap_sync(sc->sc_dmatag, sc->sk_status_map, + 0, MSK_STATUS_RING_CNT * sizeof(struct msk_status_desc), BUS_DMASYNC_POSTREAD|BUS_DMASYNC_POSTWRITE); + cur_st = &sc->sk_status_ring[sc->sk_status_idx]; while (cur_st->sk_opcode & SK_Y2_STOPC_OWN) { + claimed = 1; + cur_st->sk_opcode &= ~SK_Y2_STOPC_OWN; switch (cur_st->sk_opcode) { case SK_Y2_STOPC_RXSTAT: @@ -1812,10 +1816,7 @@ msk_intr(void *xsc) lemtoh32(&cur_st->sk_status)); break; case SK_Y2_STOPC_TXSTAT: - if (sc_if0) - msk_txeof(sc_if0); - if (sc_if1) - msk_txeof(sc_if1); + txeof = 1; break; default: printf("opcode=0x%x\n", cur_st->sk_opcode); @@ -1823,9 +1824,18 @@ msk_intr(void *xsc) } SK_INC(sc->sk_status_idx, MSK_STATUS_RING_CNT); - MSK_CDSTSYNC(sc, sc->sk_status_idx, - BUS_DMASYNC_POSTREAD|BUS_DMASYNC_POSTWRITE); cur_st = &sc->sk_status_ring[sc->sk_status_idx]; + } + + bus_dmamap_sync(sc->sc_dmatag, sc->sk_status_map, + 0, MSK_STATUS_RING_CNT * sizeof(struct msk_status_desc), + BUS_DMASYNC_PREREAD|BUS_DMASYNC_PREWRITE); + + if (txeof) { + if (sc_if0) + msk_txeof(sc_if0); + if (sc_if1) + msk_txeof(sc_if1); } if (status & SK_Y2_IMR_BMU) {