[PATCH net v3] net: fec: fix clock count mis-match

Subsystems: freescale imx / mxc fec driver, networking drivers, the rest

STALE2449d

3 messages, 3 authors, 2019-11-19 · open the first message on its own page

[PATCH net v3] net: fec: fix clock count mis-match

From: Chuhong Yuan <hidden>
Date: 2019-11-18 12:18:38

pm_runtime_put_autosuspend in probe will call suspend to disable clks
automatically if CONFIG_PM is defined. (If CONFIG_PM is not defined,
its implementation will be empty, then suspend will not be called.)

Therefore, we can call pm_runtime_get_sync to resume it first to enable
clks, which matches the suspend. (Only when CONFIG_PM is defined, otherwise
pm_runtime_get_sync will also be empty, then resume will not be called.)

Then it is fine to disable clks without causing clock count mis-match.

Fixes: c43eab3eddb4 ("net: fec: add missed clk_disable_unprepare in remove")
Signed-off-by: Chuhong Yuan <redacted>
---
 drivers/net/ethernet/freescale/fec_main.c | 15 +++++++++++----
 1 file changed, 11 insertions(+), 4 deletions(-)
diff --git a/drivers/net/ethernet/freescale/fec_main.c b/drivers/net/ethernet/freescale/fec_main.c
index a9c386b63581..4bb30761abfc 100644
--- a/drivers/net/ethernet/freescale/fec_main.c
+++ b/drivers/net/ethernet/freescale/fec_main.c
@@ -3636,6 +3636,11 @@ fec_drv_remove(struct platform_device *pdev)
 	struct net_device *ndev = platform_get_drvdata(pdev);
 	struct fec_enet_private *fep = netdev_priv(ndev);
 	struct device_node *np = pdev->dev.of_node;
+	int ret;
+
+	ret = pm_runtime_get_sync(&pdev->dev);
+	if (ret < 0)
+		return ret;
 
 	cancel_work_sync(&fep->tx_timeout_work);
 	fec_ptp_stop(pdev);
@@ -3643,15 +3648,17 @@ fec_drv_remove(struct platform_device *pdev)
 	fec_enet_mii_remove(fep);
 	if (fep->reg_phy)
 		regulator_disable(fep->reg_phy);
-	pm_runtime_put(&pdev->dev);
-	pm_runtime_disable(&pdev->dev);
-	clk_disable_unprepare(fep->clk_ahb);
-	clk_disable_unprepare(fep->clk_ipg);
+
 	if (of_phy_is_fixed_link(np))
 		of_phy_deregister_fixed_link(np);
 	of_node_put(fep->phy_node);
 	free_netdev(ndev);
 
+	clk_disable_unprepare(fep->clk_ahb);
+	clk_disable_unprepare(fep->clk_ipg);
+	pm_runtime_put_noidle(&pdev->dev);
+	pm_runtime_disable(&pdev->dev);
+
 	return 0;
 }
 
-- 
2.24.0

RE: [EXT] [PATCH net v3] net: fec: fix clock count mis-match

From: Andy Duan <hidden>
Date: 2019-11-19 01:49:35

From: Chuhong Yuan <redacted> Sent: Monday, November 18, 2019 8:18 PM
pm_runtime_put_autosuspend in probe will call suspend to disable clks
automatically if CONFIG_PM is defined. (If CONFIG_PM is not defined, its
implementation will be empty, then suspend will not be called.)
suspend -> runtime suspend
Therefore, we can call pm_runtime_get_sync to resume it first to enable clks,
resume -> runtime resume
which matches the suspend. (Only when CONFIG_PM is defined, otherwise
suspend -> runtime suspend
quoted hunk
pm_runtime_get_sync will also be empty, then resume will not be called.)

Then it is fine to disable clks without causing clock count mis-match.

Fixes: c43eab3eddb4 ("net: fec: add missed clk_disable_unprepare in
remove")
Signed-off-by: Chuhong Yuan <redacted>
---
 drivers/net/ethernet/freescale/fec_main.c | 15 +++++++++++----
 1 file changed, 11 insertions(+), 4 deletions(-)
diff --git a/drivers/net/ethernet/freescale/fec_main.c
b/drivers/net/ethernet/freescale/fec_main.c
index a9c386b63581..4bb30761abfc 100644
--- a/drivers/net/ethernet/freescale/fec_main.c
+++ b/drivers/net/ethernet/freescale/fec_main.c
@@ -3636,6 +3636,11 @@ fec_drv_remove(struct platform_device *pdev)
        struct net_device *ndev = platform_get_drvdata(pdev);
        struct fec_enet_private *fep = netdev_priv(ndev);
        struct device_node *np = pdev->dev.of_node;
+       int ret;
+
+       ret = pm_runtime_get_sync(&pdev->dev);
+       if (ret < 0)
+               return ret;

        cancel_work_sync(&fep->tx_timeout_work);
        fec_ptp_stop(pdev);
@@ -3643,15 +3648,17 @@ fec_drv_remove(struct platform_device *pdev)
        fec_enet_mii_remove(fep);
        if (fep->reg_phy)
                regulator_disable(fep->reg_phy);
-       pm_runtime_put(&pdev->dev);
-       pm_runtime_disable(&pdev->dev);
-       clk_disable_unprepare(fep->clk_ahb);
-       clk_disable_unprepare(fep->clk_ipg);
+
        if (of_phy_is_fixed_link(np))
                of_phy_deregister_fixed_link(np);
        of_node_put(fep->phy_node);
        free_netdev(ndev);

+       clk_disable_unprepare(fep->clk_ahb);
+       clk_disable_unprepare(fep->clk_ipg);
+       pm_runtime_put_noidle(&pdev->dev);
+       pm_runtime_disable(&pdev->dev);
+
        return 0;
 }

--
2.24.0

Re: [PATCH net v3] net: fec: fix clock count mis-match

From: David Miller <davem@davemloft.net>
Date: 2019-11-19 22:55:16

From: Chuhong Yuan <redacted>
Date: Mon, 18 Nov 2019 20:18:26 +0800
pm_runtime_put_autosuspend in probe will call suspend to disable clks
automatically if CONFIG_PM is defined. (If CONFIG_PM is not defined,
its implementation will be empty, then suspend will not be called.)

Therefore, we can call pm_runtime_get_sync to resume it first to enable
clks, which matches the suspend. (Only when CONFIG_PM is defined, otherwise
pm_runtime_get_sync will also be empty, then resume will not be called.)

Then it is fine to disable clks without causing clock count mis-match.

Fixes: c43eab3eddb4 ("net: fec: add missed clk_disable_unprepare in remove")
Signed-off-by: Chuhong Yuan <redacted>
Please fix the commit message typos pointed out by Andy Duan and resubmit,
thank you.
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help