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