aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDave Taht <dave.taht@bufferbloat.net>2014-06-11 12:47:07 -0700
committerAmit Pundir <amit.pundir@linaro.org>2014-10-20 11:47:19 +0530
commit3768c00e2484fb3f5b2d2046dae56572355f9697 (patch)
tree39ee03029184ee9213ede5f32d8e4911c5429d11
parent896bbc41e0d8098f1796140ab0dd66ab216a7325 (diff)
downloadlinux-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.c9
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;
}