public inbox for u-boot@lists.denx.de
 help / color / mirror / Atom feed
From: Scott Wood <scottwood@freescale.com>
To: u-boot@lists.denx.de
Subject: [U-Boot-Users] [PATCH]env_nand.c Added bad block management for environment variables
Date: Thu, 29 May 2008 12:30:40 -0500	[thread overview]
Message-ID: <483EE840.6030002@freescale.com> (raw)
In-Reply-To: <c13b1cfc0805291014l1c569e4icdb68b22df5fc8d6@mail.gmail.com>

Stuart Wood wrote:
> Scott,
> 
> Here is a new version of my patch to env_nand.c. Thanks for the good comments.
> Fixed a problem with the new code that allowed it to read a
> environment area even
> if it contained a bad block after the good environment data.

Please put comments such as these that don't belong in the commit 
message below a --- line, with the commit message and a signed-off-by 
above it.

> diff --git a/common/env_nand.c b/common/env_nand.c
> index 49742f5..3ee42e0 100644
> --- a/common/env_nand.c
> +++ b/common/env_nand.c
> @@ -1,4 +1,7 @@
>  /*
> + * (C) Copywrite 2008
> + * Stuart Wood, Lab X Technologies <stuart.wood@labxtechnologies.com>
> + *
>   * (C) Copyright 2004

It's spelled "Copyright" (as in the "right" to "copy").
Just like the one below it. :-)

>   * Jian Zhang, Texas Instruments, jzhang at ti.com.
> 
> @@ -53,6 +56,10 @@
>  #error CONFIG_INFERNO not supported yet
>  #endif
> 
> +#ifndef CFG_ENV_RANGE
> +#define CFG_ENV_RANGE	CFG_ENV_SIZE
> +#endif
> +
>  int nand_legacy_rw (struct nand_chip* nand, int cmd,
>  	    size_t start, size_t len,
>  	    size_t * retlen, u_char * buf);
> @@ -152,30 +159,57 @@ int env_init(void)
>   * nand_dev_desc + 0. This is also the behaviour using the new NAND code.
>   */
>  #ifdef CFG_ENV_OFFSET_REDUND
> +size_t erase_env(size_t offset)
> +{

erase_env() should not be within this ifdef.

> +	size_t end;
> +
> +	end = offset + CFG_ENV_RANGE;
> +
> +	while (offset < end && nand_erase(&nand_info[0],offset, CFG_ENV_SIZE))

Spaces after commas.

> +		offset += CFG_ENV_SIZE;
> +
> +	if (offset >= end)
> +		return 0;
> +
> +	return offset;
> +}

What if the offset is zero?  Should return -1 or something similar on error.

> @@ -208,10 +250,26 @@ int saveenv(void)
>  #endif /* CMD_SAVEENV */
> 
>  #ifdef CFG_ENV_OFFSET_REDUND
> +int check_env_size (size_t offset)
> +{

What about the non-redundant version of env_relocate_spec?
Also, this isn't checking the size, so it's not really an appropriate name.

> +	size_t end;
> +	int ret_val = 0;
> +	end = offset + CFG_ENV_SIZE;
> +
> +	for (; offset < end; offset += nand_info[0].erasesize) {
> +		if (nand_block_isbad(&nand_info[0],offset))
> +			ret_val = 1;
> +	}
> +
> +	return ret_val;

size_t end = offset + CFG_ENV_SIZE;

while (offset < end)
	if (nand_block_isbad(&nand_info[0], offset))
		return 1;

return 0;

> @@ -220,10 +278,27 @@ void env_relocate_spec (void)
>  	tmp_env1 = (env_t *) malloc(CFG_ENV_SIZE);
>  	tmp_env2 = (env_t *) malloc(CFG_ENV_SIZE);
> 
> -	nand_read(&nand_info[0], CFG_ENV_OFFSET, &total,
> -		  (u_char*) tmp_env1);
> -	nand_read(&nand_info[0], CFG_ENV_OFFSET_REDUND, &total,
> -		  (u_char*) tmp_env2);
> +	offset = CFG_ENV_OFFSET;
> +	end = offset + CFG_ENV_RANGE;
> +
> +	while (offset < end && check_env_size(offset)) {
> +		offset += CFG_ENV_SIZE;
> +	}
> +	if (offset >= end)
> +		puts("No Valid Environment Area Found\n");
> +	else
> +		nand_read(&nand_info[0], offset, &total, (u_char*) tmp_env1);

If the environment can span multiple blocks, we should be able to skip 
blocks internally rather than requiring contiguous good blocks.

-Scott

  reply	other threads:[~2008-05-29 17:30 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-05-27 14:01 [U-Boot-Users] [PATCH]env_nand.c Added bad block management for environment variables Stuart Wood
2008-05-28 17:57 ` Scott Wood
2008-05-29 17:14   ` Stuart Wood
2008-05-29 17:30     ` Scott Wood [this message]
2008-05-29 17:32       ` Scott Wood
2008-05-30 15:14         ` Stuart Wood
2008-05-30 17:28           ` Scott Wood
2008-05-30 20:05             ` Stuart Wood
2008-06-02 20:03               ` Scott Wood

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=483EE840.6030002@freescale.com \
    --to=scottwood@freescale.com \
    --cc=u-boot@lists.denx.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox