Skip to contentSkip to conversation

do_erase_oneblock() wait queue

DISCUSSION jean-francois simon 1 participant 1 message May 29, 2006 Memory technology devices (MTD)

lore
Share & tools
lore
#0 lore raw

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

Signature · 16 lines
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 - [email protected]



	

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