Patch "net: systemport: Decouple flow control from __bcm_sysport_tx_reclaim" has been added to the 4.9-stable tree
Subsystems (3)
This is a note to let you know that I've just added the patch titled
net: systemport: Decouple flow control from __bcm_sysport_tx_reclaim
to the 4.9-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
net-systemport-decouple-flow-control-from-__bcm_sysport_tx_reclaim.patch
and it can be found in the queue-4.9 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From foo@baz Wed Feb 1 08:50:24 CET 2017
From: Florian Fainelli <[email protected]>
Date: Thu, 12 Jan 2017 12:09:09 -0800
Subject: net: systemport: Decouple flow control from __bcm_sysport_tx_reclaim
From: Florian Fainelli <[email protected]>
[ Upstream commit 148d3d021cf9724fcf189ce4e525a094bbf5ce89 ]
The __bcm_sysport_tx_reclaim() function is used to reclaim transmit resources in different places within the driver. Most of them should not affect the state of the transit flow control.
Introduce bcm_sysport_tx_clean() which cleans the ring, but does not re-enable flow control towards the networking stack, and make bcm_sysport_tx_reclaim() do the actual transmit queue flow control.
--- drivers/net/ethernet/broadcom/bcmsysport.c | 25 ++++++++++++++++++------- 1 file changed, 18 insertions(+), 7 deletions(-)
drivers/net/ethernet/broadcom/bcmsysport.c +18 -7
@@ -710,11 +710,8 @@ static unsigned int __bcm_sysport_tx_recunsigned int c_index, last_c_index, last_tx_cn, num_tx_cbs;unsigned int pkts_compl =0 , bytes_compl =0 ;struct bcm_sysport_cb *cb; -struct netdev_queue *txq;u32 hw_ind; - txq =netdev_get_tx_queue (ndev, ring->index); -/* Compute how many descriptors have been processed since last call */ hw_ind =tdma_readl (priv,TDMA_DESC_RING_PROD_CONS_INDEX (ring->index)); c_index = (hw_ind >>RING_CONS_INDEX_SHIFT ) &RING_CONS_INDEX_MASK ;
@@ -745,9 +742,6 @@ static unsigned int __bcm_sysport_tx_rec ring->c_index = c_index; -if (netif_tx_queue_stopped (txq) && pkts_compl) -netif_tx_wake_queue (txq); -netif_dbg (priv, tx_done, ndev,"ring=%d c_index=%d pkts_compl=%d, bytes_compl=%d\n" , ring->index, ring->c_index, pkts_compl, bytes_compl);
@@ -759,16 +753,33 @@ static unsigned int __bcm_sysport_tx_recstatic unsigned int bcm_sysport_tx_reclaim (struct bcm_sysport_priv *priv,struct bcm_sysport_tx_ring *ring) { +struct netdev_queue *txq;unsigned int released;unsigned long flags; + txq =netdev_get_tx_queue (priv->netdev, ring->index); +spin_lock_irqsave (&ring->lock, flags); released =__bcm_sysport_tx_reclaim (priv, ring); +if (released) +netif_tx_wake_queue (txq); +spin_unlock_irqrestore (&ring->lock, flags);return released; } +/* Locked version of the per-ring TX reclaim, but does not wake the queue */ +static void bcm_sysport_tx_clean (struct bcm_sysport_priv *priv, +struct bcm_sysport_tx_ring *ring) +{ +unsigned long flags; + +spin_lock_irqsave (&ring->lock, flags); +__bcm_sysport_tx_reclaim (priv, ring); +spin_unlock_irqrestore (&ring->lock, flags); +} +static int bcm_sysport_tx_poll (struct napi_struct *napi,int budget) { struct bcm_sysport_tx_ring *ring =
@@ -1253,7 +1264,7 @@ static void bcm_sysport_fini_tx_ring(strnapi_disable (&ring->napi);netif_napi_del (&ring->napi); -bcm_sysport_tx_reclaim (priv, ring); +bcm_sysport_tx_clean (priv, ring);kfree (ring->cbs); ring->cbs =NULL ;
Patches currently in stable-queue which might be from [email protected] are
queue-4.9/net-systemport-decouple-flow-control-from-__bcm_sysport_tx_reclaim.patch queue-4.9/net-dsa-bring-back-device-detaching-in-dsa_slave_suspend.patch queue-4.9/net-phy-bcm63xx-utilize-correct-config_intr-function.patch