@@ -48,6 +48,9 @@
#define SST49LF008A 0x005a
#define AT49BV6416 0x00d6
+/* Write operation timeout, ms */
+#define WRITE_TIEMEOUT 2
+
static int cfi_amdstd_read (struct mtd_info *, loff_t, size_t, size_t *, u_char *);
static int cfi_amdstd_write_words(struct mtd_info *, loff_t, size_t, size_t *, const u_char *);
static int cfi_amdstd_write_buffers(struct mtd_info *, loff_t, size_t, size_t *, const u_char *);
@@ -1143,17 +1146,6 @@ static int cfi_amdstd_secsi_read (struct mtd_info *mtd, loff_t from, size_t len,
static int __xipram do_write_oneword(struct map_info *map, struct flchip *chip, unsigned long adr, map_word datum)
{
struct cfi_private *cfi = map->fldrv_priv;
- unsigned long timeo = jiffies + HZ;
- /*
- * We use a 1ms + 1 jiffies generic timeout for writes (most devices
- * have a max write time of a few hundreds usec). However, we should
- * use the maximum timeout value given by the chip at probe time
- * instead. Unfortunately, struct flchip does have a field for
- * maximum timeout, only for typical which can be far too short
- * depending of the conditions. The ' + 1' is to avoid having a
- * timeout of 0 jiffies if HZ is smaller than 1000.
- */
- unsigned long uWriteTimeout = ( HZ / 1000 ) + 1;
int ret = 0;
map_word oldd;
int retry_cnt = 0;
@@ -1197,8 +1189,6 @@ static int __xipram do_write_oneword(struct map_info *map, struct flchip *chip,
adr, map_bankwidth(map),
chip->word_write_time);
- /* See comment above for timeout value. */
- timeo = jiffies + uWriteTimeout;
for (;;) {
if (chip->state != FL_WRITING) {
/* Someone's suspended the write. Sleep */
@@ -1207,20 +1197,18 @@ static int __xipram do_write_oneword(struct map_info *map, struct flchip *chip,
set_current_state(TASK_UNINTERRUPTIBLE);
add_wait_queue(&chip->wq, &wait);
mutex_unlock(&chip->mutex);
- schedule();
+ ret = schedule_timeout(msecs_to_jiffies(WRITE_TIEMEOUT));
remove_wait_queue(&chip->wq, &wait);
- timeo = jiffies + (HZ / 2); /* FIXME */
mutex_lock(&chip->mutex);
+ if (!ret) {
+ xip_enable(map, chip, adr);
+ printk(KERN_WARNING "MTD %s(): software timeout\n", __func__);
+ xip_disable(map, chip, adr);
+ break;
+ }
continue;
}
- if (time_after(jiffies, timeo) && !chip_ready(map, adr)){
- xip_enable(map, chip, adr);
- printk(KERN_WARNING "MTD %s(): software timeout\n", __func__);
- xip_disable(map, chip, adr);
- break;
- }
-
if (chip_ready(map, adr))
break;