From dd1feda161ce70881cb9c1f90f4ef694d7f41a9f Mon Sep 17 00:00:00 2001 From: Sebastian Huber Date: Mon, 30 Mar 2015 09:51:18 +0200 Subject: if_dwc: Fix transmit starvation --- freebsd/sys/dev/dwc/if_dwc.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/freebsd/sys/dev/dwc/if_dwc.c b/freebsd/sys/dev/dwc/if_dwc.c index 33240ead..863816d2 100644 --- a/freebsd/sys/dev/dwc/if_dwc.c +++ b/freebsd/sys/dev/dwc/if_dwc.c @@ -321,10 +321,6 @@ dwc_txstart_locked(struct dwc_softc *sc) ifp = sc->ifp; - if (ifp->if_drv_flags & IFF_DRV_OACTIVE) { - return; - } - enqueued = 0; for (;;) { @@ -357,7 +353,8 @@ dwc_txstart(struct ifnet *ifp) struct dwc_softc *sc = ifp->if_softc; DWC_LOCK(sc); - dwc_txstart_locked(sc); + if ((ifp->if_drv_flags & IFF_DRV_OACTIVE) == 0) + dwc_txstart_locked(sc); DWC_UNLOCK(sc); } @@ -824,6 +821,9 @@ dwc_txfinish_locked(struct dwc_softc *sc) sc->tx_idx_tail = next_txidx(sc, sc->tx_idx_tail); } + sc->ifp->if_drv_flags &= ~IFF_DRV_OACTIVE; + dwc_txstart_locked(sc); + /* If there are no buffers outstanding, muzzle the watchdog. */ if (sc->tx_idx_tail == sc->tx_idx_head) { sc->tx_watchdog_count = 0; -- cgit v1.2.3