At long last, the day has come, and we can bury full-chip erase once and for all. Back in November 2008(!) I proposed the first version of the flexible sector-based erase structure, and now we can finally rip out the old full-chip erase code without ill effects. Rejoice and party!
Signed-off-by: Carl-Daniel Hailfinger c-d.hailfinger.devel.2006@gmx.net
Index: flashrom-kill_chip_erase/flash.h =================================================================== --- flashrom-kill_chip_erase/flash.h (Revision 894) +++ flashrom-kill_chip_erase/flash.h (Arbeitskopie) @@ -184,21 +184,20 @@ /* * Indicate if flashrom has been tested with this flash chip and if * everything worked correctly. */ uint32_t tested;
int (*probe) (struct flashchip *flash);
/* Delay after "enter/exit ID mode" commands in microseconds. */ int probe_timing; - int (*erase) (struct flashchip *flash);
/* * Erase blocks and associated erase function. Any chip erase function * is stored as chip-sized virtual block together with said function. */ struct block_eraser { struct eraseblock{ unsigned int size; /* Eraseblock size */ unsigned int count; /* Number of contiguous blocks with that size */ } eraseblocks[NUM_ERASEREGIONS]; Index: flashrom-kill_chip_erase/flashchips.c =================================================================== --- flashrom-kill_chip_erase/flashchips.c (Revision 894) +++ flashrom-kill_chip_erase/flashchips.c (Arbeitskopie) @@ -37,21 +37,20 @@ * .vendor = Vendor name * .name = Chip name * .bustype = Supported flash bus types (Parallel, LPC...) * .manufacture_id = Manufacturer chip ID * .model_id = Model chip ID * .total_size = Total size in (binary) kbytes * .page_size = Page or eraseblock(?) size in bytes * .tested = Test status * .probe = Probe function * .probe_timing = Probe function delay - * .erase = Chip erase function * .block_erasers[] = Array of erase layouts and erase functions * { * .eraseblocks[] = Array of { blocksize, blockcount } * .block_erase = Block erase function * } * .write = Chip write function * .read = Chip read function */
{ @@ -59,21 +58,20 @@ .name = "Am29F010A/B", .bustype = CHIP_BUSTYPE_PARALLEL, .manufacture_id = AMD_ID, .model_id = AM_29F010B, /* Same as Am29F010A */ .total_size = 128, .page_size = 16 * 1024, .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET, .tested = TEST_UNTESTED, .probe = probe_jedec, .probe_timing = TIMING_ZERO, - .erase = NULL, .block_erasers = { { .eraseblocks = { {16 * 1024, 8} }, .block_erase = erase_sector_jedec, }, { .eraseblocks = { {128 * 1024, 1} }, .block_erase = erase_chip_block_jedec, }, }, @@ -86,21 +84,20 @@ .name = "Am29F002(N)BB", .bustype = CHIP_BUSTYPE_PARALLEL, .manufacture_id = AMD_ID, .model_id = AM_29F002BB, .total_size = 256, .page_size = 256, .feature_bits = FEATURE_SHORT_RESET | FEATURE_ADDR_2AA, .tested = TEST_UNTESTED, .probe = probe_jedec, .probe_timing = TIMING_ZERO, - .erase = NULL, .block_erasers = { { .eraseblocks = { {16 * 1024, 1}, {8 * 1024, 2}, {32 * 1024, 1}, {64 * 1024, 3}, }, .block_erase = erase_sector_jedec, @@ -118,21 +115,20 @@ .name = "Am29F002(N)BT", .bustype = CHIP_BUSTYPE_PARALLEL, .manufacture_id = AMD_ID, .model_id = AM_29F002BT, .total_size = 256, .page_size = 256, .feature_bits = FEATURE_EITHER_RESET | FEATURE_ADDR_2AA, .tested = TEST_UNTESTED, .probe = probe_jedec, .probe_timing = TIMING_ZERO, - .erase = NULL, .block_erasers = { { .eraseblocks = { {64 * 1024, 3}, {32 * 1024, 1}, {8 * 1024, 2}, {16 * 1024, 1}, }, .block_erase = erase_sector_jedec, @@ -150,21 +146,20 @@ .name = "Am29F016D", .bustype = CHIP_BUSTYPE_PARALLEL, .manufacture_id = AMD_ID, .model_id = AM_29F016D, .total_size = 2 * 1024, .page_size = 64 * 1024, .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET, .tested = TEST_UNTESTED, .probe = probe_jedec, .probe_timing = TIMING_IGNORED, /* routine don't use probe_timing (am29f040b.c) */ - .erase = NULL, .block_erasers = { { .eraseblocks = { {64 * 1024, 32} }, .block_erase = erase_sector_jedec, }, { .eraseblocks = { {2048 * 1024, 1} }, .block_erase = erase_chip_block_jedec, }, }, @@ -177,21 +172,20 @@ .name = "Am29F040B", .bustype = CHIP_BUSTYPE_PARALLEL, .manufacture_id = AMD_ID, .model_id = AM_29F040B, .total_size = 512, .page_size = 64 * 1024, .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET, .tested = TEST_UNTESTED, .probe = probe_jedec, .probe_timing = TIMING_IGNORED, /* routine don't use probe_timing (am29f040b.c) */ - .erase = NULL, .block_erasers = { { .eraseblocks = { {64 * 1024, 8} }, .block_erase = erase_sector_jedec, }, { .eraseblocks = { {512 * 1024, 1} }, .block_erase = erase_chip_block_jedec, }, }, @@ -204,21 +198,20 @@ .name = "Am29F080B", .bustype = CHIP_BUSTYPE_PARALLEL, .manufacture_id = AMD_ID, .model_id = AM_29F080B, .total_size = 1024, .page_size = 64 * 1024, .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET, .tested = TEST_UNTESTED, .probe = probe_jedec, .probe_timing = TIMING_ZERO, - .erase = NULL, .block_erasers = { { .eraseblocks = { {64 * 1024, 16} }, .block_erase = erase_sector_jedec, }, { .eraseblocks = { {1024 * 1024, 1} }, .block_erase = erase_chip_block_jedec, }, }, @@ -231,21 +224,20 @@ .name = "Am29LV040B", .bustype = CHIP_BUSTYPE_PARALLEL, .manufacture_id = AMD_ID, .model_id = AM_29LV040B, .total_size = 512, .page_size = 64 * 1024, .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET, .tested = TEST_UNTESTED, .probe = probe_jedec, .probe_timing = TIMING_IGNORED, /* routine don't use probe_timing (am29f040b.c) */ - .erase = NULL, .block_erasers = { { .eraseblocks = { {64 * 1024, 8} }, .block_erase = erase_sector_jedec, }, { .eraseblocks = { {512 * 1024, 1} }, .block_erase = erase_chip_block_jedec, }, }, @@ -258,21 +250,20 @@ .name = "Am29LV081B", .bustype = CHIP_BUSTYPE_PARALLEL, .manufacture_id = AMD_ID, .model_id = AM_29LV080B, .total_size = 1024, .page_size = 64 * 1024, .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET, .tested = TEST_UNTESTED, .probe = probe_jedec, .probe_timing = TIMING_IGNORED, /* routine don't use probe_timing (am29f040b.c) */ - .erase = NULL, .block_erasers = { { .eraseblocks = { {64 * 1024, 16} }, .block_erase = erase_sector_jedec, }, { .eraseblocks = { {1024 * 1024, 1} }, .block_erase = erase_chip_block_jedec, }, }, @@ -285,21 +276,20 @@ .name = "AE49F2008", .bustype = CHIP_BUSTYPE_PARALLEL, .manufacture_id = ASD_ID, .model_id = ASD_AE49F2008, .total_size = 256, .page_size = 128, .feature_bits = FEATURE_EITHER_RESET, .tested = TEST_UNTESTED, .probe = probe_jedec, .probe_timing = TIMING_FIXME, - .erase = NULL, .block_erasers = { { .eraseblocks = { {128 * 1024, 1}, {96 * 1024, 1}, {8 * 1024, 2}, {16 * 1024, 1}, }, .block_erase = erase_sector_jedec, @@ -316,21 +306,20 @@ .vendor = "Atmel", .name = "AT25DF021", .bustype = CHIP_BUSTYPE_SPI, .manufacture_id = ATMEL_ID, .model_id = AT_25DF021, .total_size = 256, .page_size = 256, .tested = TEST_UNTESTED, .probe = probe_spi_rdid, .probe_timing = TIMING_ZERO, - .erase = NULL, .block_erasers = { { .eraseblocks = { {4 * 1024, 64} }, .block_erase = spi_block_erase_20, }, { .eraseblocks = { {32 * 1024, 8} }, .block_erase = spi_block_erase_52, }, { .eraseblocks = { {64 * 1024, 4} }, @@ -351,21 +340,20 @@ .vendor = "Atmel", .name = "AT25DF041A", .bustype = CHIP_BUSTYPE_SPI, .manufacture_id = ATMEL_ID, .model_id = AT_25DF041A, .total_size = 512, .page_size = 256, .tested = TEST_UNTESTED, .probe = probe_spi_rdid, .probe_timing = TIMING_ZERO, - .erase = NULL, .block_erasers = { { .eraseblocks = { {4 * 1024, 128} }, .block_erase = spi_block_erase_20, }, { .eraseblocks = { {32 * 1024, 16} }, .block_erase = spi_block_erase_52, }, { .eraseblocks = { {64 * 1024, 8} }, @@ -386,21 +374,20 @@ .vendor = "Atmel", .name = "AT25DF081", .bustype = CHIP_BUSTYPE_SPI, .manufacture_id = ATMEL_ID, .model_id = AT_25DF081, .total_size = 1024, .page_size = 256, .tested = TEST_UNTESTED, .probe = probe_spi_rdid, .probe_timing = TIMING_ZERO, - .erase = NULL, .block_erasers = { { .eraseblocks = { {4 * 1024, 256} }, .block_erase = spi_block_erase_20, }, { .eraseblocks = { {32 * 1024, 32} }, .block_erase = spi_block_erase_52, }, { .eraseblocks = { {64 * 1024, 16} }, @@ -421,21 +408,20 @@ .vendor = "Atmel", .name = "AT25DF161", .bustype = CHIP_BUSTYPE_SPI, .manufacture_id = ATMEL_ID, .model_id = AT_25DF161, .total_size = 2048, .page_size = 256, .tested = TEST_UNTESTED, .probe = probe_spi_rdid, .probe_timing = TIMING_ZERO, - .erase = NULL, .block_erasers = { { .eraseblocks = { {4 * 1024, 512} }, .block_erase = spi_block_erase_20, }, { .eraseblocks = { {32 * 1024, 64} }, .block_erase = spi_block_erase_52, }, { .eraseblocks = { {64 * 1024, 32} }, @@ -456,21 +442,20 @@ .vendor = "Atmel", .name = "AT25DF321", .bustype = CHIP_BUSTYPE_SPI, .manufacture_id = ATMEL_ID, .model_id = AT_25DF321, .total_size = 4096, .page_size = 256, .tested = TEST_OK_PRW, .probe = probe_spi_rdid, .probe_timing = TIMING_ZERO, - .erase = NULL, .block_erasers = { { .eraseblocks = { {4 * 1024, 1024} }, .block_erase = spi_block_erase_20, }, { .eraseblocks = { {32 * 1024, 128} }, .block_erase = spi_block_erase_52, }, { .eraseblocks = { {64 * 1024, 64} }, @@ -491,21 +476,20 @@ .vendor = "Atmel", .name = "AT25DF321A", .bustype = CHIP_BUSTYPE_SPI, .manufacture_id = ATMEL_ID, .model_id = AT_25DF321A, .total_size = 4096, .page_size = 256, .tested = TEST_UNTESTED, .probe = probe_spi_rdid, .probe_timing = TIMING_ZERO, - .erase = NULL, .block_erasers = { { .eraseblocks = { {4 * 1024, 1024} }, .block_erase = spi_block_erase_20, }, { .eraseblocks = { {32 * 1024, 128} }, .block_erase = spi_block_erase_52, }, { .eraseblocks = { {64 * 1024, 64} }, @@ -526,21 +510,20 @@ .vendor = "Atmel", .name = "AT25DF641", .bustype = CHIP_BUSTYPE_SPI, .manufacture_id = ATMEL_ID, .model_id = AT_25DF641, .total_size = 8192, .page_size = 256, .tested = TEST_UNTESTED, .probe = probe_spi_rdid, .probe_timing = TIMING_ZERO, - .erase = NULL, .block_erasers = { { .eraseblocks = { {4 * 1024, 2048} }, .block_erase = spi_block_erase_20, }, { .eraseblocks = { {32 * 1024, 256} }, .block_erase = spi_block_erase_52, }, { .eraseblocks = { {64 * 1024, 128} }, @@ -561,21 +544,20 @@ .vendor = "Atmel", .name = "AT25F512B", .bustype = CHIP_BUSTYPE_SPI, .manufacture_id = ATMEL_ID, .model_id = AT_25F512B, .total_size = 64, .page_size = 256, .tested = TEST_UNTESTED, .probe = probe_spi_rdid, .probe_timing = TIMING_ZERO, - .erase = NULL, .block_erasers = { { .eraseblocks = { {4 * 1024, 16} }, .block_erase = spi_block_erase_20, }, { .eraseblocks = { {32 * 1024, 2} }, .block_erase = spi_block_erase_52, }, { .eraseblocks = { {32 * 1024, 2} }, @@ -596,21 +578,20 @@ .vendor = "Atmel", .name = "AT25FS010", .bustype = CHIP_BUSTYPE_SPI, .manufacture_id = ATMEL_ID, .model_id = AT_25FS010, .total_size = 128, .page_size = 256, .tested = TEST_UNTESTED, .probe = probe_spi_rdid, .probe_timing = TIMING_ZERO, - .erase = NULL, .block_erasers = { { .eraseblocks = { {4 * 1024, 32} }, .block_erase = spi_block_erase_20, }, { .eraseblocks = { {32 * 1024, 4} }, .block_erase = spi_block_erase_52, }, { .eraseblocks = { {32 * 1024, 4} }, @@ -631,21 +612,20 @@ .vendor = "Atmel", .name = "AT25FS040", .bustype = CHIP_BUSTYPE_SPI, .manufacture_id = ATMEL_ID, .model_id = AT_25FS040, .total_size = 512, .page_size = 256, .tested = TEST_UNTESTED, .probe = probe_spi_rdid, .probe_timing = TIMING_ZERO, - .erase = NULL, .block_erasers = { { .eraseblocks = { {4 * 1024, 128} }, .block_erase = spi_block_erase_20, }, { .eraseblocks = { {64 * 1024, 8} }, .block_erase = spi_block_erase_52, }, { .eraseblocks = { {64 * 1024, 8} }, @@ -666,21 +646,20 @@ .vendor = "Atmel", .name = "AT26DF041", .bustype = CHIP_BUSTYPE_SPI, .manufacture_id = ATMEL_ID, .model_id = AT_26DF041, .total_size = 512, .page_size = 256, .tested = TEST_UNTESTED, .probe = probe_spi_rdid, .probe_timing = TIMING_ZERO, - .erase = NULL, .block_erasers = { { .eraseblocks = { {4 * 1024, 128} }, .block_erase = spi_block_erase_20, } }, .write = NULL /* Incompatible Page write */, .read = spi_chip_read, }, @@ -689,21 +668,20 @@ .vendor = "Atmel", .name = "AT26DF081A", .bustype = CHIP_BUSTYPE_SPI, .manufacture_id = ATMEL_ID, .model_id = AT_26DF081A, .total_size = 1024, .page_size = 256, .tested = TEST_UNTESTED, .probe = probe_spi_rdid, .probe_timing = TIMING_ZERO, - .erase = NULL, .block_erasers = { { .eraseblocks = { {4 * 1024, 256} }, .block_erase = spi_block_erase_20, }, { .eraseblocks = { {32 * 1024, 32} }, .block_erase = spi_block_erase_52, }, { .eraseblocks = { {64 * 1024, 16} }, @@ -724,21 +702,20 @@ .vendor = "Atmel", .name = "AT26DF161", .bustype = CHIP_BUSTYPE_SPI, .manufacture_id = ATMEL_ID, .model_id = AT_26DF161, .total_size = 2048, .page_size = 256, .tested = TEST_UNTESTED, .probe = probe_spi_rdid, .probe_timing = TIMING_ZERO, - .erase = NULL, .block_erasers = { { .eraseblocks = { {4 * 1024, 512} }, .block_erase = spi_block_erase_20, }, { .eraseblocks = { {32 * 1024, 64} }, .block_erase = spi_block_erase_52, }, { .eraseblocks = { {64 * 1024, 32} }, @@ -759,21 +736,20 @@ .vendor = "Atmel", .name = "AT26DF161A", .bustype = CHIP_BUSTYPE_SPI, .manufacture_id = ATMEL_ID, .model_id = AT_26DF161A, .total_size = 2048, .page_size = 256, .tested = TEST_UNTESTED, .probe = probe_spi_rdid, .probe_timing = TIMING_ZERO, - .erase = NULL, .block_erasers = { { .eraseblocks = { {4 * 1024, 512} }, .block_erase = spi_block_erase_20, }, { .eraseblocks = { {32 * 1024, 64} }, .block_erase = spi_block_erase_52, }, { .eraseblocks = { {64 * 1024, 32} }, @@ -795,37 +771,35 @@ .vendor = "Atmel", .name = "AT26DF321", .bustype = CHIP_BUSTYPE_SPI, .manufacture_id = ATMEL_ID, .model_id = AT_26DF321, .total_size = 4096, .page_size = 256, .tested = TEST_UNTESTED, .probe = probe_spi_rdid, .probe_timing = TIMING_ZERO, - .erase = spi_chip_erase_60_c7, .write = spi_chip_write_256, .read = spi_chip_read, },*/
{ .vendor = "Atmel", .name = "AT26F004", .bustype = CHIP_BUSTYPE_SPI, .manufacture_id = ATMEL_ID, .model_id = AT_26F004, .total_size = 512, .page_size = 256, .tested = TEST_UNTESTED, .probe = probe_spi_rdid, .probe_timing = TIMING_ZERO, - .erase = NULL, .block_erasers = { { .eraseblocks = { {4 * 1024, 128} }, .block_erase = spi_block_erase_20, }, { .eraseblocks = { {32 * 1024, 16} }, .block_erase = spi_block_erase_52, }, { .eraseblocks = { {64 * 1024, 8} }, @@ -847,21 +821,20 @@ .name = "AT29C512", .bustype = CHIP_BUSTYPE_PARALLEL, .manufacture_id = ATMEL_ID, .model_id = AT_29C512, .total_size = 64, .page_size = 128, .feature_bits = FEATURE_LONG_RESET, .tested = TEST_UNTESTED, .probe = probe_jedec, .probe_timing = 10000, /* 10mS, Enter=Exec */ - .erase = NULL, .block_erasers = { { .eraseblocks = { {64 * 1024, 1} }, .block_erase = erase_chip_block_jedec, } }, .write = write_jedec, .read = read_memmapped,
@@ -872,21 +845,20 @@ .name = "AT29C010A", .bustype = CHIP_BUSTYPE_PARALLEL, .manufacture_id = ATMEL_ID, .model_id = AT_29C010A, .total_size = 128, .page_size = 128, .feature_bits = FEATURE_LONG_RESET, .tested = TEST_UNTESTED, .probe = probe_jedec, .probe_timing = 10000, /* 10mS, Enter=Exec */ - .erase = NULL, .block_erasers = { { .eraseblocks = { {128 * 1024, 1} }, .block_erase = erase_chip_block_jedec, } }, .write = write_jedec, /* FIXME */ .read = read_memmapped, }, @@ -896,21 +868,20 @@ .name = "AT29C020", .bustype = CHIP_BUSTYPE_PARALLEL, .manufacture_id = ATMEL_ID, .model_id = AT_29C020, .total_size = 256, .page_size = 256, .feature_bits = FEATURE_LONG_RESET, .tested = TEST_UNTESTED, .probe = probe_jedec, .probe_timing = 10000, /* 10ms */ - .erase = NULL, .block_erasers = { { .eraseblocks = { {256 * 1024, 1} }, .block_erase = erase_chip_block_jedec, } }, .write = write_jedec, .read = read_memmapped, }, @@ -920,21 +891,20 @@ .name = "AT29C040A", .bustype = CHIP_BUSTYPE_PARALLEL, .manufacture_id = ATMEL_ID, .model_id = AT_29C040A, .total_size = 512, .page_size = 256, .feature_bits = FEATURE_LONG_RESET, .tested = TEST_UNTESTED, .probe = probe_jedec, .probe_timing = 10000, /* 10 ms */ - .erase = NULL, .block_erasers = { { .eraseblocks = { {512 * 1024, 1} }, .block_erase = erase_chip_block_jedec, } }, .write = write_jedec, .read = read_memmapped, }, @@ -943,166 +913,156 @@ .vendor = "Atmel", .name = "AT45CS1282", .bustype = CHIP_BUSTYPE_SPI, .manufacture_id = ATMEL_ID, .model_id = AT_45CS1282, .total_size = 16896 /* No power of two sizes */, .page_size = 1056 /* No power of two sizes */, .tested = TEST_BAD_READ, .probe = probe_spi_rdid, .probe_timing = TIMING_ZERO, - .erase = NULL, .write = NULL /* Incompatible Page write */, .read = NULL /* Incompatible read */, },
{ .vendor = "Atmel", .name = "AT45DB011D", .bustype = CHIP_BUSTYPE_SPI, .manufacture_id = ATMEL_ID, .model_id = AT_45DB011D, .total_size = 128 /* Size can only be determined from status register */, .page_size = 256 /* Size can only be determined from status register */, .tested = TEST_BAD_READ, .probe = probe_spi_rdid, .probe_timing = TIMING_ZERO, - .erase = NULL, .write = NULL, .read = NULL, },
{ .vendor = "Atmel", .name = "AT45DB021D", .bustype = CHIP_BUSTYPE_SPI, .manufacture_id = ATMEL_ID, .model_id = AT_45DB021D, .total_size = 256 /* Size can only be determined from status register */, .page_size = 256 /* Size can only be determined from status register */, .tested = TEST_BAD_READ, .probe = probe_spi_rdid, .probe_timing = TIMING_ZERO, - .erase = NULL, .write = NULL, .read = NULL, },
{ .vendor = "Atmel", .name = "AT45DB041D", .bustype = CHIP_BUSTYPE_SPI, .manufacture_id = ATMEL_ID, .model_id = AT_45DB041D, .total_size = 512 /* Size can only be determined from status register */, .page_size = 256 /* Size can only be determined from status register */, .tested = TEST_BAD_READ, .probe = probe_spi_rdid, .probe_timing = TIMING_ZERO, - .erase = NULL, .write = NULL, .read = NULL, },
{ .vendor = "Atmel", .name = "AT45DB081D", .bustype = CHIP_BUSTYPE_SPI, .manufacture_id = ATMEL_ID, .model_id = AT_45DB081D, .total_size = 1024 /* Size can only be determined from status register */, .page_size = 256 /* Size can only be determined from status register */, .tested = TEST_BAD_READ, .probe = probe_spi_rdid, .probe_timing = TIMING_ZERO, - .erase = NULL, .write = NULL, .read = NULL, },
{ .vendor = "Atmel", .name = "AT45DB161D", .bustype = CHIP_BUSTYPE_SPI, .manufacture_id = ATMEL_ID, .model_id = AT_45DB161D, .total_size = 2048 /* Size can only be determined from status register */, .page_size = 512 /* Size can only be determined from status register */, .tested = TEST_BAD_READ, .probe = probe_spi_rdid, .probe_timing = TIMING_ZERO, - .erase = NULL, .write = NULL, .read = NULL, },
{ .vendor = "Atmel", .name = "AT45DB321C", .bustype = CHIP_BUSTYPE_SPI, .manufacture_id = ATMEL_ID, .model_id = AT_45DB321C, .total_size = 4224 /* No power of two sizes */, .page_size = 528 /* No power of two sizes */, .tested = TEST_BAD_READ, .probe = probe_spi_rdid, .probe_timing = TIMING_ZERO, - .erase = NULL, .write = NULL, .read = NULL /* Incompatible read */, },
{ .vendor = "Atmel", .name = "AT45DB321D", .bustype = CHIP_BUSTYPE_SPI, .manufacture_id = ATMEL_ID, .model_id = AT_45DB321D, .total_size = 4096 /* Size can only be determined from status register */, .page_size = 512 /* Size can only be determined from status register */, .tested = TEST_BAD_READ, .probe = probe_spi_rdid, .probe_timing = TIMING_ZERO, - .erase = NULL, .write = NULL, .read = NULL, },
{ .vendor = "Atmel", .name = "AT45DB642D", .bustype = CHIP_BUSTYPE_SPI, .manufacture_id = ATMEL_ID, .model_id = AT_45DB642D, .total_size = 8192 /* Size can only be determined from status register */, .page_size = 1024 /* Size can only be determined from status register */, .tested = TEST_BAD_READ, .probe = probe_spi_rdid, .probe_timing = TIMING_ZERO, - .erase = NULL, .write = NULL, .read = NULL, },
{ .vendor = "Atmel", .name = "AT49BV512", .bustype = CHIP_BUSTYPE_PARALLEL, .manufacture_id = ATMEL_ID, .model_id = AT_49BV512, .total_size = 64, .page_size = 64, .feature_bits = FEATURE_EITHER_RESET, .tested = TEST_UNTESTED, .probe = probe_jedec, .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */ - .erase = NULL, .block_erasers = { { .eraseblocks = { {64 * 1024, 1} }, .block_erase = erase_chip_block_jedec, } }, .write = write_jedec_1, .read = read_memmapped, }, @@ -1112,21 +1072,20 @@ .name = "AT49F002(N)", .bustype = CHIP_BUSTYPE_PARALLEL, .manufacture_id = ATMEL_ID, .model_id = AT_49F002N, .total_size = 256, .page_size = 256, .feature_bits = FEATURE_EITHER_RESET, .tested = TEST_UNTESTED, .probe = probe_jedec, .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */ - .erase = NULL, .block_erasers = { { .eraseblocks = { {16 * 1024, 1}, {8 * 1024, 2}, {96 * 1024, 1}, {128 * 1024, 1}, }, .block_erase = erase_sector_jedec, @@ -1144,21 +1103,20 @@ .name = "AT49F002(N)T", .bustype = CHIP_BUSTYPE_PARALLEL, .manufacture_id = ATMEL_ID, .model_id = AT_49F002NT, .total_size = 256, .page_size = 256, .feature_bits = FEATURE_EITHER_RESET, .tested = TEST_UNTESTED, .probe = probe_jedec, .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */ - .erase = NULL, .block_erasers = { { .eraseblocks = { {128 * 1024, 1}, {96 * 1024, 1}, {8 * 1024, 2}, {16 * 1024, 1}, }, .block_erase = erase_sector_jedec, @@ -1177,21 +1135,20 @@ .vendor = "AMIC", .name = "A25L40PT", .bustype = CHIP_BUSTYPE_SPI, .manufacture_id = AMIC_ID, .model_id = AMIC_A25L40P, .total_size = 512, .page_size = 256, .tested = TEST_OK_PRW, .probe = probe_spi_rdid4, .probe_timing = TIMING_ZERO, - .erase = NULL, .block_erasers = { { .eraseblocks = { {64 * 1024, 7}, {32 * 1024, 1}, {16 * 1024, 1}, {8 * 1024, 1}, {4 * 1024, 2}, }, @@ -1209,21 +1166,20 @@ .vendor = "AMIC", .name = "A25L40PU", .bustype = CHIP_BUSTYPE_SPI, .manufacture_id = AMIC_ID, .model_id = AMIC_A25L40P, .total_size = 512, .page_size = 256, .tested = TEST_OK_PRW, .probe = probe_spi_rdid4, .probe_timing = TIMING_ZERO, - .erase = NULL, .block_erasers = { { .eraseblocks = { {4 * 1024, 2}, {8 * 1024, 1}, {16 * 1024, 1}, {32 * 1024, 1}, {64 * 1024, 7}, }, @@ -1242,21 +1198,20 @@ .name = "A29002B", .bustype = CHIP_BUSTYPE_PARALLEL, .manufacture_id = AMIC_ID_NOPREFIX, .model_id = AMIC_A29002B, .total_size = 256, .page_size = 64 * 1024, .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET, .tested = TEST_UNTESTED, .probe = probe_jedec, .probe_timing = TIMING_IGNORED, /* routine don't use probe_timing (mx29f002.c) */ - .erase = NULL, .block_erasers = { { .eraseblocks = { {16 * 1024, 1}, {8 * 1024, 2}, {32 * 1024, 1}, {64 * 1024, 3}, }, .block_erase = erase_sector_jedec, @@ -1274,21 +1229,20 @@ .name = "A29002T", .bustype = CHIP_BUSTYPE_PARALLEL, .manufacture_id = AMIC_ID_NOPREFIX, .model_id = AMIC_A29002T, .total_size = 256, .page_size = 64 * 1024, .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET, .tested = TEST_UNTESTED, .probe = probe_jedec, .probe_timing = TIMING_IGNORED, /* routine don't use probe_timing (mx29f002.c) */ - .erase = NULL, .block_erasers = { { .eraseblocks = { {64 * 1024, 3}, {32 * 1024, 1}, {8 * 1024, 2}, {16 * 1024, 1}, }, .block_erase = erase_sector_jedec, @@ -1306,21 +1260,20 @@ .name = "A29040B", .bustype = CHIP_BUSTYPE_PARALLEL, .manufacture_id = AMIC_ID_NOPREFIX, .model_id = AMIC_A29040B, .total_size = 512, .page_size = 64 * 1024, .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET, .tested = TEST_UNTESTED, .probe = probe_jedec, .probe_timing = TIMING_IGNORED, /* routine don't use probe_timing (am29f040b.c) */ - .erase = NULL, .block_erasers = { { .eraseblocks = { {64 * 1024, 8} }, .block_erase = erase_sector_jedec, }, { .eraseblocks = { {512 * 1024, 1} }, .block_erase = erase_chip_block_jedec, }, }, @@ -1333,21 +1286,20 @@ .name = "A49LF040A", .bustype = CHIP_BUSTYPE_LPC, .manufacture_id = AMIC_ID_NOPREFIX, .model_id = AMIC_A49LF040A, .total_size = 512, .page_size = 64 * 1024, .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET, .tested = TEST_UNTESTED, .probe = probe_jedec, .probe_timing = TIMING_ZERO, /* routine is wrapper to probe_jedec (pm49fl00x.c) */ - .erase = NULL, .block_erasers = { { .eraseblocks = { {64 * 1024, 8} }, .block_erase = erase_block_jedec, }, { .eraseblocks = { {512 * 1024, 1} }, .block_erase = erase_chip_block_jedec, } }, @@ -1360,21 +1312,20 @@ .name = "F49B002UA", .bustype = CHIP_BUSTYPE_PARALLEL, .manufacture_id = EMST_ID, .model_id = EMST_F49B002UA, .total_size = 256, .page_size = 4096, .feature_bits = FEATURE_EITHER_RESET, .tested = TEST_UNTESTED, .probe = probe_jedec, .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */ - .erase = NULL, .block_erasers = { { .eraseblocks = { {128 * 1024, 1}, {96 * 1024, 1}, {8 * 1024, 2}, {16 * 1024, 1}, }, .block_erase = erase_sector_jedec, @@ -1391,21 +1342,20 @@ .vendor = "Eon", .name = "EN25B05", .bustype = CHIP_BUSTYPE_SPI, .manufacture_id = EON_ID_NOPREFIX, .model_id = EN_25B05, .total_size = 64, .page_size = 256, .tested = TEST_UNTESTED, .probe = probe_spi_rdid, .probe_timing = TIMING_ZERO, - .erase = NULL, .block_erasers = { { .eraseblocks = { {4 * 1024, 2}, {8 * 1024, 1}, {16 * 1024, 1}, {32 * 1024, 1}, }, .block_erase = spi_block_erase_d8, @@ -1422,21 +1372,20 @@ .vendor = "Eon", .name = "EN25B05T", .bustype = CHIP_BUSTYPE_SPI, .manufacture_id = EON_ID_NOPREFIX, .model_id = EN_25B05, .total_size = 64, .page_size = 256, .tested = TEST_UNTESTED, .probe = probe_spi_rdid, .probe_timing = TIMING_ZERO, - .erase = NULL, .block_erasers = { { .eraseblocks = { {32 * 1024, 1}, {16 * 1024, 1}, {8 * 1024, 1}, {4 * 1024, 2}, }, .block_erase = spi_block_erase_d8, @@ -1453,21 +1402,20 @@ .vendor = "Eon", .name = "EN25B10", .bustype = CHIP_BUSTYPE_SPI, .manufacture_id = EON_ID_NOPREFIX, .model_id = EN_25B10, .total_size = 128, .page_size = 256, .tested = TEST_UNTESTED, .probe = probe_spi_rdid, .probe_timing = TIMING_ZERO, - .erase = NULL, .block_erasers = { { .eraseblocks = { {4 * 1024, 2}, {8 * 1024, 1}, {16 * 1024, 1}, {32 * 1024, 3}, }, .block_erase = spi_block_erase_d8, @@ -1484,21 +1432,20 @@ .vendor = "Eon", .name = "EN25B10T", .bustype = CHIP_BUSTYPE_SPI, .manufacture_id = EON_ID_NOPREFIX, .model_id = EN_25B10, .total_size = 128, .page_size = 256, .tested = TEST_UNTESTED, .probe = probe_spi_rdid, .probe_timing = TIMING_ZERO, - .erase = NULL, .block_erasers = { { .eraseblocks = { {32 * 1024, 3}, {16 * 1024, 1}, {8 * 1024, 1}, {4 * 1024, 2}, }, .block_erase = spi_block_erase_d8, @@ -1515,21 +1462,20 @@ .vendor = "Eon", .name = "EN25B20", .bustype = CHIP_BUSTYPE_SPI, .manufacture_id = EON_ID_NOPREFIX, .model_id = EN_25B20, .total_size = 256, .page_size = 256, .tested = TEST_UNTESTED, .probe = probe_spi_rdid, .probe_timing = TIMING_ZERO, - .erase = NULL, .block_erasers = { { .eraseblocks = { {4 * 1024, 2}, {8 * 1024, 1}, {16 * 1024, 1}, {32 * 1024, 1}, {64 * 1024, 3} }, @@ -1547,21 +1493,20 @@ .vendor = "Eon", .name = "EN25B20T", .bustype = CHIP_BUSTYPE_SPI, .manufacture_id = EON_ID_NOPREFIX, .model_id = EN_25B20, .total_size = 256, .page_size = 256, .tested = TEST_UNTESTED, .probe = probe_spi_rdid, .probe_timing = TIMING_ZERO, - .erase = NULL, .block_erasers = { { .eraseblocks = { {64 * 1024, 3}, {32 * 1024, 1}, {16 * 1024, 1}, {8 * 1024, 1}, {4 * 1024, 2}, }, @@ -1579,21 +1524,20 @@ .vendor = "Eon", .name = "EN25B40", .bustype = CHIP_BUSTYPE_SPI, .manufacture_id = EON_ID_NOPREFIX, .model_id = EN_25B40, .total_size = 512, .page_size = 256, .tested = TEST_UNTESTED, .probe = probe_spi_rdid, .probe_timing = TIMING_ZERO, - .erase = NULL, .block_erasers = { { .eraseblocks = { {4 * 1024, 2}, {8 * 1024, 1}, {16 * 1024, 1}, {32 * 1024, 1}, {64 * 1024, 7} }, @@ -1611,21 +1555,20 @@ .vendor = "Eon", .name = "EN25B40T", .bustype = CHIP_BUSTYPE_SPI, .manufacture_id = EON_ID_NOPREFIX, .model_id = EN_25B40, .total_size = 512, .page_size = 256, .tested = TEST_UNTESTED, .probe = probe_spi_rdid, .probe_timing = TIMING_ZERO, - .erase = NULL, .block_erasers = { { .eraseblocks = { {64 * 1024, 7}, {32 * 1024, 1}, {16 * 1024, 1}, {8 * 1024, 1}, {4 * 1024, 2}, }, @@ -1643,21 +1586,20 @@ .vendor = "Eon", .name = "EN25B80", .bustype = CHIP_BUSTYPE_SPI, .manufacture_id = EON_ID_NOPREFIX, .model_id = EN_25B80, .total_size = 1024, .page_size = 256, .tested = TEST_UNTESTED, .probe = probe_spi_rdid, .probe_timing = TIMING_ZERO, - .erase = NULL, .block_erasers = { { .eraseblocks = { {4 * 1024, 2}, {8 * 1024, 1}, {16 * 1024, 1}, {32 * 1024, 1}, {64 * 1024, 15} }, @@ -1675,21 +1617,20 @@ .vendor = "Eon", .name = "EN25B80T", .bustype = CHIP_BUSTYPE_SPI, .manufacture_id = EON_ID_NOPREFIX, .model_id = EN_25B80, .total_size = 1024, .page_size = 256, .tested = TEST_UNTESTED, .probe = probe_spi_rdid, .probe_timing = TIMING_ZERO, - .erase = NULL, .block_erasers = { { .eraseblocks = { {64 * 1024, 15}, {32 * 1024, 1}, {16 * 1024, 1}, {8 * 1024, 1}, {4 * 1024, 2}, }, @@ -1707,21 +1648,20 @@ .vendor = "Eon", .name = "EN25B16", .bustype = CHIP_BUSTYPE_SPI, .manufacture_id = EON_ID_NOPREFIX, .model_id = EN_25B16, .total_size = 2048, .page_size = 256, .tested = TEST_UNTESTED, .probe = probe_spi_rdid, .probe_timing = TIMING_ZERO, - .erase = NULL, .block_erasers = { { .eraseblocks = { {4 * 1024, 2}, {8 * 1024, 1}, {16 * 1024, 1}, {32 * 1024, 1}, {64 * 1024, 31}, }, @@ -1739,21 +1679,20 @@ .vendor = "Eon", .name = "EN25B16T", .bustype = CHIP_BUSTYPE_SPI, .manufacture_id = EON_ID_NOPREFIX, .model_id = EN_25B16, .total_size = 2048, .page_size = 256, .tested = TEST_UNTESTED, .probe = probe_spi_rdid, .probe_timing = TIMING_ZERO, - .erase = NULL, .block_erasers = { { .eraseblocks = { {64 * 1024, 31}, {32 * 1024, 1}, {16 * 1024, 1}, {8 * 1024, 1}, {4 * 1024, 2}, }, @@ -1771,21 +1710,20 @@ .vendor = "Eon", .name = "EN25B32", .bustype = CHIP_BUSTYPE_SPI, .manufacture_id = EON_ID_NOPREFIX, .model_id = EN_25B32, .total_size = 4096, .page_size = 256, .tested = TEST_UNTESTED, .probe = probe_spi_rdid, .probe_timing = TIMING_ZERO, - .erase = NULL, .block_erasers = { { .eraseblocks = { {4 * 1024, 2}, {8 * 1024, 1}, {16 * 1024, 1}, {32 * 1024, 1}, {64 * 1024, 63}, }, @@ -1803,21 +1741,20 @@ .vendor = "Eon", .name = "EN25B32T", .bustype = CHIP_BUSTYPE_SPI, .manufacture_id = EON_ID_NOPREFIX, .model_id = EN_25B32, .total_size = 4096, .page_size = 256, .tested = TEST_UNTESTED, .probe = probe_spi_rdid, .probe_timing = TIMING_ZERO, - .erase = NULL, .block_erasers = { { .eraseblocks = { {64 * 1024, 63}, {32 * 1024, 1}, {16 * 1024, 1}, {8 * 1024, 1}, {4 * 1024, 2}, }, @@ -1835,21 +1772,20 @@ .vendor = "Eon", .name = "EN25B64", .bustype = CHIP_BUSTYPE_SPI, .manufacture_id = EON_ID_NOPREFIX, .model_id = EN_25B64, .total_size = 8192, .page_size = 256, .tested = TEST_UNTESTED, .probe = probe_spi_rdid, .probe_timing = TIMING_ZERO, - .erase = NULL, .block_erasers = { { .eraseblocks = { {4 * 1024, 2}, {8 * 1024, 1}, {16 * 1024, 1}, {32 * 1024, 1}, {64 * 1024, 127}, }, @@ -1867,21 +1803,20 @@ .vendor = "Eon", .name = "EN25B64T", .bustype = CHIP_BUSTYPE_SPI, .manufacture_id = EON_ID_NOPREFIX, .model_id = EN_25B64, .total_size = 8192, .page_size = 256, .tested = TEST_UNTESTED, .probe = probe_spi_rdid, .probe_timing = TIMING_ZERO, - .erase = NULL, .block_erasers = { { .eraseblocks = { {64 * 1024, 127}, {32 * 1024, 1}, {16 * 1024, 1}, {8 * 1024, 1}, {4 * 1024, 2}, }, @@ -1899,21 +1834,20 @@ .vendor = "Eon", .name = "EN25D16", .bustype = CHIP_BUSTYPE_SPI, .manufacture_id = EON_ID_NOPREFIX, .model_id = EN_25D16, .total_size = 2048, .page_size = 256, .tested = TEST_UNTESTED, .probe = probe_spi_rdid, .probe_timing = TIMING_ZERO, - .erase = NULL, .block_erasers = { { .eraseblocks = { {4 * 1024, 512} }, .block_erase = spi_block_erase_20, }, { .eraseblocks = { {64 * 1024, 32} }, .block_erase = spi_block_erase_d8, }, { .eraseblocks = { {64 * 1024, 32} }, @@ -1934,21 +1868,20 @@ .vendor = "Eon", .name = "EN25F05", .bustype = CHIP_BUSTYPE_SPI, .manufacture_id = EON_ID_NOPREFIX, .model_id = EN_25F05, .total_size = 64, .page_size = 256, .tested = TEST_UNTESTED, .probe = probe_spi_rdid, .probe_timing = TIMING_ZERO, - .erase = NULL, .block_erasers = { { .eraseblocks = { {4 * 1024, 16} }, .block_erase = spi_block_erase_20, }, { .eraseblocks = { {32 * 1024, 2} }, .block_erase = spi_block_erase_d8, }, { .eraseblocks = { {32 * 1024, 2} }, @@ -1969,21 +1902,20 @@ .vendor = "Eon", .name = "EN25F10", .bustype = CHIP_BUSTYPE_SPI, .manufacture_id = EON_ID_NOPREFIX, .model_id = EN_25F10, .total_size = 128, .page_size = 256, .tested = TEST_UNTESTED, .probe = probe_spi_rdid, .probe_timing = TIMING_ZERO, - .erase = NULL, .block_erasers = { { .eraseblocks = { {4 * 1024, 32} }, .block_erase = spi_block_erase_20, }, { .eraseblocks = { {32 * 1024, 4} }, .block_erase = spi_block_erase_d8, }, { .eraseblocks = { {32 * 1024, 4} }, @@ -2004,21 +1936,20 @@ .vendor = "Eon", .name = "EN25F20", .bustype = CHIP_BUSTYPE_SPI, .manufacture_id = EON_ID_NOPREFIX, .model_id = EN_25F20, .total_size = 256, .page_size = 256, .tested = TEST_UNTESTED, .probe = probe_spi_rdid, .probe_timing = TIMING_ZERO, - .erase = NULL, .block_erasers = { { .eraseblocks = { {4 * 1024, 64} }, .block_erase = spi_block_erase_20, }, { .eraseblocks = { {64 * 1024, 4} }, .block_erase = spi_block_erase_d8, }, { .eraseblocks = { {64 * 1024, 4} }, @@ -2039,21 +1970,20 @@ .vendor = "Eon", .name = "EN25F40", .bustype = CHIP_BUSTYPE_SPI, .manufacture_id = EON_ID_NOPREFIX, .model_id = EN_25F40, .total_size = 512, .page_size = 256, .tested = TEST_OK_PROBE, .probe = probe_spi_rdid, .probe_timing = TIMING_ZERO, - .erase = NULL, .block_erasers = { { .eraseblocks = { {4 * 1024, 128} }, .block_erase = spi_block_erase_20, }, { .eraseblocks = { {64 * 1024, 8} }, .block_erase = spi_block_erase_d8, }, { .eraseblocks = { {512 * 1024, 1} }, @@ -2071,21 +2001,20 @@ .vendor = "Eon", .name = "EN25F80", .bustype = CHIP_BUSTYPE_SPI, .manufacture_id = EON_ID_NOPREFIX, .model_id = EN_25F80, .total_size = 1024, .page_size = 256, .tested = TEST_UNTESTED, .probe = probe_spi_rdid, .probe_timing = TIMING_ZERO, - .erase = NULL, .block_erasers = { { .eraseblocks = { {4 * 1024, 256} }, .block_erase = spi_block_erase_20, }, { .eraseblocks = { {64 * 1024, 16} }, .block_erase = spi_block_erase_d8, }, { .eraseblocks = { {1024 * 1024, 1} }, @@ -2103,21 +2032,20 @@ .vendor = "Eon", .name = "EN25F16", .bustype = CHIP_BUSTYPE_SPI, .manufacture_id = EON_ID_NOPREFIX, .model_id = EN_25F16, .total_size = 2048, .page_size = 256, .tested = TEST_UNTESTED, .probe = probe_spi_rdid, .probe_timing = TIMING_ZERO, - .erase = NULL, .block_erasers = { { .eraseblocks = { {4 * 1024, 512} }, .block_erase = spi_block_erase_20, }, { .eraseblocks = { {64 * 1024, 32} }, .block_erase = spi_block_erase_d8, }, { .eraseblocks = { {2 * 1024 * 1024, 1} }, @@ -2135,21 +2063,20 @@ .vendor = "Eon", .name = "EN25F32", .bustype = CHIP_BUSTYPE_SPI, .manufacture_id = EON_ID_NOPREFIX, .model_id = EN_25F32, .total_size = 4096, .page_size = 256, .tested = TEST_UNTESTED, .probe = probe_spi_rdid, .probe_timing = TIMING_ZERO, - .erase = NULL, .block_erasers = { { .eraseblocks = { {4 * 1024, 1024} }, .block_erase = spi_block_erase_20, }, { .eraseblocks = { {64 * 1024, 64} }, .block_erase = spi_block_erase_d8, }, { .eraseblocks = { {4 * 1024 * 1024, 1} }, @@ -2168,21 +2095,20 @@ .name = "EN29F002(A)(N)B", .bustype = CHIP_BUSTYPE_PARALLEL, .manufacture_id = EON_ID, .model_id = EN_29F002B, .total_size = 256, .page_size = 256, .feature_bits = FEATURE_ADDR_AAA | FEATURE_EITHER_RESET, .tested = TEST_UNTESTED, .probe = probe_jedec, .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */ - .erase = NULL, .block_erasers = { { .eraseblocks = { {64 * 1024, 3}, {32 * 1024, 1}, {8 * 1024, 2}, {16 * 1024, 1}, }, .block_erase = erase_sector_jedec, @@ -2200,21 +2126,20 @@ .name = "EN29F002(A)(N)T", .bustype = CHIP_BUSTYPE_PARALLEL, .manufacture_id = EON_ID, .model_id = EN_29F002T, .total_size = 256, .page_size = 256, .feature_bits = FEATURE_ADDR_AAA | FEATURE_EITHER_RESET, .tested = TEST_UNTESTED, .probe = probe_jedec, .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */ - .erase = NULL, .block_erasers = { { .eraseblocks = { {16 * 1024, 1}, {8 * 1024, 2}, {32 * 1024, 1}, {64 * 1024, 3}, }, .block_erase = erase_sector_jedec, @@ -2232,21 +2157,20 @@ .name = "MBM29F004BC", .bustype = CHIP_BUSTYPE_PARALLEL, .manufacture_id = FUJITSU_ID, .model_id = MBM29F004BC, .total_size = 512, .page_size = 64 * 1024, .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET, .tested = TEST_UNTESTED, .probe = probe_jedec, .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */ - .erase = NULL, .block_erasers = { { .eraseblocks = { {16 * 1024, 1}, {8 * 1024, 2}, {32 * 1024, 1}, {64 * 1024, 7}, }, .block_erase = erase_sector_jedec, @@ -2264,21 +2188,20 @@ .name = "MBM29F004TC", .bustype = CHIP_BUSTYPE_PARALLEL, .manufacture_id = FUJITSU_ID, .model_id = MBM29F004TC, .total_size = 512, .page_size = 64 * 1024, .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET, .tested = TEST_UNTESTED, .probe = probe_jedec, .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */ - .erase = NULL, .block_erasers = { { .eraseblocks = { {64 * 1024, 7}, {32 * 1024, 1}, {8 * 1024, 2}, {16 * 1024, 1}, }, .block_erase = erase_sector_jedec, @@ -2297,21 +2220,20 @@ .name = "MBM29F400BC", .bustype = CHIP_BUSTYPE_PARALLEL, .manufacture_id = FUJITSU_ID, .model_id = MBM29F400BC, .total_size = 512, .page_size = 64 * 1024, .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_EITHER_RESET, .tested = TEST_UNTESTED, .probe = probe_m29f400bt, .probe_timing = TIMING_IGNORED, /* routine don't use probe_timing (m29f400bt.c) */ - .erase = NULL, .block_erasers = { { .eraseblocks = { {16 * 1024, 1}, {8 * 1024, 2}, {32 * 1024, 1}, {64 * 1024, 7}, }, .block_erase = block_erase_m29f400bt, @@ -2329,21 +2251,20 @@ .name = "MBM29F400TC", .bustype = CHIP_BUSTYPE_PARALLEL, .manufacture_id = FUJITSU_ID, .model_id = MBM29F400TC, .total_size = 512, .page_size = 64 * 1024, .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_EITHER_RESET, .tested = TEST_UNTESTED, .probe = probe_m29f400bt, .probe_timing = TIMING_IGNORED, /* routine don't use probe_timing (m29f400bt.c) */ - .erase = NULL, .block_erasers = { { .eraseblocks = { {64 * 1024, 7}, {32 * 1024, 1}, {8 * 1024, 2}, {16 * 1024, 1}, }, .block_erase = block_erase_m29f400bt, @@ -2361,21 +2282,20 @@ .name = "28F001BX-B", .bustype = CHIP_BUSTYPE_PARALLEL, .manufacture_id = INTEL_ID, .model_id = P28F001BXB, .total_size = 128, .page_size = 128 * 1024, /* 8k + 2x4k + 112k */ .feature_bits = 0, .tested = TEST_BAD_WRITE, .probe = probe_jedec, .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */ - .erase = NULL, .block_erasers = { { .eraseblocks = { {8 * 1024, 1}, {4 * 1024, 2}, {112 * 1024, 1}, }, .block_erase = erase_82802ab_block, }, @@ -2389,21 +2309,20 @@ .name = "28F001BX-T", .bustype = CHIP_BUSTYPE_PARALLEL, .manufacture_id = INTEL_ID, .model_id = P28F001BXT, .total_size = 128, .page_size = 128 * 1024, /* 112k + 2x4k + 8k */ .feature_bits = 0, .tested = TEST_BAD_WRITE, .probe = probe_jedec, .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */ - .erase = NULL, .block_erasers = { { .eraseblocks = { {112 * 1024, 1}, {4 * 1024, 2}, {8 * 1024, 1}, }, .block_erase = erase_82802ab_block, }, @@ -2417,21 +2336,20 @@ .name = "82802AB", .bustype = CHIP_BUSTYPE_FWH, .manufacture_id = INTEL_ID, .model_id = I_82802AB, .total_size = 512, .page_size = 64 * 1024, .feature_bits = 0, .tested = TEST_OK_PRW, .probe = probe_82802ab, .probe_timing = TIMING_IGNORED, /* routine does not use probe_timing (82802ab.c) */ - .erase = NULL, .block_erasers = { { .eraseblocks = { {64 * 1024, 8} }, .block_erase = erase_82802ab_block, }, }, .write = write_82802ab, .read = read_memmapped, }, @@ -2441,21 +2359,20 @@ .name = "82802AC", .bustype = CHIP_BUSTYPE_FWH, .manufacture_id = INTEL_ID, .model_id = I_82802AC, .total_size = 1024, .page_size = 64 * 1024, .feature_bits = 0, .tested = TEST_OK_PRW, .probe = probe_82802ab, .probe_timing = TIMING_IGNORED, /* routine does not use probe_timing (82802ab.c) */ - .erase = NULL, .block_erasers = { { .eraseblocks = { {64 * 1024, 16} }, .block_erase = erase_82802ab_block, }, }, .write = write_82802ab, .read = read_memmapped, }, @@ -2464,21 +2381,20 @@ .vendor = "Macronix", .name = "MX25L512", .bustype = CHIP_BUSTYPE_SPI, .manufacture_id = MX_ID, .model_id = MX_25L512, .total_size = 64, .page_size = 256, .tested = TEST_UNTESTED, .probe = probe_spi_rdid, .probe_timing = TIMING_ZERO, - .erase = NULL, .block_erasers = { { .eraseblocks = { {4 * 1024, 16} }, .block_erase = spi_block_erase_20, }, { .eraseblocks = { {64 * 1024, 1} }, .block_erase = spi_block_erase_52, }, { .eraseblocks = { {64 * 1024, 1} }, @@ -2499,21 +2415,20 @@ .vendor = "Macronix", .name = "MX25L1005", .bustype = CHIP_BUSTYPE_SPI, .manufacture_id = MX_ID, .model_id = MX_25L1005, .total_size = 128, .page_size = 256, .tested = TEST_UNTESTED, .probe = probe_spi_rdid, .probe_timing = TIMING_ZERO, - .erase = NULL, .block_erasers = { { .eraseblocks = { {4 * 1024, 32} }, .block_erase = spi_block_erase_20, }, { .eraseblocks = { {64 * 1024, 2} }, .block_erase = spi_block_erase_d8, }, { .eraseblocks = { {128 * 1024, 1} }, @@ -2531,21 +2446,20 @@ .vendor = "Macronix", .name = "MX25L2005", .bustype = CHIP_BUSTYPE_SPI, .manufacture_id = MX_ID, .model_id = MX_25L2005, .total_size = 256, .page_size = 256, .tested = TEST_UNTESTED, .probe = probe_spi_rdid, .probe_timing = TIMING_ZERO, - .erase = NULL, .block_erasers = { { .eraseblocks = { {4 * 1024, 64} }, .block_erase = spi_block_erase_20, }, { .eraseblocks = { {64 * 1024, 4} }, .block_erase = spi_block_erase_52, }, { .eraseblocks = { {64 * 1024, 4} }, @@ -2566,21 +2480,20 @@ .vendor = "Macronix", .name = "MX25L4005", .bustype = CHIP_BUSTYPE_SPI, .manufacture_id = MX_ID, .model_id = MX_25L4005, .total_size = 512, .page_size = 256, .tested = TEST_OK_PRW, .probe = probe_spi_rdid, .probe_timing = TIMING_ZERO, - .erase = NULL, .block_erasers = { { .eraseblocks = { {4 * 1024, 128} }, .block_erase = spi_block_erase_20, }, { .eraseblocks = { {64 * 1024, 8} }, .block_erase = spi_block_erase_52, }, { .eraseblocks = { {64 * 1024, 8} }, @@ -2601,21 +2514,20 @@ .vendor = "Macronix", .name = "MX25L8005", .bustype = CHIP_BUSTYPE_SPI, .manufacture_id = MX_ID, .model_id = MX_25L8005, .total_size = 1024, .page_size = 256, .tested = TEST_OK_PRW, .probe = probe_spi_rdid, .probe_timing = TIMING_ZERO, - .erase = NULL, .block_erasers = { { .eraseblocks = { {4 * 1024, 256} }, .block_erase = spi_block_erase_20, }, { .eraseblocks = { {64 * 1024, 16} }, .block_erase = spi_block_erase_52, }, { .eraseblocks = { {64 * 1024, 16} }, @@ -2636,21 +2548,20 @@ .vendor = "Macronix", .name = "MX25L1605", .bustype = CHIP_BUSTYPE_SPI, .manufacture_id = MX_ID, .model_id = MX_25L1605, .total_size = 2048, .page_size = 256, .tested = TEST_OK_PRW, .probe = probe_spi_rdid, .probe_timing = TIMING_ZERO, - .erase = NULL, .block_erasers = { { .eraseblocks = { {4 * 1024, 512} }, .block_erase = spi_block_erase_20, /* This erase function has 64k blocksize for eLiteFlash */ }, { .eraseblocks = { {64 * 1024, 32} }, /* Not supported in MX25L1605 (eLiteFlash) and MX25L1605D */ .block_erase = spi_block_erase_52, }, { .eraseblocks = { {64 * 1024, 32} }, @@ -2671,21 +2582,20 @@ .vendor = "Macronix", .name = "MX25L1635D", .bustype = CHIP_BUSTYPE_SPI, .manufacture_id = MX_ID, .model_id = MX_25L1635D, .total_size = 2048, .page_size = 256, .tested = TEST_UNTESTED, .probe = probe_spi_rdid, .probe_timing = TIMING_ZERO, - .erase = NULL, .block_erasers = { { .eraseblocks = { {4 * 1024, 512} }, .block_erase = spi_block_erase_20, }, { .eraseblocks = { {64 * 1024, 32} }, .block_erase = spi_block_erase_d8, }, { .eraseblocks = { {2 * 1024 * 1024, 1} }, @@ -2703,21 +2613,20 @@ .vendor = "Macronix", .name = "MX25L3205", .bustype = CHIP_BUSTYPE_SPI, .manufacture_id = MX_ID, .model_id = MX_25L3205, .total_size = 4096, .page_size = 256, .tested = TEST_OK_PRW, .probe = probe_spi_rdid, .probe_timing = TIMING_ZERO, - .erase = NULL, .block_erasers = { { .eraseblocks = { {4 * 1024, 1024} }, .block_erase = spi_block_erase_20, }, { .eraseblocks = { {4 * 1024, 1024} }, .block_erase = spi_block_erase_d8, }, { .eraseblocks = { {4 * 1024 * 1024, 1} }, @@ -2735,21 +2644,20 @@ .vendor = "Macronix", .name = "MX25L3235D", .bustype = CHIP_BUSTYPE_SPI, .manufacture_id = MX_ID, .model_id = MX_25L3235D, .total_size = 4096, .page_size = 256, .tested = TEST_UNTESTED, .probe = probe_spi_rdid, .probe_timing = TIMING_ZERO, - .erase = NULL, .block_erasers = { { .eraseblocks = { {4 * 1024, 1024} }, .block_erase = spi_block_erase_20, }, { .eraseblocks = { {64 * 1024, 64} }, .block_erase = spi_block_erase_d8, }, { .eraseblocks = { {4 * 1024 * 1024, 1} }, @@ -2767,21 +2675,20 @@ .vendor = "Macronix", .name = "MX25L6405", .bustype = CHIP_BUSTYPE_SPI, .manufacture_id = MX_ID, .model_id = MX_25L6405, .total_size = 8192, .page_size = 256, .tested = TEST_OK_PROBE, .probe = probe_spi_rdid, .probe_timing = TIMING_ZERO, - .erase = NULL, .block_erasers = { { .eraseblocks = { {64 * 1024, 128} }, .block_erase = spi_block_erase_20, }, { .eraseblocks = { {64 * 1024, 128} }, .block_erase = spi_block_erase_d8, }, { .eraseblocks = { {8 * 1024 * 1024, 1} }, @@ -2799,21 +2706,20 @@ .vendor = "Macronix", .name = "MX25L12805", .bustype = CHIP_BUSTYPE_SPI, .manufacture_id = MX_ID, .model_id = MX_25L12805, .total_size = 16384, .page_size = 256, .tested = TEST_UNTESTED, .probe = probe_spi_rdid, .probe_timing = TIMING_ZERO, - .erase = NULL, .block_erasers = { { .eraseblocks = { {4 * 1024, 4096} }, .block_erase = spi_block_erase_20, }, { .eraseblocks = { {64 * 1024, 256} }, .block_erase = spi_block_erase_d8, }, { .eraseblocks = { {16 * 1024 * 1024, 1} }, @@ -2832,21 +2738,20 @@ .name = "MX29F001B", .bustype = CHIP_BUSTYPE_PARALLEL, .manufacture_id = MX_ID, .model_id = MX_29F001B, .total_size = 128, .page_size = 32 * 1024, .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET, .tested = TEST_UNTESTED, .probe = probe_jedec, .probe_timing = TIMING_IGNORED, /* routine don't use probe_timing (mx29f002.c) */ - .erase = NULL, .block_erasers = { { .eraseblocks = { {8 * 1024, 1}, {4 * 1024, 2}, {8 * 1024, 2}, {32 * 1024, 1}, {64 * 1024, 1}, }, @@ -2865,21 +2770,20 @@ .name = "MX29F001T", .bustype = CHIP_BUSTYPE_PARALLEL, .manufacture_id = MX_ID, .model_id = MX_29F001T, .total_size = 128, .page_size = 32 * 1024, .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET, .tested = TEST_UNTESTED, .probe = probe_jedec, .probe_timing = TIMING_IGNORED, /* routine don't use probe_timing (mx29f002.c) */ - .erase = NULL, .block_erasers = { { .eraseblocks = { {64 * 1024, 1}, {32 * 1024, 1}, {8 * 1024, 2}, {4 * 1024, 2}, {8 * 1024, 1}, }, @@ -2898,21 +2802,20 @@ .name = "MX29F002B", .bustype = CHIP_BUSTYPE_PARALLEL, .manufacture_id = MX_ID, .model_id = MX_29F002B, .total_size = 256, .page_size = 64 * 1024, .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET, .tested = TEST_UNTESTED, .probe = probe_jedec, .probe_timing = TIMING_IGNORED, /* routine don't use probe_timing (mx29f002.c) */ - .erase = NULL, .block_erasers = { { .eraseblocks = { {16 * 1024, 1}, {8 * 1024, 2}, {32 * 1024, 1}, {64 * 1024, 3}, }, .block_erase = erase_sector_jedec, @@ -2930,21 +2833,20 @@ .name = "MX29F002T", .bustype = CHIP_BUSTYPE_PARALLEL, .manufacture_id = MX_ID, .model_id = MX_29F002T, .total_size = 256, .page_size = 64 * 1024, .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET, .tested = TEST_UNTESTED, .probe = probe_jedec, .probe_timing = TIMING_IGNORED, /* routine don't use probe_timing (mx29f002.c) */ - .erase = NULL, .block_erasers = { { .eraseblocks = { {64 * 1024, 3}, {32 * 1024, 1}, {8 * 1024, 2}, {16 * 1024, 1}, }, .block_erase = erase_sector_jedec, @@ -2962,21 +2864,20 @@ .name = "MX29LV040", .bustype = CHIP_BUSTYPE_PARALLEL, .manufacture_id = MX_ID, .model_id = MX_29LV040, .total_size = 512, .page_size = 64 * 1024, .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET, .tested = TEST_UNTESTED, .probe = probe_jedec, .probe_timing = TIMING_IGNORED, /* routine don't use probe_timing (mx29f002.c) */ - .erase = NULL, .block_erasers = { { .eraseblocks = { {64 * 1024, 8}, }, .block_erase = erase_sector_jedec, }, { .eraseblocks = { {512 * 1024, 1} }, .block_erase = erase_chip_block_jedec, }, }, @@ -2988,21 +2889,20 @@ .vendor = "Numonyx", .name = "M25PE10", .bustype = CHIP_BUSTYPE_SPI, .manufacture_id = ST_ID, .model_id = ST_M25PE10, .total_size = 128, .page_size = 256, .tested = TEST_UNTESTED, .probe = probe_spi_rdid, .probe_timing = TIMING_ZERO, - .erase = NULL, .block_erasers = { { .eraseblocks = { {4 * 1024, 32} }, .block_erase = spi_block_erase_20, }, { .eraseblocks = { {64 * 1024, 2} }, .block_erase = spi_block_erase_d8, }, { .eraseblocks = { {128 * 1024, 1} }, @@ -3017,21 +2917,20 @@ .vendor = "Numonyx", .name = "M25PE20", .bustype = CHIP_BUSTYPE_SPI, .manufacture_id = ST_ID, .model_id = ST_M25PE20, .total_size = 256, .page_size = 256, .tested = TEST_UNTESTED, .probe = probe_spi_rdid, .probe_timing = TIMING_ZERO, - .erase = NULL, .block_erasers = { { .eraseblocks = { {4 * 1024, 64} }, .block_erase = spi_block_erase_20, }, { .eraseblocks = { {64 * 1024, 4} }, .block_erase = spi_block_erase_d8, }, { .eraseblocks = { {256 * 1024, 1} }, @@ -3046,21 +2945,20 @@ .vendor = "Numonyx", .name = "M25PE40", .bustype = CHIP_BUSTYPE_SPI, .manufacture_id = ST_ID, .model_id = ST_M25PE40, .total_size = 512, .page_size = 256, .tested = TEST_UNTESTED, .probe = probe_spi_rdid, .probe_timing = TIMING_ZERO, - .erase = NULL, .block_erasers = { { .eraseblocks = { {4 * 1024, 128} }, .block_erase = spi_block_erase_20, }, { .eraseblocks = { {64 * 1024, 8} }, .block_erase = spi_block_erase_d8, }, { .eraseblocks = { {512 * 1024, 1} }, @@ -3075,21 +2973,20 @@ .vendor = "Numonyx", .name = "M25PE80", .bustype = CHIP_BUSTYPE_SPI, .manufacture_id = ST_ID, .model_id = ST_M25PE80, .total_size = 1024, .page_size = 256, .tested = TEST_OK_PREW, .probe = probe_spi_rdid, .probe_timing = TIMING_ZERO, - .erase = NULL, .block_erasers = { { .eraseblocks = { {4 * 1024, 256} }, .block_erase = spi_block_erase_20, }, { .eraseblocks = { {64 * 1024, 16} }, .block_erase = spi_block_erase_d8, }, { .eraseblocks = { {1024 * 1024, 1} }, @@ -3104,21 +3001,20 @@ .vendor = "Numonyx", .name = "M25PE16", .bustype = CHIP_BUSTYPE_SPI, .manufacture_id = ST_ID, .model_id = ST_M25PE16, .total_size = 2048, .page_size = 256, .tested = TEST_UNTESTED, .probe = probe_spi_rdid, .probe_timing = TIMING_ZERO, - .erase = NULL, .block_erasers = { { .eraseblocks = { {4 * 1024, 512} }, .block_erase = spi_block_erase_20, }, { .eraseblocks = { {64 * 1024, 32} }, .block_erase = spi_block_erase_d8, }, { .eraseblocks = { {2 * 1024 * 1024, 1} }, @@ -3133,21 +3029,20 @@ .vendor = "PMC", .name = "Pm25LV010", .bustype = CHIP_BUSTYPE_SPI, .manufacture_id = PMC_ID, .model_id = PMC_25LV010, .total_size = 128, .page_size = 256, .tested = TEST_UNTESTED, .probe = probe_spi_rdid, .probe_timing = TIMING_ZERO, - .erase = NULL, .block_erasers = { { .eraseblocks = { {4 * 1024, 32} }, .block_erase = spi_block_erase_d7, }, { .eraseblocks = { {32 * 1024, 4} }, .block_erase = spi_block_erase_d8, }, { .eraseblocks = { {128 * 1024, 1} }, @@ -3162,21 +3057,20 @@ .vendor = "PMC", .name = "Pm25LV016B", .bustype = CHIP_BUSTYPE_SPI, .manufacture_id = PMC_ID, .model_id = PMC_25LV016B, .total_size = 2048, .page_size = 256, .tested = TEST_UNTESTED, .probe = probe_spi_rdid, .probe_timing = TIMING_ZERO, - .erase = NULL, .block_erasers = { { .eraseblocks = { {4 * 1024, 512} }, .block_erase = spi_block_erase_d7, }, { .eraseblocks = { {4 * 1024, 512} }, .block_erase = spi_block_erase_20, }, { .eraseblocks = { {64 * 1024, 32} }, @@ -3197,21 +3091,20 @@ .vendor = "PMC", .name = "Pm25LV020", .bustype = CHIP_BUSTYPE_SPI, .manufacture_id = PMC_ID, .model_id = PMC_25LV020, .total_size = 256, .page_size = 256, .tested = TEST_UNTESTED, .probe = probe_spi_rdid, .probe_timing = TIMING_ZERO, - .erase = NULL, .block_erasers = { { .eraseblocks = { {4 * 1024, 64} }, .block_erase = spi_block_erase_d7, }, { .eraseblocks = { {64 * 1024, 4} }, .block_erase = spi_block_erase_d8, }, { .eraseblocks = { {256 * 1024, 1} }, @@ -3226,21 +3119,20 @@ .vendor = "PMC", .name = "Pm25LV040", .bustype = CHIP_BUSTYPE_SPI, .manufacture_id = PMC_ID, .model_id = PMC_25LV040, .total_size = 512, .page_size = 256, .tested = TEST_UNTESTED, .probe = probe_spi_rdid, .probe_timing = TIMING_ZERO, - .erase = NULL, .block_erasers = { { .eraseblocks = { {4 * 1024, 128} }, .block_erase = spi_block_erase_d7, }, { .eraseblocks = { {64 * 1024, 8} }, .block_erase = spi_block_erase_d8, }, { .eraseblocks = { {512 * 1024, 1} }, @@ -3255,21 +3147,20 @@ .vendor = "PMC", .name = "Pm25LV080B", .bustype = CHIP_BUSTYPE_SPI, .manufacture_id = PMC_ID, .model_id = PMC_25LV080B, .total_size = 1024, .page_size = 256, .tested = TEST_UNTESTED, .probe = probe_spi_rdid, .probe_timing = TIMING_ZERO, - .erase = NULL, .block_erasers = { { .eraseblocks = { {4 * 1024, 256} }, .block_erase = spi_block_erase_d7, }, { .eraseblocks = { {4 * 1024, 256} }, .block_erase = spi_block_erase_20, }, { .eraseblocks = { {64 * 1024, 16} }, @@ -3290,21 +3181,20 @@ .vendor = "PMC", .name = "Pm25LV512", .bustype = CHIP_BUSTYPE_SPI, .manufacture_id = PMC_ID, .model_id = PMC_25LV512, .total_size = 64, .page_size = 256, .tested = TEST_UNTESTED, .probe = probe_spi_rdid, .probe_timing = TIMING_ZERO, - .erase = NULL, .block_erasers = { { .eraseblocks = { {4 * 1024, 16} }, .block_erase = spi_block_erase_d7, }, { .eraseblocks = { {32 * 1024, 2} }, .block_erase = spi_block_erase_d8, }, { .eraseblocks = { {64 * 1024, 1} }, @@ -3320,21 +3210,20 @@ .name = "Pm29F002T", .bustype = CHIP_BUSTYPE_PARALLEL, .manufacture_id = PMC_ID_NOPREFIX, .model_id = PMC_29F002T, .total_size = 256, .page_size = 8 * 1024, .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET, .tested = TEST_UNTESTED, .probe = probe_jedec, .probe_timing = TIMING_FIXME, - .erase = NULL, .block_erasers = { { .eraseblocks = { {128 * 1024, 1}, {96 * 1024, 1}, {8 * 1024, 2}, {16 * 1024, 1}, }, .block_erase = erase_sector_jedec, @@ -3352,21 +3241,20 @@ .name = "Pm29F002B", .bustype = CHIP_BUSTYPE_PARALLEL, .manufacture_id = PMC_ID_NOPREFIX, .model_id = PMC_29F002B, .total_size = 256, .page_size = 8 * 1024, .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET, .tested = TEST_UNTESTED, .probe = probe_jedec, .probe_timing = TIMING_FIXME, - .erase = NULL, .block_erasers = { { .eraseblocks = { {16 * 1024, 1}, {8 * 1024, 2}, {96 * 1024, 1}, {128 * 1024, 1}, }, .block_erase = erase_sector_jedec, @@ -3384,21 +3272,20 @@ .name = "Pm39LV010", .bustype = CHIP_BUSTYPE_PARALLEL, .manufacture_id = PMC_ID_NOPREFIX, .model_id = PMC_39F010, .total_size = 128, .page_size = 4096, .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET, .tested = TEST_UNTESTED, .probe = probe_jedec, .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */ - .erase = NULL, .block_erasers = { { .eraseblocks = { {4 * 1024, 32} }, .block_erase = erase_sector_jedec, }, { .eraseblocks = { {64 * 1024, 2} }, .block_erase = erase_block_jedec, }, { .eraseblocks = { {128 * 1024, 1} }, @@ -3414,21 +3301,21 @@ .name = "Pm49FL002", .bustype = CHIP_BUSTYPE_LPC | CHIP_BUSTYPE_FWH, /* A/A Mux*/ .manufacture_id = PMC_ID_NOPREFIX, .model_id = PMC_49FL002, .total_size = 256, .page_size = 16 * 1024, .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET, .tested = TEST_UNTESTED, .probe = probe_jedec, .probe_timing = TIMING_ZERO, /* routine is wrapper to probe_jedec (pm49fl00x.c) */ - .erase = NULL, /* Was: erase_49fl00x */ + /* .erase = NULL, Was: erase_49fl00x */ .block_erasers = { { .eraseblocks = { {4 * 1024, 64} }, .block_erase = erase_sector_jedec, }, { .eraseblocks = { {16 * 1024, 16} }, .block_erase = erase_block_jedec, }, { .eraseblocks = { {256 * 1024, 1} }, @@ -3444,21 +3331,21 @@ .name = "Pm49FL004", .bustype = CHIP_BUSTYPE_LPC | CHIP_BUSTYPE_FWH, /* A/A Mux*/ .manufacture_id = PMC_ID_NOPREFIX, .model_id = PMC_49FL004, .total_size = 512, .page_size = 64 * 1024, .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET, .tested = TEST_UNTESTED, .probe = probe_jedec, .probe_timing = TIMING_ZERO, /* routine is wrapper to probe_jedec (pm49fl00x.c) */ - .erase = NULL, /* Was: erase_49fl00x */ + /* .erase = NULL, Was: erase_49fl00x */ .block_erasers = { { .eraseblocks = { {4 * 1024, 128} }, .block_erase = erase_sector_jedec, }, { .eraseblocks = { {64 * 1024, 8} }, .block_erase = erase_block_jedec, }, { .eraseblocks = { {512 * 1024, 1} }, @@ -3473,21 +3360,20 @@ .vendor = "Sanyo", .name = "LF25FW203A", .bustype = CHIP_BUSTYPE_SPI, .manufacture_id = SANYO_ID, .model_id = SANYO_LE25FW203A, .total_size = 2048, .page_size = 256, .tested = TEST_UNTESTED, .probe = probe_spi_rdid, .probe_timing = TIMING_ZERO, - .erase = NULL, .block_erasers = { { .eraseblocks = { {64 * 1024, 32} }, .block_erase = spi_block_erase_d8, }, { .eraseblocks = { {2 * 1024 * 1024, 1} }, .block_erase = spi_block_erase_c7, } }, @@ -3500,21 +3386,20 @@ .name = "LHF00L04", .bustype = CHIP_BUSTYPE_FWH, /* A/A Mux */ .manufacture_id = SHARP_ID, .model_id = SHARP_LHF00L04, .total_size = 1024, .page_size = 64 * 1024, .feature_bits = FEATURE_EITHER_RESET, .tested = TEST_UNTESTED, .probe = probe_49lfxxxc, .probe_timing = TIMING_ZERO, - .erase = NULL, .block_erasers = { { .eraseblocks = { {64 * 1024, 15}, {8 * 1024, 8} }, .block_erase = erase_lhf00l04_block, }, { .eraseblocks = { @@ -3531,21 +3416,20 @@ .vendor = "Spansion", .name = "S25FL008A", .bustype = CHIP_BUSTYPE_SPI, .manufacture_id = SPANSION_ID, .model_id = SPANSION_S25FL008A, .total_size = 1024, .page_size = 256, .tested = TEST_OK_PREW, .probe = probe_spi_rdid, .probe_timing = TIMING_ZERO, - .erase = NULL, .block_erasers = { { .eraseblocks = { {64 * 1024, 16} }, .block_erase = spi_block_erase_d8, }, { .eraseblocks = { {1024 * 1024, 1} }, .block_erase = spi_block_erase_c7, } }, @@ -3557,21 +3441,20 @@ .vendor = "Spansion", .name = "S25FL016A", .bustype = CHIP_BUSTYPE_SPI, .manufacture_id = SPANSION_ID, .model_id = SPANSION_S25FL016A, .total_size = 2048, .page_size = 256, .tested = TEST_OK_PRW, .probe = probe_spi_rdid, .probe_timing = TIMING_ZERO, - .erase = NULL, .block_erasers = { { .eraseblocks = { {64 * 1024, 32} }, .block_erase = spi_block_erase_d8, }, { .eraseblocks = { {2 * 1024 * 1024, 1} }, .block_erase = spi_block_erase_c7, } }, @@ -3583,21 +3466,20 @@ .vendor = "SST", .name = "SST25VF016B", .bustype = CHIP_BUSTYPE_SPI, .manufacture_id = SST_ID, .model_id = SST_25VF016B, .total_size = 2048, .page_size = 256, .tested = TEST_OK_PRW, .probe = probe_spi_rdid, .probe_timing = TIMING_ZERO, - .erase = NULL, .block_erasers = { { .eraseblocks = { {4 * 1024, 512} }, .block_erase = spi_block_erase_20, }, { .eraseblocks = { {32 * 1024, 64} }, .block_erase = spi_block_erase_52, }, { .eraseblocks = { {64 * 1024, 32} }, @@ -3618,21 +3500,20 @@ .vendor = "SST", .name = "SST25VF032B", .bustype = CHIP_BUSTYPE_SPI, .manufacture_id = SST_ID, .model_id = SST_25VF032B, .total_size = 4096, .page_size = 256, .tested = TEST_OK_PRW, .probe = probe_spi_rdid, .probe_timing = TIMING_ZERO, - .erase = NULL, .block_erasers = { { .eraseblocks = { {4 * 1024, 1024} }, .block_erase = spi_block_erase_20, }, { .eraseblocks = { {32 * 1024, 128} }, .block_erase = spi_block_erase_52, }, { .eraseblocks = { {64 * 1024, 64} }, @@ -3653,21 +3534,20 @@ .vendor = "SST", .name = "SST25VF040.REMS", .bustype = CHIP_BUSTYPE_SPI, .manufacture_id = SST_ID, .model_id = SST_25VF040_REMS, .total_size = 512, .page_size = 256, .tested = TEST_OK_PR, .probe = probe_spi_rems, .probe_timing = TIMING_ZERO, - .erase = NULL, .block_erasers = { { .eraseblocks = { {4 * 1024, 128} }, .block_erase = spi_block_erase_20, }, { .eraseblocks = { {32 * 1024, 16} }, .block_erase = spi_block_erase_52, }, { .eraseblocks = { {512 * 1024, 1} }, @@ -3682,21 +3562,20 @@ .vendor = "SST", .name = "SST25VF040B", .bustype = CHIP_BUSTYPE_SPI, .manufacture_id = SST_ID, .model_id = SST_25VF040B, .total_size = 512, .page_size = 256, .tested = TEST_UNTESTED, .probe = probe_spi_rdid, .probe_timing = TIMING_ZERO, - .erase = NULL, .block_erasers = { { .eraseblocks = { {4 * 1024, 128} }, .block_erase = spi_block_erase_20, }, { .eraseblocks = { {32 * 1024, 16} }, .block_erase = spi_block_erase_52, }, { .eraseblocks = { {64 * 1024, 8} }, @@ -3717,21 +3596,20 @@ .vendor = "SST", .name = "SST25VF040B.REMS", .bustype = CHIP_BUSTYPE_SPI, .manufacture_id = SST_ID, .model_id = SST_25VF040B_REMS, .total_size = 512, .page_size = 256, .tested = TEST_OK_PR, .probe = probe_spi_rems, .probe_timing = TIMING_ZERO, - .erase = NULL, .block_erasers = { { .eraseblocks = { {4 * 1024, 128} }, .block_erase = spi_block_erase_20, }, { .eraseblocks = { {32 * 1024, 16} }, .block_erase = spi_block_erase_52, }, { .eraseblocks = { {64 * 1024, 8} }, @@ -3752,21 +3630,20 @@ .vendor = "SST", .name = "SST25VF080B", .bustype = CHIP_BUSTYPE_SPI, .manufacture_id = SST_ID, .model_id = SST_25VF080B, .total_size = 1024, .page_size = 256, .tested = TEST_OK_PRW, .probe = probe_spi_rdid, .probe_timing = TIMING_ZERO, - .erase = NULL, .block_erasers = { { .eraseblocks = { {4 * 1024, 256} }, .block_erase = spi_block_erase_20, }, { .eraseblocks = { {32 * 1024, 32} }, .block_erase = spi_block_erase_52, }, { .eraseblocks = { {64 * 1024, 16} }, @@ -3788,21 +3665,20 @@ .name = "SST28SF040A", .bustype = CHIP_BUSTYPE_PARALLEL, .manufacture_id = SST_ID, .model_id = SST_28SF040, .total_size = 512, .page_size = 256, .feature_bits = 0, .tested = TEST_UNTESTED, .probe = probe_28sf040, .probe_timing = TIMING_IGNORED, /* routine don't use probe_timing (sst28sf040.c) */ - .erase = NULL, .block_erasers = { { .eraseblocks = { {128, 4096} }, .block_erase = erase_sector_28sf040, }, { .eraseblocks = { {512 * 1024, 1} }, .block_erase = erase_chip_28sf040, } }, @@ -3815,21 +3691,20 @@ .name = "SST29EE010", .bustype = CHIP_BUSTYPE_PARALLEL, .manufacture_id = SST_ID, .model_id = SST_29EE010, .total_size = 128, .page_size = 128, .feature_bits = FEATURE_LONG_RESET, .tested = TEST_UNTESTED, .probe = probe_jedec, .probe_timing = 10, - .erase = NULL, .block_erasers = { { .eraseblocks = { {128 * 1024, 1} }, .block_erase = erase_chip_block_jedec, } }, .write = write_jedec, .read = read_memmapped, }, @@ -3839,21 +3714,20 @@ .name = "SST29LE010", .bustype = CHIP_BUSTYPE_PARALLEL, .manufacture_id = SST_ID, .model_id = SST_29LE010, .total_size = 128, .page_size = 128, .feature_bits = FEATURE_LONG_RESET, .tested = TEST_UNTESTED, .probe = probe_jedec, .probe_timing = 10, - .erase = NULL, .block_erasers = { { .eraseblocks = { {128 * 1024, 1} }, .block_erase = erase_chip_block_jedec, } }, .write = write_jedec, .read = read_memmapped, }, @@ -3863,21 +3737,20 @@ .name = "SST29EE020A", .bustype = CHIP_BUSTYPE_PARALLEL, .manufacture_id = SST_ID, .model_id = SST_29EE020A, .total_size = 256, .page_size = 128, .feature_bits = FEATURE_LONG_RESET, .tested = TEST_UNTESTED, .probe = probe_jedec, .probe_timing = 10, - .erase = NULL, .block_erasers = { { .eraseblocks = { {256 * 1024, 1} }, .block_erase = erase_chip_block_jedec, } }, .write = write_jedec, .read = read_memmapped, }, @@ -3887,21 +3760,20 @@ .name = "SST29LE020", .bustype = CHIP_BUSTYPE_PARALLEL, .manufacture_id = SST_ID, .model_id = SST_29LE020, .total_size = 256, .page_size = 128, .feature_bits = FEATURE_LONG_RESET, .tested = TEST_UNTESTED, .probe = probe_jedec, .probe_timing = 10, - .erase = NULL, .block_erasers = { { .eraseblocks = { {256 * 1024, 1} }, .block_erase = erase_chip_block_jedec, } }, .write = write_jedec, .read = read_memmapped, }, @@ -3911,21 +3783,20 @@ .name = "SST39SF512", .bustype = CHIP_BUSTYPE_PARALLEL, .manufacture_id = SST_ID, .model_id = SST_39SF512, .total_size = 64, .page_size = 4096, .feature_bits = FEATURE_EITHER_RESET, .tested = TEST_UNTESTED, .probe = probe_jedec, .probe_timing = 1, /* 150 ns */ - .erase = NULL, .block_erasers = { { .eraseblocks = { {4 * 1024, 16} }, .block_erase = erase_sector_jedec, }, { .eraseblocks = { {64 * 1024, 1} }, .block_erase = erase_chip_block_jedec, } }, @@ -3938,21 +3809,20 @@ .name = "SST39SF010A", .bustype = CHIP_BUSTYPE_PARALLEL, .manufacture_id = SST_ID, .model_id = SST_39SF010, .total_size = 128, .page_size = 4096, .feature_bits = FEATURE_EITHER_RESET, .tested = TEST_UNTESTED, .probe = probe_jedec, .probe_timing = 1, /* 150 ns */ - .erase = NULL, .block_erasers = { { .eraseblocks = { {4 * 1024, 32} }, .block_erase = erase_sector_jedec, }, { .eraseblocks = { {128 * 1024, 1} }, .block_erase = erase_chip_block_jedec, } }, @@ -3965,21 +3835,20 @@ .name = "SST39SF020A", .bustype = CHIP_BUSTYPE_PARALLEL, .manufacture_id = SST_ID, .model_id = SST_39SF020, .total_size = 256, .page_size = 4096, .feature_bits = FEATURE_EITHER_RESET, .tested = TEST_UNTESTED, .probe = probe_jedec, .probe_timing = 1, /* 150 ns */ - .erase = NULL, .block_erasers = { { .eraseblocks = { {4 * 1024, 64} }, .block_erase = erase_sector_jedec, }, { .eraseblocks = { {256 * 1024, 1} }, .block_erase = erase_chip_block_jedec, } }, @@ -3992,21 +3861,20 @@ .name = "SST39SF040", .bustype = CHIP_BUSTYPE_PARALLEL, .manufacture_id = SST_ID, .model_id = SST_39SF040, .total_size = 512, .page_size = 4096, .feature_bits = FEATURE_EITHER_RESET, .tested = TEST_UNTESTED, .probe = probe_jedec, .probe_timing = 1, /* 150 ns */ - .erase = NULL, .block_erasers = { { .eraseblocks = { {4 * 1024, 128} }, .block_erase = erase_sector_jedec, }, { .eraseblocks = { {512 * 1024, 1} }, .block_erase = erase_chip_block_jedec, } }, @@ -4019,21 +3887,20 @@ .name = "SST39VF512", .bustype = CHIP_BUSTYPE_PARALLEL, .manufacture_id = SST_ID, .model_id = SST_39VF512, .total_size = 64, .page_size = 4096, .feature_bits = FEATURE_EITHER_RESET, .tested = TEST_UNTESTED, .probe = probe_jedec, .probe_timing = 1, /* 150 ns*/ - .erase = NULL, .block_erasers = { { .eraseblocks = { {4 * 1024, 16} }, .block_erase = erase_sector_jedec, }, { .eraseblocks = { {64 * 1024, 1} }, .block_erase = erase_chip_block_jedec, } }, @@ -4046,21 +3913,20 @@ .name = "SST39VF010", .bustype = CHIP_BUSTYPE_PARALLEL, .manufacture_id = SST_ID, .model_id = SST_39VF010, .total_size = 128, .page_size = 4096, .feature_bits = FEATURE_EITHER_RESET, .tested = TEST_UNTESTED, .probe = probe_jedec, .probe_timing = 1, /* 150 ns */ - .erase = NULL, .block_erasers = { { .eraseblocks = { {4 * 1024, 32} }, .block_erase = erase_sector_jedec, }, { .eraseblocks = { {128 * 1024, 1} }, .block_erase = erase_chip_block_jedec, } }, @@ -4073,21 +3939,20 @@ .name = "SST39VF020", .bustype = CHIP_BUSTYPE_PARALLEL, .manufacture_id = SST_ID, .model_id = SST_39VF020, .total_size = 256, .page_size = 4096, .feature_bits = FEATURE_EITHER_RESET, .tested = TEST_UNTESTED, .probe = probe_jedec, .probe_timing = 1, /* 150 ns */ - .erase = NULL, .block_erasers = { { .eraseblocks = { {4 * 1024, 64} }, .block_erase = erase_sector_jedec, }, { .eraseblocks = { {256 * 1024, 1} }, .block_erase = erase_chip_block_jedec, } }, @@ -4100,21 +3965,20 @@ .name = "SST39VF040", .bustype = CHIP_BUSTYPE_PARALLEL, .manufacture_id = SST_ID, .model_id = SST_39VF040, .total_size = 512, .page_size = 4096, .feature_bits = FEATURE_EITHER_RESET, .tested = TEST_UNTESTED, .probe = probe_jedec, .probe_timing = 1, /* 150 ns */ - .erase = NULL, .block_erasers = { { .eraseblocks = { {4 * 1024, 128} }, .block_erase = erase_sector_jedec, }, { .eraseblocks = { {512 * 1024, 1} }, .block_erase = erase_chip_block_jedec, } }, @@ -4127,21 +3991,20 @@ .name = "SST39VF080", .bustype = CHIP_BUSTYPE_PARALLEL, .manufacture_id = SST_ID, .model_id = SST_39VF080, .total_size = 1024, .page_size = 4096, .feature_bits = FEATURE_EITHER_RESET, .tested = TEST_UNTESTED, .probe = probe_jedec, .probe_timing = 1, /* 150 ns */ - .erase = NULL, .block_erasers = { { .eraseblocks = { {4 * 1024, 256} }, .block_erase = erase_sector_jedec, }, { .eraseblocks = { {64 * 1024, 16} }, .block_erase = erase_block_jedec, }, { .eraseblocks = { {1024 * 1024, 1} }, @@ -4157,21 +4020,20 @@ .name = "SST49LF002A/B", .bustype = CHIP_BUSTYPE_FWH, /* A/A Mux */ .manufacture_id = SST_ID, .model_id = SST_49LF002A, .total_size = 256, .page_size = 16 * 1024, .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET, .tested = TEST_OK_PRW, .probe = probe_sst_fwhub, .probe_timing = 1, /* 150 ns | routine is wrapper to probe_jedec (sst_fwhub.c) */ - .erase = NULL, .block_erasers = { { .eraseblocks = { {4 * 1024, 64} }, .block_erase = erase_sst_fwhub_sector, }, { .eraseblocks = { {16 * 1024, 16} }, .block_erase = erase_sst_fwhub_block, }, { .eraseblocks = { {256 * 1024, 1} }, @@ -4187,21 +4049,20 @@ .name = "SST49LF003A/B", .bustype = CHIP_BUSTYPE_FWH, /* A/A Mux */ .manufacture_id = SST_ID, .model_id = SST_49LF003A, .total_size = 384, .page_size = 64 * 1024, .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET, .tested = TEST_OK_PR, .probe = probe_sst_fwhub, .probe_timing = 1, /* 150 ns | routine is wrapper to probe_jedec (sst_fwhub.c) */ - .erase = NULL, .block_erasers = { { .eraseblocks = { {4 * 1024, 96} }, .block_erase = erase_sst_fwhub_sector, }, { .eraseblocks = { {64 * 1024, 6} }, .block_erase = erase_sst_fwhub_block, }, { .eraseblocks = { {384 * 1024, 1} }, @@ -4220,21 +4081,20 @@ .name = "SST49LF004A/B", .bustype = CHIP_BUSTYPE_FWH, /* A/A Mux */ .manufacture_id = SST_ID, .model_id = SST_49LF004A, .total_size = 512, .page_size = 64 * 1024, .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET, .tested = TEST_OK_PREW, .probe = probe_sst_fwhub, .probe_timing = 1, /* 150 ns | routine is wrapper to probe_jedec (sst_fwhub.c) */ - .erase = NULL, .block_erasers = { { .eraseblocks = { {4 * 1024, 128} }, .block_erase = erase_sector_jedec, /* missing unlock */ }, { .eraseblocks = { {64 * 1024, 8} }, .block_erase = erase_sst_fwhub_block, /* same as erase_block_jedec, but with unlock */ }, { .eraseblocks = { {512 * 1024, 1} }, @@ -4250,21 +4110,20 @@ .name = "SST49LF004C", .bustype = CHIP_BUSTYPE_FWH, .manufacture_id = SST_ID, .model_id = SST_49LF004C, .total_size = 512, .page_size = 4 * 1024, .feature_bits = 0, .tested = TEST_UNTESTED, .probe = probe_49lfxxxc, .probe_timing = TIMING_IGNORED, /* routine don't use probe_timing (sst49lfxxxc.c) */ - .erase = NULL, .block_erasers = { { .eraseblocks = { {4 * 1024, 128} }, .block_erase = erase_sector_49lfxxxc, }, { .eraseblocks = { {64 * 1024, 7}, {32 * 1024, 1}, {8 * 1024, 2}, @@ -4282,21 +4141,20 @@ .name = "SST49LF008A", .bustype = CHIP_BUSTYPE_FWH, /* A/A Mux */ .manufacture_id = SST_ID, .model_id = SST_49LF008A, .total_size = 1024, .page_size = 64 * 1024, .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET, .tested = TEST_OK_PRW, .probe = probe_sst_fwhub, .probe_timing = 1, /* 150 ns | routine is wrapper to probe_jedec (sst_fwhub.c) */ - .erase = NULL, .block_erasers = { { .eraseblocks = { {4 * 1024, 256} }, .block_erase = erase_sst_fwhub_sector, }, { .eraseblocks = { {64 * 1024, 16} }, .block_erase = erase_sst_fwhub_block, }, { .eraseblocks = { {1024 * 1024, 1} }, @@ -4312,21 +4170,20 @@ .name = "SST49LF008C", .bustype = CHIP_BUSTYPE_FWH, .manufacture_id = SST_ID, .model_id = SST_49LF008C, .total_size = 1024, .page_size = 4 * 1024, .feature_bits = 0, .tested = TEST_UNTESTED, .probe = probe_49lfxxxc, .probe_timing = TIMING_IGNORED, /* routine don't use probe_timing (sst49lfxxxc.c) */ - .erase = NULL, .block_erasers = { { .eraseblocks = { {4 * 1024, 256} }, .block_erase = erase_sector_49lfxxxc, }, { .eraseblocks = { {64 * 1024, 15}, {32 * 1024, 1}, {8 * 1024, 2}, @@ -4344,21 +4201,20 @@ .name = "SST49LF016C", .bustype = CHIP_BUSTYPE_FWH, .manufacture_id = SST_ID, .model_id = SST_49LF016C, .total_size = 2048, .page_size = 4 * 1024, .feature_bits = 0, .tested = TEST_OK_PRW, .probe = probe_49lfxxxc, .probe_timing = TIMING_IGNORED, /* routine don't use probe_timing (sst49lfxxxc.c) */ - .erase = NULL, .block_erasers = { { .eraseblocks = { {4 * 1024, 512} }, .block_erase = erase_sector_49lfxxxc, }, { .eraseblocks = { {64 * 1024, 31}, {32 * 1024, 1}, {8 * 1024, 2}, @@ -4376,21 +4232,20 @@ .name = "SST49LF020", .bustype = CHIP_BUSTYPE_LPC, .manufacture_id = SST_ID, .model_id = SST_49LF020, .total_size = 256, .page_size = 16 * 1024, .feature_bits = FEATURE_EITHER_RESET, .tested = TEST_UNTESTED, .probe = probe_jedec, .probe_timing = 1, /* 150 ns */ - .erase = NULL, .block_erasers = { { .eraseblocks = { {4 * 1024, 64} }, .block_erase = erase_sector_jedec, }, { .eraseblocks = { {16 * 1024, 16} }, .block_erase = erase_block_jedec, }, { .eraseblocks = { {256 * 1024, 1} }, @@ -4406,21 +4261,20 @@ .name = "SST49LF020A", .bustype = CHIP_BUSTYPE_LPC, .manufacture_id = SST_ID, .model_id = SST_49LF020A, .total_size = 256, .page_size = 4 * 1024, .feature_bits = FEATURE_EITHER_RESET, .tested = TEST_UNTESTED, .probe = probe_jedec, .probe_timing = 1, /* 150 ns */ - .erase = NULL, .block_erasers = { { .eraseblocks = { {4 * 1024, 64} }, .block_erase = erase_sector_jedec, }, { .eraseblocks = { {16 * 1024, 16} }, .block_erase = erase_block_jedec, }, { .eraseblocks = { {256 * 1024, 1} }, @@ -4436,21 +4290,20 @@ .name = "SST49LF040", .bustype = CHIP_BUSTYPE_LPC, .manufacture_id = SST_ID, .model_id = SST_49LF040, .total_size = 512, .page_size = 4096, .feature_bits = FEATURE_EITHER_RESET, .tested = TEST_UNTESTED, .probe = probe_jedec, .probe_timing = 1, /* 150 ns */ - .erase = NULL, .block_erasers = { { .eraseblocks = { {4 * 1024, 128} }, .block_erase = erase_sector_jedec, }, { .eraseblocks = { {64 * 1024, 8} }, .block_erase = erase_block_jedec, }, { .eraseblocks = { {512 * 1024, 1} }, @@ -4466,21 +4319,20 @@ .name = "SST49LF040B", .bustype = CHIP_BUSTYPE_LPC, /* A/A Mux */ .manufacture_id = SST_ID, .model_id = SST_49LF040B, .total_size = 512, .page_size = 64 * 1024, .feature_bits = FEATURE_EITHER_RESET, .tested = TEST_UNTESTED, .probe = probe_jedec, .probe_timing = 1, /* 150ns | routine is wrapper to probe_jedec (sst_fwhub.c) */ - .erase = NULL, .block_erasers = { { .eraseblocks = { {4 * 1024, 128} }, .block_erase = erase_sector_jedec, }, { .eraseblocks = { {64 * 1024, 8} }, .block_erase = erase_block_jedec, }, { .eraseblocks = { {512 * 1024, 1} }, @@ -4496,21 +4348,20 @@ .name = "SST49LF080A", .bustype = CHIP_BUSTYPE_LPC, /* A/A Mux */ .manufacture_id = SST_ID, .model_id = SST_49LF080A, .total_size = 1024, .page_size = 4096, .feature_bits = FEATURE_EITHER_RESET, .tested = TEST_UNTESTED, .probe = probe_jedec, .probe_timing = TIMING_FIXME, - .erase = NULL, .block_erasers = { { .eraseblocks = { {4 * 1024, 256} }, .block_erase = erase_sector_jedec, }, { .eraseblocks = { {64 * 1024, 16} }, .block_erase = erase_block_jedec, }, { .eraseblocks = { {1024 * 1024, 1} }, @@ -4526,22 +4377,21 @@ .name = "SST49LF160C", .bustype = CHIP_BUSTYPE_LPC, .manufacture_id = SST_ID, .model_id = SST_49LF160C, .total_size = 2048, .page_size = 4 * 1024, .feature_bits = 0, .tested = TEST_OK_PRW, .probe = probe_49lfxxxc, .probe_timing = TIMING_IGNORED, /* routine don't use probe_timing (sst49lfxxxc.c) */ - .erase = erase_49lfxxxc, - .erase = NULL, + /* .erase = NULL, Was: erase_49flxxxc */ .block_erasers = { { .eraseblocks = { {4 * 1024, 512} }, .block_erase = erase_sector_49lfxxxc, }, { .eraseblocks = { {64 * 1024, 31}, {32 * 1024, 1}, {8 * 1024, 2}, @@ -4558,21 +4408,20 @@ .vendor = "ST", .name = "M25P05-A", .bustype = CHIP_BUSTYPE_SPI, .manufacture_id = ST_ID, .model_id = ST_M25P05A, .total_size = 64, .page_size = 256, .tested = TEST_UNTESTED, .probe = probe_spi_rdid, .probe_timing = TIMING_ZERO, - .erase = NULL, .block_erasers = { { .eraseblocks = { {32 * 1024, 2} }, .block_erase = spi_block_erase_d8, }, { .eraseblocks = { {64 * 1024, 1} }, .block_erase = spi_block_erase_c7, } }, @@ -4589,21 +4438,20 @@ .vendor = "ST", .name = "M25P05.RES", .bustype = CHIP_BUSTYPE_SPI, .manufacture_id = ST_ID, .model_id = ST_M25P05_RES, .total_size = 64, .page_size = 256, .tested = TEST_UNTESTED, .probe = probe_spi_res, .probe_timing = TIMING_ZERO, - .erase = NULL, .block_erasers = { { .eraseblocks = { {32 * 1024, 2} }, .block_erase = spi_block_erase_d8, }, { .eraseblocks = { {64 * 1024, 1} }, .block_erase = spi_block_erase_c7, } }, @@ -4615,21 +4463,20 @@ .vendor = "ST", .name = "M25P10-A", .bustype = CHIP_BUSTYPE_SPI, .manufacture_id = ST_ID, .model_id = ST_M25P10A, .total_size = 128, .page_size = 256, .tested = TEST_UNTESTED, .probe = probe_spi_rdid, .probe_timing = TIMING_ZERO, - .erase = NULL, .block_erasers = { { .eraseblocks = { {32 * 1024, 4} }, .block_erase = spi_block_erase_d8, }, { .eraseblocks = { {128 * 1024, 1} }, .block_erase = spi_block_erase_c7, } }, @@ -4642,21 +4489,20 @@ .vendor = "ST", .name = "M25P10.RES", .bustype = CHIP_BUSTYPE_SPI, .manufacture_id = ST_ID, .model_id = ST_M25P10_RES, .total_size = 128, .page_size = 256, .tested = TEST_UNTESTED, .probe = probe_spi_res, .probe_timing = TIMING_ZERO, - .erase = NULL, .block_erasers = { { .eraseblocks = { {32 * 1024, 4} }, .block_erase = spi_block_erase_d8, }, { .eraseblocks = { {128 * 1024, 1} }, .block_erase = spi_block_erase_c7, } }, @@ -4668,21 +4514,20 @@ .vendor = "ST", .name = "M25P20", .bustype = CHIP_BUSTYPE_SPI, .manufacture_id = ST_ID, .model_id = ST_M25P20, .total_size = 256, .page_size = 256, .tested = TEST_UNTESTED, .probe = probe_spi_rdid, .probe_timing = TIMING_ZERO, - .erase = NULL, .block_erasers = { { .eraseblocks = { {64 * 1024, 4} }, .block_erase = spi_block_erase_d8, }, { .eraseblocks = { {256 * 1024, 1} }, .block_erase = spi_block_erase_c7, } }, @@ -4694,21 +4539,20 @@ .vendor = "ST", .name = "M25P40", .bustype = CHIP_BUSTYPE_SPI, .manufacture_id = ST_ID, .model_id = ST_M25P40, .total_size = 512, .page_size = 256, .tested = TEST_OK_PRW, .probe = probe_spi_rdid, .probe_timing = TIMING_ZERO, - .erase = NULL, .block_erasers = { { .eraseblocks = { {64 * 1024, 8} }, .block_erase = spi_block_erase_d8, }, { .eraseblocks = { {512 * 1024, 1} }, .block_erase = spi_block_erase_c7, } }, @@ -4720,21 +4564,20 @@ .vendor = "ST", .name = "M25P40-old", .bustype = CHIP_BUSTYPE_SPI, .manufacture_id = ST_ID, .model_id = ST_M25P40_RES, .total_size = 512, .page_size = 256, .tested = TEST_UNTESTED, .probe = probe_spi_res, .probe_timing = TIMING_ZERO, - .erase = NULL, .block_erasers = { { .eraseblocks = { {64 * 1024, 8} }, .block_erase = spi_block_erase_d8, }, { .eraseblocks = { {512 * 1024, 1} }, .block_erase = spi_block_erase_c7, } }, @@ -4746,21 +4589,20 @@ .vendor = "ST", .name = "M25P80", .bustype = CHIP_BUSTYPE_SPI, .manufacture_id = ST_ID, .model_id = ST_M25P80, .total_size = 1024, .page_size = 256, .tested = TEST_OK_PRW, .probe = probe_spi_rdid, .probe_timing = TIMING_ZERO, - .erase = NULL, .block_erasers = { { .eraseblocks = { {64 * 1024, 16} }, .block_erase = spi_block_erase_d8, }, { .eraseblocks = { {1024 * 1024, 1} }, .block_erase = spi_block_erase_c7, } }, @@ -4772,21 +4614,20 @@ .vendor = "ST", .name = "M25P16", .bustype = CHIP_BUSTYPE_SPI, .manufacture_id = ST_ID, .model_id = ST_M25P16, .total_size = 2048, .page_size = 256, .tested = TEST_OK_PRW, .probe = probe_spi_rdid, .probe_timing = TIMING_ZERO, - .erase = NULL, .block_erasers = { { .eraseblocks = { {64 * 1024, 32} }, .block_erase = spi_block_erase_d8, }, { .eraseblocks = { {2 * 1024 * 1024, 1} }, .block_erase = spi_block_erase_c7, } }, @@ -4798,21 +4639,20 @@ .vendor = "ST", .name = "M25P32", .bustype = CHIP_BUSTYPE_SPI, .manufacture_id = ST_ID, .model_id = ST_M25P32, .total_size = 4096, .page_size = 256, .tested = TEST_OK_PRW, .probe = probe_spi_rdid, .probe_timing = TIMING_ZERO, - .erase = NULL, .block_erasers = { { .eraseblocks = { {64 * 1024, 64} }, .block_erase = spi_block_erase_d8, }, { .eraseblocks = { {4 * 1024 * 1024, 1} }, .block_erase = spi_block_erase_c7, } }, @@ -4824,21 +4664,20 @@ .vendor = "ST", .name = "M25P64", .bustype = CHIP_BUSTYPE_SPI, .manufacture_id = ST_ID, .model_id = ST_M25P64, .total_size = 8192, .page_size = 256, .tested = TEST_UNTESTED, .probe = probe_spi_rdid, .probe_timing = TIMING_ZERO, - .erase = NULL, .block_erasers = { { .eraseblocks = { {64 * 1024, 128} }, .block_erase = spi_block_erase_d8, }, { .eraseblocks = { {8 * 1024 * 1024, 1} }, .block_erase = spi_block_erase_c7, } }, @@ -4850,21 +4689,20 @@ .vendor = "ST", .name = "M25P128", .bustype = CHIP_BUSTYPE_SPI, .manufacture_id = ST_ID, .model_id = ST_M25P128, .total_size = 16384, .page_size = 256, .tested = TEST_UNTESTED, .probe = probe_spi_rdid, .probe_timing = TIMING_ZERO, - .erase = NULL, .block_erasers = { { .eraseblocks = { {256 * 1024, 64} }, .block_erase = spi_block_erase_d8, }, { .eraseblocks = { {16 * 1024 * 1024, 1} }, .block_erase = spi_block_erase_c7, } }, @@ -4877,21 +4715,20 @@ .name = "M29F002B", .bustype = CHIP_BUSTYPE_PARALLEL, .manufacture_id = ST_ID, .model_id = ST_M29F002B, .total_size = 256, .page_size = 64 * 1024, .feature_bits = FEATURE_ADDR_AAA | FEATURE_EITHER_RESET, .tested = TEST_UNTESTED, .probe = probe_jedec, .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */ - .erase = NULL, .block_erasers = { { .eraseblocks = { {16 * 1024, 1}, {8 * 1024, 2}, {32 * 1024, 1}, {64 * 1024, 3}, }, .block_erase = erase_sector_jedec, @@ -4909,21 +4746,20 @@ .name = "M29F002T/NT", .bustype = CHIP_BUSTYPE_PARALLEL, .manufacture_id = ST_ID, .model_id = ST_M29F002T, .total_size = 256, .page_size = 64 * 1024, .feature_bits = FEATURE_ADDR_AAA | FEATURE_EITHER_RESET, .tested = TEST_UNTESTED, .probe = probe_jedec, .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */ - .erase = NULL, .block_erasers = { { .eraseblocks = { {64 * 1024, 3}, {32 * 1024, 1}, {8 * 1024, 2}, {16 * 1024, 1}, }, .block_erase = erase_sector_jedec, @@ -4941,21 +4777,20 @@ .name = "M29F040B", .bustype = CHIP_BUSTYPE_PARALLEL, .manufacture_id = ST_ID, .model_id = ST_M29F040B, .total_size = 512, .page_size = 64 * 1024, .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET, .tested = TEST_UNTESTED, .probe = probe_jedec, .probe_timing = TIMING_IGNORED, /* routine don't use probe_timing (am29f040b.c) */ - .erase = NULL, .block_erasers = { { .eraseblocks = { {64 * 1024, 8}, }, .block_erase = erase_sector_jedec, }, { .eraseblocks = { {512 * 1024, 1} }, .block_erase = erase_chip_block_jedec, } }, @@ -4969,21 +4804,20 @@ .name = "M29F400BT", .bustype = CHIP_BUSTYPE_PARALLEL, .manufacture_id = ST_ID, .model_id = ST_M29F400BT, .total_size = 512, .page_size = 64 * 1024, .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_EITHER_RESET, .tested = TEST_UNTESTED, .probe = probe_m29f400bt, .probe_timing = TIMING_IGNORED, /* routine don't use probe_timing (m29f400bt.c) */ - .erase = NULL, .block_erasers = { { .eraseblocks = { {64 * 1024, 7}, {32 * 1024, 1}, {8 * 1024, 2}, {16 * 1024, 1}, }, .block_erase = block_erase_m29f400bt, @@ -5001,21 +4835,20 @@ .name = "M29W010B", .bustype = CHIP_BUSTYPE_PARALLEL, .manufacture_id = ST_ID, .model_id = ST_M29W010B, .total_size = 128, .page_size = 16 * 1024, .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET, .tested = TEST_UNTESTED, .probe = probe_jedec, .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */ - .erase = NULL, .block_erasers = { { .eraseblocks = { {16 * 1024, 8}, }, .block_erase = erase_sector_jedec, }, { .eraseblocks = { {128 * 1024, 1} }, .block_erase = erase_chip_block_jedec, } }, @@ -5028,21 +4861,20 @@ .name = "M29W040B", .bustype = CHIP_BUSTYPE_PARALLEL, .manufacture_id = ST_ID, .model_id = ST_M29W040B, .total_size = 512, .page_size = 64 * 1024, .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET, .tested = TEST_UNTESTED, .probe = probe_jedec, .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */ - .erase = NULL, .block_erasers = { { .eraseblocks = { {64 * 1024, 8}, }, .block_erase = erase_sector_jedec, }, { .eraseblocks = { {512 * 1024, 1} }, .block_erase = erase_chip_block_jedec, } }, @@ -5055,21 +4887,20 @@ .name = "M29W512B", .bustype = CHIP_BUSTYPE_PARALLEL, .manufacture_id = ST_ID, .model_id = ST_M29W512B, .total_size = 64, .page_size = 64 * 1024, .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET, .tested = TEST_OK_PREW, .probe = probe_jedec, .probe_timing = TIMING_ZERO, - .erase = NULL, .block_erasers = { { .eraseblocks = { {64 * 1024, 1} }, .block_erase = erase_chip_block_jedec, } }, .write = write_jedec_1, .read = read_memmapped, }, @@ -5079,21 +4910,20 @@ .name = "M50FLW040A", .bustype = CHIP_BUSTYPE_FWH | CHIP_BUSTYPE_LPC, /* A/A Mux */ .manufacture_id = ST_ID, .model_id = ST_M50FLW040A, .total_size = 512, .page_size = 64 * 1024, .feature_bits = 0, .tested = TEST_UNTESTED, .probe = probe_82802ab, .probe_timing = TIMING_FIXME, - .erase = NULL, .block_erasers = { { .eraseblocks = { {4 * 1024, 16}, /* sector */ {64 * 1024, 5}, /* block */ {4 * 1024, 16}, /* sector */ {4 * 1024, 16}, /* sector */ }, .block_erase = NULL, @@ -5114,21 +4944,20 @@ .name = "M50FLW040B", .bustype = CHIP_BUSTYPE_FWH | CHIP_BUSTYPE_LPC, /* A/A Mux */ .manufacture_id = ST_ID, .model_id = ST_M50FLW040B, .total_size = 512, .page_size = 64 * 1024, .feature_bits = 0, .tested = TEST_UNTESTED, .probe = probe_82802ab, .probe_timing = TIMING_FIXME, - .erase = NULL, .block_erasers = { { .eraseblocks = { {4 * 1024, 16}, /* sector */ {4 * 1024, 16}, /* sector */ {64 * 1024, 5}, /* block */ {4 * 1024, 16}, /* sector */ }, .block_erase = NULL, @@ -5149,21 +4978,20 @@ .name = "M50FLW080A", .bustype = CHIP_BUSTYPE_FWH | CHIP_BUSTYPE_LPC, /* A/A Mux */ .manufacture_id = ST_ID, .model_id = ST_M50FLW080A, .total_size = 1024, .page_size = 64 * 1024, .feature_bits = 0, .tested = TEST_UNTESTED, .probe = probe_82802ab, .probe_timing = TIMING_FIXME, - .erase = NULL, .block_erasers = { { .eraseblocks = { {4 * 1024, 16}, /* sector */ {64 * 1024, 13}, /* block */ {4 * 1024, 16}, /* sector */ {4 * 1024, 16}, /* sector */ }, .block_erase = NULL, @@ -5184,21 +5012,20 @@ .name = "M50FLW080B", .bustype = CHIP_BUSTYPE_FWH | CHIP_BUSTYPE_LPC, /* A/A Mux */ .manufacture_id = ST_ID, .model_id = ST_M50FLW080B, .total_size = 1024, .page_size = 64 * 1024, .feature_bits = 0, .tested = TEST_UNTESTED, .probe = probe_82802ab, .probe_timing = TIMING_FIXME, - .erase = NULL, .block_erasers = { { .eraseblocks = { {4 * 1024, 16}, /* sector */ {4 * 1024, 16}, /* sector */ {64 * 1024, 13}, /* block */ {4 * 1024, 16}, /* sector */ }, .block_erase = NULL, @@ -5219,21 +5046,20 @@ .name = "M50FW002", .bustype = CHIP_BUSTYPE_FWH, /* A/A Mux */ .manufacture_id = ST_ID, .model_id = ST_M50FW002, .total_size = 256, .page_size = 64 * 1024, .feature_bits = 0, .tested = TEST_UNTESTED, .probe = probe_82802ab, .probe_timing = TIMING_IGNORED, /* routine don't use probe_timing (sst49lfxxxc.c) */ - .erase = NULL, .block_erasers = { { .eraseblocks = { {64 * 1024, 3}, {32 * 1024, 1}, {8 * 1024, 2}, {16 * 1024, 1}, }, .block_erase = erase_block_stm50flw0x0x, @@ -5251,21 +5077,20 @@ .name = "M50FW016", .bustype = CHIP_BUSTYPE_FWH, /* A/A Mux */ .manufacture_id = ST_ID, .model_id = ST_M50FW016, .total_size = 2048, .page_size = 64 * 1024, .feature_bits = 0, .tested = TEST_UNTESTED, .probe = probe_82802ab, .probe_timing = TIMING_IGNORED, /* routine don't use probe_timing (82802ab.c) */ - .erase = NULL, .block_erasers = { { .eraseblocks = { {64 * 1024, 32}, }, .block_erase = erase_block_stm50flw0x0x, }, { .eraseblocks = { {2 * 1024 * 1024, 1} }, .block_erase = erase_chip_stm50flw0x0x, } }, @@ -5278,21 +5103,20 @@ .name = "M50FW040", .bustype = CHIP_BUSTYPE_FWH, /* A/A Mux */ .manufacture_id = ST_ID, .model_id = ST_M50FW040, .total_size = 512, .page_size = 64 * 1024, .feature_bits = 0, .tested = TEST_OK_PRW, .probe = probe_82802ab, .probe_timing = TIMING_IGNORED, /* routine don't use probe_timing (82802ab.c) */ - .erase = NULL, .block_erasers = { { .eraseblocks = { {64 * 1024, 8}, }, .block_erase = erase_block_stm50flw0x0x, }, { .eraseblocks = { {512 * 1024, 1} }, .block_erase = erase_chip_stm50flw0x0x, } }, @@ -5305,21 +5129,20 @@ .name = "M50FW080", .bustype = CHIP_BUSTYPE_FWH, /* A/A Mux */ .manufacture_id = ST_ID, .model_id = ST_M50FW080, .total_size = 1024, .page_size = 64 * 1024, .feature_bits = 0, .tested = TEST_OK_PRW, .probe = probe_82802ab, .probe_timing = TIMING_IGNORED, /* routine don't use probe_timing (82802ab.c) */ - .erase = NULL, .block_erasers = { { .eraseblocks = { {64 * 1024, 16}, }, .block_erase = erase_block_stm50flw0x0x, }, { .eraseblocks = { {1024 * 1024, 1} }, .block_erase = erase_chip_stm50flw0x0x, } }, @@ -5332,21 +5155,20 @@ .name = "M50LPW116", .bustype = CHIP_BUSTYPE_LPC, /* A/A Mux */ .manufacture_id = ST_ID, .model_id = ST_M50LPW116, .total_size = 2048, .page_size = 64 * 1024, .feature_bits = 0, .tested = TEST_UNTESTED, .probe = probe_82802ab, .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */ - .erase = NULL, .block_erasers = { { .eraseblocks = { {4 * 1024, 16}, {64 * 1024, 30}, {32 * 1024, 1}, {8 * 1024, 2}, {16 * 1024, 1}, }, @@ -5365,21 +5187,20 @@ .name = "S29C31004T", .bustype = CHIP_BUSTYPE_PARALLEL, .manufacture_id = SYNCMOS_ID, .model_id = S29C31004T, .total_size = 512, .page_size = 128, .feature_bits = FEATURE_EITHER_RESET, .tested = TEST_UNTESTED, .probe = probe_jedec, .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */ - .erase = NULL, .block_erasers = { { .eraseblocks = { {1 * 1024, 512} }, .block_erase = erase_sector_jedec, }, { .eraseblocks = { {512 * 1024, 1} }, .block_erase = erase_chip_block_jedec, }, }, @@ -5392,21 +5213,20 @@ .name = "S29C51001T", .bustype = CHIP_BUSTYPE_PARALLEL, .manufacture_id = SYNCMOS_ID, .model_id = S29C51001T, .total_size = 128, .page_size = 128, .feature_bits = FEATURE_EITHER_RESET, .tested = TEST_UNTESTED, .probe = probe_jedec, .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */ - .erase = NULL, .block_erasers = { { .eraseblocks = { {512, 256} }, .block_erase = erase_sector_jedec, }, { .eraseblocks = { {128 * 1024, 1} }, .block_erase = erase_chip_block_jedec, }, }, @@ -5419,21 +5239,20 @@ .name = "S29C51002T", .bustype = CHIP_BUSTYPE_PARALLEL, .manufacture_id = SYNCMOS_ID, .model_id = S29C51002T, .total_size = 256, .page_size = 128, .feature_bits = FEATURE_EITHER_RESET, .tested = TEST_UNTESTED, .probe = probe_jedec, .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */ - .erase = NULL, .block_erasers = { { .eraseblocks = { {512, 512} }, .block_erase = erase_sector_jedec, }, { .eraseblocks = { {256 * 1024, 1} }, .block_erase = erase_chip_block_jedec, }, }, @@ -5446,21 +5265,20 @@ .name = "S29C51004T", .bustype = CHIP_BUSTYPE_PARALLEL, .manufacture_id = SYNCMOS_ID, .model_id = S29C51004T, .total_size = 512, .page_size = 128, .feature_bits = FEATURE_EITHER_RESET, .tested = TEST_UNTESTED, .probe = probe_jedec, .probe_timing = TIMING_ZERO, - .erase = NULL, .block_erasers = { { .eraseblocks = { {1 * 1024, 512} }, .block_erase = erase_sector_jedec, }, { .eraseblocks = { {512 * 1024, 1} }, .block_erase = erase_chip_block_jedec, }, }, @@ -5473,21 +5291,20 @@ .name = "TMS29F002RB", .bustype = CHIP_BUSTYPE_PARALLEL, .manufacture_id = TI_OLD_ID, .model_id = TI_TMS29F002RB, .total_size = 256, .page_size = 16384, /* Non-uniform sectors */ .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET, .tested = TEST_UNTESTED, .probe = probe_jedec, .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */ - .erase = NULL, .block_erasers = { { .eraseblocks = { {16 * 1024, 1}, {8 * 1024, 2}, {32 * 1024, 1}, {64 * 1024, 3}, }, .block_erase = erase_sector_jedec, @@ -5505,21 +5322,20 @@ .name = "TMS29F002RT", .bustype = CHIP_BUSTYPE_PARALLEL, .manufacture_id = TI_OLD_ID, .model_id = TI_TMS29F002RT, .total_size = 256, .page_size = 16384, /* Non-uniform sectors */ .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET, .tested = TEST_UNTESTED, .probe = probe_jedec, .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */ - .erase = NULL, .block_erasers = { { .eraseblocks = { {64 * 1024, 3}, {32 * 1024, 1}, {8 * 1024, 2}, {16 * 1024, 1}, }, .block_erase = erase_sector_jedec, @@ -5536,21 +5352,20 @@ .vendor = "Winbond", .name = "W25x10", .bustype = CHIP_BUSTYPE_SPI, .manufacture_id = WINBOND_NEX_ID, .model_id = W_25X10, .total_size = 128, .page_size = 256, .tested = TEST_UNTESTED, .probe = probe_spi_rdid, .probe_timing = TIMING_ZERO, - .erase = NULL, .block_erasers = { { .eraseblocks = { {4 * 1024, 32} }, .block_erase = spi_block_erase_20, }, { .eraseblocks = { {32 * 1024, 4} }, .block_erase = spi_block_erase_52, }, { .eraseblocks = { {64 * 1024, 2} }, @@ -5571,21 +5386,20 @@ .vendor = "Winbond", .name = "W25x20", .bustype = CHIP_BUSTYPE_SPI, .manufacture_id = WINBOND_NEX_ID, .model_id = W_25X20, .total_size = 256, .page_size = 256, .tested = TEST_UNTESTED, .probe = probe_spi_rdid, .probe_timing = TIMING_ZERO, - .erase = NULL, .block_erasers = { { .eraseblocks = { {4 * 1024, 64} }, .block_erase = spi_block_erase_20, }, { .eraseblocks = { {32 * 1024, 8} }, .block_erase = spi_block_erase_52, }, { .eraseblocks = { {64 * 1024, 4} }, @@ -5606,21 +5420,20 @@ .vendor = "Winbond", .name = "W25x40", .bustype = CHIP_BUSTYPE_SPI, .manufacture_id = WINBOND_NEX_ID, .model_id = W_25X40, .total_size = 512, .page_size = 256, .tested = TEST_OK_PRW, .probe = probe_spi_rdid, .probe_timing = TIMING_ZERO, - .erase = NULL, .block_erasers = { { .eraseblocks = { {4 * 1024, 128} }, .block_erase = spi_block_erase_20, }, { .eraseblocks = { {32 * 1024, 16} }, .block_erase = spi_block_erase_52, }, { .eraseblocks = { {64 * 1024, 8} }, @@ -5641,21 +5454,20 @@ .vendor = "Winbond", .name = "W25x80", .bustype = CHIP_BUSTYPE_SPI, .manufacture_id = WINBOND_NEX_ID, .model_id = W_25X80, .total_size = 1024, .page_size = 256, .tested = TEST_OK_PRW, .probe = probe_spi_rdid, .probe_timing = TIMING_ZERO, - .erase = NULL, .block_erasers = { { .eraseblocks = { {4 * 1024, 256} }, .block_erase = spi_block_erase_20, }, { .eraseblocks = { {32 * 1024, 32} }, .block_erase = spi_block_erase_52, }, { .eraseblocks = { {64 * 1024, 16} }, @@ -5676,21 +5488,20 @@ .vendor = "Winbond", .name = "W25x16", .bustype = CHIP_BUSTYPE_SPI, .manufacture_id = WINBOND_NEX_ID, .model_id = W_25X16, .total_size = 2048, .page_size = 256, .tested = TEST_OK_PR, .probe = probe_spi_rdid, .probe_timing = TIMING_ZERO, - .erase = NULL, .block_erasers = { { .eraseblocks = { {4 * 1024, 512} }, .block_erase = spi_block_erase_20, }, { .eraseblocks = { {32 * 1024, 64} }, .block_erase = spi_block_erase_52, }, { .eraseblocks = { {64 * 1024, 32} }, @@ -5711,21 +5522,20 @@ .vendor = "Winbond", .name = "W25x32", .bustype = CHIP_BUSTYPE_SPI, .manufacture_id = WINBOND_NEX_ID, .model_id = W_25X32, .total_size = 4096, .page_size = 256, .tested = TEST_OK_PROBE, .probe = probe_spi_rdid, .probe_timing = TIMING_ZERO, - .erase = NULL, .block_erasers = { { .eraseblocks = { {4 * 1024, 1024} }, .block_erase = spi_block_erase_20, }, { .eraseblocks = { {32 * 1024, 128} }, .block_erase = spi_block_erase_52, }, { .eraseblocks = { {64 * 1024, 64} }, @@ -5746,21 +5556,20 @@ .vendor = "Winbond", .name = "W25x64", .bustype = CHIP_BUSTYPE_SPI, .manufacture_id = WINBOND_NEX_ID, .model_id = W_25X64, .total_size = 8192, .page_size = 256, .tested = TEST_UNTESTED, .probe = probe_spi_rdid, .probe_timing = TIMING_ZERO, - .erase = NULL, .block_erasers = { { .eraseblocks = { {4 * 1024, 2048} }, .block_erase = spi_block_erase_20, }, { .eraseblocks = { {32 * 1024, 256} }, .block_erase = spi_block_erase_52, }, { .eraseblocks = { {64 * 1024, 128} }, @@ -5782,21 +5591,20 @@ .name = "W29C011", .bustype = CHIP_BUSTYPE_PARALLEL, .manufacture_id = WINBOND_ID, .model_id = W_29C011, .total_size = 128, .page_size = 128, .feature_bits = FEATURE_LONG_RESET, .tested = TEST_UNTESTED, .probe = probe_jedec, .probe_timing = 10, /* used datasheet for the W29C011A */ - .erase = NULL, .block_erasers = { { .eraseblocks = { {128 * 1024, 1} }, .block_erase = erase_chip_block_jedec, } }, .write = write_jedec, .read = read_memmapped, }, @@ -5806,21 +5614,20 @@ .name = "W29C020C", .bustype = CHIP_BUSTYPE_PARALLEL, .manufacture_id = WINBOND_ID, .model_id = W_29C020C, .total_size = 256, .page_size = 128, .feature_bits = FEATURE_LONG_RESET, .tested = TEST_UNTESTED, .probe = probe_jedec, .probe_timing = 10, - .erase = NULL, .block_erasers = { { .eraseblocks = { {256 * 1024, 1} }, .block_erase = erase_chip_block_jedec, } }, .write = write_jedec, .read = read_memmapped, }, @@ -5830,21 +5637,20 @@ .name = "W29C040P", .bustype = CHIP_BUSTYPE_PARALLEL, .manufacture_id = WINBOND_ID, .model_id = W_29C040P, .total_size = 512, .page_size = 256, .feature_bits = FEATURE_LONG_RESET, .tested = TEST_UNTESTED, .probe = probe_jedec, .probe_timing = 10, - .erase = NULL, .block_erasers = { { .eraseblocks = { {512 * 1024, 1} }, .block_erase = erase_chip_block_jedec, } }, .write = write_jedec, .read = read_memmapped, }, @@ -5854,21 +5660,20 @@ .name = "W29EE011", .bustype = CHIP_BUSTYPE_PARALLEL, .manufacture_id = WINBOND_ID, .model_id = W_29C011, .total_size = 128, .page_size = 128, .feature_bits = FEATURE_LONG_RESET, .tested = TEST_OK_PRW, .probe = probe_w29ee011, .probe_timing = TIMING_IGNORED, /* routine don't use probe_timing (w29ee011.c) */ - .erase = NULL, .block_erasers = { { .eraseblocks = { {128 * 1024, 1} }, .block_erase = erase_chip_block_jedec, } }, .write = write_jedec, .read = read_memmapped, }, @@ -5878,21 +5683,20 @@ .name = "W39V040A", .bustype = CHIP_BUSTYPE_LPC, .manufacture_id = WINBOND_ID, .model_id = W_39V040A, .total_size = 512, .page_size = 64 * 1024, .feature_bits = FEATURE_EITHER_RESET, .tested = TEST_UNTESTED, .probe = probe_jedec, .probe_timing = 10, - .erase = NULL, .block_erasers = { { .eraseblocks = { {64 * 1024, 8} }, .block_erase = erase_sector_jedec, }, { .eraseblocks = { {512 * 1024, 1} }, .block_erase = erase_chip_block_jedec, } }, @@ -5905,21 +5709,20 @@ .name = "W39V040B", .bustype = CHIP_BUSTYPE_LPC, .manufacture_id = WINBOND_ID, .model_id = W_39V040B, .total_size = 512, .page_size = 64 * 1024, .feature_bits = FEATURE_EITHER_RESET, .tested = TEST_UNTESTED, .probe = probe_jedec, .probe_timing = 10, - .erase = NULL, .block_erasers = { { .eraseblocks = { {64 * 1024, 8} }, .block_erase = erase_sector_jedec, }, { .eraseblocks = { {512 * 1024, 1} }, .block_erase = erase_chip_block_jedec, } }, @@ -5932,21 +5735,21 @@ .name = "W39V040C", .bustype = CHIP_BUSTYPE_LPC, .manufacture_id = WINBOND_ID, .model_id = W_39V040C, .total_size = 512, .page_size = 64 * 1024, .feature_bits = FEATURE_EITHER_RESET, .tested = TEST_UNTESTED, .probe = probe_jedec, .probe_timing = TIMING_FIXME, - .erase = NULL, /* Was erase_w39v040c */ + /* .erase = NULL, Was erase_w39v040c */ .block_erasers = { { .eraseblocks = { {64 * 1024, 8} }, .block_erase = erase_sector_jedec, }, { .eraseblocks = { {512 * 1024, 1} }, .block_erase = erase_chip_block_jedec, } }, @@ -5959,21 +5762,20 @@ .name = "W39V040FA", .bustype = CHIP_BUSTYPE_FWH, .manufacture_id = WINBOND_ID, .model_id = W_39V040FA, .total_size = 512, .page_size = 64 * 1024, .feature_bits = FEATURE_EITHER_RESET, .tested = TEST_UNTESTED, .probe = probe_jedec, .probe_timing = 10, - .erase = NULL, .block_erasers = { { .eraseblocks = { {4 * 1024, 128} }, .block_erase = erase_block_jedec, }, { .eraseblocks = { {64 * 1024, 8} }, .block_erase = erase_sector_jedec, }, { .eraseblocks = { {512 * 1024, 1} }, @@ -5989,21 +5791,20 @@ .name = "W39V080A", .bustype = CHIP_BUSTYPE_LPC, .manufacture_id = WINBOND_ID, .model_id = W_39V080A, .total_size = 1024, .page_size = 64 * 1024, .feature_bits = FEATURE_EITHER_RESET, .tested = TEST_UNTESTED, .probe = probe_jedec, .probe_timing = 10, - .erase = NULL, .block_erasers = { { .eraseblocks = { {64 * 1024, 16} }, .block_erase = erase_sector_jedec, }, { .eraseblocks = { {1024 * 1024, 1} }, .block_erase = erase_chip_block_jedec, } }, @@ -6016,21 +5817,20 @@ .name = "W49F002U", .bustype = CHIP_BUSTYPE_PARALLEL, .manufacture_id = WINBOND_ID, .model_id = W_49F002U, .total_size = 256, .page_size = 128, .feature_bits = FEATURE_EITHER_RESET, .tested = TEST_UNTESTED, .probe = probe_jedec, .probe_timing = 10, - .erase = NULL, .block_erasers = { { .eraseblocks = { {128 * 1024, 1}, {96 * 1024, 1}, {8 * 1024, 2}, {16 * 1024, 1}, }, .block_erase = erase_sector_jedec, @@ -6048,21 +5848,20 @@ .name = "W49V002A", .bustype = CHIP_BUSTYPE_LPC, .manufacture_id = WINBOND_ID, .model_id = W_49V002A, .total_size = 256, .page_size = 128, .feature_bits = FEATURE_EITHER_RESET, .tested = TEST_UNTESTED, .probe = probe_jedec, .probe_timing = 10, - .erase = NULL, .block_erasers = { { .eraseblocks = { {64 * 1024, 3}, {32 * 1024, 1}, {8 * 1024, 2}, {16 * 1024, 1}, }, .block_erase = erase_sector_jedec, @@ -6080,21 +5879,20 @@ .name = "W49V002FA", .bustype = CHIP_BUSTYPE_FWH, .manufacture_id = WINBOND_ID, .model_id = W_49V002FA, .total_size = 256, .page_size = 128, .feature_bits = FEATURE_EITHER_RESET, .tested = TEST_UNTESTED, .probe = probe_jedec, .probe_timing = 10, - .erase = NULL, .block_erasers = { { .eraseblocks = { {64 * 1024, 3}, {32 * 1024, 1}, {8 * 1024, 2}, {16 * 1024, 1}, }, .block_erase = erase_sector_jedec, @@ -6112,21 +5910,21 @@ .name = "W39V080FA", .bustype = CHIP_BUSTYPE_FWH, .manufacture_id = WINBOND_ID, .model_id = W_39V080FA, .total_size = 1024, .page_size = 64 * 1024, .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET, .tested = TEST_UNTESTED, .probe = probe_jedec, .probe_timing = TIMING_FIXME, - .erase = NULL, /* Was erase_winbond_fwhub */ + /* .erase = NULL, Was erase_winbond_fwhub */ .block_erasers = { { .eraseblocks = { {64 * 1024, 16}, }, .block_erase = erase_sector_jedec, }, { .eraseblocks = { {1024 * 1024, 1} }, .block_erase = erase_chip_block_jedec, } }, @@ -6139,21 +5937,21 @@ .name = "W39V080FA (dual mode)", .bustype = CHIP_BUSTYPE_FWH, .manufacture_id = WINBOND_ID, .model_id = W_39V080FA_DM, .total_size = 512, .page_size = 64 * 1024, .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET, .tested = TEST_UNTESTED, .probe = probe_jedec, .probe_timing = TIMING_FIXME, - .erase = NULL, /* Was erase_winbond_fwhub */ + /* .erase = NULL, Was erase_winbond_fwhub */ .block_erasers = { { .eraseblocks = { {64 * 1024, 8}, }, .block_erase = erase_sector_jedec, }, { .eraseblocks = { {512 * 1024, 1} }, .block_erase = erase_chip_block_jedec, } }, @@ -6165,140 +5963,131 @@ .vendor = "Atmel", .name = "unknown Atmel SPI chip", .bustype = CHIP_BUSTYPE_SPI, .manufacture_id = ATMEL_ID, .model_id = GENERIC_DEVICE_ID, .total_size = 0, .page_size = 256, .tested = TEST_BAD_PREW, .probe = probe_spi_rdid, .probe_timing = TIMING_ZERO, - .erase = NULL, .write = NULL, .read = NULL, },
{ .vendor = "EON", .name = "unknown EON SPI chip", .bustype = CHIP_BUSTYPE_SPI, .manufacture_id = EON_ID_NOPREFIX, .model_id = GENERIC_DEVICE_ID, .total_size = 0, .page_size = 256, .tested = TEST_BAD_PREW, .probe = probe_spi_rdid, .probe_timing = TIMING_ZERO, - .erase = NULL, .write = NULL, .read = NULL, },
{ .vendor = "Macronix", .name = "unknown Macronix SPI chip", .bustype = CHIP_BUSTYPE_SPI, .manufacture_id = MX_ID, .model_id = GENERIC_DEVICE_ID, .total_size = 0, .page_size = 256, .tested = TEST_BAD_PREW, .probe = probe_spi_rdid, .probe_timing = TIMING_ZERO, - .erase = NULL, .write = NULL, .read = NULL, },
{ .vendor = "PMC", .name = "unknown PMC SPI chip", .bustype = CHIP_BUSTYPE_SPI, .manufacture_id = PMC_ID, .model_id = GENERIC_DEVICE_ID, .total_size = 0, .page_size = 256, .tested = TEST_BAD_PREW, .probe = probe_spi_rdid, .probe_timing = TIMING_ZERO, - .erase = NULL, .write = NULL, .read = NULL, },
{ .vendor = "SST", .name = "unknown SST SPI chip", .bustype = CHIP_BUSTYPE_SPI, .manufacture_id = SST_ID, .model_id = GENERIC_DEVICE_ID, .total_size = 0, .page_size = 256, .tested = TEST_BAD_PREW, .probe = probe_spi_rdid, .probe_timing = TIMING_ZERO, - .erase = NULL, .write = NULL, .read = NULL, },
{ .vendor = "ST", .name = "unknown ST SPI chip", .bustype = CHIP_BUSTYPE_SPI, .manufacture_id = ST_ID, .model_id = GENERIC_DEVICE_ID, .total_size = 0, .page_size = 256, .tested = TEST_BAD_PREW, .probe = probe_spi_rdid, .probe_timing = TIMING_ZERO, - .erase = NULL, .write = NULL, .read = NULL, },
{ .vendor = "Sanyo", .name = "unknown Sanyo SPI chip", .bustype = CHIP_BUSTYPE_SPI, .manufacture_id = SANYO_ID, .model_id = GENERIC_DEVICE_ID, .total_size = 0, .page_size = 256, .tested = TEST_BAD_PREW, .probe = probe_spi_rdid, .probe_timing = TIMING_ZERO, - .erase = NULL, .write = NULL, .read = NULL, },
{ .vendor = "Generic", .name = "unknown SPI chip (RDID)", .bustype = CHIP_BUSTYPE_SPI, .manufacture_id = GENERIC_MANUF_ID, .model_id = GENERIC_DEVICE_ID, .total_size = 0, .page_size = 256, .tested = TEST_BAD_PREW, .probe = probe_spi_rdid, - .erase = NULL, .write = NULL, }, { .vendor = "Generic", .name = "unknown SPI chip (REMS)", .bustype = CHIP_BUSTYPE_SPI, .manufacture_id = GENERIC_MANUF_ID, .model_id = GENERIC_DEVICE_ID, .total_size = 0, .page_size = 256, .tested = TEST_BAD_PREW, .probe = probe_spi_rems, - .erase = NULL, .write = NULL, },
{ NULL } }; Index: flashrom-kill_chip_erase/flashrom.c =================================================================== --- flashrom-kill_chip_erase/flashrom.c (Revision 894) +++ flashrom-kill_chip_erase/flashrom.c (Arbeitskopie) @@ -968,26 +968,20 @@ if (ret) break; done += eraser.eraseblocks[i].count * eraser.eraseblocks[i].size; } printf_debug("\n"); /* If everything is OK, don't try another erase function. */ if (!ret) break; } - /* If no block erase function was found or block erase failed, retry. */ - if ((!found || ret) && (flash->erase)) { - found = 1; - printf_debug("Trying whole-chip erase function... "); - ret = flash->erase(flash); - } if (!found) { fprintf(stderr, "ERROR: flashrom has no erase function for this flash chip.\n"); return 1; }
if (ret) { fprintf(stderr, "FAILED!\n"); } else { printf("SUCCESS.\n"); }
On 2/11/10 6:23 AM, Carl-Daniel Hailfinger wrote:
At long last, the day has come, and we can bury full-chip erase once and for all. Back in November 2008(!) I proposed the first version of the flexible sector-based erase structure, and now we can finally rip out the old full-chip erase code without ill effects. Rejoice and party!
Signed-off-by: Carl-Daniel Hailfingerc-d.hailfinger.devel.2006@gmx.net
Acked-by: Sean Nelson audiohacked@gmail.com
On 11.02.2010 23:35, Sean Nelson wrote:
On 2/11/10 6:23 AM, Carl-Daniel Hailfinger wrote:
At long last, the day has come, and we can bury full-chip erase once and for all. Back in November 2008(!) I proposed the first version of the flexible sector-based erase structure, and now we can finally rip out the old full-chip erase code without ill effects. Rejoice and party!
Signed-off-by: Carl-Daniel Hailfingerc-d.hailfinger.devel.2006@gmx.net
Acked-by: Sean Nelson audiohacked@gmail.com
Thanks, committed in r895.
Regards, Carl-Daniel