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>
This commit is contained in:

committed by
David Woodhouse

parent
52534f2dba
commit
100f2341e3
@@ -313,12 +313,7 @@ static int chip_ready(struct map_info *map, struct flchip *chip, int mode)
|
||||
if (ret) {
|
||||
/* Oops. something got wrong. */
|
||||
/* Resume and pretend we weren't here. */
|
||||
map_write(map, CMD(LPDDR_RESUME),
|
||||
map->pfow_base + PFOW_COMMAND_CODE);
|
||||
map_write(map, CMD(LPDDR_START_EXECUTION),
|
||||
map->pfow_base + PFOW_COMMAND_EXECUTE);
|
||||
chip->state = FL_ERASING;
|
||||
chip->oldstate = FL_READY;
|
||||
put_chip(map, chip);
|
||||
printk(KERN_ERR "%s: suspend operation failed."
|
||||
"State may be wrong \n", map->name);
|
||||
return -EIO;
|
||||
|
Reference in New Issue
Block a user