Skip to content

Commit

Permalink
mtd: Bug in m25p80.c during whole-chip erase
Browse files Browse the repository at this point in the history
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@harris.com>
Signed-off-by: David Woodhouse <David.Woodhouse@intel.com>
  • Loading branch information
Steven A. Falco authored and David Woodhouse committed Apr 29, 2009
1 parent e769354 commit 3f33b0a
Showing 1 changed file with 7 additions and 5 deletions.
12 changes: 7 additions & 5 deletions drivers/mtd/devices/m25p80.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down

0 comments on commit 3f33b0a

Please sign in to comment.