nand_base.c 91.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
		ret = -EINVAL;
	}

	/* Do not allow past end of device */
	if (ofs + len > mtd->size) {
128
		pr_debug("%s: past end of device\n", __func__);
129 130 131 132 133 134
		ret = -EINVAL;
	}

	return ret;
}

L
Linus Torvalds 已提交
135 136
/**
 * nand_release_device - [GENERIC] release chip
137
 * @mtd: MTD device structure
138
 *
139
 * Deselect, release chip lock and wake up anyone waiting on the device.
L
Linus Torvalds 已提交
140
 */
141
static void nand_release_device(struct mtd_info *mtd)
L
Linus Torvalds 已提交
142
{
143
	struct nand_chip *chip = mtd->priv;
L
Linus Torvalds 已提交
144 145

	/* De-select the NAND device */
146
	chip->select_chip(mtd, -1);
147

T
Thomas Gleixner 已提交
148
	/* Release the controller and the chip */
149 150 151 152 153
	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 已提交
154 155 156 157
}

/**
 * nand_read_byte - [DEFAULT] read one byte from the chip
158
 * @mtd: MTD device structure
L
Linus Torvalds 已提交
159
 *
160
 * Default read function for 8bit buswidth
L
Linus Torvalds 已提交
161
 */
162
static uint8_t nand_read_byte(struct mtd_info *mtd)
L
Linus Torvalds 已提交
163
{
164 165
	struct nand_chip *chip = mtd->priv;
	return readb(chip->IO_ADDR_R);
L
Linus Torvalds 已提交
166 167 168 169
}

/**
 * nand_read_byte16 - [DEFAULT] read one byte endianess aware from the chip
170
 * nand_read_byte16 - [DEFAULT] read one byte endianness aware from the chip
171
 * @mtd: MTD device structure
L
Linus Torvalds 已提交
172
 *
173 174
 * Default read function for 16bit buswidth with endianness conversion.
 *
L
Linus Torvalds 已提交
175
 */
176
static uint8_t nand_read_byte16(struct mtd_info *mtd)
L
Linus Torvalds 已提交
177
{
178 179
	struct nand_chip *chip = mtd->priv;
	return (uint8_t) cpu_to_le16(readw(chip->IO_ADDR_R));
L
Linus Torvalds 已提交
180 181 182 183
}

/**
 * nand_read_word - [DEFAULT] read one word from the chip
184
 * @mtd: MTD device structure
L
Linus Torvalds 已提交
185
 *
186
 * Default read function for 16bit buswidth without endianness conversion.
L
Linus Torvalds 已提交
187 188 189
 */
static u16 nand_read_word(struct mtd_info *mtd)
{
190 191
	struct nand_chip *chip = mtd->priv;
	return readw(chip->IO_ADDR_R);
L
Linus Torvalds 已提交
192 193 194 195
}

/**
 * nand_select_chip - [DEFAULT] control CE line
196 197
 * @mtd: MTD device structure
 * @chipnr: chipnumber to select, -1 for deselect
L
Linus Torvalds 已提交
198 199 200
 *
 * Default select function for 1 chip devices.
 */
201
static void nand_select_chip(struct mtd_info *mtd, int chipnr)
L
Linus Torvalds 已提交
202
{
203 204 205
	struct nand_chip *chip = mtd->priv;

	switch (chipnr) {
L
Linus Torvalds 已提交
206
	case -1:
207
		chip->cmd_ctrl(mtd, NAND_CMD_NONE, 0 | NAND_CTRL_CHANGE);
L
Linus Torvalds 已提交
208 209 210 211 212 213 214 215 216 217 218
		break;
	case 0:
		break;

	default:
		BUG();
	}
}

/**
 * nand_write_buf - [DEFAULT] write buffer to chip
219 220 221
 * @mtd: MTD device structure
 * @buf: data buffer
 * @len: number of bytes to write
L
Linus Torvalds 已提交
222
 *
223
 * Default write function for 8bit buswidth.
L
Linus Torvalds 已提交
224
 */
225
static void nand_write_buf(struct mtd_info *mtd, const uint8_t *buf, int len)
L
Linus Torvalds 已提交
226 227
{
	int i;
228
	struct nand_chip *chip = mtd->priv;
L
Linus Torvalds 已提交
229

230
	for (i = 0; i < len; i++)
231
		writeb(buf[i], chip->IO_ADDR_W);
L
Linus Torvalds 已提交
232 233 234
}

/**
235
 * nand_read_buf - [DEFAULT] read chip data into buffer
236 237 238
 * @mtd: MTD device structure
 * @buf: buffer to store date
 * @len: number of bytes to read
L
Linus Torvalds 已提交
239
 *
240
 * Default read function for 8bit buswidth.
L
Linus Torvalds 已提交
241
 */
242
static void nand_read_buf(struct mtd_info *mtd, uint8_t *buf, int len)
L
Linus Torvalds 已提交
243 244
{
	int i;
245
	struct nand_chip *chip = mtd->priv;
L
Linus Torvalds 已提交
246

247
	for (i = 0; i < len; i++)
248
		buf[i] = readb(chip->IO_ADDR_R);
L
Linus Torvalds 已提交
249 250 251
}

/**
252
 * nand_verify_buf - [DEFAULT] Verify chip data against buffer
253 254 255
 * @mtd: MTD device structure
 * @buf: buffer containing the data to compare
 * @len: number of bytes to compare
L
Linus Torvalds 已提交
256
 *
257
 * Default verify function for 8bit buswidth.
L
Linus Torvalds 已提交
258
 */
259
static int nand_verify_buf(struct mtd_info *mtd, const uint8_t *buf, int len)
L
Linus Torvalds 已提交
260 261
{
	int i;
262
	struct nand_chip *chip = mtd->priv;
L
Linus Torvalds 已提交
263

264
	for (i = 0; i < len; i++)
265
		if (buf[i] != readb(chip->IO_ADDR_R))
L
Linus Torvalds 已提交
266 267 268 269 270 271
			return -EFAULT;
	return 0;
}

/**
 * nand_write_buf16 - [DEFAULT] write buffer to chip
272 273 274
 * @mtd: MTD device structure
 * @buf: data buffer
 * @len: number of bytes to write
L
Linus Torvalds 已提交
275
 *
276
 * Default write function for 16bit buswidth.
L
Linus Torvalds 已提交
277
 */
278
static void nand_write_buf16(struct mtd_info *mtd, const uint8_t *buf, int len)
L
Linus Torvalds 已提交
279 280
{
	int i;
281
	struct nand_chip *chip = mtd->priv;
L
Linus Torvalds 已提交
282 283
	u16 *p = (u16 *) buf;
	len >>= 1;
284

285
	for (i = 0; i < len; i++)
286
		writew(p[i], chip->IO_ADDR_W);
287

L
Linus Torvalds 已提交
288 289 290
}

/**
291
 * nand_read_buf16 - [DEFAULT] read chip data into buffer
292 293 294
 * @mtd: MTD device structure
 * @buf: buffer to store date
 * @len: number of bytes to read
L
Linus Torvalds 已提交
295
 *
296
 * Default read function for 16bit buswidth.
L
Linus Torvalds 已提交
297
 */
298
static void nand_read_buf16(struct mtd_info *mtd, uint8_t *buf, int len)
L
Linus Torvalds 已提交
299 300
{
	int i;
301
	struct nand_chip *chip = mtd->priv;
L
Linus Torvalds 已提交
302 303 304
	u16 *p = (u16 *) buf;
	len >>= 1;

305
	for (i = 0; i < len; i++)
306
		p[i] = readw(chip->IO_ADDR_R);
L
Linus Torvalds 已提交
307 308 309
}

/**
310
 * nand_verify_buf16 - [DEFAULT] Verify chip data against buffer
311 312 313
 * @mtd: MTD device structure
 * @buf: buffer containing the data to compare
 * @len: number of bytes to compare
L
Linus Torvalds 已提交
314
 *
315
 * Default verify function for 16bit buswidth.
L
Linus Torvalds 已提交
316
 */
317
static int nand_verify_buf16(struct mtd_info *mtd, const uint8_t *buf, int len)
L
Linus Torvalds 已提交
318 319
{
	int i;
320
	struct nand_chip *chip = mtd->priv;
L
Linus Torvalds 已提交
321 322 323
	u16 *p = (u16 *) buf;
	len >>= 1;

324
	for (i = 0; i < len; i++)
325
		if (p[i] != readw(chip->IO_ADDR_R))
L
Linus Torvalds 已提交
326 327 328 329 330 331 332
			return -EFAULT;

	return 0;
}

/**
 * nand_block_bad - [DEFAULT] Read bad block marker from the chip
333 334 335
 * @mtd: MTD device structure
 * @ofs: offset from device start
 * @getchip: 0, if the chip is already selected
L
Linus Torvalds 已提交
336
 *
337
 * Check, if the block is bad.
L
Linus Torvalds 已提交
338 339 340 341
 */
static int nand_block_bad(struct mtd_info *mtd, loff_t ofs, int getchip)
{
	int page, chipnr, res = 0;
342
	struct nand_chip *chip = mtd->priv;
L
Linus Torvalds 已提交
343 344
	u16 bad;

345
	if (chip->bbt_options & NAND_BBT_SCANLASTPAGE)
346 347
		ofs += mtd->erasesize - mtd->writesize;

348 349
	page = (int)(ofs >> chip->page_shift) & chip->pagemask;

L
Linus Torvalds 已提交
350
	if (getchip) {
351
		chipnr = (int)(ofs >> chip->chip_shift);
L
Linus Torvalds 已提交
352

353
		nand_get_device(chip, mtd, FL_READING);
L
Linus Torvalds 已提交
354 355

		/* Select the NAND device */
356
		chip->select_chip(mtd, chipnr);
357
	}
L
Linus Torvalds 已提交
358

359 360
	if (chip->options & NAND_BUSWIDTH_16) {
		chip->cmdfunc(mtd, NAND_CMD_READOOB, chip->badblockpos & 0xFE,
361
			      page);
362 363
		bad = cpu_to_le16(chip->read_word(mtd));
		if (chip->badblockpos & 0x1)
364
			bad >>= 8;
365 366
		else
			bad &= 0xFF;
L
Linus Torvalds 已提交
367
	} else {
368
		chip->cmdfunc(mtd, NAND_CMD_READOOB, chip->badblockpos, page);
369
		bad = chip->read_byte(mtd);
L
Linus Torvalds 已提交
370
	}
371

372 373 374 375 376
	if (likely(chip->badblockbits == 8))
		res = bad != 0xFF;
	else
		res = hweight8(bad) < chip->badblockbits;

377
	if (getchip)
L
Linus Torvalds 已提交
378
		nand_release_device(mtd);
379

L
Linus Torvalds 已提交
380 381 382 383 384
	return res;
}

/**
 * nand_default_block_markbad - [DEFAULT] mark a block bad
385 386
 * @mtd: MTD device structure
 * @ofs: offset from device start
L
Linus Torvalds 已提交
387
 *
388 389
 * This is the default implementation, which can be overridden by a hardware
 * specific driver.
L
Linus Torvalds 已提交
390 391 392
*/
static int nand_default_block_markbad(struct mtd_info *mtd, loff_t ofs)
{
393
	struct nand_chip *chip = mtd->priv;
394
	uint8_t buf[2] = { 0, 0 };
395
	int block, ret, i = 0;
396

397
	if (chip->bbt_options & NAND_BBT_SCANLASTPAGE)
398 399
		ofs += mtd->erasesize - mtd->writesize;

L
Linus Torvalds 已提交
400
	/* Get block number */
401
	block = (int)(ofs >> chip->bbt_erase_shift);
402 403
	if (chip->bbt)
		chip->bbt[block >> 2] |= 0x01 << ((block & 0x03) << 1);
L
Linus Torvalds 已提交
404

405
	/* Do we have a flash based bad block table? */
406
	if (chip->bbt_options & NAND_BBT_USE_FLASH)
407 408
		ret = nand_update_bbt(mtd, ofs);
	else {
409 410
		struct mtd_oob_ops ops;

411
		nand_get_device(chip, mtd, FL_WRITING);
412

413 414 415 416 417
		/*
		 * Write to first two pages if necessary. If we write to more
		 * than one location, the first error encountered quits the
		 * procedure. We write two bytes per location, so we dont have
		 * to mess with 16 bit access.
418
		 */
419 420 421 422
		ops.len = ops.ooblen = 2;
		ops.datbuf = NULL;
		ops.oobbuf = buf;
		ops.ooboffs = chip->badblockpos & ~0x01;
B
Brian Norris 已提交
423
		ops.mode = MTD_OPS_PLACE_OOB;
424
		do {
425
			ret = nand_do_write_oob(mtd, ofs, &ops);
426 427 428

			i++;
			ofs += mtd->writesize;
429
		} while (!ret && (chip->bbt_options & NAND_BBT_SCAN2NDPAGE) &&
430 431
				i < 2);

432
		nand_release_device(mtd);
433 434 435
	}
	if (!ret)
		mtd->ecc_stats.badblocks++;
436

437
	return ret;
L
Linus Torvalds 已提交
438 439
}

440
/**
L
Linus Torvalds 已提交
441
 * nand_check_wp - [GENERIC] check if the chip is write protected
442
 * @mtd: MTD device structure
L
Linus Torvalds 已提交
443
 *
444 445
 * Check, if the device is write protected. The function expects, that the
 * device is already selected.
L
Linus Torvalds 已提交
446
 */
447
static int nand_check_wp(struct mtd_info *mtd)
L
Linus Torvalds 已提交
448
{
449
	struct nand_chip *chip = mtd->priv;
450

451
	/* Broken xD cards report WP despite being writable */
452 453 454
	if (chip->options & NAND_BROKEN_XD)
		return 0;

L
Linus Torvalds 已提交
455
	/* Check the WP bit */
456 457
	chip->cmdfunc(mtd, NAND_CMD_STATUS, -1, -1);
	return (chip->read_byte(mtd) & NAND_STATUS_WP) ? 0 : 1;
L
Linus Torvalds 已提交
458 459 460 461
}

/**
 * nand_block_checkbad - [GENERIC] Check if a block is marked bad
462 463 464 465
 * @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 已提交
466 467 468 469
 *
 * Check, if the block is bad. Either by reading the bad block table or
 * calling of the scan function.
 */
470 471
static int nand_block_checkbad(struct mtd_info *mtd, loff_t ofs, int getchip,
			       int allowbbt)
