On 1/24/19 10:56 AM, Carlo Caione wrote: > Two new parameters (rmmd and wmmd) are added to allow the `mdio` command > to access the content of the MMD PHY registers. > > Signed-off-by: Carlo Caione <[email protected]> > Acked-by: Joe Hershberger <[email protected]> > --- > cmd/mdio.c | 52 +++++++++++++++++++++++++++++++++++++--------------- > 1 file changed, 37 insertions(+), 15 deletions(-) > > diff --git a/cmd/mdio.c b/cmd/mdio.c > index 184868063a..5138db505a 100644 > --- a/cmd/mdio.c > +++ b/cmd/mdio.c > @@ -43,7 +43,7 @@ static int mdio_write_ranges(struct phy_device *phydev, > struct mii_dev *bus, > int addrlo, > int addrhi, int devadlo, int devadhi, > int reglo, int reghi, unsigned short data, > - int extended) > + int extended, int mmd) > { > int addr, devad, reg; > int err = 0; > @@ -51,12 +51,15 @@ static int mdio_write_ranges(struct phy_device *phydev, > struct mii_dev *bus, > for (addr = addrlo; addr <= addrhi; addr++) { > for (devad = devadlo; devad <= devadhi; devad++) { > for (reg = reglo; reg <= reghi; reg++) { > - if (!extended) > - err = bus->write(bus, addr, devad, > - reg, data); > - else > + if (mmd) > + err = phy_write_mmd(phydev, devad, reg, > + data); > + else if (extended) > err = phydev->drv->writeext(phydev, > addr, devad, reg, data); > + else > + err = bus->write(bus, addr, devad, > + reg, data); > > if (err) > goto err_out; > @@ -71,7 +74,7 @@ err_out: > static int mdio_read_ranges(struct phy_device *phydev, struct mii_dev *bus, > int addrlo, > int addrhi, int devadlo, int devadhi, > - int reglo, int reghi, int extended) > + int reglo, int reghi, int extended, int mmd) > { > int addr, devad, reg; > > @@ -83,11 +86,13 @@ static int mdio_read_ranges(struct phy_device *phydev, > struct mii_dev *bus, > for (reg = reglo; reg <= reghi; reg++) { > int val; > > - if (!extended) > - val = bus->read(bus, addr, devad, reg); > - else > + if (mmd) > + val = phy_read_mmd(phydev, devad, reg); > + else if (extended) > val = phydev->drv->readext(phydev, addr, > devad, reg); > + else > + val = bus->read(bus, addr, devad, reg); > > if (val < 0) { > printf("Error\n"); > @@ -189,6 +194,7 @@ static int do_mdio(cmd_tbl_t *cmdtp, int flag, int argc, > char * const argv[]) > struct mii_dev *bus; > struct phy_device *phydev = NULL; > int extended = 0; > + int mmd = 0; > > if (argc < 2) > return CMD_RET_USAGE; > @@ -222,14 +228,26 @@ static int do_mdio(cmd_tbl_t *cmdtp, int flag, int > argc, char * const argv[]) > bus = phydev->bus; > extended = 1; > } else { > - return -1; > + return CMD_RET_FAILURE; > } > > if (!phydev->drv || > (!phydev->drv->writeext && (op[0] == 'w')) || > (!phydev->drv->readext && (op[0] == 'r'))) { > puts("PHY does not have extended functions\n"); > - return -1; > + return CMD_RET_FAILURE; > + } > + } > + if (op[1] == 'm') { > + phydev = mdio_phydev_for_ethname(argv[2]); > + > + if (phydev) { > + addrlo = phydev->addr; > + addrhi = addrlo; > + bus = phydev->bus; > + mmd = 1; > + } else { > + return CMD_RET_FAILURE; > } > } > } > @@ -242,13 +260,13 @@ static int do_mdio(cmd_tbl_t *cmdtp, int flag, int > argc, char * const argv[]) > if (pos > 1) > if (extract_reg_range(argv[pos--], &devadlo, &devadhi, > ®lo, ®hi)) > - return -1; > + return CMD_RET_FAILURE; > > default: > if (pos > 1) > if (extract_phy_range(&argv[2], pos - 1, &bus, > &phydev, &addrlo, &addrhi)) > - return -1; > + return CMD_RET_FAILURE; > > break; > } > @@ -265,12 +283,12 @@ static int do_mdio(cmd_tbl_t *cmdtp, int flag, int > argc, char * const argv[]) > switch (op[0]) { > case 'w': > mdio_write_ranges(phydev, bus, addrlo, addrhi, devadlo, devadhi, > - reglo, reghi, data, extended); > + reglo, reghi, data, extended, mmd); > break; > > case 'r': > mdio_read_ranges(phydev, bus, addrlo, addrhi, devadlo, devadhi, > - reglo, reghi, extended); > + reglo, reghi, extended, mmd); > break; > } > > @@ -303,6 +321,10 @@ U_BOOT_CMD( > "read PHY's extended register at <devad>.<reg>\n" > "mdio wx <phydev> [<devad>.]<reg> <data> - " > "write PHY's extended register at <devad>.<reg>\n" > + "mdio rmmd <phydev> [<devad>.]<reg> - " > + "read PHY's extended register at <devad>.<reg>\n" > + "mdio wmmd <phydev> [<devad>.]<reg> <data> - " > + "write PHY's extended register at <devad>.<reg>\n" > "<phydev> may be:\n" > " <busname> <addr>\n" > " <addr>\n" >
It works for me, but I do have a question. Is there any limitation preventing you to add this functionality via the standard "mdio read x.y" instead of "mdio rmmd x.y" if the PHY is known to be C22? -Vladimir _______________________________________________ U-Boot mailing list [email protected] https://lists.denx.de/listinfo/u-boot

