nand_base.c 97.3 KB
Newer Older
L
Linus Torvalds 已提交
1 2 3 4 5 6 7
/*
 *  drivers/mtd/nand.c
 *
 *  Overview:
 *   This is the generic MTD driver for NAND flash devices. It should be
 *   capable of working with almost all NAND chips currently available.
 *   Basic support for AG-AND chips is provided.
8
 *
L
Linus Torvalds 已提交
9
 *	Additional technical information is available on
10
 *	http://www.linux-mtd.infradead.org/doc/nand.html
11
 *
L
Linus Torvalds 已提交
12
 *  Copyright (C) 2000 Steven J. Hill (sjhill@realitydiluted.com)
13
 *		  2002-2006 Thomas Gleixner (tglx@linutronix.de)
L
Linus Torvalds 已提交
14
 *
15
 *  Credits:
16 17
 *	David Woodhouse for adding multichip support
 *
L
Linus Torvalds 已提交
18 19 20
 *	Aleph One Ltd. and Toby Churchill Ltd. for supporting the
 *	rework for 2K page size chips
 *
21
 *  TODO:
L
Linus Torvalds 已提交
22 23
 *	Enable cached programming for 2k page size chips
 *	Check, if mtd->ecctype should be set to MTD_ECC_HW
24
 *	if we have HW ECC support.
L
Linus Torvalds 已提交
25 26
 *	The AG-AND chips have nice features for speed improvement,
 *	which are not supported yet. Read / program 4 pages in one go.
27
 *	BBT table is not serialized, has to be fixed
L
Linus Torvalds 已提交
28 29 30 31 32 33 34
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 as
 * published by the Free Software Foundation.
 *
 */

35
#include <linux/module.h>
L
Linus Torvalds 已提交
36 37
#include <linux/delay.h>
#include <linux/errno.h>
T
Thomas Gleixner 已提交
38
#include <linux/err.h>
L
Linus Torvalds 已提交
39 40 41 42 43 44
#include <linux/sched.h>
#include <linux/slab.h>
#include <linux/types.h>
#include <linux/mtd/mtd.h>
#include <linux/mtd/nand.h>
#include <linux/mtd/nand_ecc.h>
45
#include <linux/mtd/nand_bch.h>
L
Linus Torvalds 已提交
46 47
#include <linux/interrupt.h>
#include <linux/bitops.h>
48
#include <linux/leds.h>
49
#include <linux/io.h>
L
Linus Torvalds 已提交
50 51 52
#include <linux/mtd/partitions.h>

/* Define default oob placement schemes for large and small page devices */
53
static struct nand_ecclayout nand_oob_8 = {
L
Linus Torvalds 已提交
54 55
	.eccbytes = 3,
	.eccpos = {0, 1, 2},
56 57 58 59
	.oobfree = {
		{.offset = 3,
		 .length = 2},
		{.offset = 6,
60
		 .length = 2} }
L
Linus Torvalds 已提交
61 62
};

63
static struct nand_ecclayout nand_oob_16 = {
L
Linus Torvalds 已提交
64 65
	.eccbytes = 6,
	.eccpos = {0, 1, 2, 3, 6, 7},
66 67
	.oobfree = {
		{.offset = 8,
68
		 . length = 8} }
L
Linus Torvalds 已提交
69 70
};

71
static struct nand_ecclayout nand_oob_64 = {
L
Linus Torvalds 已提交
72 73
	.eccbytes = 24,
	.eccpos = {
74 75 76
		   40, 41, 42, 43, 44, 45, 46, 47,
		   48, 49, 50, 51, 52, 53, 54, 55,
		   56, 57, 58, 59, 60, 61, 62, 63},
77 78
	.oobfree = {
		{.offset = 2,
79
		 .length = 38} }
L
Linus Torvalds 已提交
80 81
};

82 83 84 85 86 87 88 89 90 91 92
static struct nand_ecclayout nand_oob_128 = {
	.eccbytes = 48,
	.eccpos = {
		   80, 81, 82, 83, 84, 85, 86, 87,
		   88, 89, 90, 91, 92, 93, 94, 95,
		   96, 97, 98, 99, 100, 101, 102, 103,
		   104, 105, 106, 107, 108, 109, 110, 111,
		   112, 113, 114, 115, 116, 117, 118, 119,
		   120, 121, 122, 123, 124, 125, 126, 127},
	.oobfree = {
		{.offset = 2,
93
		 .length = 78} }
94 95
};

96
static int nand_get_device(struct nand_chip *chip, struct mtd_info *mtd,
97
			   int new_state);
L
Linus Torvalds 已提交
98

99 100 101
static int nand_do_write_oob(struct mtd_info *mtd, loff_t to,
			     struct mtd_oob_ops *ops);

T
Thomas Gleixner 已提交
102
/*
J
Joe Perches 已提交
103
 * For devices which display every fart in the system on a separate LED. Is
T
Thomas Gleixner 已提交
104 105 106 107
 * compiled away when LED support is disabled.
 */
DEFINE_LED_TRIGGER(nand_led_trigger);

108 109 110 111 112 113 114 115
static int check_offs_len(struct mtd_info *mtd,
					loff_t ofs, uint64_t len)
{
	struct nand_chip *chip = mtd->priv;
	int ret = 0;

	/* Start address must align on block boundary */
	if (ofs & ((1 << chip->phys_erase_shift) - 1)) {
116
		pr_debug("%s: unaligned address\n", __func__);
117 118 119 120 121
		ret = -EINVAL;
	}

	/* Length must align on block boundary */
	if (len & ((1 << chip->phys_erase_shift) - 1)) {
122
		pr_debug("%s: length not block aligned\n", __func__);
123 124 125 126 127 128
		ret = -EINVAL;
	}

	return ret;
}

L
Linus Torvalds 已提交
129 130
/**
 * nand_release_device - [GENERIC] release chip
131
 * @mtd: MTD device structure
132
 *
133
 * Release chip lock and wake up anyone waiting on the device.
L
Linus Torvalds 已提交
134
 */
135
static void nand_release_device(struct mtd_info *mtd)
L
Linus Torvalds 已提交
136
{
137
	struct nand_chip *chip = mtd->priv;
L
Linus Torvalds 已提交
138

T
Thomas Gleixner 已提交
139
	/* Release the controller and the chip */
140 141 142 143 144
	spin_lock(&chip->controller->lock);
	chip->controller->active = NULL;
	chip->state = FL_READY;
	wake_up(&chip->controller->wq);
	spin_unlock(&chip->controller->lock);
L
Linus Torvalds 已提交
145 146 147 148
}

/**
 * nand_read_byte - [DEFAULT] read one byte from the chip
149
 * @mtd: MTD device structure
L
Linus Torvalds 已提交
150
 *
151
 * Default read function for 8bit buswidth
L
Linus Torvalds 已提交
152
 */
153
static uint8_t nand_read_byte(struct mtd_info *mtd)
L
Linus Torvalds 已提交
154
{
155 156
	struct nand_chip *chip = mtd->priv;
	return readb(chip->IO_ADDR_R);
L
Linus Torvalds 已提交
157 158 159
}

/**
M
Masanari Iida 已提交
160
 * nand_read_byte16 - [DEFAULT] read one byte endianness aware from the chip
161
 * nand_read_byte16 - [DEFAULT] read one byte endianness aware from the chip
162
 * @mtd: MTD device structure
L
Linus Torvalds 已提交
163
 *
164 165
 * Default read function for 16bit buswidth with endianness conversion.
 *
L
Linus Torvalds 已提交
166
 */
167
static uint8_t nand_read_byte16(struct mtd_info *mtd)
L
Linus Torvalds 已提交
168
{
169 170
	struct nand_chip *chip = mtd->priv;
	return (uint8_t) cpu_to_le16(readw(chip->IO_ADDR_R));
L
Linus Torvalds 已提交
171 172 173 174
}

/**
 * nand_read_word - [DEFAULT] read one word from the chip
175
 * @mtd: MTD device structure
L
Linus Torvalds 已提交
176
 *
177
 * Default read function for 16bit buswidth without endianness conversion.
L
Linus Torvalds 已提交
178 179 180
 */
static u16 nand_read_word(struct mtd_info *mtd)
{
181 182
	struct nand_chip *chip = mtd->priv;
	return readw(chip->IO_ADDR_R);
L
Linus Torvalds 已提交
183 184 185 186
}

/**
 * nand_select_chip - [DEFAULT] control CE line
187 188
 * @mtd: MTD device structure
 * @chipnr: chipnumber to select, -1 for deselect
L
Linus Torvalds 已提交
189 190 191
 *
 * Default select function for 1 chip devices.
 */
192
static void nand_select_chip(struct mtd_info *mtd, int chipnr)
L
Linus Torvalds 已提交
193
{
194 195 196
	struct nand_chip *chip = mtd->priv;

	switch (chipnr) {
L
Linus Torvalds 已提交
197
	case -1:
198
		chip->cmd_ctrl(mtd, NAND_CMD_NONE, 0 | NAND_CTRL_CHANGE);
L
Linus Torvalds 已提交
199 200 201 202 203 204 205 206 207 208 209
		break;
	case 0:
		break;

	default:
		BUG();
	}
}

/**
 * nand_write_buf - [DEFAULT] write buffer to chip
210 211 212
 * @mtd: MTD device structure
 * @buf: data buffer
 * @len: number of bytes to write
L
Linus Torvalds 已提交
213
 *
214
 * Default write function for 8bit buswidth.
L
Linus Torvalds 已提交
215
 */
216
static void nand_write_buf(struct mtd_info *mtd, const uint8_t *buf, int len)
L
Linus Torvalds 已提交
217 218
{
	int i;
219
	struct nand_chip *chip = mtd->priv;
L
Linus Torvalds 已提交
220

221
	for (i = 0; i < len; i++)
222
		writeb(buf[i], chip->IO_ADDR_W);
L
Linus Torvalds 已提交
223 224 225
}

/**
226
 * nand_read_buf - [DEFAULT] read chip data into buffer
227 228 229
 * @mtd: MTD device structure
 * @buf: buffer to store date
 * @len: number of bytes to read
L
Linus Torvalds 已提交
230
 *
231
 * Default read function for 8bit buswidth.
L
Linus Torvalds 已提交
232
 */
233
static void nand_read_buf(struct mtd_info *mtd, uint8_t *buf, int len)
L
Linus Torvalds 已提交
234 235
{
	int i;
236
	struct nand_chip *chip = mtd->priv;
L
Linus Torvalds 已提交
237

238
	for (i = 0; i < len; i++)
239
		buf[i] = readb(chip->IO_ADDR_R);
L
Linus Torvalds 已提交
240 241 242 243
}

/**
 * nand_write_buf16 - [DEFAULT] write buffer to chip
244 245 246
 * @mtd: MTD device structure
 * @buf: data buffer
 * @len: number of bytes to write
L
Linus Torvalds 已提交
247
 *
248
 * Default write function for 16bit buswidth.
L
Linus Torvalds 已提交
249
 */
250
static void nand_write_buf16(struct mtd_info *mtd, const uint8_t *buf, int len)
L
Linus Torvalds 已提交
251 252
{
	int i;
253
	struct nand_chip *chip = mtd->priv;
L
Linus Torvalds 已提交
254 255
	u16 *p = (u16 *) buf;
	len >>= 1;
256

257
	for (i = 0; i < len; i++)
258
		writew(p[i], chip->IO_ADDR_W);
259

L
Linus Torvalds 已提交
260 261 262
}

/**
263
 * nand_read_buf16 - [DEFAULT] read chip data into buffer
264 265 266
 * @mtd: MTD device structure
 * @buf: buffer to store date
 * @len: number of bytes to read
L
Linus Torvalds 已提交
267
 *
268
 * Default read function for 16bit buswidth.
L
Linus Torvalds 已提交
269
 */
270
static void nand_read_buf16(struct mtd_info *mtd, uint8_t *buf, int len)
L
Linus Torvalds 已提交
271 272
{
	int i;
273
	struct nand_chip *chip = mtd->priv;
L
Linus Torvalds 已提交
274 275 276
	u16 *p = (u16 *) buf;
	len >>= 1;

277
	for (i = 0; i < len; i++)
278
		p[i] = readw(chip->IO_ADDR_R);
L
Linus Torvalds 已提交
279 280 281 282
}

/**
 * nand_block_bad - [DEFAULT] Read bad block marker from the chip
283 284 285
 * @mtd: MTD device structure
 * @ofs: offset from device start
 * @getchip: 0, if the chip is already selected
L
Linus Torvalds 已提交
286
 *
287
 * Check, if the block is bad.
L
Linus Torvalds 已提交
288 289 290
 */
static int nand_block_bad(struct mtd_info *mtd, loff_t ofs, int getchip)
{
291
	int page, chipnr, res = 0, i = 0;
292
	struct nand_chip *chip = mtd->priv;
L
Linus Torvalds 已提交
293 294
	u16 bad;

295
	if (chip->bbt_options & NAND_BBT_SCANLASTPAGE)
296 297
		ofs += mtd->erasesize - mtd->writesize;

298 299
	page = (int)(ofs >> chip->page_shift) & chip->pagemask;

L
Linus Torvalds 已提交
300
	if (getchip) {
301
		chipnr = (int)(ofs >> chip->chip_shift);
L
Linus Torvalds 已提交
302

303
		nand_get_device(chip, mtd, FL_READING);
L
Linus Torvalds 已提交
304 305

		/* Select the NAND device */
306
		chip->select_chip(mtd, chipnr);
307
	}
L
Linus Torvalds 已提交
308

309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325
	do {
		if (chip->options & NAND_BUSWIDTH_16) {
			chip->cmdfunc(mtd, NAND_CMD_READOOB,
					chip->badblockpos & 0xFE, page);
			bad = cpu_to_le16(chip->read_word(mtd));
			if (chip->badblockpos & 0x1)
				bad >>= 8;
			else
				bad &= 0xFF;
		} else {
			chip->cmdfunc(mtd, NAND_CMD_READOOB, chip->badblockpos,
					page);
			bad = chip->read_byte(mtd);
		}

		if (likely(chip->badblockbits == 8))
			res = bad != 0xFF;
326
		else
327 328 329 330 331
			res = hweight8(bad) < chip->badblockbits;
		ofs += mtd->writesize;
		page = (int)(ofs >> chip->page_shift) & chip->pagemask;
		i++;
	} while (!res && i < 2 && (chip->bbt_options & NAND_BBT_SCAN2NDPAGE));
332

333 334
	if (getchip) {
		chip->select_chip(mtd, -1);
L
Linus Torvalds 已提交
335
		nand_release_device(mtd);
336
	}
337

L
Linus Torvalds 已提交
338 339 340 341 342
	return res;
}

/**
 * nand_default_block_markbad - [DEFAULT] mark a block bad
343 344
 * @mtd: MTD device structure
 * @ofs: offset from device start
L
Linus Torvalds 已提交
345
 *
346
 * This is the default implementation, which can be overridden by a hardware
347 348 349 350 351 352 353 354
 * specific driver. We try operations in the following order, according to our
 * bbt_options (NAND_BBT_NO_OOB_BBM and NAND_BBT_USE_FLASH):
 *  (1) erase the affected block, to allow OOB marker to be written cleanly
 *  (2) update in-memory BBT
 *  (3) write bad block marker to OOB area of affected block
 *  (4) update flash-based BBT
 * Note that we retain the first error encountered in (3) or (4), finish the
 * procedures, and dump the error in the end.
L
Linus Torvalds 已提交
355 356 357
*/
static int nand_default_block_markbad(struct mtd_info *mtd, loff_t ofs)
{
358
	struct nand_chip *chip = mtd->priv;
359
	uint8_t buf[2] = { 0, 0 };
360 361
	int block, res, ret = 0, i = 0;
	int write_oob = !(chip->bbt_options & NAND_BBT_NO_OOB_BBM);
362

363
	if (write_oob) {
364 365 366 367 368 369 370 371 372 373
		struct erase_info einfo;

		/* Attempt erase before marking OOB */
		memset(&einfo, 0, sizeof(einfo));
		einfo.mtd = mtd;
		einfo.addr = ofs;
		einfo.len = 1 << chip->phys_erase_shift;
		nand_erase_nand(mtd, &einfo, 0);
	}

L
Linus Torvalds 已提交
374
	/* Get block number */
375
	block = (int)(ofs >> chip->bbt_erase_shift);
376
	/* Mark block bad in memory-based BBT */
377 378
	if (chip->bbt)
		chip->bbt[block >> 2] |= 0x01 << ((block & 0x03) << 1);
L
Linus Torvalds 已提交
379

380 381
	/* Write bad block marker to OOB */
	if (write_oob) {
382
		struct mtd_oob_ops ops;
383
		loff_t wr_ofs = ofs;
384

385
		nand_get_device(chip, mtd, FL_WRITING);
386

387 388
		ops.datbuf = NULL;
		ops.oobbuf = buf;
389 390 391 392 393 394 395
		ops.ooboffs = chip->badblockpos;
		if (chip->options & NAND_BUSWIDTH_16) {
			ops.ooboffs &= ~0x01;
			ops.len = ops.ooblen = 2;
		} else {
			ops.len = ops.ooblen = 1;
		}
B
Brian Norris 已提交
396
		ops.mode = MTD_OPS_PLACE_OOB;
397

398
		/* Write to first/last page(s) if necessary */
399 400
		if (chip->bbt_options & NAND_BBT_SCANLASTPAGE)
			wr_ofs += mtd->erasesize - mtd->writesize;
401
		do {
402 403 404
			res = nand_do_write_oob(mtd, wr_ofs, &ops);
			if (!ret)
				ret = res;
405 406

			i++;
407
			wr_ofs += mtd->writesize;
408
		} while ((chip->bbt_options & NAND_BBT_SCAN2NDPAGE) && i < 2);
409

410
		nand_release_device(mtd);
411
	}
412 413 414 415 416 417 418 419

	/* Update flash-based bad block table */
	if (chip->bbt_options & NAND_BBT_USE_FLASH) {
		res = nand_update_bbt(mtd, ofs);
		if (!ret)
			ret = res;
	}

420 421
	if (!ret)
		mtd->ecc_stats.badblocks++;
422

423
	return ret;
L
Linus Torvalds 已提交
424 425
}

426
/**
L
Linus Torvalds 已提交
427
 * nand_check_wp - [GENERIC] check if the chip is write protected
428
 * @mtd: MTD device structure
L
Linus Torvalds 已提交
429
 *
430 431
 * Check, if the device is write protected. The function expects, that the
 * device is already selected.
L
Linus Torvalds 已提交
432
 */
433
static int nand_check_wp(struct mtd_info *mtd)
L
Linus Torvalds 已提交
434
{
435
	struct nand_chip *chip = mtd->priv;
436

437
	/* Broken xD cards report WP despite being writable */
438 439 440
	if (chip->options & NAND_BROKEN_XD)
		return 0;

L
Linus Torvalds 已提交
441
	/* Check the WP bit */
442 443
	chip->cmdfunc(mtd, NAND_CMD_STATUS, -1, -1);
	return (chip->read_byte(mtd) & NAND_STATUS_WP) ? 0 : 1;
L
Linus Torvalds 已提交
444 445 446 447
}

/**
 * nand_block_checkbad - [GENERIC] Check if a block is marked bad
448 449 450 451
 * @mtd: MTD device structure
 * @ofs: offset from device start
 * @getchip: 0, if the chip is already selected
 * @allowbbt: 1, if its allowed to access the bbt area
L
Linus Torvalds 已提交
452 453 454 455
 *
 * Check, if the block is bad. Either by reading the bad block table or
 * calling of the scan function.
 */
456 457
static int nand_block_checkbad(struct mtd_info *mtd, loff_t ofs, int getchip,
			       int allowbbt)
L
Linus Torvalds 已提交
458
{
459
	struct nand_chip *chip = mtd->priv;
460

461 462
	if (!chip->bbt)
		return chip->block_bad(mtd, ofs, getchip);
463

L
Linus Torvalds 已提交
464
	/* Return info from the table */
465
	return nand_isbad_bbt(mtd, ofs, allowbbt);
L
Linus Torvalds 已提交
466 467
}

468 469
/**
 * panic_nand_wait_ready - [GENERIC] Wait for the ready pin after commands.
470 471
 * @mtd: MTD device structure
 * @timeo: Timeout
472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489
 *
 * Helper function for nand_wait_ready used when needing to wait in interrupt
 * context.
 */
