diff mbox series

[OpenWrt-Devel,v1,5/8] generic: rtl836x: support defered probe on mdio-bus

Message ID 3d538df93d72e14bc48a7c817fbc7046e0f225b3.1539808453.git.chunkeey@gmail.com
State Accepted
Delegated to: John Crispin
Headers show
Series [OpenWrt-Devel,v1,1/8] apm821xx: add uboot-envtools support | expand

Commit Message

Christian Lamparter Oct. 17, 2018, 8:37 p.m. UTC
On the WNDAP620, the mdio and mdc lines are controlled by
the EMAC ethernet device. This results in a hen-vs-egg problem.
The rtl8367b driver is probed before the ethernet driver and
the mdio-bus is not available yet, which caused the rtl8367b
driver to fail.

This patch changes the rtl8366_smi_probe_of() function to
return -EPROBE_DEFER if the mdio-bus lookup failed and changes
rtl8366_smi_probe()'s signature to return the error code back to
the callee, so it can propagate back to the kernel. Which, will
retry the switch probe at a later time.

Signed-off-by: Christian Lamparter <chunkeey@gmail.com>
---
 .../generic/files/drivers/net/phy/rtl8366_smi.c    | 14 +++++++++-----
 .../generic/files/drivers/net/phy/rtl8366rb.c      |  4 ++--
 .../linux/generic/files/drivers/net/phy/rtl8366s.c |  4 ++--
 .../linux/generic/files/drivers/net/phy/rtl8367.c  |  4 ++--
 .../linux/generic/files/drivers/net/phy/rtl8367b.c |  4 ++--
 5 files changed, 17 insertions(+), 13 deletions(-)
diff mbox series

Patch

diff --git a/target/linux/generic/files/drivers/net/phy/rtl8366_smi.c b/target/linux/generic/files/drivers/net/phy/rtl8366_smi.c
index c0cb680e23..2c4d53fc67 100644
--- a/target/linux/generic/files/drivers/net/phy/rtl8366_smi.c
+++ b/target/linux/generic/files/drivers/net/phy/rtl8366_smi.c
@@ -1553,8 +1553,8 @@  int rtl8366_smi_probe_of(struct platform_device *pdev, struct rtl8366_smi *smi)
 
 	smi->ext_mbus = of_mdio_find_bus(mdio_node);
 	if (!smi->ext_mbus) {
-		dev_err(&pdev->dev,
-			"cannot find mdio bus from bus handle");
+		dev_info(&pdev->dev,
+			"cannot find mdio bus from bus handle (yet)");
 		goto try_gpio;
 	}
 
@@ -1562,8 +1562,12 @@  int rtl8366_smi_probe_of(struct platform_device *pdev, struct rtl8366_smi *smi)
 
 try_gpio:
 	if (!gpio_is_valid(sck) || !gpio_is_valid(sda)) {
-		dev_err(&pdev->dev, "gpios missing in devictree\n");
-		return -EINVAL;
+		if (!mdio_node) {
+			dev_err(&pdev->dev, "gpios missing in devictree\n");
+			return -EINVAL;
+		} else {
+			return -EPROBE_DEFER;
+		}
 	}
 
 	smi->gpio_sda = sda;
@@ -1619,7 +1623,7 @@  struct rtl8366_smi *rtl8366_smi_probe(struct platform_device *pdev)
 
 free_smi:
 	kfree(smi);
-	return NULL;
+	return ERR_PTR(err);
 }
 EXPORT_SYMBOL_GPL(rtl8366_smi_probe);
 
diff --git a/target/linux/generic/files/drivers/net/phy/rtl8366rb.c b/target/linux/generic/files/drivers/net/phy/rtl8366rb.c
index dc394c02b6..0e0116051a 100644
--- a/target/linux/generic/files/drivers/net/phy/rtl8366rb.c
+++ b/target/linux/generic/files/drivers/net/phy/rtl8366rb.c
@@ -1445,8 +1445,8 @@  static int rtl8366rb_probe(struct platform_device *pdev)
 		       " version " RTL8366RB_DRIVER_VER"\n");
 
 	smi = rtl8366_smi_probe(pdev);
-	if (!smi)
-		return -ENODEV;
+	if (IS_ERR(smi))
+		return PTR_ERR(smi);
 
 	smi->clk_delay = 10;
 	smi->cmd_read = 0xa9;
diff --git a/target/linux/generic/files/drivers/net/phy/rtl8366s.c b/target/linux/generic/files/drivers/net/phy/rtl8366s.c
index 3f458f9dec..8c746778b8 100644
--- a/target/linux/generic/files/drivers/net/phy/rtl8366s.c
+++ b/target/linux/generic/files/drivers/net/phy/rtl8366s.c
@@ -1233,8 +1233,8 @@  static int rtl8366s_probe(struct platform_device *pdev)
 		       " version " RTL8366S_DRIVER_VER"\n");
 
 	smi = rtl8366_smi_probe(pdev);
-	if (!smi)
-		return -ENODEV;
+	if (IS_ERR(smi))
+		return PTR_ERR(smi);
 
 	smi->clk_delay = 10;
 	smi->cmd_read = 0xa9;
diff --git a/target/linux/generic/files/drivers/net/phy/rtl8367.c b/target/linux/generic/files/drivers/net/phy/rtl8367.c
index 9549961d76..7f0569d038 100644
--- a/target/linux/generic/files/drivers/net/phy/rtl8367.c
+++ b/target/linux/generic/files/drivers/net/phy/rtl8367.c
@@ -1752,8 +1752,8 @@  static int rtl8367_probe(struct platform_device *pdev)
 	int err;
 
 	smi = rtl8366_smi_probe(pdev);
-	if (!smi)
-		return -ENODEV;
+	if (IS_ERR(smi))
+		return PTR_ERR(smi);
 
 	smi->clk_delay = 1500;
 	smi->cmd_read = 0xb9;
diff --git a/target/linux/generic/files/drivers/net/phy/rtl8367b.c b/target/linux/generic/files/drivers/net/phy/rtl8367b.c
index e6ea6509ae..cd8de810b5 100644
--- a/target/linux/generic/files/drivers/net/phy/rtl8367b.c
+++ b/target/linux/generic/files/drivers/net/phy/rtl8367b.c
@@ -1527,8 +1527,8 @@  static int  rtl8367b_probe(struct platform_device *pdev)
 	int err;
 
 	smi = rtl8366_smi_probe(pdev);
-	if (!smi)
-		return -ENODEV;
+	if (IS_ERR(smi))
+		return PTR_ERR(smi);
 
 	smi->clk_delay = 1500;
 	smi->cmd_read = 0xb9;