Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

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