aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/mtd/chips/cfi_cmdset_0001.c9
1 files changed, 8 insertions, 1 deletions
diff --git a/drivers/mtd/chips/cfi_cmdset_0001.c b/drivers/mtd/chips/cfi_cmdset_0001.c
index 324ff82a3cd9..5f1b472137a0 100644
--- a/drivers/mtd/chips/cfi_cmdset_0001.c
+++ b/drivers/mtd/chips/cfi_cmdset_0001.c
@@ -1149,7 +1149,7 @@ static int inval_cache_and_wait_for_operation(
1149 struct cfi_private *cfi = map->fldrv_priv; 1149 struct cfi_private *cfi = map->fldrv_priv;
1150 map_word status, status_OK = CMD(0x80); 1150 map_word status, status_OK = CMD(0x80);
1151 int chip_state = chip->state; 1151 int chip_state = chip->state;
1152 unsigned int timeo, sleep_time; 1152 unsigned int timeo, sleep_time, reset_timeo;
1153 1153
1154 spin_unlock(chip->mutex); 1154 spin_unlock(chip->mutex);
1155 if (inval_len) 1155 if (inval_len)
@@ -1160,6 +1160,7 @@ static int inval_cache_and_wait_for_operation(
1160 timeo = chip_op_time * 8; 1160 timeo = chip_op_time * 8;
1161 if (!timeo) 1161 if (!timeo)
1162 timeo = 500000; 1162 timeo = 500000;
1163 reset_timeo = timeo;
1163 sleep_time = chip_op_time / 2; 1164 sleep_time = chip_op_time / 2;
1164 1165
1165 for (;;) { 1166 for (;;) {
@@ -1201,6 +1202,12 @@ static int inval_cache_and_wait_for_operation(
1201 remove_wait_queue(&chip->wq, &wait); 1202 remove_wait_queue(&chip->wq, &wait);
1202 spin_lock(chip->mutex); 1203 spin_lock(chip->mutex);
1203 } 1204 }
1205 if (chip->erase_suspended || chip->write_suspended) {
1206 /* Suspend has occured while sleep: reset timeout */
1207 timeo = reset_timeo;
1208 chip->erase_suspended = 0;
1209 chip->write_suspended = 0;
1210 }
1204 } 1211 }
1205 1212
1206 /* Done and happy. */ 1213 /* Done and happy. */