L
Linus Torvalds 已提交
472
{
473
	struct nand_chip *chip = mtd->priv;
474

475 476
	if (!chip->bbt)
		return chip->block_bad(mtd, ofs, getchip);
477

L
Linus Torvalds 已提交
478
	/* Return info from the table */
479
	return nand_isbad_bbt(mtd, ofs, allowbbt);
L
Linus Torvalds 已提交
480 481
}

482 483
/**
 * panic_nand_wait_ready - [GENERIC] Wait for the ready pin after commands.
484 485
 * @mtd: MTD device structure
 * @timeo: Timeout
486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503
 *
 * 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);
	}
}

504
/* Wait for the ready pin, after a command. The timeout is caught later. */
505
void nand_wait_ready(struct mtd_info *mtd)
506
{
507
	struct nand_chip *chip = mtd->priv;
508
	unsigned long timeo = jiffies + 2;
509

510 511 512 513
	/* 400ms timeout */
	if (in_interrupt() || oops_in_progress)
		return panic_nand_wait_ready(mtd, 400);

514
	led_trigger_event(nand_led_trigger, LED_FULL);
515
	/* Wait until command is processed or timeout occurs */
516
	do {
517
		if (chip->dev_ready(mtd))
518
			break;
I
Ingo Molnar 已提交
519
		touch_softlockup_watchdog();
520
	} while (time_before(jiffies, timeo));
521
	led_trigger_event(nand_led_trigger, LED_OFF);
522
}
523
EXPORT_SYMBOL_GPL(nand_wait_ready);
524

L
Linus Torvalds 已提交
525 526
/**
 * nand_command - [DEFAULT] Send command to NAND device
527 528 529 530
 * @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 已提交
531
 *
532 533
 * Send command to NAND device. This function is used for small page devices
 * (256/512 Bytes per page).
L
Linus Torvalds 已提交
534
 */
535 536
static void nand_command(struct mtd_info *mtd, unsigned int command,
			 int column, int page_addr)
L
Linus Torvalds 已提交
537
{
538
	register struct nand_chip *chip = mtd->priv;
539
	int ctrl = NAND_CTRL_CLE | NAND_CTRL_CHANGE;
L
Linus Torvalds 已提交
540

541
	/* Write out the command to the device */
L
Linus Torvalds 已提交
542 543 544
	if (command == NAND_CMD_SEQIN) {
		int readcmd;

J
Joern Engel 已提交
545
		if (column >= mtd->writesize) {
L
Linus Torvalds 已提交
546
			/* OOB area */
J
Joern Engel 已提交
547
			column -= mtd->writesize;
L
Linus Torvalds 已提交
548 549 550 551 552 553 554 555
			readcmd = NAND_CMD_READOOB;
		} else if (column < 256) {
			/* First 256 bytes --> READ0 */
			readcmd = NAND_CMD_READ0;
		} else {
			column -= 256;
			readcmd = NAND_CMD_READ1;
		}
556
		chip->cmd_ctrl(mtd, readcmd, ctrl);
557
		ctrl &= ~NAND_CTRL_CHANGE;
L
Linus Torvalds 已提交
558
	}
559
	chip->cmd_ctrl(mtd, command, ctrl);
L
Linus Torvalds 已提交
560

561
	/* Address cycle, when necessary */
562 563 564 565
	ctrl = NAND_CTRL_ALE | NAND_CTRL_CHANGE;
	/* Serially input address */
	if (column != -1) {
		/* Adjust columns for 16 bit buswidth */
566
		if (chip->options & NAND_BUSWIDTH_16)
567
			column >>= 1;
568
		chip->cmd_ctrl(mtd, column, ctrl);
569 570 571
		ctrl &= ~NAND_CTRL_CHANGE;
	}
	if (page_addr != -1) {
572
		chip->cmd_ctrl(mtd, page_addr, ctrl);
573
		ctrl &= ~NAND_CTRL_CHANGE;
574
		chip->cmd_ctrl(mtd, page_addr >> 8, ctrl);
575
		/* One more address cycle for devices > 32MiB */
576 577
		if (chip->chipsize > (32 << 20))
			chip->cmd_ctrl(mtd, page_addr >> 16, ctrl);
L
Linus Torvalds 已提交
578
	}
579
	chip->cmd_ctrl(mtd, NAND_CMD_NONE, NAND_NCE | NAND_CTRL_CHANGE);
580 581

	/*
582 583
	 * Program and erase have their own busy handlers status and sequential
	 * in needs no delay
584
	 */
L
Linus Torvalds 已提交
585
	switch (command) {
586

L
Linus Torvalds 已提交
587 588 589 590 591 592 593 594
	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:
595
		if (chip->dev_ready)
L
Linus Torvalds 已提交
596
			break;
597 598
		udelay(chip->chip_delay);
		chip->cmd_ctrl(mtd, NAND_CMD_STATUS,
599
			       NAND_CTRL_CLE | NAND_CTRL_CHANGE);
600 601
		chip->cmd_ctrl(mtd,
			       NAND_CMD_NONE, NAND_NCE | NAND_CTRL_CHANGE);
602 603
		while (!(chip->read_byte(mtd) & NAND_STATUS_READY))
				;
L
Linus Torvalds 已提交
604 605
		return;

606
		/* This applies to read commands */
L
Linus Torvalds 已提交
607
	default:
608
		/*
L
Linus Torvalds 已提交
609 610
		 * If we don't have access to the busy pin, we apply the given
		 * command delay
611
		 */
612 613
		if (!chip->dev_ready) {
			udelay(chip->chip_delay);
L
Linus Torvalds 已提交
614
			return;
615
		}
L
Linus Torvalds 已提交
616
	}
617 618 619 620
	/*
	 * Apply this short delay always to ensure that we do wait tWB in
	 * any case on any machine.
	 */
621
	ndelay(100);
622 623

	nand_wait_ready(mtd);
L
Linus Torvalds 已提交
624 625 626 627
}

/**
 * nand_command_lp - [DEFAULT] Send command to NAND large page device
628 629 630 631
 * @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 已提交
632
 *
633
 * Send command to NAND device. This is the version for the new large page
634 635
 * 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 已提交
636
 */
637 638
static void nand_command_lp(struct mtd_info *mtd, unsigned int command,
			    int column, int page_addr)
L
Linus Torvalds 已提交
639
{
640
	register struct nand_chip *chip = mtd->priv;
L
Linus Torvalds 已提交
641 642 643

	/* Emulate NAND_CMD_READOOB */
	if (command == NAND_CMD_READOOB) {
J
Joern Engel 已提交
644
		column += mtd->writesize;
L
Linus Torvalds 已提交
645 646
		command = NAND_CMD_READ0;
	}
647

648
	/* Command latch cycle */
649
	chip->cmd_ctrl(mtd, command & 0xff,
650
		       NAND_NCE | NAND_CLE | NAND_CTRL_CHANGE);
L
Linus Torvalds 已提交
651 652

	if (column != -1 || page_addr != -1) {
653
		int ctrl = NAND_CTRL_CHANGE | NAND_NCE | NAND_ALE;
L
Linus Torvalds 已提交
654 655 656 657

		/* Serially input address */
		if (column != -1) {
			/* Adjust columns for 16 bit buswidth */
658
			if (chip->options & NAND_BUSWIDTH_16)
L
Linus Torvalds 已提交
659
				column >>= 1;
660
			chip->cmd_ctrl(mtd, column, ctrl);
661
			ctrl &= ~NAND_CTRL_CHANGE;
662
			chip->cmd_ctrl(mtd, column >> 8, ctrl);
663
		}
L
Linus Torvalds 已提交
664
		if (page_addr != -1) {
665 666
			chip->cmd_ctrl(mtd, page_addr, ctrl);
			chip->cmd_ctrl(mtd, page_addr >> 8,
667
				       NAND_NCE | NAND_ALE);
L
Linus Torvalds 已提交
668
			/* One more address cycle for devices > 128MiB */
669 670
			if (chip->chipsize > (128 << 20))
				chip->cmd_ctrl(mtd, page_addr >> 16,
671
					       NAND_NCE | NAND_ALE);
L
Linus Torvalds 已提交
672 673
		}
	}
674
	chip->cmd_ctrl(mtd, NAND_CMD_NONE, NAND_NCE | NAND_CTRL_CHANGE);
675 676

	/*
677 678
	 * Program and erase have their own busy handlers status, sequential
	 * in, and deplete1 need no delay.
679
	 */
L
Linus Torvalds 已提交
680
	switch (command) {
681

L
Linus Torvalds 已提交
682 683 684 685 686
	case NAND_CMD_CACHEDPROG:
	case NAND_CMD_PAGEPROG:
	case NAND_CMD_ERASE1:
	case NAND_CMD_ERASE2:
	case NAND_CMD_SEQIN:
687
	case NAND_CMD_RNDIN:
L
Linus Torvalds 已提交
688
	case NAND_CMD_STATUS:
689
	case NAND_CMD_DEPLETE1:
L
Linus Torvalds 已提交
690 691
		return;

692 693 694 695 696
	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:
697
		/* Read error status commands require only a short delay */
698
		udelay(chip->chip_delay);
699
		return;
L
Linus Torvalds 已提交
700 701

	case NAND_CMD_RESET:
702
		if (chip->dev_ready)
L
Linus Torvalds 已提交
703
			break;
704
		udelay(chip->chip_delay);
705 706 707 708
		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);
709 710
		while (!(chip->read_byte(mtd) & NAND_STATUS_READY))
				;
L
Linus Torvalds 已提交
711 712
		return;

713 714 715 716 717 718 719 720
	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 已提交
721
	case NAND_CMD_READ0:
722 723 724 725
		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);
726

727
		/* This applies to read commands */
L
Linus Torvalds 已提交
728
	default:
729
		/*
L
Linus Torvalds 已提交
730
		 * If we don't have access to the busy pin, we apply the given
731
		 * command delay.
732
		 */
733 734
		if (!chip->dev_ready) {
			udelay(chip->chip_delay);
L
Linus Torvalds 已提交
735
			return;
736
		}
L
Linus Torvalds 已提交
737
	}
738

739 740 741 742
	/*
	 * Apply this short delay always to ensure that we do wait tWB in
	 * any case on any machine.
	 */
743
	ndelay(100);
744 745

	nand_wait_ready(mtd);
L
Linus Torvalds 已提交
746 747
}

748 749
/**
 * panic_nand_get_device - [GENERIC] Get chip for selected access
750 751 752
 * @chip: the nand chip descriptor
 * @mtd: MTD device structure
 * @new_state: the state which is requested
753 754 755 756 757 758
 *
 * 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)
{
759
	/* Hardware controller shared among independent devices */
760 761 762 763
	chip->controller->active = chip;
	chip->state = new_state;
}

L
Linus Torvalds 已提交
764 765
/**
 * nand_get_device - [GENERIC] Get chip for selected access
766 767 768
 * @chip: the nand chip descriptor
 * @mtd: MTD device structure
 * @new_state: the state which is requested
L
Linus Torvalds 已提交
769 770 771
 *
 * Get the device and lock it for exclusive access
 */
772
static int
773
nand_get_device(struct nand_chip *chip, struct mtd_info *mtd, int new_state)
L
Linus Torvalds 已提交
774
{
775 776
	spinlock_t *lock = &chip->controller->lock;
	wait_queue_head_t *wq = &chip->controller->wq;
777
	DECLARE_WAITQUEUE(wait, current);
778
retry:
779 780
	spin_lock(lock);

781
	/* Hardware controller shared among independent devices */
782 783
	if (!chip->controller->active)
		chip->controller->active = chip;
T
Thomas Gleixner 已提交
784

785 786
	if (chip->controller->active == chip && chip->state == FL_READY) {
		chip->state = new_state;
787
		spin_unlock(lock);
788 789 790
		return 0;
	}
	if (new_state == FL_PM_SUSPENDED) {
791 792 793 794 795
		if (chip->controller->active->state == FL_PM_SUSPENDED) {
			chip->state = FL_PM_SUSPENDED;
			spin_unlock(lock);
			return 0;
		}
796 797 798 799 800 801
	}
	set_current_state(TASK_UNINTERRUPTIBLE);
	add_wait_queue(wq, &wait);
	spin_unlock(lock);
	schedule();
	remove_wait_queue(wq, &wait);
L
Linus Torvalds 已提交
802 803 804
	goto retry;
}

805
/**
806 807 808 809
 * panic_nand_wait - [GENERIC] wait until the command is done
 * @mtd: MTD device structure
 * @chip: NAND chip structure
 * @timeo: timeout
810 811 812
 *
 * 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
813
 * an oops through mtdoops.
814 815 816 817 818 819 820 821 822 823 824 825 826 827
 */
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);
828
	}
829 830
}

L
Linus Torvalds 已提交
831
/**
832 833 834
 * nand_wait - [DEFAULT] wait until the command is done
 * @mtd: MTD device structure
 * @chip: NAND chip structure
L
Linus Torvalds 已提交
835
 *
836 837 838
 * 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 已提交
839
 */
840
static int nand_wait(struct mtd_info *mtd, struct nand_chip *chip)
L
Linus Torvalds 已提交
841 842
{

843
	unsigned long timeo = jiffies;
844
	int status, state = chip->state;
845

L
Linus Torvalds 已提交
846
	if (state == FL_ERASING)
847
		timeo += (HZ * 400) / 1000;
L
Linus Torvalds 已提交
848
	else
849
		timeo += (HZ * 20) / 1000;
L
Linus Torvalds 已提交
850

851 852
	led_trigger_event(nand_led_trigger, LED_FULL);

853 854 855 856
	/*
	 * Apply this short delay always to ensure that we do wait tWB in any
	 * case on any machine.
	 */
857
	ndelay(100);
L
Linus Torvalds 已提交
858

859 860
	if ((state == FL_ERASING) && (chip->options & NAND_IS_AND))
		chip->cmdfunc(mtd, NAND_CMD_STATUS_MULTI, -1, -1);
861
	else
862
		chip->cmdfunc(mtd, NAND_CMD_STATUS, -1, -1);
L
Linus Torvalds 已提交
863

864 865 866 867 868 869 870 871 872 873 874 875
	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 已提交
876 877
		}
	}
878 879
	led_trigger_event(nand_led_trigger, LED_OFF);

880
	status = (int)chip->read_byte(mtd);
L
Linus Torvalds 已提交
881 882 883
	return status;
}