static void panic_nand_wait_ready(struct mtd_info *mtd, unsigned long timeo)
{
	struct nand_chip *chip = mtd->priv;
	int i;

	/* Wait for the device to get ready */
	for (i = 0; i < timeo; i++) {
		if (chip->dev_ready(mtd))
			break;
		touch_softlockup_watchdog();
		mdelay(1);
	}
}

490
/* Wait for the ready pin, after a command. The timeout is caught later. */
491
void nand_wait_ready(struct mtd_info *mtd)
492
{
493
	struct nand_chip *chip = mtd->priv;
494
	unsigned long timeo = jiffies + 2;
495

496 497 498 499
	/* 400ms timeout */
	if (in_interrupt() || oops_in_progress)
		return panic_nand_wait_ready(mtd, 400);

500
	led_trigger_event(nand_led_trigger, LED_FULL);
501
	/* Wait until command is processed or timeout occurs */
502
	do {
503
		if (chip->dev_ready(mtd))
504
			break;
I
Ingo Molnar 已提交
505
		touch_softlockup_watchdog();
506
	} while (time_before(jiffies, timeo));
507
	led_trigger_event(nand_led_trigger, LED_OFF);
508
}
509
EXPORT_SYMBOL_GPL(nand_wait_ready);
510

L
Linus Torvalds 已提交
511 512
/**
 * nand_command - [DEFAULT] Send command to NAND device
513 514 515 516
 * @mtd: MTD device structure
 * @command: the command to be sent
 * @column: the column address for this command, -1 if none
 * @page_addr: the page address for this command, -1 if none
L
Linus Torvalds 已提交
517
 *
518 519
 * Send command to NAND device. This function is used for small page devices
 * (256/512 Bytes per page).
L
Linus Torvalds 已提交
520
 */
521 522
static void nand_command(struct mtd_info *mtd, unsigned int command,
			 int column, int page_addr)
L
Linus Torvalds 已提交
523
{
524
	register struct nand_chip *chip = mtd->priv;
525
	int ctrl = NAND_CTRL_CLE | NAND_CTRL_CHANGE;
L
Linus Torvalds 已提交
526

527
	/* Write out the command to the device */
L
Linus Torvalds 已提交
528 529 530
	if (command == NAND_CMD_SEQIN) {
		int readcmd;

J
Joern Engel 已提交
531
		if (column >= mtd->writesize) {
L
Linus Torvalds 已提交
532
			/* OOB area */
J
Joern Engel 已提交
533
			column -= mtd->writesize;
L
Linus Torvalds 已提交
534 535 536 537 538 539 540 541
			readcmd = NAND_CMD_READOOB;
		} else if (column < 256) {
			/* First 256 bytes --> READ0 */
			readcmd = NAND_CMD_READ0;
		} else {
			column -= 256;
			readcmd = NAND_CMD_READ1;
		}
542
		chip->cmd_ctrl(mtd, readcmd, ctrl);
543
		ctrl &= ~NAND_CTRL_CHANGE;
L
Linus Torvalds 已提交
544
	}
545
	chip->cmd_ctrl(mtd, command, ctrl);
L
Linus Torvalds 已提交
546

547
	/* Address cycle, when necessary */
548 549 550 551
	ctrl = NAND_CTRL_ALE | NAND_CTRL_CHANGE;
	/* Serially input address */
	if (column != -1) {
		/* Adjust columns for 16 bit buswidth */
552
		if (chip->options & NAND_BUSWIDTH_16)
553
			column >>= 1;
554
		chip->cmd_ctrl(mtd, column, ctrl);
555 556 557
		ctrl &= ~NAND_CTRL_CHANGE;
	}
	if (page_addr != -1) {
558
		chip->cmd_ctrl(mtd, page_addr, ctrl);
559
		ctrl &= ~NAND_CTRL_CHANGE;
560
		chip->cmd_ctrl(mtd, page_addr >> 8, ctrl);
561
		/* One more address cycle for devices > 32MiB */
562 563
		if (chip->chipsize > (32 << 20))
			chip->cmd_ctrl(mtd, page_addr >> 16, ctrl);
L
Linus Torvalds 已提交
564
	}
565
	chip->cmd_ctrl(mtd, NAND_CMD_NONE, NAND_NCE | NAND_CTRL_CHANGE);
566 567

	/*
568 569
	 * Program and erase have their own busy handlers status and sequential
	 * in needs no delay
570
	 */
L
Linus Torvalds 已提交
571
	switch (command) {
572

L
Linus Torvalds 已提交
573 574 575 576 577 578 579 580
	case NAND_CMD_PAGEPROG:
	case NAND_CMD_ERASE1:
	case NAND_CMD_ERASE2:
	case NAND_CMD_SEQIN:
	case NAND_CMD_STATUS:
		return;

	case NAND_CMD_RESET:
581
		if (chip->dev_ready)
L
Linus Torvalds 已提交
582
			break;
583 584
		udelay(chip->chip_delay);
		chip->cmd_ctrl(mtd, NAND_CMD_STATUS,
585
			       NAND_CTRL_CLE | NAND_CTRL_CHANGE);
586 587
		chip->cmd_ctrl(mtd,
			       NAND_CMD_NONE, NAND_NCE | NAND_CTRL_CHANGE);
588 589
		while (!(chip->read_byte(mtd) & NAND_STATUS_READY))
				;
L
Linus Torvalds 已提交
590 591
		return;

592
		/* This applies to read commands */
L
Linus Torvalds 已提交
593
	default:
594
		/*
L
Linus Torvalds 已提交
595 596
		 * If we don't have access to the busy pin, we apply the given
		 * command delay
597
		 */
598 599
		if (!chip->dev_ready) {
			udelay(chip->chip_delay);
L
Linus Torvalds 已提交
600
			return;
601
		}
L
Linus Torvalds 已提交
602
	}
603 604 605 606
	/*
	 * Apply this short delay always to ensure that we do wait tWB in
	 * any case on any machine.
	 */
607
	ndelay(100);
608 609

	nand_wait_ready(mtd);
L
Linus Torvalds 已提交
610 611 612 613
}

/**
 * nand_command_lp - [DEFAULT] Send command to NAND large page device
614 615 616 617
 * @mtd: MTD device structure
 * @command: the command to be sent
 * @column: the column address for this command, -1 if none
 * @page_addr: the page address for this command, -1 if none
L
Linus Torvalds 已提交
618
 *
619
 * Send command to NAND device. This is the version for the new large page
620 621
 * devices. We don't have the separate regions as we have in the small page
 * devices. We must emulate NAND_CMD_READOOB to keep the code compatible.
L
Linus Torvalds 已提交
622
 */
623 624
static void nand_command_lp(struct mtd_info *mtd, unsigned int command,
			    int column, int page_addr)
L
Linus Torvalds 已提交
625
{
626
	register struct nand_chip *chip = mtd->priv;
L
Linus Torvalds 已提交
627 628 629

	/* Emulate NAND_CMD_READOOB */
	if (command == NAND_CMD_READOOB) {
J
Joern Engel 已提交
630
		column += mtd->writesize;
L
Linus Torvalds 已提交
631 632
		command = NAND_CMD_READ0;
	}
633

634
	/* Command latch cycle */
635
	chip->cmd_ctrl(mtd, command & 0xff,
636
		       NAND_NCE | NAND_CLE | NAND_CTRL_CHANGE);
L
Linus Torvalds 已提交
637 638

	if (column != -1 || page_addr != -1) {
639
		int ctrl = NAND_CTRL_CHANGE | NAND_NCE | NAND_ALE;
L
Linus Torvalds 已提交
640 641 642 643

		/* Serially input address */
		if (column != -1) {
			/* Adjust columns for 16 bit buswidth */
644
			if (chip->options & NAND_BUSWIDTH_16)
L
Linus Torvalds 已提交
645
				column >>= 1;
646
			chip->cmd_ctrl(mtd, column, ctrl);
647
			ctrl &= ~NAND_CTRL_CHANGE;
648
			chip->cmd_ctrl(mtd, column >> 8, ctrl);
649
		}
L
Linus Torvalds 已提交
650
		if (page_addr != -1) {
651 652
			chip->cmd_ctrl(mtd, page_addr, ctrl);
			chip->cmd_ctrl(mtd, page_addr >> 8,
653
				       NAND_NCE | NAND_ALE);
L
Linus Torvalds 已提交
654
			/* One more address cycle for devices > 128MiB */
655 656
			if (chip->chipsize > (128 << 20))
				chip->cmd_ctrl(mtd, page_addr >> 16,
657
					       NAND_NCE | NAND_ALE);
L
Linus Torvalds 已提交
658 659
		}
	}
660
	chip->cmd_ctrl(mtd, NAND_CMD_NONE, NAND_NCE | NAND_CTRL_CHANGE);
661 662

	/*
663 664
	 * Program and erase have their own busy handlers status, sequential
	 * in, and deplete1 need no delay.
665
	 */
L
Linus Torvalds 已提交
666
	switch (command) {
667

L
Linus Torvalds 已提交
668 669 670 671 672
	case NAND_CMD_CACHEDPROG:
	case NAND_CMD_PAGEPROG:
	case NAND_CMD_ERASE1:
	case NAND_CMD_ERASE2:
	case NAND_CMD_SEQIN:
673
	case NAND_CMD_RNDIN:
L
Linus Torvalds 已提交
674
	case NAND_CMD_STATUS:
675
	case NAND_CMD_DEPLETE1:
L
Linus Torvalds 已提交
676 677
		return;

678 679 680 681 682
	case NAND_CMD_STATUS_ERROR:
	case NAND_CMD_STATUS_ERROR0:
	case NAND_CMD_STATUS_ERROR1:
	case NAND_CMD_STATUS_ERROR2:
	case NAND_CMD_STATUS_ERROR3:
683
		/* Read error status commands require only a short delay */
684
		udelay(chip->chip_delay);
685
		return;
L
Linus Torvalds 已提交
686 687

	case NAND_CMD_RESET:
688
		if (chip->dev_ready)
L
Linus Torvalds 已提交
689
			break;
690
		udelay(chip->chip_delay);
691 692 693 694
		chip->cmd_ctrl(mtd, NAND_CMD_STATUS,
			       NAND_NCE | NAND_CLE | NAND_CTRL_CHANGE);
		chip->cmd_ctrl(mtd, NAND_CMD_NONE,
			       NAND_NCE | NAND_CTRL_CHANGE);
695 696
		while (!(chip->read_byte(mtd) & NAND_STATUS_READY))
				;
L
Linus Torvalds 已提交
697 698
		return;

699 700 701 702 703 704 705 706
	case NAND_CMD_RNDOUT:
		/* No ready / busy check necessary */
		chip->cmd_ctrl(mtd, NAND_CMD_RNDOUTSTART,
			       NAND_NCE | NAND_CLE | NAND_CTRL_CHANGE);
		chip->cmd_ctrl(mtd, NAND_CMD_NONE,
			       NAND_NCE | NAND_CTRL_CHANGE);
		return;

L
Linus Torvalds 已提交
707
	case NAND_CMD_READ0:
708 709 710 711
		chip->cmd_ctrl(mtd, NAND_CMD_READSTART,
			       NAND_NCE | NAND_CLE | NAND_CTRL_CHANGE);
		chip->cmd_ctrl(mtd, NAND_CMD_NONE,
			       NAND_NCE | NAND_CTRL_CHANGE);
712

713
		/* This applies to read commands */
L
Linus Torvalds 已提交
714
	default:
715
		/*
L
Linus Torvalds 已提交
716
		 * If we don't have access to the busy pin, we apply the given
717
		 * command delay.
718
		 */
719 720
		if (!chip->dev_ready) {
			udelay(chip->chip_delay);
L
Linus Torvalds 已提交
721
			return;
722
		}
L
Linus Torvalds 已提交
723
	}
724

725 726 727 728
	/*
	 * Apply this short delay always to ensure that we do wait tWB in
	 * any case on any machine.
	 */
729
	ndelay(100);
730 731

	nand_wait_ready(mtd);
L
Linus Torvalds 已提交
732 733
}

734 735
/**
 * panic_nand_get_device - [GENERIC] Get chip for selected access
736 737 738
 * @chip: the nand chip descriptor
 * @mtd: MTD device structure
 * @new_state: the state which is requested
739 740 741 742 743 744
 *
 * Used when in panic, no locks are taken.
 */
static void panic_nand_get_device(struct nand_chip *chip,
		      struct mtd_info *mtd, int new_state)
{
745
	/* Hardware controller shared among independent devices */
746 747 748 749
	chip->controller->active = chip;
	chip->state = new_state;
}

L
Linus Torvalds 已提交
750 751
/**
 * nand_get_device - [GENERIC] Get chip for selected access
752 753 754
 * @chip: the nand chip descriptor
 * @mtd: MTD device structure
 * @new_state: the state which is requested
L
Linus Torvalds 已提交
755 756 757
 *
 * Get the device and lock it for exclusive access
 */
758
static int
759
nand_get_device(struct nand_chip *chip, struct mtd_info *mtd, int new_state)
L
Linus Torvalds 已提交
760
{
761 762
	spinlock_t *lock = &chip->controller->lock;
	wait_queue_head_t *wq = &chip->controller->wq;
763
	DECLARE_WAITQUEUE(wait, current);
764
retry:
765 766
	spin_lock(lock);

767
	/* Hardware controller shared among independent devices */
768 769
	if (!chip->controller->active)
		chip->controller->active = chip;
T
Thomas Gleixner 已提交
770

771 772
	if (chip->controller->active == chip && chip->state == FL_READY) {
		chip->state = new_state;
773
		spin_unlock(lock);
774 775 776
		return 0;
	}
	if (new_state == FL_PM_SUSPENDED) {
777 778 779 780 781
		if (chip->controller->active->state == FL_PM_SUSPENDED) {
			chip->state = FL_PM_SUSPENDED;
			spin_unlock(lock);
			return 0;
		}
782 783 784 785 786 787
	}
	set_current_state(TASK_UNINTERRUPTIBLE);
	add_wait_queue(wq, &wait);
	spin_unlock(lock);
	schedule();
	remove_wait_queue(wq, &wait);
L
Linus Torvalds 已提交
788 789 790
	goto retry;
}

791
/**
792 793 794 795
 * panic_nand_wait - [GENERIC] wait until the command is done
 * @mtd: MTD device structure
 * @chip: NAND chip structure
 * @timeo: timeout
796 797 798
 *
 * Wait for command done. This is a helper function for nand_wait used when
 * we are in interrupt context. May happen when in panic and trying to write
799
 * an oops through mtdoops.
800 801 802 803 804 805 806 807 808 809 810 811 812 813
 */
static void panic_nand_wait(struct mtd_info *mtd, struct nand_chip *chip,
			    unsigned long timeo)
{
	int i;
	for (i = 0; i < timeo; i++) {
		if (chip->dev_ready) {
			if (chip->dev_ready(mtd))
				break;
		} else {
			if (chip->read_byte(mtd) & NAND_STATUS_READY)
				break;
		}
		mdelay(1);
814
	}
815 816
}

L
Linus Torvalds 已提交
817
/**
818 819 820
 * nand_wait - [DEFAULT] wait until the command is done
 * @mtd: MTD device structure
 * @chip: NAND chip structure
L
Linus Torvalds 已提交
821
 *
822 823 824
 * Wait for command done. This applies to erase and program only. Erase can
 * take up to 400ms and program up to 20ms according to general NAND and
 * SmartMedia specs.
R
Randy Dunlap 已提交
825
 */
826
static int nand_wait(struct mtd_info *mtd, struct nand_chip *chip)
L
Linus Torvalds 已提交
827 828
{

829
	unsigned long timeo = jiffies;
830
	int status, state = chip->state;
831

L
Linus Torvalds 已提交
832
	if (state == FL_ERASING)
833
		timeo += (HZ * 400) / 1000;
L
Linus Torvalds 已提交
834
	else
835
		timeo += (HZ * 20) / 1000;
L
Linus Torvalds 已提交
836

837 838
	led_trigger_event(nand_led_trigger, LED_FULL);

839 840 841 842
	/*
	 * Apply this short delay always to ensure that we do wait tWB in any
	 * case on any machine.
	 */
843
	ndelay(100);
L
Linus Torvalds 已提交
844

845 846
	if ((state == FL_ERASING) && (chip->options & NAND_IS_AND))
		chip->cmdfunc(mtd, NAND_CMD_STATUS_MULTI, -1, -1);
847
	else
848
		chip->cmdfunc(mtd, NAND_CMD_STATUS, -1, -1);
L
Linus Torvalds 已提交
849

850 851 852 853 854 855 856 857 858 859 860 861
	if (in_interrupt() || oops_in_progress)
		panic_nand_wait(mtd, chip, timeo);
	else {
		while (time_before(jiffies, timeo)) {
			if (chip->dev_ready) {
				if (chip->dev_ready(mtd))
					break;
			} else {
				if (chip->read_byte(mtd) & NAND_STATUS_READY)
					break;
			}
			cond_resched();
L
Linus Torvalds 已提交
862 863
		}
	}
864 865
	led_trigger_event(nand_led_trigger, LED_OFF);

866
	status = (int)chip->read_byte(mtd);
867 868
	/* This can happen if in case of timeout or buggy dev_ready */
	WARN_ON(!(status & NAND_STATUS_READY));
L
Linus Torvalds 已提交
869 870 871
	return status;
}

872
/**
873 874 875 876
 * __nand_unlock - [REPLACEABLE] unlocks specified locked blocks
 * @mtd: mtd info
 * @ofs: offset to start unlock from
 * @len: length to unlock
877 878 879 880
 * @invert: when = 0, unlock the range of blocks within the lower and
 *                    upper boundary address
 *          when = 1, unlock the range of blocks outside the boundaries
 *                    of the lower and upper boundary address
881
 *
882
 * Returs unlock status.
883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902
 */
static int __nand_unlock(struct mtd_info *mtd, loff_t ofs,
					uint64_t len, int invert)
{
	int ret = 0;
	int status, page;
	struct nand_chip *chip = mtd->priv;

	/* Submit address of first page to unlock */
	page = ofs >> chip->page_shift;
	chip->cmdfunc(mtd, NAND_CMD_UNLOCK1, -1, page & chip->pagemask);

	/* Submit address of last page to unlock */
	page = (ofs + len) >> chip->page_shift;
	chip->cmdfunc(mtd, NAND_CMD_UNLOCK2, -1,
				(page | invert) & chip->pagemask);

	/* Call wait ready function */
	status = chip->waitfunc(mtd, chip);
	/* See if device thinks it succeeded */
903
	if (status & NAND_STATUS_FAIL) {
904
		pr_debug("%s: error status = 0x%08x\n",
905 906 907 908 909 910 911 912
					__func__, status);
		ret = -EIO;
	}

	return ret;
}

/**
913 914 915 916
 * nand_unlock - [REPLACEABLE] unlocks specified locked blocks
 * @mtd: mtd info
 * @ofs: offset to start unlock from
 * @len: length to unlock
917
 *
918
 * Returns unlock status.
919 920 921 922 923 924 925
 */
int nand_unlock(struct mtd_info *mtd, loff_t ofs, uint64_t len)
{
	int ret = 0;
	int chipnr;
	struct nand_chip *chip = mtd->priv;

926
	pr_debug("%s: start = 0x%012llx, len = %llu\n",
927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944
			__func__, (unsigned long long)ofs, len);

	if (check_offs_len(mtd, ofs, len))
		ret = -EINVAL;

	/* Align to last block address if size addresses end of the device */
	if (ofs + len == mtd->size)
		len -= mtd->erasesize;

	nand_get_device(chip, mtd, FL_UNLOCKING);

	/* Shift to get chip number */
	chipnr = ofs >> chip->chip_shift;

	chip->select_chip(mtd, chipnr);

	/* Check, if it is write protected */
	if (nand_check_wp(mtd)) {
945
		pr_debug("%s: device is write protected!\n",
946 947 948 949 950 951 952 953
					__func__);
		ret = -EIO;
		goto out;
	}

	ret = __nand_unlock(mtd, ofs, len, 0);

out:
954
	chip->select_chip(mtd, -1);
955 956 957 958
	nand_release_device(mtd);

	return ret;
}
959
EXPORT_SYMBOL(nand_unlock);
960 961

