[U-Boot] [PATCH] mii: add read-modify-write option to mii command
Joe Hershberger
joe.hershberger at gmail.com
Wed Mar 25 05:08:50 CET 2015
Hi Tim,
On Fri, Feb 27, 2015 at 8:25 AM, Tim James <tim.james at 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.james at macltd.com>
> Cc: Nobuhiro Iwamatsu <iwamatsu at 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 at lists.denx.de
> http://lists.denx.de/mailman/listinfo/u-boot
More information about the U-Boot
mailing list