Re: macb: probe of 10090000.ethernet failed with error -110
From: Andrew Lunn <andrew@lunn.ch>
Date: 2018-11-29 05:55:24
Also in:
linux-riscv, lkml
diff --git a/drivers/net/phy/mscc.c b/drivers/net/phy/mscc.c
index 7cae17517744..8e0a71ee6bab 100644
--- a/drivers/net/phy/mscc.c
+++ b/drivers/net/phy/mscc.c
@@ -1822,6 +1822,24 @@ static int vsc85xx_probe(struct phy_device *phydev)
return vsc85xx_dt_led_modes_get(phydev, default_mode);
}
+static int vsc8541_reset(struct phy_device *phydev, int value)
+{
+ WARN_ON(value != 0 || value != 1);
+ mdio_device_reset(&phydev->mdio, value);
+ if (value == 1) {
+ /* The VSC8541 has an unexpected feature where a single reset
+ * rising edge can only be used to enter managed mode. For
+ * unmanaged mode a pair of reset rising edges is necessary.
+ * */
+ mdio_device_reset(&phydev_mdio, 0);
+ mdio_device_reset(&phydev_mdio, 1);
+
+ /* After this pair of reset rising edges we must wait at least
+ * 15ms before writing any phy registers. */
+ msleep(15);
+ }
+}
+
/* Microsemi VSC85xx PHYs */
static struct phy_driver vsc85xx_driver[] = {
{
@@ -1927,6 +1945,7 @@ static struct phy_driver vsc85xx_driver[] = {
.get_sset_count = &vsc85xx_get_sset_count,
.get_strings = &vsc85xx_get_strings,
.get_stats = &vsc85xx_get_stats,
+ .reset = &vsc8541_reset,So if we assume you can identify the PHY using its ID registers, you can put this reset code into the soft_reset call. That gets called first before anything else. There is no need to add a new function to phy_driver. Andrew