Message ID | 20231017143144.3212657-1-vladimir.oltean@nxp.com (mailing list archive) |
---|---|
State | Accepted |
Commit | 1f9f2143f24e224a8582a5d54918c43b9121eccc |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | [v2,net] net: mdio-mux: fix C45 access returning -EIO after API change | expand |
On 10/17/23 07:31, Vladimir Oltean wrote: > The mii_bus API conversion to read_c45() and write_c45() did not cover > the mdio-mux driver before read() and write() were made C22-only. > > This broke arch/arm64/boot/dts/freescale/fsl-ls1028a-qds-13bb.dtso. > The -EOPNOTSUPP from mdiobus_c45_read() is transformed by > get_phy_c45_devs_in_pkg() into -EIO, is further propagated to > of_mdiobus_register() and this makes the mdio-mux driver fail to probe > the entire child buses, not just the PHYs that cause access errors. > > Fix the regression by introducing special c45 read and write accessors > to mdio-mux which forward the operation to the parent MDIO bus. > > Fixes: db1a63aed89c ("net: phy: Remove fallback to old C45 method") > Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com> Reviewed-by: Florian Fainelli <florian.fainelli@broadcom.com>
On Tue, Oct 17, 2023 at 05:31:44PM +0300, Vladimir Oltean wrote: > The mii_bus API conversion to read_c45() and write_c45() did not cover > the mdio-mux driver before read() and write() were made C22-only. > > This broke arch/arm64/boot/dts/freescale/fsl-ls1028a-qds-13bb.dtso. > The -EOPNOTSUPP from mdiobus_c45_read() is transformed by > get_phy_c45_devs_in_pkg() into -EIO, is further propagated to > of_mdiobus_register() and this makes the mdio-mux driver fail to probe > the entire child buses, not just the PHYs that cause access errors. > > Fix the regression by introducing special c45 read and write accessors > to mdio-mux which forward the operation to the parent MDIO bus. > > Fixes: db1a63aed89c ("net: phy: Remove fallback to old C45 method") > Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com> Reviewed-by: Andrew Lunn <andrew@lunn.ch> Andrew
On Tue, Oct 17, 2023 at 05:31:44PM +0300, Vladimir Oltean wrote: > The mii_bus API conversion to read_c45() and write_c45() did not cover > the mdio-mux driver before read() and write() were made C22-only. > > This broke arch/arm64/boot/dts/freescale/fsl-ls1028a-qds-13bb.dtso. > The -EOPNOTSUPP from mdiobus_c45_read() is transformed by > get_phy_c45_devs_in_pkg() into -EIO, is further propagated to > of_mdiobus_register() and this makes the mdio-mux driver fail to probe > the entire child buses, not just the PHYs that cause access errors. > > Fix the regression by introducing special c45 read and write accessors > to mdio-mux which forward the operation to the parent MDIO bus. > > Fixes: db1a63aed89c ("net: phy: Remove fallback to old C45 method") > Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com> Reviewed-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk> Thanks!
Hello: This patch was applied to netdev/net.git (main) by Jakub Kicinski <kuba@kernel.org>: On Tue, 17 Oct 2023 17:31:44 +0300 you wrote: > The mii_bus API conversion to read_c45() and write_c45() did not cover > the mdio-mux driver before read() and write() were made C22-only. > > This broke arch/arm64/boot/dts/freescale/fsl-ls1028a-qds-13bb.dtso. > The -EOPNOTSUPP from mdiobus_c45_read() is transformed by > get_phy_c45_devs_in_pkg() into -EIO, is further propagated to > of_mdiobus_register() and this makes the mdio-mux driver fail to probe > the entire child buses, not just the PHYs that cause access errors. > > [...] Here is the summary with links: - [v2,net] net: mdio-mux: fix C45 access returning -EIO after API change https://git.kernel.org/netdev/net/c/1f9f2143f24e You are awesome, thank you!
diff --git a/drivers/net/mdio/mdio-mux.c b/drivers/net/mdio/mdio-mux.c index a881e3523328..bef4cce71287 100644 --- a/drivers/net/mdio/mdio-mux.c +++ b/drivers/net/mdio/mdio-mux.c @@ -55,6 +55,27 @@ static int mdio_mux_read(struct mii_bus *bus, int phy_id, int regnum) return r; } +static int mdio_mux_read_c45(struct mii_bus *bus, int phy_id, int dev_addr, + int regnum) +{ + struct mdio_mux_child_bus *cb = bus->priv; + struct mdio_mux_parent_bus *pb = cb->parent; + int r; + + mutex_lock_nested(&pb->mii_bus->mdio_lock, MDIO_MUTEX_MUX); + r = pb->switch_fn(pb->current_child, cb->bus_number, pb->switch_data); + if (r) + goto out; + + pb->current_child = cb->bus_number; + + r = pb->mii_bus->read_c45(pb->mii_bus, phy_id, dev_addr, regnum); +out: + mutex_unlock(&pb->mii_bus->mdio_lock); + + return r; +} + /* * The parent bus' lock is used to order access to the switch_fn. */ @@ -80,6 +101,28 @@ static int mdio_mux_write(struct mii_bus *bus, int phy_id, return r; } +static int mdio_mux_write_c45(struct mii_bus *bus, int phy_id, int dev_addr, + int regnum, u16 val) +{ + struct mdio_mux_child_bus *cb = bus->priv; + struct mdio_mux_parent_bus *pb = cb->parent; + + int r; + + mutex_lock_nested(&pb->mii_bus->mdio_lock, MDIO_MUTEX_MUX); + r = pb->switch_fn(pb->current_child, cb->bus_number, pb->switch_data); + if (r) + goto out; + + pb->current_child = cb->bus_number; + + r = pb->mii_bus->write_c45(pb->mii_bus, phy_id, dev_addr, regnum, val); +out: + mutex_unlock(&pb->mii_bus->mdio_lock); + + return r; +} + static int parent_count; static void mdio_mux_uninit_children(struct mdio_mux_parent_bus *pb) @@ -173,6 +216,10 @@ int mdio_mux_init(struct device *dev, cb->mii_bus->parent = dev; cb->mii_bus->read = mdio_mux_read; cb->mii_bus->write = mdio_mux_write; + if (parent_bus->read_c45) + cb->mii_bus->read_c45 = mdio_mux_read_c45; + if (parent_bus->write_c45) + cb->mii_bus->write_c45 = mdio_mux_write_c45; r = of_mdiobus_register(cb->mii_bus, child_bus_node); if (r) { mdiobus_free(cb->mii_bus);
The mii_bus API conversion to read_c45() and write_c45() did not cover the mdio-mux driver before read() and write() were made C22-only. This broke arch/arm64/boot/dts/freescale/fsl-ls1028a-qds-13bb.dtso. The -EOPNOTSUPP from mdiobus_c45_read() is transformed by get_phy_c45_devs_in_pkg() into -EIO, is further propagated to of_mdiobus_register() and this makes the mdio-mux driver fail to probe the entire child buses, not just the PHYs that cause access errors. Fix the regression by introducing special c45 read and write accessors to mdio-mux which forward the operation to the parent MDIO bus. Fixes: db1a63aed89c ("net: phy: Remove fallback to old C45 method") Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com> --- v1->v2: apply Russell's suggestion to assign the function pointers conditionally based on their presence in the parent bus drivers/net/mdio/mdio-mux.c | 47 +++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+)