/**
962 963 964 965
 * nand_lock - [REPLACEABLE] locks all blocks present in the device
 * @mtd: mtd info
 * @ofs: offset to start unlock from
 * @len: length to unlock
966
 *
967 968 969 970
 * This feature is not supported in many NAND parts. 'Micron' NAND parts do
 * have this feature, but it allows only to lock all blocks, not for specified
 * range for block. Implementing 'lock' feature by making use of 'unlock', for
 * now.
971
 *
972
 * Returns lock status.
973 974 975 976 977 978 979
 */
int nand_lock(struct mtd_info *mtd, loff_t ofs, uint64_t len)
{
	int ret = 0;
	int chipnr, status, page;
	struct nand_chip *chip = mtd->priv;

980
	pr_debug("%s: start = 0x%012llx, len = %llu\n",
981 982 983 984 985 986 987 988 989 990 991 992 993 994
			__func__, (unsigned long long)ofs, len);

	if (check_offs_len(mtd, ofs, len))
		ret = -EINVAL;

	nand_get_device(chip, mtd, FL_LOCKING);

	/* Shift to get chip number */
	chipnr = ofs >> chip->chip_shift;

	chip->select_chip(mtd, chipnr);

	/* Check, if it is write protected */
	if (nand_check_wp(mtd)) {
995
		pr_debug("%s: device is write protected!\n",
996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008
					__func__);
		status = MTD_ERASE_FAILED;
		ret = -EIO;
		goto out;
	}

	/* Submit address of first page to lock */
	page = ofs >> chip->page_shift;
	chip->cmdfunc(mtd, NAND_CMD_LOCK, -1, page & chip->pagemask);

	/* Call wait ready function */
	status = chip->waitfunc(mtd, chip);
	/* See if device thinks it succeeded */
1009
	if (status & NAND_STATUS_FAIL) {
1010
		pr_debug("%s: error status = 0x%08x\n",
1011 1012 1013 1014 1015 1016 1017 1018
					__func__, status);
		ret = -EIO;
		goto out;
	}

	ret = __nand_unlock(mtd, ofs, len, 0x1);

out:
1019
	chip->select_chip(mtd, -1);
1020 1021 1022 1023
	nand_release_device(mtd);

	return ret;
}
1024
EXPORT_SYMBOL(nand_lock);
1025

1026
/**
1027
 * nand_read_page_raw - [INTERN] read raw page data without ecc
1028 1029 1030
 * @mtd: mtd info structure
 * @chip: nand chip info structure
 * @buf: buffer to store read data
1031
 * @oob_required: caller requires OOB data read to chip->oob_poi
1032
 * @page: page number to read
1033
 *
1034
 * Not for syndrome calculating ECC controllers, which use a special oob layout.
1035 1036
 */
static int nand_read_page_raw(struct mtd_info *mtd, struct nand_chip *chip,
1037
			      uint8_t *buf, int oob_required, int page)
1038 1039
{
	chip->read_buf(mtd, buf, mtd->writesize);
1040 1041
	if (oob_required)
		chip->read_buf(mtd, chip->oob_poi, mtd->oobsize);
1042 1043 1044
	return 0;
}

1045
/**
1046
 * nand_read_page_raw_syndrome - [INTERN] read raw page data without ecc
1047 1048 1049
 * @mtd: mtd info structure
 * @chip: nand chip info structure
 * @buf: buffer to store read data
1050
 * @oob_required: caller requires OOB data read to chip->oob_poi
1051
 * @page: page number to read
1052 1053 1054
 *
 * We need a special oob layout and handling even when OOB isn't used.
 */
1055
static int nand_read_page_raw_syndrome(struct mtd_info *mtd,
1056 1057
				       struct nand_chip *chip, uint8_t *buf,
				       int oob_required, int page)
1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088
{
	int eccsize = chip->ecc.size;
	int eccbytes = chip->ecc.bytes;
	uint8_t *oob = chip->oob_poi;
	int steps, size;

	for (steps = chip->ecc.steps; steps > 0; steps--) {
		chip->read_buf(mtd, buf, eccsize);
		buf += eccsize;

		if (chip->ecc.prepad) {
			chip->read_buf(mtd, oob, chip->ecc.prepad);
			oob += chip->ecc.prepad;
		}

		chip->read_buf(mtd, oob, eccbytes);
		oob += eccbytes;

		if (chip->ecc.postpad) {
			chip->read_buf(mtd, oob, chip->ecc.postpad);
			oob += chip->ecc.postpad;
		}
	}

	size = mtd->oobsize - (oob - chip->oob_poi);
	if (size)
		chip->read_buf(mtd, oob, size);

	return 0;
}

L
Linus Torvalds 已提交
1089
/**
1090
 * nand_read_page_swecc - [REPLACEABLE] software ECC based page read function
1091 1092 1093
 * @mtd: mtd info structure
 * @chip: nand chip info structure
 * @buf: buffer to store read data
1094
 * @oob_required: caller requires OOB data read to chip->oob_poi
1095
 * @page: page number to read
1096
 */
1097
static int nand_read_page_swecc(struct mtd_info *mtd, struct nand_chip *chip,
1098
				uint8_t *buf, int oob_required, int page)
L
Linus Torvalds 已提交
1099
{
1100 1101 1102 1103
	int i, eccsize = chip->ecc.size;
	int eccbytes = chip->ecc.bytes;
	int eccsteps = chip->ecc.steps;
	uint8_t *p = buf;
1104 1105
	uint8_t *ecc_calc = chip->buffers->ecccalc;
	uint8_t *ecc_code = chip->buffers->ecccode;
1106
	uint32_t *eccpos = chip->ecc.layout->eccpos;
1107
	unsigned int max_bitflips = 0;
1108

1109
	chip->ecc.read_page_raw(mtd, chip, buf, 1, page);
1110 1111 1112 1113 1114

	for (i = 0; eccsteps; eccsteps--, i += eccbytes, p += eccsize)
		chip->ecc.calculate(mtd, p, &ecc_calc[i]);

	for (i = 0; i < chip->ecc.total; i++)
1115
		ecc_code[i] = chip->oob_poi[eccpos[i]];
1116 1117 1118 1119 1120 1121 1122 1123

	eccsteps = chip->ecc.steps;
	p = buf;

	for (i = 0 ; eccsteps; eccsteps--, i += eccbytes, p += eccsize) {
		int stat;

		stat = chip->ecc.correct(mtd, p, &ecc_code[i], &ecc_calc[i]);
1124
		if (stat < 0) {
1125
			mtd->ecc_stats.failed++;
1126
		} else {
1127
			mtd->ecc_stats.corrected += stat;
1128 1129
			max_bitflips = max_t(unsigned int, max_bitflips, stat);
		}
1130
	}
1131
	return max_bitflips;
1132
}
L
Linus Torvalds 已提交
1133

1134
/**
1135
 * nand_read_subpage - [REPLACEABLE] software ECC based sub-page read function
1136 1137 1138 1139 1140
 * @mtd: mtd info structure
 * @chip: nand chip info structure
 * @data_offs: offset of requested data within the page
 * @readlen: data length
 * @bufpoi: buffer to store read data
1141
 */
1142 1143
static int nand_read_subpage(struct mtd_info *mtd, struct nand_chip *chip,
			uint32_t data_offs, uint32_t readlen, uint8_t *bufpoi)
1144 1145 1146 1147 1148 1149 1150
{
	int start_step, end_step, num_steps;
	uint32_t *eccpos = chip->ecc.layout->eccpos;
	uint8_t *p;
	int data_col_addr, i, gaps = 0;
	int datafrag_len, eccfrag_len, aligned_len, aligned_pos;
	int busw = (chip->options & NAND_BUSWIDTH_16) ? 2 : 1;
1151
	int index = 0;
1152
	unsigned int max_bitflips = 0;
1153

1154
	/* Column address within the page aligned to ECC size (256bytes) */
1155 1156 1157 1158
	start_step = data_offs / chip->ecc.size;
	end_step = (data_offs + readlen - 1) / chip->ecc.size;
	num_steps = end_step - start_step + 1;

1159
	/* Data size aligned to ECC ecc.size */
1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170
	datafrag_len = num_steps * chip->ecc.size;
	eccfrag_len = num_steps * chip->ecc.bytes;

	data_col_addr = start_step * chip->ecc.size;
	/* If we read not a page aligned data */
	if (data_col_addr != 0)
		chip->cmdfunc(mtd, NAND_CMD_RNDOUT, data_col_addr, -1);

	p = bufpoi + data_col_addr;
	chip->read_buf(mtd, p, datafrag_len);

1171
	/* Calculate ECC */
1172 1173 1174
	for (i = 0; i < eccfrag_len ; i += chip->ecc.bytes, p += chip->ecc.size)
		chip->ecc.calculate(mtd, p, &chip->buffers->ecccalc[i]);

1175 1176
	/*
	 * The performance is faster if we position offsets according to
1177
	 * ecc.pos. Let's make sure that there are no gaps in ECC positions.
1178
	 */
1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189
	for (i = 0; i < eccfrag_len - 1; i++) {
		if (eccpos[i + start_step * chip->ecc.bytes] + 1 !=
			eccpos[i + start_step * chip->ecc.bytes + 1]) {
			gaps = 1;
			break;
		}
	}
	if (gaps) {
		chip->cmdfunc(mtd, NAND_CMD_RNDOUT, mtd->writesize, -1);
		chip->read_buf(mtd, chip->oob_poi, mtd->oobsize);
	} else {
1190
		/*
1191
		 * Send the command to read the particular ECC bytes take care
1192 1193
		 * about buswidth alignment in read_buf.
		 */
1194 1195 1196
		index = start_step * chip->ecc.bytes;

		aligned_pos = eccpos[index] & ~(busw - 1);
1197
		aligned_len = eccfrag_len;
1198
		if (eccpos[index] & (busw - 1))
1199
			aligned_len++;
1200
		if (eccpos[index + (num_steps * chip->ecc.bytes)] & (busw - 1))
1201 1202
			aligned_len++;

1203 1204
		chip->cmdfunc(mtd, NAND_CMD_RNDOUT,
					mtd->writesize + aligned_pos, -1);
1205 1206 1207 1208
		chip->read_buf(mtd, &chip->oob_poi[aligned_pos], aligned_len);
	}

	for (i = 0; i < eccfrag_len; i++)
1209
		chip->buffers->ecccode[i] = chip->oob_poi[eccpos[i + index]];
1210 1211 1212 1213 1214

	p = bufpoi + data_col_addr;
	for (i = 0; i < eccfrag_len ; i += chip->ecc.bytes, p += chip->ecc.size) {
		int stat;

1215 1216
		stat = chip->ecc.correct(mtd, p,
			&chip->buffers->ecccode[i], &chip->buffers->ecccalc[i]);
1217
		if (stat < 0) {
1218
			mtd->ecc_stats.failed++;
1219
		} else {
1220
			mtd->ecc_stats.corrected += stat;
1221 1222
			max_bitflips = max_t(unsigned int, max_bitflips, stat);
		}
1223
	}
1224
	return max_bitflips;
1225 1226
}

1227
/**
1228
 * nand_read_page_hwecc - [REPLACEABLE] hardware ECC based page read function
1229 1230 1231
 * @mtd: mtd info structure
 * @chip: nand chip info structure
 * @buf: buffer to store read data
1232
 * @oob_required: caller requires OOB data read to chip->oob_poi
1233
 * @page: page number to read
1234
 *
1235
 * Not for syndrome calculating ECC controllers which need a special oob layout.
1236
 */
1237
static int nand_read_page_hwecc(struct mtd_info *mtd, struct nand_chip *chip,
1238
				uint8_t *buf, int oob_required, int page)
L
Linus Torvalds 已提交
1239
{
1240 1241 1242 1243
	int i, eccsize = chip->ecc.size;
	int eccbytes = chip->ecc.bytes;
	int eccsteps = chip->ecc.steps;
	uint8_t *p = buf;
1244 1245
	uint8_t *ecc_calc = chip->buffers->ecccalc;
	uint8_t *ecc_code = chip->buffers->ecccode;
1246
	uint32_t *eccpos = chip->ecc.layout->eccpos;
1247
	unsigned int max_bitflips = 0;
1248 1249 1250 1251 1252

	for (i = 0; eccsteps; eccsteps--, i += eccbytes, p += eccsize) {
		chip->ecc.hwctl(mtd, NAND_ECC_READ);
		chip->read_buf(mtd, p, eccsize);
		chip->ecc.calculate(mtd, p, &ecc_calc[i]);
L
Linus Torvalds 已提交
1253
	}
1254
	chip->read_buf(mtd, chip->oob_poi, mtd->oobsize);
L
Linus Torvalds 已提交
1255

1256
	for (i = 0; i < chip->ecc.total; i++)
1257
		ecc_code[i] = chip->oob_poi[eccpos[i]];
L
Linus Torvalds 已提交
1258

1259 1260
	eccsteps = chip->ecc.steps;
	p = buf;
1261

1262 1263
	for (i = 0 ; eccsteps; eccsteps--, i += eccbytes, p += eccsize) {
		int stat;
L
Linus Torvalds 已提交
1264

1265
		stat = chip->ecc.correct(mtd, p, &ecc_code[i], &ecc_calc[i]);
1266
		if (stat < 0) {
1267
			mtd->ecc_stats.failed++;
1268
		} else {
1269
			mtd->ecc_stats.corrected += stat;
1270 1271
			max_bitflips = max_t(unsigned int, max_bitflips, stat);
		}
1272
	}
1273
	return max_bitflips;
1274
}
L
Linus Torvalds 已提交
1275

1276
/**
1277
 * nand_read_page_hwecc_oob_first - [REPLACEABLE] hw ecc, read oob first
1278 1279 1280
 * @mtd: mtd info structure
 * @chip: nand chip info structure
 * @buf: buffer to store read data
1281
 * @oob_required: caller requires OOB data read to chip->oob_poi
1282
 * @page: page number to read
1283
 *
1284 1285 1286 1287 1288
 * Hardware ECC for large page chips, require OOB to be read first. For this
 * ECC mode, the write_page method is re-used from ECC_HW. These methods
 * read/write ECC from the OOB area, unlike the ECC_HW_SYNDROME support with
 * multiple ECC steps, follows the "infix ECC" scheme and reads/writes ECC from
 * the data area, by overwriting the NAND manufacturer bad block markings.
1289 1290
 */
static int nand_read_page_hwecc_oob_first(struct mtd_info *mtd,
1291
	struct nand_chip *chip, uint8_t *buf, int oob_required, int page)
1292 1293 1294 1295 1296 1297 1298 1299
{
	int i, eccsize = chip->ecc.size;
	int eccbytes = chip->ecc.bytes;
	int eccsteps = chip->ecc.steps;
	uint8_t *p = buf;
	uint8_t *ecc_code = chip->buffers->ecccode;
	uint32_t *eccpos = chip->ecc.layout->eccpos;
	uint8_t *ecc_calc = chip->buffers->ecccalc;
1300
	unsigned int max_bitflips = 0;
1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317

	/* Read the OOB area first */
	chip->cmdfunc(mtd, NAND_CMD_READOOB, 0, page);
	chip->read_buf(mtd, chip->oob_poi, mtd->oobsize);
	chip->cmdfunc(mtd, NAND_CMD_READ0, 0, page);

	for (i = 0; i < chip->ecc.total; i++)
		ecc_code[i] = chip->oob_poi[eccpos[i]];

	for (i = 0; eccsteps; eccsteps--, i += eccbytes, p += eccsize) {
		int stat;

		chip->ecc.hwctl(mtd, NAND_ECC_READ);
		chip->read_buf(mtd, p, eccsize);
		chip->ecc.calculate(mtd, p, &ecc_calc[i]);

		stat = chip->ecc.correct(mtd, p, &ecc_code[i], NULL);
1318
		if (stat < 0) {
1319
			mtd->ecc_stats.failed++;
1320
		} else {
1321
			mtd->ecc_stats.corrected += stat;
1322 1323
			max_bitflips = max_t(unsigned int, max_bitflips, stat);
		}
1324
	}
1325
	return max_bitflips;
1326 1327
}

1328
/**
1329
 * nand_read_page_syndrome - [REPLACEABLE] hardware ECC syndrome based page read
1330 1331 1332
 * @mtd: mtd info structure
 * @chip: nand chip info structure
 * @buf: buffer to store read data
1333
 * @oob_required: caller requires OOB data read to chip->oob_poi
1334
 * @page: page number to read
1335
 *
1336 1337
 * The hw generator calculates the error syndrome automatically. Therefore we
 * need a special oob layout and handling.
1338 1339
 */
static int nand_read_page_syndrome(struct mtd_info *mtd, struct nand_chip *chip,
1340
				   uint8_t *buf, int oob_required, int page)
1341 1342 1343 1344 1345
{
	int i, eccsize = chip->ecc.size;
	int eccbytes = chip->ecc.bytes;
	int eccsteps = chip->ecc.steps;
	uint8_t *p = buf;
1346
	uint8_t *oob = chip->oob_poi;
1347
	unsigned int max_bitflips = 0;
L
Linus Torvalds 已提交
1348

1349 1350
	for (i = 0; eccsteps; eccsteps--, i += eccbytes, p += eccsize) {
		int stat;
1351

1352 1353
		chip->ecc.hwctl(mtd, NAND_ECC_READ);
		chip->read_buf(mtd, p, eccsize);
L
Linus Torvalds 已提交
1354

1355 1356 1357 1358
		if (chip->ecc.prepad) {
			chip->read_buf(mtd, oob, chip->ecc.prepad);
			oob += chip->ecc.prepad;
		}
L
Linus Torvalds 已提交
1359

1360 1361 1362
		chip->ecc.hwctl(mtd, NAND_ECC_READSYN);
		chip->read_buf(mtd, oob, eccbytes);
		stat = chip->ecc.correct(mtd, p, oob, NULL);
1363

1364
		if (stat < 0) {
1365
			mtd->ecc_stats.failed++;
1366
		} else {
1367
			mtd->ecc_stats.corrected += stat;
1368 1369
			max_bitflips = max_t(unsigned int, max_bitflips, stat);
		}
1370

1371
		oob += eccbytes;
L
Linus Torvalds 已提交
1372

1373 1374 1375
		if (chip->ecc.postpad) {
			chip->read_buf(mtd, oob, chip->ecc.postpad);
			oob += chip->ecc.postpad;
1376
		}
1377
	}
L
Linus Torvalds 已提交
1378

1379
	/* Calculate remaining oob bytes */
1380
	i = mtd->oobsize - (oob - chip->oob_poi);
1381 1382
	if (i)
		chip->read_buf(mtd, oob, i);
1383

1384
	return max_bitflips;
1385
}
L
Linus Torvalds 已提交
1386

1387
/**
1388
 * nand_transfer_oob - [INTERN] Transfer oob to client buffer
1389 1390 1391 1392
 * @chip: nand chip structure
 * @oob: oob destination address
 * @ops: oob ops structure
 * @len: size of oob to transfer
1393 1394
 */
static uint8_t *nand_transfer_oob(struct nand_chip *chip, uint8_t *oob,
1395
				  struct mtd_oob_ops *ops, size_t len)
1396
{
1397
	switch (ops->mode) {
1398

1399 1400
	case MTD_OPS_PLACE_OOB:
	case MTD_OPS_RAW:
1401 1402 1403
		memcpy(oob, chip->oob_poi + ops->ooboffs, len);
		return oob + len;

1404
	case MTD_OPS_AUTO_OOB: {
1405
		struct nand_oobfree *free = chip->ecc.layout->oobfree;
1406 1407
		uint32_t boffs = 0, roffs = ops->ooboffs;
		size_t bytes = 0;
1408

1409
		for (; free->length && len; free++, len -= bytes) {
1410
			/* Read request not from offset 0? */
1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424
			if (unlikely(roffs)) {
				if (roffs >= free->length) {
					roffs -= free->length;
					continue;
				}
				boffs = free->offset + roffs;
				bytes = min_t(size_t, len,
					      (free->length - roffs));
				roffs = 0;
			} else {
				bytes = min_t(size_t, len, free->length);
				boffs = free->offset;
			}
			memcpy(oob, chip->oob_poi + boffs, bytes);
1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435
			oob += bytes;
		}
		return oob;
	}
	default:
		BUG();
	}
	return NULL;
}

/**
1436
 * nand_do_read_ops - [INTERN] Read data with ECC
1437 1438 1439
 * @mtd: MTD device structure
 * @from: offset to read from
 * @ops: oob ops structure
1440 1441 1442
 *
 * Internal function. Called with chip held.
 */
