[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], &reglo, &reghi);
>                 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,
&current) != 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