All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v3/RFT 0/2] net: phy: assert the phy reset during suspended if phy is not attached
@ 2019-01-17 11:05 Yoshihiro Shimoda
  2019-01-17 11:05 ` [PATCH v3/RFT 1/2] net: phy: Fix not to call phy_resume() if PHY " Yoshihiro Shimoda
  2019-01-17 11:05 ` [PATCH v3/RFT 2/2] net: phy: assert the phy reset during suspended if phy " Yoshihiro Shimoda
  0 siblings, 2 replies; 3+ messages in thread
From: Yoshihiro Shimoda @ 2019-01-17 11:05 UTC (permalink / raw)
  To: andrew, f.fainelli, davem
  Cc: netdev, linux-renesas-soc, devicetree, Yoshihiro Shimoda

This patch series is for R-Car Gen3 Salvator-XS boards. If we do
the following method, the phy cannot link up correctly.

 1) Kernel boots by using initramfs.
 --> No open the nic, so phy_device_register() and phy_probe()
     deasserts the reset.
 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.

Changes from v2:
 - Rebase on the latest net-next.
 - More generic code instead of micrel phy only code
   (https://www.spinics.net/lists/netdev/msg540462.html).
   So, I marked this patch series as RFT.

Changes from v1 (as RFC):
 - No remove the current code of phy_device.c to avoid any side effects.
 - Fix the mdio_bus_phy_resume() in phy_device.c.
 - Add toggling the phy reset in micrel.c if the PHY is not attached.


Yoshihiro Shimoda (2):
  net: phy: Fix not to call phy_resume() if PHY is not attached
  net: phy: assert the phy reset during suspended if phy is not attached

 drivers/net/phy/phy_device.c | 19 ++++++++++++++-----
 1 file changed, 14 insertions(+), 5 deletions(-)

-- 
1.9.1


^ permalink raw reply	[flat|nested] 3+ messages in thread

* [PATCH v3/RFT 1/2] net: phy: Fix not to call phy_resume() if PHY is not attached
  2019-01-17 11:05 [PATCH v3/RFT 0/2] net: phy: assert the phy reset during suspended if phy is not attached Yoshihiro Shimoda
@ 2019-01-17 11:05 ` Yoshihiro Shimoda
  2019-01-17 11:05 ` [PATCH v3/RFT 2/2] net: phy: assert the phy reset during suspended if phy " Yoshihiro Shimoda
  1 sibling, 0 replies; 3+ messages in thread
From: Yoshihiro Shimoda @ 2019-01-17 11:05 UTC (permalink / raw)
  To: andrew, f.fainelli, davem
  Cc: netdev, linux-renesas-soc, devicetree, Yoshihiro Shimoda

This patch fixes an issue that mdio_bus_phy_resume() doesn't call
phy_resume() if the PHY is not attached.

Fixes: 803dd9c77ac3 ("net: phy: avoid suspending twice a PHY")
Signed-off-by: Yoshihiro Shimoda <yoshihiro.shimoda.uh@renesas.com>
---
 drivers/net/phy/phy_device.c | 11 ++++++-----
 1 file changed, 6 insertions(+), 5 deletions(-)

diff --git a/drivers/net/phy/phy_device.c b/drivers/net/phy/phy_device.c
index bb14108..d86356f 100644
--- a/drivers/net/phy/phy_device.c
+++ b/drivers/net/phy/phy_device.c
@@ -225,7 +225,7 @@ static void phy_mdio_device_remove(struct mdio_device *mdiodev)
 static DEFINE_MUTEX(phy_fixup_lock);
 
 #ifdef CONFIG_PM
-static bool mdio_bus_phy_may_suspend(struct phy_device *phydev)
+static bool mdio_bus_phy_may_suspend(struct phy_device *phydev, bool suspend)
 {
 	struct device_driver *drv = phydev->mdio.dev.driver;
 	struct phy_driver *phydrv = to_phy_driver(drv);
@@ -237,10 +237,11 @@ static bool mdio_bus_phy_may_suspend(struct phy_device *phydev)
 	/* PHY not attached? May suspend if the PHY has not already been
 	 * suspended as part of a prior call to phy_disconnect() ->
 	 * phy_detach() -> phy_suspend() because the parent netdev might be the
-	 * MDIO bus driver and clock gated at this point.
+	 * MDIO bus driver and clock gated at this point. Also may resume if
+	 * PHY is not attached.
 	 */
 	if (!netdev)
-		return !phydev->suspended;
+		return suspend ? !phydev->suspended : phydev->suspended;
 
 	if (netdev->wol_enabled)
 		return false;
@@ -275,7 +276,7 @@ static int mdio_bus_phy_suspend(struct device *dev)
 	if (phydev->attached_dev && phydev->adjust_link)
 		phy_stop_machine(phydev);
 
-	if (!mdio_bus_phy_may_suspend(phydev))
+	if (!mdio_bus_phy_may_suspend(phydev, true))
 		return 0;
 
 	return phy_suspend(phydev);
@@ -286,7 +287,7 @@ static int mdio_bus_phy_resume(struct device *dev)
 	struct phy_device *phydev = to_phy_device(dev);
 	int ret;
 
-	if (!mdio_bus_phy_may_suspend(phydev))
+	if (!mdio_bus_phy_may_suspend(phydev, false))
 		goto no_resume;
 
 	ret = phy_resume(phydev);
-- 
1.9.1


^ permalink raw reply related	[flat|nested] 3+ messages in thread

* [PATCH v3/RFT 2/2] net: phy: assert the phy reset during suspended if phy is not attached
  2019-01-17 11:05 [PATCH v3/RFT 0/2] net: phy: assert the phy reset during suspended if phy is not attached Yoshihiro Shimoda
  2019-01-17 11:05 ` [PATCH v3/RFT 1/2] net: phy: Fix not to call phy_resume() if PHY " Yoshihiro Shimoda
@ 2019-01-17 11:05 ` Yoshihiro Shimoda
  1 sibling, 0 replies; 3+ messages in thread
From: Yoshihiro Shimoda @ 2019-01-17 11:05 UTC (permalink / raw)
  To: andrew, f.fainelli, davem
  Cc: netdev, linux-renesas-soc, devicetree, Yoshihiro Shimoda

This phy_device driver deasserts the reset signal in the following
functions (expect error path):
 - phy_device_register()
 - phy_probe()
 - phy_init_hw() that is called by phy_attach_direct()

And, the phy_device asserts the reset signal in the following
functions (expect error path):
 - phy_device_remove()
 - phy_remove()
 - phy_detach()

So, if the following conditions happen, the reset signal keeps to be
deasserted during suspended:
 - The phy driver is probed
 - But a net device doesn't open
 - And then the system enters suspend

So, this patch adds to assert the reset signal in phy_suspend() if
a phy is not attached. Otherwise, R-Car Gen3 Salvator-XS board could
not link up correctly if we do the following method:

 1) Kernel boots by using initramfs.
 2) Kernel enters the suspend.
 3) Kernel returns from suspend.
 4) ifconfig eth0 up
 --> Then, since edge signal of the reset doesn't happen,
     it cannot link up.

