mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-18 16:44:33 +00:00
net: stmmac: Add platform level debug register dump feature
[ Upstream commit4047b9db1a
] dwmac-qcom-ethqos currently exposes a mechanism to dump rgmii registers after the 'stmmac_dvr_probe()' returns. However with commit5ec5582343
("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:5ec5582343
("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>
This commit is contained in:
parent
0bc65fcb2b
commit
b588858c09
3 changed files with 8 additions and 3 deletions
|
@ -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(ðqos->pdev->dev, "Rgmii register dump\n");
|
||||
dev_dbg(ðqos->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:
|
||||
|
|
|
@ -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.
|
||||
*/
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in a new issue