[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <c5238a4e-b4b1-484a-87f3-ea942b6aa04a@lunn.ch>
Date: Thu, 7 Mar 2024 17:22:57 +0100
From: Andrew Lunn <andrew@...n.ch>
To: "Jan Petrous (OSS)" <jan.petrous@....nxp.com>
Cc: "netdev@...r.kernel.org" <netdev@...r.kernel.org>,
Heiner Kallweit <hkallweit1@...il.com>,
Russell King <linux@...linux.org.uk>,
"David S. Miller" <davem@...emloft.net>,
Eric Dumazet <edumazet@...gle.com>,
Jakub Kicinski <kuba@...nel.org>, Paolo Abeni <pabeni@...hat.com>
Subject: Re: [RFC PATCH net-next] net: phy: Don't suspend/resume device not
in use
> Because such device didn't go through attach process, internal
> parameters like phy_dev->interface is set to the default value, which
> is not correct for some drivers. Ie. Aquantia PHY AQR107 doesn't
> support PHY_INTERFACE_MODE_GMII and trying to use phy_init_hw()
> in mdio_bus_phy_resume() ends up with the following error caused
> by initial check of supported interfaces in aqr107_config_init():
>
> [ 63.927708] Aquantia AQR113C stmmac-0:08: PM: failed to resume: error -19']
>
> Signed-off-by: Jan Petrous <jan.petrous@....nxp.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 3611ea64875e..30c03ac6b84c 100644
> --- a/drivers/net/phy/phy_device.c
> +++ b/drivers/net/phy/phy_device.c
> @@ -311,6 +311,10 @@ static __maybe_unused int mdio_bus_phy_suspend(struct device *dev)
> {
> struct phy_device *phydev = to_phy_device(dev);
>
> + /* Don't suspend device if not in use state */
> + if (phydev->state <= PHY_READY)
> + return 0;
> +
> if (phydev->mac_managed_pm)
> return 0;
If nothing is using it, suspending it does however make sense. It is
consuming power, which could be saved by suspending it. It makes the
code asymmetrical, but i would throw this hunk away.
>
> @@ -344,6 +348,10 @@ static __maybe_unused int mdio_bus_phy_resume(struct device *dev)
> struct phy_device *phydev = to_phy_device(dev);
> int ret;
>
> + /* Don't resume device which wasn't previously in use state */
> + if (phydev->state <= PHY_READY)
> + return 0;
> +
This is the real fix to your problem. phy_attach_direct() also does a
phy_resume(), so if the device does come along and claim the PHY after
the resume, it looks like this should work, without the matching
suspend.
Andrew
Powered by blists - more mailing lists