Index: if_myx.c =================================================================== RCS file: /cvs/src/sys/dev/pci/if_myx.c,v retrieving revision 1.103 diff -u -p -r1.103 if_myx.c --- if_myx.c 1 Aug 2017 01:11:35 -0000 1.103 +++ if_myx.c 4 Mar 2019 10:44:46 -0000 @@ -1102,7 +1102,7 @@ myx_up(struct myx_softc *sc) } memset(&mc, 0, sizeof(mc)); - if (myx_cmd(sc, MYXCMD_FC_DEFAULT, &mc, NULL) != 0) { + if (myx_cmd(sc, MYXCMD_UNSET_FC, &mc, NULL) != 0) { printf("%s: failed to configure flow control\n", DEVNAME(sc)); goto free_intrq; } @@ -1703,7 +1703,7 @@ myx_rxeof(struct myx_softc *sc) struct myx_rx_ring *mrr; struct myx_slot *ms; struct mbuf *m; - int ring; + int ring, livelocked; u_int rxfree[2] = { 0 , 0 }; u_int len; @@ -1741,6 +1741,8 @@ myx_rxeof(struct myx_softc *sc) bus_dmamap_sync(sc->sc_dmat, sc->sc_intrq_dma.mxm_map, 0, sc->sc_intrq_dma.mxm_map->dm_mapsize, BUS_DMASYNC_PREREAD); + livelocked = ifiq_input(&ifp->if_rcv, &ml); + for (ring = MYX_RXSMALL; ring <= MYX_RXBIG; ring++) { if (rxfree[ring] == 0) continue; @@ -1748,12 +1750,12 @@ myx_rxeof(struct myx_softc *sc) mrr = &sc->sc_rx_ring[ring]; if_rxr_put(&mrr->mrr_rxr, rxfree[ring]); + if (livelocked) + if_rxr_livelocked(&mrr->mrr_rxr); myx_rx_fill(sc, mrr); if (mrr->mrr_prod == mrr->mrr_cons) timeout_add(&mrr->mrr_refill, 0); } - - if_input(ifp, &ml); } static int