Author: manu
Date: Sat Nov 18 20:38:05 2017
New Revision: 325977
URL: https://svnweb.freebsd.org/changeset/base/325977

Log:
  if_awg: only request completion interrupt on the last descriptor of a tx frame
  
  The hardware will not issue a completion interrupt for a descriptor
  with TX_INT_CTL set if it doesn't also have TX_LAST_DESC set.
  
  Submitted by:  Guy Yur <guyyur_gmail.com>
  Differential Revision:        https://reviews.freebsd.org/D13029

Modified:
  head/sys/arm/allwinner/if_awg.c

Modified: head/sys/arm/allwinner/if_awg.c
==============================================================================
--- head/sys/arm/allwinner/if_awg.c     Sat Nov 18 20:32:09 2017        
(r325976)
+++ head/sys/arm/allwinner/if_awg.c     Sat Nov 18 20:38:05 2017        
(r325977)
@@ -169,6 +169,7 @@ struct awg_txring {
        bus_dma_tag_t           buf_tag;
        struct awg_bufmap       buf_map[TX_DESC_COUNT];
        u_int                   cur, next, queued;
+       u_int                   segs;
 };
 
 struct awg_rxring {
@@ -399,8 +400,6 @@ awg_setup_txdesc(struct awg_softc *sc, int index, int 
        } else {
                status = TX_DESC_CTL;
                size = flags | len;
-               if ((index & (awg_tx_interval - 1)) == 0)
-                       size |= TX_INT_CTL;
                ++sc->tx.queued;
        }
 
@@ -449,8 +448,18 @@ awg_setup_txbuf(struct awg_softc *sc, int index, struc
 
        for (cur = index, i = 0; i < nsegs; i++) {
                sc->tx.buf_map[cur].mbuf = (i == 0 ? m : NULL);
-               if (i == nsegs - 1)
+               sc->tx.segs++;
+               if (i == nsegs - 1) {
                        flags |= TX_LAST_DESC;
+                       /*
+                        * Can only request TX completion
+                        * interrupt on last descriptor.
+                        */
+                       if (sc->tx.segs >= awg_tx_interval) {
+                               sc->tx.segs = 0;
+                               flags |= TX_INT_CTL;
+                       }
+               }
                awg_setup_txdesc(sc, cur, flags, segs[i].ds_addr,
                    segs[i].ds_len);
                flags &= ~TX_FIR_DESC;
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to