Commit 4047b9db authored by Bhupesh Sharma's avatar Bhupesh Sharma Committed by David S. Miller

net: stmmac: Add platform level debug register dump feature

dwmac-qcom-ethqos currently exposes a mechanism to dump rgmii registers
after the 'stmmac_dvr_probe()' returns. However with commit
5ec55823 ("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: 5ec55823 ("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: default avatarBhupesh Sharma <bhupesh.sharma@linaro.org>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 72a2ff56
...@@ -113,8 +113,10 @@ static void rgmii_updatel(struct qcom_ethqos *ethqos, ...@@ -113,8 +113,10 @@ static void rgmii_updatel(struct qcom_ethqos *ethqos,
rgmii_writel(ethqos, temp, offset); 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 register dump\n");
dev_dbg(&ethqos->pdev->dev, "RGMII_IO_MACRO_CONFIG: %x\n", dev_dbg(&ethqos->pdev->dev, "RGMII_IO_MACRO_CONFIG: %x\n",
rgmii_readl(ethqos, RGMII_IO_MACRO_CONFIG)); rgmii_readl(ethqos, RGMII_IO_MACRO_CONFIG));
...@@ -519,6 +521,7 @@ static int qcom_ethqos_probe(struct platform_device *pdev) ...@@ -519,6 +521,7 @@ static int qcom_ethqos_probe(struct platform_device *pdev)
plat_dat->bsp_priv = ethqos; plat_dat->bsp_priv = ethqos;
plat_dat->fix_mac_speed = ethqos_fix_mac_speed; plat_dat->fix_mac_speed = ethqos_fix_mac_speed;
plat_dat->dump_debug_regs = rgmii_dump;
plat_dat->has_gmac4 = 1; plat_dat->has_gmac4 = 1;
plat_dat->pmt = 1; plat_dat->pmt = 1;
plat_dat->tso_en = of_property_read_bool(np, "snps,tso"); plat_dat->tso_en = of_property_read_bool(np, "snps,tso");
...@@ -527,8 +530,6 @@ static int qcom_ethqos_probe(struct platform_device *pdev) ...@@ -527,8 +530,6 @@ static int qcom_ethqos_probe(struct platform_device *pdev)
if (ret) if (ret)
goto err_clk; goto err_clk;
rgmii_dump(ethqos);
return ret; return ret;
err_clk: err_clk:
......
...@@ -7211,6 +7211,9 @@ int stmmac_dvr_probe(struct device *device, ...@@ -7211,6 +7211,9 @@ int stmmac_dvr_probe(struct device *device,
stmmac_init_fs(ndev); stmmac_init_fs(ndev);
#endif #endif
if (priv->plat->dump_debug_regs)
priv->plat->dump_debug_regs(priv->plat->bsp_priv);
/* Let pm_runtime_put() disable the clocks. /* Let pm_runtime_put() disable the clocks.
* If CONFIG_PM is not enabled, the clocks will stay powered. * If CONFIG_PM is not enabled, the clocks will stay powered.
*/ */
......
...@@ -233,6 +233,7 @@ struct plat_stmmacenet_data { ...@@ -233,6 +233,7 @@ struct plat_stmmacenet_data {
int (*clks_config)(void *priv, bool enabled); int (*clks_config)(void *priv, bool enabled);
int (*crosststamp)(ktime_t *device, struct system_counterval_t *system, int (*crosststamp)(ktime_t *device, struct system_counterval_t *system,
void *ctx); void *ctx);
void (*dump_debug_regs)(void *priv);
void *bsp_priv; void *bsp_priv;
struct clk *stmmac_clk; struct clk *stmmac_clk;
struct clk *pclk; struct clk *pclk;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment