Author: nbd
Date: 2014-09-10 14:56:24 +0200 (Wed, 10 Sep 2014)
New Revision: 42457

Modified:
   
trunk/target/linux/ar71xx/files/drivers/net/ethernet/atheros/ag71xx/ag71xx_main.c
Log:
ar71xx: ack completed tx descriptors only after the full frame has been 
completed

Signed-off-by: Felix Fietkau <[email protected]>

Modified: 
trunk/target/linux/ar71xx/files/drivers/net/ethernet/atheros/ag71xx/ag71xx_main.c
===================================================================
--- 
trunk/target/linux/ar71xx/files/drivers/net/ethernet/atheros/ag71xx/ag71xx_main.c
   2014-09-10 12:56:19 UTC (rev 42456)
+++ 
trunk/target/linux/ar71xx/files/drivers/net/ethernet/atheros/ag71xx/ag71xx_main.c
   2014-09-10 12:56:24 UTC (rev 42457)
@@ -901,11 +901,12 @@
        struct ag71xx_platform_data *pdata = ag71xx_get_pdata(ag);
        int sent = 0;
        int bytes_compl = 0;
+       int n = 0;
 
        DBG("%s: processing TX ring\n", ag->dev->name);
 
-       while (ring->dirty != ring->curr) {
-               unsigned int i = ring->dirty % ring->size;
+       while (ring->dirty + n != ring->curr) {
+               unsigned int i = (ring->dirty + n) % ring->size;
                struct ag71xx_desc *desc = ring->buf[i].desc;
                struct sk_buff *skb = ring->buf[i].skb;
 
@@ -916,17 +917,22 @@
                        break;
                }
 
-               ag71xx_wr(ag, AG71XX_REG_TX_STATUS, TX_STATUS_PS);
+               n++;
+               if (!skb)
+                       continue;
 
-               if (skb) {
-                       dev_kfree_skb_any(skb);
-                       ring->buf[i].skb = NULL;
+               dev_kfree_skb_any(skb);
+               ring->buf[i].skb = NULL;
 
-                       bytes_compl += ring->buf[i].len;
-                       sent++;
+               bytes_compl += ring->buf[i].len;
+
+               sent++;
+               ring->dirty += n;
+
+               while (n > 0) {
+                       ag71xx_wr(ag, AG71XX_REG_TX_STATUS, TX_STATUS_PS);
+                       n--;
                }
-
-               ring->dirty++;
        }
 
        DBG("%s: %d packets sent out\n", ag->dev->name, sent);
_______________________________________________
openwrt-commits mailing list
[email protected]
https://lists.openwrt.org/cgi-bin/mailman/listinfo/openwrt-commits

Reply via email to