[U-Boot] [PATCH v3] NAND: add support for reading ONFI page table

Scott Wood scottwood at freescale.com
Tue Feb 15 00:46:07 CET 2011


On Mon, 14 Feb 2011 16:48:01 +0100
Florian Fainelli <florian at openwrt.org> wrote:

> From: Florian Fainelli <florian at openwrt.org>
> 
> This patch adds support for reading an ONFI page parameter from a NAND
> device supporting it. If this is the case, struct nand_chip onfi_version
> member contains the supported ONFI version, 0 otherwise.
> 
> This allows NAND drivers past nand_scan_ident to set the best timings for the
> NAND chip.
> 
> Signed-off-by: Florian Fainelli <florian at openwrt.org>
> ---
> Patch against your 'next' branch

The 'next' branch is old, since I haven't pushed anything to it yet this
cycle.  Base it on Wolfgang's 'next'.

> Changes since v1:
> - ifdef out ONFI detection code around CONFIG_SYS_NAND_ONFI_DETECTION
> - removed bogus comment
> - fixed busw variable usage
> - move non-ONFI detection code to its own function
> - fixed stylistic issues spotted by Scott
> 
> Changes since v2:
> - reduce lenght of some lines down to 80 columns
> - change chip->options consistently wrt to ONFI detected or not
> - removed extra spaces
> 
> diff --git a/drivers/mtd/nand/nand_base.c b/drivers/mtd/nand/nand_base.c
> index 5239c1f..7becb99 100644
> --- a/drivers/mtd/nand/nand_base.c
> +++ b/drivers/mtd/nand/nand_base.c
> @@ -2409,15 +2409,137 @@ static void nand_set_defaults(struct nand_chip *chip, int busw)
>  		chip->controller = &chip->hwcontrol;
>  }
> 
> +#ifdef CONFIG_SYS_NAND_ONFI_DETECTION
> +static u16 onfi_crc16(u16 crc, u8 const *p, size_t len)
> +{
> +	int i;
> +
> +	while (len--) {
> +		crc ^= *p++ << 8;
> +		for (i = 0; i < 8; i++)
> +			crc = (crc << 1) ^ ((crc & 0x8000) ? 0x8005 : 0);
> +	}
> +
> +	return crc;
> +}

Is this different from what's in lib/crc16.c (other than appearing to have
made a different speed/size tradeoff)?

> +#define ONFI_CRC_BASE	0x4F4E

Is this ONFI-specific, or standard for crc16?

> +
> +/*
> + * Check if the NAND chip is ONFI compliant, returns 1 if it is, 0 otherwise
> + */
> +static int nand_flash_detect_onfi(struct mtd_info *mtd,
> +					struct nand_chip *chip,
> +					int *busw)
> +{
[snip]
> +	chip->options &= ~NAND_CHIPOPTIONS_MSK;
> +	chip->options |= NAND_NO_READRDY & NAND_CHIPOPTIONS_MSK;

Won't this get overwritten by this later?

> +	/* Get chip options, preserve non chip based options */
> +	chip->options &= ~NAND_CHIPOPTIONS_MSK;
> +	chip->options |= type->options & NAND_CHIPOPTIONS_MSK;

-Scott



More information about the U-Boot mailing list