[openwrt/openwrt] bcm63xx: fix bcm63xx ethernet kernel panics

LEDE Commits lede-commits at lists.infradead.org
Thu Jan 28 06:02:01 EST 2021


noltari pushed a commit to openwrt/openwrt.git, branch master:
https://git.openwrt.org/7d12f29ae1d7337e4289baf9e6b4bf79445b0d59

commit 7d12f29ae1d7337e4289baf9e6b4bf79445b0d59
Author: Álvaro Fernández Rojas <noltari at gmail.com>
AuthorDate: Thu Jan 28 11:49:16 2021 +0100

    bcm63xx: fix bcm63xx ethernet kernel panics
    
    Calling netdev_reset_queue() from _stop() functions is causing sporadic kernel
    panics on bcm63xx, which happen mainly on BCM6318 and BCM6328.
    This reverts to the previous behaviour, which called netdev_reset_queue() from
    _open() functions.
    
    Tested on Comtrend AR-5315u (BCM6318).
    
    Fixes: 1d6f422e346b ("bcm63xx: sync ethernet driver with net-next")
    Signed-off-by: Álvaro Fernández Rojas <noltari at gmail.com>
---
 .../047-bcm63xx_enet-fix-kernel-panic.patch        | 35 ++++++++++++++++++++++
 .../402_bcm63xx_enet_vlan_incoming_fixed.patch     |  2 +-
 ..._enet-move-phy_-dis-connect-into-probe-re.patch | 14 ++++-----
 ...enet-enable-rgmii-clock-on-external-ports.patch |  2 +-
 .../423-bcm63xx_enet_add_b53_support.patch         | 12 ++++----
 .../424-bcm63xx_enet_no_request_mem_region.patch   |  2 +-
 .../428-bcm63xx_enet-rgmii-ctrl-fix.patch          |  2 +-
 7 files changed, 52 insertions(+), 17 deletions(-)

diff --git a/target/linux/bcm63xx/patches-5.4/047-bcm63xx_enet-fix-kernel-panic.patch b/target/linux/bcm63xx/patches-5.4/047-bcm63xx_enet-fix-kernel-panic.patch
new file mode 100644
index 0000000000..466a64cae1
--- /dev/null
+++ b/target/linux/bcm63xx/patches-5.4/047-bcm63xx_enet-fix-kernel-panic.patch
@@ -0,0 +1,35 @@
+--- a/drivers/net/ethernet/broadcom/bcm63xx_enet.c
++++ b/drivers/net/ethernet/broadcom/bcm63xx_enet.c
+@@ -1105,6 +1105,8 @@ static int bcm_enet_open(struct net_devi
+ 	else
+ 		bcm_enet_adjust_link(dev);
+ 
++	netdev_reset_queue(dev);
++
+ 	netif_start_queue(dev);
+ 	return 0;
+ 
+@@ -1193,7 +1195,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);
+@@ -2267,6 +2268,7 @@ static int bcm_enetsw_open(struct net_de
+ 	enet_dmac_writel(priv, ENETDMAC_IR_PKTDONE_MASK,
+ 			 ENETDMAC_IRMASK, priv->tx_chan);
+ 
++	netdev_reset_queue(dev);
+ 	netif_carrier_on(dev);
+ 	netif_start_queue(dev);
+ 
+@@ -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);
+ 
diff --git a/target/linux/bcm63xx/patches-5.4/402_bcm63xx_enet_vlan_incoming_fixed.patch b/target/linux/bcm63xx/patches-5.4/402_bcm63xx_enet_vlan_incoming_fixed.patch
index 949fb8d293..bd0c4cfc3f 100644
--- a/target/linux/bcm63xx/patches-5.4/402_bcm63xx_enet_vlan_incoming_fixed.patch
+++ b/target/linux/bcm63xx/patches-5.4/402_bcm63xx_enet_vlan_incoming_fixed.patch
@@ -1,6 +1,6 @@
 --- a/drivers/net/ethernet/broadcom/bcm63xx_enet.c
 +++ b/drivers/net/ethernet/broadcom/bcm63xx_enet.c