884
/**
885 886 887 888
 * __nand_unlock - [REPLACEABLE] unlocks specified locked blocks
 * @mtd: mtd info
 * @ofs: offset to start unlock from
 * @len: length to unlock
889 890 891 892
 * @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
893
 *
894
 * Returs unlock status.
895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915
 */
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 */
	if (status & 0x01) {
916
		pr_debug("%s: error status = 0x%08x\n",
917 918 919 920 921 922 923 924
					__func__, status);
		ret = -EIO;
	}

	return ret;
}

/**
925 926 927 928
 * nand_unlock - [REPLACEABLE] unlocks specified locked blocks
 * @mtd: mtd info
 * @ofs: offset to start unlock from
 * @len: length to unlock
929
 *
930
 * Returns unlock status.
931 932 933 934 935 936 937
 */
int nand_unlock(struct mtd_info *mtd, loff_t ofs, uint64_t len)
{
	int ret = 0;
	int chipnr;
	struct nand_chip *chip = mtd->priv;

938
	pr_debug("%s: start = 0x%012llx, len = %llu\n",
939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956
			__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)) {
957
		pr_debug("%s: device is write protected!\n",
958 959 960 961 962 963 964 965 966 967 968 969
					__func__);
		ret = -EIO;
		goto out;
	}

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

out:
	nand_release_device(mtd);

	return ret;
}
970
EXPORT_SYMBOL(nand_unlock);
971 972

/**
973 974 975 976
 * nand_lock - [REPLACEABLE] locks all blocks present in the device
 * @mtd: mtd info
 * @ofs: offset to start unlock from
 * @len: length to unlock
977
 *
978 979 980 981
 * 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.
982
 *
983
 * Returns lock status.
984 985 986 987 988 989 990
 */
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;

991
	pr_debug("%s: start = 0x%012llx, len = %llu\n",
992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005
			__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)) {
1006
		pr_debug("%s: device is write protected!\n",
1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020
					__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 */
	if (status & 0x01) {
1021
		pr_debug("%s: error status = 0x%08x\n",
1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033
					__func__, status);
		ret = -EIO;
		goto out;
	}

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

out:
	nand_release_device(mtd);

	return ret;
}
1034
EXPORT_SYMBOL(nand_lock);
1035

1036
/**
1037
 * nand_read_page_raw - [INTERN] read raw page data without ecc
1038 1039 1040 1041
 * @mtd: mtd info structure
 * @chip: nand chip info structure
 * @buf: buffer to store read data
 * @page: page number to read
1042
 *
1043
 * Not for syndrome calculating ECC controllers, which use a special oob layout.
1044 1045
 */
static int nand_read_page_raw(struct mtd_info *mtd, struct nand_chip *chip,
1046
			      uint8_t *buf, int page)
1047 1048 1049 1050 1051 1052
{
	chip->read_buf(mtd, buf, mtd->writesize);
	chip->read_buf(mtd, chip->oob_poi, mtd->oobsize);
	return 0;
}

1053
/**
1054
 * nand_read_page_raw_syndrome - [INTERN] read raw page data without ecc
1055 1056 1057 1058
 * @mtd: mtd info structure
 * @chip: nand chip info structure
 * @buf: buffer to store read data
 * @page: page number to read
1059 1060 1061
 *
 * We need a special oob layout and handling even when OOB isn't used.
 */
1062 1063 1064
static int nand_read_page_raw_syndrome(struct mtd_info *mtd,
					struct nand_chip *chip,
					uint8_t *buf, int page)
1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095
{
	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 已提交
1096
/**
1097
 * nand_read_page_swecc - [REPLACEABLE] software ECC based page read function
1098 1099 1100 1101
 * @mtd: mtd info structure
 * @chip: nand chip info structure
 * @buf: buffer to store read data
 * @page: page number to read
1102
 */
1103
static int nand_read_page_swecc(struct mtd_info *mtd, struct nand_chip *chip,
1104
				uint8_t *buf, int page)
L
Linus Torvalds 已提交
1105
{
1106 1107 1108 1109
	int i, eccsize = chip->ecc.size;
	int eccbytes = chip->ecc.bytes;
	int eccsteps = chip->ecc.steps;
	uint8_t *p = buf;
1110 1111
	uint8_t *ecc_calc = chip->buffers->ecccalc;
	uint8_t *ecc_code = chip->buffers->ecccode;
1112
	uint32_t *eccpos = chip->ecc.layout->eccpos;
1113

1114
	chip->ecc.read_page_raw(mtd, chip, buf, page);
1115 1116 1117 1118 1119

	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++)
1120
		ecc_code[i] = chip->oob_poi[eccpos[i]];
1121 1122 1123 1124 1125 1126 1127 1128

	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]);
1129
		if (stat < 0)
1130 1131 1132 1133 1134
			mtd->ecc_stats.failed++;
		else
			mtd->ecc_stats.corrected += stat;
	}
	return 0;
1135
}
L
Linus Torvalds 已提交
1136

1137
/**
1138
 * nand_read_subpage - [REPLACEABLE] software ECC based sub-page read function
1139 1140 1141 1142 1143
 * @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
1144
 */
1145 1146
static int nand_read_subpage(struct mtd_info *mtd, struct nand_chip *chip,
			uint32_t data_offs, uint32_t readlen, uint8_t *bufpoi)
1147 1148 1149 1150 1151 1152 1153
{
	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;
1154
	int index = 0;
1155

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

1161
	/* Data size aligned to ECC ecc.size */
1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172
	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);

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

1177 1178
	/*
	 * The performance is faster if we position offsets according to
1179
	 * ecc.pos. Let's make sure that there are no gaps in ECC positions.
1180
	 */
1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191
	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 {
1192
		/*
1193
		 * Send the command to read the particular ECC bytes take care
1194 1195
		 * about buswidth alignment in read_buf.
		 */
1196 1197 1198
		index = start_step * chip->ecc.bytes;

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

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

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

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

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

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

	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 已提交
1251
	}
1252
	chip->read_buf(mtd, chip->oob_poi, mtd->oobsize);
L
Linus Torvalds 已提交
1253

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

1257 1258
	eccsteps = chip->ecc.steps;
	p = buf;
1259

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

1263
		stat = chip->ecc.correct(mtd, p, &ecc_code[i], &ecc_calc[i]);
1264
		if (stat < 0)
1265 1266 1267 1268 1269 1270
			mtd->ecc_stats.failed++;
		else
			mtd->ecc_stats.corrected += stat;
	}
	return 0;
}
L
Linus Torvalds 已提交
1271

1272
/**
1273
 * nand_read_page_hwecc_oob_first - [REPLACEABLE] hw ecc, read oob first
1274 1275 1276 1277
 * @mtd: mtd info structure
 * @chip: nand chip info structure
 * @buf: buffer to store read data
 * @page: page number to read
1278
 *
1279 1280 1281 1282 1283
 * 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.
1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319
 */
static int nand_read_page_hwecc_oob_first(struct mtd_info *mtd,
	struct nand_chip *chip, uint8_t *buf, int page)
{
	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;

	/* 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);
		if (stat < 0)
			mtd->ecc_stats.failed++;
		else
			mtd->ecc_stats.corrected += stat;
	}
	return 0;
}

1320
/**
1321
 * nand_read_page_syndrome - [REPLACEABLE] hardware ECC syndrome based page read
1322 1323 1324 1325
 * @mtd: mtd info structure
 * @chip: nand chip info structure
 * @buf: buffer to store read data
 * @page: page number to read
1326
 *
1327 1328
 * The hw generator calculates the error syndrome automatically. Therefore we
 * need a special oob layout and handling.
1329 1330
 */
static int nand_read_page_syndrome(struct mtd_info *mtd, struct nand_chip *chip,
1331
				   uint8_t *buf, int page)
1332 1333 1334 1335 1336
{
	int i, eccsize = chip->ecc.size;
	int eccbytes = chip->ecc.bytes;
	int eccsteps = chip->ecc.steps;
	uint8_t *p = buf;
1337
	uint8_t *oob = chip->oob_poi;
L
Linus Torvalds 已提交
1338

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

1342 1343
		chip->ecc.hwctl(mtd, NAND_ECC_READ);
		chip->read_buf(mtd, p, eccsize);
L
Linus Torvalds 已提交
1344

1345 1346 1347 1348
		if (chip->ecc.prepad) {
			chip->read_buf(mtd, oob, chip->ecc.prepad);
			oob += chip->ecc.prepad;
		}
L
Linus Torvalds 已提交
1349

1350 1351 1352
		chip->ecc.hwctl(mtd, NAND_ECC_READSYN);
		chip->read_buf(mtd, oob, eccbytes);
		stat = chip->ecc.correct(mtd, p, oob, NULL);
1353

1354
		if (stat < 0)
1355
			mtd->ecc_stats.failed++;
1356
		else
1357
			mtd->ecc_stats.corrected += stat;
1358

1359
		oob += eccbytes;
L
Linus Torvalds 已提交
1360

1361 1362 1363
		if (chip->ecc.postpad) {
			chip->read_buf(mtd, oob, chip->ecc.postpad);
			oob += chip->ecc.postpad;
1364
		}
1365
	}
L
Linus Torvalds 已提交
1366

1367
	/* Calculate remaining oob bytes */
1368
	i = mtd->oobsize - (oob - chip->oob_poi);
1369 1370
	if (i)
		chip->read_buf(mtd, oob, i);
1371

1372 1373
	return 0;
}
L
Linus Torvalds 已提交
1374

1375
/**
1376
 * nand_transfer_oob - [INTERN] Transfer oob to client buffer
1377 1378 1379 1380
 * @chip: nand chip structure
 * @oob: oob destination address
 * @ops: oob ops structure
 * @len: size of oob to transfer
1381 1382
 */
static uint8_t *nand_transfer_oob(struct nand_chip *chip, uint8_t *oob,
1383
				  struct mtd_oob_ops *ops, size_t len)
1384
{
1385
	switch (ops->mode) {
1386

1387 1388
	case MTD_OPS_PLACE_OOB:
	case MTD_OPS_RAW:
1389 1390 1391
		memcpy(oob, chip->oob_poi + ops->ooboffs, len);
		return oob + len;

1392
	case MTD_OPS_AUTO_OOB: {
1393
		struct nand_oobfree *free = chip->ecc.layout->oobfree;
1394 1395
		uint32_t boffs = 0, roffs = ops->ooboffs;
		size_t bytes = 0;
1396

1397
		for (; free->length && len; free++, len -= bytes) {
1398
			/* Read request not from offset 0? */
1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412
			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);
1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423
			oob += bytes;
		}
		return oob;
	}
	default:
		BUG();
	}
	return NULL;
}

/**
1424
 * nand_do_read_ops - [INTERN] Read data with ECC
1425 1426 1427
 * @mtd: MTD device structure
 * @from: offset to read from
 * @ops: oob ops structure
1428 1429 1430
 *
 * Internal function. Called with chip held.
 */
1431 1432
static int nand_do_read_ops(struct mtd_info *mtd, loff_t from,
			    struct mtd_oob_ops *ops)
1433 1434 1435 1436 1437 1438 1439
{
	int chipnr, page, realpage, col, bytes, aligned;
	struct nand_chip *chip = mtd->priv;
	struct mtd_ecc_stats stats;
	int blkcheck = (1 << (chip->phys_erase_shift - chip->page_shift)) - 1;
	int sndcmd = 1;
	int ret = 0;
1440
	uint32_t readlen = ops->len;
1441
	uint32_t oobreadlen = ops->ooblen;
1442
	uint32_t max_oobsize = ops->mode == MTD_OPS_AUTO_OOB ?
1443 1444
		mtd->oobavail : mtd->oobsize;

1445
	uint8_t *bufpoi, *oob, *buf;
L
Linus Torvalds 已提交
1446

1447
	stats = mtd->ecc_stats;
L
Linus Torvalds 已提交
1448

1449 1450
	chipnr = (int)(from >> chip->chip_shift);
	chip->select_chip(mtd, chipnr);
1451

1452 1453
	realpage = (int)(from >> chip->page_shift);
	page = realpage & chip->pagemask;
L
Linus Torvalds 已提交
1454

1455
	col = (int)(from & (mtd->writesize - 1));
1456

1457 1458 1459
	buf = ops->datbuf;
	oob = ops->oobbuf;

1460
	while (1) {
1461 1462
		bytes = min(mtd->writesize - col, readlen);
		aligned = (bytes == mtd->writesize);
1463

1464
		/* Is the current page in the buffer? */
1465
		if (realpage != chip->pagebuf || oob) {
1466
			bufpoi = aligned ? buf : chip->buffers->databuf;
1467

1468 1469 1470
			if (likely(sndcmd)) {
				chip->cmdfunc(mtd, NAND_CMD_READ0, 0x00, page);
				sndcmd = 0;
L
Linus Torvalds 已提交
1471 1472
			}

1473
			/* Now read the page into the buffer */
1474
			if (unlikely(ops->mode == MTD_OPS_RAW))
1475 1476
				ret = chip->ecc.read_page_raw(mtd, chip,
							      bufpoi, page);
1477
			else if (!aligned && NAND_SUBPAGE_READ(chip) && !oob)
1478 1479
				ret = chip->ecc.read_subpage(mtd, chip,
							col, bytes, bufpoi);
1480
			else
1481 1482
				ret = chip->ecc.read_page(mtd, chip, bufpoi,
							  page);
1483 1484 1485 1486
			if (ret < 0) {
				if (!aligned)
					/* Invalidate page cache */
					chip->pagebuf = -1;
L
Linus Torvalds 已提交
1487
				break;
1488
			}
1489 1490 1491

			/* Transfer not aligned data */
			if (!aligned) {
1492
				if (!NAND_SUBPAGE_READ(chip) && !oob &&
1493 1494
				    !(mtd->ecc_stats.failed - stats.failed) &&
				    (ops->mode != MTD_OPS_RAW))
1495
					chip->pagebuf = realpage;
1496 1497 1498
				else
					/* Invalidate page cache */
					chip->pagebuf = -1;
1499
				memcpy(buf, chip->buffers->databuf + col, bytes);
1500 1501
			}

1502 1503 1504
			buf += bytes;

			if (unlikely(oob)) {
1505

1506 1507 1508 1509 1510 1511 1512
				int toread = min(oobreadlen, max_oobsize);

				if (toread) {
					oob = nand_transfer_oob(chip,
						oob, ops, toread);
					oobreadlen -= toread;
				}
1513 1514
			}

1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526
			if (!(chip->options & NAND_NO_READRDY)) {
				/*
				 * Apply delay or wait for ready/busy pin. Do
				 * this before the AUTOINCR check, so no
				 * problems arise if a chip which does auto
				 * increment is marked as NOAUTOINCR by the
				 * board driver.
				 */
				if (!chip->dev_ready)
					udelay(chip->chip_delay);
				else
					nand_wait_ready(mtd);
L
Linus Torvalds 已提交
1527
			}
1528
		} else {
1529
			memcpy(buf, chip->buffers->databuf + col, bytes);
1530 1531
			buf += bytes;
		}
L
Linus Torvalds 已提交
1532

1533
		readlen -= bytes;
1534

1535
		if (!readlen)
1536
			break;
L
Linus Torvalds 已提交
1537

1538
		/* For subsequent reads align to page boundary */
L
Linus Torvalds 已提交
1539 1540 1541 1542
		col = 0;
		/* Increment page address */
		realpage++;

1543
		page = realpage & chip->pagemask;
L
Linus Torvalds 已提交
1544 1545 1546
		/* Check, if we cross a chip boundary */
		if (!page) {
			chipnr++;
1547 1548
			chip->select_chip(mtd, -1);
			chip->select_chip(mtd, chipnr);
L
Linus Torvalds 已提交
1549
		}
1550

1551 1552 1553
		/*
		 * Check, if the chip supports auto page increment or if we
		 * have hit a block boundary.
1554
		 */
1555
		if (!NAND_CANAUTOINCR(chip) || !(page & blkcheck))
1556
			sndcmd = 1;
L
Linus Torvalds 已提交
1557 1558
	}

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

1563 1564 1565
	if (ret)
		return ret;

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

	return  mtd->ecc_stats.corrected - stats.corrected ? -EUCLEAN : 0;
1570 1571 1572
}

