net: stmmac: fix unbalanced ptp clock issue in suspend/resume flow
[ Upstream commit f4c7d8948e866918d61493264dbbd67e45ef2bda ] Current stmmac driver will prepare/enable ptp_ref clock in stmmac_init_tstamp_counter(). The stmmac_pltfr_noirq_suspend will disable it once in suspend flow. But in resume flow, stmmac_pltfr_noirq_resume --> stmmac_init_tstamp_counter stmmac_resume --> stmmac_hw_setup --> stmmac_init_ptp --> stmmac_init_tstamp_counter ptp_ref clock reference counter increases twice, which leads to unbalance ptp clock when resume back. Move ptp_ref clock prepare/enable out of stmmac_init_tstamp_counter to fix it. Fixes: 0735e639f129d ("net: stmmac: skip only stmmac_ptp_register when resume from suspend") Signed-off-by: Biao Huang <biao.huang@mediatek.com> Signed-off-by: David S. Miller <davem@davemloft.net> Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:

committed by
Greg Kroah-Hartman

parent
c61aede097
commit
dd7b5ba44b
@@ -738,19 +738,10 @@ int stmmac_init_tstamp_counter(struct stmmac_priv *priv, u32 systime_flags)
|
|||||||
struct timespec64 now;
|
struct timespec64 now;
|
||||||
u32 sec_inc = 0;
|
u32 sec_inc = 0;
|
||||||
u64 temp = 0;
|
u64 temp = 0;
|
||||||
int ret;
|
|
||||||
|
|
||||||
if (!(priv->dma_cap.time_stamp || priv->dma_cap.atime_stamp))
|
if (!(priv->dma_cap.time_stamp || priv->dma_cap.atime_stamp))
|
||||||
return -EOPNOTSUPP;
|
return -EOPNOTSUPP;
|
||||||
|
|
||||||
ret = clk_prepare_enable(priv->plat->clk_ptp_ref);
|
|
||||||
if (ret < 0) {
|
|
||||||
netdev_warn(priv->dev,
|
|
||||||
"failed to enable PTP reference clock: %pe\n",
|
|
||||||
ERR_PTR(ret));
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
stmmac_config_hw_tstamping(priv, priv->ptpaddr, systime_flags);
|
stmmac_config_hw_tstamping(priv, priv->ptpaddr, systime_flags);
|
||||||
priv->systime_flags = systime_flags;
|
priv->systime_flags = systime_flags;
|
||||||
|
|
||||||
@@ -2755,6 +2746,14 @@ static int stmmac_hw_setup(struct net_device *dev, bool ptp_register)
|
|||||||
|
|
||||||
stmmac_mmc_setup(priv);
|
stmmac_mmc_setup(priv);
|
||||||
|
|
||||||
|
if (ptp_register) {
|
||||||
|
ret = clk_prepare_enable(priv->plat->clk_ptp_ref);
|
||||||
|
if (ret < 0)
|
||||||
|
netdev_warn(priv->dev,
|
||||||
|
"failed to enable PTP reference clock: %pe\n",
|
||||||
|
ERR_PTR(ret));
|
||||||
|
}
|
||||||
|
|
||||||
ret = stmmac_init_ptp(priv);
|
ret = stmmac_init_ptp(priv);
|
||||||
if (ret == -EOPNOTSUPP)
|
if (ret == -EOPNOTSUPP)
|
||||||
netdev_warn(priv->dev, "PTP not supported by HW\n");
|
netdev_warn(priv->dev, "PTP not supported by HW\n");
|
||||||
|
@@ -814,7 +814,13 @@ static int __maybe_unused stmmac_pltfr_noirq_resume(struct device *dev)
|
|||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
stmmac_init_tstamp_counter(priv, priv->systime_flags);
|
ret = clk_prepare_enable(priv->plat->clk_ptp_ref);
|
||||||
|
if (ret < 0) {
|
||||||
|
netdev_warn(priv->dev,
|
||||||
|
"failed to enable PTP reference clock: %pe\n",
|
||||||
|
ERR_PTR(ret));
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
Reference in New Issue
Block a user