]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
net: ethernet: ti: cpsw: fix cpts irq after suspend
authorGrygorii Strashko <grygorii.strashko@ti.com>
Thu, 12 Nov 2020 11:15:46 +0000 (13:15 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 24 Nov 2020 12:38:48 +0000 (13:38 +0100)
[ Upstream commit 2b5668733050fca85f0ab458c5b91732f9496a38 ]

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>
Tested-by: Tony Lindgren <tony@atomide.com>
Link: https://lore.kernel.org/r/20201112111546.20343-1-grygorii.strashko@ti.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/net/ethernet/ti/cpsw.c
drivers/net/ethernet/ti/cpsw_new.c

index 4a65edc5a3759393215c419c3a4c72781d37bea0..4c0f9f2aa60cecfc26be6472d9933781624e4dea 100644 (file)
@@ -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);
@@ -1722,7 +1725,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,
index 15672d0a4de6977e71a5485a0fa54c20aaa2cd9b..5771e9f9d6b587c2ee405925670ad1734157b3cb 100644 (file)
@@ -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);
@@ -2009,7 +2013,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);