/**
L
Lucas De Marchi 已提交
1573
 * nand_read - [MTD Interface] MTD compatibility function for nand_do_read_ecc
1574 1575 1576 1577 1578
 * @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
1579
 *
1580
 * Get hold of the chip and call nand_do_read.
1581 1582 1583 1584
 */
static int nand_read(struct mtd_info *mtd, loff_t from, size_t len,
		     size_t *retlen, uint8_t *buf)
{
1585
	struct nand_chip *chip = mtd->priv;
1586
	struct mtd_oob_ops ops;
1587 1588 1589 1590 1591 1592 1593 1594
	int ret;

	/* Do not allow reads past end of device */
	if ((from + len) > mtd->size)
		return -EINVAL;
	if (!len)
		return 0;

1595
	nand_get_device(chip, mtd, FL_READING);
1596

1597 1598 1599
	ops.len = len;
	ops.datbuf = buf;
	ops.oobbuf = NULL;
B
Brian Norris 已提交
1600
	ops.mode = 0;
1601

1602
	ret = nand_do_read_ops(mtd, from, &ops);
1603

1604
	*retlen = ops.retlen;
R
Richard Purdie 已提交
1605

1606 1607 1608
	nand_release_device(mtd);

	return ret;
L
Linus Torvalds 已提交
1609 1610
}

1611
/**
1612
 * nand_read_oob_std - [REPLACEABLE] the most common OOB data read function
1613 1614 1615 1616
 * @mtd: mtd info structure
 * @chip: nand chip info structure
 * @page: page number to read
 * @sndcmd: flag whether to issue read command or not
1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629
 */
static int nand_read_oob_std(struct mtd_info *mtd, struct nand_chip *chip,
			     int page, int sndcmd)
{
	if (sndcmd) {
		chip->cmdfunc(mtd, NAND_CMD_READOOB, 0, page);
		sndcmd = 0;
	}
	chip->read_buf(mtd, chip->oob_poi, mtd->oobsize);
	return sndcmd;
}

/**
1630
 * nand_read_oob_syndrome - [REPLACEABLE] OOB data read function for HW ECC
1631
 *			    with syndromes
1632 1633 1634 1635
 * @mtd: mtd info structure
 * @chip: nand chip info structure
 * @page: page number to read
 * @sndcmd: flag whether to issue read command or not
1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668
 */
static int nand_read_oob_syndrome(struct mtd_info *mtd, struct nand_chip *chip,
				  int page, int sndcmd)
{
	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);

	return 1;
}

/**
1669
 * nand_write_oob_std - [REPLACEABLE] the most common OOB data write function
1670 1671 1672
 * @mtd: mtd info structure
 * @chip: nand chip info structure
 * @page: page number to write
1673 1674 1675 1676 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686 1687
 */
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 已提交
1688
	return status & NAND_STATUS_FAIL ? -EIO : 0;
1689 1690 1691
}

/**
1692
 * nand_write_oob_syndrome - [REPLACEABLE] OOB data write function for HW ECC
1693 1694 1695 1696
 *			     with syndrome - only for large page flash
 * @mtd: mtd info structure
 * @chip: nand chip info structure
 * @page: page number to write
1697 1698 1699 1700 1701 1702 1703 1704 1705 1706 1707 1708 1709 1710 1711 1712 1713 1714
 */
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
1715
		pos = eccsize;
1716 1717 1718 1719 1720 1721 1722 1723 1724 1725 1726 1727 1728 1729 1730 1731 1732 1733 1734 1735 1736 1737 1738 1739 1740 1741 1742 1743 1744 1745 1746 1747 1748 1749

	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 已提交
1750
/**
1751
 * nand_do_read_oob - [INTERN] NAND read out-of-band
1752 1753 1754
 * @mtd: MTD device structure
 * @from: offset to read from
 * @ops: oob operations description structure
L
Linus Torvalds 已提交
1755
 *
1756
 * NAND read out-of-band data from the spare area.
L
Linus Torvalds 已提交
1757
 */
1758 1759
static int nand_do_read_oob(struct mtd_info *mtd, loff_t from,
			    struct mtd_oob_ops *ops)
L
Linus Torvalds 已提交
1760
{
1761
	int page, realpage, chipnr, sndcmd = 1;
1762
	struct nand_chip *chip = mtd->priv;
1763
	struct mtd_ecc_stats stats;
1764
	int blkcheck = (1 << (chip->phys_erase_shift - chip->page_shift)) - 1;
1765 1766
	int readlen = ops->ooblen;
	int len;
1767
	uint8_t *buf = ops->oobbuf;
1768

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

1772 1773
	stats = mtd->ecc_stats;

1774
	if (ops->mode == MTD_OPS_AUTO_OOB)
1775
		len = chip->ecc.layout->oobavail;
1776 1777 1778 1779
	else
		len = mtd->oobsize;

	if (unlikely(ops->ooboffs >= len)) {
1780 1781
		pr_debug("%s: attempt to start read outside oob\n",
				__func__);
1782 1783 1784 1785 1786 1787 1788
		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)) {
1789 1790
		pr_debug("%s: attempt to read beyond end of device\n",
				__func__);
1791 1792
		return -EINVAL;
	}
1793

1794
	chipnr = (int)(from >> chip->chip_shift);
1795
	chip->select_chip(mtd, chipnr);
L
Linus Torvalds 已提交
1796

1797 1798 1799
	/* Shift to get page */
	realpage = (int)(from >> chip->page_shift);
	page = realpage & chip->pagemask;
L
Linus Torvalds 已提交
1800

1801
	while (1) {
1802
		if (ops->mode == MTD_OPS_RAW)
1803 1804 1805
			sndcmd = chip->ecc.read_oob_raw(mtd, chip, page, sndcmd);
		else
			sndcmd = chip->ecc.read_oob(mtd, chip, page, sndcmd);
1806 1807 1808

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

1810 1811 1812 1813 1814 1815
		if (!(chip->options & NAND_NO_READRDY)) {
			/*
			 * Apply delay or wait for ready/busy pin. Do this
			 * before the AUTOINCR check, so no problems arise if a
			 * chip which does auto increment is marked as
			 * NOAUTOINCR by the board driver.
1816
			 */
1817 1818
			if (!chip->dev_ready)
				udelay(chip->chip_delay);
1819 1820
			else
				nand_wait_ready(mtd);
1821
		}
1822

1823
		readlen -= len;
S
Savin Zlobec 已提交
1824 1825 1826
		if (!readlen)
			break;

1827 1828 1829 1830 1831 1832 1833 1834 1835
		/* 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 已提交
1836
		}
1837

1838 1839 1840
		/*
		 * Check, if the chip supports auto page increment or if we
		 * have hit a block boundary.
1841 1842 1843
		 */
		if (!NAND_CANAUTOINCR(chip) || !(page & blkcheck))
			sndcmd = 1;
L
Linus Torvalds 已提交
1844 1845
	}

1846
	ops->oobretlen = ops->ooblen;
1847 1848 1849 1850 1851

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

	return  mtd->ecc_stats.corrected - stats.corrected ? -EUCLEAN : 0;
L
Linus Torvalds 已提交
1852 1853 1854
}

/**
1855
 * nand_read_oob - [MTD Interface] NAND read data and/or out-of-band
1856 1857 1858
 * @mtd: MTD device structure
 * @from: offset to read from
 * @ops: oob operation description structure
L
Linus Torvalds 已提交
1859
 *
1860
 * NAND read data and/or out-of-band data.
L
Linus Torvalds 已提交
1861
 */
1862 1863
static int nand_read_oob(struct mtd_info *mtd, loff_t from,
			 struct mtd_oob_ops *ops)
L
Linus Torvalds 已提交
1864
{
1865
	struct nand_chip *chip = mtd->priv;
1866 1867 1868
	int ret = -ENOTSUPP;

	ops->retlen = 0;
L
Linus Torvalds 已提交
1869 1870

	/* Do not allow reads past end of device */
1871
	if (ops->datbuf && (from + ops->len) > mtd->size) {
1872 1873
		pr_debug("%s: attempt to read beyond end of device\n",
				__func__);
L
Linus Torvalds 已提交
1874 1875 1876
		return -EINVAL;
	}

1877
	nand_get_device(chip, mtd, FL_READING);
L
Linus Torvalds 已提交
1878

1879
	switch (ops->mode) {
1880 1881 1882
	case MTD_OPS_PLACE_OOB:
	case MTD_OPS_AUTO_OOB:
	case MTD_OPS_RAW:
1883
		break;
L
Linus Torvalds 已提交
1884

1885 1886 1887
	default:
		goto out;
	}
L
Linus Torvalds 已提交
1888

1889 1890 1891 1892
	if (!ops->datbuf)
		ret = nand_do_read_oob(mtd, from, ops);
	else
		ret = nand_do_read_ops(mtd, from, ops);
1893

1894
out:
1895 1896 1897
	nand_release_device(mtd);
	return ret;
}
1898

L
Linus Torvalds 已提交
1899

1900
/**
1901
 * nand_write_page_raw - [INTERN] raw page write function
1902 1903 1904
 * @mtd: mtd info structure
 * @chip: nand chip info structure
 * @buf: data buffer
1905
 *
1906
 * Not for syndrome calculating ECC controllers, which use a special oob layout.
1907 1908 1909 1910 1911 1912
 */
static void nand_write_page_raw(struct mtd_info *mtd, struct nand_chip *chip,
				const uint8_t *buf)
{
	chip->write_buf(mtd, buf, mtd->writesize);
	chip->write_buf(mtd, chip->oob_poi, mtd->oobsize);
L
Linus Torvalds 已提交
1913 1914
}

1915
/**
1916
 * nand_write_page_raw_syndrome - [INTERN] raw page write function
1917 1918 1919
 * @mtd: mtd info structure
 * @chip: nand chip info structure
 * @buf: data buffer
1920 1921 1922
 *
 * We need a special oob layout and handling even when ECC isn't checked.
 */
1923 1924 1925
static void nand_write_page_raw_syndrome(struct mtd_info *mtd,
					struct nand_chip *chip,
					const uint8_t *buf)
1926 1927 1928 1929 1930 1931 1932 1933 1934 1935 1936 1937 1938 1939 1940 1941 1942 1943 1944 1945 1946 1947 1948 1949 1950 1951 1952 1953
{
	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);
}
1954
/**
1955
 * nand_write_page_swecc - [REPLACEABLE] software ECC based page write function
1956 1957 1958
 * @mtd: mtd info structure
 * @chip: nand chip info structure
 * @buf: data buffer
1959
 */
1960 1961
static void nand_write_page_swecc(struct mtd_info *mtd, struct nand_chip *chip,
				  const uint8_t *buf)
1962
{
1963 1964 1965
	int i, eccsize = chip->ecc.size;
	int eccbytes = chip->ecc.bytes;
	int eccsteps = chip->ecc.steps;
1966
	uint8_t *ecc_calc = chip->buffers->ecccalc;
1967
	const uint8_t *p = buf;
1968
	uint32_t *eccpos = chip->ecc.layout->eccpos;
1969

1970
	/* Software ECC calculation */
1971 1972
	for (i = 0; eccsteps; eccsteps--, i += eccbytes, p += eccsize)
		chip->ecc.calculate(mtd, p, &ecc_calc[i]);
1973

1974 1975
	for (i = 0; i < chip->ecc.total; i++)
		chip->oob_poi[eccpos[i]] = ecc_calc[i];
1976

1977
	chip->ecc.write_page_raw(mtd, chip, buf);
1978
}
1979

1980
/**
1981
 * nand_write_page_hwecc - [REPLACEABLE] hardware ECC based page write function
1982 1983 1984
 * @mtd: mtd info structure
 * @chip: nand chip info structure
 * @buf: data buffer
1985 1986 1987 1988 1989 1990 1991
 */
static void nand_write_page_hwecc(struct mtd_info *mtd, struct nand_chip *chip,
				  const uint8_t *buf)
{
	int i, eccsize = chip->ecc.size;
	int eccbytes = chip->ecc.bytes;
	int eccsteps = chip->ecc.steps;
1992
	uint8_t *ecc_calc = chip->buffers->ecccalc;
1993
	const uint8_t *p = buf;
1994
	uint32_t *eccpos = chip->ecc.layout->eccpos;
1995

1996 1997
	for (i = 0; eccsteps; eccsteps--, i += eccbytes, p += eccsize) {
		chip->ecc.hwctl(mtd, NAND_ECC_WRITE);
1998
		chip->write_buf(mtd, p, eccsize);
1999
		chip->ecc.calculate(mtd, p, &ecc_calc[i]);
2000 2001
	}

2002 2003 2004 2005
	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);
2006 2007
}

2008
/**
2009
 * nand_write_page_syndrome - [REPLACEABLE] hardware ECC syndrome based page write
2010 2011 2012
 * @mtd: mtd info structure
 * @chip: nand chip info structure
 * @buf: data buffer
L
Linus Torvalds 已提交
2013
 *
2014 2015
 * The hw generator calculates the error syndrome automatically. Therefore we
 * need a special oob layout and handling.
2016 2017 2018
 */
