mirror of
https://github.com/openwrt/openwrt.git
synced 2024-12-23 23:42:43 +00:00
ipq40xx: abort ar40xx probe on missing PHYs
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@david-bauer.net>
This commit is contained in:
parent
c8933ce533
commit
e2c084cabc
@ -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;
|
||||
}
|
@ -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;
|
||||
}
|
Loading…
Reference in New Issue
Block a user