Commit 509e1684 authored by nbd's avatar nbd

ar71xx: ack completed tx descriptors only after the full frame has been completed

Signed-off-by: default avatarFelix Fietkau <nbd@openwrt.org>

Backport of r42457

git-svn-id: svn://svn.openwrt.org/openwrt/branches/barrier_breaker@42475 3c298f89-4303-0410-b956-a3cf2f4a3e73
parent 77b91802
...@@ -901,11 +901,12 @@ static int ag71xx_tx_packets(struct ag71xx *ag) ...@@ -901,11 +901,12 @@ static int ag71xx_tx_packets(struct ag71xx *ag)
struct ag71xx_platform_data *pdata = ag71xx_get_pdata(ag); struct ag71xx_platform_data *pdata = ag71xx_get_pdata(ag);
int sent = 0; int sent = 0;
int bytes_compl = 0; int bytes_compl = 0;
int n = 0;
DBG("%s: processing TX ring\n", ag->dev->name); DBG("%s: processing TX ring\n", ag->dev->name);
while (ring->dirty != ring->curr) { while (ring->dirty + n != ring->curr) {
unsigned int i = ring->dirty % ring->size; unsigned int i = (ring->dirty + n) % ring->size;
struct ag71xx_desc *desc = ring->buf[i].desc; struct ag71xx_desc *desc = ring->buf[i].desc;
struct sk_buff *skb = ring->buf[i].skb; struct sk_buff *skb = ring->buf[i].skb;
...@@ -916,17 +917,22 @@ static int ag71xx_tx_packets(struct ag71xx *ag) ...@@ -916,17 +917,22 @@ static int ag71xx_tx_packets(struct ag71xx *ag)
break; break;
} }
ag71xx_wr(ag, AG71XX_REG_TX_STATUS, TX_STATUS_PS); n++;
if (!skb)
continue;
if (skb) { dev_kfree_skb_any(skb);
dev_kfree_skb_any(skb); ring->buf[i].skb = NULL;
ring->buf[i].skb = NULL;
bytes_compl += ring->buf[i].len; bytes_compl += ring->buf[i].len;
sent++;
}
ring->dirty++; sent++;
ring->dirty += n;
while (n > 0) {
ag71xx_wr(ag, AG71XX_REG_TX_STATUS, TX_STATUS_PS);
n--;
}
} }
DBG("%s: %d packets sent out\n", ag->dev->name, sent); DBG("%s: %d packets sent out\n", ag->dev->name, sent);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment