Message ID | 20211024175003.7879-1-twoerner@gmail.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | net: nxp: lpc_eth.c: avoid hang when bringing interface down | expand |
Hi Trevor, On 10/24/21 8:50 PM, Trevor Woerner wrote: > 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. > > Signed-off-by: Trevor Woerner <twoerner@gmail.com> > --- > drivers/net/ethernet/nxp/lpc_eth.c | 5 ++--- > 1 file changed, 2 insertions(+), 3 deletions(-) > > diff --git a/drivers/net/ethernet/nxp/lpc_eth.c b/drivers/net/ethernet/nxp/lpc_eth.c > index d29fe562b3de..c910fa2f40a4 100644 > --- a/drivers/net/ethernet/nxp/lpc_eth.c > +++ b/drivers/net/ethernet/nxp/lpc_eth.c > @@ -1015,9 +1015,6 @@ static int lpc_eth_close(struct net_device *ndev) > 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); > @@ -1025,6 +1022,8 @@ static int lpc_eth_close(struct net_device *ndev) > 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; > thank you for the fix! Fixes: b7370112f519 ("lpc32xx: Added ethernet driver") Acked-by: Vladimir Zapolskiy <vz@mleia.com> -- Best wishes, Vladimir
Hello: This patch was applied to netdev/net.git (master) by David S. Miller <davem@davemloft.net>: On Sun, 24 Oct 2021 13:50:02 -0400 you wrote: > 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. > > Signed-off-by: Trevor Woerner <twoerner@gmail.com> > > [...] Here is the summary with links: - net: nxp: lpc_eth.c: avoid hang when bringing interface down https://git.kernel.org/netdev/net/c/ace19b992436 You are awesome, thank you!
diff --git a/drivers/net/ethernet/nxp/lpc_eth.c b/drivers/net/ethernet/nxp/lpc_eth.c index d29fe562b3de..c910fa2f40a4 100644 --- a/drivers/net/ethernet/nxp/lpc_eth.c +++ b/drivers/net/ethernet/nxp/lpc_eth.c @@ -1015,9 +1015,6 @@ static int lpc_eth_close(struct net_device *ndev) 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); @@ -1025,6 +1022,8 @@ static int lpc_eth_close(struct net_device *ndev) 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;
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. Signed-off-by: Trevor Woerner <twoerner@gmail.com> --- drivers/net/ethernet/nxp/lpc_eth.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-)