For debug purposes it is sometimes useful to have the ability to
interact with the driver functionality of a phy from the command line
(e.g. to manually issue startup, configuration, or shutdown commands to
the phy device).

This patch adds such a command, which allows issuing the following
commands to a phy:
 * getting the driver's name
 * running the phy's configuration procedure (via calling phy_config)
 * running the phy's startup procedure (via calling phy_startup)
 * running the phy's shutdown procedure (via calling phy_shutdown)

Signed-off-by: Mario Six <mario....@gdsys.cc>
---

 cmd/Kconfig |  6 ++++++
 cmd/mdio.c  | 65 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 71 insertions(+)

diff --git a/cmd/Kconfig b/cmd/Kconfig
index 322e466313..6425c425d6 100644
--- a/cmd/Kconfig
+++ b/cmd/Kconfig
@@ -835,6 +835,12 @@ config CMD_MII
        help
          Enable MII utility commands.
 
+config CMD_MII_DRIVER
+       bool "mii driver"
+       depends on CMD_MII
+       help
+         Enable MII driver utility command.
+
 config CMD_PING
        bool "ping"
        help
diff --git a/cmd/mdio.c b/cmd/mdio.c
index 3f11963006..abd763ef1c 100644
--- a/cmd/mdio.c
+++ b/cmd/mdio.c
@@ -180,6 +180,37 @@ static int extract_phy_range(char *const argv[], int argc, 
struct mii_dev **bus,
        return extract_range(argv[0], addrlo, addrhi);
 }
 
+#ifdef CONFIG_CMD_MII_DRIVER
+static struct phy_device *extract_phydev(char *const argv[], int argc)
+{
+       struct phy_device *phydev;
+       struct mii_dev *bus;
+       int addr;
+
+       if (argc == 1) {
+               phydev = mdio_phydev_for_ethname(argv[0]);
+
+               if (phydev)
+                       return phydev;
+
+               bus = mdio_get_current_dev();
+       } else {
+               bus = miiphy_get_dev_by_name(argv[0]);
+       }
+
+       if (!bus)
+               return NULL;
+
+       addr = simple_strtol(argv[1], NULL, 0);
+       if (addr >= PHY_MAX_ADDR)
+               return NULL;
+
+       phydev = bus->phymap[addr];
+
+       return phydev;
+}
+#endif
+
 /* ---------------------------------------------------------------- */
 static int do_mdio(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
 {
@@ -212,6 +243,36 @@ static int do_mdio(cmd_tbl_t *cmdtp, int flag, int argc, 
char * const argv[])
        if (flag & CMD_FLAG_REPEAT)
                op[0] = last_op[0];
 
+#ifdef CONFIG_CMD_MII_DRIVER
+       if (op[0] == 'd') {
+               if ((argc < 4) || (argc > 5) || (strlen(argv[2]) < 2))
+                       return CMD_RET_USAGE;
+
+               phydev = extract_phydev(&argv[3], argc - 3);
+               if (!phydev)
+                       return CMD_RET_USAGE;
+
+               switch (argv[2][1]) {
+               case 'e': /* g'e't */
+                       printf("driver: ");
+                       if (phydev->drv)
+                               printf("%s", phydev->drv->name);
+                       printf("\n");
+                       break;
+               case 'o': /* c'o'nfig */
+                       phy_config(phydev);
+                       break;
+               case 't': /* s't'artup */
+                       phy_startup(phydev);
+                       break;
+               case 'h': /* s'h'utdown */
+                       phy_shutdown(phydev);
+                       break;
+               }
+               return 0;
+       }
+#endif
+
        if (strlen(argv[1]) > 1) {
                op[1] = argv[1][1];
                if (op[1] == 'x') {
@@ -304,6 +365,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"
+#ifdef CONFIG_CMD_MII_DRIVER
+       "mdio driver <get | config | startup | shutdown> <phydev> - "
+               "<get | config | startup | shutdown> phy driver\n"
+#endif
        "<phydev> may be:\n"
        "   <busname>  <addr>\n"
        "   <addr>\n"
-- 
2.11.0

_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
https://lists.denx.de/listinfo/u-boot

Reply via email to