summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRussell King <rmk+kernel@arm.linux.org.uk>2014-03-25 21:41:35 +0000
committerRussell King <rmk+kernel@arm.linux.org.uk>2014-10-17 14:35:00 +0100
commitce257edf6137957234ac28d0c47765bab5fa5bb0 (patch)
treeeaf8569908a1a052cd99f5308168210d4fb34be0
parenta9f1d3b0144d7ed328d4bc84b1fbb459ee725ecc (diff)
net: fec: add byte queue limits support
Add support for byte queue limits, which allows the network schedulers to control packet latency and packet queues more accurately. Further information on this feature can be found at https://lwn.net/Articles/469652/ Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
-rw-r--r--drivers/net/ethernet/freescale/fec_main.c10
1 files changed, 10 insertions, 0 deletions
diff --git a/drivers/net/ethernet/freescale/fec_main.c b/drivers/net/ethernet/freescale/fec_main.c
index c30270168bec..6d4142d4ef39 100644
--- a/drivers/net/ethernet/freescale/fec_main.c
+++ b/drivers/net/ethernet/freescale/fec_main.c
@@ -596,6 +596,7 @@ static int fec_enet_txq_submit_skb(struct sk_buff *skb, struct net_device *ndev)
bdp = fec_enet_get_nextdesc(last_bdp, fep);
skb_tx_timestamp(skb);
+ netdev_sent_queue(ndev, skb->len);
fep->cur_tx = bdp;
@@ -782,6 +783,7 @@ static int fec_enet_txq_submit_tso(struct sk_buff *skb, struct net_device *ndev)
fep->tx_skbuff[index] = skb;
skb_tx_timestamp(skb);
+ netdev_sent_queue(ndev, skb->len);
fep->cur_tx = bdp;
/* Trigger transmission start */
@@ -903,6 +905,7 @@ fec_restart(struct net_device *ndev)
writel(PKT_MAXBLR_SIZE, fep->hwp + FEC_R_BUFF_SIZE);
fec_enet_bd_init(ndev);
+ netdev_reset_queue(ndev);
/* Set receive and transmit descriptor base. */
writel(fep->bd_dma, fep->hwp + FEC_R_DES_START);
@@ -1136,6 +1139,7 @@ fec_enet_tx(struct net_device *ndev)
struct sk_buff *skb;
int index = 0;
int entries_free;
+ unsigned int pkts_compl, bytes_compl;
fep = netdev_priv(ndev);
bdp = fep->dirty_tx;
@@ -1143,6 +1147,7 @@ fec_enet_tx(struct net_device *ndev)
/* get next bdp of dirty_tx */
bdp = fec_enet_get_nextdesc(bdp, fep);
+ pkts_compl = bytes_compl = 0;
while (((status = bdp->cbd_sc) & BD_ENET_TX_READY) == 0) {
/* current queue is empty */
@@ -1196,6 +1201,9 @@ fec_enet_tx(struct net_device *ndev)
if (status & BD_ENET_TX_DEF)
ndev->stats.collisions++;
+ pkts_compl++;
+ bytes_compl += skb->len;
+
/* Free the sk buffer associated with this last transmit */
dev_kfree_skb_any(skb);
@@ -1213,6 +1221,8 @@ fec_enet_tx(struct net_device *ndev)
}
}
+ netdev_completed_queue(ndev, pkts_compl, bytes_compl);
+
/* ERR006538: Keep the transmitter going */
if (bdp != fep->cur_tx && readl(fep->hwp + FEC_X_DES_ACTIVE) == 0)
writel(0, fep->hwp + FEC_X_DES_ACTIVE);