Index: if_bge.c =================================================================== RCS file: /pool/ncvs/src/sys/dev/bge/if_bge.c,v retrieving revision 1.138 diff -u -r1.138 if_bge.c --- if_bge.c 18 Aug 2006 13:53:53 -0000 1.138 +++ if_bge.c 22 Aug 2006 04:18:12 -0000 @@ -3452,12 +3452,29 @@ sc = ifp->if_softc; - if_printf(ifp, "watchdog timeout -- resetting\n"); + BGE_LOCK(sc); + /* + * Reclaim first as there is a possibility of losing Tx completion + * interrupts. Possible cause of missing Tx completion interrupts + * comes from Tx interrupt moderation mechanism(delayed interrupts) + * or chipset bug. + */ + bge_txeof(sc); + if (sc->bge_txcnt == 0) { + if_printf(ifp, "missing Tx completion interrupt!\n"); + BGE_UNLOCK(sc); + return; + } + if (sc->bge_link) + if_printf(ifp, "watchdog timeout -- resetting\n"); + else + if_printf(ifp, "link lost -- resetting\n"); ifp->if_drv_flags &= ~IFF_DRV_RUNNING; - bge_init(sc); + bge_init_locked(sc); ifp->if_oerrors++; + BGE_UNLOCK(sc); } /*