1443 1444
static int nand_do_read_ops(struct mtd_info *mtd, loff_t from,
			    struct mtd_oob_ops *ops)
1445
{
1446
	int chipnr, page, realpage, col, bytes, aligned, oob_required;
1447 1448 1449
	struct nand_chip *chip = mtd->priv;
	struct mtd_ecc_stats stats;
	int ret = 0;
1450
	uint32_t readlen = ops->len;
1451
	uint32_t oobreadlen = ops->ooblen;
1452
	uint32_t max_oobsize = ops->mode == MTD_OPS_AUTO_OOB ?
1453 1454
		mtd->oobavail : mtd->oobsize;

1455
	uint8_t *bufpoi, *oob, *buf;
1456
	unsigned int max_bitflips = 0;
L
Linus Torvalds 已提交
1457

1458
	stats = mtd->ecc_stats;
L
Linus Torvalds 已提交
1459

1460 1461
	chipnr = (int)(from >> chip->chip_shift);
	chip->select_chip(mtd, chipnr);
1462

1463 1464
	realpage = (int)(from >> chip->page_shift);
	page = realpage & chip->pagemask;
L
Linus Torvalds 已提交
1465

1466
	col = (int)(from & (mtd->writesize - 1));
1467

1468 1469
	buf = ops->datbuf;
	oob = ops->oobbuf;
1470
	oob_required = oob ? 1 : 0;
1471

1472
	while (1) {
1473 1474
		bytes = min(mtd->writesize - col, readlen);
		aligned = (bytes == mtd->writesize);
1475

1476
		/* Is the current page in the buffer? */
1477
		if (realpage != chip->pagebuf || oob) {
1478
			bufpoi = aligned ? buf : chip->buffers->databuf;
1479

1480
			chip->cmdfunc(mtd, NAND_CMD_READ0, 0x00, page);
L
Linus Torvalds 已提交
1481

1482 1483 1484 1485
			/*
			 * Now read the page into the buffer.  Absent an error,
			 * the read methods return max bitflips per ecc step.
			 */
1486
			if (unlikely(ops->mode == MTD_OPS_RAW))
1487
				ret = chip->ecc.read_page_raw(mtd, chip, bufpoi,
1488 1489
							      oob_required,
							      page);
1490 1491
			else if (!aligned && NAND_HAS_SUBPAGE_READ(chip) &&
				 !oob)
1492 1493
				ret = chip->ecc.read_subpage(mtd, chip,
							col, bytes, bufpoi);
1494
			else
1495
				ret = chip->ecc.read_page(mtd, chip, bufpoi,
1496
							  oob_required, page);
1497 1498 1499 1500
			if (ret < 0) {
				if (!aligned)
					/* Invalidate page cache */
					chip->pagebuf = -1;
L
Linus Torvalds 已提交
1501
				break;
1502
			}
1503

1504 1505
			max_bitflips = max_t(unsigned int, max_bitflips, ret);

1506 1507
			/* Transfer not aligned data */
			if (!aligned) {
1508
				if (!NAND_HAS_SUBPAGE_READ(chip) && !oob &&
1509
				    !(mtd->ecc_stats.failed - stats.failed) &&
1510
				    (ops->mode != MTD_OPS_RAW)) {
1511
					chip->pagebuf = realpage;
1512 1513
					chip->pagebuf_bitflips = ret;
				} else {
1514 1515
					/* Invalidate page cache */
					chip->pagebuf = -1;
1516
				}
1517
				memcpy(buf, chip->buffers->databuf + col, bytes);
1518 1519
			}

1520 1521 1522
			buf += bytes;

			if (unlikely(oob)) {
1523 1524 1525 1526 1527 1528 1529
				int toread = min(oobreadlen, max_oobsize);

				if (toread) {
					oob = nand_transfer_oob(chip,
						oob, ops, toread);
					oobreadlen -= toread;
				}
1530 1531
			}
		} else {
1532
			memcpy(buf, chip->buffers->databuf + col, bytes);
1533
			buf += bytes;
1534 1535
			max_bitflips = max_t(unsigned int, max_bitflips,
					     chip->pagebuf_bitflips);
1536
		}
L
Linus Torvalds 已提交
1537

1538
		readlen -= bytes;
1539

1540
		if (!readlen)
1541
			break;
L
Linus Torvalds 已提交
1542

1543
		/* For subsequent reads align to page boundary */
L
Linus Torvalds 已提交
1544 1545 1546 1547
		col = 0;
		/* Increment page address */
		realpage++;

1548
		page = realpage & chip->pagemask;
L
Linus Torvalds 已提交
1549 1550 1551
		/* Check, if we cross a chip boundary */
		if (!page) {
			chipnr++;
1552 1553
			chip->select_chip(mtd, -1);
			chip->select_chip(mtd, chipnr);
L
Linus Torvalds 已提交
1554 1555
		}
	}
1556
	chip->select_chip(mtd, -1);
L
Linus Torvalds 已提交
1557

1558
	ops->retlen = ops->len - (size_t) readlen;
1559 1560
	if (oob)
		ops->oobretlen = ops->ooblen - oobreadlen;
L
Linus Torvalds 已提交
1561

1562
	if (ret < 0)
1563 1564
		return ret;

1565 1566 1567
	if (mtd->ecc_stats.failed - stats.failed)
		return -EBADMSG;

1568
	return max_bitflips;
1569 1570 1571
}

/**
L
Lucas De Marchi 已提交
1572
 * nand_read - [MTD Interface] MTD compatibility function for nand_do_read_ecc
1573 1574 1575 1576 1577
 * @mtd: MTD device structure
 * @from: offset to read from
 * @len: number of bytes to read
 * @retlen: pointer to variable to store the number of read bytes
 * @buf: the databuffer to put data
1578
 *
1579
 * Get hold of the chip and call nand_do_read.
1580 1581 1582 1583
 */
static int nand_read(struct mtd_info *mtd, loff_t from, size_t len,
		     size_t *retlen, uint8_t *buf)
{
1584
	struct nand_chip *chip = mtd->priv;
1585
	struct mtd_oob_ops ops;
1586 1587
	int ret;

1588
	nand_get_device(chip, mtd, FL_READING);
1589 1590 1591
	ops.len = len;
	ops.datbuf = buf;
	ops.oobbuf = NULL;
1592
	ops.mode = MTD_OPS_PLACE_OOB;
1593 1594
	ret = nand_do_read_ops(mtd, from, &ops);
	*retlen = ops.retlen;
1595 1596
	nand_release_device(mtd);
	return ret;
L
Linus Torvalds 已提交
1597 1598
}

1599
/**
1600
 * nand_read_oob_std - [REPLACEABLE] the most common OOB data read function
1601 1602 1603
 * @mtd: mtd info structure
 * @chip: nand chip info structure
 * @page: page number to read
1604 1605
 */
static int nand_read_oob_std(struct mtd_info *mtd, struct nand_chip *chip,
1606
			     int page)
1607
{
1608
	chip->cmdfunc(mtd, NAND_CMD_READOOB, 0, page);
1609
	chip->read_buf(mtd, chip->oob_poi, mtd->oobsize);
1610
	return 0;
1611 1612 1613
}

/**
1614
 * nand_read_oob_syndrome - [REPLACEABLE] OOB data read function for HW ECC
1615
 *			    with syndromes
1616 1617 1618
 * @mtd: mtd info structure
 * @chip: nand chip info structure
 * @page: page number to read
1619 1620
 */
static int nand_read_oob_syndrome(struct mtd_info *mtd, struct nand_chip *chip,
1621
				  int page)
1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647
{
	uint8_t *buf = chip->oob_poi;
	int length = mtd->oobsize;
	int chunk = chip->ecc.bytes + chip->ecc.prepad + chip->ecc.postpad;
	int eccsize = chip->ecc.size;
	uint8_t *bufpoi = buf;
	int i, toread, sndrnd = 0, pos;

	chip->cmdfunc(mtd, NAND_CMD_READ0, chip->ecc.size, page);
	for (i = 0; i < chip->ecc.steps; i++) {
		if (sndrnd) {
			pos = eccsize + i * (eccsize + chunk);
			if (mtd->writesize > 512)
				chip->cmdfunc(mtd, NAND_CMD_RNDOUT, pos, -1);
			else
				chip->cmdfunc(mtd, NAND_CMD_READ0, pos, page);
		} else
			sndrnd = 1;
		toread = min_t(int, length, chunk);
		chip->read_buf(mtd, bufpoi, toread);
		bufpoi += toread;
		length -= toread;
	}
	if (length > 0)
		chip->read_buf(mtd, bufpoi, length);

1648
	return 0;
1649 1650 1651
}

/**
1652
 * nand_write_oob_std - [REPLACEABLE] the most common OOB data write function
1653 1654 1655
 * @mtd: mtd info structure
 * @chip: nand chip info structure
 * @page: page number to write
1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670
 */
static int nand_write_oob_std(struct mtd_info *mtd, struct nand_chip *chip,
			      int page)
{
	int status = 0;
	const uint8_t *buf = chip->oob_poi;
	int length = mtd->oobsize;

	chip->cmdfunc(mtd, NAND_CMD_SEQIN, mtd->writesize, page);
	chip->write_buf(mtd, buf, length);
	/* Send command to program the OOB data */
	chip->cmdfunc(mtd, NAND_CMD_PAGEPROG, -1, -1);

	status = chip->waitfunc(mtd, chip);

S
Savin Zlobec 已提交
1671
	return status & NAND_STATUS_FAIL ? -EIO : 0;
1672 1673 1674
}

/**
1675
 * nand_write_oob_syndrome - [REPLACEABLE] OOB data write function for HW ECC
1676 1677 1678 1679
 *			     with syndrome - only for large page flash
 * @mtd: mtd info structure
 * @chip: nand chip info structure
 * @page: page number to write
1680 1681 1682 1683 1684 1685 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695 1696 1697
 */
static int nand_write_oob_syndrome(struct mtd_info *mtd,
				   struct nand_chip *chip, int page)
{
	int chunk = chip->ecc.bytes + chip->ecc.prepad + chip->ecc.postpad;
	int eccsize = chip->ecc.size, length = mtd->oobsize;
	int i, len, pos, status = 0, sndcmd = 0, steps = chip->ecc.steps;
	const uint8_t *bufpoi = chip->oob_poi;

	/*
	 * data-ecc-data-ecc ... ecc-oob
	 * or
	 * data-pad-ecc-pad-data-pad .... ecc-pad-oob
	 */
	if (!chip->ecc.prepad && !chip->ecc.postpad) {
		pos = steps * (eccsize + chunk);
		steps = 0;
	} else
1698
		pos = eccsize;
1699 1700 1701 1702 1703 1704 1705 1706 1707 1708 1709 1710 1711 1712 1713 1714 1715 1716 1717 1718 1719 1720 1721 1722 1723 1724 1725 1726 1727 1728 1729 1730 1731 1732

	chip->cmdfunc(mtd, NAND_CMD_SEQIN, pos, page);
	for (i = 0; i < steps; i++) {
		if (sndcmd) {
			if (mtd->writesize <= 512) {
				uint32_t fill = 0xFFFFFFFF;

				len = eccsize;
				while (len > 0) {
					int num = min_t(int, len, 4);
					chip->write_buf(mtd, (uint8_t *)&fill,
							num);
					len -= num;
				}
			} else {
				pos = eccsize + i * (eccsize + chunk);
				chip->cmdfunc(mtd, NAND_CMD_RNDIN, pos, -1);
			}
		} else
			sndcmd = 1;
		len = min_t(int, length, chunk);
		chip->write_buf(mtd, bufpoi, len);
		bufpoi += len;
		length -= len;
	}
	if (length > 0)
		chip->write_buf(mtd, bufpoi, length);

	chip->cmdfunc(mtd, NAND_CMD_PAGEPROG, -1, -1);
	status = chip->waitfunc(mtd, chip);

	return status & NAND_STATUS_FAIL ? -EIO : 0;
}

L
Linus Torvalds 已提交
1733
/**
1734
 * nand_do_read_oob - [INTERN] NAND read out-of-band
1735 1736 1737
 * @mtd: MTD device structure
 * @from: offset to read from
 * @ops: oob operations description structure
L
Linus Torvalds 已提交
1738
 *
1739
 * NAND read out-of-band data from the spare area.
L
Linus Torvalds 已提交
1740
 */
1741 1742
static int nand_do_read_oob(struct mtd_info *mtd, loff_t from,
			    struct mtd_oob_ops *ops)
L
Linus Torvalds 已提交
1743
{
1744
	int page, realpage, chipnr;
1745
	struct nand_chip *chip = mtd->priv;
1746
	struct mtd_ecc_stats stats;
1747 1748
	int readlen = ops->ooblen;
	int len;
1749
	uint8_t *buf = ops->oobbuf;
1750
	int ret = 0;
1751

1752
	pr_debug("%s: from = 0x%08Lx, len = %i\n",
1753
			__func__, (unsigned long long)from, readlen);
L
Linus Torvalds 已提交
1754

1755 1756
	stats = mtd->ecc_stats;

1757
	if (ops->mode == MTD_OPS_AUTO_OOB)
1758
		len = chip->ecc.layout->oobavail;
1759 1760 1761 1762
	else
		len = mtd->oobsize;

	if (unlikely(ops->ooboffs >= len)) {
1763 1764
		pr_debug("%s: attempt to start read outside oob\n",
				__func__);
1765 1766 1767 1768 1769 1770 1771
		return -EINVAL;
	}

	/* Do not allow reads past end of device */
	if (unlikely(from >= mtd->size ||
		     ops->ooboffs + readlen > ((mtd->size >> chip->page_shift) -
					(from >> chip->page_shift)) * len)) {
1772 1773
		pr_debug("%s: attempt to read beyond end of device\n",
				__func__);
1774 1775
		return -EINVAL;
	}
1776

1777
	chipnr = (int)(from >> chip->chip_shift);
1778
	chip->select_chip(mtd, chipnr);
L
Linus Torvalds 已提交
1779

1780 1781 1782
	/* Shift to get page */
	realpage = (int)(from >> chip->page_shift);
	page = realpage & chip->pagemask;
L
Linus Torvalds 已提交
1783

1784
	while (1) {
1785
		if (ops->mode == MTD_OPS_RAW)
1786
			ret = chip->ecc.read_oob_raw(mtd, chip, page);
1787
		else
1788 1789 1790 1791
			ret = chip->ecc.read_oob(mtd, chip, page);

		if (ret < 0)
			break;
1792 1793 1794

		len = min(len, readlen);
		buf = nand_transfer_oob(chip, buf, ops, len);
1795

1796
		readlen -= len;
S
Savin Zlobec 已提交
1797 1798 1799
		if (!readlen)
			break;

1800 1801 1802 1803 1804 1805 1806 1807 1808
		/* Increment page address */
		realpage++;

		page = realpage & chip->pagemask;
		/* Check, if we cross a chip boundary */
		if (!page) {
			chipnr++;
			chip->select_chip(mtd, -1);
			chip->select_chip(mtd, chipnr);
L
Linus Torvalds 已提交
1809 1810
		}
	}
1811
	chip->select_chip(mtd, -1);
L
Linus Torvalds 已提交
1812

1813 1814 1815 1816
	ops->oobretlen = ops->ooblen - readlen;

	if (ret < 0)
		return ret;
1817 1818 1819 1820 1821

	if (mtd->ecc_stats.failed - stats.failed)
		return -EBADMSG;

	return  mtd->ecc_stats.corrected - stats.corrected ? -EUCLEAN : 0;
L
Linus Torvalds 已提交
1822 1823 1824
}

/**
1825
 * nand_read_oob - [MTD Interface] NAND read data and/or out-of-band
1826 1827 1828
 * @mtd: MTD device structure
 * @from: offset to read from
 * @ops: oob operation description structure
L
Linus Torvalds 已提交
1829
 *
1830
 * NAND read data and/or out-of-band data.
L
Linus Torvalds 已提交
1831
 */
1832 1833
static int nand_read_oob(struct mtd_info *mtd, loff_t from,
			 struct mtd_oob_ops *ops)
L
Linus Torvalds 已提交
1834
{
1835
	struct nand_chip *chip = mtd->priv;
1836 1837 1838
	int ret = -ENOTSUPP;

	ops->retlen = 0;
L
Linus Torvalds 已提交
1839 1840

	/* Do not allow reads past end of device */
1841
	if (ops->datbuf && (from + ops->len) > mtd->size) {
1842 1843
		pr_debug("%s: attempt to read beyond end of device\n",
				__func__);
L
Linus Torvalds 已提交
1844 1845 1846
		return -EINVAL;
	}

1847
	nand_get_device(chip, mtd, FL_READING);
L
Linus Torvalds 已提交
1848

1849
	switch (ops->mode) {
1850 1851 1852
	case MTD_OPS_PLACE_OOB:
	case MTD_OPS_AUTO_OOB:
	case MTD_OPS_RAW:
1853
		break;
L
Linus Torvalds 已提交
1854

1855 1856 1857
	default:
		goto out;
	}
L
Linus Torvalds 已提交
1858

1859 1860 1861 1862
	if (!ops->datbuf)
		ret = nand_do_read_oob(mtd, from, ops);
	else
		ret = nand_do_read_ops(mtd, from, ops);
1863

1864
out:
1865 1866 1867
	nand_release_device(mtd);
	return ret;
}
1868

L
Linus Torvalds 已提交
1869

1870
/**
1871
 * nand_write_page_raw - [INTERN] raw page write function
1872 1873 1874
 * @mtd: mtd info structure
 * @chip: nand chip info structure
 * @buf: data buffer
1875
 * @oob_required: must write chip->oob_poi to OOB
1876
 *
1877
 * Not for syndrome calculating ECC controllers, which use a special oob layout.
1878
 */
1879
static int nand_write_page_raw(struct mtd_info *mtd, struct nand_chip *chip,
1880
				const uint8_t *buf, int oob_required)
1881 1882
{
	chip->write_buf(mtd, buf, mtd->writesize);
1883 1884
	if (oob_required)
		chip->write_buf(mtd, chip->oob_poi, mtd->oobsize);
1885 1886

	return 0;
L
Linus Torvalds 已提交
1887 1888
}

1889
/**
1890
 * nand_write_page_raw_syndrome - [INTERN] raw page write function
1891 1892 1893
 * @mtd: mtd info structure
 * @chip: nand chip info structure
 * @buf: data buffer
1894
 * @oob_required: must write chip->oob_poi to OOB
1895 1896 1897
 *
 * We need a special oob layout and handling even when ECC isn't checked.
 */
1898
static int nand_write_page_raw_syndrome(struct mtd_info *mtd,
1899
					struct nand_chip *chip,
1900
					const uint8_t *buf, int oob_required)
1901 1902 1903 1904 1905 1906 1907 1908 1909 1910 1911 1912 1913 1914 1915 1916 1917 1918 1919 1920 1921 1922 1923 1924 1925 1926 1927
{
	int eccsize = chip->ecc.size;
	int eccbytes = chip->ecc.bytes;
	uint8_t *oob = chip->oob_poi;
	int steps, size;

	for (steps = chip->ecc.steps; steps > 0; steps--) {
		chip->write_buf(mtd, buf, eccsize);
		buf += eccsize;

		if (chip->ecc.prepad) {
			chip->write_buf(mtd, oob, chip->ecc.prepad);
			oob += chip->ecc.prepad;
		}

		chip->read_buf(mtd, oob, eccbytes);
		oob += eccbytes;

		if (chip->ecc.postpad) {
			chip->write_buf(mtd, oob, chip->ecc.postpad);
			oob += chip->ecc.postpad;
		}
	}

	size = mtd->oobsize - (oob - chip->oob_poi);
	if (size)
		chip->write_buf(mtd, oob, size);
1928 1929

	return 0;
1930
}
1931
/**
1932
 * nand_write_page_swecc - [REPLACEABLE] software ECC based page write function
1933 1934 1935
 * @mtd: mtd info structure
 * @chip: nand chip info structure
 * @buf: data buffer
1936
 * @oob_required: must write chip->oob_poi to OOB
1937
 */
1938
static int nand_write_page_swecc(struct mtd_info *mtd, struct nand_chip *chip,
1939
				  const uint8_t *buf, int oob_required)
1940
{
1941 1942 1943
	int i, eccsize = chip->ecc.size;
	int eccbytes = chip->ecc.bytes;
	int eccsteps = chip->ecc.steps;
1944
	uint8_t *ecc_calc = chip->buffers->ecccalc;
1945
	const uint8_t *p = buf;
1946
	uint32_t *eccpos = chip->ecc.layout->eccpos;
1947

1948
	/* Software ECC calculation */
1949 1950
	for (i = 0; eccsteps; eccsteps--, i += eccbytes, p += eccsize)
		chip->ecc.calculate(mtd, p, &ecc_calc[i]);
1951

1952 1953
	for (i = 0; i < chip->ecc.total; i++)
		chip->oob_poi[eccpos[i]] = ecc_calc[i];
1954

1955
	return chip->ecc.write_page_raw(mtd, chip, buf, 1);
1956
}
1957

1958
/**
1959
 * nand_write_page_hwecc - [REPLACEABLE] hardware ECC based page write function
1960 1961 1962
 * @mtd: mtd info structure
 * @chip: nand chip info structure
 * @buf: data buffer
1963
 * @oob_required: must write chip->oob_poi to OOB
1964
 */
1965
static int nand_write_page_hwecc(struct mtd_info *mtd, struct nand_chip *chip,
1966
				  const uint8_t *buf, int oob_required)
1967 1968 1969 1970
{
	int i, eccsize = chip->ecc.size;
	int eccbytes = chip->ecc.bytes;
	int eccsteps = chip->ecc.steps;
1971
	uint8_t *ecc_calc = chip->buffers->ecccalc;
1972
	const uint8_t *p = buf;
1973
	uint32_t *eccpos = chip->ecc.layout->eccpos;
1974

1975 1976
	for (i = 0; eccsteps; eccsteps--, i += eccbytes, p += eccsize) {
		chip->ecc.hwctl(mtd, NAND_ECC_WRITE);
1977
		chip->write_buf(mtd, p, eccsize);
1978
		chip->ecc.calculate(mtd, p, &ecc_calc[i]);
1979 1980
	}

1981 1982 1983 1984
	for (i = 0; i < chip->ecc.total; i++)
		chip->oob_poi[eccpos[i]] = ecc_calc[i];

	chip->write_buf(mtd, chip->oob_poi, mtd->oobsize);
1985 1986

	return 0;
1987 1988
}

1989
/**
1990
 * nand_write_page_syndrome - [REPLACEABLE] hardware ECC syndrome based page write
1991 1992 1993
 * @mtd: mtd info structure
 * @chip: nand chip info structure
 * @buf: data buffer
1994
 * @oob_required: must write chip->oob_poi to OOB
L
Linus Torvalds 已提交
1995
 *
1996 1997
 * The hw generator calculates the error syndrome automatically. Therefore we
 * need a special oob layout and handling.
1998
 */
1999
static int nand_write_page_syndrome(struct mtd_info *mtd,
2000 2001
				    struct nand_chip *chip,
				    const uint8_t *buf, int oob_required)
L
Linus Torvalds 已提交
2002
{
2003 2004 2005 2006 2007
	int i, eccsize = chip->ecc.size;
	int eccbytes = chip->ecc.bytes;
	int eccsteps = chip->ecc.steps;
	const uint8_t *p = buf;
	uint8_t *oob = chip->oob_poi;
L
Linus Torvalds 已提交
2008

2009
	for (i = 0; eccsteps; eccsteps--, i += eccbytes, p += eccsize) {
L
Linus Torvalds 已提交
2010

2011 2012
		chip->ecc.hwctl(mtd, NAND_ECC_WRITE);
		chip->write_buf(mtd, p, eccsize);
2013

2014 2015 2016 2017 2018 2019 2020 2021 2022 2023 2024 2025
		if (chip->ecc.prepad) {
			chip->write_buf(mtd, oob, chip->ecc.prepad);
			oob += chip->ecc.prepad;
		}

		chip->ecc.calculate(mtd, p, oob);
		chip->write_buf(mtd, oob, eccbytes);
		oob += eccbytes;

		if (chip->ecc.postpad) {
			chip->write_buf(mtd, oob, chip->ecc.postpad);
			oob += chip->ecc.postpad;
L
Linus Torvalds 已提交
2026 2027
		}
	}
2028 2029

	/* Calculate remaining oob bytes */
2030
	i = mtd->oobsize - (oob - chip->oob_poi);
2031 2032
	if (i)
		chip->write_buf(mtd, oob, i);
2033 2034

	return 0;
2035 2036 2037
}

/**
2038
 * nand_write_page - [REPLACEABLE] write one page
2039 2040 2041
 * @mtd: MTD device structure
 * @chip: NAND chip descriptor
 * @buf: the data to write
2042
 * @oob_required: must write chip->oob_poi to OOB
2043 2044 2045
 * @page: page number to write
 * @cached: cached programming
 * @raw: use _raw version of write_page
2046 2047
 */
static int nand_write_page(struct mtd_info *mtd, struct nand_chip *chip,
2048 2049
			   const uint8_t *buf, int oob_required, int page,
			   int cached, int raw)
2050 2051 2052 2053 2054
{
	int status;

	chip->cmdfunc(mtd, NAND_CMD_SEQIN, 0x00, page);

2055
	if (unlikely(raw))
2056
		status = chip->ecc.write_page_raw(mtd, chip, buf, oob_required);
2057
	else
2058 2059 2060 2061
		status = chip->ecc.write_page(mtd, chip, buf, oob_required);

	if (status < 0)
		return status;
2062 2063

	/*
2064
	 * Cached progamming disabled for now. Not sure if it's worth the
2065
	 * trouble. The speed gain is not very impressive. (2.3->2.6Mib/s).
2066 2067 2068 2069 2070 2071
	 */
	cached = 0;

	if (!cached || !(chip->options & NAND_CACHEPRG)) {

		chip->cmdfunc(mtd, NAND_CMD_PAGEPROG, -1, -1);
2072
		status = chip->waitfunc(mtd, chip);
2073 2074
		/*
		 * See if operation failed and additional status checks are
2075
		 * available.
2076 2077 2078 2079 2080 2081 2082 2083 2084
		 */
		if ((status & NAND_STATUS_FAIL) && (chip->errstat))
			status = chip->errstat(mtd, chip, FL_WRITING, status,
					       page);

		if (status & NAND_STATUS_FAIL)
			return -EIO;
	} else {
		chip->cmdfunc(mtd, NAND_CMD_CACHEDPROG, -1, -1);
2085
		status = chip->waitfunc(mtd, chip);
2086 2087 2088
	}

	return 0;
L
Linus Torvalds 已提交
2089 2090
}

2091
/**
2092
 * nand_fill_oob - [INTERN] Transfer client buffer to oob
2093
 * @mtd: MTD device structure
2094 2095 2096
 * @oob: oob data buffer
 * @len: oob data write length
 * @ops: oob ops structure
2097
 */
2098 2099
static uint8_t *nand_fill_oob(struct mtd_info *mtd, uint8_t *oob, size_t len,
			      struct mtd_oob_ops *ops)
2100
{
2101 2102 2103 2104 2105 2106 2107 2108
	struct nand_chip *chip = mtd->priv;

	/*
	 * Initialise to all 0xFF, to avoid the possibility of left over OOB
	 * data from a previous OOB read.
	 */
	memset(chip->oob_poi, 0xff, mtd->oobsize);

2109
	switch (ops->mode) {
2110

2111 2112
	case MTD_OPS_PLACE_OOB:
	case MTD_OPS_RAW:
2113 2114 2115
		memcpy(chip->oob_poi + ops->ooboffs, oob, len);
		return oob + len;

2116
	case MTD_OPS_AUTO_OOB: {
2117
		struct nand_oobfree *free = chip->ecc.layout->oobfree;
2118 2119
		uint32_t boffs = 0, woffs = ops->ooboffs;
		size_t bytes = 0;
2120

2121
		for (; free->length && len; free++, len -= bytes) {
2122
			/* Write request not from offset 0? */
2123 2124 2125 2126 2127 2128 2129 2130 2131 2132 2133 2134 2135
			if (unlikely(woffs)) {
				if (woffs >= free->length) {
					woffs -= free->length;
					continue;
				}
				boffs = free->offset + woffs;
				bytes = min_t(size_t, len,
					      (free->length - woffs));
				woffs = 0;
			} else {
				bytes = min_t(size_t, len, free->length);
				boffs = free->offset;
			}
2136
			memcpy(chip->oob_poi + boffs, oob, bytes);
2137 2138 2139 2140 2141 2142 2143 2144 2145 2146
			oob += bytes;
		}
		return oob;
	}
	default:
		BUG();
	}
	return NULL;
}

2147
#define NOTALIGNED(x)	((x & (chip->subpagesize - 1)) != 0)
L
Linus Torvalds 已提交
2148 2149

/**
2150
 * nand_do_write_ops - [INTERN] NAND write with ECC
2151 2152 2153
 * @mtd: MTD device structure
 * @to: offset to write to
 * @ops: oob operations description structure
L
Linus Torvalds 已提交
2154
 *
2155
 * NAND write with ECC.
L
Linus Torvalds 已提交
2156
 */
2157 2158
static int nand_do_write_ops(struct mtd_info *mtd, loff_t to,
			     struct mtd_oob_ops *ops)
L
Linus Torvalds 已提交
2159
{
2160
	int chipnr, realpage, page, blockmask, column;
2161
	struct nand_chip *chip = mtd->priv;
2162
	uint32_t writelen = ops->len;
2163 2164

	uint32_t oobwritelen = ops->ooblen;
2165
	uint32_t oobmaxlen = ops->mode == MTD_OPS_AUTO_OOB ?
2166 2167
				mtd->oobavail : mtd->oobsize;

2168 2169
	uint8_t *oob = ops->oobbuf;
	uint8_t *buf = ops->datbuf;
2170
	int ret, subpage;
2171
	int oob_required = oob ? 1 : 0;
L
Linus Torvalds 已提交
2172

2173
	ops->retlen = 0;
2174 2175
	if (!writelen)
		return 0;
L
Linus Torvalds 已提交
2176

2177
	/* Reject writes, which are not page aligned */
2178
	if (NOTALIGNED(to) || NOTALIGNED(ops->len)) {
2179 2180
		pr_notice("%s: attempt to write non page aligned data\n",
			   __func__);
L
Linus Torvalds 已提交
2181 2182 2183
		return -EINVAL;
	}

2184 2185 2186 2187 2188
	column = to & (mtd->writesize - 1);
	subpage = column || (writelen & (mtd->writesize - 1));

	if (subpage && oob)
		return -EINVAL;
L
Linus Torvalds 已提交
2189

2190 2191 2192
	chipnr = (int)(to >> chip->chip_shift);
	chip->select_chip(mtd, chipnr);

L
Linus Torvalds 已提交
2193
	/* Check, if it is write protected */
2194 2195 2196 2197
	if (nand_check_wp(mtd)) {
		ret = -EIO;
		goto err_out;
	}
L
Linus Torvalds 已提交
2198

2199 2200 2201 2202 2203 2204
	realpage = (int)(to >> chip->page_shift);
	page = realpage & chip->pagemask;
	blockmask = (1 << (chip->phys_erase_shift - chip->page_shift)) - 1;

	/* Invalidate the page cache, when we write to the cached page */
	if (to <= (chip->pagebuf << chip->page_shift) &&
2205
	    (chip->pagebuf << chip->page_shift) < (to + ops->len))
2206
		chip->pagebuf = -1;
2207

2208
	/* Don't allow multipage oob writes with offset */
2209 2210 2211 2212
	if (oob && ops->ooboffs && (ops->ooboffs + ops->ooblen > oobmaxlen)) {
		ret = -EINVAL;
		goto err_out;
	}
2213

2214
	while (1) {
2215
		int bytes = mtd->writesize;
2216
		int cached = writelen > bytes && page != blockmask;
2217 2218
		uint8_t *wbuf = buf;

2219
		/* Partial page write? */
2220 2221 2222 2223 2224 2225 2226 2227
		if (unlikely(column || writelen < (mtd->writesize - 1))) {
			cached = 0;
			bytes = min_t(int, bytes - column, (int) writelen);
			chip->pagebuf = -1;
			memset(chip->buffers->databuf, 0xff, mtd->writesize);
			memcpy(&chip->buffers->databuf[column], buf, bytes);
			wbuf = chip->buffers->databuf;
		}
L
Linus Torvalds 已提交
2228

2229 2230
		if (unlikely(oob)) {
			size_t len = min(oobwritelen, oobmaxlen);
2231
			oob = nand_fill_oob(mtd, oob, len, ops);
2232
			oobwritelen -= len;
2233 2234 2235
		} else {
			/* We still need to erase leftover OOB data */
			memset(chip->oob_poi, 0xff, mtd->oobsize);
2236
		}
2237

2238 2239
		ret = chip->write_page(mtd, chip, wbuf, oob_required, page,
				       cached, (ops->mode == MTD_OPS_RAW));
2240 2241 2242 2243 2244 2245 2246
		if (ret)
			break;

		writelen -= bytes;
		if (!writelen)
			break;

2247
		column = 0;
2248 2249 2250 2251 2252 2253 2254 2255 2256
		buf += bytes;
		realpage++;

		page = realpage & chip->pagemask;
		/* Check, if we cross a chip boundary */
		if (!page) {
			chipnr++;
			chip->select_chip(mtd, -1);
			chip->select_chip(mtd, chipnr);
L
Linus Torvalds 已提交
2257 2258
		}
	}
2259 2260

	ops->retlen = ops->len - writelen;
2261 2262
	if (unlikely(oob))
		ops->oobretlen = ops->ooblen;
2263 2264 2265

err_out:
	chip->select_chip(mtd, -1);
L
Linus Torvalds 已提交
2266 2267 2268
	return ret;
}

2269 2270
/**
 * panic_nand_write - [MTD Interface] NAND write with ECC
2271 2272 2273 2274 2275
 * @mtd: MTD device structure
 * @to: offset to write to
 * @len: number of bytes to write
 * @retlen: pointer to variable to store the number of written bytes
 * @buf: the data to write
2276 2277 2278 2279 2280 2281 2282 2283
 *
 * NAND write with ECC. Used when performing writes in interrupt context, this
 * may for example be called by mtdoops when writing an oops while in panic.
 */
static int panic_nand_write(struct mtd_info *mtd, loff_t to, size_t len,
			    size_t *retlen, const uint8_t *buf)
{
	struct nand_chip *chip = mtd->priv;
2284
	struct mtd_oob_ops ops;
2285 2286
	int ret;

2287
	/* Wait for the device to get ready */
2288 2289
	panic_nand_wait(mtd, chip, 400);

2290
	/* Grab the device */
2291 2292
	panic_nand_get_device(chip, mtd, FL_WRITING);

2293 2294 2295
	ops.len = len;
	ops.datbuf = (uint8_t *)buf;
	ops.oobbuf = NULL;
2296
	ops.mode = MTD_OPS_PLACE_OOB;
2297

2298
	ret = nand_do_write_ops(mtd, to, &ops);
2299

2300
	*retlen = ops.retlen;
2301 2302 2303
	return ret;
}

2304
/**
2305
 * nand_write - [MTD Interface] NAND write with ECC
2306 2307 2308 2309 2310
 * @mtd: MTD device structure
 * @to: offset to write to
 * @len: number of bytes to write
 * @retlen: pointer to variable to store the number of written bytes
 * @buf: the data to write
2311
 *
2312
 * NAND write with ECC.
2313
 */
2314 2315
static int nand_write(struct mtd_info *mtd, loff_t to, size_t len,
			  size_t *retlen, const uint8_t *buf)
2316 2317
{
	struct nand_chip *chip = mtd->priv;
2318
	struct mtd_oob_ops ops;
2319 2320
	int ret;

2321
	nand_get_device(chip, mtd, FL_WRITING);
2322 2323 2324
	ops.len = len;
	ops.datbuf = (uint8_t *)buf;
	ops.oobbuf = NULL;
2325
	ops.mode = MTD_OPS_PLACE_OOB;
2326 2327
	ret = nand_do_write_ops(mtd, to, &ops);
	*retlen = ops.retlen;
2328
	nand_release_device(mtd);
2329
	return ret;
2330
}
2331

L
Linus Torvalds 已提交
2332
/**
2333
 * nand_do_write_oob - [MTD Interface] NAND write out-of-band
2334 2335 2336
 * @mtd: MTD device structure
 * @to: offset to write to
 * @ops: oob operation description structure
L
Linus Torvalds 已提交
2337
 *
2338
 * NAND write out-of-band.
L
Linus Torvalds 已提交
2339
 */
2340 2341
static int nand_do_write_oob(struct mtd_info *mtd, loff_t to,
			     struct mtd_oob_ops *ops)
L
Linus Torvalds 已提交
2342
{
2343
	int chipnr, page, status, len;
2344
	struct nand_chip *chip = mtd->priv;
L
Linus Torvalds 已提交
2345

2346
	pr_debug("%s: to = 0x%08x, len = %i\n",
2347
			 __func__, (unsigned int)to, (int)ops->ooblen);
L
Linus Torvalds 已提交
2348

2349
	if (ops->mode == MTD_OPS_AUTO_OOB)
2350 2351 2352 2353
		len = chip->ecc.layout->oobavail;
	else
		len = mtd->oobsize;

L
Linus Torvalds 已提交
2354
	/* Do not allow write past end of page */
2355
	if ((ops->ooboffs + ops->ooblen) > len) {
2356 2357
		pr_debug("%s: attempt to write past end of page\n",
				__func__);
L
Linus Torvalds 已提交
2358 2359 2360
		return -EINVAL;
	}

2361
	if (unlikely(ops->ooboffs >= len)) {
2362 2363
		pr_debug("%s: attempt to start write outside oob\n",
				__func__);
2364 2365 2366
		return -EINVAL;
	}

2367
	/* Do not allow write past end of device */
2368 2369 2370 2371
	if (unlikely(to >= mtd->size ||
		     ops->ooboffs + ops->ooblen >
			((mtd->size >> chip->page_shift) -
			 (to >> chip->page_shift)) * len)) {
2372 2373
		pr_debug("%s: attempt to write beyond end of device\n",
				__func__);
2374 2375 2376
		return -EINVAL;
	}

2377
	chipnr = (int)(to >> chip->chip_shift);
2378
	chip->select_chip(mtd, chipnr);
L
Linus Torvalds 已提交
2379

2380 2381 2382 2383 2384 2385 2386 2387 2388
	/* Shift to get page */
	page = (int)(to >> chip->page_shift);

	/*
	 * Reset the chip. Some chips (like the Toshiba TC5832DC found in one
	 * of my DiskOnChip 2000 test units) will clear the whole data page too
	 * if we don't do this. I have no clue why, but I seem to have 'fixed'
	 * it in the doc2000 driver in August 1999.  dwmw2.
	 */
2389
	chip->cmdfunc(mtd, NAND_CMD_RESET, -1, -1);
L
Linus Torvalds 已提交
2390 2391

	/* Check, if it is write protected */
2392 2393
	if (nand_check_wp(mtd)) {
		chip->select_chip(mtd, -1);
2394
		return -EROFS;
2395
	}
2396

L
Linus Torvalds 已提交
2397
	/* Invalidate the page cache, if we write to the cached page */
2398 2399
	if (page == chip->pagebuf)
		chip->pagebuf = -1;
L
Linus Torvalds 已提交
2400

2401
	nand_fill_oob(mtd, ops->oobbuf, ops->ooblen, ops);
2402

2403
	if (ops->mode == MTD_OPS_RAW)
2404 2405 2406
		status = chip->ecc.write_oob_raw(mtd, chip, page & chip->pagemask);
	else
		status = chip->ecc.write_oob(mtd, chip, page & chip->pagemask);
L
Linus Torvalds 已提交
2407

2408 2409
	chip->select_chip(mtd, -1);

2410 2411
	if (status)
		return status;
L
Linus Torvalds 已提交
2412

2413
	ops->oobretlen = ops->ooblen;
L
Linus Torvalds 已提交
2414

2415
	return 0;
2416 2417 2418 2419
}

/**
 * nand_write_oob - [MTD Interface] NAND write data and/or out-of-band
2420 2421 2422
 * @mtd: MTD device structure
 * @to: offset to write to
 * @ops: oob operation description structure
2423 2424 2425 2426 2427 2428 2429 2430 2431 2432
 */
static int nand_write_oob(struct mtd_info *mtd, loff_t to,
			  struct mtd_oob_ops *ops)
{
	struct nand_chip *chip = mtd->priv;
	int ret = -ENOTSUPP;

	ops->retlen = 0;

