From mboxrd@z Thu Jan 1 00:00:00 1970 From: Detlev Zundel Date: Wed, 09 Mar 2011 14:21:14 +0100 Subject: [U-Boot] cfi: Problem with Intel Strata 28F320 flash In-Reply-To: <4D77211F.9090203@denx.de> (Heiko Schocher's message of "Wed, 09 Mar 2011 07:41:35 +0100") References: <4D762A4A.8070002@denx.de> <20110308142651.GA26540@frolo.macqel> <4D77211F.9090203@denx.de> Message-ID: List-Id: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: u-boot@lists.denx.de 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