
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)
case CFI_CMDSET_AMD_EXTENDED:enable_interrupts (); } break;
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