[U-Boot] cfi: Problem with Intel Strata 28F320 flash

Detlev Zundel dzu at denx.de
Wed Mar 9 14:21:14 CET 2011


Hi Heiko,

> Maybe a way to go ... more comments?
>
> Below a patch, which introduces a function, which checks for
> "protection bugfixes", and if no bugfix is found the old code is
> executed. Just a fast RFC patch.
>
> bye,
> Heiko
>
> diff --git a/drivers/mtd/cfi_flash.c b/drivers/mtd/cfi_flash.c
> index dd394a8..9d3fdcc 100644
> --- a/drivers/mtd/cfi_flash.c
> +++ b/drivers/mtd/cfi_flash.c
> @@ -1376,6 +1376,38 @@ int write_buff (flash_info_t * info, uchar * src, ulong addr, ulong cnt)
>   */
>  #ifdef CONFIG_SYS_FLASH_PROTECTION
>
> +static int cfi_protect_bugfix(flash_info_t * info, long sector, int prot)
> +{
> +	if ((info->manufacturer_id == 0x89) && (info->device_id == 0x8922)) {
> +		/*
> +		 * see errata called
> +		 * "Numonyx Axcell P33/P30 Specification Update" :)
> +		 */
> +		flash_write_cmd (info, sector, 0, FLASH_CMD_READ_ID);
> +		if (!flash_isequal (info, sector, FLASH_OFFSET_PROTECT,
> +				    prot)) {
> +			/*
> +			 * cmd must come before FLASH_CMD_PROTECT + 20us
> +			 * Disable interrupts which might cause a timeout here.
> +			 */
> +			int flag = disable_interrupts ();
> +			unsigned short cmd;
> +				if (prot)
> +				cmd = FLASH_CMD_PROTECT_SET;
> +			else
> +				cmd = FLASH_CMD_PROTECT_CLEAR;
> +				flash_write_cmd (info, sector, 0,
> +					  FLASH_CMD_PROTECT);
> +			flash_write_cmd (info, sector, 0, cmd);
> +			/* re-enable interrupts if necessary */
> +			if (flag)
> +				enable_interrupts ();
> +		}
> +		return 1;
> +	}
> +	return 0;
> +}
> +
>  int flash_real_protect (flash_info_t * info, long sector, int prot)
>  {
>  	int retcode = 0;
> @@ -1384,31 +1416,18 @@ int flash_real_protect (flash_info_t * info, long sector, int prot)
>  		case CFI_CMDSET_INTEL_PROG_REGIONS:
>  		case CFI_CMDSET_INTEL_STANDARD:
>  		case CFI_CMDSET_INTEL_EXTENDED:
> -			/*
> -			 * see errata called
> -			 * "Numonyx Axcell P33/P30 Specification Update" :)
> -			 */
> -			flash_write_cmd (info, sector, 0, FLASH_CMD_READ_ID);
> -			if (!flash_isequal (info, sector, FLASH_OFFSET_PROTECT,
> -					    prot)) {
> -				/*
> -				 * cmd must come before FLASH_CMD_PROTECT + 20us
> -				 * Disable interrupts which might cause a timeout here.
> -				 */
> -				int flag = disable_interrupts ();
> -				unsigned short cmd;
> -
> +			if (!cfi_protect_bugfix(info, sector, prot)) {
> +				flash_write_cmd (info, sector, 0,
> +					 FLASH_CMD_CLEAR_STATUS);
> +				flash_write_cmd (info, sector, 0,
> +					FLASH_CMD_PROTECT);
>  				if (prot)
> -					cmd = FLASH_CMD_PROTECT_SET;
> +					flash_write_cmd (info, sector, 0,
> +						FLASH_CMD_PROTECT_SET);
>  				else
> -					cmd = FLASH_CMD_PROTECT_CLEAR;
> +					flash_write_cmd (info, sector, 0,
> +						FLASH_CMD_PROTECT_CLEAR);
>
> -				flash_write_cmd (info, sector, 0,
> -						  FLASH_CMD_PROTECT);
> -				flash_write_cmd (info, sector, 0, cmd);
> -				/* re-enable interrupts if necessary */
> -				if (flag)
> -					enable_interrupts ();
>  			}
>  			break;
>  		case CFI_CMDSET_AMD_EXTENDED:

Can't we introduce a field "chip_quirk" in flash_info_t, and upon flash
enumeration check for the specific chip version and for example put a
CFI_QUIRK_PROTECT in it for this chip.  The core code can then check for
this flag and call functions appropriately.

In other words, why not introduce a generic infrastructure for handling
chip quirks that may need different handling for other functions also.

Cheers
  Detlev

-- 
Programming X-Windows is like trying to find the square root of pi
using roman numerals.
                                          -- The UNIX Haters Handbook
--
DENX Software Engineering GmbH,      MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich,  Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: (+49)-8142-66989-40 Fax: (+49)-8142-66989-80 Email: dzu at denx.de


More information about the U-Boot mailing list