static void nand_write_page_syndrome(struct mtd_info *mtd,
				    struct nand_chip *chip, const uint8_t *buf)
L
Linus Torvalds 已提交
2019
{
2020 2021 2022 2023 2024
	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 已提交
2025

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

2028 2029
		chip->ecc.hwctl(mtd, NAND_ECC_WRITE);
		chip->write_buf(mtd, p, eccsize);
2030

2031 2032 2033 2034 2035 2036 2037 2038 2039 2040 2041 2042
		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 已提交
2043 2044
		}
	}
2045 2046

	/* Calculate remaining oob bytes */
2047
	i = mtd->oobsize - (oob - chip->oob_poi);
2048 2049 2050 2051 2052
	if (i)
		chip->write_buf(mtd, oob, i);
}

/**
2053
 * nand_write_page - [REPLACEABLE] write one page
2054 2055 2056 2057 2058 2059
 * @mtd: MTD device structure
 * @chip: NAND chip descriptor
 * @buf: the data to write
 * @page: page number to write
 * @cached: cached programming
 * @raw: use _raw version of write_page
2060 2061
 */
static int nand_write_page(struct mtd_info *mtd, struct nand_chip *chip,
2062
			   const uint8_t *buf, int page, int cached, int raw)
2063 2064 2065 2066 2067
{
	int status;

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

2068 2069 2070 2071
	if (unlikely(raw))
		chip->ecc.write_page_raw(mtd, chip, buf);
	else
		chip->ecc.write_page(mtd, chip, buf);
2072 2073

	/*
2074
	 * Cached progamming disabled for now. Not sure if it's worth the
2075
	 * trouble. The speed gain is not very impressive. (2.3->2.6Mib/s).
2076 2077 2078 2079 2080 2081
	 */
	cached = 0;

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

		chip->cmdfunc(mtd, NAND_CMD_PAGEPROG, -1, -1);
2082
		status = chip->waitfunc(mtd, chip);
2083 2084
		/*
		 * See if operation failed and additional status checks are
2085
		 * available.
2086 2087 2088 2089 2090 2091 2092 2093 2094
		 */
		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);
2095
		status = chip->waitfunc(mtd, chip);
2096 2097 2098 2099 2100 2101 2102 2103 2104 2105
	}

#ifdef CONFIG_MTD_NAND_VERIFY_WRITE
	/* Send command to read back the data */
	chip->cmdfunc(mtd, NAND_CMD_READ0, 0, page);

	if (chip->verify_buf(mtd, buf, mtd->writesize))
		return -EIO;
#endif
	return 0;
L
Linus Torvalds 已提交
2106 2107
}

2108
/**
2109
 * nand_fill_oob - [INTERN] Transfer client buffer to oob
2110
 * @mtd: MTD device structure
2111 2112 2113
 * @oob: oob data buffer
 * @len: oob data write length
 * @ops: oob ops structure
2114
 */
2115 2116
static uint8_t *nand_fill_oob(struct mtd_info *mtd, uint8_t *oob, size_t len,
			      struct mtd_oob_ops *ops)
2117
{
2118 2119 2120 2121 2122 2123 2124 2125
	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);

2126
	switch (ops->mode) {
2127

2128 2129
	case MTD_OPS_PLACE_OOB:
	case MTD_OPS_RAW:
2130 2131 2132
		memcpy(chip->oob_poi + ops->ooboffs, oob, len);
		return oob + len;

2133
	case MTD_OPS_AUTO_OOB: {
2134
		struct nand_oobfree *free = chip->ecc.layout->oobfree;
2135 2136
		uint32_t boffs = 0, woffs = ops->ooboffs;
		size_t bytes = 0;
2137

2138
		for (; free->length && len; free++, len -= bytes) {
2139
			/* Write request not from offset 0? */
2140 2141 2142 2143 2144 2145 2146 2147 2148 2149 2150 2151 2152
			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;
			}
2153
			memcpy(chip->oob_poi + boffs, oob, bytes);
2154 2155 2156 2157 2158 2159 2160 2161 2162 2163
			oob += bytes;
		}
		return oob;
	}
	default:
		BUG();
	}
	return NULL;
}

2164
#define NOTALIGNED(x)	((x & (chip->subpagesize - 1)) != 0)
L
Linus Torvalds 已提交
2165 2166

/**
2167
 * nand_do_write_ops - [INTERN] NAND write with ECC
2168 2169 2170
 * @mtd: MTD device structure
 * @to: offset to write to
 * @ops: oob operations description structure
L
Linus Torvalds 已提交
2171
 *
2172
 * NAND write with ECC.
L
Linus Torvalds 已提交
2173
 */
2174 2175
static int nand_do_write_ops(struct mtd_info *mtd, loff_t to,
			     struct mtd_oob_ops *ops)
L
Linus Torvalds 已提交
2176
{
2177
	int chipnr, realpage, page, blockmask, column;
2178
	struct nand_chip *chip = mtd->priv;
2179
	uint32_t writelen = ops->len;
2180 2181

	uint32_t oobwritelen = ops->ooblen;
2182
	uint32_t oobmaxlen = ops->mode == MTD_OPS_AUTO_OOB ?
2183 2184
				mtd->oobavail : mtd->oobsize;

2185 2186
	uint8_t *oob = ops->oobbuf;
	uint8_t *buf = ops->datbuf;
2187
	int ret, subpage;
L
Linus Torvalds 已提交
2188

2189
	ops->retlen = 0;
2190 2191
	if (!writelen)
		return 0;
L
Linus Torvalds 已提交
2192

2193
	/* Reject writes, which are not page aligned */
2194
	if (NOTALIGNED(to) || NOTALIGNED(ops->len)) {
2195 2196
		pr_notice("%s: attempt to write non page aligned data\n",
			   __func__);
L
Linus Torvalds 已提交
2197 2198 2199
		return -EINVAL;
	}

2200 2201 2202 2203 2204
	column = to & (mtd->writesize - 1);
	subpage = column || (writelen & (mtd->writesize - 1));

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

2206 2207 2208
	chipnr = (int)(to >> chip->chip_shift);
	chip->select_chip(mtd, chipnr);

L
Linus Torvalds 已提交
2209 2210
	/* Check, if it is write protected */
	if (nand_check_wp(mtd))
2211
		return -EIO;
L
Linus Torvalds 已提交
2212

2213 2214 2215 2216 2217 2218
	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) &&
2219
	    (chip->pagebuf << chip->page_shift) < (to + ops->len))
2220
		chip->pagebuf = -1;
2221

2222
	/* Don't allow multipage oob writes with offset */
J
Jon Povey 已提交
2223
	if (oob && ops->ooboffs && (ops->ooboffs + ops->ooblen > oobmaxlen))
2224 2225
		return -EINVAL;

2226
	while (1) {
2227
		int bytes = mtd->writesize;
2228
		int cached = writelen > bytes && page != blockmask;
2229 2230
		uint8_t *wbuf = buf;

2231
		/* Partial page write? */
2232 2233 2234 2235 2236 2237 2238 2239
		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 已提交
2240

2241 2242
		if (unlikely(oob)) {
			size_t len = min(oobwritelen, oobmaxlen);
2243
			oob = nand_fill_oob(mtd, oob, len, ops);
2244
			oobwritelen -= len;
2245 2246 2247
		} else {
			/* We still need to erase leftover OOB data */
			memset(chip->oob_poi, 0xff, mtd->oobsize);
2248
		}
2249

2250
		ret = chip->write_page(mtd, chip, wbuf, page, cached,
2251
				       (ops->mode == MTD_OPS_RAW));
2252 2253 2254 2255 2256 2257 2258
		if (ret)
			break;

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

2259
		column = 0;
2260 2261 2262 2263 2264 2265 2266 2267 2268
		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 已提交
2269 2270
		}
	}
2271 2272

	ops->retlen = ops->len - writelen;
2273 2274
	if (unlikely(oob))
		ops->oobretlen = ops->ooblen;
L
Linus Torvalds 已提交
2275 2276 2277
	return ret;
}

2278 2279
/**
 * panic_nand_write - [MTD Interface] NAND write with ECC
2280 2281 2282 2283 2284
 * @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
2285 2286 2287 2288 2289 2290 2291 2292
 *
 * 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;
2293
	struct mtd_oob_ops ops;
2294 2295 2296 2297 2298 2299 2300 2301
	int ret;

	/* Do not allow reads past end of device */
	if ((to + len) > mtd->size)
		return -EINVAL;
	if (!len)
		return 0;

2302
	/* Wait for the device to get ready */
2303 2304
	panic_nand_wait(mtd, chip, 400);

2305
	/* Grab the device */
2306 2307
	panic_nand_get_device(chip, mtd, FL_WRITING);

2308 2309 2310
	ops.len = len;
	ops.datbuf = (uint8_t *)buf;
	ops.oobbuf = NULL;
B
Brian Norris 已提交
2311
	ops.mode = 0;
2312

2313
	ret = nand_do_write_ops(mtd, to, &ops);
2314

2315
	*retlen = ops.retlen;
2316 2317 2318
	return ret;
}

2319
/**
2320
 * nand_write - [MTD Interface] NAND write with ECC
2321 2322 2323 2324 2325
 * @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
2326
 *
2327
 * NAND write with ECC.
2328
 */
2329 2330
static int nand_write(struct mtd_info *mtd, loff_t to, size_t len,
			  size_t *retlen, const uint8_t *buf)
2331 2332
{
	struct nand_chip *chip = mtd->priv;
2333
	struct mtd_oob_ops ops;
2334 2335
	int ret;

2336 2337
	/* Do not allow reads past end of device */
	if ((to + len) > mtd->size)
2338
		return -EINVAL;
2339 2340
	if (!len)
		return 0;
2341

2342
	nand_get_device(chip, mtd, FL_WRITING);
2343

2344 2345 2346
	ops.len = len;
	ops.datbuf = (uint8_t *)buf;
	ops.oobbuf = NULL;
B
Brian Norris 已提交
2347
	ops.mode = 0;
2348

2349
	ret = nand_do_write_ops(mtd, to, &ops);
2350

2351
	*retlen = ops.retlen;
R
Richard Purdie 已提交
2352

2353
	nand_release_device(mtd);
2354 2355

	return ret;
2356
}
2357

L
Linus Torvalds 已提交
2358
/**
2359
 * nand_do_write_oob - [MTD Interface] NAND write out-of-band
2360 2361 2362
 * @mtd: MTD device structure
 * @to: offset to write to
 * @ops: oob operation description structure
L
Linus Torvalds 已提交
2363
 *
2364
 * NAND write out-of-band.
L
Linus Torvalds 已提交
2365
 */
2366 2367
static int nand_do_write_oob(struct mtd_info *mtd, loff_t to,
			     struct mtd_oob_ops *ops)
L
Linus Torvalds 已提交
2368
{
2369
	int chipnr, page, status, len;
2370
	struct nand_chip *chip = mtd->priv;
L
Linus Torvalds 已提交
2371

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

2375
	if (ops->mode == MTD_OPS_AUTO_OOB)
2376 2377 2378 2379
		len = chip->ecc.layout->oobavail;
	else
		len = mtd->oobsize;

L
Linus Torvalds 已提交
2380
	/* Do not allow write past end of page */
2381
	if ((ops->ooboffs + ops->ooblen) > len) {
2382 2383
		pr_debug("%s: attempt to write past end of page\n",
				__func__);
L
Linus Torvalds 已提交
2384 2385 2386
		return -EINVAL;
	}

2387
	if (unlikely(ops->ooboffs >= len)) {
2388 2389
		pr_debug("%s: attempt to start write outside oob\n",
				__func__);
2390 2391 2392
		return -EINVAL;
	}

2393
	/* Do not allow write past end of device */
2394 2395 2396 2397
	if (unlikely(to >= mtd->size ||
		     ops->ooboffs + ops->ooblen >
			((mtd->size >> chip->page_shift) -
			 (to >> chip->page_shift)) * len)) {
2398 2399
		pr_debug("%s: attempt to write beyond end of device\n",
				__func__);
2400 2401 2402
		return -EINVAL;
	}

2403
	chipnr = (int)(to >> chip->chip_shift);
2404
	chip->select_chip(mtd, chipnr);
L
Linus Torvalds 已提交
2405

2406 2407 2408 2409 2410 2411 2412 2413 2414
	/* 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.
	 */
2415
	chip->cmdfunc(mtd, NAND_CMD_RESET, -1, -1);
L
Linus Torvalds 已提交
2416 2417 2418

	/* Check, if it is write protected */
	if (nand_check_wp(mtd))
2419
		return -EROFS;
2420

L
Linus Torvalds 已提交
2421
	/* Invalidate the page cache, if we write to the cached page */
2422 2423
	if (page == chip->pagebuf)
		chip->pagebuf = -1;
L
Linus Torvalds 已提交
2424

2425
	nand_fill_oob(mtd, ops->oobbuf, ops->ooblen, ops);
2426

2427
	if (ops->mode == MTD_OPS_RAW)
2428 2429 2430
		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 已提交
2431

2432 2433
	if (status)
		return status;
L
Linus Torvalds 已提交
2434

2435
	ops->oobretlen = ops->ooblen;
L
Linus Torvalds 已提交
2436

2437
	return 0;
2438 2439 2440 2441
}

/**
 * nand_write_oob - [MTD Interface] NAND write data and/or out-of-band
2442 2443 2444
 * @mtd: MTD device structure
 * @to: offset to write to
 * @ops: oob operation description structure
2445 2446 2447 2448 2449 2450 2451 2452 2453 2454
 */
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 */
2455
	if (ops->datbuf && (to + ops->len) > mtd->size) {
2456 2457
		pr_debug("%s: attempt to write beyond end of device\n",
				__func__);
2458 2459 2460
		return -EINVAL;
	}

2461
	nand_get_device(chip, mtd, FL_WRITING);
2462

2463
	switch (ops->mode) {
2464 2465 2466
	case MTD_OPS_PLACE_OOB:
	case MTD_OPS_AUTO_OOB:
	case MTD_OPS_RAW:
2467 2468 2469 2470 2471 2472 2473 2474 2475 2476 2477
		break;

	default:
		goto out;
	}

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

2478
out:
L
Linus Torvalds 已提交
2479 2480 2481 2482 2483
	nand_release_device(mtd);
	return ret;
}

