| From ca6be00ca1d3a2f5b8794894e2dae175e63768f5 Mon Sep 17 00:00:00 2001 |
| From: Sieng Piaw Liew <liew.s.piaw@gmail.com> |
| Date: Tue, 16 Feb 2021 16:23:08 +0800 |
| Subject: [PATCH] bcm63xx_enet: Fix sporadic kernel panic |
| |
| In ndo_stop functions, netdev_completed_queue() is called during forced |
| tx reclaim, after netdev_reset_queue(). This may trigger kernel panic if |
| there is any tx skb left. |
| |
| This patch moves netdev_reset_queue() to after tx reclaim, so BQL can |
| complete successfully then reset. |
| |
| Signed-off-by: Sieng Piaw Liew <liew.s.piaw@gmail.com> |
| --- |
| drivers/net/ethernet/broadcom/bcm63xx_enet.c | 8 ++++++-- |
| 1 file changed, 6 insertions(+), 2 deletions(-) |
| |
| --- a/drivers/net/ethernet/broadcom/bcm63xx_enet.c |
| +++ b/drivers/net/ethernet/broadcom/bcm63xx_enet.c |
| @@ -1193,7 +1193,6 @@ static int bcm_enet_stop(struct net_devi |
| kdev = &priv->pdev->dev; |
| |
| netif_stop_queue(dev); |
| - netdev_reset_queue(dev); |
| napi_disable(&priv->napi); |
| if (priv->has_phy) |
| phy_stop(dev->phydev); |
| @@ -1232,6 +1231,9 @@ static int bcm_enet_stop(struct net_devi |
| if (priv->has_phy) |
| phy_disconnect(dev->phydev); |
| |
| + /* reset BQL after forced tx reclaim to not kernel panic */ |
| + netdev_reset_queue(dev); |
| + |
| return 0; |
| } |
| |
| @@ -2348,7 +2350,6 @@ static int bcm_enetsw_stop(struct net_de |
| |
| del_timer_sync(&priv->swphy_poll); |
| netif_stop_queue(dev); |
| - netdev_reset_queue(dev); |
| napi_disable(&priv->napi); |
| del_timer_sync(&priv->rx_timeout); |
| |
| @@ -2376,6 +2377,9 @@ static int bcm_enetsw_stop(struct net_de |
| free_irq(priv->irq_tx, dev); |
| free_irq(priv->irq_rx, dev); |
| |
| + /* reset BQL after forced tx reclaim to not kernel panic */ |
| + netdev_reset_queue(dev); |
| + |
| return 0; |
| } |
| |