if_dwc: Fix transmit starvation

This commit is contained in:
Sebastian Huber 2015-03-30 09:51:18 +02:00
parent 6cd057d977
commit 941021287a

View File

@ -256,10 +256,6 @@ dwc_txstart_locked(struct dwc_softc *sc)
ifp = sc->ifp; ifp = sc->ifp;
if (ifp->if_drv_flags & IFF_DRV_OACTIVE) {
return;
}
enqueued = 0; enqueued = 0;
for (;;) { for (;;) {
@ -292,6 +288,7 @@ dwc_txstart(struct ifnet *ifp)
struct dwc_softc *sc = ifp->if_softc; struct dwc_softc *sc = ifp->if_softc;
DWC_LOCK(sc); DWC_LOCK(sc);
if ((ifp->if_drv_flags & IFF_DRV_OACTIVE) == 0)
dwc_txstart_locked(sc); dwc_txstart_locked(sc);
DWC_UNLOCK(sc); DWC_UNLOCK(sc);
} }
@ -718,11 +715,9 @@ dwc_txfinish_locked(struct dwc_softc *sc)
{ {
struct dwc_bufmap *bmap; struct dwc_bufmap *bmap;
struct dwc_hwdesc *desc; struct dwc_hwdesc *desc;
struct ifnet *ifp;
DWC_ASSERT_LOCKED(sc); DWC_ASSERT_LOCKED(sc);
ifp = sc->ifp;
while (sc->tx_idx_tail != sc->tx_idx_head) { while (sc->tx_idx_tail != sc->tx_idx_head) {
desc = &sc->txdesc_ring[sc->tx_idx_tail]; desc = &sc->txdesc_ring[sc->tx_idx_tail];
if ((desc->tdes0 & DDESC_TDES0_OWN) != 0) if ((desc->tdes0 & DDESC_TDES0_OWN) != 0)
@ -735,9 +730,11 @@ dwc_txfinish_locked(struct dwc_softc *sc)
bmap->mbuf = NULL; bmap->mbuf = NULL;
dwc_setup_txdesc(sc, sc->tx_idx_tail, 0, 0); dwc_setup_txdesc(sc, sc->tx_idx_tail, 0, 0);
sc->tx_idx_tail = next_txidx(sc, sc->tx_idx_tail); sc->tx_idx_tail = next_txidx(sc, sc->tx_idx_tail);
ifp->if_drv_flags &= ~IFF_DRV_OACTIVE;
} }
sc->ifp->if_drv_flags &= ~IFF_DRV_OACTIVE;
dwc_txstart_locked(sc);
/* If there are no buffers outstanding, muzzle the watchdog. */ /* If there are no buffers outstanding, muzzle the watchdog. */
if (sc->tx_idx_tail == sc->tx_idx_head) { if (sc->tx_idx_tail == sc->tx_idx_head) {
sc->tx_watchdog_count = 0; sc->tx_watchdog_count = 0;