[net-tools-devel] [PATCH 4/5] mii-tool: add PHY register "Write" option
Linux networking base tools
Brought to you by:
eckes
|
From: Antonio B. <bor...@gm...> - 2013-01-18 14:03:15
|
Signed-off-by: Antonio Borneo <bor...@gm...>
---
man/en_US/mii-tool.8 | 8 ++++++++
mii-tool.c | 28 +++++++++++++++++++++++++---
2 files changed, 33 insertions(+), 3 deletions(-)
diff --git a/man/en_US/mii-tool.8 b/man/en_US/mii-tool.8
index 4657a7e..fc3bac8 100644
--- a/man/en_US/mii-tool.8
+++ b/man/en_US/mii-tool.8
@@ -17,6 +17,7 @@ mii\-tool \- view, manipulate media-independent interface status
[\fB\-A\fR, \fB\-\-advertise=\fImedia,...\fR]
[\fB\-F\fR, \fB\-\-force=\fImedia\fR]
[\fB\-p\fR, \fB\-\-phy=\fIaddr\fR]
+[\fB\-W\fR, \fB\-\-Write=\fIreg:val\fR]
.RI "interface\ ..."
.SH DESCRIPTION
@@ -73,6 +74,13 @@ commas. Valid media are \fB100baseT4\fR, \fB100baseTx-FD\fR,
.TP
\fB\-p\fI addr\fR, \fB\-\-phy=\fIaddr\fR
Override the MII address provided by kernel with value \fBaddr\fR.
+.TP
+\fB\-W\fI reg:val\fR, \fB\-\-Write=\fIreg:val\fR
+Write value \fBval\fR in PHY register \fBreg\fR.
+.br
+\fBAlert:\fR there is no check on parameter's value nor on potential
+result of this operation. Use of this command can compromise functionality
+of PHY and network.
.SH DIAGNOSTICS
.TP
diff --git a/mii-tool.c b/mii-tool.c
index 69f9642..87fff35 100644
--- a/mii-tool.c
+++ b/mii-tool.c
@@ -105,6 +105,7 @@ struct option longopts[] = {
{"verbose", 0, 0, 'v'}, /* Report each action taken. */
{"version", 0, 0, 'V'}, /* Emit version information. */
{"watch", 0, 0, 'w'}, /* Constantly monitor the port. */
+ {"Write", 1, 0, 'W'}, /* Write PHY register. */
{"help", 0, 0, '?'}, /* Give help */
{ 0, 0, 0, 0 }
};
@@ -115,10 +116,12 @@ static unsigned int
opt_restart = 0,
opt_reset = 0,
opt_log = 0,
- opt_watch = 0;
+ opt_watch = 0,
+ opt_write = 0;
static int nway_advertise = 0;
static int fixed_speed = 0;
static int override_phy = -1;
+static int write_reg, write_val;
static int skfd = -1; /* AF_INET socket for ioctl() calls. */
static struct ifreq ifr;
@@ -415,6 +418,11 @@ static int do_one_xcvr(int skfd, char *ifname, int maybe)
bmcr |= BMCR_FULLDPLX;
mdio_write(skfd, MII_BMCR, bmcr);
}
+ if (opt_write) {
+ if (verbose)
+ printf("Writing register %d = 0x%04x\n", write_reg, write_val);
+ mdio_write(skfd, write_reg, write_val);
+ }
if (!opt_restart && !opt_reset && !fixed_speed && !nway_advertise)
show_basic_mii(skfd, mii->phy_id);
@@ -458,6 +466,7 @@ const char *usage =
" -A, --advertise=media,... advertise only specified media\n"
" -F, --force=media force specified media technology\n"
" -p, --phy=addr set PHY (MII address) to report\n"
+" -W, --Write=reg:val write register\n"
"media: 1000baseTx-HD, 1000baseTx-FD,\n"
" 100baseT4, 100baseTx-FD, 100baseTx-HD,\n"
" 10baseT-FD, 10baseT-HD,\n"
@@ -475,8 +484,9 @@ int main(int argc, char **argv)
{
int i, c, ret, errflag = 0;
unsigned ctrl1000 = 0;
+ char *end;
- while ((c = getopt_long(argc, argv, "A:F:p:lrRvVw?", longopts, 0)) != EOF)
+ while ((c = getopt_long(argc, argv, "A:F:p:W:lrRvVw?", longopts, 0)) != EOF)
switch (c) {
case 'A': nway_advertise = parse_media(optarg, &ctrl1000); break;
case 'F': fixed_speed = parse_media(optarg, &ctrl1000); break;
@@ -487,7 +497,19 @@ int main(int argc, char **argv)
case 'V': opt_version++; break;
case 'w': opt_watch++; break;
case 'l': opt_log++; break;
- case '?': errflag++;
+ case '?': errflag++; break;
+ case 'W':
+ opt_write++;
+ write_reg = strtol(optarg, &end, 0);
+ if (write_reg < 0 || end == NULL || *end != ':') {
+ opt_write = 0;
+ break;
+ }
+ end++;
+ write_val = strtol(end, NULL, 0);
+ if (write_val < 0)
+ opt_write = 0;
+ break;
}
/* Check for a few inappropriate option combinations */
if (opt_watch) verbose = 0;
--
1.7.3.4
|