Index: sys/dev/usb/if_smsc.c =================================================================== RCS file: /cvsroot/src/sys/dev/usb/if_smsc.c,v retrieving revision 1.30 diff -p -u -r1.30 if_smsc.c --- sys/dev/usb/if_smsc.c 15 Dec 2016 09:28:06 -0000 1.30 +++ sys/dev/usb/if_smsc.c 15 Apr 2017 13:03:01 -0000 @@ -632,12 +632,17 @@ smsc_start(struct ifnet *ifp) if ((ifp->if_flags & (IFF_OACTIVE|IFF_RUNNING)) != IFF_RUNNING) return; + /* transmitter busy ? */ + if (sc->sc_cdata.tx_pending > 0) + return; + IFQ_POLL(&ifp->if_snd, m_head); if (m_head == NULL) return; + sc->sc_cdata.tx_pending++; if (smsc_encap(sc, m_head, 0)) { - ifp->if_flags |= IFF_OACTIVE; + --sc->sc_cdata.tx_pending; return; } IFQ_DEQUEUE(&ifp->if_snd, m_head); @@ -1445,6 +1450,8 @@ smsc_txeof(struct usbd_xfer *xfer, void s = splnet(); + sc->sc_cdata.tx_pending--; + ifp->if_timer = 0; ifp->if_flags &= ~IFF_OACTIVE; @@ -1466,8 +1473,8 @@ smsc_txeof(struct usbd_xfer *xfer, void m_freem(c->sc_mbuf); c->sc_mbuf = NULL; - if (IFQ_IS_EMPTY(&ifp->if_snd) == 0) - smsc_start(ifp); + /* Try to get more packets going */ + smsc_start(ifp); splx(s); } @@ -1495,6 +1502,8 @@ smsc_tx_list_init(struct smsc_softc *sc) } } + cd->tx_pending = 0; + return 0; } @@ -1583,7 +1592,5 @@ smsc_encap(struct smsc_softc *sc, struct return EIO; } - sc->sc_cdata.tx_cnt++; - return 0; } Index: sys/dev/usb/if_smscvar.h =================================================================== RCS file: /cvsroot/src/sys/dev/usb/if_smscvar.h,v retrieving revision 1.5 diff -p -u -r1.5 if_smscvar.h --- sys/dev/usb/if_smscvar.h 23 Apr 2016 10:15:31 -0000 1.5 +++ sys/dev/usb/if_smscvar.h 15 Apr 2017 13:03:01 -0000 @@ -46,10 +46,7 @@ struct smsc_chain { struct smsc_cdata { struct smsc_chain tx_chain[SMSC_TX_LIST_CNT]; struct smsc_chain rx_chain[SMSC_RX_LIST_CNT]; - int tx_prod; - int tx_cons; - int tx_cnt; - int rx_prod; + int tx_pending; }; struct smsc_softc {