Linux Audio

Check our new training course

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