	/* Do not allow writes past end of device */
2433
	if (ops->datbuf && (to + ops->len) > mtd->size) {
2434 2435
		pr_debug("%s: attempt to write beyond end of device\n",
				__func__);
2436 2437 2438
		return -EINVAL;
	}

2439
	nand_get_device(chip, mtd, FL_WRITING);
2440

2441
	switch (ops->mode) {
2442 2443 2444
	case MTD_OPS_PLACE_OOB:
	case MTD_OPS_AUTO_OOB:
	case MTD_OPS_RAW:
2445 2446 2447 2448 2449 2450 2451 2452 2453 2454 2455
		break;

	default:
		goto out;
	}

	if (!ops->datbuf)
		ret = nand_do_write_oob(mtd, to, ops);
	else
		ret = nand_do_write_ops(mtd, to, ops);

2456
out:
L
Linus Torvalds 已提交
2457 2458 2459 2460 2461
	nand_release_device(mtd);
	return ret;
}

/**
2462
 * single_erase_cmd - [GENERIC] NAND standard block erase command function
2463 2464
 * @mtd: MTD device structure
 * @page: the page address of the block which will be erased
L
Linus Torvalds 已提交
2465
 *
2466
 * Standard erase command for NAND chips.
L
Linus Torvalds 已提交
2467
 */
2468
static void single_erase_cmd(struct mtd_info *mtd, int page)
L
Linus Torvalds 已提交
2469
{
2470
	struct nand_chip *chip = mtd->priv;
L
Linus Torvalds 已提交
2471
	/* Send commands to erase a block */
2472 2473
	chip->cmdfunc(mtd, NAND_CMD_ERASE1, -1, page);
	chip->cmdfunc(mtd, NAND_CMD_ERASE2, -1, -1);
L
Linus Torvalds 已提交
2474 2475 2476
}

/**
2477
 * multi_erase_cmd - [GENERIC] AND specific block erase command function
2478 2479
 * @mtd: MTD device structure
 * @page: the page address of the block which will be erased
L
Linus Torvalds 已提交
2480
 *
2481
 * AND multi block erase command function. Erase 4 consecutive blocks.
L
Linus Torvalds 已提交
2482
 */
2483
static void multi_erase_cmd(struct mtd_info *mtd, int page)
L
Linus Torvalds 已提交
2484
{
2485
	struct nand_chip *chip = mtd->priv;
L
Linus Torvalds 已提交
2486
	/* Send commands to erase a block */
2487 2488 2489 2490 2491
	chip->cmdfunc(mtd, NAND_CMD_ERASE1, -1, page++);
	chip->cmdfunc(mtd, NAND_CMD_ERASE1, -1, page++);
	chip->cmdfunc(mtd, NAND_CMD_ERASE1, -1, page++);
	chip->cmdfunc(mtd, NAND_CMD_ERASE1, -1, page);
	chip->cmdfunc(mtd, NAND_CMD_ERASE2, -1, -1);
L
Linus Torvalds 已提交
2492 2493 2494 2495
}

/**
 * nand_erase - [MTD Interface] erase block(s)
2496 2497
 * @mtd: MTD device structure
 * @instr: erase instruction
L
Linus Torvalds 已提交
2498
 *
2499
 * Erase one ore more blocks.
L
Linus Torvalds 已提交
2500
 */
2501
static int nand_erase(struct mtd_info *mtd, struct erase_info *instr)
L
Linus Torvalds 已提交
2502
{
2503
	return nand_erase_nand(mtd, instr, 0);
L
Linus Torvalds 已提交
2504
}
2505

2506
#define BBT_PAGE_MASK	0xffffff3f
L
Linus Torvalds 已提交
2507
/**
2508
 * nand_erase_nand - [INTERN] erase block(s)
2509 2510 2511
 * @mtd: MTD device structure
 * @instr: erase instruction
 * @allowbbt: allow erasing the bbt area
L
Linus Torvalds 已提交
2512
 *
2513
 * Erase one ore more blocks.
L
Linus Torvalds 已提交
2514
 */
2515 2516
int nand_erase_nand(struct mtd_info *mtd, struct erase_info *instr,
		    int allowbbt)
L
Linus Torvalds 已提交
2517
{
2518
	int page, status, pages_per_block, ret, chipnr;
2519
	struct nand_chip *chip = mtd->priv;
2520
	loff_t rewrite_bbt[NAND_MAX_CHIPS] = {0};
2521
	unsigned int bbt_masked_page = 0xffffffff;
2522
	loff_t len;
L
Linus Torvalds 已提交
2523

2524 2525 2526
	pr_debug("%s: start = 0x%012llx, len = %llu\n",
			__func__, (unsigned long long)instr->addr,
			(unsigned long long)instr->len);
L
Linus Torvalds 已提交
2527

2528
	if (check_offs_len(mtd, instr->addr, instr->len))
L
Linus Torvalds 已提交
2529 2530 2531
		return -EINVAL;

	/* Grab the lock and see if the device is available */
2532
	nand_get_device(chip, mtd, FL_ERASING);
L
Linus Torvalds 已提交
2533 2534

	/* Shift to get first page */
2535 2536
	page = (int)(instr->addr >> chip->page_shift);
	chipnr = (int)(instr->addr >> chip->chip_shift);
L
Linus Torvalds 已提交
2537 2538

	/* Calculate pages in each block */
2539
	pages_per_block = 1 << (chip->phys_erase_shift - chip->page_shift);
L
Linus Torvalds 已提交
2540 2541

	/* Select the NAND device */
2542
	chip->select_chip(mtd, chipnr);
L
Linus Torvalds 已提交
2543 2544 2545

	/* Check, if it is write protected */
	if (nand_check_wp(mtd)) {
2546 2547
		pr_debug("%s: device is write protected!\n",
				__func__);
L
Linus Torvalds 已提交
2548 2549 2550 2551
		instr->state = MTD_ERASE_FAILED;
		goto erase_exit;
	}

2552 2553 2554 2555
	/*
	 * If BBT requires refresh, set the BBT page mask to see if the BBT
	 * should be rewritten. Otherwise the mask is set to 0xffffffff which
	 * can not be matched. This is also done when the bbt is actually
2556
	 * erased to avoid recursive updates.
2557 2558 2559
	 */
	if (chip->options & BBT_AUTO_REFRESH && !allowbbt)
		bbt_masked_page = chip->bbt_td->pages[chipnr] & BBT_PAGE_MASK;
2560

L
Linus Torvalds 已提交
2561 2562 2563 2564 2565 2566
	/* Loop through the pages */
	len = instr->len;

	instr->state = MTD_ERASING;

	while (len) {
W
Wolfram Sang 已提交
2567
		/* Check if we have a bad block, we do not erase bad blocks! */
2568 2569
		if (nand_block_checkbad(mtd, ((loff_t) page) <<
					chip->page_shift, 0, allowbbt)) {
2570 2571
			pr_warn("%s: attempt to erase a bad block at page 0x%08x\n",
				    __func__, page);
L
Linus Torvalds 已提交
2572 2573 2574
			instr->state = MTD_ERASE_FAILED;
			goto erase_exit;
		}
2575

2576 2577
		/*
		 * Invalidate the page cache, if we erase the block which
2578
		 * contains the current cached page.
2579 2580 2581 2582
		 */
		if (page <= chip->pagebuf && chip->pagebuf <
		    (page + pages_per_block))
			chip->pagebuf = -1;
L
Linus Torvalds 已提交
2583

2584
		chip->erase_cmd(mtd, page & chip->pagemask);
2585

2586
		status = chip->waitfunc(mtd, chip);
L
Linus Torvalds 已提交
2587

2588 2589 2590 2591 2592 2593 2594
		/*
		 * See if operation failed and additional status checks are
		 * available
		 */
		if ((status & NAND_STATUS_FAIL) && (chip->errstat))
			status = chip->errstat(mtd, chip, FL_ERASING,
					       status, page);
2595

L
Linus Torvalds 已提交
2596
		/* See if block erase succeeded */
2597
		if (status & NAND_STATUS_FAIL) {
2598 2599
			pr_debug("%s: failed erase, page 0x%08x\n",
					__func__, page);
L
Linus Torvalds 已提交
2600
			instr->state = MTD_ERASE_FAILED;
2601 2602
			instr->fail_addr =
				((loff_t)page << chip->page_shift);
L
Linus Torvalds 已提交
2603 2604
			goto erase_exit;
		}
2605

2606 2607
		/*
		 * If BBT requires refresh, set the BBT rewrite flag to the
2608
		 * page being erased.
2609 2610 2611
		 */
		if (bbt_masked_page != 0xffffffff &&
		    (page & BBT_PAGE_MASK) == bbt_masked_page)
2612 2613
			    rewrite_bbt[chipnr] =
					((loff_t)page << chip->page_shift);
2614

L
Linus Torvalds 已提交
2615
		/* Increment page address and decrement length */
2616
		len -= (1 << chip->phys_erase_shift);
L
Linus Torvalds 已提交
2617 2618 2619
		page += pages_per_block;

		/* Check, if we cross a chip boundary */
2620
		if (len && !(page & chip->pagemask)) {
L
Linus Torvalds 已提交
2621
			chipnr++;
2622 2623
			chip->select_chip(mtd, -1);
			chip->select_chip(mtd, chipnr);
2624

2625 2626
			/*
			 * If BBT requires refresh and BBT-PERCHIP, set the BBT
2627
			 * page mask to see if this BBT should be rewritten.
2628 2629 2630 2631 2632
			 */
			if (bbt_masked_page != 0xffffffff &&
			    (chip->bbt_td->options & NAND_BBT_PERCHIP))
				bbt_masked_page = chip->bbt_td->pages[chipnr] &
					BBT_PAGE_MASK;
L
Linus Torvalds 已提交
2633 2634 2635 2636
		}
	}
	instr->state = MTD_ERASE_DONE;

2637
erase_exit:
L
Linus Torvalds 已提交
2638 2639 2640 2641

	ret = instr->state == MTD_ERASE_DONE ? 0 : -EIO;

	/* Deselect and wake up anyone waiting on the device */
2642
	chip->select_chip(mtd, -1);
L
Linus Torvalds 已提交
2643 2644
	nand_release_device(mtd);

2645 2646 2647 2648
	/* Do call back function */
	if (!ret)
		mtd_erase_callback(instr);

2649 2650
	/*
	 * If BBT requires refresh and erase was successful, rewrite any
2651
	 * selected bad block tables.
2652 2653 2654 2655 2656 2657 2658
	 */
	if (bbt_masked_page == 0xffffffff || ret)
		return ret;

	for (chipnr = 0; chipnr < chip->numchips; chipnr++) {
		if (!rewrite_bbt[chipnr])
			continue;
2659
		/* Update the BBT for chip */
2660 2661 2662
		pr_debug("%s: nand_update_bbt (%d:0x%0llx 0x%0x)\n",
				__func__, chipnr, rewrite_bbt[chipnr],
				chip->bbt_td->pages[chipnr]);
2663
		nand_update_bbt(mtd, rewrite_bbt[chipnr]);
2664 2665
	}

L
Linus Torvalds 已提交
2666 2667 2668 2669 2670 2671
	/* Return more or less happy */
	return ret;
}

/**
 * nand_sync - [MTD Interface] sync
2672
 * @mtd: MTD device structure
L
Linus Torvalds 已提交
2673
 *
2674
 * Sync is actually a wait for chip ready function.
L
Linus Torvalds 已提交
2675
 */
2676
static void nand_sync(struct mtd_info *mtd)
L
Linus Torvalds 已提交
2677
{
2678
	struct nand_chip *chip = mtd->priv;
L
Linus Torvalds 已提交
2679

2680
	pr_debug("%s: called\n", __func__);
L
Linus Torvalds 已提交
2681 2682

	/* Grab the lock and see if the device is available */
2683
	nand_get_device(chip, mtd, FL_SYNCING);
L
Linus Torvalds 已提交
2684
	/* Release it and go back */
2685
	nand_release_device(mtd);
L
Linus Torvalds 已提交
2686 2687 2688
}

/**
2689
 * nand_block_isbad - [MTD Interface] Check if block at offset is bad
2690 2691
 * @mtd: MTD device structure
 * @offs: offset relative to mtd start
L
Linus Torvalds 已提交
2692
 */
2693
static int nand_block_isbad(struct mtd_info *mtd, loff_t offs)
L
Linus Torvalds 已提交
2694
{
2695
	return nand_block_checkbad(mtd, offs, 1, 0);
L
Linus Torvalds 已提交
2696 2697 2698
}

/**
2699
 * nand_block_markbad - [MTD Interface] Mark block at the given offset as bad
2700 2701
 * @mtd: MTD device structure
 * @ofs: offset relative to mtd start
L
Linus Torvalds 已提交
2702
 */
2703
static int nand_block_markbad(struct mtd_info *mtd, loff_t ofs)
L
Linus Torvalds 已提交
2704
{
2705
	struct nand_chip *chip = mtd->priv;
L
Linus Torvalds 已提交
2706 2707
	int ret;

2708 2709
	ret = nand_block_isbad(mtd, ofs);
	if (ret) {
2710
		/* If it was bad already, return success and do nothing */
L
Linus Torvalds 已提交
2711 2712
		if (ret > 0)
			return 0;
2713 2714
		return ret;
	}
L
Linus Torvalds 已提交
2715

2716
	return chip->block_markbad(mtd, ofs);
L
Linus Torvalds 已提交
2717 2718
}

2719 2720 2721 2722 2723 2724 2725 2726 2727 2728 2729 2730 2731 2732 2733 2734 2735 2736 2737 2738 2739 2740 2741 2742 2743 2744 2745 2746 2747 2748 2749 2750 2751 2752 2753 2754 2755 2756 2757 2758 2759 2760 2761 2762
/**
 * nand_onfi_set_features- [REPLACEABLE] set features for ONFI nand
 * @mtd: MTD device structure
 * @chip: nand chip info structure
 * @addr: feature address.
 * @subfeature_param: the subfeature parameters, a four bytes array.
 */
static int nand_onfi_set_features(struct mtd_info *mtd, struct nand_chip *chip,
			int addr, uint8_t *subfeature_param)
{
	int status;

	if (!chip->onfi_version)
		return -EINVAL;

	chip->cmdfunc(mtd, NAND_CMD_SET_FEATURES, addr, -1);
	chip->write_buf(mtd, subfeature_param, ONFI_SUBFEATURE_PARAM_LEN);
	status = chip->waitfunc(mtd, chip);
	if (status & NAND_STATUS_FAIL)
		return -EIO;
	return 0;
}

/**
 * nand_onfi_get_features- [REPLACEABLE] get features for ONFI nand
 * @mtd: MTD device structure
 * @chip: nand chip info structure
 * @addr: feature address.
 * @subfeature_param: the subfeature parameters, a four bytes array.
 */
static int nand_onfi_get_features(struct mtd_info *mtd, struct nand_chip *chip,
			int addr, uint8_t *subfeature_param)
{
	if (!chip->onfi_version)
		return -EINVAL;

	/* clear the sub feature parameters */
	memset(subfeature_param, 0, ONFI_SUBFEATURE_PARAM_LEN);

	chip->cmdfunc(mtd, NAND_CMD_GET_FEATURES, addr, -1);
	chip->read_buf(mtd, subfeature_param, ONFI_SUBFEATURE_PARAM_LEN);
	return 0;
}

2763 2764
/**
 * nand_suspend - [MTD Interface] Suspend the NAND flash
2765
 * @mtd: MTD device structure
2766 2767 2768
 */
static int nand_suspend(struct mtd_info *mtd)
{
2769
	struct nand_chip *chip = mtd->priv;
2770

2771
	return nand_get_device(chip, mtd, FL_PM_SUSPENDED);
2772 2773 2774 2775
}

/**
 * nand_resume - [MTD Interface] Resume the NAND flash
2776
 * @mtd: MTD device structure
2777 2778 2779
 */
static void nand_resume(struct mtd_info *mtd)
{
2780
	struct nand_chip *chip = mtd->priv;
2781

2782
	if (chip->state == FL_PM_SUSPENDED)
2783 2784
		nand_release_device(mtd);
	else
2785 2786
		pr_err("%s called for a chip which is not in suspended state\n",
			__func__);
2787 2788
}

2789
/* Set default functions */
2790
static void nand_set_defaults(struct nand_chip *chip, int busw)
T
Thomas Gleixner 已提交
2791
{
L
Linus Torvalds 已提交
2792
	/* check for proper chip_delay setup, set 20us if not */
2793 2794
	if (!chip->chip_delay)
		chip->chip_delay = 20;
L
Linus Torvalds 已提交
2795 2796

	/* check, if a user supplied command function given */
2797 2798
	if (chip->cmdfunc == NULL)
		chip->cmdfunc = nand_command;
L
Linus Torvalds 已提交
2799 2800

	/* check, if a user supplied wait function given */
2801 2802 2803 2804 2805 2806 2807 2808 2809 2810 2811 2812 2813 2814 2815 2816 2817 2818 2819
	if (chip->waitfunc == NULL)
		chip->waitfunc = nand_wait;

	if (!chip->select_chip)
		chip->select_chip = nand_select_chip;
	if (!chip->read_byte)
		chip->read_byte = busw ? nand_read_byte16 : nand_read_byte;
	if (!chip->read_word)
		chip->read_word = nand_read_word;
	if (!chip->block_bad)
		chip->block_bad = nand_block_bad;
	if (!chip->block_markbad)
		chip->block_markbad = nand_default_block_markbad;
	if (!chip->write_buf)
		chip->write_buf = busw ? nand_write_buf16 : nand_write_buf;
	if (!chip->read_buf)
		chip->read_buf = busw ? nand_read_buf16 : nand_read_buf;
	if (!chip->scan_bbt)
		chip->scan_bbt = nand_default_bbt;
2820 2821 2822 2823 2824 2825 2826

	if (!chip->controller) {
		chip->controller = &chip->hwcontrol;
		spin_lock_init(&chip->controller->lock);
		init_waitqueue_head(&chip->controller->wq);
	}

T
Thomas Gleixner 已提交
2827 2828
}

2829
/* Sanitize ONFI strings so we can safely print them */
2830 2831 2832 2833
static void sanitize_string(uint8_t *s, size_t len)
{
	ssize_t i;

2834
	/* Null terminate */
2835 2836
	s[len - 1] = 0;

2837
	/* Remove non printable chars */
2838 2839 2840 2841 2842
	for (i = 0; i < len - 1; i++) {
		if (s[i] < ' ' || s[i] > 127)
			s[i] = '?';
	}

2843
	/* Remove trailing spaces */
2844 2845 2846 2847 2848 2849 2850 2851 2852 2853 2854 2855 2856 2857 2858
	strim(s);
}

static u16 onfi_crc16(u16 crc, u8 const *p, size_t len)
{
	int i;
	while (len--) {
		crc ^= *p++ << 8;
		for (i = 0; i < 8; i++)
			crc = (crc << 1) ^ ((crc & 0x8000) ? 0x8005 : 0);
	}

	return crc;
}

2859
/*
2860
 * Check if the NAND chip is ONFI compliant, returns 1 if it is, 0 otherwise.
2861 2862
 */
static int nand_flash_detect_onfi(struct mtd_info *mtd, struct nand_chip *chip,
2863
					int *busw)