-@@ -1629,7 +1629,7 @@ static int bcm_enet_change_mtu(struct ne
+@@ -1630,7 +1630,7 @@ static int bcm_enet_change_mtu(struct ne
  		return -EBUSY;
  
  	/* add ethernet header + vlan tag size */
diff --git a/target/linux/bcm63xx/patches-5.4/404-NET-bcm63xx_enet-move-phy_-dis-connect-into-probe-re.patch b/target/linux/bcm63xx/patches-5.4/404-NET-bcm63xx_enet-move-phy_-dis-connect-into-probe-re.patch
index d9e49727da..a389f642ad 100644
--- a/target/linux/bcm63xx/patches-5.4/404-NET-bcm63xx_enet-move-phy_-dis-connect-into-probe-re.patch
+++ b/target/linux/bcm63xx/patches-5.4/404-NET-bcm63xx_enet-move-phy_-dis-connect-into-probe-re.patch
@@ -79,7 +79,7 @@ Signed-off-by: Jonas Gorski <jonas.gorski at gmail.com>
  	else
  		bcm_enet_adjust_link(dev);
  
-@@ -1131,10 +1108,6 @@ out_freeirq_rx:
+@@ -1133,10 +1110,6 @@ out_freeirq_rx:
  out_freeirq:
  	free_irq(dev->irq, dev);
  
@@ -90,7 +90,7 @@ Signed-off-by: Jonas Gorski <jonas.gorski at gmail.com>
  	return ret;
  }
  
-@@ -1228,10 +1201,6 @@ static int bcm_enet_stop(struct net_devi
+@@ -1229,10 +1202,6 @@ static int bcm_enet_stop(struct net_devi
  	free_irq(priv->irq_rx, dev);
  	free_irq(dev->irq, dev);
  
@@ -101,7 +101,7 @@ Signed-off-by: Jonas Gorski <jonas.gorski at gmail.com>
  	return 0;
  }
  
-@@ -1800,14 +1769,47 @@ static int bcm_enet_probe(struct platfor
+@@ -1801,14 +1770,47 @@ static int bcm_enet_probe(struct platfor
  
  	/* do minimal hardware init to be able to probe mii bus */
  	bcm_enet_hw_preinit(priv);
@@ -150,7 +150,7 @@ Signed-off-by: Jonas Gorski <jonas.gorski at gmail.com>
  		}
  
  		bus = priv->mii_bus;
-@@ -1831,6 +1833,26 @@ static int bcm_enet_probe(struct platfor
+@@ -1832,6 +1834,26 @@ static int bcm_enet_probe(struct platfor
  			dev_err(&pdev->dev, "unable to register mdio bus\n");
  			goto out_free_mdio;
  		}
@@ -177,7 +177,7 @@ Signed-off-by: Jonas Gorski <jonas.gorski at gmail.com>
  	} else {
  
  		/* run platform code to initialize PHY device */
-@@ -1838,45 +1860,16 @@ static int bcm_enet_probe(struct platfor
+@@ -1839,45 +1861,16 @@ static int bcm_enet_probe(struct platfor
  		    pd->mii_config(dev, 1, bcm_enet_mdio_read_mii,
  				   bcm_enet_mdio_write_mii)) {
  			dev_err(&pdev->dev, "unable to configure mdio bus\n");
@@ -227,7 +227,7 @@ Signed-off-by: Jonas Gorski <jonas.gorski at gmail.com>
  	if (priv->mii_bus)
  		mdiobus_unregister(priv->mii_bus);
  
-@@ -1884,6 +1877,9 @@ out_free_mdio:
+@@ -1885,6 +1878,9 @@ out_free_mdio:
  	if (priv->mii_bus)
  		mdiobus_free(priv->mii_bus);
  
@@ -237,7 +237,7 @@ Signed-off-by: Jonas Gorski <jonas.gorski at gmail.com>
  out_uninit_hw:
  	/* turn off mdc clock */
  	enet_writel(priv, 0, ENET_MIISC_REG);
-@@ -1914,6 +1910,7 @@ static int bcm_enet_remove(struct platfo
+@@ -1915,6 +1911,7 @@ static int bcm_enet_remove(struct platfo
  	enet_writel(priv, 0, ENET_MIISC_REG);
  
  	if (priv->has_phy) {
diff --git a/target/linux/bcm63xx/patches-5.4/408-bcm63xx_enet-enable-rgmii-clock-on-external-ports.patch b/target/linux/bcm63xx/patches-5.4/408-bcm63xx_enet-enable-rgmii-clock-on-external-ports.patch
index d4a22c99f2..772e40b2b5 100644
--- a/target/linux/bcm63xx/patches-5.4/408-bcm63xx_enet-enable-rgmii-clock-on-external-ports.patch
+++ b/target/linux/bcm63xx/patches-5.4/408-bcm63xx_enet-enable-rgmii-clock-on-external-ports.patch
@@ -32,7 +32,7 @@ Subject: [PATCH 54/81] bcm63xx_enet: enable rgmii clock on external ports
  #define ENETSW_MDIOC_EXT_MASK		(1 << 16)
 --- a/drivers/net/ethernet/broadcom/bcm63xx_enet.c
 +++ b/drivers/net/ethernet/broadcom/bcm63xx_enet.c
-@@ -2183,6 +2183,18 @@ static int bcm_enetsw_open(struct net_de
+@@ -2184,6 +2184,18 @@ static int bcm_enetsw_open(struct net_de
  		priv->sw_port_link[i] = 0;
  	}
  
diff --git a/target/linux/bcm63xx/patches-5.4/423-bcm63xx_enet_add_b53_support.patch b/target/linux/bcm63xx/patches-5.4/423-bcm63xx_enet_add_b53_support.patch
index 92dc05f909..961f34ce78 100644
--- a/target/linux/bcm63xx/patches-5.4/423-bcm63xx_enet_add_b53_support.patch
+++ b/target/linux/bcm63xx/patches-5.4/423-bcm63xx_enet_add_b53_support.patch
@@ -20,7 +20,7 @@
  
  #include <bcm63xx_dev_enet.h>
  #include "bcm63xx_enet.h"
-@@ -1930,7 +1931,8 @@ static int bcm_enet_remove(struct platfo
+@@ -1931,7 +1932,8 @@ static int bcm_enet_remove(struct platfo
  	return 0;
  }
  
@@ -30,7 +30,7 @@
  	.probe	= bcm_enet_probe,
  	.remove	= bcm_enet_remove,
  	.driver	= {
-@@ -1939,6 +1941,42 @@ struct platform_driver bcm63xx_enet_driv
+@@ -1940,6 +1942,42 @@ struct platform_driver bcm63xx_enet_driv
  	},
  };
  
@@ -73,7 +73,7 @@
  /*
   * switch mii access callbacks
   */
-@@ -2195,29 +2233,6 @@ static int bcm_enetsw_open(struct net_de
+@@ -2196,29 +2234,6 @@ static int bcm_enetsw_open(struct net_de
  		enetsw_writeb(priv, rgmii_ctrl, ENETSW_RGMII_CTRL_REG(i));
  	}
  
@@ -103,7 +103,7 @@
  	/* initialize flow control buffer allocation */
  	enet_dma_writel(priv, ENETDMA_BUFALLOC_FORCE_MASK | 0,
  			ENETDMA_BUFALLOC_REG(priv->rx_chan));
-@@ -2651,6 +2666,9 @@ static int bcm_enetsw_probe(struct platf
+@@ -2652,6 +2667,9 @@ static int bcm_enetsw_probe(struct platf
  	struct bcm63xx_enetsw_platform_data *pd;
  	struct resource *res_mem;
  	int ret, irq_rx, irq_tx;
@@ -113,7 +113,7 @@
  
  	if (!bcm_enet_shared_base[0])
  		return -EPROBE_DEFER;
-@@ -2731,6 +2749,43 @@ static int bcm_enetsw_probe(struct platf
+@@ -2732,6 +2750,43 @@ static int bcm_enetsw_probe(struct platf
  	priv->pdev = pdev;
  	priv->net_dev = dev;
  
@@ -157,7 +157,7 @@
  	return 0;
  
  out_disable_clk:
-@@ -2752,6 +2807,9 @@ static int bcm_enetsw_remove(struct plat
+@@ -2753,6 +2808,9 @@ static int bcm_enetsw_remove(struct plat
  	priv = netdev_priv(dev);
  	unregister_netdev(dev);
  
diff --git a/target/linux/bcm63xx/patches-5.4/424-bcm63xx_enet_no_request_mem_region.patch b/target/linux/bcm63xx/patches-5.4/424-bcm63xx_enet_no_request_mem_region.patch
index 240525083c..6c002a7b5f 100644
--- a/target/linux/bcm63xx/patches-5.4/424-bcm63xx_enet_no_request_mem_region.patch
+++ b/target/linux/bcm63xx/patches-5.4/424-bcm63xx_enet_no_request_mem_region.patch
@@ -1,6 +1,6 @@
 --- a/drivers/net/ethernet/broadcom/bcm63xx_enet.c
 +++ b/drivers/net/ethernet/broadcom/bcm63xx_enet.c
-@@ -2710,9 +2710,9 @@ static int bcm_enetsw_probe(struct platf
+@@ -2711,9 +2711,9 @@ static int bcm_enetsw_probe(struct platf
  	if (ret)
  		goto out;
  
diff --git a/target/linux/bcm63xx/patches-5.4/428-bcm63xx_enet-rgmii-ctrl-fix.patch b/target/linux/bcm63xx/patches-5.4/428-bcm63xx_enet-rgmii-ctrl-fix.patch
index 3c4fa8ffad..52740b9a5b 100644
--- a/target/linux/bcm63xx/patches-5.4/428-bcm63xx_enet-rgmii-ctrl-fix.patch
+++ b/target/linux/bcm63xx/patches-5.4/428-bcm63xx_enet-rgmii-ctrl-fix.patch
@@ -12,7 +12,7 @@
  
 --- a/drivers/net/ethernet/broadcom/bcm63xx_enet.c
 +++ b/drivers/net/ethernet/broadcom/bcm63xx_enet.c
-@@ -2230,6 +2230,10 @@ static int bcm_enetsw_open(struct net_de
+@@ -2231,6 +2231,10 @@ static int bcm_enetsw_open(struct net_de
  
  		rgmii_ctrl = enetsw_readb(priv, ENETSW_RGMII_CTRL_REG(i));
  		rgmii_ctrl |= ENETSW_RGMII_CTRL_GMII_CLK_EN;



More information about the lede-commits mailing list