mirror of https://gitee.com/openkylin/linux.git
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: ba1ffd74df
("stmmac: fix PTP support for GMAC4")
Signed-off-by: Mario Molitor <mario_molitor@web.de>
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
fd6720aefd
commit
33d4c48213
|
@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
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,
|
||||||
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,
|
||||||
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");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue