|
@@ -581,6 +581,7 @@ static int flash_status_check (flash_info_t * info, flash_sect_t sector,
|
|
prompt, info->start[sector],
|
|
prompt, info->start[sector],
|
|
flash_read_long (info, sector, 0));
|
|
flash_read_long (info, sector, 0));
|
|
flash_write_cmd (info, sector, 0, info->cmd_reset);
|
|
flash_write_cmd (info, sector, 0, info->cmd_reset);
|
|
|
|
+ udelay(1);
|
|
return ERR_TIMOUT;
|
|
return ERR_TIMOUT;
|
|
}
|
|
}
|
|
udelay (1); /* also triggers watchdog */
|
|
udelay (1); /* also triggers watchdog */
|
|
@@ -628,6 +629,7 @@ static int flash_full_status_check (flash_info_t * info, flash_sect_t sector,
|
|
puts ("Vpp Low Error.\n");
|
|
puts ("Vpp Low Error.\n");
|
|
}
|
|
}
|
|
flash_write_cmd (info, sector, 0, info->cmd_reset);
|
|
flash_write_cmd (info, sector, 0, info->cmd_reset);
|
|
|
|
+ udelay(1);
|
|
break;
|
|
break;
|
|
default:
|
|
default:
|
|
break;
|
|
break;
|
|
@@ -1202,8 +1204,9 @@ void flash_print_info (flash_info_t * info)
|
|
info->manufacturer_id);
|
|
info->manufacturer_id);
|
|
printf (info->chipwidth == FLASH_CFI_16BIT ? "%04X" : "%02X",
|
|
printf (info->chipwidth == FLASH_CFI_16BIT ? "%04X" : "%02X",
|
|
info->device_id);
|
|
info->device_id);
|
|
- if (info->device_id == 0x7E) {
|
|
|
|
- printf("%04X", info->device_id2);
|
|
|
|
|
|
+ if ((info->device_id & 0xff) == 0x7E) {
|
|
|
|
+ printf(info->chipwidth == FLASH_CFI_16BIT ? "%04X" : "%02X",
|
|
|
|
+ info->device_id2);
|
|
}
|
|
}
|
|
printf ("\n Erase timeout: %ld ms, write timeout: %ld ms\n",
|
|
printf ("\n Erase timeout: %ld ms, write timeout: %ld ms\n",
|
|
info->erase_blk_tout,
|
|
info->erase_blk_tout,
|
|
@@ -1490,6 +1493,7 @@ void flash_read_user_serial (flash_info_t * info, void *buffer, int offset,
|
|
flash_write_cmd (info, 0, 0, FLASH_CMD_READ_ID);
|
|
flash_write_cmd (info, 0, 0, FLASH_CMD_READ_ID);
|
|
memcpy (dst, src + offset, len);
|
|
memcpy (dst, src + offset, len);
|
|
flash_write_cmd (info, 0, 0, info->cmd_reset);
|
|
flash_write_cmd (info, 0, 0, info->cmd_reset);
|
|
|
|
+ udelay(1);
|
|
flash_unmap(info, 0, FLASH_OFFSET_USER_PROTECTION, src);
|
|
flash_unmap(info, 0, FLASH_OFFSET_USER_PROTECTION, src);
|
|
}
|
|
}
|
|
|
|
|
|
@@ -1505,6 +1509,7 @@ void flash_read_factory_serial (flash_info_t * info, void *buffer, int offset,
|
|
flash_write_cmd (info, 0, 0, FLASH_CMD_READ_ID);
|
|
flash_write_cmd (info, 0, 0, FLASH_CMD_READ_ID);
|
|
memcpy (buffer, src + offset, len);
|
|
memcpy (buffer, src + offset, len);
|
|
flash_write_cmd (info, 0, 0, info->cmd_reset);
|
|
flash_write_cmd (info, 0, 0, info->cmd_reset);
|
|
|
|
+ udelay(1);
|
|
flash_unmap(info, 0, FLASH_OFFSET_INTEL_PROTECTION, src);
|
|
flash_unmap(info, 0, FLASH_OFFSET_INTEL_PROTECTION, src);
|
|
}
|
|
}
|
|
|
|
|
|
@@ -1536,6 +1541,7 @@ static void cfi_reverse_geometry(struct cfi_qry *qry)
|
|
static void cmdset_intel_read_jedec_ids(flash_info_t *info)
|
|
static void cmdset_intel_read_jedec_ids(flash_info_t *info)
|
|
{
|
|
{
|
|
flash_write_cmd(info, 0, 0, FLASH_CMD_RESET);
|
|
flash_write_cmd(info, 0, 0, FLASH_CMD_RESET);
|
|
|
|
+ udelay(1);
|
|
flash_write_cmd(info, 0, 0, FLASH_CMD_READ_ID);
|
|
flash_write_cmd(info, 0, 0, FLASH_CMD_READ_ID);
|
|
udelay(1000); /* some flash are slow to respond */
|
|
udelay(1000); /* some flash are slow to respond */
|
|
info->manufacturer_id = flash_read_uchar (info,
|
|
info->manufacturer_id = flash_read_uchar (info,
|
|
@@ -1599,11 +1605,20 @@ static void cmdset_amd_read_jedec_ids(flash_info_t *info)
|
|
case FLASH_CFI_16BIT:
|
|
case FLASH_CFI_16BIT:
|
|
info->device_id = flash_read_word (info,
|
|
info->device_id = flash_read_word (info,
|
|
FLASH_OFFSET_DEVICE_ID);
|
|
FLASH_OFFSET_DEVICE_ID);
|
|
|
|
+ if ((info->device_id & 0xff) == 0x7E) {
|
|
|
|
+ /* AMD 3-byte (expanded) device ids */
|
|
|
|
+ info->device_id2 = flash_read_uchar (info,
|
|
|
|
+ FLASH_OFFSET_DEVICE_ID2);
|
|
|
|
+ info->device_id2 <<= 8;
|
|
|
|
+ info->device_id2 |= flash_read_uchar (info,
|
|
|
|
+ FLASH_OFFSET_DEVICE_ID3);
|
|
|
|
+ }
|
|
break;
|
|
break;
|
|
default:
|
|
default:
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
flash_write_cmd(info, 0, 0, AMD_CMD_RESET);
|
|
flash_write_cmd(info, 0, 0, AMD_CMD_RESET);
|
|
|
|
+ udelay(1);
|
|
}
|
|
}
|
|
|
|
|
|
static int cmdset_amd_init(flash_info_t *info, struct cfi_qry *qry)
|
|
static int cmdset_amd_init(flash_info_t *info, struct cfi_qry *qry)
|
|
@@ -1730,6 +1745,7 @@ void __flash_cmd_reset(flash_info_t *info)
|
|
* that AMD flash roms ignore the Intel command.
|
|
* that AMD flash roms ignore the Intel command.
|
|
*/
|
|
*/
|
|
flash_write_cmd(info, 0, 0, AMD_CMD_RESET);
|
|
flash_write_cmd(info, 0, 0, AMD_CMD_RESET);
|
|
|
|
+ udelay(1);
|
|
flash_write_cmd(info, 0, 0, FLASH_CMD_RESET);
|
|
flash_write_cmd(info, 0, 0, FLASH_CMD_RESET);
|
|
}
|
|
}
|
|
void flash_cmd_reset(flash_info_t *info)
|
|
void flash_cmd_reset(flash_info_t *info)
|
|
@@ -1852,9 +1868,10 @@ static void flash_fixup_stm(flash_info_t *info, struct cfi_qry *qry)
|
|
if (qry->num_erase_regions > 1) {
|
|
if (qry->num_erase_regions > 1) {
|
|
/* reverse geometry if top boot part */
|
|
/* reverse geometry if top boot part */
|
|
if (info->cfi_version < 0x3131) {
|
|
if (info->cfi_version < 0x3131) {
|
|
- /* CFI < 1.1, guess by device id (M29W320{DT,ET} only) */
|
|
|
|
- if (info->device_id == 0x22CA ||
|
|
|
|
- info->device_id == 0x2256) {
|
|
|
|
|
|
+ /* CFI < 1.1, guess by device id */
|
|
|
|
+ if (info->device_id == 0x22CA || /* M29W320DT */
|
|
|
|
+ info->device_id == 0x2256 || /* M29W320ET */
|
|
|
|
+ info->device_id == 0x22D7) { /* M29W800DT */
|
|
cfi_reverse_geometry(qry);
|
|
cfi_reverse_geometry(qry);
|
|
}
|
|
}
|
|
}
|
|
}
|