lkml.org 
[lkml]   [2022]   [Jul]   [27]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.15 070/201] net: stmmac: fix unbalanced ptp clock issue in suspend/resume flow
    Date
    From: Biao Huang <biao.huang@mediatek.com>

    [ 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>
    ---
    .../net/ethernet/stmicro/stmmac/stmmac_main.c | 17 ++++++++---------
    .../ethernet/stmicro/stmmac/stmmac_platform.c | 8 +++++++-
    2 files changed, 15 insertions(+), 10 deletions(-)

    diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
    index 95e1307cfda2..b4f83c865568 100644
    --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
    +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
    @@ -844,19 +844,10 @@ int stmmac_init_tstamp_counter(struct stmmac_priv *priv, u32 systime_flags)
    struct timespec64 now;
    u32 sec_inc = 0;
    u64 temp = 0;
    - int ret;

    if (!(priv->dma_cap.time_stamp || priv->dma_cap.atime_stamp))
    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);
    priv->systime_flags = systime_flags;

    @@ -3325,6 +3316,14 @@ static int stmmac_hw_setup(struct net_device *dev, bool ptp_register)

    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);
    if (ret == -EOPNOTSUPP)
    netdev_warn(priv->dev, "PTP not supported by HW\n");
    diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c
    index 11e1055e8260..9f5cac4000da 100644
    --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c
    +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c
    @@ -815,7 +815,13 @@ static int __maybe_unused stmmac_pltfr_noirq_resume(struct device *dev)
    if (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;
    --
    2.35.1


    \
     
     \ /
      Last update: 2022-07-27 19:09    [W:4.107 / U:0.152 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site