Signed-off-by: Yoshihiro Shimoda <yoshihiro.shimoda.uh@renesas.com>
---
 drivers/net/phy/phy_device.c | 8 ++++++++
 1 file changed, 8 insertions(+)

diff --git a/drivers/net/phy/phy_device.c b/drivers/net/phy/phy_device.c
index d86356f..09ab62a 100644
--- a/drivers/net/phy/phy_device.c
+++ b/drivers/net/phy/phy_device.c
@@ -1346,6 +1346,10 @@ int phy_suspend(struct phy_device *phydev)
 	if (ret)
 		return ret;
 
+	/* Assert the reset signal if the phydev is not attached */
+	if (!phydev->attached_dev)
+		phy_device_reset(phydev, 1);
+
 	phydev->suspended = true;
 
 	return ret;
@@ -1359,6 +1363,10 @@ int __phy_resume(struct phy_device *phydev)
 
 	WARN_ON(!mutex_is_locked(&phydev->lock));
 
+	/* Deassert the reset signal if the phydev is not attached */
+	if (!phydev->attached_dev)
+		phy_device_reset(phydev, 0);
+
 	if (phydev->drv && phydrv->resume)
 		ret = phydrv->resume(phydev);
 
-- 
1.9.1


^ permalink raw reply related	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2019-01-17 11:08 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-01-17 11:05 [PATCH v3/RFT 0/2] net: phy: assert the phy reset during suspended if phy is not attached Yoshihiro Shimoda
2019-01-17 11:05 ` [PATCH v3/RFT 1/2] net: phy: Fix not to call phy_resume() if PHY " Yoshihiro Shimoda
2019-01-17 11:05 ` [PATCH v3/RFT 2/2] net: phy: assert the phy reset during suspended if phy " Yoshihiro Shimoda

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.