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 {