Index: if_bnx.c =================================================================== RCS file: /cvs/src/sys/dev/pci/if_bnx.c,v retrieving revision 1.118 diff -u -p -r1.118 if_bnx.c --- if_bnx.c 5 Dec 2015 16:23:37 -0000 1.118 +++ if_bnx.c 10 Dec 2015 12:20:23 -0000 @@ -871,6 +871,7 @@ bnx_attachhook(void *xsc) ifp = &sc->arpcom.ac_if; ifp->if_softc = sc; ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST; + ifp->if_xflags = IFXF_MPSAFE; ifp->if_ioctl = bnx_ioctl; ifp->if_start = bnx_start; ifp->if_watchdog = bnx_watchdog; @@ -4573,20 +4574,14 @@ bnx_tx_intr(struct bnx_softc *sc) used = atomic_sub_int_nv(&sc->used_tx_bd, freed); + sc->tx_cons = sw_tx_cons; + /* Clear the TX timeout timer. */ if (used == 0) ifp->if_timer = 0; - /* Clear the tx hardware queue full flag. */ - if (used < sc->max_tx_bd) { - DBRUNIF(ifq_is_oactive(&ifp->if_snd), - printf("%s: Open TX chain! %d/%d (used/total)\n", - sc->bnx_dev.dv_xname, used, - sc->max_tx_bd)); - ifq_clr_oactive(&ifp->if_snd); - } - - sc->tx_cons = sw_tx_cons; + if (ifq_is_oactive(&ifp->if_snd)) + ifq_restart(&ifp->if_snd); } /****************************************************************************/ @@ -4880,10 +4875,8 @@ bnx_start(struct ifnet *ifp) int used; u_int16_t tx_prod, tx_chain_prod; - /* If there's no link or the transmit queue is empty then just exit. */ - if (!sc->bnx_link || IFQ_IS_EMPTY(&ifp->if_snd)) { - DBPRINT(sc, BNX_INFO_SEND, - "%s(): No link or transmit queue empty.\n", __FUNCTION__); + if (!sc->bnx_link) { + ifq_purge(&ifp->if_snd); goto bnx_start_exit; }