Message ID | 20201112111546.20343-1-grygorii.strashko@ti.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | net: ethernet: ti: cpsw: fix cpts irq after suspend | expand |
* Grygorii Strashko <grygorii.strashko@ti.com> [201112 11:15]: > Depending on the SoC/platform the CPSW can completely lose context after a > suspend/resume cycle, including CPSW wrapper (WR) which will cause reset of > WR_C0_MISC_EN register, so CPTS IRQ will became disabled. > > Fix it by moving CPTS IRQ enabling in cpsw_ndo_open() where CPTS is > actually started. > > Fixes: 84ea9c0a95d7 ("net: ethernet: ti: cpsw: enable cpts irq") > Reported-by: Tony Lindgren <tony@atomide.com> > Signed-off-by: Grygorii Strashko <grygorii.strashko@ti.com> Thanks this works for me: Tested-by: Tony Lindgren <tony@atomide.com>
Hello: This patch was applied to netdev/net.git (refs/heads/master): On Thu, 12 Nov 2020 13:15:46 +0200 you wrote: > Depending on the SoC/platform the CPSW can completely lose context after a > suspend/resume cycle, including CPSW wrapper (WR) which will cause reset of > WR_C0_MISC_EN register, so CPTS IRQ will became disabled. > > Fix it by moving CPTS IRQ enabling in cpsw_ndo_open() where CPTS is > actually started. > > [...] Here is the summary with links: - net: ethernet: ti: cpsw: fix cpts irq after suspend https://git.kernel.org/netdev/net/c/2b5668733050 You are awesome, thank you! -- Deet-doot-dot, I am a bot. https://korg.docs.kernel.org/patchwork/pwbot.html
diff --git a/drivers/net/ethernet/ti/cpsw.c b/drivers/net/ethernet/ti/cpsw.c index 9fd1f77190ad..fa2d1025cbb2 100644 --- a/drivers/net/ethernet/ti/cpsw.c +++ b/drivers/net/ethernet/ti/cpsw.c @@ -838,9 +838,12 @@ static int cpsw_ndo_open(struct net_device *ndev) if (ret < 0) goto err_cleanup; - if (cpts_register(cpsw->cpts)) - dev_err(priv->dev, "error registering cpts device\n"); - + if (cpsw->cpts) { + if (cpts_register(cpsw->cpts)) + dev_err(priv->dev, "error registering cpts device\n"); + else + writel(0x10, &cpsw->wr_regs->misc_en); + } } cpsw_restore(priv); @@ -1716,7 +1719,6 @@ static int cpsw_probe(struct platform_device *pdev) /* Enable misc CPTS evnt_pend IRQ */ cpts_set_irqpoll(cpsw->cpts, false); - writel(0x10, &cpsw->wr_regs->misc_en); skip_cpts: cpsw_notice(priv, probe, diff --git a/drivers/net/ethernet/ti/cpsw_new.c b/drivers/net/ethernet/ti/cpsw_new.c index f779d2e1b5c5..2f5e0ad23ad7 100644 --- a/drivers/net/ethernet/ti/cpsw_new.c +++ b/drivers/net/ethernet/ti/cpsw_new.c @@ -873,8 +873,12 @@ static int cpsw_ndo_open(struct net_device *ndev) if (ret < 0) goto err_cleanup; - if (cpts_register(cpsw->cpts)) - dev_err(priv->dev, "error registering cpts device\n"); + if (cpsw->cpts) { + if (cpts_register(cpsw->cpts)) + dev_err(priv->dev, "error registering cpts device\n"); + else + writel(0x10, &cpsw->wr_regs->misc_en); + } napi_enable(&cpsw->napi_rx); napi_enable(&cpsw->napi_tx); @@ -2006,7 +2010,6 @@ static int cpsw_probe(struct platform_device *pdev) /* Enable misc CPTS evnt_pend IRQ */ cpts_set_irqpoll(cpsw->cpts, false); - writel(0x10, &cpsw->wr_regs->misc_en); skip_cpts: ret = cpsw_register_notifiers(cpsw);
Depending on the SoC/platform the CPSW can completely lose context after a suspend/resume cycle, including CPSW wrapper (WR) which will cause reset of WR_C0_MISC_EN register, so CPTS IRQ will became disabled. Fix it by moving CPTS IRQ enabling in cpsw_ndo_open() where CPTS is actually started. Fixes: 84ea9c0a95d7 ("net: ethernet: ti: cpsw: enable cpts irq") Reported-by: Tony Lindgren <tony@atomide.com> Signed-off-by: Grygorii Strashko <grygorii.strashko@ti.com> --- drivers/net/ethernet/ti/cpsw.c | 10 ++++++---- drivers/net/ethernet/ti/cpsw_new.c | 9 ++++++--- 2 files changed, 12 insertions(+), 7 deletions(-)