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@themis.com ___________________________________________________________________________ Yahoo! Mail réinvente le mail ! Découvrez le nouveau Yahoo! Mail et son interface révolutionnaire. http://fr.mail.yahoo.com