diff mbox

[U-Boot,18/51] cmd: mdio: Add 'driver' subcommand

Message ID 20170714125537.14895-19-mario.six@gdsys.cc
State Rejected, archived
Delegated to: Mario Six
Headers show

Commit Message

Mario Six July 14, 2017, 12:55 p.m. UTC
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.six@gdsys.cc>
---

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

Comments

Simon Glass July 18, 2017, 2:02 p.m. UTC | #1
Hi Mario,

On 14 July 2017 at 05:55, Mario Six <mario.six@gdsys.cc> wrote:
> 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.six@gdsys.cc>
> ---
>
>  cmd/Kconfig |  6 ++++++
>  cmd/mdio.c  | 65 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
>  2 files changed, 71 insertions(+)

This seems reasonable, but we need to figure out how to use driver model.

Regards,
Simon
Mario Six July 25, 2017, 8:25 a.m. UTC | #2
Hi Simon,

On Tue, Jul 18, 2017 at 4:02 PM, Simon Glass <sjg@chromium.org> wrote:
> Hi Mario,
>
> On 14 July 2017 at 05:55, Mario Six <mario.six@gdsys.cc> wrote:
>> 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.six@gdsys.cc>
>> ---
>>
>>  cmd/Kconfig |  6 ++++++
>>  cmd/mdio.c  | 65 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
>>  2 files changed, 71 insertions(+)
>
> This seems reasonable, but we need to figure out how to use driver model.
>
> Regards,
> Simon

Probably with a MDIO/MII uclass, see my comment on patch 9 ("phy: Support
Marvell 88X2242").

Best regards,

Mario
diff mbox

Patch

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"