[U-Boot] [PATCH] cmd: mdio: Fix access to arbitrary PHY addresses
Alex Marginean
alexm.osslist at gmail.com
Thu May 30 08:45:05 UTC 2019
On 5/30/2019 3:08 AM, Vladimir Oltean wrote:
> Alex reported the following:
>
> "
> I'm doing some MDIO work on a freescale/NXP platform and I bumped into
> errors with this command:
> => mdio r emdio#3 5 3
> Reading from bus emdio#3
> "Synchronous Abort" handler, esr 0x8600000e
> elr: ffffffff862b8000 lr : 000000008200cce4 (reloc)
> ...
>
> mdio list does not list any PHYs currently because ethernet is using DM
> and the interfaces are not probed at this time. The PHY does exist
> on the bus though.
> The above scenario works with this commit reverted:
> e55047ec51a662c12ed53ff543ec7cdf158b2137 cmd: mdio: Switch to generic
> helpers when accessing the registers
>
> The current code using generic helpers only works for PHYs that have
> been registered and show up in bus->phymap and crashes for arbitrary
> IDs. I find it useful to allow reading from other addresses over MDIO
> too, certainly helpful for people debugging MDIO on various boards.
> "
>
> Fix this by reverting to use the raw MDIO bus operations in case there
> is no PHY probed based on DT at the specified address.
>
> This restores the old behavior for these PHYs, which means that the
> newly introduced MMD-over-C22 helpers won't be available for them, but
> at least they will be accessible again without crashing the system.
>
> Fixes: e55047ec51a6 ("cmd: mdio: Switch to generic helpers when accessing the registers")
> Reported-by: Alex Marginean <alexm.osslist at gmail.com>
> Signed-off-by: Vladimir Oltean <olteanv at gmail.com>
> ---
> cmd/mdio.c | 9 +++++++--
> 1 file changed, 7 insertions(+), 2 deletions(-)
>
> diff --git a/cmd/mdio.c b/cmd/mdio.c
> index efe8c9ef0954..5e219f699d8d 100644
> --- a/cmd/mdio.c
> +++ b/cmd/mdio.c
> @@ -54,7 +54,10 @@ static int mdio_write_ranges(struct mii_dev *bus,
>
> for (devad = devadlo; devad <= devadhi; devad++) {
> for (reg = reglo; reg <= reghi; reg++) {
> - if (!extended)
> + if (!phydev)
> + err = bus->write(bus, addr, devad,
> + reg, data);
> + else if (!extended)
> err = phy_write_mmd(phydev, devad,
> reg, data);
> else
> @@ -88,7 +91,9 @@ static int mdio_read_ranges(struct mii_dev *bus,
> for (reg = reglo; reg <= reghi; reg++) {
> int val;
>
> - if (!extended)
> + if (!phydev)
> + val = bus->read(bus, addr, devad, reg);
> + else if (!extended)
> val = phy_read_mmd(phydev, devad, reg);
> else
> val = phydev->drv->readext(phydev, addr,
>
Reviewed-by: Alex Marginean <alexm.osslist at gmail.com>
Thanks!
Alex
More information about the U-Boot
mailing list