| From 9472dc55baeed2163760a6baee606b91394cd0c9 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Wed, 14 Dec 2022 10:51:18 +0000 |
| Subject: ravb: Fix "failed to switch device to config mode" message during |
| unbind |
| |
| From: Biju Das <biju.das.jz@bp.renesas.com> |
| |
| [ Upstream commit c72a7e42592b2e18d862cf120876070947000d7a ] |
| |
| This patch fixes the error "ravb 11c20000.ethernet eth0: failed to switch |
| device to config mode" during unbind. |
| |
| We are doing register access after pm_runtime_put_sync(). |
| |
| We usually do cleanup in reverse order of init. Currently in |
| remove(), the "pm_runtime_put_sync" is not in reverse order. |
| |
| Probe |
| reset_control_deassert(rstc); |
| pm_runtime_enable(&pdev->dev); |
| pm_runtime_get_sync(&pdev->dev); |
| |
| remove |
| pm_runtime_put_sync(&pdev->dev); |
| unregister_netdev(ndev); |
| .. |
| ravb_mdio_release(priv); |
| pm_runtime_disable(&pdev->dev); |
| |
| Consider the call to unregister_netdev() |
| unregister_netdev->unregister_netdevice_queue->rollback_registered_many |
| that calls the below functions which access the registers after |
| pm_runtime_put_sync() |
| 1) ravb_get_stats |
| 2) ravb_close |
| |
| Fixes: c156633f1353 ("Renesas Ethernet AVB driver proper") |
| Cc: stable@vger.kernel.org |
| Signed-off-by: Biju Das <biju.das.jz@bp.renesas.com> |
| Reviewed-by: Leon Romanovsky <leonro@nvidia.com> |
| Link: https://lore.kernel.org/r/20221214105118.2495313-1-biju.das.jz@bp.renesas.com |
| Signed-off-by: Paolo Abeni <pabeni@redhat.com> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/net/ethernet/renesas/ravb_main.c | 2 +- |
| 1 file changed, 1 insertion(+), 1 deletion(-) |
| |
| diff --git a/drivers/net/ethernet/renesas/ravb_main.c b/drivers/net/ethernet/renesas/ravb_main.c |
| index 9077014f6f40..ff374d0d80a7 100644 |
| --- a/drivers/net/ethernet/renesas/ravb_main.c |
| +++ b/drivers/net/ethernet/renesas/ravb_main.c |
| @@ -2199,11 +2199,11 @@ static int ravb_remove(struct platform_device *pdev) |
| priv->desc_bat_dma); |
| /* Set reset mode */ |
| ravb_write(ndev, CCC_OPC_RESET, CCC); |
| - pm_runtime_put_sync(&pdev->dev); |
| unregister_netdev(ndev); |
| netif_napi_del(&priv->napi[RAVB_NC]); |
| netif_napi_del(&priv->napi[RAVB_BE]); |
| ravb_mdio_release(priv); |
| + pm_runtime_put_sync(&pdev->dev); |
| pm_runtime_disable(&pdev->dev); |
| free_netdev(ndev); |
| platform_set_drvdata(pdev, NULL); |
| -- |
| 2.35.1 |
| |