diff options
author | Tadashi Abe <tabe@mvista.com> | 2011-05-19 15:58:15 +0900 |
---|---|---|
committer | David Woodhouse <David.Woodhouse@intel.com> | 2011-05-25 02:11:11 +0100 |
commit | 100f2341e305f98de3aa12fb472771ab029cbda7 (patch) | |
tree | 40cc6edf73cf06b6392a18fd496cb9dc071c98d4 /drivers/mtd/chips/cfi_cmdset_0002.c | |
parent | 52534f2dba5d033c0c33e515faa2767d7e8e986a (diff) | |
download | kernel_i9300_mainline-100f2341e305f98de3aa12fb472771ab029cbda7.zip kernel_i9300_mainline-100f2341e305f98de3aa12fb472771ab029cbda7.tar.gz kernel_i9300_mainline-100f2341e305f98de3aa12fb472771ab029cbda7.tar.bz2 |
mtd: fix hang-up in cfi erase and read contention
cfi erase command hangs up when erase and read contention occurs.
If read runs at the same address as erase operation, read issues
Erase-Suspend via get_chip() and the erase goes into sleep in wait queue.
But in this case, read operation exits by time-out without waking it up.
I think the other variants (0001, 0020 and lpddr) have the same problem too.
Tested and verified the patch only on CFI-0002 flash, though.
Signed-off-by: Tadashi Abe <tabe@mvista.com>
Acked-by: Joakim Tjernlund <joakim.tjernlund@transmode.se>
Signed-off-by: David Woodhouse <David.Woodhouse@intel.com>
Diffstat (limited to 'drivers/mtd/chips/cfi_cmdset_0002.c')
-rw-r--r-- | drivers/mtd/chips/cfi_cmdset_0002.c | 4 |
1 files changed, 1 insertions, 3 deletions
diff --git a/drivers/mtd/chips/cfi_cmdset_0002.c b/drivers/mtd/chips/cfi_cmdset_0002.c index b890f6c..9a99a5b 100644 --- a/drivers/mtd/chips/cfi_cmdset_0002.c +++ b/drivers/mtd/chips/cfi_cmdset_0002.c @@ -711,9 +711,7 @@ static int get_chip(struct map_info *map, struct flchip *chip, unsigned long adr * there was an error (so leave the erase * routine to recover from it) or we trying to * use the erase-in-progress sector. */ - map_write(map, cfi->sector_erase_cmd, chip->in_progress_block_addr); - chip->state = FL_ERASING; - chip->oldstate = FL_READY; + put_chip(map, chip, adr); printk(KERN_ERR "MTD %s(): chip not ready after erase suspend\n", __func__); return -EIO; } |