|
@@ -249,6 +249,7 @@ static uint last_addr_lo;
|
|
|
static uint last_addr_hi;
|
|
|
static uint last_reg_lo;
|
|
|
static uint last_reg_hi;
|
|
|
+static uint last_mask;
|
|
|
|
|
|
static void extract_range(
|
|
|
char * input,
|
|
@@ -272,7 +273,7 @@ static int do_mii(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
|
|
|
char op[2];
|
|
|
unsigned char addrlo, addrhi, reglo, reghi;
|
|
|
unsigned char addr, reg;
|
|
|
- unsigned short data;
|
|
|
+ unsigned short data, mask;
|
|
|
int rcode = 0;
|
|
|
const char *devname;
|
|
|
|
|
@@ -294,6 +295,7 @@ static int do_mii(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
|
|
|
reglo = last_reg_lo;
|
|
|
reghi = last_reg_hi;
|
|
|
data = last_data;
|
|
|
+ mask = last_mask;
|
|
|
|
|
|
if ((flag & CMD_FLAG_REPEAT) == 0) {
|
|
|
op[0] = argv[1][0];
|
|
@@ -307,7 +309,9 @@ static int do_mii(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
|
|
|
if (argc >= 4)
|
|
|
extract_range(argv[3], ®lo, ®hi);
|
|
|
if (argc >= 5)
|
|
|
- data = simple_strtoul (argv[4], NULL, 16);
|
|
|
+ data = simple_strtoul(argv[4], NULL, 16);
|
|
|
+ if (argc >= 6)
|
|
|
+ mask = simple_strtoul(argv[5], NULL, 16);
|
|
|
}
|
|
|
|
|
|
/* use current device */
|
|
@@ -375,6 +379,28 @@ static int do_mii(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
+ } else if (op[0] == 'm') {
|
|
|
+ for (addr = addrlo; addr <= addrhi; addr++) {
|
|
|
+ for (reg = reglo; reg <= reghi; reg++) {
|
|
|
+ unsigned short val = 0;
|
|
|
+ if (miiphy_read(devname, addr,
|
|
|
+ reg, &val)) {
|
|
|
+ printf("Error reading from the PHY");
|
|
|
+ printf(" addr=%02x", addr);
|
|
|
+ printf(" reg=%02x\n", reg);
|
|
|
+ rcode = 1;
|
|
|
+ } else {
|
|
|
+ val = (val & ~mask) | (data & mask);
|
|
|
+ if (miiphy_write(devname, addr,
|
|
|
+ reg, val)) {
|
|
|
+ printf("Error writing to the PHY");
|
|
|
+ printf(" addr=%02x", addr);
|
|
|
+ printf(" reg=%02x\n", reg);
|
|
|
+ rcode = 1;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
} else if (strncmp(op, "du", 2) == 0) {
|
|
|
ushort regs[6];
|
|
|
int ok = 1;
|
|
@@ -417,6 +443,7 @@ static int do_mii(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
|
|
|
last_reg_lo = reglo;
|
|
|
last_reg_hi = reghi;
|
|
|
last_data = data;
|
|
|
+ last_mask = mask;
|
|
|
|
|
|
return rcode;
|
|
|
}
|
|
@@ -424,13 +451,15 @@ static int do_mii(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
|
|
|
/***************************************************/
|
|
|
|
|
|
U_BOOT_CMD(
|
|
|
- mii, 5, 1, do_mii,
|
|
|
+ mii, 6, 1, do_mii,
|
|
|
"MII utility commands",
|
|
|
- "device - list available devices\n"
|
|
|
- "mii device <devname> - set current device\n"
|
|
|
- "mii info <addr> - display MII PHY info\n"
|
|
|
- "mii read <addr> <reg> - read MII PHY <addr> register <reg>\n"
|
|
|
- "mii write <addr> <reg> <data> - write MII PHY <addr> register <reg>\n"
|
|
|
- "mii dump <addr> <reg> - pretty-print <addr> <reg> (0-5 only)\n"
|
|
|
+ "device - list available devices\n"
|
|
|
+ "mii device <devname> - set current device\n"
|
|
|
+ "mii info <addr> - display MII PHY info\n"
|
|
|
+ "mii read <addr> <reg> - read MII PHY <addr> register <reg>\n"
|
|
|
+ "mii write <addr> <reg> <data> - write MII PHY <addr> register <reg>\n"
|
|
|
+ "mii modify <addr> <reg> <data> <mask> - modify MII PHY <addr> register <reg>\n"
|
|
|
+ " updating bits identified in <mask>\n"
|
|
|
+ "mii dump <addr> <reg> - pretty-print <addr> <reg> (0-5 only)\n"
|
|
|
"Addr and/or reg may be ranges, e.g. 2-7."
|
|
|
);
|