summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRussell King <rmk+kernel@armlinux.org.uk>2020-04-10 17:10:25 +0100
committerRussell King <rmk+kernel@armlinux.org.uk>2020-04-10 17:10:25 +0100
commite037b2aebd792ec54a0f8641728280de80efb838 (patch)
tree0313395122c7479eeb2f13234b3382ce5512b960
parentaafe03561694271e9d07bc0696b40d9a01dbcdbf (diff)
mii-diag: add support for arbitary register accessHEADmaster
Add support for accessing arbitary registers on the PHY for advanced debug and/or diagnosis. Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
-rw-r--r--mii-diag.c24
1 files changed, 23 insertions, 1 deletions
diff --git a/mii-diag.c b/mii-diag.c
index 5426603..713e09f 100644
--- a/mii-diag.c
+++ b/mii-diag.c
@@ -105,7 +105,7 @@ typedef u_int8_t u8;
#define SIOCSPARAMS (SIOCDEVPRIVATE+4) /* Set operational parameters. */
#endif
-const char shortopts[] = "aA:C:DfF:gG:hmM:p:rRsvVw?";
+const char shortopts[] = "aA:C:DfF:gG:hmM:p:rRsvVwW:?";
struct option longopts[] = {
/* { name has_arg *flag val } */
{"all-interfaces", 0, 0, 'a'}, /* Show all interfaces. */
@@ -155,6 +155,7 @@ static int nway_advertise = 0;
static int fixed_speed = -1;
static int override_phy = -1;
char *opt_G_string = NULL;
+char *opt_W_string = NULL;
/* Internal values. */
int new_ioctl_nums;
@@ -200,6 +201,7 @@ main(int argc, char **argv)
case 'v': verbose++; break;
case 'V': opt_version++; break;
case 'w': opt_watch++; break;
+ case 'W': opt_W_string = strdup(optarg); break;
case '?': errflag++; break;
}
if (errflag) {
@@ -340,6 +342,26 @@ int do_one_xcvr(int skfd)
}
}
+ if (opt_W_string) {
+ char *next = opt_W_string;
+ do {
+ unsigned long reg = strtoul(next, &next, 0);
+
+ if (*next == '=') {
+ unsigned long val = strtoul(++next, &next, 0);
+
+ printf("Writing 0x%4.4lx=0x%4.4lx\n", reg, val);
+ mdio_write(skfd, phy_id, reg, val);
+ } else {
+ int val = mdio_read(skfd, phy_id, reg);
+ if (val < 0)
+ val = 0;
+ printf("Reading 0x%4.4lx=0x%4.4x\n", reg, val);
+ }
+ } while (next && *next++ == ',');
+ return 0;
+ }
+
if (opt_reset) {
printf("Resetting the transceiver...\n");
mdio_write(skfd, phy_id, 0, 0x8000);