| From ace19b992436a257d9a793672e57abc28fe83e2e Mon Sep 17 00:00:00 2001 |
| From: Trevor Woerner <twoerner@gmail.com> |
| Date: Sun, 24 Oct 2021 13:50:02 -0400 |
| Subject: net: nxp: lpc_eth.c: avoid hang when bringing interface down |
| |
| From: Trevor Woerner <twoerner@gmail.com> |
| |
| commit ace19b992436a257d9a793672e57abc28fe83e2e upstream. |
| |
| A hard hang is observed whenever the ethernet interface is brought |
| down. If the PHY is stopped before the LPC core block is reset, |
| the SoC will hang. Comparing lpc_eth_close() and lpc_eth_open() I |
| re-arranged the ordering of the functions calls in lpc_eth_close() to |
| reset the hardware before stopping the PHY. |
| Fixes: b7370112f519 ("lpc32xx: Added ethernet driver") |
| Signed-off-by: Trevor Woerner <twoerner@gmail.com> |
| Acked-by: Vladimir Zapolskiy <vz@mleia.com> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| drivers/net/ethernet/nxp/lpc_eth.c | 5 ++--- |
| 1 file changed, 2 insertions(+), 3 deletions(-) |
| |
| --- a/drivers/net/ethernet/nxp/lpc_eth.c |
| +++ b/drivers/net/ethernet/nxp/lpc_eth.c |
| @@ -1037,9 +1037,6 @@ static int lpc_eth_close(struct net_devi |
| napi_disable(&pldat->napi); |
| netif_stop_queue(ndev); |
| |
| - if (ndev->phydev) |
| - phy_stop(ndev->phydev); |
| - |
| spin_lock_irqsave(&pldat->lock, flags); |
| __lpc_eth_reset(pldat); |
| netif_carrier_off(ndev); |
| @@ -1047,6 +1044,8 @@ static int lpc_eth_close(struct net_devi |
| writel(0, LPC_ENET_MAC2(pldat->net_base)); |
| spin_unlock_irqrestore(&pldat->lock, flags); |
| |
| + if (ndev->phydev) |
| + phy_stop(ndev->phydev); |
| clk_disable_unprepare(pldat->clk); |
| |
| return 0; |