diff options
Diffstat (limited to 'drivers/net/ethernet/freescale/fec_main.c')
-rw-r--r-- | drivers/net/ethernet/freescale/fec_main.c | 10 |
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); |