diff options
Diffstat (limited to 'target/linux/ar71xx/files/drivers/net/ethernet/atheros')
| -rw-r--r-- | target/linux/ar71xx/files/drivers/net/ethernet/atheros/ag71xx/ag71xx_main.c | 18 | 
1 files changed, 13 insertions, 5 deletions
diff --git a/target/linux/ar71xx/files/drivers/net/ethernet/atheros/ag71xx/ag71xx_main.c b/target/linux/ar71xx/files/drivers/net/ethernet/atheros/ag71xx/ag71xx_main.c index a69ed27d7..4687e2091 100644 --- a/target/linux/ar71xx/files/drivers/net/ethernet/atheros/ag71xx/ag71xx_main.c +++ b/target/linux/ar71xx/files/drivers/net/ethernet/atheros/ag71xx/ag71xx_main.c @@ -134,6 +134,7 @@ static void ag71xx_ring_tx_clean(struct ag71xx *ag)  {  	struct ag71xx_ring *ring = &ag->tx_ring;  	struct net_device *dev = ag->dev; +	u32 bytes_compl = 0, pkts_compl = 0;  	while (ring->curr != ring->dirty) {  		u32 i = ring->dirty % ring->size; @@ -143,17 +144,19 @@ static void ag71xx_ring_tx_clean(struct ag71xx *ag)  			dev->stats.tx_errors++;  		} -		if (ring->buf[i].skb) +		if (ring->buf[i].skb) { +			bytes_compl += ring->buf[i].skb->len; +			pkts_compl++;  			dev_kfree_skb_any(ring->buf[i].skb); - +		}  		ring->buf[i].skb = NULL; -  		ring->dirty++;  	}  	/* flush descriptors */  	wmb(); +	netdev_completed_queue(dev, pkts_compl, bytes_compl);  }  static void ag71xx_ring_tx_init(struct ag71xx *ag) @@ -174,6 +177,7 @@ static void ag71xx_ring_tx_init(struct ag71xx *ag)  	ring->curr = 0;  	ring->dirty = 0; +	netdev_reset_queue(ag->dev);  }  static void ag71xx_ring_rx_clean(struct ag71xx *ag) @@ -326,6 +330,7 @@ static void ag71xx_rings_cleanup(struct ag71xx *ag)  	ag71xx_ring_free(&ag->rx_ring);  	ag71xx_ring_tx_clean(ag); +	netdev_reset_queue(ag->dev);  	ag71xx_ring_free(&ag->tx_ring);  } @@ -691,6 +696,7 @@ static netdev_tx_t ag71xx_hard_start_xmit(struct sk_buff *skb,  	dma_addr = dma_map_single(&dev->dev, skb->data, skb->len,  				  DMA_TO_DEVICE); +	netdev_sent_queue(dev, skb->len);  	ring->buf[i].skb = skb;  	ring->buf[i].timestamp = jiffies; @@ -822,11 +828,11 @@ static int ag71xx_tx_packets(struct ag71xx *ag)  {  	struct ag71xx_ring *ring = &ag->tx_ring;  	struct ag71xx_platform_data *pdata = ag71xx_get_pdata(ag); -	int sent; +	int sent = 0; +	int bytes_compl = 0;  	DBG("%s: processing TX ring\n", ag->dev->name); -	sent = 0;  	while (ring->dirty != ring->curr) {  		unsigned int i = ring->dirty % ring->size;  		struct ag71xx_desc *desc = ring->buf[i].desc; @@ -841,6 +847,7 @@ static int ag71xx_tx_packets(struct ag71xx *ag)  		ag71xx_wr(ag, AG71XX_REG_TX_STATUS, TX_STATUS_PS); +		bytes_compl += skb->len;  		ag->dev->stats.tx_bytes += skb->len;  		ag->dev->stats.tx_packets++; @@ -853,6 +860,7 @@ static int ag71xx_tx_packets(struct ag71xx *ag)  	DBG("%s: %d packets sent out\n", ag->dev->name, sent); +	netdev_completed_queue(ag->dev, sent, bytes_compl);  	if ((ring->curr - ring->dirty) < (ring->size * 3) / 4)  		netif_wake_queue(ag->dev);  | 
