Hi Tim, On Fri, Feb 27, 2015 at 8:25 AM, Tim James <tim.ja...@macltd.com> wrote: > > When accessing PHY registers it is often desirable to only update > selected bits, so it is necessary to first read the current value > before writing back an modified value with the relevant bits > updated. > > To simplify this and to allow such operations to be incorporated > into simple shell scripts propose adding a 'modify' option to the > existing mii command, which takes a mask indicating the bits to > be updated in addition to a data value containing the new bits, > ie, <updated> = (<data> & <mask>) | (<current> & ~<mask>). > > Signed-off-by: Tim James <tim.ja...@macltd.com> > Cc: Nobuhiro Iwamatsu <iwama...@nigauri.org> >
Looks reasonable, but please run scripts/checkpatch.pl against your patch and fix the failures. > > --- a/common/cmd_mii.c > +++ b/common/cmd_mii.c > @@ -249,6 +249,7 @@ > 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 @@ > 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 @@ > 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]; > @@ -308,6 +310,8 @@ > extract_range(argv[3], ®lo, ®hi); > if (argc >= 5) > data = simple_strtoul (argv[4], NULL, 16); > + if (argc >= 6) > + mask = simple_strtoul (argv[5], NULL, 16); > } > > /* use current device */ > @@ -375,6 +379,24 @@ > } > } > } > + } else if (op[0] == 'm') { > + for (addr = addrlo; addr <= addrhi; addr++) { > + for (reg = reglo; reg <= reghi; reg++) { > + unsigned short current = 0; > + if (miiphy_read (devname, addr, reg, ¤t) != 0) { > + printf("Error reading from the PHY addr=%02x reg=%02x\n", > + addr, reg); > + rcode = 1; > + } else { > + unsigned short updated = (data & mask) | (current & ~mask); > + if (miiphy_write (devname, addr, reg, 0xFFFF & updated) != 0) { > + printf("Error writing to the PHY addr=%02x reg=%02x\n", > + addr, reg); > + rcode = 1; > + } > + } > + } > + } > } else if (strncmp(op, "du", 2) == 0) { > ushort regs[6]; > int ok = 1; > @@ -417,6 +439,7 @@ > last_reg_lo = reglo; > last_reg_hi = reghi; > last_data = data; > + last_mask = mask; > > return rcode; > } > @@ -424,13 +447,15 @@ > /***************************************************/ > > 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." > ); > > -- > Scanned by iCritical. > _______________________________________________ > U-Boot mailing list > U-Boot@lists.denx.de > http://lists.denx.de/mailman/listinfo/u-boot _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot