lkml.org 
[lkml]   [2019]   [Jun]   [19]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[net v1] net: stmmac: set IC bit when transmitting frames with HW timestamp
    Date
    From: Roland Hii <roland.king.guan.hii@intel.com>

    When transmitting certain PTP frames, e.g. SYNC and DELAY_REQ, the
    PTP daemon, e.g. ptp4l, is polling the driver for the frame transmit
    hardware timestamp. The polling will most likely timeout if the tx
    coalesce is enabled due to the Interrupt-on-Completion (IC) bit is
    not set in tx descriptor for those frames.

    This patch will ignore the tx coalesce parameter and set the IC bit
    when transmitting PTP frames which need to report out the frame
    transmit hardware timestamp to user space.

    Fixes: f748be531d70 ("net: stmmac: Rework coalesce timer and fix multi-queue races")
    Signed-off-by: Roland Hii <roland.king.guan.hii@intel.com>
    Signed-off-by: Ong Boon Leong <boon.leong.ong@intel.com>
    Signed-off-by: Voon Weifeng <weifeng.voon@intel.com>

    diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
    index 06dd51f47cfd..06358fe5b245 100644
    --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
    +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
    @@ -2947,12 +2947,15 @@ static netdev_tx_t stmmac_tso_xmit(struct sk_buff *skb, struct net_device *dev)

    /* Manage tx mitigation */
    tx_q->tx_count_frames += nfrags + 1;
    - if (priv->tx_coal_frames <= tx_q->tx_count_frames) {
    + 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++;
    - tx_q->tx_count_frames = 0;
    - } else {
    - stmmac_tx_timer_arm(priv, queue);
    }

    skb_tx_timestamp(skb);
    @@ -3166,12 +3169,15 @@ static netdev_tx_t stmmac_xmit(struct sk_buff *skb, struct net_device *dev)
    * element in case of no SG.
    */
    tx_q->tx_count_frames += nfrags + 1;
    - if (priv->tx_coal_frames <= tx_q->tx_count_frames) {
    + 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++;
    - tx_q->tx_count_frames = 0;
    - } else {
    - stmmac_tx_timer_arm(priv, queue);
    }

    skb_tx_timestamp(skb);
    --
    1.9.1
    \
     
     \ /
      Last update: 2019-06-19 08:42    [W:2.256 / U:0.124 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site