lkml.org 
[lkml]   [2022]   [Jan]   [24]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.15 172/846] net: stmmac: Add platform level debug register dump feature
    Date
    From: Bhupesh Sharma <bhupesh.sharma@linaro.org>

    [ Upstream commit 4047b9db1aa7512a10ba3560a3f63821c8c40235 ]

    dwmac-qcom-ethqos currently exposes a mechanism to dump rgmii registers
    after the 'stmmac_dvr_probe()' returns. However with commit
    5ec55823438e ("net: stmmac: add clocks management for gmac driver"),
    we now let 'pm_runtime_put()' disable the clocks before returning from
    'stmmac_dvr_probe()'.

    This causes a crash when 'rgmii_dump()' register dumps are enabled,
    as the clocks are already off.

    Since other dwmac drivers (possible future users as well) might
    require a similar register dump feature, introduce a platform level
    callback to allow the same.

    This fixes the crash noticed while enabling rgmii_dump() dumps in
    dwmac-qcom-ethqos driver as well. It also allows future changes
    to keep a invoking the register dump callback from the correct
    place inside 'stmmac_dvr_probe()'.

    Fixes: 5ec55823438e ("net: stmmac: add clocks management for gmac driver")
    Cc: Joakim Zhang <qiangqing.zhang@nxp.com>
    Cc: David S. Miller <davem@davemloft.net>
    Signed-off-by: Bhupesh Sharma <bhupesh.sharma@linaro.org>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/net/ethernet/stmicro/stmmac/dwmac-qcom-ethqos.c | 7 ++++---
    drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | 3 +++
    include/linux/stmmac.h | 1 +
    3 files changed, 8 insertions(+), 3 deletions(-)

    diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac-qcom-ethqos.c b/drivers/net/ethernet/stmicro/stmmac/dwmac-qcom-ethqos.c
    index 5c74b6279d690..6b1d9e8879f46 100644
    --- a/drivers/net/ethernet/stmicro/stmmac/dwmac-qcom-ethqos.c
    +++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-qcom-ethqos.c
    @@ -113,8 +113,10 @@ static void rgmii_updatel(struct qcom_ethqos *ethqos,
    rgmii_writel(ethqos, temp, offset);
    }

    -static void rgmii_dump(struct qcom_ethqos *ethqos)
    +static void rgmii_dump(void *priv)
    {
    + struct qcom_ethqos *ethqos = priv;
    +
    dev_dbg(&ethqos->pdev->dev, "Rgmii register dump\n");
    dev_dbg(&ethqos->pdev->dev, "RGMII_IO_MACRO_CONFIG: %x\n",
    rgmii_readl(ethqos, RGMII_IO_MACRO_CONFIG));
    @@ -499,6 +501,7 @@ static int qcom_ethqos_probe(struct platform_device *pdev)

    plat_dat->bsp_priv = ethqos;
    plat_dat->fix_mac_speed = ethqos_fix_mac_speed;
    + plat_dat->dump_debug_regs = rgmii_dump;
    plat_dat->has_gmac4 = 1;
    plat_dat->pmt = 1;
    plat_dat->tso_en = of_property_read_bool(np, "snps,tso");
    @@ -507,8 +510,6 @@ static int qcom_ethqos_probe(struct platform_device *pdev)
    if (ret)
    goto err_clk;

    - rgmii_dump(ethqos);
    -
    return ret;

    err_clk:
    diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
    index 3422f0746d825..06e5431cf51df 100644
    --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
    +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
    @@ -7077,6 +7077,9 @@ int stmmac_dvr_probe(struct device *device,
    stmmac_init_fs(ndev);
    #endif

    + if (priv->plat->dump_debug_regs)
    + priv->plat->dump_debug_regs(priv->plat->bsp_priv);
    +
    /* Let pm_runtime_put() disable the clocks.
    * If CONFIG_PM is not enabled, the clocks will stay powered.
    */
    diff --git a/include/linux/stmmac.h b/include/linux/stmmac.h
    index a6f03b36fc4f7..1450397fc0bcd 100644
    --- a/include/linux/stmmac.h
    +++ b/include/linux/stmmac.h
    @@ -233,6 +233,7 @@ struct plat_stmmacenet_data {
    int (*clks_config)(void *priv, bool enabled);
    int (*crosststamp)(ktime_t *device, struct system_counterval_t *system,
    void *ctx);
    + void (*dump_debug_regs)(void *priv);
    void *bsp_priv;
    struct clk *stmmac_clk;
    struct clk *pclk;
    --
    2.34.1


    \
     
     \ /
      Last update: 2022-01-24 23:40    [W:4.024 / U:0.076 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site