1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53#include <linux/slab.h>
54#include <linux/types.h>
55#include <linux/mtd/mtd.h>
56#include <linux/mtd/nand.h>
57#include <linux/mtd/nand_ecc.h>
58#include <linux/mtd/compatmac.h>
59#include <linux/bitops.h>
60#include <linux/delay.h>
61#include <linux/vmalloc.h>
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76static int check_pattern(uint8_t *buf, int len, int paglen, struct nand_bbt_descr *td)
77{
78 int i, end = 0;
79 uint8_t *p = buf;
80
81 end = paglen + td->offs;
82 if (td->options & NAND_BBT_SCANEMPTY) {
83 for (i = 0; i < end; i++) {
84 if (p[i] != 0xff)
85 return -1;
86 }
87 }
88 p += end;
89
90
91 for (i = 0; i < td->len; i++) {
92 if (p[i] != td->pattern[i])
93 return -1;
94 }
95
96 if (td->options & NAND_BBT_SCANEMPTY) {
97 p += td->len;
98 end += td->len;
99 for (i = end; i < len; i++) {
100 if (*p++ != 0xff)
101 return -1;
102 }
103 }
104 return 0;
105}
106
107
108
109
110
111
112
113
114
115
116
117static int check_short_pattern(uint8_t *buf, struct nand_bbt_descr *td)
118{
119 int i;
120 uint8_t *p = buf;
121
122
123 for (i = 0; i < td->len; i++) {
124 if (p[td->offs + i] != td->pattern[i])
125 return -1;
126 }
127 return 0;
128}
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143static int read_bbt(struct mtd_info *mtd, uint8_t *buf, int page, int num,
144 int bits, int offs, int reserved_block_code)
145{
146 int res, i, j, act = 0;
147 struct nand_chip *this = mtd->priv;
148 size_t retlen, len, totlen;
149 loff_t from;
150 uint8_t msk = (uint8_t) ((1 << bits) - 1);
151
152 totlen = (num * bits) >> 3;
153 from = ((loff_t) page) << this->page_shift;
154
155 while (totlen) {
156 len = min(totlen, (size_t) (1 << this->bbt_erase_shift));
157 res = mtd->read(mtd, from, len, &retlen, buf);
158 if (res < 0) {
159 if (retlen != len) {
160 printk(KERN_INFO "nand_bbt: Error reading bad block table\n");
161 return res;
162 }
163 printk(KERN_WARNING "nand_bbt: ECC error while reading bad block table\n");
164 }
165
166
167 for (i = 0; i < len; i++) {
168 uint8_t dat = buf[i];
169 for (j = 0; j < 8; j += bits, act += 2) {
170 uint8_t tmp = (dat >> j) & msk;
171 if (tmp == msk)
172 continue;
173 if (reserved_block_code && (tmp == reserved_block_code)) {
174 printk(KERN_DEBUG "nand_read_bbt: Reserved block at 0x%012llx\n",
175 (loff_t)((offs << 2) + (act >> 1)) << this->bbt_erase_shift);
176 this->bbt[offs + (act >> 3)] |= 0x2 << (act & 0x06);
177 mtd->ecc_stats.bbtblocks++;
178 continue;
179 }
180
181
182 printk(KERN_DEBUG "nand_read_bbt: Bad block at 0x%012llx\n",
183 (loff_t)((offs << 2) + (act >> 1)) << this->bbt_erase_shift);
184
185 if (tmp == 0)
186 this->bbt[offs + (act >> 3)] |= 0x3 << (act & 0x06);
187 else
188 this->bbt[offs + (act >> 3)] |= 0x1 << (act & 0x06);
189 mtd->ecc_stats.badblocks++;
190 }
191 }
192 totlen -= len;
193 from += len;
194 }
195 return 0;
196}
197
198
199
200
201
202
203
204
205
206
207
208
209static int read_abs_bbt(struct mtd_info *mtd, uint8_t *buf, struct nand_bbt_descr *td, int chip)
210{
211 struct nand_chip *this = mtd->priv;
212 int res = 0, i;
213 int bits;
214
215 bits = td->options & NAND_BBT_NRBITS_MSK;
216 if (td->options & NAND_BBT_PERCHIP) {
217 int offs = 0;
218 for (i = 0; i < this->numchips; i++) {
219 if (chip == -1 || chip == i)
220 res = read_bbt (mtd, buf, td->pages[i], this->chipsize >> this->bbt_erase_shift, bits, offs, td->reserved_block_code);
221 if (res)
222 return res;
223 offs += this->chipsize >> (this->bbt_erase_shift + 2);
224 }
225 } else {
226 res = read_bbt (mtd, buf, td->pages[0], mtd->size >> this->bbt_erase_shift, bits, 0, td->reserved_block_code);
227 if (res)
228 return res;
229 }
230 return 0;
231}
232
233
234
235
236static int scan_read_raw(struct mtd_info *mtd, uint8_t *buf, loff_t offs,
237 size_t len)
238{
239 struct mtd_oob_ops ops;
240 int res;
241
242 ops.mode = MTD_OOB_RAW;
243 ops.ooboffs = 0;
244 ops.ooblen = mtd->oobsize;
245
246
247 while (len > 0) {
248 if (len <= mtd->writesize) {
249 ops.oobbuf = buf + len;
250 ops.datbuf = buf;
251 ops.len = len;
252 return mtd->read_oob(mtd, offs, &ops);
253 } else {
254 ops.oobbuf = buf + mtd->writesize;
255 ops.datbuf = buf;
256 ops.len = mtd->writesize;
257 res = mtd->read_oob(mtd, offs, &ops);
258
259 if (res)
260 return res;
261 }
262
263 buf += mtd->oobsize + mtd->writesize;
264 len -= mtd->writesize;
265 }
266 return 0;
267}
268
269
270
271
272static int scan_write_bbt(struct mtd_info *mtd, loff_t offs, size_t len,
273 uint8_t *buf, uint8_t *oob)
274{
275 struct mtd_oob_ops ops;
276
277 ops.mode = MTD_OOB_PLACE;
278 ops.ooboffs = 0;
279 ops.ooblen = mtd->oobsize;
280 ops.datbuf = buf;
281 ops.oobbuf = oob;
282 ops.len = len;
283
284 return mtd->write_oob(mtd, offs, &ops);
285}
286
287
288
289
290
291
292
293
294
295
296
297
298static int read_abs_bbts(struct mtd_info *mtd, uint8_t *buf,
299 struct nand_bbt_descr *td, struct nand_bbt_descr *md)
300{
301 struct nand_chip *this = mtd->priv;
302
303
304 if (td->options & NAND_BBT_VERSION) {
305 scan_read_raw(mtd, buf, (loff_t)td->pages[0] << this->page_shift,
306 mtd->writesize);
307 td->version[0] = buf[mtd->writesize + td->veroffs];
308 printk(KERN_DEBUG "Bad block table at page %d, version 0x%02X\n",
309 td->pages[0], td->version[0]);
310 }
311
312
313 if (md && (md->options & NAND_BBT_VERSION)) {
314 scan_read_raw(mtd, buf, (loff_t)md->pages[0] << this->page_shift,
315 mtd->writesize);
316 md->version[0] = buf[mtd->writesize + md->veroffs];
317 printk(KERN_DEBUG "Bad block table at page %d, version 0x%02X\n",
318 md->pages[0], md->version[0]);
319 }
320 return 1;
321}
322
323
324
325
326static int scan_block_full(struct mtd_info *mtd, struct nand_bbt_descr *bd,
327 loff_t offs, uint8_t *buf, size_t readlen,
328 int scanlen, int len)
329{
330 int ret, j;
331
332 ret = scan_read_raw(mtd, buf, offs, readlen);
333 if (ret)
334 return ret;
335
336 for (j = 0; j < len; j++, buf += scanlen) {
337 if (check_pattern(buf, scanlen, mtd->writesize, bd))
338 return 1;
339 }
340 return 0;
341}
342
343
344
345
346static int scan_block_fast(struct mtd_info *mtd, struct nand_bbt_descr *bd,
347 loff_t offs, uint8_t *buf, int len)
348{
349 struct mtd_oob_ops ops;
350 int j, ret;
351
352 ops.ooblen = mtd->oobsize;
353 ops.oobbuf = buf;
354 ops.ooboffs = 0;
355 ops.datbuf = NULL;
356 ops.mode = MTD_OOB_PLACE;
357
358 for (j = 0; j < len; j++) {
359
360
361
362
363
364 ret = mtd->read_oob(mtd, offs, &ops);
365 if (ret)
366 return ret;
367
368 if (check_short_pattern(buf, bd))
369 return 1;
370
371 offs += mtd->writesize;
372 }
373 return 0;
374}
375
376
377
378
379
380
381
382
383
384
385
386
387static int create_bbt(struct mtd_info *mtd, uint8_t *buf,
388 struct nand_bbt_descr *bd, int chip)
389{
390 struct nand_chip *this = mtd->priv;
391 int i, numblocks, len, scanlen;
392 int startblock;
393 loff_t from;
394 size_t readlen;
395
396 printk(KERN_INFO "Scanning device for bad blocks\n");
397
398 if (bd->options & NAND_BBT_SCANALLPAGES)
399 len = 1 << (this->bbt_erase_shift - this->page_shift);
400 else {
401 if (bd->options & NAND_BBT_SCAN2NDPAGE)
402 len = 2;
403 else
404 len = 1;
405 }
406
407 if (!(bd->options & NAND_BBT_SCANEMPTY)) {
408
409 scanlen = 0;
410 readlen = bd->len;
411 } else {
412
413 scanlen = mtd->writesize + mtd->oobsize;
414 readlen = len * mtd->writesize;
415 }
416
417 if (chip == -1) {
418
419
420 numblocks = mtd->size >> (this->bbt_erase_shift - 1);
421 startblock = 0;
422 from = 0;
423 } else {
424 if (chip >= this->numchips) {
425 printk(KERN_WARNING "create_bbt(): chipnr (%d) > available chips (%d)\n",
426 chip + 1, this->numchips);
427 return -EINVAL;
428 }
429 numblocks = this->chipsize >> (this->bbt_erase_shift - 1);
430 startblock = chip * numblocks;
431 numblocks += startblock;
432 from = (loff_t)startblock << (this->bbt_erase_shift - 1);
433 }
434
435 if (this->options & NAND_BB_LAST_PAGE)
436 from += mtd->erasesize - (mtd->writesize * len);
437
438 for (i = startblock; i < numblocks;) {
439 int ret;
440
441 if (bd->options & NAND_BBT_SCANALLPAGES)
442 ret = scan_block_full(mtd, bd, from, buf, readlen,
443 scanlen, len);
444 else
445 ret = scan_block_fast(mtd, bd, from, buf, len);
446
447 if (ret < 0)
448 return ret;
449
450 if (ret) {
451 this->bbt[i >> 3] |= 0x03 << (i & 0x6);
452 printk(KERN_WARNING "Bad eraseblock %d at 0x%012llx\n",
453 i >> 1, (unsigned long long)from);
454 mtd->ecc_stats.badblocks++;
455 }
456
457 i += 2;
458 from += (1 << this->bbt_erase_shift);
459 }
460 return 0;
461}
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480static int search_bbt(struct mtd_info *mtd, uint8_t *buf, struct nand_bbt_descr *td)
481{
482 struct nand_chip *this = mtd->priv;
483 int i, chips;
484 int bits, startblock, block, dir;
485 int scanlen = mtd->writesize + mtd->oobsize;
486 int bbtblocks;
487 int blocktopage = this->bbt_erase_shift - this->page_shift;
488
489
490 if (td->options & NAND_BBT_LASTBLOCK) {
491 startblock = (mtd->size >> this->bbt_erase_shift) - 1;
492 dir = -1;
493 } else {
494 startblock = 0;
495 dir = 1;
496 }
497
498
499 if (td->options & NAND_BBT_PERCHIP) {
500 chips = this->numchips;
501 bbtblocks = this->chipsize >> this->bbt_erase_shift;
502 startblock &= bbtblocks - 1;
503 } else {
504 chips = 1;
505 bbtblocks = mtd->size >> this->bbt_erase_shift;
506 }
507
508
509 bits = td->options & NAND_BBT_NRBITS_MSK;
510
511 for (i = 0; i < chips; i++) {
512
513 td->version[i] = 0;
514 td->pages[i] = -1;
515
516 for (block = 0; block < td->maxblocks; block++) {
517
518 int actblock = startblock + dir * block;
519 loff_t offs = (loff_t)actblock << this->bbt_erase_shift;
520
521
522 scan_read_raw(mtd, buf, offs, mtd->writesize);
523 if (!check_pattern(buf, scanlen, mtd->writesize, td)) {
524 td->pages[i] = actblock << blocktopage;
525 if (td->options & NAND_BBT_VERSION) {
526 td->version[i] = buf[mtd->writesize + td->veroffs];
527 }
528 break;
529 }
530 }
531 startblock += this->chipsize >> this->bbt_erase_shift;
532 }
533
534 for (i = 0; i < chips; i++) {
535 if (td->pages[i] == -1)
536 printk(KERN_WARNING "Bad block table not found for chip %d\n", i);
537 else
538 printk(KERN_DEBUG "Bad block table found at page %d, version 0x%02X\n", td->pages[i],
539 td->version[i]);
540 }
541 return 0;
542}
543
544
545
546
547
548
549
550
551
552
553static int search_read_bbts(struct mtd_info *mtd, uint8_t * buf, struct nand_bbt_descr *td, struct nand_bbt_descr *md)
554{
555
556 search_bbt(mtd, buf, td);
557
558
559 if (md)
560 search_bbt(mtd, buf, md);
561
562
563 return 1;
564}
565
566
567
568
569
570
571
572
573
574
575
576
577
578static int write_bbt(struct mtd_info *mtd, uint8_t *buf,
579 struct nand_bbt_descr *td, struct nand_bbt_descr *md,
580 int chipsel)
581{
582 struct nand_chip *this = mtd->priv;
583 struct erase_info einfo;
584 int i, j, res, chip = 0;
585 int bits, startblock, dir, page, offs, numblocks, sft, sftmsk;
586 int nrchips, bbtoffs, pageoffs, ooboffs;
587 uint8_t msk[4];
588 uint8_t rcode = td->reserved_block_code;
589 size_t retlen, len = 0;
590 loff_t to;
591 struct mtd_oob_ops ops;
592
593 ops.ooblen = mtd->oobsize;
594 ops.ooboffs = 0;
595 ops.datbuf = NULL;
596 ops.mode = MTD_OOB_PLACE;
597
598 if (!rcode)
599 rcode = 0xff;
600
601 if (td->options & NAND_BBT_PERCHIP) {
602 numblocks = (int)(this->chipsize >> this->bbt_erase_shift);
603
604 if (chipsel == -1) {
605 nrchips = this->numchips;
606 } else {
607 nrchips = chipsel + 1;
608 chip = chipsel;
609 }
610 } else {
611 numblocks = (int)(mtd->size >> this->bbt_erase_shift);
612 nrchips = 1;
613 }
614
615
616 for (; chip < nrchips; chip++) {
617
618
619
620
621
622 if (td->pages[chip] != -1) {
623 page = td->pages[chip];
624 goto write;
625 }
626
627
628
629 if (td->options & NAND_BBT_LASTBLOCK) {
630 startblock = numblocks * (chip + 1) - 1;
631 dir = -1;
632 } else {
633 startblock = chip * numblocks;
634 dir = 1;
635 }
636
637 for (i = 0; i < td->maxblocks; i++) {
638 int block = startblock + dir * i;
639
640 switch ((this->bbt[block >> 2] >>
641 (2 * (block & 0x03))) & 0x03) {
642 case 0x01:
643 case 0x03:
644 continue;
645 }
646 page = block <<
647 (this->bbt_erase_shift - this->page_shift);
648
649 if (!md || md->pages[chip] != page)
650 goto write;
651 }
652 printk(KERN_ERR "No space left to write bad block table\n");
653 return -ENOSPC;
654 write:
655
656
657 bits = td->options & NAND_BBT_NRBITS_MSK;
658 msk[2] = ~rcode;
659 switch (bits) {
660 case 1: sft = 3; sftmsk = 0x07; msk[0] = 0x00; msk[1] = 0x01;
661 msk[3] = 0x01;
662 break;
663 case 2: sft = 2; sftmsk = 0x06; msk[0] = 0x00; msk[1] = 0x01;
664 msk[3] = 0x03;
665 break;
666 case 4: sft = 1; sftmsk = 0x04; msk[0] = 0x00; msk[1] = 0x0C;
667 msk[3] = 0x0f;
668 break;
669 case 8: sft = 0; sftmsk = 0x00; msk[0] = 0x00; msk[1] = 0x0F;
670 msk[3] = 0xff;
671 break;
672 default: return -EINVAL;
673 }
674
675 bbtoffs = chip * (numblocks >> 2);
676
677 to = ((loff_t) page) << this->page_shift;
678
679
680 if (td->options & NAND_BBT_SAVECONTENT) {
681
682 to &= ~((loff_t) ((1 << this->bbt_erase_shift) - 1));
683 len = 1 << this->bbt_erase_shift;
684 res = mtd->read(mtd, to, len, &retlen, buf);
685 if (res < 0) {
686 if (retlen != len) {
687 printk(KERN_INFO "nand_bbt: Error "
688 "reading block for writing "
689 "the bad block table\n");
690 return res;
691 }
692 printk(KERN_WARNING "nand_bbt: ECC error "
693 "while reading block for writing "
694 "bad block table\n");
695 }
696
697 ops.ooblen = (len >> this->page_shift) * mtd->oobsize;
698 ops.oobbuf = &buf[len];
699 res = mtd->read_oob(mtd, to + mtd->writesize, &ops);
700 if (res < 0 || ops.oobretlen != ops.ooblen)
701 goto outerr;
702
703
704 pageoffs = page - (int)(to >> this->page_shift);
705 offs = pageoffs << this->page_shift;
706
707 memset(&buf[offs], 0xff, (size_t) (numblocks >> sft));
708 ooboffs = len + (pageoffs * mtd->oobsize);
709
710 } else {
711
712 len = (size_t) (numblocks >> sft);
713
714 len = (len + (mtd->writesize - 1)) &
715 ~(mtd->writesize - 1);
716
717 memset(buf, 0xff, len +
718 (len >> this->page_shift)* mtd->oobsize);
719 offs = 0;
720 ooboffs = len;
721
722 memcpy(&buf[ooboffs + td->offs], td->pattern, td->len);
723 }
724
725 if (td->options & NAND_BBT_VERSION)
726 buf[ooboffs + td->veroffs] = td->version[chip];
727
728
729 for (i = 0; i < numblocks;) {
730 uint8_t dat;
731 dat = this->bbt[bbtoffs + (i >> 2)];
732 for (j = 0; j < 4; j++, i++) {
733 int sftcnt = (i << (3 - sft)) & sftmsk;
734
735 buf[offs + (i >> sft)] &=
736 ~(msk[dat & 0x03] << sftcnt);
737 dat >>= 2;
738 }
739 }
740
741 memset(&einfo, 0, sizeof(einfo));
742 einfo.mtd = mtd;
743 einfo.addr = to;
744 einfo.len = 1 << this->bbt_erase_shift;
745 res = nand_erase_nand(mtd, &einfo, 1);
746 if (res < 0)
747 goto outerr;
748
749 res = scan_write_bbt(mtd, to, len, buf, &buf[len]);
750 if (res < 0)
751 goto outerr;
752
753 printk(KERN_DEBUG "Bad block table written to 0x%012llx, version "
754 "0x%02X\n", (unsigned long long)to, td->version[chip]);
755
756
757 td->pages[chip] = page;
758 }
759 return 0;
760
761 outerr:
762 printk(KERN_WARNING
763 "nand_bbt: Error while writing bad block table %d\n", res);
764 return res;
765}
766
767
768
769
770
771
772
773
774
775static inline int nand_memory_bbt(struct mtd_info *mtd, struct nand_bbt_descr *bd)
776{
777 struct nand_chip *this = mtd->priv;
778
779 bd->options &= ~NAND_BBT_SCANEMPTY;
780 return create_bbt(mtd, this->buffers->databuf, bd, -1);
781}
782
783
784
785
786
787
788
789
790
791
792
793
794
795static int check_create(struct mtd_info *mtd, uint8_t *buf, struct nand_bbt_descr *bd)
796{
797 int i, chips, writeops, chipsel, res;
798 struct nand_chip *this = mtd->priv;
799 struct nand_bbt_descr *td = this->bbt_td;
800 struct nand_bbt_descr *md = this->bbt_md;
801 struct nand_bbt_descr *rd, *rd2;
802
803
804 if (td->options & NAND_BBT_PERCHIP)
805 chips = this->numchips;
806 else
807 chips = 1;
808
809 for (i = 0; i < chips; i++) {
810 writeops = 0;
811 rd = NULL;
812 rd2 = NULL;
813
814 chipsel = (td->options & NAND_BBT_PERCHIP) ? i : -1;
815
816 if (md) {
817 if (td->pages[i] == -1 && md->pages[i] == -1) {
818 writeops = 0x03;
819 goto create;
820 }
821
822 if (td->pages[i] == -1) {
823 rd = md;
824 td->version[i] = md->version[i];
825 writeops = 1;
826 goto writecheck;
827 }
828
829 if (md->pages[i] == -1) {
830 rd = td;
831 md->version[i] = td->version[i];
832 writeops = 2;
833 goto writecheck;
834 }
835
836 if (td->version[i] == md->version[i]) {
837 rd = td;
838 if (!(td->options & NAND_BBT_VERSION))
839 rd2 = md;
840 goto writecheck;
841 }
842
843 if (((int8_t) (td->version[i] - md->version[i])) > 0) {
844 rd = td;
845 md->version[i] = td->version[i];
846 writeops = 2;
847 } else {
848 rd = md;
849 td->version[i] = md->version[i];
850 writeops = 1;
851 }
852
853 goto writecheck;
854
855 } else {
856 if (td->pages[i] == -1) {
857 writeops = 0x01;
858 goto create;
859 }
860 rd = td;
861 goto writecheck;
862 }
863 create:
864
865 if (!(td->options & NAND_BBT_CREATE))
866 continue;
867
868
869 create_bbt(mtd, buf, bd, chipsel);
870
871 td->version[i] = 1;
872 if (md)
873 md->version[i] = 1;
874 writecheck:
875
876 if (rd)
877 read_abs_bbt(mtd, buf, rd, chipsel);
878
879 if (rd2)
880 read_abs_bbt(mtd, buf, rd2, chipsel);
881
882
883 if ((writeops & 0x01) && (td->options & NAND_BBT_WRITE)) {
884 res = write_bbt(mtd, buf, td, md, chipsel);
885 if (res < 0)
886 return res;
887 }
888
889
890 if ((writeops & 0x02) && md && (md->options & NAND_BBT_WRITE)) {
891 res = write_bbt(mtd, buf, md, td, chipsel);
892 if (res < 0)
893 return res;
894 }
895 }
896 return 0;
897}
898
899
900
901
902
903
904
905
906
907
908static void mark_bbt_region(struct mtd_info *mtd, struct nand_bbt_descr *td)
909{
910 struct nand_chip *this = mtd->priv;
911 int i, j, chips, block, nrblocks, update;
912 uint8_t oldval, newval;
913
914
915 if (td->options & NAND_BBT_PERCHIP) {
916 chips = this->numchips;
917 nrblocks = (int)(this->chipsize >> this->bbt_erase_shift);
918 } else {
919 chips = 1;
920 nrblocks = (int)(mtd->size >> this->bbt_erase_shift);
921 }
922
923 for (i = 0; i < chips; i++) {
924 if ((td->options & NAND_BBT_ABSPAGE) ||
925 !(td->options & NAND_BBT_WRITE)) {
926 if (td->pages[i] == -1)
927 continue;
928 block = td->pages[i] >> (this->bbt_erase_shift - this->page_shift);
929 block <<= 1;
930 oldval = this->bbt[(block >> 3)];
931 newval = oldval | (0x2 << (block & 0x06));
932 this->bbt[(block >> 3)] = newval;
933 if ((oldval != newval) && td->reserved_block_code)
934 nand_update_bbt(mtd, (loff_t)block << (this->bbt_erase_shift - 1));
935 continue;
936 }
937 update = 0;
938 if (td->options & NAND_BBT_LASTBLOCK)
939 block = ((i + 1) * nrblocks) - td->maxblocks;
940 else
941 block = i * nrblocks;
942 block <<= 1;
943 for (j = 0; j < td->maxblocks; j++) {
944 oldval = this->bbt[(block >> 3)];
945 newval = oldval | (0x2 << (block & 0x06));
946 this->bbt[(block >> 3)] = newval;
947 if (oldval != newval)
948 update = 1;
949 block += 2;
950 }
951
952
953
954 if (update && td->reserved_block_code)
955 nand_update_bbt(mtd, (loff_t)(block - 2) << (this->bbt_erase_shift - 1));
956 }
957}
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973int nand_scan_bbt(struct mtd_info *mtd, struct nand_bbt_descr *bd)
974{
975 struct nand_chip *this = mtd->priv;
976 int len, res = 0;
977 uint8_t *buf;
978 struct nand_bbt_descr *td = this->bbt_td;
979 struct nand_bbt_descr *md = this->bbt_md;
980
981 len = mtd->size >> (this->bbt_erase_shift + 2);
982
983 this->bbt = kzalloc(len, GFP_KERNEL);
984 if (!this->bbt) {
985 printk(KERN_ERR "nand_scan_bbt: Out of memory\n");
986 return -ENOMEM;
987 }
988
989
990
991
992 if (!td) {
993 if ((res = nand_memory_bbt(mtd, bd))) {
994 printk(KERN_ERR "nand_bbt: Can't scan flash and build the RAM-based BBT\n");
995 kfree(this->bbt);
996 this->bbt = NULL;
997 }
998 return res;
999 }
1000
1001
1002 len = (1 << this->bbt_erase_shift);
1003 len += (len >> this->page_shift) * mtd->oobsize;
1004 buf = vmalloc(len);
1005 if (!buf) {
1006 printk(KERN_ERR "nand_bbt: Out of memory\n");
1007 kfree(this->bbt);
1008 this->bbt = NULL;
1009 return -ENOMEM;
1010 }
1011
1012
1013 if (td->options & NAND_BBT_ABSPAGE) {
1014 res = read_abs_bbts(mtd, buf, td, md);
1015 } else {
1016
1017 res = search_read_bbts(mtd, buf, td, md);
1018 }
1019
1020 if (res)
1021 res = check_create(mtd, buf, bd);
1022
1023
1024 mark_bbt_region(mtd, td);
1025 if (md)
1026 mark_bbt_region(mtd, md);
1027
1028 vfree(buf);
1029 return res;
1030}
1031
1032
1033
1034
1035
1036
1037
1038
1039int nand_update_bbt(struct mtd_info *mtd, loff_t offs)
1040{
1041 struct nand_chip *this = mtd->priv;
1042 int len, res = 0, writeops = 0;
1043 int chip, chipsel;
1044 uint8_t *buf;
1045 struct nand_bbt_descr *td = this->bbt_td;
1046 struct nand_bbt_descr *md = this->bbt_md;
1047
1048 if (!this->bbt || !td)
1049 return -EINVAL;
1050
1051
1052 len = (1 << this->bbt_erase_shift);
1053 len += (len >> this->page_shift) * mtd->oobsize;
1054 buf = kmalloc(len, GFP_KERNEL);
1055 if (!buf) {
1056 printk(KERN_ERR "nand_update_bbt: Out of memory\n");
1057 return -ENOMEM;
1058 }
1059
1060 writeops = md != NULL ? 0x03 : 0x01;
1061
1062
1063 if (td->options & NAND_BBT_PERCHIP) {
1064 chip = (int)(offs >> this->chip_shift);
1065 chipsel = chip;
1066 } else {
1067 chip = 0;
1068 chipsel = -1;
1069 }
1070
1071 td->version[chip]++;
1072 if (md)
1073 md->version[chip]++;
1074
1075
1076 if ((writeops & 0x01) && (td->options & NAND_BBT_WRITE)) {
1077 res = write_bbt(mtd, buf, td, md, chipsel);
1078 if (res < 0)
1079 goto out;
1080 }
1081
1082 if ((writeops & 0x02) && md && (md->options & NAND_BBT_WRITE)) {
1083 res = write_bbt(mtd, buf, md, td, chipsel);
1084 }
1085
1086 out:
1087 kfree(buf);
1088 return res;
1089}
1090
1091
1092
1093static uint8_t scan_ff_pattern[] = { 0xff, 0xff };
1094
1095static struct nand_bbt_descr smallpage_memorybased = {
1096 .options = NAND_BBT_SCAN2NDPAGE,
1097 .offs = 5,
1098 .len = 1,
1099 .pattern = scan_ff_pattern
1100};
1101
1102static struct nand_bbt_descr largepage_memorybased = {
1103 .options = 0,
1104 .offs = 0,
1105 .len = 2,
1106 .pattern = scan_ff_pattern
1107};
1108
1109static struct nand_bbt_descr smallpage_flashbased = {
1110 .options = NAND_BBT_SCAN2NDPAGE,
1111 .offs = 5,
1112 .len = 1,
1113 .pattern = scan_ff_pattern
1114};
1115
1116static struct nand_bbt_descr largepage_flashbased = {
1117 .options = NAND_BBT_SCAN2NDPAGE,
1118 .offs = 0,
1119 .len = 2,
1120 .pattern = scan_ff_pattern
1121};
1122
1123static uint8_t scan_agand_pattern[] = { 0x1C, 0x71, 0xC7, 0x1C, 0x71, 0xC7 };
1124
1125static struct nand_bbt_descr agand_flashbased = {
1126 .options = NAND_BBT_SCANEMPTY | NAND_BBT_SCANALLPAGES,
1127 .offs = 0x20,
1128 .len = 6,
1129 .pattern = scan_agand_pattern
1130};
1131
1132
1133
1134static uint8_t bbt_pattern[] = {'B', 'b', 't', '0' };
1135static uint8_t mirror_pattern[] = {'1', 't', 'b', 'B' };
1136
1137static struct nand_bbt_descr bbt_main_descr = {
1138 .options = NAND_BBT_LASTBLOCK | NAND_BBT_CREATE | NAND_BBT_WRITE
1139 | NAND_BBT_2BIT | NAND_BBT_VERSION | NAND_BBT_PERCHIP,
1140 .offs = 8,
1141 .len = 4,
1142 .veroffs = 12,
1143 .maxblocks = 4,
1144 .pattern = bbt_pattern
1145};
1146
1147static struct nand_bbt_descr bbt_mirror_descr = {
1148 .options = NAND_BBT_LASTBLOCK | NAND_BBT_CREATE | NAND_BBT_WRITE
1149 | NAND_BBT_2BIT | NAND_BBT_VERSION | NAND_BBT_PERCHIP,
1150 .offs = 8,
1151 .len = 4,
1152 .veroffs = 12,
1153 .maxblocks = 4,
1154 .pattern = mirror_pattern
1155};
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165int nand_default_bbt(struct mtd_info *mtd)
1166{
1167 struct nand_chip *this = mtd->priv;
1168
1169
1170
1171
1172
1173
1174
1175
1176 if (this->options & NAND_IS_AND) {
1177
1178 if (!this->bbt_td) {
1179 this->bbt_td = &bbt_main_descr;
1180 this->bbt_md = &bbt_mirror_descr;
1181 }
1182 this->options |= NAND_USE_FLASH_BBT;
1183 return nand_scan_bbt(mtd, &agand_flashbased);
1184 }
1185
1186
1187 if (this->options & NAND_USE_FLASH_BBT) {
1188
1189 if (!this->bbt_td) {
1190 this->bbt_td = &bbt_main_descr;
1191 this->bbt_md = &bbt_mirror_descr;
1192 }
1193 if (!this->badblock_pattern) {
1194 this->badblock_pattern = (mtd->writesize > 512) ? &largepage_flashbased : &smallpage_flashbased;
1195 }
1196 } else {
1197 this->bbt_td = NULL;
1198 this->bbt_md = NULL;
1199 if (!this->badblock_pattern) {
1200 this->badblock_pattern = (mtd->writesize > 512) ?
1201 &largepage_memorybased : &smallpage_memorybased;
1202 }
1203 }
1204 return nand_scan_bbt(mtd, this->badblock_pattern);
1205}
1206
1207
1208
1209
1210
1211
1212
1213
1214int nand_isbad_bbt(struct mtd_info *mtd, loff_t offs, int allowbbt)
1215{
1216 struct nand_chip *this = mtd->priv;
1217 int block;
1218 uint8_t res;
1219
1220
1221 block = (int)(offs >> (this->bbt_erase_shift - 1));
1222 res = (this->bbt[block >> 3] >> (block & 0x06)) & 0x03;
1223
1224 DEBUG(MTD_DEBUG_LEVEL2, "nand_isbad_bbt(): bbt info for offs 0x%08x: (block %d) 0x%02x\n",
1225 (unsigned int)offs, block >> 1, res);
1226
1227 switch ((int)res) {
1228 case 0x00:
1229 return 0;
1230 case 0x01:
1231 return 1;
1232 case 0x02:
1233 return allowbbt ? 0 : 1;
1234 }
1235 return 1;
1236}
1237
1238EXPORT_SYMBOL(nand_scan_bbt);
1239EXPORT_SYMBOL(nand_default_bbt);
1240