Commit 33d4c482 authored by Mario Molitor's avatar Mario Molitor Committed by David S. Miller

stmmac: fix for hw timestamp of GMAC3 unit

1.) Bugfix of function stmmac_get_tx_hwtstamp.
    Corrected the tx timestamp available check (same as 4.8 and older)
    Change printout from info syslevel to debug.

2.) Bugfix of function stmmac_get_rx_hwtstamp.
    Corrected the rx timestamp available check (same as 4.8 and older)
    Change printout from info syslevel to debug.

Fixes: ba1ffd74 ("stmmac: fix PTP support for GMAC4")
Signed-off-by: default avatarMario Molitor <mario_molitor@web.de>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent fd6720ae
...@@ -214,13 +214,13 @@ static int dwmac4_wrback_get_tx_timestamp_status(struct dma_desc *p) ...@@ -214,13 +214,13 @@ static int dwmac4_wrback_get_tx_timestamp_status(struct dma_desc *p)
{ {
/* Context type from W/B descriptor must be zero */ /* Context type from W/B descriptor must be zero */
if (le32_to_cpu(p->des3) & TDES3_CONTEXT_TYPE) if (le32_to_cpu(p->des3) & TDES3_CONTEXT_TYPE)
return -EINVAL; return 0;
/* Tx Timestamp Status is 1 so des0 and des1'll have valid values */ /* Tx Timestamp Status is 1 so des0 and des1'll have valid values */
if (le32_to_cpu(p->des3) & TDES3_TIMESTAMP_STATUS) if (le32_to_cpu(p->des3) & TDES3_TIMESTAMP_STATUS)
return 0; return 1;
return 1; return 0;
} }
static inline u64 dwmac4_get_timestamp(void *desc, u32 ats) static inline u64 dwmac4_get_timestamp(void *desc, u32 ats)
...@@ -282,7 +282,10 @@ static int dwmac4_wrback_get_rx_timestamp_status(void *desc, u32 ats) ...@@ -282,7 +282,10 @@ static int dwmac4_wrback_get_rx_timestamp_status(void *desc, u32 ats)
} }
} }
exit: exit:
return ret; if (likely(ret == 0))
return 1;
return 0;
} }
static void dwmac4_rd_init_rx_desc(struct dma_desc *p, int disable_rx_ic, static void dwmac4_rd_init_rx_desc(struct dma_desc *p, int disable_rx_ic,
......
...@@ -434,14 +434,14 @@ static void stmmac_get_tx_hwtstamp(struct stmmac_priv *priv, ...@@ -434,14 +434,14 @@ static void stmmac_get_tx_hwtstamp(struct stmmac_priv *priv,
return; return;
/* check tx tstamp status */ /* check tx tstamp status */
if (!priv->hw->desc->get_tx_timestamp_status(p)) { if (priv->hw->desc->get_tx_timestamp_status(p)) {
/* get the valid tstamp */ /* get the valid tstamp */
ns = priv->hw->desc->get_timestamp(p, priv->adv_ts); ns = priv->hw->desc->get_timestamp(p, priv->adv_ts);
memset(&shhwtstamp, 0, sizeof(struct skb_shared_hwtstamps)); memset(&shhwtstamp, 0, sizeof(struct skb_shared_hwtstamps));
shhwtstamp.hwtstamp = ns_to_ktime(ns); shhwtstamp.hwtstamp = ns_to_ktime(ns);
netdev_info(priv->dev, "get valid TX hw timestamp %llu\n", ns); netdev_dbg(priv->dev, "get valid TX hw timestamp %llu\n", ns);
/* pass tstamp to stack */ /* pass tstamp to stack */
skb_tstamp_tx(skb, &shhwtstamp); skb_tstamp_tx(skb, &shhwtstamp);
} }
...@@ -468,19 +468,19 @@ static void stmmac_get_rx_hwtstamp(struct stmmac_priv *priv, struct dma_desc *p, ...@@ -468,19 +468,19 @@ static void stmmac_get_rx_hwtstamp(struct stmmac_priv *priv, struct dma_desc *p,
return; return;
/* Check if timestamp is available */ /* Check if timestamp is available */
if (!priv->hw->desc->get_rx_timestamp_status(p, priv->adv_ts)) { if (priv->hw->desc->get_rx_timestamp_status(p, priv->adv_ts)) {
/* For GMAC4, the valid timestamp is from CTX next desc. */ /* For GMAC4, the valid timestamp is from CTX next desc. */
if (priv->plat->has_gmac4) if (priv->plat->has_gmac4)
ns = priv->hw->desc->get_timestamp(np, priv->adv_ts); ns = priv->hw->desc->get_timestamp(np, priv->adv_ts);
else else
ns = priv->hw->desc->get_timestamp(p, priv->adv_ts); ns = priv->hw->desc->get_timestamp(p, priv->adv_ts);
netdev_info(priv->dev, "get valid RX hw timestamp %llu\n", ns); netdev_dbg(priv->dev, "get valid RX hw timestamp %llu\n", ns);
shhwtstamp = skb_hwtstamps(skb); shhwtstamp = skb_hwtstamps(skb);
memset(shhwtstamp, 0, sizeof(struct skb_shared_hwtstamps)); memset(shhwtstamp, 0, sizeof(struct skb_shared_hwtstamps));
shhwtstamp->hwtstamp = ns_to_ktime(ns); shhwtstamp->hwtstamp = ns_to_ktime(ns);
} else { } else {
netdev_err(priv->dev, "cannot get RX hw timestamp\n"); netdev_dbg(priv->dev, "cannot get RX hw timestamp\n");
} }
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment