Message ID | 1560955308-15190-1-git-send-email-weifeng.voon@intel.com |
---|---|
State | Accepted |
Delegated to: | David Miller |
Headers | show |
Series | [net,v1] net: stmmac: set IC bit when transmitting frames with HW timestamp | expand |
From: Voon Weifeng <weifeng.voon@intel.com> Date: Wed, 19 Jun 2019 22:41:48 +0800 > 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> Applied and queued up for -stable.
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);