diff options
Diffstat (limited to 'mii-diag.c')
-rw-r--r-- | mii-diag.c | 24 |
1 files changed, 23 insertions, 1 deletions
@@ -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); |