[U-Boot] [PATCH v4 3/3] cmd: mdio: Add new parameter to access MMD PHY registers
Vladimir Oltean
vladimir.oltean at nxp.com
Thu Jan 24 19:56:52 UTC 2019
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 <ccaione at baylibre.com>
> Acked-by: Joe Hershberger <joe.hershberger at ni.com>
> ---
> 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
More information about the U-Boot
mailing list