/**
2484
 * single_erase_cmd - [GENERIC] NAND standard block erase command function
2485 2486
 * @mtd: MTD device structure
 * @page: the page address of the block which will be erased
L
Linus Torvalds 已提交
2487
 *
2488
 * Standard erase command for NAND chips.
L
Linus Torvalds 已提交
2489
 */
2490
static void single_erase_cmd(struct mtd_info *mtd, int page)
L
Linus Torvalds 已提交
2491
{
2492
	struct nand_chip *chip = mtd->priv;
L
Linus Torvalds 已提交
2493
	/* Send commands to erase a block */
2494 2495
	chip->cmdfunc(mtd, NAND_CMD_ERASE1, -1, page);
	chip->cmdfunc(mtd, NAND_CMD_ERASE2, -1, -1);
L
Linus Torvalds 已提交
2496 2497 2498
}

/**
2499
 * multi_erase_cmd - [GENERIC] AND specific block erase command function
2500 2501
 * @mtd: MTD device structure
 * @page: the page address of the block which will be erased
L
Linus Torvalds 已提交
2502
 *
2503
 * AND multi block erase command function. Erase 4 consecutive blocks.
L
Linus Torvalds 已提交
2504
 */
2505
static void multi_erase_cmd(struct mtd_info *mtd, int page)
L
Linus Torvalds 已提交
2506
{
2507
	struct nand_chip *chip = mtd->priv;
L
Linus Torvalds 已提交
2508
	/* Send commands to erase a block */
2509 2510 2511 2512 2513
	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 已提交
2514 2515 2516 2517
}

/**
 * nand_erase - [MTD Interface] erase block(s)
2518 2519
 * @mtd: MTD device structure
 * @instr: erase instruction
L
Linus Torvalds 已提交
2520
 *
2521
 * Erase one ore more blocks.
L
Linus Torvalds 已提交
2522
 */
2523
static int nand_erase(struct mtd_info *mtd, struct erase_info *instr)
L
Linus Torvalds 已提交
2524
{
2525
	return nand_erase_nand(mtd, instr, 0);
L
Linus Torvalds 已提交
2526
}
2527

2528
#define BBT_PAGE_MASK	0xffffff3f
L
Linus Torvalds 已提交
2529
/**
2530
 * nand_erase_nand - [INTERN] erase block(s)
2531 2532 2533
 * @mtd: MTD device structure
 * @instr: erase instruction
 * @allowbbt: allow erasing the bbt area
L
Linus Torvalds 已提交
2534
 *
2535
 * Erase one ore more blocks.
L
Linus Torvalds 已提交
2536
 */
2537 2538
int nand_erase_nand(struct mtd_info *mtd, struct erase_info *instr,
		    int allowbbt)
L
Linus Torvalds 已提交
2539
{
2540
	int page, status, pages_per_block, ret, chipnr;
2541
	struct nand_chip *chip = mtd->priv;
2542
	loff_t rewrite_bbt[NAND_MAX_CHIPS] = {0};
2543
	unsigned int bbt_masked_page = 0xffffffff;
2544
	loff_t len;
L
Linus Torvalds 已提交
2545

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

2550
	if (check_offs_len(mtd, instr->addr, instr->len))
L
Linus Torvalds 已提交
2551 2552
		return -EINVAL;

2553
	instr->fail_addr = MTD_FAIL_ADDR_UNKNOWN;
L
Linus Torvalds 已提交
2554 2555

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

	/* Shift to get first page */
2559 2560
	page = (int)(instr->addr >> chip->page_shift);
	chipnr = (int)(instr->addr >> chip->chip_shift);
L
Linus Torvalds 已提交
2561 2562

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

	/* Select the NAND device */
2566
	chip->select_chip(mtd, chipnr);
L
Linus Torvalds 已提交
2567 2568 2569

	/* Check, if it is write protected */
	if (nand_check_wp(mtd)) {
2570 2571
		pr_debug("%s: device is write protected!\n",
				__func__);
L
Linus Torvalds 已提交
2572 2573 2574 2575
		instr->state = MTD_ERASE_FAILED;
		goto erase_exit;
	}

2576 2577 2578 2579
	/*
	 * 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
2580
	 * erased to avoid recursive updates.
2581 2582 2583
	 */
	if (chip->options & BBT_AUTO_REFRESH && !allowbbt)
		bbt_masked_page = chip->bbt_td->pages[chipnr] & BBT_PAGE_MASK;
2584

L
Linus Torvalds 已提交
2585 2586 2587 2588 2589 2590
	/* Loop through the pages */
	len = instr->len;

	instr->state = MTD_ERASING;

	while (len) {
W
Wolfram Sang 已提交
2591
		/* Check if we have a bad block, we do not erase bad blocks! */
2592 2593
		if (nand_block_checkbad(mtd, ((loff_t) page) <<
					chip->page_shift, 0, allowbbt)) {
2594 2595
			pr_warn("%s: attempt to erase a bad block at page 0x%08x\n",
				    __func__, page);
L
Linus Torvalds 已提交
2596 2597 2598
			instr->state = MTD_ERASE_FAILED;
			goto erase_exit;
		}
2599

2600 2601
		/*
		 * Invalidate the page cache, if we erase the block which
2602
		 * contains the current cached page.
2603 2604 2605 2606
		 */
		if (page <= chip->pagebuf && chip->pagebuf <
		    (page + pages_per_block))
			chip->pagebuf = -1;
L
Linus Torvalds 已提交
2607

2608
		chip->erase_cmd(mtd, page & chip->pagemask);
2609

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

2612 2613 2614 2615 2616 2617 2618
		/*
		 * 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);
2619

L
Linus Torvalds 已提交
2620
		/* See if block erase succeeded */
2621
		if (status & NAND_STATUS_FAIL) {
2622 2623
			pr_debug("%s: failed erase, page 0x%08x\n",
					__func__, page);
L
Linus Torvalds 已提交
2624
			instr->state = MTD_ERASE_FAILED;
2625 2626
			instr->fail_addr =
				((loff_t)page << chip->page_shift);
L
Linus Torvalds 已提交
2627 2628
			goto erase_exit;
		}
2629

2630 2631
		/*
		 * If BBT requires refresh, set the BBT rewrite flag to the
2632
		 * page being erased.
2633 2634 2635
		 */
		if (bbt_masked_page != 0xffffffff &&
		    (page & BBT_PAGE_MASK) == bbt_masked_page)
2636 2637
			    rewrite_bbt[chipnr] =
					((loff_t)page << chip->page_shift);
2638

L
Linus Torvalds 已提交
2639
		/* Increment page address and decrement length */
2640
		len -= (1 << chip->phys_erase_shift);
L
Linus Torvalds 已提交
2641 2642 2643
		page += pages_per_block;

		/* Check, if we cross a chip boundary */
2644
		if (len && !(page & chip->pagemask)) {
L
Linus Torvalds 已提交
2645
			chipnr++;
2646 2647
			chip->select_chip(mtd, -1);
			chip->select_chip(mtd, chipnr);
2648

2649 2650
			/*
			 * If BBT requires refresh and BBT-PERCHIP, set the BBT
2651
			 * page mask to see if this BBT should be rewritten.
2652 2653 2654 2655 2656
			 */
			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 已提交
2657 2658 2659 2660
		}
	}
	instr->state = MTD_ERASE_DONE;

2661
erase_exit:
L
Linus Torvalds 已提交
2662 2663 2664 2665 2666 2667

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

	/* Deselect and wake up anyone waiting on the device */
	nand_release_device(mtd);

2668 2669 2670 2671
	/* Do call back function */
	if (!ret)
		mtd_erase_callback(instr);

2672 2673
	/*
	 * If BBT requires refresh and erase was successful, rewrite any
2674
	 * selected bad block tables.
2675 2676 2677 2678 2679 2680 2681
	 */
	if (bbt_masked_page == 0xffffffff || ret)
		return ret;

	for (chipnr = 0; chipnr < chip->numchips; chipnr++) {
		if (!rewrite_bbt[chipnr])
			continue;
2682
		/* Update the BBT for chip */
2683 2684 2685
		pr_debug("%s: nand_update_bbt (%d:0x%0llx 0x%0x)\n",
				__func__, chipnr, rewrite_bbt[chipnr],
				chip->bbt_td->pages[chipnr]);
2686
		nand_update_bbt(mtd, rewrite_bbt[chipnr]);
2687 2688
	}

L
Linus Torvalds 已提交
2689 2690 2691 2692 2693 2694
	/* Return more or less happy */
	return ret;
}

/**
 * nand_sync - [MTD Interface] sync
2695
 * @mtd: MTD device structure
L
Linus Torvalds 已提交
2696
 *
2697
 * Sync is actually a wait for chip ready function.
L
Linus Torvalds 已提交
2698
 */
2699
static void nand_sync(struct mtd_info *mtd)
L
Linus Torvalds 已提交
2700
{
2701
	struct nand_chip *chip = mtd->priv;
L
Linus Torvalds 已提交
2702

2703
	pr_debug("%s: called\n", __func__);
L
Linus Torvalds 已提交
2704 2705

	/* Grab the lock and see if the device is available */
2706
	nand_get_device(chip, mtd, FL_SYNCING);
L
Linus Torvalds 已提交
2707
	/* Release it and go back */
2708
	nand_release_device(mtd);
L
Linus Torvalds 已提交
2709 2710 2711
}

/**
2712
 * nand_block_isbad - [MTD Interface] Check if block at offset is bad
2713 2714
 * @mtd: MTD device structure
 * @offs: offset relative to mtd start
L
Linus Torvalds 已提交
2715
 */
2716
static int nand_block_isbad(struct mtd_info *mtd, loff_t offs)
L
Linus Torvalds 已提交
2717 2718
{
	/* Check for invalid offset */
2719
	if (offs > mtd->size)
L
Linus Torvalds 已提交
2720
		return -EINVAL;
2721

2722
	return nand_block_checkbad(mtd, offs, 1, 0);
L
Linus Torvalds 已提交
2723 2724 2725
}

/**
2726
 * nand_block_markbad - [MTD Interface] Mark block at the given offset as bad
2727 2728
 * @mtd: MTD device structure
 * @ofs: offset relative to mtd start
L
Linus Torvalds 已提交
2729
 */
2730
static int nand_block_markbad(struct mtd_info *mtd, loff_t ofs)
L
Linus Torvalds 已提交
2731
{
2732
	struct nand_chip *chip = mtd->priv;
L
Linus Torvalds 已提交
2733 2734
	int ret;

2735 2736
	ret = nand_block_isbad(mtd, ofs);
	if (ret) {
2737
		/* If it was bad already, return success and do nothing */
L
Linus Torvalds 已提交
2738 2739
		if (ret > 0)
			return 0;
2740 2741
		return ret;
	}
L
Linus Torvalds 已提交
2742

2743
	return chip->block_markbad(mtd, ofs);
L
Linus Torvalds 已提交
2744 2745
}

2746 2747
/**
 * nand_suspend - [MTD Interface] Suspend the NAND flash
2748
 * @mtd: MTD device structure
2749 2750 2751
 */
static int nand_suspend(struct mtd_info *mtd)
{
2752
	struct nand_chip *chip = mtd->priv;
2753

2754
	return nand_get_device(chip, mtd, FL_PM_SUSPENDED);
2755 2756 2757 2758
}

/**
 * nand_resume - [MTD Interface] Resume the NAND flash
2759
 * @mtd: MTD device structure
2760 2761 2762
 */
static void nand_resume(struct mtd_info *mtd)
{
2763
	struct nand_chip *chip = mtd->priv;
2764

2765
	if (chip->state == FL_PM_SUSPENDED)
2766 2767
		nand_release_device(mtd);
	else
2768 2769
		pr_err("%s called for a chip which is not in suspended state\n",
			__func__);
2770 2771
}

2772
/* Set default functions */
2773
static void nand_set_defaults(struct nand_chip *chip, int busw)
T
Thomas Gleixner 已提交
2774
{
L
Linus Torvalds 已提交
2775
	/* check for proper chip_delay setup, set 20us if not */
2776 2777
	if (!chip->chip_delay)
		chip->chip_delay = 20;
L
Linus Torvalds 已提交
2778 2779

	/* check, if a user supplied command function given */
2780 2781
	if (chip->cmdfunc == NULL)
		chip->cmdfunc = nand_command;
L
Linus Torvalds 已提交
2782 2783

	/* check, if a user supplied wait function given */
2784 2785 2786 2787 2788 2789 2790 2791 2792 2793 2794 2795 2796 2797 2798 2799 2800 2801 2802 2803 2804
	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->verify_buf)
		chip->verify_buf = busw ? nand_verify_buf16 : nand_verify_buf;
	if (!chip->scan_bbt)
		chip->scan_bbt = nand_default_bbt;
2805 2806 2807 2808 2809 2810 2811

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

T
Thomas Gleixner 已提交
2812 2813
}

2814
/* Sanitize ONFI strings so we can safely print them */
2815 2816 2817 2818
static void sanitize_string(uint8_t *s, size_t len)
{
	ssize_t i;

2819
	/* Null terminate */
2820 2821
	s[len - 1] = 0;

2822
	/* Remove non printable chars */
2823 2824 2825 2826 2827
	for (i = 0; i < len - 1; i++) {
		if (s[i] < ' ' || s[i] > 127)
			s[i] = '?';
	}

2828
	/* Remove trailing spaces */
2829 2830 2831 2832 2833 2834 2835 2836 2837 2838 2839 2840 2841 2842 2843
	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;
}

2844
/*
2845
 * Check if the NAND chip is ONFI compliant, returns 1 if it is, 0 otherwise.
2846 2847
 */
static int nand_flash_detect_onfi(struct mtd_info *mtd, struct nand_chip *chip,
2848
					int *busw)
2849 2850 2851 2852 2853
{
	struct nand_onfi_params *p = &chip->onfi_params;
	int i;
	int val;

2854
	/* Try ONFI for unknown chip or LP */
2855 2856 2857 2858 2859
	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;

2860
	pr_info("ONFI flash detected\n");
2861 2862 2863 2864 2865
	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)) {
2866
			pr_info("ONFI param page %d valid\n", i);
2867 2868 2869 2870 2871 2872 2873
			break;
		}
	}

	if (i == 3)
		return 0;

2874
	/* Check version */
2875
	val = le16_to_cpu(p->revision);
2876 2877 2878
	if (val & (1 << 5))
		chip->onfi_version = 23;
	else if (val & (1 << 4))
2879 2880 2881 2882 2883
		chip->onfi_version = 22;
	else if (val & (1 << 3))
		chip->onfi_version = 21;
	else if (val & (1 << 2))
		chip->onfi_version = 20;
