[U-Boot] [PATCH] Add +size syntax to nand commands to pad lengths to page sizes.

Scott Wood scottwood at freescale.com
Mon May 11 21:37:12 CEST 2009


On Fri, May 01, 2009 at 04:24:20PM -0400, Josh Karabin wrote:
> @@ -119,8 +121,12 @@ arg_off_size(int argc, char *argv[], nand_info_t *nand, ulong *off, size_t *size
>  			}
>  			*off = part->offset;
>  			if (argc >= 2) {
> -				if (!(str2long(argv[1], (ulong *)size))) {
> -					printf("'%s' is not a number\n", argv[1]);
> +				if (plussed && *ps == '+') {
> +					*plussed = 1;
> +					ps++;
> +				}
> +				if (!(str2long(ps, (ulong *)size))) {
> +					printf("'%s' is not a number\n", ps);
>  					return -1;
>  				}
>  				if (*size > part->size)
> @@ -145,8 +151,12 @@ arg_off_size(int argc, char *argv[], nand_info_t *nand, ulong *off, size_t *size
>  	}
>  
>  	if (argc >= 2) {
> -		if (!(str2long(argv[1], (ulong *)size))) {
> -			printf("'%s' is not a number\n", argv[1]);
> +		if (plussed && *ps == '+') {
> +			*plussed = 1;
> +			ps++;
> +		}
> +		if (!(str2long(ps, (ulong *)size))) {
> +			printf("'%s' is not a number\n", ps);
>  			return -1;

Hmm... would be nice to untangle the duplicated code path rather than add
more stuff to both branches.

> @@ -317,7 +327,7 @@ int do_nand(cmd_tbl_t * cmdtp, int flag, int argc, char *argv[])
>  
>  		printf("\nNAND %s: ", scrub ? "scrub" : "erase");
>  		/* skip first two or three arguments, look for offset and size */
> -		if (arg_off_size(argc - o, argv + o, nand, &off, &size) != 0)
> +		if (arg_off_size(argc - o, argv + o, nand, &off, &size, NULL) != 0)
>  			return 1;
>  
>  		memset(&opts, 0, sizeof(opts));
> @@ -378,8 +388,18 @@ int do_nand(cmd_tbl_t * cmdtp, int flag, int argc, char *argv[])
>  
>  		read = strncmp(cmd, "read", 4) == 0; /* 1 = read, 0 = write */
>  		printf("\nNAND %s: ", read ? "read" : "write");
> -		if (arg_off_size(argc - 3, argv + 3, nand, &off, &size) != 0)
> +		if (read && arg_off_size(argc - 3, argv + 3, nand, &off, &size, NULL) != 0)
>  			return 1;
> +		else if (!read) {
> +			int plussed = 0;
> +			if (arg_off_size(argc - 3, argv + 3, nand, &off, &size, &plussed) != 0)
> +				return 1;

Why not support plussed for read as well?

> +			if (plussed) {
> +				int tailsize = size & (nand->writesize - 1);
> +				memset ((u_char *)addr + size, 0xff, nand->writesize - tailsize);
> +				size += nand->writesize - tailsize;

NACK, you cannot write to arbitrary memory beyond the end of the range
specified.  Allocate a buffer to hold the partial page.

Plus, this will append an entire page of padding if the size does happen
to be page-aligned.

> +			}
> +		}

Please keep lines under 80 characters.

-Scott


More information about the U-Boot mailing list