summaryrefslogtreecommitdiffstats
path: root/freebsd/sys/dev/dwc
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2015-03-30 09:51:18 +0200
committerSebastian Huber <sebastian.huber@embedded-brains.de>2017-01-10 09:53:33 +0100
commit941021287ad8262eddbd2cb0dd4d145ede8b87d7 (patch)
tree533b959612cdeca9a63fef31623da754cb0a96dd /freebsd/sys/dev/dwc
parentif_dwc: Fix IFCOUNTER_IPACKETS statistics (diff)
downloadrtems-libbsd-941021287ad8262eddbd2cb0dd4d145ede8b87d7.tar.bz2
if_dwc: Fix transmit starvation
Diffstat (limited to 'freebsd/sys/dev/dwc')
-rw-r--r--freebsd/sys/dev/dwc/if_dwc.c13
1 files changed, 5 insertions, 8 deletions
diff --git a/freebsd/sys/dev/dwc/if_dwc.c b/freebsd/sys/dev/dwc/if_dwc.c
index 159bba33..ae0ae876 100644
--- a/freebsd/sys/dev/dwc/if_dwc.c
+++ b/freebsd/sys/dev/dwc/if_dwc.c
@@ -256,10 +256,6 @@ dwc_txstart_locked(struct dwc_softc *sc)
ifp = sc->ifp;
- if (ifp->if_drv_flags & IFF_DRV_OACTIVE) {
- return;
- }
-
enqueued = 0;
for (;;) {
@@ -292,7 +288,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);
}
@@ -718,11 +715,9 @@ dwc_txfinish_locked(struct dwc_softc *sc)
{
struct dwc_bufmap *bmap;
struct dwc_hwdesc *desc;
- struct ifnet *ifp;
DWC_ASSERT_LOCKED(sc);
- ifp = sc->ifp;
while (sc->tx_idx_tail != sc->tx_idx_head) {
desc = &sc->txdesc_ring[sc->tx_idx_tail];
if ((desc->tdes0 & DDESC_TDES0_OWN) != 0)
@@ -735,9 +730,11 @@ dwc_txfinish_locked(struct dwc_softc *sc)
bmap->mbuf = NULL;
dwc_setup_txdesc(sc, sc->tx_idx_tail, 0, 0);
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 (sc->tx_idx_tail == sc->tx_idx_head) {
sc->tx_watchdog_count = 0;