|
@@ -645,6 +645,23 @@ struct mtd_info *cfi_cmdset_0002(struct map_info *map, int primary)
|
|
cfi->chips[i].word_write_time = 1<<cfi->cfiq->WordWriteTimeoutTyp;
|
|
cfi->chips[i].word_write_time = 1<<cfi->cfiq->WordWriteTimeoutTyp;
|
|
cfi->chips[i].buffer_write_time = 1<<cfi->cfiq->BufWriteTimeoutTyp;
|
|
cfi->chips[i].buffer_write_time = 1<<cfi->cfiq->BufWriteTimeoutTyp;
|
|
cfi->chips[i].erase_time = 1<<cfi->cfiq->BlockEraseTimeoutTyp;
|
|
cfi->chips[i].erase_time = 1<<cfi->cfiq->BlockEraseTimeoutTyp;
|
|
|
|
+ /*
|
|
|
|
+ * First calculate the timeout max according to timeout field
|
|
|
|
+ * of struct cfi_ident that probed from chip's CFI aera, if
|
|
|
|
+ * available. Specify a minimum of 2000us, in case the CFI data
|
|
|
|
+ * is wrong.
|
|
|
|
+ */
|
|
|
|
+ if (cfi->cfiq->BufWriteTimeoutTyp &&
|
|
|
|
+ cfi->cfiq->BufWriteTimeoutMax)
|
|
|
|
+ cfi->chips[i].buffer_write_time_max =
|
|
|
|
+ 1 << (cfi->cfiq->BufWriteTimeoutTyp +
|
|
|
|
+ cfi->cfiq->BufWriteTimeoutMax);
|
|
|
|
+ else
|
|
|
|
+ cfi->chips[i].buffer_write_time_max = 0;
|
|
|
|
+
|
|
|
|
+ cfi->chips[i].buffer_write_time_max =
|
|
|
|
+ max(cfi->chips[i].buffer_write_time_max, 2000);
|
|
|
|
+
|
|
cfi->chips[i].ref_point_counter = 0;
|
|
cfi->chips[i].ref_point_counter = 0;
|
|
init_waitqueue_head(&(cfi->chips[i].wq));
|
|
init_waitqueue_head(&(cfi->chips[i].wq));
|
|
}
|
|
}
|
|
@@ -1774,8 +1791,12 @@ static int __xipram do_write_buffer(struct map_info *map, struct flchip *chip,
|
|
{
|
|
{
|
|
struct cfi_private *cfi = map->fldrv_priv;
|
|
struct cfi_private *cfi = map->fldrv_priv;
|
|
unsigned long timeo = jiffies + HZ;
|
|
unsigned long timeo = jiffies + HZ;
|
|
- /* see comments in do_write_oneword() regarding uWriteTimeo. */
|
|
|
|
- unsigned long uWriteTimeout = ( HZ / 1000 ) + 1;
|
|
|
|
|
|
+ /*
|
|
|
|
+ * Timeout is calculated according to CFI data, if available.
|
|
|
|
+ * See more comments in cfi_cmdset_0002().
|
|
|
|
+ */
|
|
|
|
+ unsigned long uWriteTimeout =
|
|
|
|
+ usecs_to_jiffies(chip->buffer_write_time_max);
|
|
int ret = -EIO;
|
|
int ret = -EIO;
|
|
unsigned long cmd_adr;
|
|
unsigned long cmd_adr;
|
|
int z, words;
|
|
int z, words;
|