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