xref: /linux/drivers/mtd/chips/cfi_cmdset_0020.c (revision ca55b2fef3a9373fcfc30f82fd26bc7fccbda732)
1 /*
2  * Common Flash Interface support:
3  *   ST Advanced Architecture Command Set (ID 0x0020)
4  *
5  * (C) 2000 Red Hat. GPL'd
6  *
7  * 10/10/2000	Nicolas Pitre <nico@fluxnic.net>
8  * 	- completely revamped method functions so they are aware and
9  * 	  independent of the flash geometry (buswidth, interleave, etc.)
10  * 	- scalability vs code size is completely set at compile-time
11  * 	  (see include/linux/mtd/cfi.h for selection)
12  *	- optimized write buffer method
13  * 06/21/2002	Joern Engel <joern@wh.fh-wedel.de> and others
14  *	- modified Intel Command Set 0x0001 to support ST Advanced Architecture
15  *	  (command set 0x0020)
16  *	- added a writev function
17  * 07/13/2005	Joern Engel <joern@wh.fh-wedel.de>
18  * 	- Plugged memory leak in cfi_staa_writev().
19  */
20 
21 #include <linux/module.h>
22 #include <linux/types.h>
23 #include <linux/kernel.h>
24 #include <linux/sched.h>
25 #include <asm/io.h>
26 #include <asm/byteorder.h>
27 
28 #include <linux/errno.h>
29 #include <linux/slab.h>
30 #include <linux/delay.h>
31 #include <linux/interrupt.h>
32 #include <linux/mtd/map.h>
33 #include <linux/mtd/cfi.h>
34 #include <linux/mtd/mtd.h>
35 
36 
37 static int cfi_staa_read(struct mtd_info *, loff_t, size_t, size_t *, u_char *);
38 static int cfi_staa_write_buffers(struct mtd_info *, loff_t, size_t, size_t *, const u_char *);
39 static int cfi_staa_writev(struct mtd_info *mtd, const struct kvec *vecs,
40 		unsigned long count, loff_t to, size_t *retlen);
41 static int cfi_staa_erase_varsize(struct mtd_info *, struct erase_info *);
42 static void cfi_staa_sync (struct mtd_info *);
43 static int cfi_staa_lock(struct mtd_info *mtd, loff_t ofs, uint64_t len);
44 static int cfi_staa_unlock(struct mtd_info *mtd, loff_t ofs, uint64_t len);
45 static int cfi_staa_suspend (struct mtd_info *);
46 static void cfi_staa_resume (struct mtd_info *);
47 
48 static void cfi_staa_destroy(struct mtd_info *);
49 
50 struct mtd_info *cfi_cmdset_0020(struct map_info *, int);
51 
52 static struct mtd_info *cfi_staa_setup (struct map_info *);
53 
54 static struct mtd_chip_driver cfi_staa_chipdrv = {
55 	.probe		= NULL, /* Not usable directly */
56 	.destroy	= cfi_staa_destroy,
57 	.name		= "cfi_cmdset_0020",
58 	.module		= THIS_MODULE
59 };
60 
61 /* #define DEBUG_LOCK_BITS */
62 //#define DEBUG_CFI_FEATURES
63 
64 #ifdef DEBUG_CFI_FEATURES
65 static void cfi_tell_features(struct cfi_pri_intelext *extp)
66 {
67         int i;
68         printk("  Feature/Command Support: %4.4X\n", extp->FeatureSupport);
69 	printk("     - Chip Erase:         %s\n", extp->FeatureSupport&1?"supported":"unsupported");
70 	printk("     - Suspend Erase:      %s\n", extp->FeatureSupport&2?"supported":"unsupported");
71 	printk("     - Suspend Program:    %s\n", extp->FeatureSupport&4?"supported":"unsupported");
72 	printk("     - Legacy Lock/Unlock: %s\n", extp->FeatureSupport&8?"supported":"unsupported");
73 	printk("     - Queued Erase:       %s\n", extp->FeatureSupport&16?"supported":"unsupported");
74 	printk("     - Instant block lock: %s\n", extp->FeatureSupport&32?"supported":"unsupported");
75 	printk("     - Protection Bits:    %s\n", extp->FeatureSupport&64?"supported":"unsupported");
76 	printk("     - Page-mode read:     %s\n", extp->FeatureSupport&128?"supported":"unsupported");
77 	printk("     - Synchronous read:   %s\n", extp->FeatureSupport&256?"supported":"unsupported");
78 	for (i=9; i<32; i++) {
79 		if (extp->FeatureSupport & (1<<i))
80 			printk("     - Unknown Bit %X:      supported\n", i);
81 	}
82 
83 	printk("  Supported functions after Suspend: %2.2X\n", extp->SuspendCmdSupport);
84 	printk("     - Program after Erase Suspend: %s\n", extp->SuspendCmdSupport&1?"supported":"unsupported");
85 	for (i=1; i<8; i++) {
86 		if (extp->SuspendCmdSupport & (1<<i))
87 			printk("     - Unknown Bit %X:               supported\n", i);
88 	}
89 
90 	printk("  Block Status Register Mask: %4.4X\n", extp->BlkStatusRegMask);
91 	printk("     - Lock Bit Active:      %s\n", extp->BlkStatusRegMask&1?"yes":"no");
92 	printk("     - Valid Bit Active:     %s\n", extp->BlkStatusRegMask&2?"yes":"no");
93 	for (i=2; i<16; i++) {
94 		if (extp->BlkStatusRegMask & (1<<i))
95 			printk("     - Unknown Bit %X Active: yes\n",i);
96 	}
97 
98 	printk("  Vcc Logic Supply Optimum Program/Erase Voltage: %d.%d V\n",
99 	       extp->VccOptimal >> 8, extp->VccOptimal & 0xf);
100 	if (extp->VppOptimal)
101 		printk("  Vpp Programming Supply Optimum Program/Erase Voltage: %d.%d V\n",
102 		       extp->VppOptimal >> 8, extp->VppOptimal & 0xf);
103 }
104 #endif
105 
106 /* This routine is made available to other mtd code via
107  * inter_module_register.  It must only be accessed through
108  * inter_module_get which will bump the use count of this module.  The
109  * addresses passed back in cfi are valid as long as the use count of
110  * this module is non-zero, i.e. between inter_module_get and
111  * inter_module_put.  Keith Owens <kaos@ocs.com.au> 29 Oct 2000.
112  */
113 struct mtd_info *cfi_cmdset_0020(struct map_info *map, int primary)
114 {
115 	struct cfi_private *cfi = map->fldrv_priv;
116 	int i;
117 
118 	if (cfi->cfi_mode) {
119 		/*
120 		 * It's a real CFI chip, not one for which the probe
121 		 * routine faked a CFI structure. So we read the feature
122 		 * table from it.
123 		 */
124 		__u16 adr = primary?cfi->cfiq->P_ADR:cfi->cfiq->A_ADR;
125 		struct cfi_pri_intelext *extp;
126 
127 		extp = (struct cfi_pri_intelext*)cfi_read_pri(map, adr, sizeof(*extp), "ST Microelectronics");
128 		if (!extp)
129 			return NULL;
130 
131 		if (extp->MajorVersion != '1' ||
132 		    (extp->MinorVersion < '0' || extp->MinorVersion > '3')) {
133 			printk(KERN_ERR "  Unknown ST Microelectronics"
134 			       " Extended Query version %c.%c.\n",
135 			       extp->MajorVersion, extp->MinorVersion);
136 			kfree(extp);
137 			return NULL;
138 		}
139 
140 		/* Do some byteswapping if necessary */
141 		extp->FeatureSupport = cfi32_to_cpu(map, extp->FeatureSupport);
142 		extp->BlkStatusRegMask = cfi32_to_cpu(map,
143 						extp->BlkStatusRegMask);
144 
145 #ifdef DEBUG_CFI_FEATURES
146 		/* Tell the user about it in lots of lovely detail */
147 		cfi_tell_features(extp);
148 #endif
149 
150 		/* Install our own private info structure */
151 		cfi->cmdset_priv = extp;
152 	}
153 
154 	for (i=0; i< cfi->numchips; i++) {
155 		cfi->chips[i].word_write_time = 128;
156 		cfi->chips[i].buffer_write_time = 128;
157 		cfi->chips[i].erase_time = 1024;
158 		cfi->chips[i].ref_point_counter = 0;
159 		init_waitqueue_head(&(cfi->chips[i].wq));
160 	}
161 
162 	return cfi_staa_setup(map);
163 }
164 EXPORT_SYMBOL_GPL(cfi_cmdset_0020);
165 
166 static struct mtd_info *cfi_staa_setup(struct map_info *map)
167 {
168 	struct cfi_private *cfi = map->fldrv_priv;
169 	struct mtd_info *mtd;
170 	unsigned long offset = 0;
171 	int i,j;
172 	unsigned long devsize = (1<<cfi->cfiq->DevSize) * cfi->interleave;
173 
174 	mtd = kzalloc(sizeof(*mtd), GFP_KERNEL);
175 	//printk(KERN_DEBUG "number of CFI chips: %d\n", cfi->numchips);
176 
177 	if (!mtd) {
178 		kfree(cfi->cmdset_priv);
179 		return NULL;
180 	}
181 
182 	mtd->priv = map;
183 	mtd->type = MTD_NORFLASH;
184 	mtd->size = devsize * cfi->numchips;
185 
186 	mtd->numeraseregions = cfi->cfiq->NumEraseRegions * cfi->numchips;
187 	mtd->eraseregions = kmalloc(sizeof(struct mtd_erase_region_info)
188 			* mtd->numeraseregions, GFP_KERNEL);
189 	if (!mtd->eraseregions) {
190 		kfree(cfi->cmdset_priv);
191 		kfree(mtd);
192 		return NULL;
193 	}
194 
195 	for (i=0; i<cfi->cfiq->NumEraseRegions; i++) {
196 		unsigned long ernum, ersize;
197 		ersize = ((cfi->cfiq->EraseRegionInfo[i] >> 8) & ~0xff) * cfi->interleave;
198 		ernum = (cfi->cfiq->EraseRegionInfo[i] & 0xffff) + 1;
199 
200 		if (mtd->erasesize < ersize) {
201 			mtd->erasesize = ersize;
202 		}
203 		for (j=0; j<cfi->numchips; j++) {
204 			mtd->eraseregions[(j*cfi->cfiq->NumEraseRegions)+i].offset = (j*devsize)+offset;
205 			mtd->eraseregions[(j*cfi->cfiq->NumEraseRegions)+i].erasesize = ersize;
206 			mtd->eraseregions[(j*cfi->cfiq->NumEraseRegions)+i].numblocks = ernum;
207 		}
208 		offset += (ersize * ernum);
209 	}
210 
211 	if (offset != devsize) {
212 		/* Argh */
213 		printk(KERN_WARNING "Sum of regions (%lx) != total size of set of interleaved chips (%lx)\n", offset, devsize);
214 		kfree(mtd->eraseregions);
215 		kfree(cfi->cmdset_priv);
216 		kfree(mtd);
217 		return NULL;
218 	}
219 
220 	for (i=0; i<mtd->numeraseregions;i++){
221 		printk(KERN_DEBUG "%d: offset=0x%llx,size=0x%x,blocks=%d\n",
222 		       i, (unsigned long long)mtd->eraseregions[i].offset,
223 		       mtd->eraseregions[i].erasesize,
224 		       mtd->eraseregions[i].numblocks);
225 	}
226 
227 	/* Also select the correct geometry setup too */
228 	mtd->_erase = cfi_staa_erase_varsize;
229 	mtd->_read = cfi_staa_read;
230 	mtd->_write = cfi_staa_write_buffers;
231 	mtd->_writev = cfi_staa_writev;
232 	mtd->_sync = cfi_staa_sync;
233 	mtd->_lock = cfi_staa_lock;
234 	mtd->_unlock = cfi_staa_unlock;
235 	mtd->_suspend = cfi_staa_suspend;
236 	mtd->_resume = cfi_staa_resume;
237 	mtd->flags = MTD_CAP_NORFLASH & ~MTD_BIT_WRITEABLE;
238 	mtd->writesize = 8; /* FIXME: Should be 0 for STMicro flashes w/out ECC */
239 	mtd->writebufsize = cfi_interleave(cfi) << cfi->cfiq->MaxBufWriteSize;
240 	map->fldrv = &cfi_staa_chipdrv;
241 	__module_get(THIS_MODULE);
242 	mtd->name = map->name;
243 	return mtd;
244 }
245 
246 
247 static inline int do_read_onechip(struct map_info *map, struct flchip *chip, loff_t adr, size_t len, u_char *buf)
248 {
249 	map_word status, status_OK;
250 	unsigned long timeo;
251 	DECLARE_WAITQUEUE(wait, current);
252 	int suspended = 0;
253 	unsigned long cmd_addr;
254 	struct cfi_private *cfi = map->fldrv_priv;
255 
256 	adr += chip->start;
257 
258 	/* Ensure cmd read/writes are aligned. */
259 	cmd_addr = adr & ~(map_bankwidth(map)-1);
260 
261 	/* Let's determine this according to the interleave only once */
262 	status_OK = CMD(0x80);
263 
264 	timeo = jiffies + HZ;
265  retry:
266 	mutex_lock(&chip->mutex);
267 
268 	/* Check that the chip's ready to talk to us.
269 	 * If it's in FL_ERASING state, suspend it and make it talk now.
270 	 */
271 	switch (chip->state) {
272 	case FL_ERASING:
273 		if (!(((struct cfi_pri_intelext *)cfi->cmdset_priv)->FeatureSupport & 2))
274 			goto sleep; /* We don't support erase suspend */
275 
276 		map_write (map, CMD(0xb0), cmd_addr);
277 		/* If the flash has finished erasing, then 'erase suspend'
278 		 * appears to make some (28F320) flash devices switch to
279 		 * 'read' mode.  Make sure that we switch to 'read status'
280 		 * mode so we get the right data. --rmk
281 		 */
282 		map_write(map, CMD(0x70), cmd_addr);
283 		chip->oldstate = FL_ERASING;
284 		chip->state = FL_ERASE_SUSPENDING;
285 		//		printk("Erase suspending at 0x%lx\n", cmd_addr);
286 		for (;;) {
287 			status = map_read(map, cmd_addr);
288 			if (map_word_andequal(map, status, status_OK, status_OK))
289 				break;
290 
291 			if (time_after(jiffies, timeo)) {
292 				/* Urgh */
293 				map_write(map, CMD(0xd0), cmd_addr);
294 				/* make sure we're in 'read status' mode */
295 				map_write(map, CMD(0x70), cmd_addr);
296 				chip->state = FL_ERASING;
297 				wake_up(&chip->wq);
298 				mutex_unlock(&chip->mutex);
299 				printk(KERN_ERR "Chip not ready after erase "
300 				       "suspended: status = 0x%lx\n", status.x[0]);
301 				return -EIO;
302 			}
303 
304 			mutex_unlock(&chip->mutex);
305 			cfi_udelay(1);
306 			mutex_lock(&chip->mutex);
307 		}
308 
309 		suspended = 1;
310 		map_write(map, CMD(0xff), cmd_addr);
311 		chip->state = FL_READY;
312 		break;
313 
314 #if 0
315 	case FL_WRITING:
316 		/* Not quite yet */
317 #endif
318 
319 	case FL_READY:
320 		break;
321 
322 	case FL_CFI_QUERY:
323 	case FL_JEDEC_QUERY:
324 		map_write(map, CMD(0x70), cmd_addr);
325 		chip->state = FL_STATUS;
326 
327 	case FL_STATUS:
328 		status = map_read(map, cmd_addr);
329 		if (map_word_andequal(map, status, status_OK, status_OK)) {
330 			map_write(map, CMD(0xff), cmd_addr);
331 			chip->state = FL_READY;
332 			break;
333 		}
334 
335 		/* Urgh. Chip not yet ready to talk to us. */
336 		if (time_after(jiffies, timeo)) {
337 			mutex_unlock(&chip->mutex);
338 			printk(KERN_ERR "waiting for chip to be ready timed out in read. WSM status = %lx\n", status.x[0]);
339 			return -EIO;
340 		}
341 
342 		/* Latency issues. Drop the lock, wait a while and retry */
343 		mutex_unlock(&chip->mutex);
344 		cfi_udelay(1);
345 		goto retry;
346 
347 	default:
348 	sleep:
349 		/* Stick ourselves on a wait queue to be woken when
350 		   someone changes the status */
351 		set_current_state(TASK_UNINTERRUPTIBLE);
352 		add_wait_queue(&chip->wq, &wait);
353 		mutex_unlock(&chip->mutex);
354 		schedule();
355 		remove_wait_queue(&chip->wq, &wait);
356 		timeo = jiffies + HZ;
357 		goto retry;
358 	}
359 
360 	map_copy_from(map, buf, adr, len);
361 
362 	if (suspended) {
363 		chip->state = chip->oldstate;
364 		/* What if one interleaved chip has finished and the
365 		   other hasn't? The old code would leave the finished
366 		   one in READY mode. That's bad, and caused -EROFS
367 		   errors to be returned from do_erase_oneblock because
368 		   that's the only bit it checked for at the time.
369 		   As the state machine appears to explicitly allow
370 		   sending the 0x70 (Read Status) command to an erasing
371 		   chip and expecting it to be ignored, that's what we
372 		   do. */
373 		map_write(map, CMD(0xd0), cmd_addr);
374 		map_write(map, CMD(0x70), cmd_addr);
375 	}
376 
377 	wake_up(&chip->wq);
378 	mutex_unlock(&chip->mutex);
379 	return 0;
380 }
381 
382 static int cfi_staa_read (struct mtd_info *mtd, loff_t from, size_t len, size_t *retlen, u_char *buf)
383 {
384 	struct map_info *map = mtd->priv;
385 	struct cfi_private *cfi = map->fldrv_priv;
386 	unsigned long ofs;
387 	int chipnum;
388 	int ret = 0;
389 
390 	/* ofs: offset within the first chip that the first read should start */
391 	chipnum = (from >> cfi->chipshift);
392 	ofs = from - (chipnum <<  cfi->chipshift);
393 
394 	while (len) {
395 		unsigned long thislen;
396 
397 		if (chipnum >= cfi->numchips)
398 			break;
399 
400 		if ((len + ofs -1) >> cfi->chipshift)
401 			thislen = (1<<cfi->chipshift) - ofs;
402 		else
403 			thislen = len;
404 
405 		ret = do_read_onechip(map, &cfi->chips[chipnum], ofs, thislen, buf);
406 		if (ret)
407 			break;
408 
409 		*retlen += thislen;
410 		len -= thislen;
411 		buf += thislen;
412 
413 		ofs = 0;
414 		chipnum++;
415 	}
416 	return ret;
417 }
418 
419 static inline int do_write_buffer(struct map_info *map, struct flchip *chip,
420 				  unsigned long adr, const u_char *buf, int len)
421 {
422 	struct cfi_private *cfi = map->fldrv_priv;
423 	map_word status, status_OK;
424 	unsigned long cmd_adr, timeo;
425 	DECLARE_WAITQUEUE(wait, current);
426 	int wbufsize, z;
427 
428         /* M58LW064A requires bus alignment for buffer wriets -- saw */
429         if (adr & (map_bankwidth(map)-1))
430             return -EINVAL;
431 
432         wbufsize = cfi_interleave(cfi) << cfi->cfiq->MaxBufWriteSize;
433         adr += chip->start;
434 	cmd_adr = adr & ~(wbufsize-1);
435 
436 	/* Let's determine this according to the interleave only once */
437         status_OK = CMD(0x80);
438 
439 	timeo = jiffies + HZ;
440  retry:
441 
442 #ifdef DEBUG_CFI_FEATURES
443        printk("%s: chip->state[%d]\n", __func__, chip->state);
444 #endif
445 	mutex_lock(&chip->mutex);
446 
447 	/* Check that the chip's ready to talk to us.
448 	 * Later, we can actually think about interrupting it
449 	 * if it's in FL_ERASING state.
450 	 * Not just yet, though.
451 	 */
452 	switch (chip->state) {
453 	case FL_READY:
454 		break;
455 
456 	case FL_CFI_QUERY:
457 	case FL_JEDEC_QUERY:
458 		map_write(map, CMD(0x70), cmd_adr);
459                 chip->state = FL_STATUS;
460 #ifdef DEBUG_CFI_FEATURES
461 	printk("%s: 1 status[%x]\n", __func__, map_read(map, cmd_adr));
462 #endif
463 
464 	case FL_STATUS:
465 		status = map_read(map, cmd_adr);
466 		if (map_word_andequal(map, status, status_OK, status_OK))
467 			break;
468 		/* Urgh. Chip not yet ready to talk to us. */
469 		if (time_after(jiffies, timeo)) {
470 			mutex_unlock(&chip->mutex);
471                         printk(KERN_ERR "waiting for chip to be ready timed out in buffer write Xstatus = %lx, status = %lx\n",
472                                status.x[0], map_read(map, cmd_adr).x[0]);
473 			return -EIO;
474 		}
475 
476 		/* Latency issues. Drop the lock, wait a while and retry */
477 		mutex_unlock(&chip->mutex);
478 		cfi_udelay(1);
479 		goto retry;
480 
481 	default:
482 		/* Stick ourselves on a wait queue to be woken when
483 		   someone changes the status */
484 		set_current_state(TASK_UNINTERRUPTIBLE);
485 		add_wait_queue(&chip->wq, &wait);
486 		mutex_unlock(&chip->mutex);
487 		schedule();
488 		remove_wait_queue(&chip->wq, &wait);
489 		timeo = jiffies + HZ;
490 		goto retry;
491 	}
492 
493 	ENABLE_VPP(map);
494 	map_write(map, CMD(0xe8), cmd_adr);
495 	chip->state = FL_WRITING_TO_BUFFER;
496 
497 	z = 0;
498 	for (;;) {
499 		status = map_read(map, cmd_adr);
500 		if (map_word_andequal(map, status, status_OK, status_OK))
501 			break;
502 
503 		mutex_unlock(&chip->mutex);
504 		cfi_udelay(1);
505 		mutex_lock(&chip->mutex);
506 
507 		if (++z > 100) {
508 			/* Argh. Not ready for write to buffer */
509 			DISABLE_VPP(map);
510                         map_write(map, CMD(0x70), cmd_adr);
511 			chip->state = FL_STATUS;
512 			mutex_unlock(&chip->mutex);
513 			printk(KERN_ERR "Chip not ready for buffer write. Xstatus = %lx\n", status.x[0]);
514 			return -EIO;
515 		}
516 	}
517 
518 	/* Write length of data to come */
519 	map_write(map, CMD(len/map_bankwidth(map)-1), cmd_adr );
520 
521 	/* Write data */
522 	for (z = 0; z < len;
523 	     z += map_bankwidth(map), buf += map_bankwidth(map)) {
524 		map_word d;
525 		d = map_word_load(map, buf);
526 		map_write(map, d, adr+z);
527 	}
528 	/* GO GO GO */
529 	map_write(map, CMD(0xd0), cmd_adr);
530 	chip->state = FL_WRITING;
531 
532 	mutex_unlock(&chip->mutex);
533 	cfi_udelay(chip->buffer_write_time);
534 	mutex_lock(&chip->mutex);
535 
536 	timeo = jiffies + (HZ/2);
537 	z = 0;
538 	for (;;) {
539 		if (chip->state != FL_WRITING) {
540 			/* Someone's suspended the write. Sleep */
541 			set_current_state(TASK_UNINTERRUPTIBLE);
542 			add_wait_queue(&chip->wq, &wait);
543 			mutex_unlock(&chip->mutex);
544 			schedule();
545 			remove_wait_queue(&chip->wq, &wait);
546 			timeo = jiffies + (HZ / 2); /* FIXME */
547 			mutex_lock(&chip->mutex);
548 			continue;
549 		}
550 
551 		status = map_read(map, cmd_adr);
552 		if (map_word_andequal(map, status, status_OK, status_OK))
553 			break;
554 
555 		/* OK Still waiting */
556 		if (time_after(jiffies, timeo)) {
557                         /* clear status */
558                         map_write(map, CMD(0x50), cmd_adr);
559                         /* put back into read status register mode */
560                         map_write(map, CMD(0x70), adr);
561 			chip->state = FL_STATUS;
562 			DISABLE_VPP(map);
563 			mutex_unlock(&chip->mutex);
564 			printk(KERN_ERR "waiting for chip to be ready timed out in bufwrite\n");
565 			return -EIO;
566 		}
567 
568 		/* Latency issues. Drop the lock, wait a while and retry */
569 		mutex_unlock(&chip->mutex);
570 		cfi_udelay(1);
571 		z++;
572 		mutex_lock(&chip->mutex);
573 	}
574 	if (!z) {
575 		chip->buffer_write_time--;
576 		if (!chip->buffer_write_time)
577 			chip->buffer_write_time++;
578 	}
579 	if (z > 1)
580 		chip->buffer_write_time++;
581 
582 	/* Done and happy. */
583 	DISABLE_VPP(map);
584 	chip->state = FL_STATUS;
585 
586         /* check for errors: 'lock bit', 'VPP', 'dead cell'/'unerased cell' or 'incorrect cmd' -- saw */
587         if (map_word_bitsset(map, status, CMD(0x3a))) {
588 #ifdef DEBUG_CFI_FEATURES
589 		printk("%s: 2 status[%lx]\n", __func__, status.x[0]);
590 #endif
591 		/* clear status */
592 		map_write(map, CMD(0x50), cmd_adr);
593 		/* put back into read status register mode */
594 		map_write(map, CMD(0x70), adr);
595 		wake_up(&chip->wq);
596 		mutex_unlock(&chip->mutex);
597 		return map_word_bitsset(map, status, CMD(0x02)) ? -EROFS : -EIO;
598 	}
599 	wake_up(&chip->wq);
600 	mutex_unlock(&chip->mutex);
601 
602         return 0;
603 }
604 
605 static int cfi_staa_write_buffers (struct mtd_info *mtd, loff_t to,
606 				       size_t len, size_t *retlen, const u_char *buf)
607 {
608 	struct map_info *map = mtd->priv;
609 	struct cfi_private *cfi = map->fldrv_priv;
610 	int wbufsize = cfi_interleave(cfi) << cfi->cfiq->MaxBufWriteSize;
611 	int ret = 0;
612 	int chipnum;
613 	unsigned long ofs;
614 
615 	chipnum = to >> cfi->chipshift;
616 	ofs = to  - (chipnum << cfi->chipshift);
617 
618 #ifdef DEBUG_CFI_FEATURES
619 	printk("%s: map_bankwidth(map)[%x]\n", __func__, map_bankwidth(map));
620 	printk("%s: chipnum[%x] wbufsize[%x]\n", __func__, chipnum, wbufsize);
621 	printk("%s: ofs[%x] len[%x]\n", __func__, ofs, len);
622 #endif
623 
624         /* Write buffer is worth it only if more than one word to write... */
625         while (len > 0) {
626 		/* We must not cross write block boundaries */
627 		int size = wbufsize - (ofs & (wbufsize-1));
628 
629                 if (size > len)
630                     size = len;
631 
632                 ret = do_write_buffer(map, &cfi->chips[chipnum],
633 				      ofs, buf, size);
634 		if (ret)
635 			return ret;
636 
637 		ofs += size;
638 		buf += size;
639 		(*retlen) += size;
640 		len -= size;
641 
642 		if (ofs >> cfi->chipshift) {
643 			chipnum ++;
644 			ofs = 0;
645 			if (chipnum == cfi->numchips)
646 				return 0;
647 		}
648 	}
649 
650 	return 0;
651 }
652 
653 /*
654  * Writev for ECC-Flashes is a little more complicated. We need to maintain
655  * a small buffer for this.
656  * XXX: If the buffer size is not a multiple of 2, this will break
657  */
658 #define ECCBUF_SIZE (mtd->writesize)
659 #define ECCBUF_DIV(x) ((x) & ~(ECCBUF_SIZE - 1))
660 #define ECCBUF_MOD(x) ((x) &  (ECCBUF_SIZE - 1))
661 static int
662 cfi_staa_writev(struct mtd_info *mtd, const struct kvec *vecs,
663 		unsigned long count, loff_t to, size_t *retlen)
664 {
665 	unsigned long i;
666 	size_t	 totlen = 0, thislen;
667 	int	 ret = 0;
668 	size_t	 buflen = 0;
669 	static char *buffer;
670 
671 	if (!ECCBUF_SIZE) {
672 		/* We should fall back to a general writev implementation.
673 		 * Until that is written, just break.
674 		 */
675 		return -EIO;
676 	}
677 	buffer = kmalloc(ECCBUF_SIZE, GFP_KERNEL);
678 	if (!buffer)
679 		return -ENOMEM;
680 
681 	for (i=0; i<count; i++) {
682 		size_t elem_len = vecs[i].iov_len;
683 		void *elem_base = vecs[i].iov_base;
684 		if (!elem_len) /* FIXME: Might be unnecessary. Check that */
685 			continue;
686 		if (buflen) { /* cut off head */
687 			if (buflen + elem_len < ECCBUF_SIZE) { /* just accumulate */
688 				memcpy(buffer+buflen, elem_base, elem_len);
689 				buflen += elem_len;
690 				continue;
691 			}
692 			memcpy(buffer+buflen, elem_base, ECCBUF_SIZE-buflen);
693 			ret = mtd_write(mtd, to, ECCBUF_SIZE, &thislen,
694 					buffer);
695 			totlen += thislen;
696 			if (ret || thislen != ECCBUF_SIZE)
697 				goto write_error;
698 			elem_len -= thislen-buflen;
699 			elem_base += thislen-buflen;
700 			to += ECCBUF_SIZE;
701 		}
702 		if (ECCBUF_DIV(elem_len)) { /* write clean aligned data */
703 			ret = mtd_write(mtd, to, ECCBUF_DIV(elem_len),
704 					&thislen, elem_base);
705 			totlen += thislen;
706 			if (ret || thislen != ECCBUF_DIV(elem_len))
707 				goto write_error;
708 			to += thislen;
709 		}
710 		buflen = ECCBUF_MOD(elem_len); /* cut off tail */
711 		if (buflen) {
712 			memset(buffer, 0xff, ECCBUF_SIZE);
713 			memcpy(buffer, elem_base + thislen, buflen);
714 		}
715 	}
716 	if (buflen) { /* flush last page, even if not full */
717 		/* This is sometimes intended behaviour, really */
718 		ret = mtd_write(mtd, to, buflen, &thislen, buffer);
719 		totlen += thislen;
720 		if (ret || thislen != ECCBUF_SIZE)
721 			goto write_error;
722 	}
723 write_error:
724 	if (retlen)
725 		*retlen = totlen;
726 	kfree(buffer);
727 	return ret;
728 }
729 
730 
731 static inline int do_erase_oneblock(struct map_info *map, struct flchip *chip, unsigned long adr)
732 {
733 	struct cfi_private *cfi = map->fldrv_priv;
734 	map_word status, status_OK;
735 	unsigned long timeo;
736 	int retries = 3;
737 	DECLARE_WAITQUEUE(wait, current);
738 	int ret = 0;
739 
740 	adr += chip->start;
741 
742 	/* Let's determine this according to the interleave only once */
743 	status_OK = CMD(0x80);
744 
745 	timeo = jiffies + HZ;
746 retry:
747 	mutex_lock(&chip->mutex);
748 
749 	/* Check that the chip's ready to talk to us. */
750 	switch (chip->state) {
751 	case FL_CFI_QUERY:
752 	case FL_JEDEC_QUERY:
753 	case FL_READY:
754 		map_write(map, CMD(0x70), adr);
755 		chip->state = FL_STATUS;
756 
757 	case FL_STATUS:
758 		status = map_read(map, adr);
759 		if (map_word_andequal(map, status, status_OK, status_OK))
760 			break;
761 
762 		/* Urgh. Chip not yet ready to talk to us. */
763 		if (time_after(jiffies, timeo)) {
764 			mutex_unlock(&chip->mutex);
765 			printk(KERN_ERR "waiting for chip to be ready timed out in erase\n");
766 			return -EIO;
767 		}
768 
769 		/* Latency issues. Drop the lock, wait a while and retry */
770 		mutex_unlock(&chip->mutex);
771 		cfi_udelay(1);
772 		goto retry;
773 
774 	default:
775 		/* Stick ourselves on a wait queue to be woken when
776 		   someone changes the status */
777 		set_current_state(TASK_UNINTERRUPTIBLE);
778 		add_wait_queue(&chip->wq, &wait);
779 		mutex_unlock(&chip->mutex);
780 		schedule();
781 		remove_wait_queue(&chip->wq, &wait);
782 		timeo = jiffies + HZ;
783 		goto retry;
784 	}
785 
786 	ENABLE_VPP(map);
787 	/* Clear the status register first */
788 	map_write(map, CMD(0x50), adr);
789 
790 	/* Now erase */
791 	map_write(map, CMD(0x20), adr);
792 	map_write(map, CMD(0xD0), adr);
793 	chip->state = FL_ERASING;
794 
795 	mutex_unlock(&chip->mutex);
796 	msleep(1000);
797 	mutex_lock(&chip->mutex);
798 
799 	/* FIXME. Use a timer to check this, and return immediately. */
800 	/* Once the state machine's known to be working I'll do that */
801 
802 	timeo = jiffies + (HZ*20);
803 	for (;;) {
804 		if (chip->state != FL_ERASING) {
805 			/* Someone's suspended the erase. Sleep */
806 			set_current_state(TASK_UNINTERRUPTIBLE);
807 			add_wait_queue(&chip->wq, &wait);
808 			mutex_unlock(&chip->mutex);
809 			schedule();
810 			remove_wait_queue(&chip->wq, &wait);
811 			timeo = jiffies + (HZ*20); /* FIXME */
812 			mutex_lock(&chip->mutex);
813 			continue;
814 		}
815 
816 		status = map_read(map, adr);
817 		if (map_word_andequal(map, status, status_OK, status_OK))
818 			break;
819 
820 		/* OK Still waiting */
821 		if (time_after(jiffies, timeo)) {
822 			map_write(map, CMD(0x70), adr);
823 			chip->state = FL_STATUS;
824 			printk(KERN_ERR "waiting for erase to complete timed out. Xstatus = %lx, status = %lx.\n", status.x[0], map_read(map, adr).x[0]);
825 			DISABLE_VPP(map);
826 			mutex_unlock(&chip->mutex);
827 			return -EIO;
828 		}
829 
830 		/* Latency issues. Drop the lock, wait a while and retry */
831 		mutex_unlock(&chip->mutex);
832 		cfi_udelay(1);
833 		mutex_lock(&chip->mutex);
834 	}
835 
836 	DISABLE_VPP(map);
837 	ret = 0;
838 
839 	/* We've broken this before. It doesn't hurt to be safe */
840 	map_write(map, CMD(0x70), adr);
841 	chip->state = FL_STATUS;
842 	status = map_read(map, adr);
843 
844 	/* check for lock bit */
845 	if (map_word_bitsset(map, status, CMD(0x3a))) {
846 		unsigned char chipstatus = status.x[0];
847 		if (!map_word_equal(map, status, CMD(chipstatus))) {
848 			int i, w;
849 			for (w=0; w<map_words(map); w++) {
850 				for (i = 0; i<cfi_interleave(cfi); i++) {
851 					chipstatus |= status.x[w] >> (cfi->device_type * 8);
852 				}
853 			}
854 			printk(KERN_WARNING "Status is not identical for all chips: 0x%lx. Merging to give 0x%02x\n",
855 			       status.x[0], chipstatus);
856 		}
857 		/* Reset the error bits */
858 		map_write(map, CMD(0x50), adr);
859 		map_write(map, CMD(0x70), adr);
860 
861 		if ((chipstatus & 0x30) == 0x30) {
862 			printk(KERN_NOTICE "Chip reports improper command sequence: status 0x%x\n", chipstatus);
863 			ret = -EIO;
864 		} else if (chipstatus & 0x02) {
865 			/* Protection bit set */
866 			ret = -EROFS;
867 		} else if (chipstatus & 0x8) {
868 			/* Voltage */
869 			printk(KERN_WARNING "Chip reports voltage low on erase: status 0x%x\n", chipstatus);
870 			ret = -EIO;
871 		} else if (chipstatus & 0x20) {
872 			if (retries--) {
873 				printk(KERN_DEBUG "Chip erase failed at 0x%08lx: status 0x%x. Retrying...\n", adr, chipstatus);
874 				timeo = jiffies + HZ;
875 				chip->state = FL_STATUS;
876 				mutex_unlock(&chip->mutex);
877 				goto retry;
878 			}
879 			printk(KERN_DEBUG "Chip erase failed at 0x%08lx: status 0x%x\n", adr, chipstatus);
880 			ret = -EIO;
881 		}
882 	}
883 
884 	wake_up(&chip->wq);
885 	mutex_unlock(&chip->mutex);
886 	return ret;
887 }
888 
889 static int cfi_staa_erase_varsize(struct mtd_info *mtd,
890 				  struct erase_info *instr)
891 {	struct map_info *map = mtd->priv;
892 	struct cfi_private *cfi = map->fldrv_priv;
893 	unsigned long adr, len;
894 	int chipnum, ret = 0;
895 	int i, first;
896 	struct mtd_erase_region_info *regions = mtd->eraseregions;
897 
898 	/* Check that both start and end of the requested erase are
899 	 * aligned with the erasesize at the appropriate addresses.
900 	 */
901 
902 	i = 0;
903 
904 	/* Skip all erase regions which are ended before the start of
905 	   the requested erase. Actually, to save on the calculations,
906 	   we skip to the first erase region which starts after the
907 	   start of the requested erase, and then go back one.
908 	*/
909 
910 	while (i < mtd->numeraseregions && instr->addr >= regions[i].offset)
911 	       i++;
912 	i--;
913 
914 	/* OK, now i is pointing at the erase region in which this
915 	   erase request starts. Check the start of the requested
916 	   erase range is aligned with the erase size which is in
917 	   effect here.
918 	*/
919 
920 	if (instr->addr & (regions[i].erasesize-1))
921 		return -EINVAL;
922 
923 	/* Remember the erase region we start on */
924 	first = i;
925 
926 	/* Next, check that the end of the requested erase is aligned
927 	 * with the erase region at that address.
928 	 */
929 
930 	while (i<mtd->numeraseregions && (instr->addr + instr->len) >= regions[i].offset)
931 		i++;
932 
933 	/* As before, drop back one to point at the region in which
934 	   the address actually falls
935 	*/
936 	i--;
937 
938 	if ((instr->addr + instr->len) & (regions[i].erasesize-1))
939 		return -EINVAL;
940 
941 	chipnum = instr->addr >> cfi->chipshift;
942 	adr = instr->addr - (chipnum << cfi->chipshift);
943 	len = instr->len;
944 
945 	i=first;
946 
947 	while(len) {
948 		ret = do_erase_oneblock(map, &cfi->chips[chipnum], adr);
949 
950 		if (ret)
951 			return ret;
952 
953 		adr += regions[i].erasesize;
954 		len -= regions[i].erasesize;
955 
956 		if (adr % (1<< cfi->chipshift) == (((unsigned long)regions[i].offset + (regions[i].erasesize * regions[i].numblocks)) %( 1<< cfi->chipshift)))
957 			i++;
958 
959 		if (adr >> cfi->chipshift) {
960 			adr = 0;
961 			chipnum++;
962 
963 			if (chipnum >= cfi->numchips)
964 				break;
965 		}
966 	}
967 
968 	instr->state = MTD_ERASE_DONE;
969 	mtd_erase_callback(instr);
970 
971 	return 0;
972 }
973 
974 static void cfi_staa_sync (struct mtd_info *mtd)
975 {
976 	struct map_info *map = mtd->priv;
977 	struct cfi_private *cfi = map->fldrv_priv;
978 	int i;
979 	struct flchip *chip;
980 	int ret = 0;
981 	DECLARE_WAITQUEUE(wait, current);
982 
983 	for (i=0; !ret && i<cfi->numchips; i++) {
984 		chip = &cfi->chips[i];
985 
986 	retry:
987 		mutex_lock(&chip->mutex);
988 
989 		switch(chip->state) {
990 		case FL_READY:
991 		case FL_STATUS:
992 		case FL_CFI_QUERY:
993 		case FL_JEDEC_QUERY:
994 			chip->oldstate = chip->state;
995 			chip->state = FL_SYNCING;
996 			/* No need to wake_up() on this state change -
997 			 * as the whole point is that nobody can do anything
998 			 * with the chip now anyway.
999 			 */
1000 		case FL_SYNCING:
1001 			mutex_unlock(&chip->mutex);
1002 			break;
1003 
1004 		default:
1005 			/* Not an idle state */
1006 			set_current_state(TASK_UNINTERRUPTIBLE);
1007 			add_wait_queue(&chip->wq, &wait);
1008 
1009 			mutex_unlock(&chip->mutex);
1010 			schedule();
1011 		        remove_wait_queue(&chip->wq, &wait);
1012 
1013 			goto retry;
1014 		}
1015 	}
1016 
1017 	/* Unlock the chips again */
1018 
1019 	for (i--; i >=0; i--) {
1020 		chip = &cfi->chips[i];
1021 
1022 		mutex_lock(&chip->mutex);
1023 
1024 		if (chip->state == FL_SYNCING) {
1025 			chip->state = chip->oldstate;
1026 			wake_up(&chip->wq);
1027 		}
1028 		mutex_unlock(&chip->mutex);
1029 	}
1030 }
1031 
1032 static inline int do_lock_oneblock(struct map_info *map, struct flchip *chip, unsigned long adr)
1033 {
1034 	struct cfi_private *cfi = map->fldrv_priv;
1035 	map_word status, status_OK;
1036 	unsigned long timeo = jiffies + HZ;
1037 	DECLARE_WAITQUEUE(wait, current);
1038 
1039 	adr += chip->start;
1040 
1041 	/* Let's determine this according to the interleave only once */
1042 	status_OK = CMD(0x80);
1043 
1044 	timeo = jiffies + HZ;
1045 retry:
1046 	mutex_lock(&chip->mutex);
1047 
1048 	/* Check that the chip's ready to talk to us. */
1049 	switch (chip->state) {
1050 	case FL_CFI_QUERY:
1051 	case FL_JEDEC_QUERY:
1052 	case FL_READY:
1053 		map_write(map, CMD(0x70), adr);
1054 		chip->state = FL_STATUS;
1055 
1056 	case FL_STATUS:
1057 		status = map_read(map, adr);
1058 		if (map_word_andequal(map, status, status_OK, status_OK))
1059 			break;
1060 
1061 		/* Urgh. Chip not yet ready to talk to us. */
1062 		if (time_after(jiffies, timeo)) {
1063 			mutex_unlock(&chip->mutex);
1064 			printk(KERN_ERR "waiting for chip to be ready timed out in lock\n");
1065 			return -EIO;
1066 		}
1067 
1068 		/* Latency issues. Drop the lock, wait a while and retry */
1069 		mutex_unlock(&chip->mutex);
1070 		cfi_udelay(1);
1071 		goto retry;
1072 
1073 	default:
1074 		/* Stick ourselves on a wait queue to be woken when
1075 		   someone changes the status */
1076 		set_current_state(TASK_UNINTERRUPTIBLE);
1077 		add_wait_queue(&chip->wq, &wait);
1078 		mutex_unlock(&chip->mutex);
1079 		schedule();
1080 		remove_wait_queue(&chip->wq, &wait);
1081 		timeo = jiffies + HZ;
1082 		goto retry;
1083 	}
1084 
1085 	ENABLE_VPP(map);
1086 	map_write(map, CMD(0x60), adr);
1087 	map_write(map, CMD(0x01), adr);
1088 	chip->state = FL_LOCKING;
1089 
1090 	mutex_unlock(&chip->mutex);
1091 	msleep(1000);
1092 	mutex_lock(&chip->mutex);
1093 
1094 	/* FIXME. Use a timer to check this, and return immediately. */
1095 	/* Once the state machine's known to be working I'll do that */
1096 
1097 	timeo = jiffies + (HZ*2);
1098 	for (;;) {
1099 
1100 		status = map_read(map, adr);
1101 		if (map_word_andequal(map, status, status_OK, status_OK))
1102 			break;
1103 
1104 		/* OK Still waiting */
1105 		if (time_after(jiffies, timeo)) {
1106 			map_write(map, CMD(0x70), adr);
1107 			chip->state = FL_STATUS;
1108 			printk(KERN_ERR "waiting for lock to complete timed out. Xstatus = %lx, status = %lx.\n", status.x[0], map_read(map, adr).x[0]);
1109 			DISABLE_VPP(map);
1110 			mutex_unlock(&chip->mutex);
1111 			return -EIO;
1112 		}
1113 
1114 		/* Latency issues. Drop the lock, wait a while and retry */
1115 		mutex_unlock(&chip->mutex);
1116 		cfi_udelay(1);
1117 		mutex_lock(&chip->mutex);
1118 	}
1119 
1120 	/* Done and happy. */
1121 	chip->state = FL_STATUS;
1122 	DISABLE_VPP(map);
1123 	wake_up(&chip->wq);
1124 	mutex_unlock(&chip->mutex);
1125 	return 0;
1126 }
1127 static int cfi_staa_lock(struct mtd_info *mtd, loff_t ofs, uint64_t len)
1128 {
1129 	struct map_info *map = mtd->priv;
1130 	struct cfi_private *cfi = map->fldrv_priv;
1131 	unsigned long adr;
1132 	int chipnum, ret = 0;
1133 #ifdef DEBUG_LOCK_BITS
1134 	int ofs_factor = cfi->interleave * cfi->device_type;
1135 #endif
1136 
1137 	if (ofs & (mtd->erasesize - 1))
1138 		return -EINVAL;
1139 
1140 	if (len & (mtd->erasesize -1))
1141 		return -EINVAL;
1142 
1143 	chipnum = ofs >> cfi->chipshift;
1144 	adr = ofs - (chipnum << cfi->chipshift);
1145 
1146 	while(len) {
1147 
1148 #ifdef DEBUG_LOCK_BITS
1149 		cfi_send_gen_cmd(0x90, 0x55, 0, map, cfi, cfi->device_type, NULL);
1150 		printk("before lock: block status register is %x\n",cfi_read_query(map, adr+(2*ofs_factor)));
1151 		cfi_send_gen_cmd(0xff, 0x55, 0, map, cfi, cfi->device_type, NULL);
1152 #endif
1153 
1154 		ret = do_lock_oneblock(map, &cfi->chips[chipnum], adr);
1155 
1156 #ifdef DEBUG_LOCK_BITS
1157 		cfi_send_gen_cmd(0x90, 0x55, 0, map, cfi, cfi->device_type, NULL);
1158 		printk("after lock: block status register is %x\n",cfi_read_query(map, adr+(2*ofs_factor)));
1159 		cfi_send_gen_cmd(0xff, 0x55, 0, map, cfi, cfi->device_type, NULL);
1160 #endif
1161 
1162 		if (ret)
1163 			return ret;
1164 
1165 		adr += mtd->erasesize;
1166 		len -= mtd->erasesize;
1167 
1168 		if (adr >> cfi->chipshift) {
1169 			adr = 0;
1170 			chipnum++;
1171 
1172 			if (chipnum >= cfi->numchips)
1173 				break;
1174 		}
1175 	}
1176 	return 0;
1177 }
1178 static inline int do_unlock_oneblock(struct map_info *map, struct flchip *chip, unsigned long adr)
1179 {
1180 	struct cfi_private *cfi = map->fldrv_priv;
1181 	map_word status, status_OK;
1182 	unsigned long timeo = jiffies + HZ;
1183 	DECLARE_WAITQUEUE(wait, current);
1184 
1185 	adr += chip->start;
1186 
1187 	/* Let's determine this according to the interleave only once */
1188 	status_OK = CMD(0x80);
1189 
1190 	timeo = jiffies + HZ;
1191 retry:
1192 	mutex_lock(&chip->mutex);
1193 
1194 	/* Check that the chip's ready to talk to us. */
1195 	switch (chip->state) {
1196 	case FL_CFI_QUERY:
1197 	case FL_JEDEC_QUERY:
1198 	case FL_READY:
1199 		map_write(map, CMD(0x70), adr);
1200 		chip->state = FL_STATUS;
1201 
1202 	case FL_STATUS:
1203 		status = map_read(map, adr);
1204 		if (map_word_andequal(map, status, status_OK, status_OK))
1205 			break;
1206 
1207 		/* Urgh. Chip not yet ready to talk to us. */
1208 		if (time_after(jiffies, timeo)) {
1209 			mutex_unlock(&chip->mutex);
1210 			printk(KERN_ERR "waiting for chip to be ready timed out in unlock\n");
1211 			return -EIO;
1212 		}
1213 
1214 		/* Latency issues. Drop the lock, wait a while and retry */
1215 		mutex_unlock(&chip->mutex);
1216 		cfi_udelay(1);
1217 		goto retry;
1218 
1219 	default:
1220 		/* Stick ourselves on a wait queue to be woken when
1221 		   someone changes the status */
1222 		set_current_state(TASK_UNINTERRUPTIBLE);
1223 		add_wait_queue(&chip->wq, &wait);
1224 		mutex_unlock(&chip->mutex);
1225 		schedule();
1226 		remove_wait_queue(&chip->wq, &wait);
1227 		timeo = jiffies + HZ;
1228 		goto retry;
1229 	}
1230 
1231 	ENABLE_VPP(map);
1232 	map_write(map, CMD(0x60), adr);
1233 	map_write(map, CMD(0xD0), adr);
1234 	chip->state = FL_UNLOCKING;
1235 
1236 	mutex_unlock(&chip->mutex);
1237 	msleep(1000);
1238 	mutex_lock(&chip->mutex);
1239 
1240 	/* FIXME. Use a timer to check this, and return immediately. */
1241 	/* Once the state machine's known to be working I'll do that */
1242 
1243 	timeo = jiffies + (HZ*2);
1244 	for (;;) {
1245 
1246 		status = map_read(map, adr);
1247 		if (map_word_andequal(map, status, status_OK, status_OK))
1248 			break;
1249 
1250 		/* OK Still waiting */
1251 		if (time_after(jiffies, timeo)) {
1252 			map_write(map, CMD(0x70), adr);
1253 			chip->state = FL_STATUS;
1254 			printk(KERN_ERR "waiting for unlock to complete timed out. Xstatus = %lx, status = %lx.\n", status.x[0], map_read(map, adr).x[0]);
1255 			DISABLE_VPP(map);
1256 			mutex_unlock(&chip->mutex);
1257 			return -EIO;
1258 		}
1259 
1260 		/* Latency issues. Drop the unlock, wait a while and retry */
1261 		mutex_unlock(&chip->mutex);
1262 		cfi_udelay(1);
1263 		mutex_lock(&chip->mutex);
1264 	}
1265 
1266 	/* Done and happy. */
1267 	chip->state = FL_STATUS;
1268 	DISABLE_VPP(map);
1269 	wake_up(&chip->wq);
1270 	mutex_unlock(&chip->mutex);
1271 	return 0;
1272 }
1273 static int cfi_staa_unlock(struct mtd_info *mtd, loff_t ofs, uint64_t len)
1274 {
1275 	struct map_info *map = mtd->priv;
1276 	struct cfi_private *cfi = map->fldrv_priv;
1277 	unsigned long adr;
1278 	int chipnum, ret = 0;
1279 #ifdef DEBUG_LOCK_BITS
1280 	int ofs_factor = cfi->interleave * cfi->device_type;
1281 #endif
1282 
1283 	chipnum = ofs >> cfi->chipshift;
1284 	adr = ofs - (chipnum << cfi->chipshift);
1285 
1286 #ifdef DEBUG_LOCK_BITS
1287 	{
1288 		unsigned long temp_adr = adr;
1289 		unsigned long temp_len = len;
1290 
1291 		cfi_send_gen_cmd(0x90, 0x55, 0, map, cfi, cfi->device_type, NULL);
1292                 while (temp_len) {
1293 			printk("before unlock %x: block status register is %x\n",temp_adr,cfi_read_query(map, temp_adr+(2*ofs_factor)));
1294 			temp_adr += mtd->erasesize;
1295 			temp_len -= mtd->erasesize;
1296 		}
1297 		cfi_send_gen_cmd(0xff, 0x55, 0, map, cfi, cfi->device_type, NULL);
1298 	}
1299 #endif
1300 
1301 	ret = do_unlock_oneblock(map, &cfi->chips[chipnum], adr);
1302 
1303 #ifdef DEBUG_LOCK_BITS
1304 	cfi_send_gen_cmd(0x90, 0x55, 0, map, cfi, cfi->device_type, NULL);
1305 	printk("after unlock: block status register is %x\n",cfi_read_query(map, adr+(2*ofs_factor)));
1306 	cfi_send_gen_cmd(0xff, 0x55, 0, map, cfi, cfi->device_type, NULL);
1307 #endif
1308 
1309 	return ret;
1310 }
1311 
1312 static int cfi_staa_suspend(struct mtd_info *mtd)
1313 {
1314 	struct map_info *map = mtd->priv;
1315 	struct cfi_private *cfi = map->fldrv_priv;
1316 	int i;
1317 	struct flchip *chip;
1318 	int ret = 0;
1319 
1320 	for (i=0; !ret && i<cfi->numchips; i++) {
1321 		chip = &cfi->chips[i];
1322 
1323 		mutex_lock(&chip->mutex);
1324 
1325 		switch(chip->state) {
1326 		case FL_READY:
1327 		case FL_STATUS:
1328 		case FL_CFI_QUERY:
1329 		case FL_JEDEC_QUERY:
1330 			chip->oldstate = chip->state;
1331 			chip->state = FL_PM_SUSPENDED;
1332 			/* No need to wake_up() on this state change -
1333 			 * as the whole point is that nobody can do anything
1334 			 * with the chip now anyway.
1335 			 */
1336 		case FL_PM_SUSPENDED:
1337 			break;
1338 
1339 		default:
1340 			ret = -EAGAIN;
1341 			break;
1342 		}
1343 		mutex_unlock(&chip->mutex);
1344 	}
1345 
1346 	/* Unlock the chips again */
1347 
1348 	if (ret) {
1349 		for (i--; i >=0; i--) {
1350 			chip = &cfi->chips[i];
1351 
1352 			mutex_lock(&chip->mutex);
1353 
1354 			if (chip->state == FL_PM_SUSPENDED) {
1355 				/* No need to force it into a known state here,
1356 				   because we're returning failure, and it didn't
1357 				   get power cycled */
1358 				chip->state = chip->oldstate;
1359 				wake_up(&chip->wq);
1360 			}
1361 			mutex_unlock(&chip->mutex);
1362 		}
1363 	}
1364 
1365 	return ret;
1366 }
1367 
1368 static void cfi_staa_resume(struct mtd_info *mtd)
1369 {
1370 	struct map_info *map = mtd->priv;
1371 	struct cfi_private *cfi = map->fldrv_priv;
1372 	int i;
1373 	struct flchip *chip;
1374 
1375 	for (i=0; i<cfi->numchips; i++) {
1376 
1377 		chip = &cfi->chips[i];
1378 
1379 		mutex_lock(&chip->mutex);
1380 
1381 		/* Go to known state. Chip may have been power cycled */
1382 		if (chip->state == FL_PM_SUSPENDED) {
1383 			map_write(map, CMD(0xFF), 0);
1384 			chip->state = FL_READY;
1385 			wake_up(&chip->wq);
1386 		}
1387 
1388 		mutex_unlock(&chip->mutex);
1389 	}
1390 }
1391 
1392 static void cfi_staa_destroy(struct mtd_info *mtd)
1393 {
1394 	struct map_info *map = mtd->priv;
1395 	struct cfi_private *cfi = map->fldrv_priv;
1396 	kfree(cfi->cmdset_priv);
1397 	kfree(cfi);
1398 }
1399 
1400 MODULE_LICENSE("GPL");
1401