[U-Boot] [PATCH 2/2] cmd_sf: Add handler for +len arg for erase command.

2011-02-16 Thread Richard Retanubun
This patch adds [+]len handler for the erase command that will
automatically round up the requested erase length to the flash's
sector_size.
---
 common/cmd_sf.c |   53 +
 1 files changed, 49 insertions(+), 4 deletions(-)

diff --git a/common/cmd_sf.c b/common/cmd_sf.c
index 6e7be81..bbd4842 100644
--- a/common/cmd_sf.c
+++ b/common/cmd_sf.c
@@ -19,6 +19,48 @@
 
 static struct spi_flash *flash;
 
+
+/*
+ * This function computes the length argument for the erase command.
+ * The length on which the command is to operate can be given in two forms:
+ * 1. cmd offset len  - operate on 'offset',  'len')
+ * 2. cmd offset +len - operate on 'offset',  'round_up(len)')
+ * If the second form is used and the length doesn't fall on the
+ * sector boundary, than it will be adjusted to the next sector boundary.
+ * If it isn't in the flash, the function will fail (return -1).
+ * Input:
+ *arg: length specification (i.e. both command arguments)
+ * Output:
+ *len: computed length for operation
+ * Return:
+ *1: success
+ *   -1: failure (bad format, bad address).
+*/
+static int sf_parse_len_arg(char *arg, ulong *len)
+{
+   char *ep;
+   char round_up_len; /* indicates if the +length form used */
+   ulong len_arg;
+
+
+   round_up_len = 0;
+   if (*arg == '+'){
+   round_up_len = 1;
+   ++arg;
+   }
+
+   len_arg = simple_strtoul(arg, ep, 16);
+   if (ep == arg || *ep != '\0')
+   return -1;
+
+   if (round_up_len  flash-sector_size  0)
+   *len = DIV_ROUND_UP(len_arg, flash-sector_size);
+   else
+   *len = len_arg;
+
+   return 1;
+}
+
 static int do_spi_flash_probe(int argc, char * const argv[])
 {
unsigned int bus = 0;
@@ -135,9 +177,11 @@ static int do_spi_flash_erase(int argc, char * const 
argv[])
offset = simple_strtoul(argv[1], endp, 16);
if (*argv[1] == 0 || *endp != 0)
goto usage;
-   len = simple_strtoul(argv[2], endp, 16);
-   if (*argv[2] == 0 || *endp != 0)
+
+   ret = sf_parse_len_arg(argv[2], len);
+   if (ret != 1) {
goto usage;
+   }
 
ret = spi_flash_erase(flash, offset, len);
if (ret) {
@@ -148,7 +192,7 @@ static int do_spi_flash_erase(int argc, char * const argv[])
return 0;
 
 usage:
-   puts(Usage: sf erase offset len\n);
+   puts(Usage: sf erase offset [+]len\n);
return 1;
 }
 
@@ -189,5 +233,6 @@ U_BOOT_CMD(
 `offset' to memory at `addr'\n
sf write addr offset len   - write `len' bytes from memory\n
 at `addr' to flash at `offset'\n
-   sf erase offset len- erase `len' bytes from `offset'
+   sf erase offset [+]len - erase `len' bytes from `offset'\n
+`+len' round up `len' to block size
 );
-- 
1.7.2.3

___
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot


Re: [U-Boot] [PATCH 2/2] cmd_sf: Add handler for +len arg for erase command.

2011-02-16 Thread Wolfgang Denk
Dear Richard Retanubun,

In message 1297888074-8344-3-git-send-email-richardretanu...@ruggedcom.com 
you wrote:
 This patch adds [+]len handler for the erase command that will
 automatically round up the requested erase length to the flash's
 sector_size.
 ---
  common/cmd_sf.c |   53 +
  1 files changed, 49 insertions(+), 4 deletions(-)

Please run your patches through checkpatch - this helps avoiding the
frustration of seeing rejects due to simple issues like these:

ERROR: Missing Signed-off-by: line(s)

 + if (*arg == '+'){

ERROR: space required before the open brace '{'

 + if (ret != 1) {
   goto usage;
 + }

WARNING: braces {} are not necessary for single statement blocks

Best regards,

Wolfgang Denk

-- 
DENX Software Engineering GmbH, MD: Wolfgang Denk  Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: w...@denx.de
All these theories, diverse as they are, have two things  in  common:
they explain the observed facts, and they are completeley and utterly
wrong.   - Terry Pratchett, _The Light Fantastic_
___
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot


[U-Boot] [PATCH 2/2] cmd_sf: Add handler for +len arg for erase command.

2011-02-16 Thread Richard Retanubun
This patch adds [+]len handler for the erase command that will
automatically round up the requested erase length to the flash's
sector_size.

Signed-off-by: Richard Retanubun richardretanu...@ruggedcom.com
---
v2: scrubbed via checkpatch, thanks WD!

 common/cmd_sf.c |   52 
 1 files changed, 48 insertions(+), 4 deletions(-)

diff --git a/common/cmd_sf.c b/common/cmd_sf.c
index 6e7be81..17a4dd8 100644
--- a/common/cmd_sf.c
+++ b/common/cmd_sf.c
@@ -19,6 +19,48 @@
 
 static struct spi_flash *flash;
 
+
+/*
+ * This function computes the length argument for the erase command.
+ * The length on which the command is to operate can be given in two forms:
+ * 1. cmd offset len  - operate on 'offset',  'len')
+ * 2. cmd offset +len - operate on 'offset',  'round_up(len)')
+ * If the second form is used and the length doesn't fall on the
+ * sector boundary, than it will be adjusted to the next sector boundary.
+ * If it isn't in the flash, the function will fail (return -1).
+ * Input:
+ *arg: length specification (i.e. both command arguments)
+ * Output:
+ *len: computed length for operation
+ * Return:
+ *1: success
+ *   -1: failure (bad format, bad address).
+*/
+static int sf_parse_len_arg(char *arg, ulong *len)
+{
+   char *ep;
+   char round_up_len; /* indicates if the +length form used */
+   ulong len_arg;
+
+
+   round_up_len = 0;
+   if (*arg == '+') {
+   round_up_len = 1;
+   ++arg;
+   }
+
+   len_arg = simple_strtoul(arg, ep, 16);
+   if (ep == arg || *ep != '\0')
+   return -1;
+
+   if (round_up_len  flash-sector_size  0)
+   *len = DIV_ROUND_UP(len_arg, flash-sector_size);
+   else
+   *len = len_arg;
+
+   return 1;
+}
+
 static int do_spi_flash_probe(int argc, char * const argv[])
 {
unsigned int bus = 0;
@@ -135,8 +177,9 @@ static int do_spi_flash_erase(int argc, char * const argv[])
offset = simple_strtoul(argv[1], endp, 16);
if (*argv[1] == 0 || *endp != 0)
goto usage;
-   len = simple_strtoul(argv[2], endp, 16);
-   if (*argv[2] == 0 || *endp != 0)
+
+   ret = sf_parse_len_arg(argv[2], len);
+   if (ret != 1)
goto usage;
 
ret = spi_flash_erase(flash, offset, len);
@@ -148,7 +191,7 @@ static int do_spi_flash_erase(int argc, char * const argv[])
return 0;
 
 usage:
-   puts(Usage: sf erase offset len\n);
+   puts(Usage: sf erase offset [+]len\n);
return 1;
 }
 
@@ -189,5 +232,6 @@ U_BOOT_CMD(
 `offset' to memory at `addr'\n
sf write addr offset len   - write `len' bytes from memory\n
 at `addr' to flash at `offset'\n
-   sf erase offset len- erase `len' bytes from `offset'
+   sf erase offset [+]len - erase `len' bytes from `offset'\n
+`+len' round up `len' to block size
 );
-- 
1.7.2.3

___
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot


Re: [U-Boot] [PATCH 2/2] cmd_sf: Add handler for +len arg for erase command.

2011-02-16 Thread Scott Wood
On Wed, 16 Feb 2011 15:27:54 -0500
Richard Retanubun richardretanu...@ruggedcom.com wrote:

 This patch adds [+]len handler for the erase command that will
 automatically round up the requested erase length to the flash's
 sector_size.
 ---
  common/cmd_sf.c |   53 +
  1 files changed, 49 insertions(+), 4 deletions(-)
 
 diff --git a/common/cmd_sf.c b/common/cmd_sf.c
 index 6e7be81..bbd4842 100644
 --- a/common/cmd_sf.c
 +++ b/common/cmd_sf.c
 @@ -19,6 +19,48 @@
  
  static struct spi_flash *flash;
  
 +
 +/*
 + * This function computes the length argument for the erase command.
 + * The length on which the command is to operate can be given in two forms:
 + * 1. cmd offset len  - operate on 'offset',  'len')
 + * 2. cmd offset +len - operate on 'offset',  'round_up(len)')
 + * If the second form is used and the length doesn't fall on the
 + * sector boundary, than it will be adjusted to the next sector boundary.
 + * If it isn't in the flash, the function will fail (return -1).

On NOR, + is used to indicate that the second argument is a length,
as opposed to an ending address.  Rounding seems like a side effect of
length mode.

On NAND we unconditionally round up erase lengths, as we don't support
ending-address mode (looks like SPI doesn't either).

-Scott

___
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot