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 {