2884
	else if (val & (1 << 1))
2885
		chip->onfi_version = 10;
2886 2887 2888 2889
	else
		chip->onfi_version = 0;

	if (!chip->onfi_version) {
2890
		pr_info("%s: unsupported ONFI version: %d\n", __func__, val);
2891 2892
		return 0;
	}
2893 2894 2895 2896 2897 2898 2899 2900

	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);
2901
	chip->chipsize = (uint64_t)le32_to_cpu(p->blocks_per_lun) * mtd->erasesize;
2902
	*busw = 0;
2903
	if (le16_to_cpu(p->features) & 1)
2904
		*busw = NAND_BUSWIDTH_16;
2905 2906 2907 2908 2909 2910 2911 2912

	chip->options &= ~NAND_CHIPOPTIONS_MSK;
	chip->options |= (NAND_NO_READRDY |
			NAND_NO_AUTOINCR) & NAND_CHIPOPTIONS_MSK;

	return 1;
}

T
Thomas Gleixner 已提交
2913
/*
2914
 * Get the flash and manufacturer id and lookup if the type is supported.
T
Thomas Gleixner 已提交
2915 2916
 */
static struct nand_flash_dev *nand_get_flash_type(struct mtd_info *mtd,
2917
						  struct nand_chip *chip,
2918 2919
						  int busw,
						  int *maf_id, int *dev_id,
2920
						  struct nand_flash_dev *type)
T
Thomas Gleixner 已提交
2921
{
2922
	int i, maf_idx;
2923
	u8 id_data[8];
2924
	int ret;
L
Linus Torvalds 已提交
2925 2926

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

2929 2930
	/*
	 * Reset the chip, required by some chips (e.g. Micron MT29FxGxxxxx)
2931
	 * after power-up.
2932 2933 2934
	 */
	chip->cmdfunc(mtd, NAND_CMD_RESET, -1, -1);

L
Linus Torvalds 已提交
2935
	/* Send the command for reading device ID */
2936
	chip->cmdfunc(mtd, NAND_CMD_READID, 0x00, -1);
L
Linus Torvalds 已提交
2937 2938

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

2942 2943
	/*
	 * Try again to make sure, as some systems the bus-hold or other
2944 2945 2946 2947 2948 2949 2950
	 * 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);

2951
	for (i = 0; i < 2; i++)
2952
		id_data[i] = chip->read_byte(mtd);
2953

2954
	if (id_data[0] != *maf_id || id_data[1] != *dev_id) {
2955
		pr_info("%s: second ID read did not match "
2956 2957
			"%02x,%02x against %02x,%02x\n", __func__,
			*maf_id, *dev_id, id_data[0], id_data[1]);
2958 2959 2960
		return ERR_PTR(-ENODEV);
	}

T
Thomas Gleixner 已提交
2961
	if (!type)
2962 2963 2964
		type = nand_flash_ids;

	for (; type->name != NULL; type++)
2965
		if (*dev_id == type->id)
2966
			break;
2967

2968 2969
	chip->onfi_version = 0;
	if (!type->name || !type->pagesize) {
2970
		/* Check is chip is ONFI compliant */
2971
		ret = nand_flash_detect_onfi(mtd, chip, &busw);
2972 2973
		if (ret)
			goto ident_done;
2974 2975 2976 2977 2978 2979 2980 2981 2982
	}

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

	/* Read entire ID string */

	for (i = 0; i < 8; i++)
		id_data[i] = chip->read_byte(mtd);

2983
	if (!type->name)
T
Thomas Gleixner 已提交
2984 2985
		return ERR_PTR(-ENODEV);

2986 2987 2988
	if (!mtd->name)
		mtd->name = type->name;

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

2991
	if (!type->pagesize && chip->init_size) {
2992
		/* Set the pagesize, oobsize, erasesize by the driver */
2993 2994
		busw = chip->init_size(mtd, chip, id_data);
	} else if (!type->pagesize) {
T
Thomas Gleixner 已提交
2995
		int extid;
2996
		/* The 3rd id byte holds MLC / multichip data */
2997
		chip->cellinfo = id_data[2];
T
Thomas Gleixner 已提交
2998
		/* The 4th id byte is the important one */
2999
		extid = id_data[3];
3000

3001 3002 3003
		/*
		 * Field definitions are in the following datasheets:
		 * Old style (4,5 byte ID): Samsung K9GAG08U0M (p.32)
3004
		 * New style   (6 byte ID): Samsung K9GBG08U0M (p.40)
3005 3006 3007 3008 3009 3010
		 *
		 * Check for wraparound + Samsung ID + nonzero 6th byte
		 * to decide what to do.
		 */
		if (id_data[0] == id_data[6] && id_data[1] == id_data[7] &&
				id_data[0] == NAND_MFR_SAMSUNG &&
3011
				(chip->cellinfo & NAND_CI_CELLTYPE_MSK) &&
3012 3013 3014 3015 3016
				id_data[5] != 0x00) {
			/* Calc pagesize */
			mtd->writesize = 2048 << (extid & 0x03);
			extid >>= 2;
			/* Calc oobsize */
3017 3018 3019 3020 3021 3022 3023 3024 3025 3026 3027 3028 3029 3030
			switch (extid & 0x03) {
			case 1:
				mtd->oobsize = 128;
				break;
			case 2:
				mtd->oobsize = 218;
				break;
			case 3:
				mtd->oobsize = 400;
				break;
			default:
				mtd->oobsize = 436;
				break;
			}
3031 3032 3033 3034 3035 3036 3037 3038 3039 3040 3041 3042 3043 3044 3045 3046 3047 3048 3049
			extid >>= 2;
			/* Calc blocksize */
			mtd->erasesize = (128 * 1024) <<
				(((extid >> 1) & 0x04) | (extid & 0x03));
			busw = 0;
		} 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;
		}
T
Thomas Gleixner 已提交
3050 3051
	} else {
		/*
3052
		 * Old devices have chip data hardcoded in the device id table.
T
Thomas Gleixner 已提交
3053
		 */
3054 3055
		mtd->erasesize = type->erasesize;
		mtd->writesize = type->pagesize;
3056
		mtd->oobsize = mtd->writesize / 32;
3057
		busw = type->options & NAND_BUSWIDTH_16;
3058 3059 3060 3061

		/*
		 * Check for Spansion/AMD ID + repeating 5th, 6th byte since
		 * some Spansion chips have erasesize that conflicts with size
3062
		 * listed in nand_ids table.
3063 3064 3065 3066 3067 3068 3069 3070
		 * 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);
		}
T
Thomas Gleixner 已提交
3071
	}
3072 3073 3074 3075
	/* Get chip options, preserve non chip based options */
	chip->options &= ~NAND_CHIPOPTIONS_MSK;
	chip->options |= type->options & NAND_CHIPOPTIONS_MSK;

3076 3077 3078
	/*
	 * Check if chip is not a Samsung device. Do not clear the
	 * options for chips which do not have an extended id.
3079 3080 3081 3082 3083 3084
	 */
	if (*maf_id != NAND_MFR_SAMSUNG && !type->pagesize)
		chip->options &= ~NAND_SAMSUNG_LP_OPTIONS;
ident_done:

	/*
3085
	 * Set chip as a default. Board drivers can override it, if necessary.
3086 3087
	 */
	chip->options |= NAND_NO_AUTOINCR;
L
Linus Torvalds 已提交
3088

T
Thomas Gleixner 已提交
3089
	/* Try to identify manufacturer */
3090
	for (maf_idx = 0; nand_manuf_ids[maf_idx].id != 0x0; maf_idx++) {
T
Thomas Gleixner 已提交
3091 3092 3093
		if (nand_manuf_ids[maf_idx].id == *maf_id)
			break;
	}
3094

T
Thomas Gleixner 已提交
3095 3096
	/*
	 * Check, if buswidth is correct. Hardware drivers should set
3097
	 * chip correct!
T
Thomas Gleixner 已提交
3098
	 */
3099
	if (busw != (chip->options & NAND_BUSWIDTH_16)) {
3100
		pr_info("NAND device: Manufacturer ID:"
3101 3102
			" 0x%02x, Chip ID: 0x%02x (%s %s)\n", *maf_id,
			*dev_id, nand_manuf_ids[maf_idx].name, mtd->name);
3103
		pr_warn("NAND bus width %d instead %d bit\n",
3104 3105
			   (chip->options & NAND_BUSWIDTH_16) ? 16 : 8,
			   busw ? 16 : 8);
T
Thomas Gleixner 已提交
3106 3107
		return ERR_PTR(-EINVAL);
	}
3108

T
Thomas Gleixner 已提交
3109
	/* Calculate the address shift from the page size */
3110
	chip->page_shift = ffs(mtd->writesize) - 1;
3111
	/* Convert chipsize to number of pages per chip -1 */
3112
	chip->pagemask = (chip->chipsize >> chip->page_shift) - 1;
3113

3114
	chip->bbt_erase_shift = chip->phys_erase_shift =
T
Thomas Gleixner 已提交
3115
		ffs(mtd->erasesize) - 1;
3116 3117
	if (chip->chipsize & 0xffffffff)
		chip->chip_shift = ffs((unsigned)chip->chipsize) - 1;
3118 3119 3120 3121
	else {
		chip->chip_shift = ffs((unsigned)(chip->chipsize >> 32));
		chip->chip_shift += 32 - 1;
	}
L
Linus Torvalds 已提交
3122

A
Artem Bityutskiy 已提交
3123 3124
	chip->badblockbits = 8;

T
Thomas Gleixner 已提交
3125
	/* Set the bad block position */
3126
	if (mtd->writesize > 512 || (busw & NAND_BUSWIDTH_16))
3127
		chip->badblockpos = NAND_LARGE_BADBLOCK_POS;
3128 3129
	else
		chip->badblockpos = NAND_SMALL_BADBLOCK_POS;
3130

3131 3132
	/*
	 * Bad block marker is stored in the last page of each block
3133 3134
	 * on Samsung and Hynix MLC devices; stored in first two pages
	 * of each block on Micron devices with 2KiB pages and on
3135 3136
	 * SLC Samsung, Hynix, Toshiba, AMD/Spansion, and Macronix.
	 * All others scan only the first page.
3137 3138 3139 3140
	 */
	if ((chip->cellinfo & NAND_CI_CELLTYPE_MSK) &&
			(*maf_id == NAND_MFR_SAMSUNG ||
			 *maf_id == NAND_MFR_HYNIX))
3141
		chip->bbt_options |= NAND_BBT_SCANLASTPAGE;
3142 3143 3144
	else if ((!(chip->cellinfo & NAND_CI_CELLTYPE_MSK) &&
				(*maf_id == NAND_MFR_SAMSUNG ||
				 *maf_id == NAND_MFR_HYNIX ||
B
Brian Norris 已提交
3145
				 *maf_id == NAND_MFR_TOSHIBA ||
3146 3147
				 *maf_id == NAND_MFR_AMD ||
				 *maf_id == NAND_MFR_MACRONIX)) ||
3148 3149
			(mtd->writesize == 2048 &&
			 *maf_id == NAND_MFR_MICRON))
3150
		chip->bbt_options |= NAND_BBT_SCAN2NDPAGE;
3151

T
Thomas Gleixner 已提交
3152
	/* Check for AND chips with 4 page planes */
3153 3154
	if (chip->options & NAND_4PAGE_ARRAY)
		chip->erase_cmd = multi_erase_cmd;
T
Thomas Gleixner 已提交
3155
	else
3156
		chip->erase_cmd = single_erase_cmd;
T
Thomas Gleixner 已提交
3157

3158
	/* Do not replace user supplied command function! */
3159 3160
	if (mtd->writesize > 512 && chip->cmdfunc == nand_command)
		chip->cmdfunc = nand_command_lp;
T
Thomas Gleixner 已提交
3161

3162
	pr_info("NAND device: Manufacturer ID:"
3163 3164
		" 0x%02x, Chip ID: 0x%02x (%s %s)\n", *maf_id, *dev_id,
		nand_manuf_ids[maf_idx].name,
3165
		chip->onfi_version ? chip->onfi_params.model : type->name);
T
Thomas Gleixner 已提交
3166 3167 3168 3169 3170

	return type;
}

/**
3171
 * nand_scan_ident - [NAND Interface] Scan for the NAND device
3172 3173 3174
 * @mtd: MTD device structure
 * @maxchips: number of chips to scan for
 * @table: alternative NAND ID table
T
Thomas Gleixner 已提交
3175
 *
3176 3177
 * 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 已提交
3178
 *
3179
 * The mtd->owner field must be set to the module of the caller.
T
Thomas Gleixner 已提交
3180
 */
3181 3182
int nand_scan_ident(struct mtd_info *mtd, int maxchips,
		    struct nand_flash_dev *table)
T
Thomas Gleixner 已提交
3183
{
3184
	int i, busw, nand_maf_id, nand_dev_id;
3185
	struct nand_chip *chip = mtd->priv;
T
Thomas Gleixner 已提交
3186 3187 3188
	struct nand_flash_dev *type;

	/* Get buswidth to select the correct functions */
3189
	busw = chip->options & NAND_BUSWIDTH_16;
T
Thomas Gleixner 已提交
3190
	/* Set the default functions */
3191
	nand_set_defaults(chip, busw);
T
Thomas Gleixner 已提交
3192 3193

	/* Read the flash type */
3194 3195
	type = nand_get_flash_type(mtd, chip, busw,
				&nand_maf_id, &nand_dev_id, table);
T
Thomas Gleixner 已提交
3196 3197

	if (IS_ERR(type)) {
3198
		if (!(chip->options & NAND_SCAN_SILENT_NODEV))
3199
			pr_warn("No NAND device found\n");
3200
		chip->select_chip(mtd, -1);
T
Thomas Gleixner 已提交
3201
		return PTR_ERR(type);
L
Linus Torvalds 已提交
3202 3203
	}

T
Thomas Gleixner 已提交
3204
	/* Check for a chip array */
3205
	for (i = 1; i < maxchips; i++) {
3206
		chip->select_chip(mtd, i);
3207 3208
		/* See comment in nand_get_flash_type for reset */
		chip->cmdfunc(mtd, NAND_CMD_RESET, -1, -1);
L
Linus Torvalds 已提交
3209
		/* Send the command for reading device ID */
3210
		chip->cmdfunc(mtd, NAND_CMD_READID, 0x00, -1);
L
Linus Torvalds 已提交
3211
		/* Read manufacturer and device IDs */
3212
		if (nand_maf_id != chip->read_byte(mtd) ||
3213
		    nand_dev_id != chip->read_byte(mtd))
L
Linus Torvalds 已提交
3214 3215 3216
			break;
	}
	if (i > 1)
3217
		pr_info("%d NAND chips detected\n", i);
3218

L
Linus Torvalds 已提交
3219
	/* Store the number of chips and calc total size for mtd */
3220 3221
	chip->numchips = i;
	mtd->size = i * chip->chipsize;
T
Thomas Gleixner 已提交
3222

3223 3224
	return 0;
}
3225
EXPORT_SYMBOL(nand_scan_ident);
3226 3227 3228 3229


