mtd: Bug in m25p80.c during whole-chip erase

Linux-MTD Mailing List linux-mtd at lists.infradead.org
Wed Apr 29 01:59:02 EDT 2009


Gitweb:     http://git.infradead.org/?p=mtd-2.6.git;a=commit;h=3f33b0aaac4e208579fe5aa2964857d4e9ba10c5
Commit:     3f33b0aaac4e208579fe5aa2964857d4e9ba10c5
Parent:     e7693548950ea5801d5d8b00414aed37033cf972
Author:     Steven A. Falco <sfalco at harris.com>
AuthorDate: Mon Apr 27 17:10:10 2009 -0400
Committer:  David Woodhouse <David.Woodhouse at intel.com>
CommitDate: Wed Apr 29 06:49:28 2009 +0100

    mtd: Bug in m25p80.c during whole-chip erase
    
    There is a logic error in "whole chip erase" for the m25p80 family.  If
    the whole device is successfully erased, erase_chip() will return 0, and
    the code will fall through to the "else" clause, and do sector-by-sector
    erase in addition to the whole-chip erase.  This patch corrects that.
    
    Also, the MAX_READY_WAIT_COUNT is insufficient for an m25p16 connected
    to a 400 MHz powerpc.  Increasing it allows me to successfully program
    the device on my board.
    
    Signed-off-by: Steven A. Falco <sfalco at harris.com>
    Signed-off-by: David Woodhouse <David.Woodhouse at intel.com>
---
 drivers/mtd/devices/m25p80.c |   12 +++++++-----
 1 files changed, 7 insertions(+), 5 deletions(-)

diff --git a/drivers/mtd/devices/m25p80.c b/drivers/mtd/devices/m25p80.c
index 8185b1f..dfadef8 100644
--- a/drivers/mtd/devices/m25p80.c
+++ b/drivers/mtd/devices/m25p80.c
@@ -54,7 +54,7 @@
 #define	SR_SRWD			0x80	/* SR write protect */
 
 /* Define max times to check status register before we give up. */
-#define	MAX_READY_WAIT_COUNT	100000
+#define	MAX_READY_WAIT_COUNT	1000000
 #define	CMD_SIZE		4
 
 #ifdef CONFIG_M25PXX_USE_FAST_READ
@@ -246,10 +246,12 @@ static int m25p80_erase(struct mtd_info *mtd, struct erase_info *instr)
 	mutex_lock(&flash->lock);
 
 	/* whole-chip erase? */
-	if (len == flash->mtd.size && erase_chip(flash)) {
-		instr->state = MTD_ERASE_FAILED;
-		mutex_unlock(&flash->lock);
-		return -EIO;
+	if (len == flash->mtd.size) {
+		if (erase_chip(flash)) {
+			instr->state = MTD_ERASE_FAILED;
+			mutex_unlock(&flash->lock);
+			return -EIO;
+		}
 
 	/* 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



More information about the linux-mtd-cvs mailing list