diff options
author | Dave Taht <dave.taht@bufferbloat.net> | 2014-06-11 12:47:07 -0700 |
---|---|---|
committer | Amit Pundir <amit.pundir@linaro.org> | 2014-10-20 11:47:19 +0530 |
commit | 3768c00e2484fb3f5b2d2046dae56572355f9697 (patch) | |
tree | 39ee03029184ee9213ede5f32d8e4911c5429d11 | |
parent | 896bbc41e0d8098f1796140ab0dd66ab216a7325 (diff) | |
download | linux-3768c00e2484fb3f5b2d2046dae56572355f9697.tar.gz |
cpsw: Add support for byte queue limits
IoT devices such as the beaglebone black come with a default PHY
that can only do 100Mbit, and a fairly large tx ring. BQL moderates
the effect of that considerably when saturating the network at that
speed.
Tested on a beaglebone black.
-rw-r--r-- | drivers/net/ethernet/ti/cpsw.c | 9 |
1 files changed, 8 insertions, 1 deletions
diff --git a/drivers/net/ethernet/ti/cpsw.c b/drivers/net/ethernet/ti/cpsw.c index e2a00287f8eb..16474912e6b4 100644 --- a/drivers/net/ethernet/ti/cpsw.c +++ b/drivers/net/ethernet/ti/cpsw.c @@ -685,6 +685,7 @@ static void cpsw_tx_handler(void *token, int len, int status) cpts_tx_timestamp(priv->cpts, skb); ndev->stats.tx_packets++; ndev->stats.tx_bytes += len; + netdev_completed_queue(ndev,1,len); dev_kfree_skb_any(skb); } @@ -1284,6 +1285,8 @@ static int cpsw_ndo_open(struct net_device *ndev) cpsw_set_coalesce(ndev, &coal); } + netdev_reset_queue(ndev); + dev_info(priv->dev, "BQL enabled\n"); napi_enable(&priv->napi); cpdma_ctlr_start(priv->dma); cpsw_intr_enable(priv); @@ -1318,6 +1321,7 @@ static int cpsw_ndo_stop(struct net_device *ndev) netif_stop_queue(priv->ndev); napi_disable(&priv->napi); netif_carrier_off(priv->ndev); + netdev_reset_queue(priv->ndev); if (cpsw_common_res_usage_state(priv) <= 1) { cpts_unregister(priv->cpts); @@ -1338,6 +1342,7 @@ static netdev_tx_t cpsw_ndo_start_xmit(struct sk_buff *skb, { struct cpsw_priv *priv = netdev_priv(ndev); int ret; + int len; ndev->trans_start = jiffies; @@ -1352,9 +1357,11 @@ static netdev_tx_t cpsw_ndo_start_xmit(struct sk_buff *skb, skb_shinfo(skb)->tx_flags |= SKBTX_IN_PROGRESS; skb_tx_timestamp(skb); - + len = max(skb->len, CPSW_MIN_PACKET_SIZE); + netdev_sent_queue(ndev,len); ret = cpsw_tx_packet_submit(ndev, priv, skb); if (unlikely(ret != 0)) { + netdev_completed_queue(ndev,1,len); cpsw_err(priv, tx_err, "desc submit failed\n"); goto fail; } |