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>
(backported from
910c2f9e68554ed36f622d005c76f39780b367ab)
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;
}
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;
free_smi:
kfree(smi);
- return NULL;
+ return ERR_PTR(err);
}
EXPORT_SYMBOL_GPL(rtl8366_smi_probe);
" 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;
" 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;
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;
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;