do_erase_oneblock() wait queue

jean-francois simon jfs at themis.com
Mon May 29 06:29:06 EDT 2006


Hi,
I am going through the MTD code and I was wondering what function
is doing the wake_up() after do_erase_oneblock goes to sleep (see
1260 below).
My basic problem is that when i do an "eraseall /dev/mtd[x]' I
get a lot of input/output errors:

ash-3.00# eraseall /dev/mtd1
Erasing 256 Kibyte @ 0 --  0 % complete.
eraseall: /dev/mtd1: MTD Erase failure: Input/output error

My geometry is:
-interleave = 4
-bankwidth = 8 (64b)
p/n = ST MICRO M29DW640

In chip_good() I get a weird status of 005c005cffff0018 or
005cffff00180018

I am thinking that maybe I get woken up too early and before 
erase is complte, but since I  can't find who is doing it, I am 
not sure of it.
Note that it I comment out the "return -EIO" (line 1294) I can
erase the chips and write to them.

Thanks for the help,

-jf simon

1219 static inline int do_erase_oneblock(struct map_info *map,
struct flchip *chip, unsigned long adr, int len, void *thunk)
1220 {
1221         struct cfi_private *cfi = map->fldrv_priv;
1222         unsigned long timeo = jiffies + HZ;
1223         DECLARE_WAITQUEUE(wait, current);
1224         int ret = 0;
1225
1226         adr += chip->start;
1227
1228         cfi_spin_lock(chip->mutex);
1229         ret = get_chip(map, chip, adr, FL_ERASING);
1230         if (ret) {
1231                 cfi_spin_unlock(chip->mutex);
1232                 return ret;
1233         }
1234
1235         DEBUG( MTD_DEBUG_LEVEL3, "MTD %s(): ERASE 0x%.8lx\n",
1236                __func__, adr );
1237
1238         ENABLE_VPP(map);
1239         cfi_send_gen_cmd(0xAA, cfi->addr_unlock1,
chip->start, map, cfi, cfi->device_type, NULL);
1240         cfi_send_gen_cmd(0x55, cfi->addr_unlock2,
chip->start, map, cfi, cfi->device_type, NULL);
1241         cfi_send_gen_cmd(0x80, cfi->addr_unlock1,
chip->start, map, cfi, cfi->device_type, NULL);
1242         cfi_send_gen_cmd(0xAA, cfi->addr_unlock1,
chip->start, map, cfi, cfi->device_type, NULL);
1243         cfi_send_gen_cmd(0x55, cfi->addr_unlock2,
chip->start, map, cfi, cfi->device_type, NULL);
1244         map_write(map, CMD(0x30), adr);
1245
1246         chip->state = FL_ERASING;
1247         chip->erase_suspended = 0;
1248         chip->in_progress_block_addr = adr;
1249
1250         cfi_spin_unlock(chip->mutex);
1251         msleep(chip->erase_time/2);
1252         cfi_spin_lock(chip->mutex);
1253
1254         timeo = jiffies + (HZ*20);
1255
1256         for (;;) {
1257                 if (chip->state != FL_ERASING) {
1258                         /* Someone's suspended the erase.
Sleep */
1259                         set_current_state(TASK_UNINTERRUPTIBLE);
1260                         add_wait_queue(&chip->wq, &wait);
1261                         cfi_spin_unlock(chip->mutex);
1262                         schedule();
1263                         remove_wait_queue(&chip->wq, &wait);
1264                         cfi_spin_lock(chip->mutex);
1265                         continue;
1266                 }
1267                 if (chip->erase_suspended) {
1268                         /* This erase was suspended and resumed.
1269                            Adjust the timeout */
1270                         timeo = jiffies + (HZ*20); /* FIXME */
1271                         chip->erase_suspended = 0;
1272                 }
1273
1274                 if (chip_ready(map, adr))
1275                         goto op_done;
1276
1277                 if (time_after(jiffies, timeo))
1278                         break;
1279
1280                 /* Latency issues. Drop the lock, wait a
while and retry */
1281                 cfi_spin_unlock(chip->mutex);
1282                 set_current_state(TASK_UNINTERRUPTIBLE);
1283                 schedule_timeout(1);
1284                 cfi_spin_lock(chip->mutex);
1285         }
1286
1287         printk(KERN_WARNING "MTD %s(): software timeout\n",
1288                __func__ );
1289
1290         /* reset on all failures. */
1291         map_write( map, CMD(0xF0), chip->start );
1292         /* FIXME - should have reset delay before continuing */
1293
1294  		     ret = -EIO;
1295  op_done:
1296         chip->state = FL_READY;
1297         put_chip(map, chip, adr);
1298         cfi_spin_unlock(chip->mutex);
1299         return ret;
1300 }
1301




-- 

Best regards,
_______________________________________
jean-francois simon - themis computer
5, rue irene joliot curie
38330 eybens - france
+33 (0)870 448 638
+33 (0)4 76 14 77 85 - jfs at themis.com



	

	
		
___________________________________________________________________________ 
Yahoo! Mail réinvente le mail ! Découvrez le nouveau Yahoo! Mail et son interface révolutionnaire.
http://fr.mail.yahoo.com





More information about the linux-mtd mailing list