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 {
