From ce257edf6137957234ac28d0c47765bab5fa5bb0 Mon Sep 17 00:00:00 2001 From: Russell King Date: Tue, 25 Mar 2014 21:41:35 +0000 Subject: 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 --- drivers/net/ethernet/freescale/fec_main.c | 10 ++++++++++ 1 file changed, 10 insertions(+) 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); -- cgit