]> git.kernelconcepts.de Git - karo-tx-uboot.git/blob - drivers/mtd/nand/nand_bbt.c
Merge branch 'master' of git://git.denx.de/u-boot-arc
[karo-tx-uboot.git] / drivers / mtd / nand / nand_bbt.c
1 /*
2  *  drivers/mtd/nand_bbt.c
3  *
4  *  Overview:
5  *   Bad block table support for the NAND driver
6  *
7  *  Copyright © 2004 Thomas Gleixner (tglx@linutronix.de)
8  *
9  * This program is free software; you can redistribute it and/or modify
10  * it under the terms of the GNU General Public License version 2 as
11  * published by the Free Software Foundation.
12  *
13  * Description:
14  *
15  * When nand_scan_bbt is called, then it tries to find the bad block table
16  * depending on the options in the BBT descriptor(s). If no flash based BBT
17  * (NAND_BBT_USE_FLASH) is specified then the device is scanned for factory
18  * marked good / bad blocks. This information is used to create a memory BBT.
19  * Once a new bad block is discovered then the "factory" information is updated
20  * on the device.
21  * If a flash based BBT is specified then the function first tries to find the
22  * BBT on flash. If a BBT is found then the contents are read and the memory
23  * based BBT is created. If a mirrored BBT is selected then the mirror is
24  * searched too and the versions are compared. If the mirror has a greater
25  * version number, then the mirror BBT is used to build the memory based BBT.
26  * If the tables are not versioned, then we "or" the bad block information.
27  * If one of the BBTs is out of date or does not exist it is (re)created.
28  * If no BBT exists at all then the device is scanned for factory marked
29  * good / bad blocks and the bad block tables are created.
30  *
31  * For manufacturer created BBTs like the one found on M-SYS DOC devices
32  * the BBT is searched and read but never created
33  *
34  * The auto generated bad block table is located in the last good blocks
35  * of the device. The table is mirrored, so it can be updated eventually.
36  * The table is marked in the OOB area with an ident pattern and a version
37  * number which indicates which of both tables is more up to date. If the NAND
38  * controller needs the complete OOB area for the ECC information then the
39  * option NAND_BBT_NO_OOB should be used (along with NAND_BBT_USE_FLASH, of
40  * course): it moves the ident pattern and the version byte into the data area
41  * and the OOB area will remain untouched.
42  *
43  * The table uses 2 bits per block
44  * 11b:         block is good
45  * 00b:         block is factory marked bad
46  * 01b, 10b:    block is marked bad due to wear
47  *
48  * The memory bad block table uses the following scheme:
49  * 00b:         block is good
50  * 01b:         block is marked bad due to wear
51  * 10b:         block is reserved (to protect the bbt area)
52  * 11b:         block is factory marked bad
53  *
54  * Multichip devices like DOC store the bad block info per floor.
55  *
56  * Following assumptions are made:
57  * - bbts start at a page boundary, if autolocated on a block boundary
58  * - the space necessary for a bbt in FLASH does not exceed a block boundary
59  *
60  */
61
62 #define __UBOOT__
63 #ifndef __UBOOT__
64 #include <linux/slab.h>
65 #include <linux/types.h>
66 #include <linux/mtd/mtd.h>
67 #include <linux/mtd/bbm.h>
68 #include <linux/mtd/nand.h>
69 #include <linux/mtd/nand_ecc.h>
70 #include <linux/bitops.h>
71 #include <linux/delay.h>
72 #include <linux/vmalloc.h>
73 #include <linux/export.h>
74 #include <linux/string.h>
75 #else
76 #include <common.h>
77 #include <malloc.h>
78 #include <linux/compat.h>
79
80  #include <linux/mtd/mtd.h>
81  #include <linux/mtd/bbm.h>
82  #include <linux/mtd/nand.h>
83  #include <linux/mtd/nand_ecc.h>
84  #include <linux/bitops.h>
85  #include <linux/string.h>
86 #endif
87
88 #define BBT_BLOCK_GOOD          0x00
89 #define BBT_BLOCK_WORN          0x01
90 #define BBT_BLOCK_RESERVED      0x02
91 #define BBT_BLOCK_FACTORY_BAD   0x03
92
93 #define BBT_ENTRY_MASK          0x03
94 #define BBT_ENTRY_SHIFT         2
95
96 static int nand_update_bbt(struct mtd_info *mtd, loff_t offs);
97
98 static inline uint8_t bbt_get_entry(struct nand_chip *chip, int block)
99 {
100         uint8_t entry = chip->bbt[block >> BBT_ENTRY_SHIFT];
101         entry >>= (block & BBT_ENTRY_MASK) * 2;
102         return entry & BBT_ENTRY_MASK;
103 }
104
105 static inline void bbt_mark_entry(struct nand_chip *chip, int block,
106                 uint8_t mark)
107 {
108         uint8_t msk = (mark & BBT_ENTRY_MASK) << ((block & BBT_ENTRY_MASK) * 2);
109         chip->bbt[block >> BBT_ENTRY_SHIFT] |= msk;
110 }
111
112 static int check_pattern_no_oob(uint8_t *buf, struct nand_bbt_descr *td)
113 {
114         if (memcmp(buf, td->pattern, td->len))
115                 return -1;
116         return 0;
117 }
118
119 /**
120  * check_pattern - [GENERIC] check if a pattern is in the buffer
121  * @buf: the buffer to search
122  * @len: the length of buffer to search
123  * @paglen: the pagelength
124  * @td: search pattern descriptor
125  *
126  * Check for a pattern at the given place. Used to search bad block tables and
127  * good / bad block identifiers.
128  */
129 static int check_pattern(uint8_t *buf, int len, int paglen, struct nand_bbt_descr *td)
130 {
131         if (td->options & NAND_BBT_NO_OOB)
132                 return check_pattern_no_oob(buf, td);
133
134         /* Compare the pattern */
135         if (memcmp(buf + paglen + td->offs, td->pattern, td->len))
136                 return -1;
137
138         return 0;
139 }
140
141 /**
142  * check_short_pattern - [GENERIC] check if a pattern is in the buffer
143  * @buf: the buffer to search
144  * @td: search pattern descriptor
145  *
146  * Check for a pattern at the given place. Used to search bad block tables and
147  * good / bad block identifiers. Same as check_pattern, but no optional empty
148  * check.
149  */
150 static int check_short_pattern(uint8_t *buf, struct nand_bbt_descr *td)
151 {
152         /* Compare the pattern */
153         if (memcmp(buf + td->offs, td->pattern, td->len))
154                 return -1;
155         return 0;
156 }
157
158 /**
159  * add_marker_len - compute the length of the marker in data area
160  * @td: BBT descriptor used for computation
161  *
162  * The length will be 0 if the marker is located in OOB area.
163  */
164 static u32 add_marker_len(struct nand_bbt_descr *td)
165 {
166         u32 len;
167
168         if (!(td->options & NAND_BBT_NO_OOB))
169                 return 0;
170
171         len = td->len;
172         if (td->options & NAND_BBT_VERSION)
173                 len++;
174         return len;
175 }
176
177 /**
178  * read_bbt - [GENERIC] Read the bad block table starting from page
179  * @mtd: MTD device structure
180  * @buf: temporary buffer
181  * @page: the starting page
182  * @num: the number of bbt descriptors to read
183  * @td: the bbt describtion table
184  * @offs: block number offset in the table
185  *
186  * Read the bad block table starting from page.
187  */
188 static int read_bbt(struct mtd_info *mtd, uint8_t *buf, int page, int num,
189                 struct nand_bbt_descr *td, int offs)
190 {
191         int res, ret = 0, i, j, act = 0;
192         struct nand_chip *this = mtd->priv;
193         size_t retlen, len, totlen;
194         loff_t from;
195         int bits = td->options & NAND_BBT_NRBITS_MSK;
196         uint8_t msk = (uint8_t)((1 << bits) - 1);
197         u32 marker_len;
198         int reserved_block_code = td->reserved_block_code;
199
200         totlen = (num * bits) >> 3;
201         marker_len = add_marker_len(td);
202         from = ((loff_t)page) << this->page_shift;
203
204         while (totlen) {
205                 len = min(totlen, (size_t)(1 << this->bbt_erase_shift));
206                 if (marker_len) {
207                         /*
208                          * In case the BBT marker is not in the OOB area it
209                          * will be just in the first page.
210                          */
211                         len -= marker_len;
212                         from += marker_len;
213                         marker_len = 0;
214                 }
215                 res = mtd_read(mtd, from, len, &retlen, buf);
216                 if (res < 0) {
217                         if (mtd_is_eccerr(res)) {
218                                 pr_info("nand_bbt: ECC error in BBT at "
219                                         "0x%012llx\n", from & ~mtd->writesize);
220                                 return res;
221                         } else if (mtd_is_bitflip(res)) {
222                                 pr_info("nand_bbt: corrected error in BBT at "
223                                         "0x%012llx\n", from & ~mtd->writesize);
224                                 ret = res;
225                         } else {
226                                 pr_info("nand_bbt: error reading BBT\n");
227                                 return res;
228                         }
229                 }
230
231                 /* Analyse data */
232                 for (i = 0; i < len; i++) {
233                         uint8_t dat = buf[i];
234                         for (j = 0; j < 8; j += bits, act++) {
235                                 uint8_t tmp = (dat >> j) & msk;
236                                 if (tmp == msk)
237                                         continue;
238                                 if (reserved_block_code && (tmp == reserved_block_code)) {
239                                         pr_info("nand_read_bbt: reserved block at 0x%012llx\n",
240                                                  (loff_t)(offs + act) <<
241                                                  this->bbt_erase_shift);
242                                         bbt_mark_entry(this, offs + act,
243                                                         BBT_BLOCK_RESERVED);
244                                         mtd->ecc_stats.bbtblocks++;
245                                         continue;
246                                 }
247                                 /*
248                                  * Leave it for now, if it's matured we can
249                                  * move this message to pr_debug.
250                                  */
251                                 pr_info("nand_read_bbt: bad block at 0x%012llx\n",
252                                          (loff_t)(offs + act) <<
253                                          this->bbt_erase_shift);
254                                 /* Factory marked bad or worn out? */
255                                 if (tmp == 0)
256                                         bbt_mark_entry(this, offs + act,
257                                                         BBT_BLOCK_FACTORY_BAD);
258                                 else
259                                         bbt_mark_entry(this, offs + act,
260                                                         BBT_BLOCK_WORN);
261                                 mtd->ecc_stats.badblocks++;
262                         }
263                 }
264                 totlen -= len;
265                 from += len;
266         }
267         return ret;
268 }
269
270 /**
271  * read_abs_bbt - [GENERIC] Read the bad block table starting at a given page
272  * @mtd: MTD device structure
273  * @buf: temporary buffer
274  * @td: descriptor for the bad block table
275  * @chip: read the table for a specific chip, -1 read all chips; applies only if
276  *        NAND_BBT_PERCHIP option is set
277  *
278  * Read the bad block table for all chips starting at a given page. We assume
279  * that the bbt bits are in consecutive order.
280  */
281 static int read_abs_bbt(struct mtd_info *mtd, uint8_t *buf, struct nand_bbt_descr *td, int chip)
282 {
283         struct nand_chip *this = mtd->priv;
284         int res = 0, i;
285
286         if (td->options & NAND_BBT_PERCHIP) {
287                 int offs = 0;
288                 for (i = 0; i < this->numchips; i++) {
289                         if (chip == -1 || chip == i)
290                                 res = read_bbt(mtd, buf, td->pages[i],
291                                         this->chipsize >> this->bbt_erase_shift,
292                                         td, offs);
293                         if (res)
294                                 return res;
295                         offs += this->chipsize >> this->bbt_erase_shift;
296                 }
297         } else {
298                 res = read_bbt(mtd, buf, td->pages[0],
299                                 mtd->size >> this->bbt_erase_shift, td, 0);
300                 if (res)
301                         return res;
302         }
303         return 0;
304 }
305
306 /* BBT marker is in the first page, no OOB */
307 static int scan_read_data(struct mtd_info *mtd, uint8_t *buf, loff_t offs,
308                          struct nand_bbt_descr *td)
309 {
310         size_t retlen;
311         size_t len;
312
313         len = td->len;
314         if (td->options & NAND_BBT_VERSION)
315                 len++;
316
317         return mtd_read(mtd, offs, len, &retlen, buf);
318 }
319
320 /**
321  * scan_read_oob - [GENERIC] Scan data+OOB region to buffer
322  * @mtd: MTD device structure
323  * @buf: temporary buffer
324  * @offs: offset at which to scan
325  * @len: length of data region to read
326  *
327  * Scan read data from data+OOB. May traverse multiple pages, interleaving
328  * page,OOB,page,OOB,... in buf. Completes transfer and returns the "strongest"
329  * ECC condition (error or bitflip). May quit on the first (non-ECC) error.
330  */
331 static int scan_read_oob(struct mtd_info *mtd, uint8_t *buf, loff_t offs,
332                          size_t len)
333 {
334         struct mtd_oob_ops ops;
335         int res, ret = 0;
336
337         ops.mode = MTD_OPS_PLACE_OOB;
338         ops.ooboffs = 0;
339         ops.ooblen = mtd->oobsize;
340
341         while (len > 0) {
342                 ops.datbuf = buf;
343                 ops.len = min(len, (size_t)mtd->writesize);
344                 ops.oobbuf = buf + ops.len;
345
346                 res = mtd_read_oob(mtd, offs, &ops);
347                 if (res) {
348                         if (!mtd_is_bitflip_or_eccerr(res))
349                                 return res;
350                         else if (mtd_is_eccerr(res) || !ret)
351                                 ret = res;
352                 }
353
354                 buf += mtd->oobsize + mtd->writesize;
355                 len -= mtd->writesize;
356                 offs += mtd->writesize;
357         }
358         return ret;
359 }
360
361 static int scan_read(struct mtd_info *mtd, uint8_t *buf, loff_t offs,
362                          size_t len, struct nand_bbt_descr *td)
363 {
364         if (td->options & NAND_BBT_NO_OOB)
365                 return scan_read_data(mtd, buf, offs, td);
366         else
367                 return scan_read_oob(mtd, buf, offs, len);
368 }
369
370 /* Scan write data with oob to flash */
371 static int scan_write_bbt(struct mtd_info *mtd, loff_t offs, size_t len,
372                           uint8_t *buf, uint8_t *oob)
373 {
374         struct mtd_oob_ops ops;
375
376         ops.mode = MTD_OPS_PLACE_OOB;
377         ops.ooboffs = 0;
378         ops.ooblen = mtd->oobsize;
379         ops.datbuf = buf;
380         ops.oobbuf = oob;
381         ops.len = len;
382
383         return mtd_write_oob(mtd, offs, &ops);
384 }
385
386 static u32 bbt_get_ver_offs(struct mtd_info *mtd, struct nand_bbt_descr *td)
387 {
388         u32 ver_offs = td->veroffs;
389
390         if (!(td->options & NAND_BBT_NO_OOB))
391                 ver_offs += mtd->writesize;
392         return ver_offs;
393 }
394
395 /**
396  * read_abs_bbts - [GENERIC] Read the bad block table(s) for all chips starting at a given page
397  * @mtd: MTD device structure
398  * @buf: temporary buffer
399  * @td: descriptor for the bad block table
400  * @md: descriptor for the bad block table mirror
401  *
402  * Read the bad block table(s) for all chips starting at a given page. We
403  * assume that the bbt bits are in consecutive order.
404  */
405 static void read_abs_bbts(struct mtd_info *mtd, uint8_t *buf,
406                           struct nand_bbt_descr *td, struct nand_bbt_descr *md)
407 {
408         struct nand_chip *this = mtd->priv;
409
410         /* Read the primary version, if available */
411         if (td->options & NAND_BBT_VERSION) {
412                 scan_read(mtd, buf, (loff_t)td->pages[0] << this->page_shift,
413                               mtd->writesize, td);
414                 td->version[0] = buf[bbt_get_ver_offs(mtd, td)];
415                 pr_info("Bad block table at page %d, version 0x%02X\n",
416                          td->pages[0], td->version[0]);
417         }
418
419         /* Read the mirror version, if available */
420         if (md && (md->options & NAND_BBT_VERSION)) {
421                 scan_read(mtd, buf, (loff_t)md->pages[0] << this->page_shift,
422                               mtd->writesize, md);
423                 md->version[0] = buf[bbt_get_ver_offs(mtd, md)];
424                 pr_info("Bad block table at page %d, version 0x%02X\n",
425                          md->pages[0], md->version[0]);
426         }
427 }
428
429 /* Scan a given block partially */
430 static int scan_block_fast(struct mtd_info *mtd, struct nand_bbt_descr *bd,
431                            loff_t offs, uint8_t *buf, int numpages)
432 {
433         struct mtd_oob_ops ops;
434         int j, ret;
435
436         ops.ooblen = mtd->oobsize;
437         ops.oobbuf = buf;
438         ops.ooboffs = 0;
439         ops.datbuf = NULL;
440         ops.mode = MTD_OPS_PLACE_OOB;
441
442         for (j = 0; j < numpages; j++) {
443                 /*
444                  * Read the full oob until read_oob is fixed to handle single
445                  * byte reads for 16 bit buswidth.
446                  */
447                 ret = mtd_read_oob(mtd, offs, &ops);
448                 /* Ignore ECC errors when checking for BBM */
449                 if (ret && !mtd_is_bitflip_or_eccerr(ret))
450                         return ret;
451
452                 if (check_short_pattern(buf, bd))
453                         return 1;
454
455                 offs += mtd->writesize;
456         }
457         return 0;
458 }
459
460 /**
461  * create_bbt - [GENERIC] Create a bad block table by scanning the device
462  * @mtd: MTD device structure
463  * @buf: temporary buffer
464  * @bd: descriptor for the good/bad block search pattern
465  * @chip: create the table for a specific chip, -1 read all chips; applies only
466  *        if NAND_BBT_PERCHIP option is set
467  *
468  * Create a bad block table by scanning the device for the given good/bad block
469  * identify pattern.
470  */
471 static int create_bbt(struct mtd_info *mtd, uint8_t *buf,
472         struct nand_bbt_descr *bd, int chip)
473 {
474         struct nand_chip *this = mtd->priv;
475         int i, numblocks, numpages;
476         int startblock;
477         loff_t from;
478
479         pr_info("Scanning device for bad blocks\n");
480
481         if (bd->options & NAND_BBT_SCAN2NDPAGE)
482                 numpages = 2;
483         else
484                 numpages = 1;
485
486         if (chip == -1) {
487                 numblocks = mtd->size >> this->bbt_erase_shift;
488                 startblock = 0;
489                 from = 0;
490         } else {
491                 if (chip >= this->numchips) {
492                         pr_warn("create_bbt(): chipnr (%d) > available chips (%d)\n",
493                                chip + 1, this->numchips);
494                         return -EINVAL;
495                 }
496                 numblocks = this->chipsize >> this->bbt_erase_shift;
497                 startblock = chip * numblocks;
498                 numblocks += startblock;
499                 from = (loff_t)startblock << this->bbt_erase_shift;
500         }
501
502         if (this->bbt_options & NAND_BBT_SCANLASTPAGE)
503                 from += mtd->erasesize - (mtd->writesize * numpages);
504
505         for (i = startblock; i < numblocks; i++) {
506                 int ret;
507
508                 BUG_ON(bd->options & NAND_BBT_NO_OOB);
509
510                 ret = scan_block_fast(mtd, bd, from, buf, numpages);
511                 if (ret < 0)
512                         return ret;
513
514                 if (ret) {
515                         bbt_mark_entry(this, i, BBT_BLOCK_FACTORY_BAD);
516                         pr_warn("Bad eraseblock %d at 0x%012llx\n",
517                                 i, (unsigned long long)from);
518                         mtd->ecc_stats.badblocks++;
519                 }
520
521                 from += (1 << this->bbt_erase_shift);
522         }
523         return 0;
524 }
525
526 /**
527  * search_bbt - [GENERIC] scan the device for a specific bad block table
528  * @mtd: MTD device structure
529  * @buf: temporary buffer
530  * @td: descriptor for the bad block table
531  *
532  * Read the bad block table by searching for a given ident pattern. Search is
533  * preformed either from the beginning up or from the end of the device
534  * downwards. The search starts always at the start of a block. If the option
535  * NAND_BBT_PERCHIP is given, each chip is searched for a bbt, which contains
536  * the bad block information of this chip. This is necessary to provide support
537  * for certain DOC devices.
538  *
539  * The bbt ident pattern resides in the oob area of the first page in a block.
540  */
541 static int search_bbt(struct mtd_info *mtd, uint8_t *buf, struct nand_bbt_descr *td)
542 {
543         struct nand_chip *this = mtd->priv;
544         int i, chips;
545 #ifndef __UBOOT__
546         int bits, startblock, block, dir;
547 #else
548         int startblock, block, dir;
549 #endif
550         int scanlen = mtd->writesize + mtd->oobsize;
551         int bbtblocks;
552         int blocktopage = this->bbt_erase_shift - this->page_shift;
553
554         /* Search direction top -> down? */
555         if (td->options & NAND_BBT_LASTBLOCK) {
556                 startblock = (mtd->size >> this->bbt_erase_shift) - 1;
557                 dir = -1;
558         } else {
559                 startblock = 0;
560                 dir = 1;
561         }
562
563         /* Do we have a bbt per chip? */
564         if (td->options & NAND_BBT_PERCHIP) {
565                 chips = this->numchips;
566                 bbtblocks = this->chipsize >> this->bbt_erase_shift;
567                 startblock &= bbtblocks - 1;
568         } else {
569                 chips = 1;
570                 bbtblocks = mtd->size >> this->bbt_erase_shift;
571         }
572
573 #ifndef __UBOOT__
574         /* Number of bits for each erase block in the bbt */
575         bits = td->options & NAND_BBT_NRBITS_MSK;
576 #endif
577
578         for (i = 0; i < chips; i++) {
579                 /* Reset version information */
580                 td->version[i] = 0;
581                 td->pages[i] = -1;
582                 /* Scan the maximum number of blocks */
583                 for (block = 0; block < td->maxblocks; block++) {
584
585                         int actblock = startblock + dir * block;
586                         loff_t offs = (loff_t)actblock << this->bbt_erase_shift;
587
588                         /* Read first page */
589                         scan_read(mtd, buf, offs, mtd->writesize, td);
590                         if (!check_pattern(buf, scanlen, mtd->writesize, td)) {
591                                 td->pages[i] = actblock << blocktopage;
592                                 if (td->options & NAND_BBT_VERSION) {
593                                         offs = bbt_get_ver_offs(mtd, td);
594                                         td->version[i] = buf[offs];
595                                 }
596                                 break;
597                         }
598                 }
599                 startblock += this->chipsize >> this->bbt_erase_shift;
600         }
601         /* Check, if we found a bbt for each requested chip */
602         for (i = 0; i < chips; i++) {
603                 if (td->pages[i] == -1)
604                         pr_warn("Bad block table not found for chip %d\n", i);
605                 else
606                         pr_info("Bad block table found at page %d, version "
607                                  "0x%02X\n", td->pages[i], td->version[i]);
608         }
609         return 0;
610 }
611
612 /**
613  * search_read_bbts - [GENERIC] scan the device for bad block table(s)
614  * @mtd: MTD device structure
615  * @buf: temporary buffer
616  * @td: descriptor for the bad block table
617  * @md: descriptor for the bad block table mirror
618  *
619  * Search and read the bad block table(s).
620  */
621 static void search_read_bbts(struct mtd_info *mtd, uint8_t *buf,
622                              struct nand_bbt_descr *td,
623                              struct nand_bbt_descr *md)
624 {
625         /* Search the primary table */
626         search_bbt(mtd, buf, td);
627
628         /* Search the mirror table */
629         if (md)
630                 search_bbt(mtd, buf, md);
631 }
632
633 /**
634  * write_bbt - [GENERIC] (Re)write the bad block table
635  * @mtd: MTD device structure
636  * @buf: temporary buffer
637  * @td: descriptor for the bad block table
638  * @md: descriptor for the bad block table mirror
639  * @chipsel: selector for a specific chip, -1 for all
640  *
641  * (Re)write the bad block table.
642  */
643 static int write_bbt(struct mtd_info *mtd, uint8_t *buf,
644                      struct nand_bbt_descr *td, struct nand_bbt_descr *md,
645                      int chipsel)
646 {
647         struct nand_chip *this = mtd->priv;
648         struct erase_info einfo;
649         int i, res, chip = 0;
650         int bits, startblock, dir, page, offs, numblocks, sft, sftmsk;
651         int nrchips, pageoffs, ooboffs;
652         uint8_t msk[4];
653         uint8_t rcode = td->reserved_block_code;
654         size_t retlen, len = 0;
655         loff_t to;
656         struct mtd_oob_ops ops;
657
658         ops.ooblen = mtd->oobsize;
659         ops.ooboffs = 0;
660         ops.datbuf = NULL;
661         ops.mode = MTD_OPS_PLACE_OOB;
662
663         if (!rcode)
664                 rcode = 0xff;
665         /* Write bad block table per chip rather than per device? */
666         if (td->options & NAND_BBT_PERCHIP) {
667                 numblocks = (int)(this->chipsize >> this->bbt_erase_shift);
668                 /* Full device write or specific chip? */
669                 if (chipsel == -1) {
670                         nrchips = this->numchips;
671                 } else {
672                         nrchips = chipsel + 1;
673                         chip = chipsel;
674                 }
675         } else {
676                 numblocks = (int)(mtd->size >> this->bbt_erase_shift);
677                 nrchips = 1;
678         }
679
680         /* Loop through the chips */
681         for (; chip < nrchips; chip++) {
682                 /*
683                  * There was already a version of the table, reuse the page
684                  * This applies for absolute placement too, as we have the
685                  * page nr. in td->pages.
686                  */
687                 if (td->pages[chip] != -1) {
688                         page = td->pages[chip];
689                         goto write;
690                 }
691
692                 /*
693                  * Automatic placement of the bad block table. Search direction
694                  * top -> down?
695                  */
696                 if (td->options & NAND_BBT_LASTBLOCK) {
697                         startblock = numblocks * (chip + 1) - 1;
698                         dir = -1;
699                 } else {
700                         startblock = chip * numblocks;
701                         dir = 1;
702                 }
703
704                 for (i = 0; i < td->maxblocks; i++) {
705                         int block = startblock + dir * i;
706                         /* Check, if the block is bad */
707                         switch (bbt_get_entry(this, block)) {
708                         case BBT_BLOCK_WORN:
709                         case BBT_BLOCK_FACTORY_BAD:
710                                 continue;
711                         }
712                         page = block <<
713                                 (this->bbt_erase_shift - this->page_shift);
714                         /* Check, if the block is used by the mirror table */
715                         if (!md || md->pages[chip] != page)
716                                 goto write;
717                 }
718                 pr_err("No space left to write bad block table\n");
719                 return -ENOSPC;
720         write:
721
722                 /* Set up shift count and masks for the flash table */
723                 bits = td->options & NAND_BBT_NRBITS_MSK;
724                 msk[2] = ~rcode;
725                 switch (bits) {
726                 case 1: sft = 3; sftmsk = 0x07; msk[0] = 0x00; msk[1] = 0x01;
727                         msk[3] = 0x01;
728                         break;
729                 case 2: sft = 2; sftmsk = 0x06; msk[0] = 0x00; msk[1] = 0x01;
730                         msk[3] = 0x03;
731                         break;
732                 case 4: sft = 1; sftmsk = 0x04; msk[0] = 0x00; msk[1] = 0x0C;
733                         msk[3] = 0x0f;
734                         break;
735                 case 8: sft = 0; sftmsk = 0x00; msk[0] = 0x00; msk[1] = 0x0F;
736                         msk[3] = 0xff;
737                         break;
738                 default: return -EINVAL;
739                 }
740
741                 to = ((loff_t)page) << this->page_shift;
742
743                 /* Must we save the block contents? */
744                 if (td->options & NAND_BBT_SAVECONTENT) {
745                         /* Make it block aligned */
746                         to &= ~((loff_t)((1 << this->bbt_erase_shift) - 1));
747                         len = 1 << this->bbt_erase_shift;
748                         res = mtd_read(mtd, to, len, &retlen, buf);
749                         if (res < 0) {
750                                 if (retlen != len) {
751                                         pr_info("nand_bbt: error reading block "
752                                                 "for writing the bad block table\n");
753                                         return res;
754                                 }
755                                 pr_warn("nand_bbt: ECC error while reading "
756                                         "block for writing bad block table\n");
757                         }
758                         /* Read oob data */
759                         ops.ooblen = (len >> this->page_shift) * mtd->oobsize;
760                         ops.oobbuf = &buf[len];
761                         res = mtd_read_oob(mtd, to + mtd->writesize, &ops);
762                         if (res < 0 || ops.oobretlen != ops.ooblen)
763                                 goto outerr;
764
765                         /* Calc the byte offset in the buffer */
766                         pageoffs = page - (int)(to >> this->page_shift);
767                         offs = pageoffs << this->page_shift;
768                         /* Preset the bbt area with 0xff */
769                         memset(&buf[offs], 0xff, (size_t)(numblocks >> sft));
770                         ooboffs = len + (pageoffs * mtd->oobsize);
771
772                 } else if (td->options & NAND_BBT_NO_OOB) {
773                         ooboffs = 0;
774                         offs = td->len;
775                         /* The version byte */
776                         if (td->options & NAND_BBT_VERSION)
777                                 offs++;
778                         /* Calc length */
779                         len = (size_t)(numblocks >> sft);
780                         len += offs;
781                         /* Make it page aligned! */
782                         len = ALIGN(len, mtd->writesize);
783                         /* Preset the buffer with 0xff */
784                         memset(buf, 0xff, len);
785                         /* Pattern is located at the begin of first page */
786                         memcpy(buf, td->pattern, td->len);
787                 } else {
788                         /* Calc length */
789                         len = (size_t)(numblocks >> sft);
790                         /* Make it page aligned! */
791                         len = ALIGN(len, mtd->writesize);
792                         /* Preset the buffer with 0xff */
793                         memset(buf, 0xff, len +
794                                (len >> this->page_shift)* mtd->oobsize);
795                         offs = 0;
796                         ooboffs = len;
797                         /* Pattern is located in oob area of first page */
798                         memcpy(&buf[ooboffs + td->offs], td->pattern, td->len);
799                 }
800
801                 if (td->options & NAND_BBT_VERSION)
802                         buf[ooboffs + td->veroffs] = td->version[chip];
803
804                 /* Walk through the memory table */
805                 for (i = 0; i < numblocks; i++) {
806                         uint8_t dat;
807                         int sftcnt = (i << (3 - sft)) & sftmsk;
808                         dat = bbt_get_entry(this, chip * numblocks + i);
809                         /* Do not store the reserved bbt blocks! */
810                         buf[offs + (i >> sft)] &= ~(msk[dat] << sftcnt);
811                 }
812
813                 memset(&einfo, 0, sizeof(einfo));
814                 einfo.mtd = mtd;
815                 einfo.addr = to;
816                 einfo.len = 1 << this->bbt_erase_shift;
817                 res = nand_erase_nand(mtd, &einfo, 1);
818                 if (res < 0)
819                         goto outerr;
820
821                 res = scan_write_bbt(mtd, to, len, buf,
822                                 td->options & NAND_BBT_NO_OOB ? NULL :
823                                 &buf[len]);
824                 if (res < 0)
825                         goto outerr;
826
827                 pr_info("Bad block table written to 0x%012llx, version 0x%02X\n",
828                          (unsigned long long)to, td->version[chip]);
829
830                 /* Mark it as used */
831                 td->pages[chip] = page;
832         }
833         return 0;
834
835  outerr:
836         pr_warn("nand_bbt: error while writing bad block table %d\n", res);
837         return res;
838 }
839
840 /**
841  * nand_memory_bbt - [GENERIC] create a memory based bad block table
842  * @mtd: MTD device structure
843  * @bd: descriptor for the good/bad block search pattern
844  *
845  * The function creates a memory based bbt by scanning the device for
846  * manufacturer / software marked good / bad blocks.
847  */
848 static inline int nand_memory_bbt(struct mtd_info *mtd, struct nand_bbt_descr *bd)
849 {
850         struct nand_chip *this = mtd->priv;
851
852         return create_bbt(mtd, this->buffers->databuf, bd, -1);
853 }
854
855 /**
856  * check_create - [GENERIC] create and write bbt(s) if necessary
857  * @mtd: MTD device structure
858  * @buf: temporary buffer
859  * @bd: descriptor for the good/bad block search pattern
860  *
861  * The function checks the results of the previous call to read_bbt and creates
862  * / updates the bbt(s) if necessary. Creation is necessary if no bbt was found
863  * for the chip/device. Update is necessary if one of the tables is missing or
864  * the version nr. of one table is less than the other.
865  */
866 static int check_create(struct mtd_info *mtd, uint8_t *buf, struct nand_bbt_descr *bd)
867 {
868         int i, chips, writeops, create, chipsel, res, res2;
869         struct nand_chip *this = mtd->priv;
870         struct nand_bbt_descr *td = this->bbt_td;
871         struct nand_bbt_descr *md = this->bbt_md;
872         struct nand_bbt_descr *rd, *rd2;
873
874         /* Do we have a bbt per chip? */
875         if (td->options & NAND_BBT_PERCHIP)
876                 chips = this->numchips;
877         else
878                 chips = 1;
879
880         for (i = 0; i < chips; i++) {
881                 writeops = 0;
882                 create = 0;
883                 rd = NULL;
884                 rd2 = NULL;
885                 res = res2 = 0;
886                 /* Per chip or per device? */
887                 chipsel = (td->options & NAND_BBT_PERCHIP) ? i : -1;
888                 /* Mirrored table available? */
889                 if (md) {
890                         if (td->pages[i] == -1 && md->pages[i] == -1) {
891                                 create = 1;
892                                 writeops = 0x03;
893                         } else if (td->pages[i] == -1) {
894                                 rd = md;
895                                 writeops = 0x01;
896                         } else if (md->pages[i] == -1) {
897                                 rd = td;
898                                 writeops = 0x02;
899                         } else if (td->version[i] == md->version[i]) {
900                                 rd = td;
901                                 if (!(td->options & NAND_BBT_VERSION))
902                                         rd2 = md;
903                         } else if (((int8_t)(td->version[i] - md->version[i])) > 0) {
904                                 rd = td;
905                                 writeops = 0x02;
906                         } else {
907                                 rd = md;
908                                 writeops = 0x01;
909                         }
910                 } else {
911                         if (td->pages[i] == -1) {
912                                 create = 1;
913                                 writeops = 0x01;
914                         } else {
915                                 rd = td;
916                         }
917                 }
918
919                 if (create) {
920                         /* Create the bad block table by scanning the device? */
921                         if (!(td->options & NAND_BBT_CREATE))
922                                 continue;
923
924                         /* Create the table in memory by scanning the chip(s) */
925                         if (!(this->bbt_options & NAND_BBT_CREATE_EMPTY))
926                                 create_bbt(mtd, buf, bd, chipsel);
927
928                         td->version[i] = 1;
929                         if (md)
930                                 md->version[i] = 1;
931                 }
932
933                 /* Read back first? */
934                 if (rd) {
935                         res = read_abs_bbt(mtd, buf, rd, chipsel);
936                         if (mtd_is_eccerr(res)) {
937                                 /* Mark table as invalid */
938                                 rd->pages[i] = -1;
939                                 rd->version[i] = 0;
940                                 i--;
941                                 continue;
942                         }
943                 }
944                 /* If they weren't versioned, read both */
945                 if (rd2) {
946                         res2 = read_abs_bbt(mtd, buf, rd2, chipsel);
947                         if (mtd_is_eccerr(res2)) {
948                                 /* Mark table as invalid */
949                                 rd2->pages[i] = -1;
950                                 rd2->version[i] = 0;
951                                 i--;
952                                 continue;
953                         }
954                 }
955
956                 /* Scrub the flash table(s)? */
957                 if (mtd_is_bitflip(res) || mtd_is_bitflip(res2))
958                         writeops = 0x03;
959
960                 /* Update version numbers before writing */
961                 if (md) {
962                         td->version[i] = max(td->version[i], md->version[i]);
963                         md->version[i] = td->version[i];
964                 }
965
966                 /* Write the bad block table to the device? */
967                 if ((writeops & 0x01) && (td->options & NAND_BBT_WRITE)) {
968                         res = write_bbt(mtd, buf, td, md, chipsel);
969                         if (res < 0)
970                                 return res;
971                 }
972
973                 /* Write the mirror bad block table to the device? */
974                 if ((writeops & 0x02) && md && (md->options & NAND_BBT_WRITE)) {
975                         res = write_bbt(mtd, buf, md, td, chipsel);
976                         if (res < 0)
977                                 return res;
978                 }
979         }
980         return 0;
981 }
982
983 /**
984  * mark_bbt_regions - [GENERIC] mark the bad block table regions
985  * @mtd: MTD device structure
986  * @td: bad block table descriptor
987  *
988  * The bad block table regions are marked as "bad" to prevent accidental
989  * erasures / writes. The regions are identified by the mark 0x02.
990  */
991 static void mark_bbt_region(struct mtd_info *mtd, struct nand_bbt_descr *td)
992 {
993         struct nand_chip *this = mtd->priv;
994         int i, j, chips, block, nrblocks, update;
995         uint8_t oldval;
996
997         /* Do we have a bbt per chip? */
998         if (td->options & NAND_BBT_PERCHIP) {
999                 chips = this->numchips;
1000                 nrblocks = (int)(this->chipsize >> this->bbt_erase_shift);
1001         } else {
1002                 chips = 1;
1003                 nrblocks = (int)(mtd->size >> this->bbt_erase_shift);
1004         }
1005
1006         for (i = 0; i < chips; i++) {
1007                 if ((td->options & NAND_BBT_ABSPAGE) ||
1008                     !(td->options & NAND_BBT_WRITE)) {
1009                         if (td->pages[i] == -1)
1010                                 continue;
1011                         block = td->pages[i] >> (this->bbt_erase_shift - this->page_shift);
1012                         oldval = bbt_get_entry(this, block);
1013                         bbt_mark_entry(this, block, BBT_BLOCK_RESERVED);
1014                         if ((oldval != BBT_BLOCK_RESERVED) &&
1015                                         td->reserved_block_code)
1016                                 nand_update_bbt(mtd, (loff_t)block <<
1017                                                 this->bbt_erase_shift);
1018                         continue;
1019                 }
1020                 update = 0;
1021                 if (td->options & NAND_BBT_LASTBLOCK)
1022                         block = ((i + 1) * nrblocks) - td->maxblocks;
1023                 else
1024                         block = i * nrblocks;
1025                 for (j = 0; j < td->maxblocks; j++) {
1026                         oldval = bbt_get_entry(this, block);
1027                         bbt_mark_entry(this, block, BBT_BLOCK_RESERVED);
1028                         if (oldval != BBT_BLOCK_RESERVED)
1029                                 update = 1;
1030                         block++;
1031                 }
1032                 /*
1033                  * If we want reserved blocks to be recorded to flash, and some
1034                  * new ones have been marked, then we need to update the stored
1035                  * bbts.  This should only happen once.
1036                  */
1037                 if (update && td->reserved_block_code)
1038                         nand_update_bbt(mtd, (loff_t)(block - 1) <<
1039                                         this->bbt_erase_shift);
1040         }
1041 }
1042
1043 /**
1044  * verify_bbt_descr - verify the bad block description
1045  * @mtd: MTD device structure
1046  * @bd: the table to verify
1047  *
1048  * This functions performs a few sanity checks on the bad block description
1049  * table.
1050  */
1051 static void verify_bbt_descr(struct mtd_info *mtd, struct nand_bbt_descr *bd)
1052 {
1053         struct nand_chip *this = mtd->priv;
1054         u32 pattern_len;
1055         u32 bits;
1056         u32 table_size;
1057
1058         if (!bd)
1059                 return;
1060
1061         pattern_len = bd->len;
1062         bits = bd->options & NAND_BBT_NRBITS_MSK;
1063
1064         BUG_ON((this->bbt_options & NAND_BBT_NO_OOB) &&
1065                         !(this->bbt_options & NAND_BBT_USE_FLASH));
1066         BUG_ON(!bits);
1067
1068         if (bd->options & NAND_BBT_VERSION)
1069                 pattern_len++;
1070
1071         if (bd->options & NAND_BBT_NO_OOB) {
1072                 BUG_ON(!(this->bbt_options & NAND_BBT_USE_FLASH));
1073                 BUG_ON(!(this->bbt_options & NAND_BBT_NO_OOB));
1074                 BUG_ON(bd->offs);
1075                 if (bd->options & NAND_BBT_VERSION)
1076                         BUG_ON(bd->veroffs != bd->len);
1077                 BUG_ON(bd->options & NAND_BBT_SAVECONTENT);
1078         }
1079
1080         if (bd->options & NAND_BBT_PERCHIP)
1081                 table_size = this->chipsize >> this->bbt_erase_shift;
1082         else
1083                 table_size = mtd->size >> this->bbt_erase_shift;
1084         table_size >>= 3;
1085         table_size *= bits;
1086         if (bd->options & NAND_BBT_NO_OOB)
1087                 table_size += pattern_len;
1088         BUG_ON(table_size > (1 << this->bbt_erase_shift));
1089 }
1090
1091 /**
1092  * nand_scan_bbt - [NAND Interface] scan, find, read and maybe create bad block table(s)
1093  * @mtd: MTD device structure
1094  * @bd: descriptor for the good/bad block search pattern
1095  *
1096  * The function checks, if a bad block table(s) is/are already available. If
1097  * not it scans the device for manufacturer marked good / bad blocks and writes
1098  * the bad block table(s) to the selected place.
1099  *
1100  * The bad block table memory is allocated here. It must be freed by calling
1101  * the nand_free_bbt function.
1102  */
1103 int nand_scan_bbt(struct mtd_info *mtd, struct nand_bbt_descr *bd)
1104 {
1105         struct nand_chip *this = mtd->priv;
1106         int len, res = 0;
1107         uint8_t *buf;
1108         struct nand_bbt_descr *td = this->bbt_td;
1109         struct nand_bbt_descr *md = this->bbt_md;
1110
1111         len = mtd->size >> (this->bbt_erase_shift + 2);
1112         /*
1113          * Allocate memory (2bit per block) and clear the memory bad block
1114          * table.
1115          */
1116         this->bbt = kzalloc(len, GFP_KERNEL);
1117         if (!this->bbt)
1118                 return -ENOMEM;
1119
1120         /*
1121          * If no primary table decriptor is given, scan the device to build a
1122          * memory based bad block table.
1123          */
1124         if (!td) {
1125                 if ((res = nand_memory_bbt(mtd, bd))) {
1126                         pr_err("nand_bbt: can't scan flash and build the RAM-based BBT\n");
1127                         kfree(this->bbt);
1128                         this->bbt = NULL;
1129                 }
1130                 return res;
1131         }
1132         verify_bbt_descr(mtd, td);
1133         verify_bbt_descr(mtd, md);
1134
1135         /* Allocate a temporary buffer for one eraseblock incl. oob */
1136         len = (1 << this->bbt_erase_shift);
1137         len += (len >> this->page_shift) * mtd->oobsize;
1138         buf = vmalloc(len);
1139         if (!buf) {
1140                 kfree(this->bbt);
1141                 this->bbt = NULL;
1142                 return -ENOMEM;
1143         }
1144
1145         /* Is the bbt at a given page? */
1146         if (td->options & NAND_BBT_ABSPAGE) {
1147                 read_abs_bbts(mtd, buf, td, md);
1148         } else {
1149                 /* Search the bad block table using a pattern in oob */
1150                 search_read_bbts(mtd, buf, td, md);
1151         }
1152
1153         res = check_create(mtd, buf, bd);
1154
1155         /* Prevent the bbt regions from erasing / writing */
1156         mark_bbt_region(mtd, td);
1157         if (md)
1158                 mark_bbt_region(mtd, md);
1159
1160         vfree(buf);
1161         return res;
1162 }
1163
1164 /**
1165  * nand_update_bbt - update bad block table(s)
1166  * @mtd: MTD device structure
1167  * @offs: the offset of the newly marked block
1168  *
1169  * The function updates the bad block table(s).
1170  */
1171 static int nand_update_bbt(struct mtd_info *mtd, loff_t offs)
1172 {
1173         struct nand_chip *this = mtd->priv;
1174         int len, res = 0;
1175         int chip, chipsel;
1176         uint8_t *buf;
1177         struct nand_bbt_descr *td = this->bbt_td;
1178         struct nand_bbt_descr *md = this->bbt_md;
1179
1180         if (!this->bbt || !td)
1181                 return -EINVAL;
1182
1183         /* Allocate a temporary buffer for one eraseblock incl. oob */
1184         len = (1 << this->bbt_erase_shift);
1185         len += (len >> this->page_shift) * mtd->oobsize;
1186         buf = kmalloc(len, GFP_KERNEL);
1187         if (!buf)
1188                 return -ENOMEM;
1189
1190         /* Do we have a bbt per chip? */
1191         if (td->options & NAND_BBT_PERCHIP) {
1192                 chip = (int)(offs >> this->chip_shift);
1193                 chipsel = chip;
1194         } else {
1195                 chip = 0;
1196                 chipsel = -1;
1197         }
1198
1199         td->version[chip]++;
1200         if (md)
1201                 md->version[chip]++;
1202
1203         /* Write the bad block table to the device? */
1204         if (td->options & NAND_BBT_WRITE) {
1205                 res = write_bbt(mtd, buf, td, md, chipsel);
1206                 if (res < 0)
1207                         goto out;
1208         }
1209         /* Write the mirror bad block table to the device? */
1210         if (md && (md->options & NAND_BBT_WRITE)) {
1211                 res = write_bbt(mtd, buf, md, td, chipsel);
1212         }
1213
1214  out:
1215         kfree(buf);
1216         return res;
1217 }
1218
1219 /*
1220  * Define some generic bad / good block scan pattern which are used
1221  * while scanning a device for factory marked good / bad blocks.
1222  */
1223 static uint8_t scan_ff_pattern[] = { 0xff, 0xff };
1224
1225 /* Generic flash bbt descriptors */
1226 static uint8_t bbt_pattern[] = {'B', 'b', 't', '0' };
1227 static uint8_t mirror_pattern[] = {'1', 't', 'b', 'B' };
1228
1229 static struct nand_bbt_descr bbt_main_descr = {
1230         .options = NAND_BBT_LASTBLOCK | NAND_BBT_CREATE | NAND_BBT_WRITE
1231                 | NAND_BBT_2BIT | NAND_BBT_VERSION | NAND_BBT_PERCHIP,
1232         .offs = 8,
1233         .len = 4,
1234         .veroffs = 12,
1235         .maxblocks = NAND_BBT_SCAN_MAXBLOCKS,
1236         .pattern = bbt_pattern
1237 };
1238
1239 static struct nand_bbt_descr bbt_mirror_descr = {
1240         .options = NAND_BBT_LASTBLOCK | NAND_BBT_CREATE | NAND_BBT_WRITE
1241                 | NAND_BBT_2BIT | NAND_BBT_VERSION | NAND_BBT_PERCHIP,
1242         .offs = 8,
1243         .len = 4,
1244         .veroffs = 12,
1245         .maxblocks = NAND_BBT_SCAN_MAXBLOCKS,
1246         .pattern = mirror_pattern
1247 };
1248
1249 static struct nand_bbt_descr bbt_main_no_oob_descr = {
1250         .options = NAND_BBT_LASTBLOCK | NAND_BBT_CREATE | NAND_BBT_WRITE
1251                 | NAND_BBT_2BIT | NAND_BBT_VERSION | NAND_BBT_PERCHIP
1252                 | NAND_BBT_NO_OOB,
1253         .len = 4,
1254         .veroffs = 4,
1255         .maxblocks = NAND_BBT_SCAN_MAXBLOCKS,
1256         .pattern = bbt_pattern
1257 };
1258
1259 static struct nand_bbt_descr bbt_mirror_no_oob_descr = {
1260         .options = NAND_BBT_LASTBLOCK | NAND_BBT_CREATE | NAND_BBT_WRITE
1261                 | NAND_BBT_2BIT | NAND_BBT_VERSION | NAND_BBT_PERCHIP
1262                 | NAND_BBT_NO_OOB,
1263         .len = 4,
1264         .veroffs = 4,
1265         .maxblocks = NAND_BBT_SCAN_MAXBLOCKS,
1266         .pattern = mirror_pattern
1267 };
1268
1269 #define BADBLOCK_SCAN_MASK (~NAND_BBT_NO_OOB)
1270 /**
1271  * nand_create_badblock_pattern - [INTERN] Creates a BBT descriptor structure
1272  * @this: NAND chip to create descriptor for
1273  *
1274  * This function allocates and initializes a nand_bbt_descr for BBM detection
1275  * based on the properties of @this. The new descriptor is stored in
1276  * this->badblock_pattern. Thus, this->badblock_pattern should be NULL when
1277  * passed to this function.
1278  */
1279 static int nand_create_badblock_pattern(struct nand_chip *this)
1280 {
1281         struct nand_bbt_descr *bd;
1282         if (this->badblock_pattern) {
1283                 pr_warn("Bad block pattern already allocated; not replacing\n");
1284                 return -EINVAL;
1285         }
1286         bd = kzalloc(sizeof(*bd), GFP_KERNEL);
1287         if (!bd)
1288                 return -ENOMEM;
1289         bd->options = this->bbt_options & BADBLOCK_SCAN_MASK;
1290         bd->offs = this->badblockpos;
1291         bd->len = (this->options & NAND_BUSWIDTH_16) ? 2 : 1;
1292         bd->pattern = scan_ff_pattern;
1293         bd->options |= NAND_BBT_DYNAMICSTRUCT;
1294         this->badblock_pattern = bd;
1295         return 0;
1296 }
1297
1298 /**
1299  * nand_default_bbt - [NAND Interface] Select a default bad block table for the device
1300  * @mtd: MTD device structure
1301  *
1302  * This function selects the default bad block table support for the device and
1303  * calls the nand_scan_bbt function.
1304  */
1305 int nand_default_bbt(struct mtd_info *mtd)
1306 {
1307         struct nand_chip *this = mtd->priv;
1308
1309         /* Is a flash based bad block table requested? */
1310         if (this->bbt_options & NAND_BBT_USE_FLASH) {
1311                 /* Use the default pattern descriptors */
1312                 if (!this->bbt_td) {
1313                         if (this->bbt_options & NAND_BBT_NO_OOB) {
1314                                 this->bbt_td = &bbt_main_no_oob_descr;
1315                                 this->bbt_md = &bbt_mirror_no_oob_descr;
1316                         } else {
1317                                 this->bbt_td = &bbt_main_descr;
1318                                 this->bbt_md = &bbt_mirror_descr;
1319                         }
1320                 }
1321         } else {
1322                 this->bbt_td = NULL;
1323                 this->bbt_md = NULL;
1324         }
1325
1326         if (!this->badblock_pattern)
1327                 nand_create_badblock_pattern(this);
1328
1329         return nand_scan_bbt(mtd, this->badblock_pattern);
1330 }
1331
1332 /**
1333  * nand_isbad_bbt - [NAND Interface] Check if a block is bad
1334  * @mtd: MTD device structure
1335  * @offs: offset in the device
1336  * @allowbbt: allow access to bad block table region
1337  */
1338 int nand_isbad_bbt(struct mtd_info *mtd, loff_t offs, int allowbbt)
1339 {
1340         struct nand_chip *this = mtd->priv;
1341         int block, res;
1342
1343         block = (int)(offs >> this->bbt_erase_shift);
1344         res = bbt_get_entry(this, block);
1345
1346         pr_debug("nand_isbad_bbt(): bbt info for offs 0x%08x: "
1347                         "(block %d) 0x%02x\n",
1348                         (unsigned int)offs, block, res);
1349
1350         switch (res) {
1351         case BBT_BLOCK_GOOD:
1352                 return 0;
1353         case BBT_BLOCK_WORN:
1354                 return 1;
1355         case BBT_BLOCK_RESERVED:
1356                 return allowbbt ? 0 : 1;
1357         }
1358         return 1;
1359 }
1360
1361 /**
1362  * nand_markbad_bbt - [NAND Interface] Mark a block bad in the BBT
1363  * @mtd: MTD device structure
1364  * @offs: offset of the bad block
1365  */
1366 int nand_markbad_bbt(struct mtd_info *mtd, loff_t offs)
1367 {
1368         struct nand_chip *this = mtd->priv;
1369         int block, ret = 0;
1370
1371         block = (int)(offs >> this->bbt_erase_shift);
1372
1373         /* Mark bad block in memory */
1374         bbt_mark_entry(this, block, BBT_BLOCK_WORN);
1375
1376         /* Update flash-based bad block table */
1377         if (this->bbt_options & NAND_BBT_USE_FLASH)
1378                 ret = nand_update_bbt(mtd, offs);
1379
1380         return ret;
1381 }
1382
1383 EXPORT_SYMBOL(nand_scan_bbt);