/**
 * nand_scan_tail - [NAND Interface] Scan for the NAND device
3230
 * @mtd: MTD device structure
3231
 *
3232 3233 3234
 * 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.
3235 3236 3237 3238 3239 3240
 */
int nand_scan_tail(struct mtd_info *mtd)
{
	int i;
	struct nand_chip *chip = mtd->priv;

3241 3242 3243 3244 3245
	if (!(chip->options & NAND_OWN_BUFFERS))
		chip->buffers = kmalloc(sizeof(*chip->buffers), GFP_KERNEL);
	if (!chip->buffers)
		return -ENOMEM;

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

T
Thomas Gleixner 已提交
3249
	/*
3250
	 * If no default placement scheme is given, select an appropriate one.
T
Thomas Gleixner 已提交
3251
	 */
3252
	if (!chip->ecc.layout && (chip->ecc.mode != NAND_ECC_SOFT_BCH)) {
3253
		switch (mtd->oobsize) {
L
Linus Torvalds 已提交
3254
		case 8:
3255
			chip->ecc.layout = &nand_oob_8;
L
Linus Torvalds 已提交
3256 3257
			break;
		case 16:
3258
			chip->ecc.layout = &nand_oob_16;
L
Linus Torvalds 已提交
3259 3260
			break;
		case 64:
3261
			chip->ecc.layout = &nand_oob_64;
L
Linus Torvalds 已提交
3262
			break;
3263 3264 3265
		case 128:
			chip->ecc.layout = &nand_oob_128;
			break;
L
Linus Torvalds 已提交
3266
		default:
3267 3268
			pr_warn("No oob scheme defined for oobsize %d\n",
				   mtd->oobsize);
L
Linus Torvalds 已提交
3269 3270 3271
			BUG();
		}
	}
3272

3273 3274 3275
	if (!chip->write_page)
		chip->write_page = nand_write_page;

3276
	/*
3277
	 * Check ECC mode, default to software if 3byte/512byte hardware ECC is
T
Thomas Gleixner 已提交
3278
	 * selected and we have 256 byte pagesize fallback to software ECC
3279
	 */
3280

3281
	switch (chip->ecc.mode) {
3282 3283 3284 3285
	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) {
3286
			pr_warn("No ECC functions supplied; "
3287
				   "hardware ECC not possible\n");
3288 3289 3290 3291 3292
			BUG();
		}
		if (!chip->ecc.read_page)
			chip->ecc.read_page = nand_read_page_hwecc_oob_first;

T
Thomas Gleixner 已提交
3293
	case NAND_ECC_HW:
3294
		/* Use standard hwecc read page function? */
3295 3296
		if (!chip->ecc.read_page)
			chip->ecc.read_page = nand_read_page_hwecc;
3297 3298
		if (!chip->ecc.write_page)
			chip->ecc.write_page = nand_write_page_hwecc;
3299 3300 3301 3302
		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;
3303 3304 3305 3306
		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;
3307

T
Thomas Gleixner 已提交
3308
	case NAND_ECC_HW_SYNDROME:
3309 3310 3311
		if ((!chip->ecc.calculate || !chip->ecc.correct ||
		     !chip->ecc.hwctl) &&
		    (!chip->ecc.read_page ||
3312
		     chip->ecc.read_page == nand_read_page_hwecc ||
3313
		     !chip->ecc.write_page ||
3314
		     chip->ecc.write_page == nand_write_page_hwecc)) {
3315
			pr_warn("No ECC functions supplied; "
3316
				   "hardware ECC not possible\n");
T
Thomas Gleixner 已提交
3317 3318
			BUG();
		}
3319
		/* Use standard syndrome read/write page function? */
3320 3321
		if (!chip->ecc.read_page)
			chip->ecc.read_page = nand_read_page_syndrome;
3322 3323
		if (!chip->ecc.write_page)
			chip->ecc.write_page = nand_write_page_syndrome;
3324 3325 3326 3327
		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;
3328 3329 3330 3331
		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;
3332

3333
		if (mtd->writesize >= chip->ecc.size)
T
Thomas Gleixner 已提交
3334
			break;
3335
		pr_warn("%d byte HW ECC not possible on "
3336 3337
			   "%d byte page size, fallback to SW ECC\n",
			   chip->ecc.size, mtd->writesize);
3338
		chip->ecc.mode = NAND_ECC_SOFT;
3339

T
Thomas Gleixner 已提交
3340
	case NAND_ECC_SOFT:
3341 3342
		chip->ecc.calculate = nand_calculate_ecc;
		chip->ecc.correct = nand_correct_data;
3343
		chip->ecc.read_page = nand_read_page_swecc;
3344
		chip->ecc.read_subpage = nand_read_subpage;
3345
		chip->ecc.write_page = nand_write_page_swecc;
3346 3347
		chip->ecc.read_page_raw = nand_read_page_raw;
		chip->ecc.write_page_raw = nand_write_page_raw;
3348 3349
		chip->ecc.read_oob = nand_read_oob_std;
		chip->ecc.write_oob = nand_write_oob_std;
3350 3351
		if (!chip->ecc.size)
			chip->ecc.size = 256;
3352
		chip->ecc.bytes = 3;
L
Linus Torvalds 已提交
3353
		break;
3354

3355 3356
	case NAND_ECC_SOFT_BCH:
		if (!mtd_nand_has_bch()) {
3357
			pr_warn("CONFIG_MTD_ECC_BCH not enabled\n");
3358 3359 3360 3361 3362 3363 3364 3365 3366 3367 3368 3369 3370 3371
			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()
3372 3373
		 * for details. Otherwise, default to 4 bits for large page
		 * devices.
3374 3375 3376 3377 3378 3379 3380 3381 3382 3383
		 */
		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) {
3384
			pr_warn("BCH ECC initialization failed!\n");
3385 3386 3387 3388
			BUG();
		}
		break;

3389
	case NAND_ECC_NONE:
3390
		pr_warn("NAND_ECC_NONE selected by board driver. "
3391
			   "This is not recommended!\n");
3392 3393
		chip->ecc.read_page = nand_read_page_raw;
		chip->ecc.write_page = nand_write_page_raw;
3394
		chip->ecc.read_oob = nand_read_oob_std;
3395 3396
		chip->ecc.read_page_raw = nand_read_page_raw;
		chip->ecc.write_page_raw = nand_write_page_raw;
3397
		chip->ecc.write_oob = nand_write_oob_std;
3398 3399
		chip->ecc.size = mtd->writesize;
		chip->ecc.bytes = 0;
L
Linus Torvalds 已提交
3400
		break;
3401

L
Linus Torvalds 已提交
3402
	default:
3403
		pr_warn("Invalid NAND_ECC_MODE %d\n", chip->ecc.mode);
3404
		BUG();
L
Linus Torvalds 已提交
3405
	}
3406

3407
	/* For many systems, the standard OOB write also works for raw */
3408 3409
	if (!chip->ecc.read_oob_raw)
		chip->ecc.read_oob_raw = chip->ecc.read_oob;
3410 3411 3412
	if (!chip->ecc.write_oob_raw)
		chip->ecc.write_oob_raw = chip->ecc.write_oob;

3413 3414
	/*
	 * The number of bytes available for a client to place data into
3415
	 * the out of band area.
3416 3417
	 */
	chip->ecc.layout->oobavail = 0;
3418 3419
	for (i = 0; chip->ecc.layout->oobfree[i].length
			&& i < ARRAY_SIZE(chip->ecc.layout->oobfree); i++)
3420 3421
		chip->ecc.layout->oobavail +=
			chip->ecc.layout->oobfree[i].length;
V
Vitaly Wool 已提交
3422
	mtd->oobavail = chip->ecc.layout->oobavail;
3423

T
Thomas Gleixner 已提交
3424 3425
	/*
	 * Set the number of read / write steps for one page depending on ECC
3426
	 * mode.
T
Thomas Gleixner 已提交
3427
	 */
3428
	chip->ecc.steps = mtd->writesize / chip->ecc.size;
3429
	if (chip->ecc.steps * chip->ecc.size != mtd->writesize) {
3430
		pr_warn("Invalid ECC parameters\n");
T
Thomas Gleixner 已提交
3431
		BUG();
L
Linus Torvalds 已提交
3432
	}
3433
	chip->ecc.total = chip->ecc.steps * chip->ecc.bytes;
3434

3435
	/* Allow subpage writes up to ecc.steps. Not possible for MLC flash */
3436 3437
	if (!(chip->options & NAND_NO_SUBPAGE_WRITE) &&
	    !(chip->cellinfo & NAND_CI_CELLTYPE_MSK)) {
3438
		switch (chip->ecc.steps) {
3439 3440 3441 3442 3443
		case 2:
			mtd->subpage_sft = 1;
			break;
		case 4:
		case 8:
3444
		case 16:
3445 3446 3447 3448 3449 3450
			mtd->subpage_sft = 2;
			break;
		}
	}
	chip->subpagesize = mtd->writesize >> mtd->subpage_sft;

3451
	/* Initialize state */
3452
	chip->state = FL_READY;
L
Linus Torvalds 已提交
3453 3454

	/* De-select the device */
3455
	chip->select_chip(mtd, -1);
L
Linus Torvalds 已提交
3456 3457

	/* Invalidate the pagebuffer reference */
3458
	chip->pagebuf = -1;
L
Linus Torvalds 已提交
3459 3460 3461

	/* Fill in remaining MTD driver data */
	mtd->type = MTD_NANDFLASH;
3462 3463
	mtd->flags = (chip->options & NAND_ROM) ? MTD_CAP_ROM :
						MTD_CAP_NANDFLASH;
L
Linus Torvalds 已提交
3464 3465 3466 3467 3468
	mtd->erase = nand_erase;
	mtd->point = NULL;
	mtd->unpoint = NULL;
	mtd->read = nand_read;
	mtd->write = nand_write;
3469
	mtd->panic_write = panic_nand_write;
L
Linus Torvalds 已提交
3470 3471 3472 3473 3474
	mtd->read_oob = nand_read_oob;
	mtd->write_oob = nand_write_oob;
	mtd->sync = nand_sync;
	mtd->lock = NULL;
	mtd->unlock = NULL;
3475 3476
	mtd->suspend = nand_suspend;
	mtd->resume = nand_resume;
L
Linus Torvalds 已提交
3477 3478
	mtd->block_isbad = nand_block_isbad;
	mtd->block_markbad = nand_block_markbad;
3479
	mtd->writebufsize = mtd->writesize;
L
Linus Torvalds 已提交
3480

3481 3482
	/* propagate ecc.layout to mtd_info */
	mtd->ecclayout = chip->ecc.layout;
L
Linus Torvalds 已提交
3483

3484
	/* Check, if we should skip the bad block table scan */
3485
	if (chip->options & NAND_SKIP_BBTSCAN)
3486
		return 0;
L
Linus Torvalds 已提交
3487 3488

	/* Build bad block table */
3489
	return chip->scan_bbt(mtd);
L
Linus Torvalds 已提交
3490
}
3491
EXPORT_SYMBOL(nand_scan_tail);
L
Linus Torvalds 已提交
3492

3493 3494
/*
 * is_module_text_address() isn't exported, and it's mostly a pointless
3495
 * test if this is a module _anyway_ -- they'd have to try _really_ hard
3496 3497
 * to call us from in-kernel code if the core NAND support is modular.
 */
3498 3499 3500 3501
#ifdef MODULE
#define caller_is_module() (1)
#else
#define caller_is_module() \
3502
	is_module_text_address((unsigned long)__builtin_return_address(0))
3503 3504 3505 3506
#endif

/**
 * nand_scan - [NAND Interface] Scan for the NAND device
3507 3508
 * @mtd: MTD device structure
 * @maxchips: number of chips to scan for
3509
 *
3510 3511 3512 3513
 * 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.
3514 3515 3516 3517 3518 3519 3520
 */
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()) {
3521
		pr_crit("%s called with NULL mtd->owner!\n", __func__);
3522 3523 3524
		BUG();
	}

3525
	ret = nand_scan_ident(mtd, maxchips, NULL);
3526 3527 3528 3529
	if (!ret)
		ret = nand_scan_tail(mtd);
	return ret;
}
3530
EXPORT_SYMBOL(nand_scan);
3531

L
Linus Torvalds 已提交
3532
/**
3533
 * nand_release - [NAND Interface] Free resources held by the NAND device
3534 3535
 * @mtd: MTD device structure
 */
3536
void nand_release(struct mtd_info *mtd)
L
Linus Torvalds 已提交
3537
{
3538
	struct nand_chip *chip = mtd->priv;
L
Linus Torvalds 已提交
3539

3540 3541 3542
	if (chip->ecc.mode == NAND_ECC_SOFT_BCH)
		nand_bch_free((struct nand_bch_control *)chip->ecc.priv);

3543
	mtd_device_unregister(mtd);
L
Linus Torvalds 已提交
3544

J
Jesper Juhl 已提交
3545
	/* Free bad block table memory */
3546
	kfree(chip->bbt);
3547 3548
	if (!(chip->options & NAND_OWN_BUFFERS))
		kfree(chip->buffers);
3549 3550 3551 3552 3553

	/* Free bad block descriptor memory */
	if (chip->badblock_pattern && chip->badblock_pattern->options
			& NAND_BBT_DYNAMICSTRUCT)
		kfree(chip->badblock_pattern);
L
Linus Torvalds 已提交
3554
}
3555
EXPORT_SYMBOL_GPL(nand_release);
3556 3557 3558 3559 3560 3561 3562 3563 3564 3565 3566 3567 3568 3569 3570

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);

3571
MODULE_LICENSE("GPL");
3572 3573
MODULE_AUTHOR("Steven J. Hill <sjhill@realitydiluted.com>");
MODULE_AUTHOR("Thomas Gleixner <tglx@linutronix.de>");
3574
MODULE_DESCRIPTION("Generic NAND flash driver code");