[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID:
<AM9PR04MB8506791F9A2A1EF4B33AAAF4E2282@AM9PR04MB8506.eurprd04.prod.outlook.com>
Date: Fri, 15 Mar 2024 07:55:48 +0000
From: "Jan Petrous (OSS)" <jan.petrous@....nxp.com>
To: Andrew Lunn <andrew@...n.ch>, "netdev@...r.kernel.org"
<netdev@...r.kernel.org>
CC: 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: [PATCH net-next v2] net: phy: don't resume device not in use
In the case when an MDIO bus contains PHY device not attached to
any netdev or is attached to the external netdev, controlled
by another driver and the driver is disabled, the bus, when PM resume
occurs, is trying to resume also the unattached phydev.
/* Synopsys DWMAC built-in driver (stmmac) */
gmac0: ethernet@...3c000 {
compatible = "snps,dwc-qos-ethernet", "nxp,s32cc-dwmac";
phy-handle = <&gmac0_mdio_c_phy4>;
phy-mode = "rgmii-id";
gmac0_mdio: mdio@0 {
compatible = "snps,dwmac-mdio";
/* AQR107 */
gmac0_mdio_c_phy1: ethernet-phy@1 {
compatible = "ethernet-phy-ieee802.3-c45";
reg = <1>;
};
/* KSZ9031RNX */
gmac0_mdio_c_phy4: ethernet-phy@4 {
reg = <4>;
};
};
};
/* PFE controller, loadable driver pfeng.ko */
pfe: pfe@...00000 {
compatible = "nxp,s32g-pfe";
/* Network interface 'pfe1' */
pfe_netif1: ethernet@11 {
compatible = "nxp,s32g-pfe-netif";
phy-mode = "sgmii";
phy-handle = <&gmac0_mdio_c_phy1>;
};
};
Because such device didn't go through attach process, internal
parameters like phy_dev->interface are set to default values, which
can be incorrect for some drivers. Ie. Aquantia PHY AQR107 doesn't
support PHY_INTERFACE_MODE_GMII and trying to use phy_init()
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']
The fix is intentionally assymetric to support PM suspend of the device.
Signed-off-by: Jan Petrous <jan.petrous@....nxp.com>
---
drivers/net/phy/phy_device.c | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/drivers/net/phy/phy_device.c b/drivers/net/phy/phy_device.c
index 8297ef681bf5..507eb0570e0e 100644
--- a/drivers/net/phy/phy_device.c
+++ b/drivers/net/phy/phy_device.c
@@ -355,6 +355,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;
+
if (phydev->mac_managed_pm)
return 0;
--
2.43.0
Powered by blists - more mailing lists