Some PHY device needs edge signal of the reset, but the previous code is impossible to achieve it like following: 1) Kernel boots by using initramfs. --> No open the nic, so the provious code deasserts the reset by phy_device_register() and phy_probe(). 2) Kernel enters the suspend. --> So, keep the reset signal as deassert. --> On R-Car Salvator-XS board, unfortunately, the board power is turned off. 3) Kernel returns from suspend. 4) ifconfig eth0 up --> Then, since edge signal of the reset doesn't happen, it cannot link up. 5) ifconfig eth0 down 6) ifconfig eth0 up --> In this case, it can link up. This patch is possible to break if ->probe() in a phy driver will access the PHY. But, I believe ->config_init() only initializes the PHY. However, I think this patch should be RFC at first. Reported-by: Hiromitsu Yamasaki <hiromitsu.yamasaki.ym@xxxxxxxxxxx> Signed-off-by: Yoshihiro Shimoda <yoshihiro.shimoda.uh@xxxxxxxxxxx> --- drivers/net/phy/phy_device.c | 22 +--------------------- 1 file changed, 1 insertion(+), 21 deletions(-) diff --git a/drivers/net/phy/phy_device.c b/drivers/net/phy/phy_device.c index e06613f..e01a752 100644 --- a/drivers/net/phy/phy_device.c +++ b/drivers/net/phy/phy_device.c @@ -802,16 +802,6 @@ int phy_device_register(struct phy_device *phydev) if (err) return err; - /* Deassert the reset signal */ - phy_device_reset(phydev, 0); - - /* Run all of the fixups for this PHY */ - err = phy_scan_fixups(phydev); - if (err) { - pr_err("PHY %d failed to initialize\n", phydev->mdio.addr); - goto out; - } - err = device_add(&phydev->mdio.dev); if (err) { pr_err("PHY %d failed to add\n", phydev->mdio.addr); @@ -821,8 +811,6 @@ int phy_device_register(struct phy_device *phydev) return 0; out: - /* Assert the reset signal */ - phy_device_reset(phydev, 1); mdiobus_unregister_device(&phydev->mdio); return err; @@ -2202,16 +2190,8 @@ static int phy_probe(struct device *dev) /* Set the state to READY by default */ phydev->state = PHY_READY; - if (phydev->drv->probe) { - /* Deassert the reset signal */ - phy_device_reset(phydev, 0); - + if (phydev->drv->probe) err = phydev->drv->probe(phydev); - if (err) { - /* Assert the reset signal */ - phy_device_reset(phydev, 1); - } - } mutex_unlock(&phydev->lock); -- 1.9.1