Skip to contentSkip to conversation

drivers/mtd/devices/m25p80.c: Fix whole device erase

PATCH In review Cédric Cano 2 participants 2 messages Sep 3, 2012 – Sep 21, 2012 Memory technology devices (MTD)

lore
Share & tools
lore
#0 lore raw

PATCH 2/2 drivers/mtd/devices/m25p80.c: Fix whole device erase

From: Cédric Cano <[email protected]>

There are two ways to erase SPI Flash devices: sector per sector or the entire Flash (used when MTD partition is the whole Flash).

When the whole Flash is erased, the SPI command is sent to the device and the erase function ends. Then, when another access (read, write or erase) is done, a wait of busy is performed that fails because of Flash erase time (can be more than 30s in case of whole erase).

This patch removes chip erase and use only sector per sector erase to erase the chip. When erase is performed, Flash accesses can be done.

C. Cano

---

drivers/mtd/devices/m25p80.c 2012-09-03 18:01:17.455724709 +0200 renamed from drivers/mtd/devices/m25p80.c 2012-09-03 18:03:35.787723207 +0200 +5 -46
@@ -202,31 +202,6 @@
     return -EBUSY;
 }
 
-/*
- * Erase the whole flash memory
- *
- * Returns 0 if successful, non-zero otherwise.
- */
-static int erase_chip(struct m25p *flash)
-{
-    pr_debug("%s: %s %lldKiB\n", dev_name(&flash->spi->dev), __func__,
-            (long long)(flash->mtd.size >> 10));
-
-    /* Wait until finished previous write command. */
-    if (wait_till_ready(flash))
-        return 1;
-
-    /* Send write enable, then erase commands. */
-    write_enable(flash);
-
-    /* Set up command buffer. */
-    flash->command[0] = OPCODE_CHIP_ERASE;
-
-    spi_write(flash->spi, flash->command, 1);
-
-    return 0;
-}
-
 static void m25p_addr2cmd(struct m25p *flash, unsigned int addr, u8 *cmd)
 {
     /* opcode is in cmd[0] */
@@ -301,33 +276,17 @@
 
     mutex_lock(&flash->lock);
 
-    /* whole-chip erase? */
-    if (len == flash->mtd.size) {
-        ret = erase_chip(flash);
+    /* "sector"-at-a-time erase */
+    while (len) {
+        ret = erase_sector(flash, addr);
         if (ret) {
             instr->state = MTD_ERASE_FAILED;
             mutex_unlock(&flash->lock);
             return ret;
         }
 
-    /* REVISIT in some cases we could speed up erasing large regions
-     * by using OPCODE_SE instead of OPCODE_BE_4K.  We may have set up
-     * to use "small sector erase", but that's not always optimal.
-     */
-
-    /* "sector"-at-a-time erase */
-    } else {
-        while (len) {
-            ret = erase_sector(flash, addr)
-            if (ret) {
-                instr->state = MTD_ERASE_FAILED;
-                mutex_unlock(&flash->lock);
-                return ret;
-            }
-
-            addr += mtd->erasesize;
-            len -= mtd->erasesize;
-        }
+        addr += mtd->erasesize;
+        len -= mtd->erasesize;
     }
 
     mutex_unlock(&flash->lock);

---

#1 lore raw
Quoted 5 lines · Cédric Cano

From: Cédric Cano <[email protected]>

There are two ways to erase SPI Flash devices: sector per sector or the entire Flash (used when MTD partition is the whole Flash).

Quoted 7 lines

When the whole Flash is erased, the SPI command is sent to the device and the erase function ends. Then, when another access (read, write or erase) is done, a wait of busy is performed that fails because of Flash erase time (can be more than 30s in case of whole erase).

This patch removes chip erase and use only sector per sector erase to erase the chip. When erase is performed, Flash accesses can be done.

Please, re-send the patch with a better commit message which not only explains _what_ you do, but also _why_ you do this, which problem you solve, and what is the impact of the patch.

Signature · 2 lines
Best Regards,
Artem Bityutskiy