2864 2865 2866 2867 2868
{
	struct nand_onfi_params *p = &chip->onfi_params;
	int i;
	int val;

2869
	/* Try ONFI for unknown chip or LP */
2870 2871 2872 2873 2874 2875 2876 2877 2878 2879
	chip->cmdfunc(mtd, NAND_CMD_READID, 0x20, -1);
	if (chip->read_byte(mtd) != 'O' || chip->read_byte(mtd) != 'N' ||
		chip->read_byte(mtd) != 'F' || chip->read_byte(mtd) != 'I')
		return 0;

	chip->cmdfunc(mtd, NAND_CMD_PARAM, 0, -1);
	for (i = 0; i < 3; i++) {
		chip->read_buf(mtd, (uint8_t *)p, sizeof(*p));
		if (onfi_crc16(ONFI_CRC_BASE, (uint8_t *)p, 254) ==
				le16_to_cpu(p->crc)) {
2880
			pr_info("ONFI param page %d valid\n", i);
2881 2882 2883 2884 2885 2886 2887
			break;
		}
	}

	if (i == 3)
		return 0;

2888
	/* Check version */
2889
	val = le16_to_cpu(p->revision);
2890 2891 2892
	if (val & (1 << 5))
		chip->onfi_version = 23;
	else if (val & (1 << 4))
2893 2894 2895 2896 2897
		chip->onfi_version = 22;
	else if (val & (1 << 3))
		chip->onfi_version = 21;
	else if (val & (1 << 2))
		chip->onfi_version = 20;
2898
	else if (val & (1 << 1))
2899
		chip->onfi_version = 10;
2900 2901 2902 2903
	else
		chip->onfi_version = 0;

	if (!chip->onfi_version) {
2904
		pr_info("%s: unsupported ONFI version: %d\n", __func__, val);
2905 2906
		return 0;
	}
2907 2908 2909 2910 2911 2912 2913 2914

	sanitize_string(p->manufacturer, sizeof(p->manufacturer));
	sanitize_string(p->model, sizeof(p->model));
	if (!mtd->name)
		mtd->name = p->model;
	mtd->writesize = le32_to_cpu(p->byte_per_page);
	mtd->erasesize = le32_to_cpu(p->pages_per_block) * mtd->writesize;
	mtd->oobsize = le16_to_cpu(p->spare_bytes_per_page);
2915 2916
	chip->chipsize = le32_to_cpu(p->blocks_per_lun);
	chip->chipsize *= (uint64_t)mtd->erasesize * p->lun_count;
2917
	*busw = 0;
2918
	if (le16_to_cpu(p->features) & 1)
2919
		*busw = NAND_BUSWIDTH_16;
2920

2921
	pr_info("ONFI flash detected\n");
2922 2923 2924
	return 1;
}

2925 2926 2927 2928 2929 2930 2931 2932 2933 2934 2935 2936 2937 2938 2939 2940 2941 2942 2943 2944 2945 2946 2947 2948 2949 2950 2951 2952 2953 2954 2955 2956 2957 2958 2959 2960 2961 2962 2963 2964 2965 2966 2967 2968 2969 2970 2971 2972 2973 2974 2975 2976 2977 2978 2979 2980 2981 2982 2983
/*
 * nand_id_has_period - Check if an ID string has a given wraparound period
 * @id_data: the ID string
 * @arrlen: the length of the @id_data array
 * @period: the period of repitition
 *
 * Check if an ID string is repeated within a given sequence of bytes at
 * specific repetition interval period (e.g., {0x20,0x01,0x7F,0x20} has a
 * period of 2). This is a helper function for nand_id_len(). Returns non-zero
 * if the repetition has a period of @period; otherwise, returns zero.
 */
static int nand_id_has_period(u8 *id_data, int arrlen, int period)
{
	int i, j;
	for (i = 0; i < period; i++)
		for (j = i + period; j < arrlen; j += period)
			if (id_data[i] != id_data[j])
				return 0;
	return 1;
}

/*
 * nand_id_len - Get the length of an ID string returned by CMD_READID
 * @id_data: the ID string
 * @arrlen: the length of the @id_data array

 * Returns the length of the ID string, according to known wraparound/trailing
 * zero patterns. If no pattern exists, returns the length of the array.
 */
static int nand_id_len(u8 *id_data, int arrlen)
{
	int last_nonzero, period;

	/* Find last non-zero byte */
	for (last_nonzero = arrlen - 1; last_nonzero >= 0; last_nonzero--)
		if (id_data[last_nonzero])
			break;

	/* All zeros */
	if (last_nonzero < 0)
		return 0;

	/* Calculate wraparound period */
	for (period = 1; period < arrlen; period++)
		if (nand_id_has_period(id_data, arrlen, period))
			break;

	/* There's a repeated pattern */
	if (period < arrlen)
		return period;

	/* There are trailing zeros */
	if (last_nonzero < arrlen - 1)
		return last_nonzero + 1;

	/* No pattern detected */
	return arrlen;
}

2984 2985 2986 2987 2988 2989 2990 2991
/*
 * Many new NAND share similar device ID codes, which represent the size of the
 * chip. The rest of the parameters must be decoded according to generic or
 * manufacturer-specific "extended ID" decoding patterns.
 */
static void nand_decode_ext_id(struct mtd_info *mtd, struct nand_chip *chip,
				u8 id_data[8], int *busw)
{
2992
	int extid, id_len;
2993 2994 2995 2996 2997
	/* The 3rd id byte holds MLC / multichip data */
	chip->cellinfo = id_data[2];
	/* The 4th id byte is the important one */
	extid = id_data[3];

2998 2999
	id_len = nand_id_len(id_data, 8);

3000 3001 3002
	/*
	 * Field definitions are in the following datasheets:
	 * Old style (4,5 byte ID): Samsung K9GAG08U0M (p.32)
3003
	 * New Samsung (6 byte ID): Samsung K9GAG08U0F (p.44)
3004
	 * Hynix MLC   (6 byte ID): Hynix H27UBG8T2B (p.22)
3005
	 *
3006 3007
	 * Check for ID length, non-zero 6th byte, cell type, and Hynix/Samsung
	 * ID to decide what to do.
3008
	 */
3009
	if (id_len == 6 && id_data[0] == NAND_MFR_SAMSUNG &&
3010
			(chip->cellinfo & NAND_CI_CELLTYPE_MSK) &&
3011
			id_data[5] != 0x00) {
3012 3013 3014 3015
		/* Calc pagesize */
		mtd->writesize = 2048 << (extid & 0x03);
		extid >>= 2;
		/* Calc oobsize */
3016
		switch (((extid >> 2) & 0x04) | (extid & 0x03)) {
3017 3018 3019 3020 3021 3022 3023 3024 3025
		case 1:
			mtd->oobsize = 128;
			break;
		case 2:
			mtd->oobsize = 218;
			break;
		case 3:
			mtd->oobsize = 400;
			break;
3026
		case 4:
3027 3028
			mtd->oobsize = 436;
			break;
3029 3030 3031 3032 3033 3034 3035
		case 5:
			mtd->oobsize = 512;
			break;
		case 6:
		default: /* Other cases are "reserved" (unknown) */
			mtd->oobsize = 640;
			break;
3036 3037 3038 3039 3040 3041
		}
		extid >>= 2;
		/* Calc blocksize */
		mtd->erasesize = (128 * 1024) <<
			(((extid >> 1) & 0x04) | (extid & 0x03));
		*busw = 0;
3042 3043 3044 3045 3046 3047 3048 3049 3050 3051 3052 3053 3054 3055 3056 3057 3058 3059 3060 3061 3062 3063 3064 3065 3066 3067 3068 3069 3070 3071 3072 3073 3074 3075 3076 3077 3078 3079 3080 3081 3082
	} else if (id_len == 6 && id_data[0] == NAND_MFR_HYNIX &&
			(chip->cellinfo & NAND_CI_CELLTYPE_MSK)) {
		unsigned int tmp;

		/* Calc pagesize */
		mtd->writesize = 2048 << (extid & 0x03);
		extid >>= 2;
		/* Calc oobsize */
		switch (((extid >> 2) & 0x04) | (extid & 0x03)) {
		case 0:
			mtd->oobsize = 128;
			break;
		case 1:
			mtd->oobsize = 224;
			break;
		case 2:
			mtd->oobsize = 448;
			break;
		case 3:
			mtd->oobsize = 64;
			break;
		case 4:
			mtd->oobsize = 32;
			break;
		case 5:
			mtd->oobsize = 16;
			break;
		default:
			mtd->oobsize = 640;
			break;
		}
		extid >>= 2;
		/* Calc blocksize */
		tmp = ((extid >> 1) & 0x04) | (extid & 0x03);
		if (tmp < 0x03)
			mtd->erasesize = (128 * 1024) << tmp;
		else if (tmp == 0x03)
			mtd->erasesize = 768 * 1024;
		else
			mtd->erasesize = (64 * 1024) << tmp;
		*busw = 0;
3083 3084 3085 3086 3087 3088 3089 3090 3091 3092 3093 3094 3095 3096 3097 3098
	} else {
		/* Calc pagesize */
		mtd->writesize = 1024 << (extid & 0x03);
		extid >>= 2;
		/* Calc oobsize */
		mtd->oobsize = (8 << (extid & 0x01)) *
			(mtd->writesize >> 9);
		extid >>= 2;
		/* Calc blocksize. Blocksize is multiples of 64KiB */
		mtd->erasesize = (64 * 1024) << (extid & 0x03);
		extid >>= 2;
		/* Get buswidth information */
		*busw = (extid & 0x01) ? NAND_BUSWIDTH_16 : 0;
	}
}

3099 3100 3101 3102 3103 3104 3105 3106 3107 3108 3109 3110 3111 3112 3113 3114 3115 3116 3117 3118 3119 3120 3121 3122 3123 3124 3125 3126 3127 3128
/*
 * Old devices have chip data hardcoded in the device ID table. nand_decode_id
 * decodes a matching ID table entry and assigns the MTD size parameters for
 * the chip.
 */
static void nand_decode_id(struct mtd_info *mtd, struct nand_chip *chip,
				struct nand_flash_dev *type, u8 id_data[8],
				int *busw)
{
	int maf_id = id_data[0];

	mtd->erasesize = type->erasesize;
	mtd->writesize = type->pagesize;
	mtd->oobsize = mtd->writesize / 32;
	*busw = type->options & NAND_BUSWIDTH_16;

	/*
	 * Check for Spansion/AMD ID + repeating 5th, 6th byte since
	 * some Spansion chips have erasesize that conflicts with size
	 * listed in nand_ids table.
	 * Data sheet (5 byte ID): Spansion S30ML-P ORNAND (p.39)
	 */
	if (maf_id == NAND_MFR_AMD && id_data[4] != 0x00 && id_data[5] == 0x00
			&& id_data[6] == 0x00 && id_data[7] == 0x00
			&& mtd->writesize == 512) {
		mtd->erasesize = 128 * 1024;
		mtd->erasesize <<= ((id_data[3] & 0x03) << 1);
	}
}

3129 3130 3131 3132 3133 3134 3135 3136 3137 3138 3139 3140 3141 3142 3143 3144 3145 3146 3147 3148 3149 3150 3151 3152 3153 3154 3155 3156 3157 3158 3159 3160 3161 3162 3163 3164 3165
/*
 * Set the bad block marker/indicator (BBM/BBI) patterns according to some
 * heuristic patterns using various detected parameters (e.g., manufacturer,
 * page size, cell-type information).
 */
static void nand_decode_bbm_options(struct mtd_info *mtd,
				    struct nand_chip *chip, u8 id_data[8])
{
	int maf_id = id_data[0];

	/* Set the bad block position */
	if (mtd->writesize > 512 || (chip->options & NAND_BUSWIDTH_16))
		chip->badblockpos = NAND_LARGE_BADBLOCK_POS;
	else
		chip->badblockpos = NAND_SMALL_BADBLOCK_POS;

	/*
	 * Bad block marker is stored in the last page of each block on Samsung
	 * and Hynix MLC devices; stored in first two pages of each block on
	 * Micron devices with 2KiB pages and on SLC Samsung, Hynix, Toshiba,
	 * AMD/Spansion, and Macronix.  All others scan only the first page.
	 */
	if ((chip->cellinfo & NAND_CI_CELLTYPE_MSK) &&
			(maf_id == NAND_MFR_SAMSUNG ||
			 maf_id == NAND_MFR_HYNIX))
		chip->bbt_options |= NAND_BBT_SCANLASTPAGE;
	else if ((!(chip->cellinfo & NAND_CI_CELLTYPE_MSK) &&
				(maf_id == NAND_MFR_SAMSUNG ||
				 maf_id == NAND_MFR_HYNIX ||
				 maf_id == NAND_MFR_TOSHIBA ||
				 maf_id == NAND_MFR_AMD ||
				 maf_id == NAND_MFR_MACRONIX)) ||
			(mtd->writesize == 2048 &&
			 maf_id == NAND_MFR_MICRON))
		chip->bbt_options |= NAND_BBT_SCAN2NDPAGE;
}

T
Thomas Gleixner 已提交
3166
/*
3167
 * Get the flash and manufacturer id and lookup if the type is supported.
T
Thomas Gleixner 已提交
3168 3169
 */
static struct nand_flash_dev *nand_get_flash_type(struct mtd_info *mtd,
3170
						  struct nand_chip *chip,
3171 3172
						  int busw,
						  int *maf_id, int *dev_id,
3173
						  struct nand_flash_dev *type)
T
Thomas Gleixner 已提交
3174
{
3175
	int i, maf_idx;
3176
	u8 id_data[8];
L
Linus Torvalds 已提交
3177 3178

	/* Select the device */
3179
	chip->select_chip(mtd, 0);
L
Linus Torvalds 已提交
3180

3181 3182
	/*
	 * Reset the chip, required by some chips (e.g. Micron MT29FxGxxxxx)
3183
	 * after power-up.
3184 3185 3186
	 */
	chip->cmdfunc(mtd, NAND_CMD_RESET, -1, -1);

L
Linus Torvalds 已提交
3187
	/* Send the command for reading device ID */
3188
	chip->cmdfunc(mtd, NAND_CMD_READID, 0x00, -1);
L
Linus Torvalds 已提交
3189 3190

	/* Read manufacturer and device IDs */
3191
	*maf_id = chip->read_byte(mtd);
3192
	*dev_id = chip->read_byte(mtd);
L
Linus Torvalds 已提交
3193

3194 3195
	/*
	 * Try again to make sure, as some systems the bus-hold or other
3196 3197 3198 3199 3200 3201 3202
	 * interface concerns can cause random data which looks like a
	 * possibly credible NAND flash to appear. If the two results do
	 * not match, ignore the device completely.
	 */

	chip->cmdfunc(mtd, NAND_CMD_READID, 0x00, -1);

3203 3204
	/* Read entire ID string */
	for (i = 0; i < 8; i++)
3205
		id_data[i] = chip->read_byte(mtd);
3206

3207
	if (id_data[0] != *maf_id || id_data[1] != *dev_id) {
3208
		pr_info("%s: second ID read did not match "
3209 3210
			"%02x,%02x against %02x,%02x\n", __func__,
			*maf_id, *dev_id, id_data[0], id_data[1]);
3211 3212 3213
		return ERR_PTR(-ENODEV);
	}

T
Thomas Gleixner 已提交
3214
	if (!type)
3215 3216 3217
		type = nand_flash_ids;

	for (; type->name != NULL; type++)
3218
		if (*dev_id == type->id)
3219
			break;
3220

3221 3222
	chip->onfi_version = 0;
	if (!type->name || !type->pagesize) {
3223
		/* Check is chip is ONFI compliant */
3224
		if (nand_flash_detect_onfi(mtd, chip, &busw))
3225
			goto ident_done;
3226 3227
	}

3228
	if (!type->name)
T
Thomas Gleixner 已提交
3229 3230
		return ERR_PTR(-ENODEV);

3231 3232 3233
	if (!mtd->name)
		mtd->name = type->name;

3234
	chip->chipsize = (uint64_t)type->chipsize << 20;
T
Thomas Gleixner 已提交
3235

3236
	if (!type->pagesize && chip->init_size) {
3237
		/* Set the pagesize, oobsize, erasesize by the driver */
3238 3239
		busw = chip->init_size(mtd, chip, id_data);
	} else if (!type->pagesize) {
3240 3241
		/* Decode parameters from extended ID */
		nand_decode_ext_id(mtd, chip, id_data, &busw);
T
Thomas Gleixner 已提交
3242
	} else {
3243
		nand_decode_id(mtd, chip, type, id_data, &busw);
T
Thomas Gleixner 已提交
3244
	}
3245 3246
	/* Get chip options */
	chip->options |= type->options;
3247

3248 3249 3250
	/*
	 * Check if chip is not a Samsung device. Do not clear the
	 * options for chips which do not have an extended id.
3251 3252 3253 3254 3255
	 */
	if (*maf_id != NAND_MFR_SAMSUNG && !type->pagesize)
		chip->options &= ~NAND_SAMSUNG_LP_OPTIONS;
ident_done:

T
Thomas Gleixner 已提交
3256
	/* Try to identify manufacturer */
3257
	for (maf_idx = 0; nand_manuf_ids[maf_idx].id != 0x0; maf_idx++) {
T
Thomas Gleixner 已提交
3258 3259 3260
		if (nand_manuf_ids[maf_idx].id == *maf_id)
			break;
	}
3261

T
Thomas Gleixner 已提交
3262 3263
	/*
	 * Check, if buswidth is correct. Hardware drivers should set
3264
	 * chip correct!
T
Thomas Gleixner 已提交
3265
	 */
3266
	if (busw != (chip->options & NAND_BUSWIDTH_16)) {
3267
		pr_info("NAND device: Manufacturer ID:"
3268 3269
			" 0x%02x, Chip ID: 0x%02x (%s %s)\n", *maf_id,
			*dev_id, nand_manuf_ids[maf_idx].name, mtd->name);
3270
		pr_warn("NAND bus width %d instead %d bit\n",
3271 3272
			   (chip->options & NAND_BUSWIDTH_16) ? 16 : 8,
			   busw ? 16 : 8);
T
Thomas Gleixner 已提交
3273 3274
		return ERR_PTR(-EINVAL);
	}
3275

3276 3277
	nand_decode_bbm_options(mtd, chip, id_data);

T
Thomas Gleixner 已提交
3278
	/* Calculate the address shift from the page size */
3279
	chip->page_shift = ffs(mtd->writesize) - 1;
3280
	/* Convert chipsize to number of pages per chip -1 */
3281
	chip->pagemask = (chip->chipsize >> chip->page_shift) - 1;
3282

3283
	chip->bbt_erase_shift = chip->phys_erase_shift =
T
Thomas Gleixner 已提交
3284
		ffs(mtd->erasesize) - 1;
3285 3286
	if (chip->chipsize & 0xffffffff)
		chip->chip_shift = ffs((unsigned)chip->chipsize) - 1;
3287 3288 3289 3290
	else {
		chip->chip_shift = ffs((unsigned)(chip->chipsize >> 32));
		chip->chip_shift += 32 - 1;
	}
L
Linus Torvalds 已提交
3291

A
Artem Bityutskiy 已提交
3292 3293
	chip->badblockbits = 8;

T
Thomas Gleixner 已提交
3294
	/* Check for AND chips with 4 page planes */
3295 3296
	if (chip->options & NAND_4PAGE_ARRAY)
		chip->erase_cmd = multi_erase_cmd;
T
Thomas Gleixner 已提交
3297
	else
3298
		chip->erase_cmd = single_erase_cmd;
T
Thomas Gleixner 已提交
3299

3300
	/* Do not replace user supplied command function! */
3301 3302
	if (mtd->writesize > 512 && chip->cmdfunc == nand_command)
		chip->cmdfunc = nand_command_lp;
T
Thomas Gleixner 已提交
3303

3304 3305 3306 3307 3308
	pr_info("NAND device: Manufacturer ID: 0x%02x, Chip ID: 0x%02x (%s %s),"
		" page size: %d, OOB size: %d\n",
		*maf_id, *dev_id, nand_manuf_ids[maf_idx].name,
		chip->onfi_version ? chip->onfi_params.model : type->name,
		mtd->writesize, mtd->oobsize);
T
Thomas Gleixner 已提交
3309 3310 3311 3312 3313

	return type;
}

/**
3314
 * nand_scan_ident - [NAND Interface] Scan for the NAND device
3315 3316 3317
 * @mtd: MTD device structure
 * @maxchips: number of chips to scan for
 * @table: alternative NAND ID table
T
Thomas Gleixner 已提交
3318
 *
3319 3320
 * This is the first phase of the normal nand_scan() function. It reads the
 * flash ID and sets up MTD fields accordingly.
T
Thomas Gleixner 已提交
3321
 *
3322
 * The mtd->owner field must be set to the module of the caller.
T
Thomas Gleixner 已提交
3323
 */
3324 3325
int nand_scan_ident(struct mtd_info *mtd, int maxchips,
		    struct nand_flash_dev *table)
