lkml.org 
[lkml]   [2019]   [Nov]   [6]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH net 11/11] net: stmmac: Fix the TX IOC in xmit path
    Date
    IOC bit must be only set in the last descriptor. Move the logic up a
    little bit to make sure it's set in the correct descriptor.

    Signed-off-by: Jose Abreu <Jose.Abreu@synopsys.com>

    ---
    Cc: Giuseppe Cavallaro <peppe.cavallaro@st.com>
    Cc: Alexandre Torgue <alexandre.torgue@st.com>
    Cc: Jose Abreu <joabreu@synopsys.com>
    Cc: "David S. Miller" <davem@davemloft.net>
    Cc: Maxime Coquelin <mcoquelin.stm32@gmail.com>
    Cc: netdev@vger.kernel.org
    Cc: linux-stm32@st-md-mailman.stormreply.com
    Cc: linux-arm-kernel@lists.infradead.org
    Cc: linux-kernel@vger.kernel.org
    ---
    drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | 64 ++++++++++++-----------
    1 file changed, 34 insertions(+), 30 deletions(-)

    diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
    index b0a16d7c6e3d..f826365c979d 100644
    --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
    +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
    @@ -3024,6 +3024,19 @@ static netdev_tx_t stmmac_tso_xmit(struct sk_buff *skb, struct net_device *dev)
    /* Only the last descriptor gets to point to the skb. */
    tx_q->tx_skbuff[tx_q->cur_tx] = skb;

    + /* Manage tx mitigation */
    + tx_q->tx_count_frames += nfrags + 1;
    + if (likely(priv->tx_coal_frames > tx_q->tx_count_frames) &&
    + !((skb_shinfo(skb)->tx_flags & SKBTX_HW_TSTAMP) &&
    + priv->hwts_tx_en)) {
    + stmmac_tx_timer_arm(priv, queue);
    + } else {
    + desc = &tx_q->dma_tx[tx_q->cur_tx];
    + tx_q->tx_count_frames = 0;
    + stmmac_set_tx_ic(priv, desc);
    + priv->xstats.tx_set_ic_bit++;
    + }
    +
    /* We've used all descriptors we need for this skb, however,
    * advance cur_tx so that it references a fresh descriptor.
    * ndo_start_xmit will fill this descriptor the next time it's
    @@ -3041,19 +3054,6 @@ static netdev_tx_t stmmac_tso_xmit(struct sk_buff *skb, struct net_device *dev)
    priv->xstats.tx_tso_frames++;
    priv->xstats.tx_tso_nfrags += nfrags;

    - /* Manage tx mitigation */
    - tx_q->tx_count_frames += nfrags + 1;
    - if (likely(priv->tx_coal_frames > tx_q->tx_count_frames) &&
    - !(priv->synopsys_id >= DWMAC_CORE_4_00 &&
    - (skb_shinfo(skb)->tx_flags & SKBTX_HW_TSTAMP) &&
    - priv->hwts_tx_en)) {
    - stmmac_tx_timer_arm(priv, queue);
    - } else {
    - tx_q->tx_count_frames = 0;
    - stmmac_set_tx_ic(priv, desc);
    - priv->xstats.tx_set_ic_bit++;
    - }
    -
    if (priv->sarc_type)
    stmmac_set_desc_sarc(priv, first, priv->sarc_type);

    @@ -3225,6 +3225,27 @@ static netdev_tx_t stmmac_xmit(struct sk_buff *skb, struct net_device *dev)
    /* Only the last descriptor gets to point to the skb. */
    tx_q->tx_skbuff[entry] = skb;

    + /* According to the coalesce parameter the IC bit for the latest
    + * segment is reset and the timer re-started to clean the tx status.
    + * This approach takes care about the fragments: desc is the first
    + * element in case of no SG.
    + */
    + tx_q->tx_count_frames += nfrags + 1;
    + if (likely(priv->tx_coal_frames > tx_q->tx_count_frames) &&
    + !((skb_shinfo(skb)->tx_flags & SKBTX_HW_TSTAMP) &&
    + priv->hwts_tx_en)) {
    + stmmac_tx_timer_arm(priv, queue);
    + } else {
    + if (likely(priv->extend_desc))
    + desc = &tx_q->dma_etx[entry].basic;
    + else
    + desc = &tx_q->dma_tx[entry];
    +
    + tx_q->tx_count_frames = 0;
    + stmmac_set_tx_ic(priv, desc);
    + priv->xstats.tx_set_ic_bit++;
    + }
    +
    /* We've used all descriptors we need for this skb, however,
    * advance cur_tx so that it references a fresh descriptor.
    * ndo_start_xmit will fill this descriptor the next time it's
    @@ -3260,23 +3281,6 @@ static netdev_tx_t stmmac_xmit(struct sk_buff *skb, struct net_device *dev)

    dev->stats.tx_bytes += skb->len;

    - /* According to the coalesce parameter the IC bit for the latest
    - * segment is reset and the timer re-started to clean the tx status.
    - * This approach takes care about the fragments: desc is the first
    - * element in case of no SG.
    - */
    - tx_q->tx_count_frames += nfrags + 1;
    - if (likely(priv->tx_coal_frames > tx_q->tx_count_frames) &&
    - !(priv->synopsys_id >= DWMAC_CORE_4_00 &&
    - (skb_shinfo(skb)->tx_flags & SKBTX_HW_TSTAMP) &&
    - priv->hwts_tx_en)) {
    - stmmac_tx_timer_arm(priv, queue);
    - } else {
    - tx_q->tx_count_frames = 0;
    - stmmac_set_tx_ic(priv, desc);
    - priv->xstats.tx_set_ic_bit++;
    - }
    -
    if (priv->sarc_type)
    stmmac_set_desc_sarc(priv, first, priv->sarc_type);

    --
    2.7.4
    \
     
     \ /
      Last update: 2019-11-06 16:05    [W:3.431 / U:0.280 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site