73 lines
2.3 KiB
Diff
73 lines
2.3 KiB
Diff
From: stephen hemminger <shemminger@vyatta.com>
|
|
Date: Tue, 29 Nov 2011 15:15:33 +0000
|
|
Subject: sky2: add bql support
|
|
|
|
commit ec2a5466b3ce680c92e8e05617b020fd825854b9 upstream.
|
|
|
|
This adds support for byte queue limits and aggregates statistics
|
|
update (suggestion from Eric).
|
|
|
|
Signed-off-by: Stephen Hemminger <shemminger@vyatta.com>
|
|
Signed-off-by: David S. Miller <davem@drr.davemloft.net>
|
|
---
|
|
drivers/net/ethernet/marvell/sky2.c | 18 +++++++++++++-----
|
|
1 file changed, 13 insertions(+), 5 deletions(-)
|
|
|
|
diff --git a/drivers/net/ethernet/marvell/sky2.c b/drivers/net/ethernet/marvell/sky2.c
|
|
index 29adc78..760c2b1 100644
|
|
--- a/drivers/net/ethernet/marvell/sky2.c
|
|
+++ b/drivers/net/ethernet/marvell/sky2.c
|
|
@@ -1110,6 +1110,7 @@ static void tx_init(struct sky2_port *sky2)
|
|
sky2->tx_prod = sky2->tx_cons = 0;
|
|
sky2->tx_tcpsum = 0;
|
|
sky2->tx_last_mss = 0;
|
|
+ netdev_reset_queue(sky2->netdev);
|
|
|
|
le = get_tx_le(sky2, &sky2->tx_prod);
|
|
le->addr = 0;
|
|
@@ -1971,6 +1972,7 @@ static netdev_tx_t sky2_xmit_frame(struct sk_buff *skb,
|
|
if (tx_avail(sky2) <= MAX_SKB_TX_LE)
|
|
netif_stop_queue(dev);
|
|
|
|
+ netdev_sent_queue(dev, skb->len);
|
|
sky2_put_idx(hw, txqaddr[sky2->port], sky2->tx_prod);
|
|
|
|
return NETDEV_TX_OK;
|
|
@@ -2002,7 +2004,8 @@ mapping_error:
|
|
static void sky2_tx_complete(struct sky2_port *sky2, u16 done)
|
|
{
|
|
struct net_device *dev = sky2->netdev;
|
|
- unsigned idx;
|
|
+ u16 idx;
|
|
+ unsigned int bytes_compl = 0, pkts_compl = 0;
|
|
|
|
BUG_ON(done >= sky2->tx_ring_size);
|
|
|
|
@@ -2017,10 +2020,8 @@ static void sky2_tx_complete(struct sky2_port *sky2, u16 done)
|
|
netif_printk(sky2, tx_done, KERN_DEBUG, dev,
|
|
"tx done %u\n", idx);
|
|
|
|
- u64_stats_update_begin(&sky2->tx_stats.syncp);
|
|
- ++sky2->tx_stats.packets;
|
|
- sky2->tx_stats.bytes += skb->len;
|
|
- u64_stats_update_end(&sky2->tx_stats.syncp);
|
|
+ pkts_compl++;
|
|
+ bytes_compl += skb->len;
|
|
|
|
re->skb = NULL;
|
|
dev_kfree_skb_any(skb);
|
|
@@ -2031,6 +2032,13 @@ static void sky2_tx_complete(struct sky2_port *sky2, u16 done)
|
|
|
|
sky2->tx_cons = idx;
|
|
smp_mb();
|
|
+
|
|
+ netdev_completed_queue(dev, pkts_compl, bytes_compl);
|
|
+
|
|
+ u64_stats_update_begin(&sky2->tx_stats.syncp);
|
|
+ sky2->tx_stats.packets += pkts_compl;
|
|
+ sky2->tx_stats.bytes += bytes_compl;
|
|
+ u64_stats_update_end(&sky2->tx_stats.syncp);
|
|
}
|
|
|
|
static void sky2_tx_reset(struct sky2_hw *hw, unsigned port)
|