T
Thomas Gleixner 已提交
3326
{
3327
	int i, busw, nand_maf_id, nand_dev_id;
3328
	struct nand_chip *chip = mtd->priv;
T
Thomas Gleixner 已提交
3329 3330 3331
	struct nand_flash_dev *type;

	/* Get buswidth to select the correct functions */
3332
	busw = chip->options & NAND_BUSWIDTH_16;
T
Thomas Gleixner 已提交
3333
	/* Set the default functions */
3334
	nand_set_defaults(chip, busw);
T
Thomas Gleixner 已提交
3335 3336

	/* Read the flash type */
3337 3338
	type = nand_get_flash_type(mtd, chip, busw,
				&nand_maf_id, &nand_dev_id, table);
T
Thomas Gleixner 已提交
3339 3340

	if (IS_ERR(type)) {
3341
		if (!(chip->options & NAND_SCAN_SILENT_NODEV))
3342
			pr_warn("No NAND device found\n");
3343
		chip->select_chip(mtd, -1);
T
Thomas Gleixner 已提交
3344
		return PTR_ERR(type);
L
Linus Torvalds 已提交
3345 3346
	}

3347 3348
	chip->select_chip(mtd, -1);

T
Thomas Gleixner 已提交
3349
	/* Check for a chip array */
3350
	for (i = 1; i < maxchips; i++) {
3351
		chip->select_chip(mtd, i);
3352 3353
		/* See comment in nand_get_flash_type for reset */
		chip->cmdfunc(mtd, NAND_CMD_RESET, -1, -1);
L
Linus Torvalds 已提交
3354
		/* Send the command for reading device ID */
3355
		chip->cmdfunc(mtd, NAND_CMD_READID, 0x00, -1);
L
Linus Torvalds 已提交
3356
		/* Read manufacturer and device IDs */
3357
		if (nand_maf_id != chip->read_byte(mtd) ||
3358 3359
		    nand_dev_id != chip->read_byte(mtd)) {
			chip->select_chip(mtd, -1);
L
Linus Torvalds 已提交
3360
			break;
3361 3362
		}
		chip->select_chip(mtd, -1);
L
Linus Torvalds 已提交
3363 3364
	}
	if (i > 1)
3365
		pr_info("%d NAND chips detected\n", i);
3366

L
Linus Torvalds 已提交
3367
	/* Store the number of chips and calc total size for mtd */
3368 3369
	chip->numchips = i;
	mtd->size = i * chip->chipsize;
T
Thomas Gleixner 已提交
3370

3371 3372
	return 0;
}
3373
EXPORT_SYMBOL(nand_scan_ident);
3374 3375 3376 3377


/**
 * nand_scan_tail - [NAND Interface] Scan for the NAND device
3378
 * @mtd: MTD device structure
3379
 *
3380 3381 3382
 * This is the second phase of the normal nand_scan() function. It fills out
 * all the uninitialized function pointers with the defaults and scans for a
 * bad block table if appropriate.
3383 3384 3385 3386 3387 3388
 */
int nand_scan_tail(struct mtd_info *mtd)
{
	int i;
	struct nand_chip *chip = mtd->priv;

3389 3390 3391 3392
	/* New bad blocks should be marked in OOB, flash-based BBT, or both */
	BUG_ON((chip->bbt_options & NAND_BBT_NO_OOB_BBM) &&
			!(chip->bbt_options & NAND_BBT_USE_FLASH));

3393 3394 3395 3396 3397
	if (!(chip->options & NAND_OWN_BUFFERS))
		chip->buffers = kmalloc(sizeof(*chip->buffers), GFP_KERNEL);
	if (!chip->buffers)
		return -ENOMEM;

3398
	/* Set the internal oob buffer location, just after the page data */
3399
	chip->oob_poi = chip->buffers->databuf + mtd->writesize;
L
Linus Torvalds 已提交
3400

T
Thomas Gleixner 已提交
3401
	/*
3402
	 * If no default placement scheme is given, select an appropriate one.
T
Thomas Gleixner 已提交
3403
	 */
3404
	if (!chip->ecc.layout && (chip->ecc.mode != NAND_ECC_SOFT_BCH)) {
3405
		switch (mtd->oobsize) {
L
Linus Torvalds 已提交
3406
		case 8:
3407
			chip->ecc.layout = &nand_oob_8;
L
Linus Torvalds 已提交
3408 3409
			break;
		case 16:
3410
			chip->ecc.layout = &nand_oob_16;
L
Linus Torvalds 已提交
3411 3412
			break;
		case 64:
3413
			chip->ecc.layout = &nand_oob_64;
L
Linus Torvalds 已提交
3414
			break;
3415 3416 3417
		case 128:
			chip->ecc.layout = &nand_oob_128;
			break;
L
Linus Torvalds 已提交
3418
		default:
3419 3420
			pr_warn("No oob scheme defined for oobsize %d\n",
				   mtd->oobsize);
L
Linus Torvalds 已提交
3421 3422 3423
			BUG();
		}
	}
3424

3425 3426 3427
	if (!chip->write_page)
		chip->write_page = nand_write_page;

3428 3429 3430 3431 3432 3433
	/* set for ONFI nand */
	if (!chip->onfi_set_features)
		chip->onfi_set_features = nand_onfi_set_features;
	if (!chip->onfi_get_features)
		chip->onfi_get_features = nand_onfi_get_features;

3434
	/*
3435
	 * Check ECC mode, default to software if 3byte/512byte hardware ECC is
T
Thomas Gleixner 已提交
3436
	 * selected and we have 256 byte pagesize fallback to software ECC
3437
	 */
3438

3439
	switch (chip->ecc.mode) {
3440 3441 3442 3443
	case NAND_ECC_HW_OOB_FIRST:
		/* Similar to NAND_ECC_HW, but a separate read_page handle */
		if (!chip->ecc.calculate || !chip->ecc.correct ||
		     !chip->ecc.hwctl) {
3444
			pr_warn("No ECC functions supplied; "
3445
				   "hardware ECC not possible\n");
3446 3447 3448 3449 3450
			BUG();
		}
		if (!chip->ecc.read_page)
			chip->ecc.read_page = nand_read_page_hwecc_oob_first;

T
Thomas Gleixner 已提交
3451
	case NAND_ECC_HW:
3452
		/* Use standard hwecc read page function? */
3453 3454
		if (!chip->ecc.read_page)
			chip->ecc.read_page = nand_read_page_hwecc;
3455 3456
		if (!chip->ecc.write_page)
			chip->ecc.write_page = nand_write_page_hwecc;
3457 3458 3459 3460
		if (!chip->ecc.read_page_raw)
			chip->ecc.read_page_raw = nand_read_page_raw;
		if (!chip->ecc.write_page_raw)
			chip->ecc.write_page_raw = nand_write_page_raw;
3461 3462 3463 3464
		if (!chip->ecc.read_oob)
			chip->ecc.read_oob = nand_read_oob_std;
		if (!chip->ecc.write_oob)
			chip->ecc.write_oob = nand_write_oob_std;
3465

T
Thomas Gleixner 已提交
3466
	case NAND_ECC_HW_SYNDROME:
3467 3468 3469
		if ((!chip->ecc.calculate || !chip->ecc.correct ||
		     !chip->ecc.hwctl) &&
		    (!chip->ecc.read_page ||
3470
		     chip->ecc.read_page == nand_read_page_hwecc ||
3471
		     !chip->ecc.write_page ||
3472
		     chip->ecc.write_page == nand_write_page_hwecc)) {
3473
			pr_warn("No ECC functions supplied; "
3474
				   "hardware ECC not possible\n");
T
Thomas Gleixner 已提交
3475 3476
			BUG();
		}
3477
		/* Use standard syndrome read/write page function? */
3478 3479
		if (!chip->ecc.read_page)
			chip->ecc.read_page = nand_read_page_syndrome;
3480 3481
		if (!chip->ecc.write_page)
			chip->ecc.write_page = nand_write_page_syndrome;
3482 3483 3484 3485
		if (!chip->ecc.read_page_raw)
			chip->ecc.read_page_raw = nand_read_page_raw_syndrome;
		if (!chip->ecc.write_page_raw)
			chip->ecc.write_page_raw = nand_write_page_raw_syndrome;
3486 3487 3488 3489
		if (!chip->ecc.read_oob)
			chip->ecc.read_oob = nand_read_oob_syndrome;
		if (!chip->ecc.write_oob)
			chip->ecc.write_oob = nand_write_oob_syndrome;
3490

3491 3492 3493 3494 3495
		if (mtd->writesize >= chip->ecc.size) {
			if (!chip->ecc.strength) {
				pr_warn("Driver must set ecc.strength when using hardware ECC\n");
				BUG();
			}
T
Thomas Gleixner 已提交
3496
			break;
3497
		}
3498
		pr_warn("%d byte HW ECC not possible on "
3499 3500
			   "%d byte page size, fallback to SW ECC\n",
			   chip->ecc.size, mtd->writesize);
3501
		chip->ecc.mode = NAND_ECC_SOFT;
3502

T
Thomas Gleixner 已提交
3503
	case NAND_ECC_SOFT:
3504 3505
		chip->ecc.calculate = nand_calculate_ecc;
		chip->ecc.correct = nand_correct_data;
3506
		chip->ecc.read_page = nand_read_page_swecc;
3507
		chip->ecc.read_subpage = nand_read_subpage;
3508
		chip->ecc.write_page = nand_write_page_swecc;
3509 3510
		chip->ecc.read_page_raw = nand_read_page_raw;
		chip->ecc.write_page_raw = nand_write_page_raw;
3511 3512
		chip->ecc.read_oob = nand_read_oob_std;
		chip->ecc.write_oob = nand_write_oob_std;
3513 3514
		if (!chip->ecc.size)
			chip->ecc.size = 256;
3515
		chip->ecc.bytes = 3;
M
Mike Dunn 已提交
3516
		chip->ecc.strength = 1;
L
Linus Torvalds 已提交
3517
		break;
3518

3519 3520
	case NAND_ECC_SOFT_BCH:
		if (!mtd_nand_has_bch()) {
3521
			pr_warn("CONFIG_MTD_ECC_BCH not enabled\n");
3522 3523 3524 3525 3526 3527 3528 3529 3530 3531 3532 3533 3534 3535
			BUG();
		}
		chip->ecc.calculate = nand_bch_calculate_ecc;
		chip->ecc.correct = nand_bch_correct_data;
		chip->ecc.read_page = nand_read_page_swecc;
		chip->ecc.read_subpage = nand_read_subpage;
		chip->ecc.write_page = nand_write_page_swecc;
		chip->ecc.read_page_raw = nand_read_page_raw;
		chip->ecc.write_page_raw = nand_write_page_raw;
		chip->ecc.read_oob = nand_read_oob_std;
		chip->ecc.write_oob = nand_write_oob_std;
		/*
		 * Board driver should supply ecc.size and ecc.bytes values to
		 * select how many bits are correctable; see nand_bch_init()
3536 3537
		 * for details. Otherwise, default to 4 bits for large page
		 * devices.
3538 3539 3540 3541 3542 3543 3544 3545 3546 3547
		 */
		if (!chip->ecc.size && (mtd->oobsize >= 64)) {
			chip->ecc.size = 512;
			chip->ecc.bytes = 7;
		}
		chip->ecc.priv = nand_bch_init(mtd,
					       chip->ecc.size,
					       chip->ecc.bytes,
					       &chip->ecc.layout);
		if (!chip->ecc.priv) {
3548
			pr_warn("BCH ECC initialization failed!\n");
3549 3550
			BUG();
		}
M
Mike Dunn 已提交
3551
		chip->ecc.strength =
3552
			chip->ecc.bytes * 8 / fls(8 * chip->ecc.size);
3553 3554
		break;

3555
	case NAND_ECC_NONE:
3556
		pr_warn("NAND_ECC_NONE selected by board driver. "
3557
			   "This is not recommended!\n");
3558 3559
		chip->ecc.read_page = nand_read_page_raw;
		chip->ecc.write_page = nand_write_page_raw;
3560
		chip->ecc.read_oob = nand_read_oob_std;
3561 3562
		chip->ecc.read_page_raw = nand_read_page_raw;
		chip->ecc.write_page_raw = nand_write_page_raw;
3563
		chip->ecc.write_oob = nand_write_oob_std;
3564 3565
		chip->ecc.size = mtd->writesize;
		chip->ecc.bytes = 0;
M
Mike Dunn 已提交
3566
		chip->ecc.strength = 0;
L
Linus Torvalds 已提交
3567
		break;
3568

L
Linus Torvalds 已提交
3569
	default:
3570
		pr_warn("Invalid NAND_ECC_MODE %d\n", chip->ecc.mode);
3571
		BUG();
L
Linus Torvalds 已提交
3572
	}
3573

3574
	/* For many systems, the standard OOB write also works for raw */
3575 3576
	if (!chip->ecc.read_oob_raw)
		chip->ecc.read_oob_raw = chip->ecc.read_oob;
3577 3578 3579
	if (!chip->ecc.write_oob_raw)
		chip->ecc.write_oob_raw = chip->ecc.write_oob;

3580 3581
	/*
	 * The number of bytes available for a client to place data into
3582
	 * the out of band area.
3583 3584
	 */
	chip->ecc.layout->oobavail = 0;
3585 3586
	for (i = 0; chip->ecc.layout->oobfree[i].length
			&& i < ARRAY_SIZE(chip->ecc.layout->oobfree); i++)
3587 3588
		chip->ecc.layout->oobavail +=
			chip->ecc.layout->oobfree[i].length;
V
Vitaly Wool 已提交
3589
	mtd->oobavail = chip->ecc.layout->oobavail;
3590

T
Thomas Gleixner 已提交
3591 3592
	/*
	 * Set the number of read / write steps for one page depending on ECC
3593
	 * mode.
T
Thomas Gleixner 已提交
3594
	 */
3595
	chip->ecc.steps = mtd->writesize / chip->ecc.size;
3596
	if (chip->ecc.steps * chip->ecc.size != mtd->writesize) {
3597
		pr_warn("Invalid ECC parameters\n");
T
Thomas Gleixner 已提交
3598
		BUG();
L
Linus Torvalds 已提交
3599
	}
3600
	chip->ecc.total = chip->ecc.steps * chip->ecc.bytes;
3601

3602
	/* Allow subpage writes up to ecc.steps. Not possible for MLC flash */
3603 3604
	if (!(chip->options & NAND_NO_SUBPAGE_WRITE) &&
	    !(chip->cellinfo & NAND_CI_CELLTYPE_MSK)) {
3605
		switch (chip->ecc.steps) {
3606 3607 3608 3609 3610
		case 2:
			mtd->subpage_sft = 1;
			break;
		case 4:
		case 8:
3611
		case 16:
3612 3613 3614 3615 3616 3617
			mtd->subpage_sft = 2;
			break;
		}
	}
	chip->subpagesize = mtd->writesize >> mtd->subpage_sft;

3618
	/* Initialize state */
3619
	chip->state = FL_READY;
L
Linus Torvalds 已提交
3620 3621

	/* Invalidate the pagebuffer reference */
3622
	chip->pagebuf = -1;
L
Linus Torvalds 已提交
3623

3624 3625 3626 3627
	/* Large page NAND with SOFT_ECC should support subpage reads */
	if ((chip->ecc.mode == NAND_ECC_SOFT) && (chip->page_shift > 9))
		chip->options |= NAND_SUBPAGE_READ;

L
Linus Torvalds 已提交
3628 3629
	/* Fill in remaining MTD driver data */
	mtd->type = MTD_NANDFLASH;
3630 3631
	mtd->flags = (chip->options & NAND_ROM) ? MTD_CAP_ROM :
						MTD_CAP_NANDFLASH;
3632 3633 3634 3635 3636 3637 3638 3639 3640 3641 3642 3643 3644 3645 3646
	mtd->_erase = nand_erase;
	mtd->_point = NULL;
	mtd->_unpoint = NULL;
	mtd->_read = nand_read;
	mtd->_write = nand_write;
	mtd->_panic_write = panic_nand_write;
	mtd->_read_oob = nand_read_oob;
	mtd->_write_oob = nand_write_oob;
	mtd->_sync = nand_sync;
	mtd->_lock = NULL;
	mtd->_unlock = NULL;
	mtd->_suspend = nand_suspend;
	mtd->_resume = nand_resume;
	mtd->_block_isbad = nand_block_isbad;
	mtd->_block_markbad = nand_block_markbad;
3647
	mtd->writebufsize = mtd->writesize;
L
Linus Torvalds 已提交
3648

M
Mike Dunn 已提交
3649
	/* propagate ecc info to mtd_info */
3650
	mtd->ecclayout = chip->ecc.layout;
3651
	mtd->ecc_strength = chip->ecc.strength;
3652 3653 3654 3655 3656 3657 3658
	/*
	 * Initialize bitflip_threshold to its default prior scan_bbt() call.
	 * scan_bbt() might invoke mtd_read(), thus bitflip_threshold must be
	 * properly set.
	 */
	if (!mtd->bitflip_threshold)
		mtd->bitflip_threshold = mtd->ecc_strength;
L
Linus Torvalds 已提交
3659

3660
	/* Check, if we should skip the bad block table scan */
3661
	if (chip->options & NAND_SKIP_BBTSCAN)
3662
		return 0;
L
Linus Torvalds 已提交
3663 3664

	/* Build bad block table */
3665
	return chip->scan_bbt(mtd);
L
Linus Torvalds 已提交
3666
}
3667
EXPORT_SYMBOL(nand_scan_tail);
L
Linus Torvalds 已提交
3668

3669 3670
/*
 * is_module_text_address() isn't exported, and it's mostly a pointless
3671
 * test if this is a module _anyway_ -- they'd have to try _really_ hard
3672 3673
 * to call us from in-kernel code if the core NAND support is modular.
 */
3674 3675 3676 3677
#ifdef MODULE
#define caller_is_module() (1)
#else
#define caller_is_module() \
3678
	is_module_text_address((unsigned long)__builtin_return_address(0))
3679 3680 3681 3682
#endif

/**
 * nand_scan - [NAND Interface] Scan for the NAND device
3683 3684
 * @mtd: MTD device structure
 * @maxchips: number of chips to scan for
3685
 *
3686 3687 3688 3689
 * This fills out all the uninitialized function pointers with the defaults.
 * The flash ID is read and the mtd/chip structures are filled with the
 * appropriate values. The mtd->owner field must be set to the module of the
 * caller.
3690 3691 3692 3693 3694 3695 3696
 */
int nand_scan(struct mtd_info *mtd, int maxchips)
{
	int ret;

	/* Many callers got this wrong, so check for it for a while... */
	if (!mtd->owner && caller_is_module()) {
3697
		pr_crit("%s called with NULL mtd->owner!\n", __func__);
3698 3699 3700
		BUG();
	}

3701
	ret = nand_scan_ident(mtd, maxchips, NULL);
3702 3703 3704 3705
	if (!ret)
		ret = nand_scan_tail(mtd);
	return ret;
}
3706
EXPORT_SYMBOL(nand_scan);
3707

L
Linus Torvalds 已提交
3708
/**
3709
 * nand_release - [NAND Interface] Free resources held by the NAND device
3710 3711
 * @mtd: MTD device structure
 */
3712
void nand_release(struct mtd_info *mtd)
L
Linus Torvalds 已提交
3713
{
3714
	struct nand_chip *chip = mtd->priv;
L
Linus Torvalds 已提交
3715

3716 3717 3718
	if (chip->ecc.mode == NAND_ECC_SOFT_BCH)
		nand_bch_free((struct nand_bch_control *)chip->ecc.priv);

3719
	mtd_device_unregister(mtd);
L
Linus Torvalds 已提交
3720

J
Jesper Juhl 已提交
3721
	/* Free bad block table memory */
3722
	kfree(chip->bbt);
3723 3724
	if (!(chip->options & NAND_OWN_BUFFERS))
		kfree(chip->buffers);
3725 3726 3727 3728 3729

	/* Free bad block descriptor memory */
	if (chip->badblock_pattern && chip->badblock_pattern->options
			& NAND_BBT_DYNAMICSTRUCT)
		kfree(chip->badblock_pattern);
L
Linus Torvalds 已提交
3730
}
3731
EXPORT_SYMBOL_GPL(nand_release);
3732 3733 3734 3735 3736 3737 3738 3739 3740 3741 3742 3743 3744 3745 3746

static int __init nand_base_init(void)
{
	led_trigger_register_simple("nand-disk", &nand_led_trigger);
	return 0;
}

static void __exit nand_base_exit(void)
{
	led_trigger_unregister_simple(nand_led_trigger);
}

module_init(nand_base_init);
module_exit(nand_base_exit);

3747
MODULE_LICENSE("GPL");
3748 3749
MODULE_AUTHOR("Steven J. Hill <sjhill@realitydiluted.com>");
MODULE_AUTHOR("Thomas Gleixner <tglx@linutronix.de>");
3750
MODULE_DESCRIPTION("Generic NAND flash driver code");