Author: loos
Date: Wed Jun  3 14:48:03 2015
New Revision: 283948
URL: https://svnweb.freebsd.org/changeset/base/283948

Log:
  Fix the OACTIVE handling on if_dwc.
  
  Previously the OACTIVE flag was being set when the tx descriptors are fully
  allocated but it wasn't unset anywhere.
  
  As soon as a packet is transmitted, unset the OACTIVE flag and call start
  routine to push any pending packets from the tx queue.
  
  This closes another race where a full tx queue would jam the tx path (tx
  queue is full, new packets cannot be added to queue and dwc_txstart never
  gets called).

Modified:
  head/sys/dev/dwc/if_dwc.c

Modified: head/sys/dev/dwc/if_dwc.c
==============================================================================
--- head/sys/dev/dwc/if_dwc.c   Wed Jun  3 14:07:50 2015        (r283947)
+++ head/sys/dev/dwc/if_dwc.c   Wed Jun  3 14:48:03 2015        (r283948)
@@ -741,9 +741,11 @@ dwc_txfinish_locked(struct dwc_softc *sc
 {
        struct dwc_bufmap *bmap;
        struct dwc_hwdesc *desc;
+       struct ifnet *ifp;
 
        DWC_ASSERT_LOCKED(sc);
 
+       fp = 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)
@@ -756,6 +758,7 @@ 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;
        }
 
        /* If there are no buffers outstanding, muzzle the watchdog. */
@@ -838,8 +841,10 @@ dwc_intr(void *arg)
                if (reg & DMA_STATUS_RI)
                        dwc_rxfinish_locked(sc);
 
-               if (reg & DMA_STATUS_TI)
+               if (reg & DMA_STATUS_TI) {
                        dwc_txfinish_locked(sc);
+                       dwc_txstart_locked(sc);
+               }
        }
 
        if (reg & DMA_STATUS_AIS) {
_______________________________________________
[email protected] mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "[email protected]"

Reply via email to