Re: [U-Boot] [PATCH] mii: add read-modify-write option to mii command

2015-03-24 Thread Joe Hershberger
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 @@
 charop[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, 0x  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


[U-Boot] [PATCH] mii: add read-modify-write option to mii command

2015-03-02 Thread Tim James
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

---

--- 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 @@
charop[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, 
0x  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