Index: sys/dev/msk/if_msk.c =================================================================== --- sys/dev/msk/if_msk.c (revision 214353) +++ sys/dev/msk/if_msk.c (working copy) @@ -2871,6 +2871,7 @@ msk_watchdog(struct msk_if_softc *sc_if) { struct ifnet *ifp; + int idx; MSK_IF_LOCK_ASSERT(sc_if); @@ -2887,6 +2888,23 @@ return; } + /* + * Reclaim first as there is a possibility of losing Tx completion + * interrupts. + */ + idx = CSR_READ_2(sc_if->msk_softc, + sc_if->msk_port == MSK_PORT_A ? STAT_TXA1_RIDX : STAT_TXA2_RIDX); + if (sc_if->msk_cdata.msk_tx_cons != idx) { + msk_txeof(sc_if, idx); + if (sc_if->msk_cdata.msk_tx_cnt == 0) { + if_printf(ifp, "watchdog timeout (missed Tx interrupts)" + " -- recovering\n"); + if (!IFQ_DRV_IS_EMPTY(&ifp->if_snd)) + msk_start_locked(ifp); + return; + } + } + if_printf(ifp, "watchdog timeout\n"); ifp->if_oerrors++; ifp->if_drv_flags &= ~IFF_DRV_RUNNING;