|
|
dff326 |
From 99b58f4f8ac3b3219a7de0412db209b61167d61f Mon Sep 17 00:00:00 2001
|
|
|
dff326 |
From: Biao Huang <biao.huang@mediatek.com>
|
|
|
dff326 |
Date: Thu, 14 Jul 2022 14:00:14 +0800
|
|
|
dff326 |
Subject: [PATCH 16/28] net: stmmac: fix unbalanced ptp clock issue in
|
|
|
dff326 |
suspend/resume flow
|
|
|
dff326 |
Git-commit: f4c7d8948e866918d61493264dbbd67e45ef2bda
|
|
|
dff326 |
Patch-mainline: v5.19-rc8
|
|
|
dff326 |
References: git-fixes
|
|
|
dff326 |
|
|
|
dff326 |
Current stmmac driver will prepare/enable ptp_ref clock in
|
|
|
dff326 |
stmmac_init_tstamp_counter().
|
|
|
dff326 |
|
|
|
dff326 |
The stmmac_pltfr_noirq_suspend will disable it once in suspend flow.
|
|
|
dff326 |
|
|
|
dff326 |
But in resume flow,
|
|
|
dff326 |
stmmac_pltfr_noirq_resume --> stmmac_init_tstamp_counter
|
|
|
dff326 |
stmmac_resume --> stmmac_hw_setup --> stmmac_init_ptp --> stmmac_init_tstamp_counter
|
|
|
dff326 |
ptp_ref clock reference counter increases twice, which leads to unbalance
|
|
|
dff326 |
ptp clock when resume back.
|
|
|
dff326 |
|
|
|
dff326 |
Move ptp_ref clock prepare/enable out of stmmac_init_tstamp_counter to fix it.
|
|
|
dff326 |
|
|
|
dff326 |
Fixes: 0735e639f129d ("net: stmmac: skip only stmmac_ptp_register when resume from suspend")
|
|
|
dff326 |
Signed-off-by: Biao Huang <biao.huang@mediatek.com>
|
|
|
dff326 |
Signed-off-by: David S. Miller <davem@davemloft.net>
|
|
|
dff326 |
Signed-off-by: Denis Kirjanov <denis.kirjanov@suse.com>
|
|
|
dff326 |
---
|
|
|
dff326 |
drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | 17 ++++++++---------
|
|
|
dff326 |
drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c | 8 +++++++-
|
|
|
dff326 |
2 files changed, 15 insertions(+), 10 deletions(-)
|
|
|
dff326 |
|
|
|
dff326 |
diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
|
|
|
dff326 |
index 2f06f46e1b7a..5f2f25de6639 100644
|
|
|
dff326 |
--- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
|
|
|
dff326 |
+++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
|
|
|
dff326 |
@@ -843,19 +843,10 @@ int stmmac_init_tstamp_counter(struct stmmac_priv *priv, u32 systime_flags)
|
|
|
dff326 |
struct timespec64 now;
|
|
|
dff326 |
u32 sec_inc = 0;
|
|
|
dff326 |
u64 temp = 0;
|
|
|
dff326 |
- int ret;
|
|
|
dff326 |
|
|
|
dff326 |
if (!(priv->dma_cap.time_stamp || priv->dma_cap.atime_stamp))
|
|
|
dff326 |
return -EOPNOTSUPP;
|
|
|
dff326 |
|
|
|
dff326 |
- ret = clk_prepare_enable(priv->plat->clk_ptp_ref);
|
|
|
dff326 |
- if (ret < 0) {
|
|
|
dff326 |
- netdev_warn(priv->dev,
|
|
|
dff326 |
- "failed to enable PTP reference clock: %pe\n",
|
|
|
dff326 |
- ERR_PTR(ret));
|
|
|
dff326 |
- return ret;
|
|
|
dff326 |
- }
|
|
|
dff326 |
-
|
|
|
dff326 |
stmmac_config_hw_tstamping(priv, priv->ptpaddr, systime_flags);
|
|
|
dff326 |
priv->systime_flags = systime_flags;
|
|
|
dff326 |
|
|
|
dff326 |
@@ -3320,6 +3311,14 @@ static int stmmac_hw_setup(struct net_device *dev, bool ptp_register)
|
|
|
dff326 |
|
|
|
dff326 |
stmmac_mmc_setup(priv);
|
|
|
dff326 |
|
|
|
dff326 |
+ if (ptp_register) {
|
|
|
dff326 |
+ ret = clk_prepare_enable(priv->plat->clk_ptp_ref);
|
|
|
dff326 |
+ if (ret < 0)
|
|
|
dff326 |
+ netdev_warn(priv->dev,
|
|
|
dff326 |
+ "failed to enable PTP reference clock: %pe\n",
|
|
|
dff326 |
+ ERR_PTR(ret));
|
|
|
dff326 |
+ }
|
|
|
dff326 |
+
|
|
|
dff326 |
ret = stmmac_init_ptp(priv);
|
|
|
dff326 |
if (ret == -EOPNOTSUPP)
|
|
|
dff326 |
netdev_warn(priv->dev, "PTP not supported by HW\n");
|
|
|
dff326 |
diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c
|
|
|
dff326 |
index 11e1055e8260..9f5cac4000da 100644
|
|
|
dff326 |
--- a/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c
|
|
|
dff326 |
+++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c
|
|
|
dff326 |
@@ -815,7 +815,13 @@ static int __maybe_unused stmmac_pltfr_noirq_resume(struct device *dev)
|
|
|
dff326 |
if (ret)
|
|
|
dff326 |
return ret;
|
|
|
dff326 |
|
|
|
dff326 |
- stmmac_init_tstamp_counter(priv, priv->systime_flags);
|
|
|
dff326 |
+ ret = clk_prepare_enable(priv->plat->clk_ptp_ref);
|
|
|
dff326 |
+ if (ret < 0) {
|
|
|
dff326 |
+ netdev_warn(priv->dev,
|
|
|
dff326 |
+ "failed to enable PTP reference clock: %pe\n",
|
|
|
dff326 |
+ ERR_PTR(ret));
|
|
|
dff326 |
+ return ret;
|
|
|
dff326 |
+ }
|
|
|
dff326 |
}
|
|
|
dff326 |
|
|
|
dff326 |
return 0;
|
|
|
dff326 |
--
|
|
|
dff326 |
2.16.4
|
|
|
dff326 |
|