[OpenWrt-Devel] [PATCH] ipq40xx: abort ar40xx probe on missing PHYs

David Bauer mail at david-bauer.net
Sun Sep 22 13:15:56 EDT 2019


The ar40xx driver currently panics in case no QCA807x PHY has been
successfully probed. This happens when the external PHY is still
in reset when probing the ar40xx switch driver.

Note that this patch does not fix the root cause, ar40xx_probe now
simply fails instead of causing a kernel panic due to a nullpointer
dereference.

Signed-off-by: David Bauer <mail at david-bauer.net>
---
 ...706-ar40xx-abort-probe-on-missig-phy.patch | 23 +++++++++++++++++++
 ...706-ar40xx-abort-probe-on-missig-phy.patch | 23 +++++++++++++++++++
 2 files changed, 46 insertions(+)
 create mode 100644 target/linux/ipq40xx/patches-4.14/706-ar40xx-abort-probe-on-missig-phy.patch
 create mode 100644 target/linux/ipq40xx/patches-4.19/706-ar40xx-abort-probe-on-missig-phy.patch

diff --git a/target/linux/ipq40xx/patches-4.14/706-ar40xx-abort-probe-on-missig-phy.patch b/target/linux/ipq40xx/patches-4.14/706-ar40xx-abort-probe-on-missig-phy.patch
new file mode 100644
index 0000000000..19474bff0d
--- /dev/null
+++ b/target/linux/ipq40xx/patches-4.14/706-ar40xx-abort-probe-on-missig-phy.patch
@@ -0,0 +1,23 @@
+--- a/drivers/net/phy/ar40xx.c
++++ b/drivers/net/phy/ar40xx.c
+@@ -2021,6 +2021,12 @@ static int ar40xx_probe(struct platform_
+ 	/* register switch */
+ 	swdev = &priv->dev;
+ 
++	if (priv->mii_bus == NULL) {
++		dev_err(&pdev->dev, "Probe failed - Missing PHYs!\n");
++		ret = -ENODEV;
++		goto err_missing_phy;
++	}
++
+ 	swdev->alias = dev_name(&priv->mii_bus->dev);
+ 
+ 	swdev->cpu_port = AR40XX_PORT_CPU;
+@@ -2052,6 +2058,7 @@ err_unregister_switch:
+ 	unregister_switch(&priv->dev);
+ err_unregister_phy:
+ 	phy_driver_unregister(&ar40xx_phy_driver);
++err_missing_phy:
+ 	platform_set_drvdata(pdev, NULL);
+ 	return ret;
+ }
diff --git a/target/linux/ipq40xx/patches-4.19/706-ar40xx-abort-probe-on-missig-phy.patch b/target/linux/ipq40xx/patches-4.19/706-ar40xx-abort-probe-on-missig-phy.patch
new file mode 100644
index 0000000000..19474bff0d
--- /dev/null
+++ b/target/linux/ipq40xx/patches-4.19/706-ar40xx-abort-probe-on-missig-phy.patch
@@ -0,0 +1,23 @@
+--- a/drivers/net/phy/ar40xx.c
++++ b/drivers/net/phy/ar40xx.c
+@@ -2021,6 +2021,12 @@ static int ar40xx_probe(struct platform_
+ 	/* register switch */
+ 	swdev = &priv->dev;
+ 
++	if (priv->mii_bus == NULL) {
++		dev_err(&pdev->dev, "Probe failed - Missing PHYs!\n");
++		ret = -ENODEV;
++		goto err_missing_phy;
++	}
++
+ 	swdev->alias = dev_name(&priv->mii_bus->dev);
+ 
+ 	swdev->cpu_port = AR40XX_PORT_CPU;
+@@ -2052,6 +2058,7 @@ err_unregister_switch:
+ 	unregister_switch(&priv->dev);
+ err_unregister_phy:
+ 	phy_driver_unregister(&ar40xx_phy_driver);
++err_missing_phy:
+ 	platform_set_drvdata(pdev, NULL);
+ 	return ret;
+ }
-- 
2.23.0


_______________________________________________
openwrt-devel mailing list
openwrt-devel at lists.openwrt.org
https://lists.openwrt.org/mailman/listinfo/openwrt-devel



More information about the openwrt-devel mailing list