RFC: [PATCH] MTD OneNAND: multiblock erase support
Kyungmin Park
kyungmin78 at gmail.com
Mon Jun 15 03:54:48 EDT 2009
On Mon, Jun 15, 2009 at 4:03 PM, Mika Korhonen<mika.j.korhonen at gmail.com> wrote:
> Hi,
>
> I wrote an initial support for OneNAND multiblock erase feature. When
> done in maximum 64 eraseblock batches multiblock erase is up to 30x
> faster than block-by-block erase (not including erase verify, though).
>
> However, I only had possibility to test this with an OMAP board, so I
> don't know if e.g. the default onenand_wait needs adjustment. Also for
> Flex-OneNAND the support goes off. Does Flex even have mb erase?
>
> What do you think?
>
Hi,
I think you should also modify onenand_wait. and Flex-OneNAND supports
the multi-block erase.
Do you consider the exception case if the multi-block erase failed?
I think you don't consider the bad block handling in case of multi-block erase
You first check the there's no bad block in multi-block erase. the
following code only exit. it means we never erase if we have bad
block.
+ while (do_mb_erase && len > block_size) {
+ /* Check if we have a bad block, we do not erase bad blocks */
+ if (onenand_block_isbad_nolock(mtd, addr, 0)) {
+ printk(KERN_WARNING "onenand_erase: attempt to erase "
+ "a bad block at addr 0x%08x\n", (unsigned int) addr);
+ instr->state = MTD_ERASE_FAILED;
+ goto erase_exit;
+ }
+
+ this->command(mtd, ONENAND_CMD_MULTIBLOCK_ERASE, addr, block_size);
+
+ onenand_invalidate_bufferram(mtd, addr, block_size);
+
+ ret = this->wait(mtd, FL_PREPARING_ERASE);
+ /* Check, if it is write protected */
+ if (ret) {
+ printk(KERN_ERR "onenand_erase: Failed multiblock erase, "
+ "block %d\n", (unsigned) (addr >>
this->erase_shift));
+ instr->state = MTD_ERASE_FAILED;
+ instr->fail_addr = addr;
+ goto erase_exit;
+ }
+ len -= block_size;
+ addr += block_size;
+ }
Thank you,
Kyungmin Park
More information about the linux-mtd
mailing list