]> bbs.cooldavid.org Git - net-next-2.6.git/blame - drivers/mtd/nand/nand_base.c
[MTD] NAND cleanup nand_scan
[net-next-2.6.git] / drivers / mtd / nand / nand_base.c
CommitLineData
1da177e4
LT
1/*
2 * drivers/mtd/nand.c
3 *
4 * Overview:
5 * This is the generic MTD driver for NAND flash devices. It should be
6 * capable of working with almost all NAND chips currently available.
7 * Basic support for AG-AND chips is provided.
61b03bd7 8 *
1da177e4
LT
9 * Additional technical information is available on
10 * http://www.linux-mtd.infradead.org/tech/nand.html
61b03bd7 11 *
1da177e4 12 * Copyright (C) 2000 Steven J. Hill (sjhill@realitydiluted.com)
2c0a2bed 13 * 2002 Thomas Gleixner (tglx@linutronix.de)
1da177e4 14 *
61b03bd7 15 * 02-08-2004 tglx: support for strange chips, which cannot auto increment
1da177e4
LT
16 * pages on read / read_oob
17 *
18 * 03-17-2004 tglx: Check ready before auto increment check. Simon Bayes
19 * pointed this out, as he marked an auto increment capable chip
20 * as NOAUTOINCR in the board driver.
21 * Make reads over block boundaries work too
22 *
23 * 04-14-2004 tglx: first working version for 2k page size chips
61b03bd7 24 *
1da177e4
LT
25 * 05-19-2004 tglx: Basic support for Renesas AG-AND chips
26 *
27 * 09-24-2004 tglx: add support for hardware controllers (e.g. ECC) shared
2c0a2bed
TG
28 * among multiple independend devices. Suggestions and initial
29 * patch from Ben Dooks <ben-mtd@fluff.org>
30 *
31 * 12-05-2004 dmarlin: add workaround for Renesas AG-AND chips "disturb"
32 * issue. Basically, any block not rewritten may lose data when
33 * surrounding blocks are rewritten many times. JFFS2 ensures
34 * this doesn't happen for blocks it uses, but the Bad Block
35 * Table(s) may not be rewritten. To ensure they do not lose
36 * data, force them to be rewritten when some of the surrounding
37 * blocks are erased. Rather than tracking a specific nearby
38 * block (which could itself go bad), use a page address 'mask' to
39 * select several blocks in the same area, and rewrite the BBT
40 * when any of them are erased.
41 *
42 * 01-03-2005 dmarlin: added support for the device recovery command sequence
43 * for Renesas AG-AND chips. If there was a sudden loss of power
44 * during an erase operation, a "device recovery" operation must
45 * be performed when power is restored to ensure correct
46 * operation.
47 *
48 * 01-20-2005 dmarlin: added support for optional hardware specific callback
49 * routine to perform extra error status checks on erase and write
50 * failures. This required adding a wrapper function for
51 * nand_read_ecc.
068e3c0a 52 *
962034f4
VW
53 * 08-20-2005 vwool: suspend/resume added
54 *
1da177e4 55 * Credits:
61b03bd7
TG
56 * David Woodhouse for adding multichip support
57 *
1da177e4
LT
58 * Aleph One Ltd. and Toby Churchill Ltd. for supporting the
59 * rework for 2K page size chips
60 *
61 * TODO:
62 * Enable cached programming for 2k page size chips
63 * Check, if mtd->ecctype should be set to MTD_ECC_HW
64 * if we have HW ecc support.
65 * The AG-AND chips have nice features for speed improvement,
66 * which are not supported yet. Read / program 4 pages in one go.
67 *
962034f4 68 * $Id: nand_base.c,v 1.150 2005/09/15 13:58:48 vwool Exp $
1da177e4
LT
69 *
70 * This program is free software; you can redistribute it and/or modify
71 * it under the terms of the GNU General Public License version 2 as
72 * published by the Free Software Foundation.
73 *
74 */
75
552d9205 76#include <linux/module.h>
1da177e4
LT
77#include <linux/delay.h>
78#include <linux/errno.h>
7aa65bfd 79#include <linux/err.h>
1da177e4
LT
80#include <linux/sched.h>
81#include <linux/slab.h>
82#include <linux/types.h>
83#include <linux/mtd/mtd.h>
84#include <linux/mtd/nand.h>
85#include <linux/mtd/nand_ecc.h>
86#include <linux/mtd/compatmac.h>
87#include <linux/interrupt.h>
88#include <linux/bitops.h>
8fe833c1 89#include <linux/leds.h>
1da177e4
LT
90#include <asm/io.h>
91
92#ifdef CONFIG_MTD_PARTITIONS
93#include <linux/mtd/partitions.h>
94#endif
95
96/* Define default oob placement schemes for large and small page devices */
97static struct nand_oobinfo nand_oob_8 = {
98 .useecc = MTD_NANDECC_AUTOPLACE,
99 .eccbytes = 3,
100 .eccpos = {0, 1, 2},
e0c7d767 101 .oobfree = {{3, 2}, {6, 2}}
1da177e4
LT
102};
103
104static struct nand_oobinfo nand_oob_16 = {
105 .useecc = MTD_NANDECC_AUTOPLACE,
106 .eccbytes = 6,
107 .eccpos = {0, 1, 2, 3, 6, 7},
e0c7d767 108 .oobfree = {{8, 8}}
1da177e4
LT
109};
110
111static struct nand_oobinfo nand_oob_64 = {
112 .useecc = MTD_NANDECC_AUTOPLACE,
113 .eccbytes = 24,
114 .eccpos = {
e0c7d767
DW
115 40, 41, 42, 43, 44, 45, 46, 47,
116 48, 49, 50, 51, 52, 53, 54, 55,
117 56, 57, 58, 59, 60, 61, 62, 63},
118 .oobfree = {{2, 38}}
1da177e4
LT
119};
120
121/* This is used for padding purposes in nand_write_oob */
58dd8f2b 122static uint8_t ffchars[] = {
1da177e4
LT
123 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
124 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
125 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
126 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
127 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
128 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
129 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
130 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
131};
132
133/*
134 * NAND low-level MTD interface functions
135 */
58dd8f2b
TG
136static void nand_write_buf(struct mtd_info *mtd, const uint8_t *buf, int len);
137static void nand_read_buf(struct mtd_info *mtd, uint8_t *buf, int len);
138static int nand_verify_buf(struct mtd_info *mtd, const uint8_t *buf, int len);
1da177e4 139
2c0a2bed 140static int nand_read(struct mtd_info *mtd, loff_t from, size_t len,
58dd8f2b 141 size_t *retlen, uint8_t *buf);
e0c7d767 142static int nand_read_ecc(struct mtd_info *mtd, loff_t from, size_t len,
58dd8f2b 143 size_t *retlen, uint8_t *buf, uint8_t *eccbuf,
2c0a2bed
TG
144 struct nand_oobinfo *oobsel);
145static int nand_read_oob(struct mtd_info *mtd, loff_t from, size_t len,
58dd8f2b 146 size_t *retlen, uint8_t *buf);
2c0a2bed 147static int nand_write(struct mtd_info *mtd, loff_t to, size_t len,
58dd8f2b 148 size_t *retlen, const uint8_t *buf);
e0c7d767 149static int nand_write_ecc(struct mtd_info *mtd, loff_t to, size_t len,
58dd8f2b 150 size_t *retlen, const uint8_t *buf, uint8_t *eccbuf,
2c0a2bed
TG
151 struct nand_oobinfo *oobsel);
152static int nand_write_oob(struct mtd_info *mtd, loff_t to, size_t len,
58dd8f2b 153 size_t *retlen, const uint8_t *buf);
2c0a2bed
TG
154static int nand_writev(struct mtd_info *mtd, const struct kvec *vecs,
155 unsigned long count, loff_t to, size_t *retlen);
e0c7d767 156static int nand_writev_ecc(struct mtd_info *mtd, const struct kvec *vecs,
2c0a2bed 157 unsigned long count, loff_t to, size_t *retlen,
58dd8f2b 158 uint8_t *eccbuf, struct nand_oobinfo *oobsel);
e0c7d767
DW
159static int nand_erase(struct mtd_info *mtd, struct erase_info *instr);
160static void nand_sync(struct mtd_info *mtd);
1da177e4
LT
161
162/* Some internal functions */
2c0a2bed 163static int nand_write_page(struct mtd_info *mtd, struct nand_chip *this,
58dd8f2b 164 int page, uint8_t * oob_buf,
e0c7d767 165 struct nand_oobinfo *oobsel, int mode);
1da177e4 166#ifdef CONFIG_MTD_NAND_VERIFY_WRITE
2c0a2bed 167static int nand_verify_pages(struct mtd_info *mtd, struct nand_chip *this,
58dd8f2b 168 int page, int numpages, uint8_t *oob_buf,
2c0a2bed
TG
169 struct nand_oobinfo *oobsel, int chipnr,
170 int oobmode);
1da177e4
LT
171#else
172#define nand_verify_pages(...) (0)
173#endif
61b03bd7 174
2c0a2bed
TG
175static int nand_get_device(struct nand_chip *this, struct mtd_info *mtd,
176 int new_state);
1da177e4
LT
177
178/**
179 * nand_release_device - [GENERIC] release chip
180 * @mtd: MTD device structure
61b03bd7
TG
181 *
182 * Deselect, release chip lock and wake up anyone waiting on the device
1da177e4 183 */
e0c7d767 184static void nand_release_device(struct mtd_info *mtd)
1da177e4
LT
185{
186 struct nand_chip *this = mtd->priv;
187
188 /* De-select the NAND device */
189 this->select_chip(mtd, -1);
0dfc6246 190
a36ed299
TG
191 /* Release the controller and the chip */
192 spin_lock(&this->controller->lock);
193 this->controller->active = NULL;
194 this->state = FL_READY;
195 wake_up(&this->controller->wq);
196 spin_unlock(&this->controller->lock);
1da177e4
LT
197}
198
199/**
200 * nand_read_byte - [DEFAULT] read one byte from the chip
201 * @mtd: MTD device structure
202 *
203 * Default read function for 8bit buswith
204 */
58dd8f2b 205static uint8_t nand_read_byte(struct mtd_info *mtd)
1da177e4
LT
206{
207 struct nand_chip *this = mtd->priv;
208 return readb(this->IO_ADDR_R);
209}
210
211/**
212 * nand_write_byte - [DEFAULT] write one byte to the chip
213 * @mtd: MTD device structure
214 * @byte: pointer to data byte to write
215 *
216 * Default write function for 8it buswith
217 */
58dd8f2b 218static void nand_write_byte(struct mtd_info *mtd, uint8_t byte)
1da177e4
LT
219{
220 struct nand_chip *this = mtd->priv;
221 writeb(byte, this->IO_ADDR_W);
222}
223
224/**
225 * nand_read_byte16 - [DEFAULT] read one byte endianess aware from the chip
226 * @mtd: MTD device structure
227 *
61b03bd7 228 * Default read function for 16bit buswith with
1da177e4
LT
229 * endianess conversion
230 */
58dd8f2b 231static uint8_t nand_read_byte16(struct mtd_info *mtd)
1da177e4
LT
232{
233 struct nand_chip *this = mtd->priv;
58dd8f2b 234 return (uint8_t) cpu_to_le16(readw(this->IO_ADDR_R));
1da177e4
LT
235}
236
237/**
238 * nand_write_byte16 - [DEFAULT] write one byte endianess aware to the chip
239 * @mtd: MTD device structure
240 * @byte: pointer to data byte to write
241 *
242 * Default write function for 16bit buswith with
243 * endianess conversion
244 */
58dd8f2b 245static void nand_write_byte16(struct mtd_info *mtd, uint8_t byte)
1da177e4
LT
246{
247 struct nand_chip *this = mtd->priv;
248 writew(le16_to_cpu((u16) byte), this->IO_ADDR_W);
249}
250
251/**
252 * nand_read_word - [DEFAULT] read one word from the chip
253 * @mtd: MTD device structure
254 *
61b03bd7 255 * Default read function for 16bit buswith without
1da177e4
LT
256 * endianess conversion
257 */
258static u16 nand_read_word(struct mtd_info *mtd)
259{
260 struct nand_chip *this = mtd->priv;
261 return readw(this->IO_ADDR_R);
262}
263
264/**
265 * nand_write_word - [DEFAULT] write one word to the chip
266 * @mtd: MTD device structure
267 * @word: data word to write
268 *
61b03bd7 269 * Default write function for 16bit buswith without
1da177e4
LT
270 * endianess conversion
271 */
272static void nand_write_word(struct mtd_info *mtd, u16 word)
273{
274 struct nand_chip *this = mtd->priv;
275 writew(word, this->IO_ADDR_W);
276}
277
278/**
279 * nand_select_chip - [DEFAULT] control CE line
280 * @mtd: MTD device structure
281 * @chip: chipnumber to select, -1 for deselect
282 *
283 * Default select function for 1 chip devices.
284 */
285static void nand_select_chip(struct mtd_info *mtd, int chip)
286{
287 struct nand_chip *this = mtd->priv;
e0c7d767 288 switch (chip) {
1da177e4 289 case -1:
61b03bd7 290 this->hwcontrol(mtd, NAND_CTL_CLRNCE);
1da177e4
LT
291 break;
292 case 0:
293 this->hwcontrol(mtd, NAND_CTL_SETNCE);
294 break;
295
296 default:
297 BUG();
298 }
299}
300
301/**
302 * nand_write_buf - [DEFAULT] write buffer to chip
303 * @mtd: MTD device structure
304 * @buf: data buffer
305 * @len: number of bytes to write
306 *
307 * Default write function for 8bit buswith
308 */
58dd8f2b 309static void nand_write_buf(struct mtd_info *mtd, const uint8_t *buf, int len)
1da177e4
LT
310{
311 int i;
312 struct nand_chip *this = mtd->priv;
313
e0c7d767 314 for (i = 0; i < len; i++)
1da177e4
LT
315 writeb(buf[i], this->IO_ADDR_W);
316}
317
318/**
61b03bd7 319 * nand_read_buf - [DEFAULT] read chip data into buffer
1da177e4
LT
320 * @mtd: MTD device structure
321 * @buf: buffer to store date
322 * @len: number of bytes to read
323 *
324 * Default read function for 8bit buswith
325 */
58dd8f2b 326static void nand_read_buf(struct mtd_info *mtd, uint8_t *buf, int len)
1da177e4
LT
327{
328 int i;
329 struct nand_chip *this = mtd->priv;
330
e0c7d767 331 for (i = 0; i < len; i++)
1da177e4
LT
332 buf[i] = readb(this->IO_ADDR_R);
333}
334
335/**
61b03bd7 336 * nand_verify_buf - [DEFAULT] Verify chip data against buffer
1da177e4
LT
337 * @mtd: MTD device structure
338 * @buf: buffer containing the data to compare
339 * @len: number of bytes to compare
340 *
341 * Default verify function for 8bit buswith
342 */
58dd8f2b 343static int nand_verify_buf(struct mtd_info *mtd, const uint8_t *buf, int len)
1da177e4
LT
344{
345 int i;
346 struct nand_chip *this = mtd->priv;
347
e0c7d767 348 for (i = 0; i < len; i++)
1da177e4
LT
349 if (buf[i] != readb(this->IO_ADDR_R))
350 return -EFAULT;
351
352 return 0;
353}
354
355/**
356 * nand_write_buf16 - [DEFAULT] write buffer to chip
357 * @mtd: MTD device structure
358 * @buf: data buffer
359 * @len: number of bytes to write
360 *
361 * Default write function for 16bit buswith
362 */
58dd8f2b 363static void nand_write_buf16(struct mtd_info *mtd, const uint8_t *buf, int len)
1da177e4
LT
364{
365 int i;
366 struct nand_chip *this = mtd->priv;
367 u16 *p = (u16 *) buf;
368 len >>= 1;
61b03bd7 369
e0c7d767 370 for (i = 0; i < len; i++)
1da177e4 371 writew(p[i], this->IO_ADDR_W);
61b03bd7 372
1da177e4
LT
373}
374
375/**
61b03bd7 376 * nand_read_buf16 - [DEFAULT] read chip data into buffer
1da177e4
LT
377 * @mtd: MTD device structure
378 * @buf: buffer to store date
379 * @len: number of bytes to read
380 *
381 * Default read function for 16bit buswith
382 */
58dd8f2b 383static void nand_read_buf16(struct mtd_info *mtd, uint8_t *buf, int len)
1da177e4
LT
384{
385 int i;
386 struct nand_chip *this = mtd->priv;
387 u16 *p = (u16 *) buf;
388 len >>= 1;
389
e0c7d767 390 for (i = 0; i < len; i++)
1da177e4
LT
391 p[i] = readw(this->IO_ADDR_R);
392}
393
394/**
61b03bd7 395 * nand_verify_buf16 - [DEFAULT] Verify chip data against buffer
1da177e4
LT
396 * @mtd: MTD device structure
397 * @buf: buffer containing the data to compare
398 * @len: number of bytes to compare
399 *
400 * Default verify function for 16bit buswith
401 */
58dd8f2b 402static int nand_verify_buf16(struct mtd_info *mtd, const uint8_t *buf, int len)
1da177e4
LT
403{
404 int i;
405 struct nand_chip *this = mtd->priv;
406 u16 *p = (u16 *) buf;
407 len >>= 1;
408
e0c7d767 409 for (i = 0; i < len; i++)
1da177e4
LT
410 if (p[i] != readw(this->IO_ADDR_R))
411 return -EFAULT;
412
413 return 0;
414}
415
416/**
417 * nand_block_bad - [DEFAULT] Read bad block marker from the chip
418 * @mtd: MTD device structure
419 * @ofs: offset from device start
420 * @getchip: 0, if the chip is already selected
421 *
61b03bd7 422 * Check, if the block is bad.
1da177e4
LT
423 */
424static int nand_block_bad(struct mtd_info *mtd, loff_t ofs, int getchip)
425{
426 int page, chipnr, res = 0;
427 struct nand_chip *this = mtd->priv;
428 u16 bad;
429
430 if (getchip) {
431 page = (int)(ofs >> this->page_shift);
432 chipnr = (int)(ofs >> this->chip_shift);
433
434 /* Grab the lock and see if the device is available */
e0c7d767 435 nand_get_device(this, mtd, FL_READING);
1da177e4
LT
436
437 /* Select the NAND device */
438 this->select_chip(mtd, chipnr);
61b03bd7 439 } else
e0c7d767 440 page = (int)ofs;
1da177e4
LT
441
442 if (this->options & NAND_BUSWIDTH_16) {
2c0a2bed
TG
443 this->cmdfunc(mtd, NAND_CMD_READOOB, this->badblockpos & 0xFE,
444 page & this->pagemask);
1da177e4
LT
445 bad = cpu_to_le16(this->read_word(mtd));
446 if (this->badblockpos & 0x1)
49196f33 447 bad >>= 8;
1da177e4
LT
448 if ((bad & 0xFF) != 0xff)
449 res = 1;
450 } else {
2c0a2bed
TG
451 this->cmdfunc(mtd, NAND_CMD_READOOB, this->badblockpos,
452 page & this->pagemask);
1da177e4
LT
453 if (this->read_byte(mtd) != 0xff)
454 res = 1;
455 }
61b03bd7 456
1da177e4
LT
457 if (getchip) {
458 /* Deselect and wake up anyone waiting on the device */
459 nand_release_device(mtd);
61b03bd7
TG
460 }
461
1da177e4
LT
462 return res;
463}
464
465/**
466 * nand_default_block_markbad - [DEFAULT] mark a block bad
467 * @mtd: MTD device structure
468 * @ofs: offset from device start
469 *
470 * This is the default implementation, which can be overridden by
471 * a hardware specific driver.
472*/
473static int nand_default_block_markbad(struct mtd_info *mtd, loff_t ofs)
474{
475 struct nand_chip *this = mtd->priv;
58dd8f2b 476 uint8_t buf[2] = { 0, 0 };
e0c7d767 477 size_t retlen;
1da177e4 478 int block;
61b03bd7 479
1da177e4 480 /* Get block number */
e0c7d767 481 block = ((int)ofs) >> this->bbt_erase_shift;
41ce9214
AB
482 if (this->bbt)
483 this->bbt[block >> 2] |= 0x01 << ((block & 0x03) << 1);
1da177e4
LT
484
485 /* Do we have a flash based bad block table ? */
486 if (this->options & NAND_USE_FLASH_BBT)
e0c7d767 487 return nand_update_bbt(mtd, ofs);
61b03bd7 488
1da177e4
LT
489 /* We write two bytes, so we dont have to mess with 16 bit access */
490 ofs += mtd->oobsize + (this->badblockpos & ~0x01);
e0c7d767 491 return nand_write_oob(mtd, ofs, 2, &retlen, buf);
1da177e4
LT
492}
493
61b03bd7 494/**
1da177e4
LT
495 * nand_check_wp - [GENERIC] check if the chip is write protected
496 * @mtd: MTD device structure
61b03bd7 497 * Check, if the device is write protected
1da177e4 498 *
61b03bd7 499 * The function expects, that the device is already selected
1da177e4 500 */
e0c7d767 501static int nand_check_wp(struct mtd_info *mtd)
1da177e4
LT
502{
503 struct nand_chip *this = mtd->priv;
504 /* Check the WP bit */
e0c7d767 505 this->cmdfunc(mtd, NAND_CMD_STATUS, -1, -1);
61b03bd7 506 return (this->read_byte(mtd) & NAND_STATUS_WP) ? 0 : 1;
1da177e4
LT
507}
508
509/**
510 * nand_block_checkbad - [GENERIC] Check if a block is marked bad
511 * @mtd: MTD device structure
512 * @ofs: offset from device start
513 * @getchip: 0, if the chip is already selected
514 * @allowbbt: 1, if its allowed to access the bbt area
515 *
516 * Check, if the block is bad. Either by reading the bad block table or
517 * calling of the scan function.
518 */
2c0a2bed
TG
519static int nand_block_checkbad(struct mtd_info *mtd, loff_t ofs, int getchip,
520 int allowbbt)
1da177e4
LT
521{
522 struct nand_chip *this = mtd->priv;
61b03bd7 523
1da177e4
LT
524 if (!this->bbt)
525 return this->block_bad(mtd, ofs, getchip);
61b03bd7 526
1da177e4 527 /* Return info from the table */
e0c7d767 528 return nand_isbad_bbt(mtd, ofs, allowbbt);
1da177e4
LT
529}
530
8fe833c1
RP
531DEFINE_LED_TRIGGER(nand_led_trigger);
532
61b03bd7 533/*
3b88775c
TG
534 * Wait for the ready pin, after a command
535 * The timeout is catched later.
536 */
537static void nand_wait_ready(struct mtd_info *mtd)
538{
539 struct nand_chip *this = mtd->priv;
e0c7d767 540 unsigned long timeo = jiffies + 2;
3b88775c 541
8fe833c1 542 led_trigger_event(nand_led_trigger, LED_FULL);
3b88775c
TG
543 /* wait until command is processed or timeout occures */
544 do {
545 if (this->dev_ready(mtd))
8fe833c1 546 break;
8446f1d3 547 touch_softlockup_watchdog();
61b03bd7 548 } while (time_before(jiffies, timeo));
8fe833c1 549 led_trigger_event(nand_led_trigger, LED_OFF);
3b88775c
TG
550}
551
1da177e4
LT
552/**
553 * nand_command - [DEFAULT] Send command to NAND device
554 * @mtd: MTD device structure
555 * @command: the command to be sent
556 * @column: the column address for this command, -1 if none
557 * @page_addr: the page address for this command, -1 if none
558 *
559 * Send command to NAND device. This function is used for small page
560 * devices (256/512 Bytes per page)
561 */
2c0a2bed
TG
562static void nand_command(struct mtd_info *mtd, unsigned command, int column,
563 int page_addr)
1da177e4
LT
564{
565 register struct nand_chip *this = mtd->priv;
566
567 /* Begin command latch cycle */
568 this->hwcontrol(mtd, NAND_CTL_SETCLE);
569 /*
570 * Write out the command to the device.
571 */
572 if (command == NAND_CMD_SEQIN) {
573 int readcmd;
574
575 if (column >= mtd->oobblock) {
576 /* OOB area */
577 column -= mtd->oobblock;
578 readcmd = NAND_CMD_READOOB;
579 } else if (column < 256) {
580 /* First 256 bytes --> READ0 */
581 readcmd = NAND_CMD_READ0;
582 } else {
583 column -= 256;
584 readcmd = NAND_CMD_READ1;
585 }
586 this->write_byte(mtd, readcmd);
587 }
588 this->write_byte(mtd, command);
589
590 /* Set ALE and clear CLE to start address cycle */
591 this->hwcontrol(mtd, NAND_CTL_CLRCLE);
592
593 if (column != -1 || page_addr != -1) {
594 this->hwcontrol(mtd, NAND_CTL_SETALE);
595
596 /* Serially input address */
597 if (column != -1) {
598 /* Adjust columns for 16 bit buswidth */
599 if (this->options & NAND_BUSWIDTH_16)
600 column >>= 1;
601 this->write_byte(mtd, column);
602 }
603 if (page_addr != -1) {
58dd8f2b
TG
604 this->write_byte(mtd, (uint8_t)(page_addr & 0xff));
605 this->write_byte(mtd, (uint8_t)((page_addr >> 8) & 0xff));
1da177e4
LT
606 /* One more address cycle for devices > 32MiB */
607 if (this->chipsize > (32 << 20))
58dd8f2b 608 this->write_byte(mtd, (uint8_t)((page_addr >> 16) & 0x0f));
1da177e4
LT
609 }
610 /* Latch in address */
611 this->hwcontrol(mtd, NAND_CTL_CLRALE);
612 }
61b03bd7
TG
613
614 /*
615 * program and erase have their own busy handlers
1da177e4 616 * status and sequential in needs no delay
e0c7d767 617 */
1da177e4 618 switch (command) {
61b03bd7 619
1da177e4
LT
620 case NAND_CMD_PAGEPROG:
621 case NAND_CMD_ERASE1:
622 case NAND_CMD_ERASE2:
623 case NAND_CMD_SEQIN:
624 case NAND_CMD_STATUS:
625 return;
626
627 case NAND_CMD_RESET:
61b03bd7 628 if (this->dev_ready)
1da177e4
LT
629 break;
630 udelay(this->chip_delay);
631 this->hwcontrol(mtd, NAND_CTL_SETCLE);
632 this->write_byte(mtd, NAND_CMD_STATUS);
633 this->hwcontrol(mtd, NAND_CTL_CLRCLE);
e0c7d767 634 while (!(this->read_byte(mtd) & NAND_STATUS_READY)) ;
1da177e4
LT
635 return;
636
e0c7d767 637 /* This applies to read commands */
1da177e4 638 default:
61b03bd7 639 /*
1da177e4
LT
640 * If we don't have access to the busy pin, we apply the given
641 * command delay
e0c7d767 642 */
1da177e4 643 if (!this->dev_ready) {
e0c7d767 644 udelay(this->chip_delay);
1da177e4 645 return;
61b03bd7 646 }
1da177e4 647 }
1da177e4
LT
648 /* Apply this short delay always to ensure that we do wait tWB in
649 * any case on any machine. */
e0c7d767 650 ndelay(100);
3b88775c
TG
651
652 nand_wait_ready(mtd);
1da177e4
LT
653}
654
655/**
656 * nand_command_lp - [DEFAULT] Send command to NAND large page device
657 * @mtd: MTD device structure
658 * @command: the command to be sent
659 * @column: the column address for this command, -1 if none
660 * @page_addr: the page address for this command, -1 if none
661 *
662 * Send command to NAND device. This is the version for the new large page devices
e0c7d767 663 * We dont have the separate regions as we have in the small page devices.
1da177e4
LT
664 * We must emulate NAND_CMD_READOOB to keep the code compatible.
665 *
666 */
e0c7d767 667static void nand_command_lp(struct mtd_info *mtd, unsigned command, int column, int page_addr)
1da177e4
LT
668{
669 register struct nand_chip *this = mtd->priv;
670
671 /* Emulate NAND_CMD_READOOB */
672 if (command == NAND_CMD_READOOB) {
673 column += mtd->oobblock;
674 command = NAND_CMD_READ0;
675 }
61b03bd7 676
1da177e4
LT
677 /* Begin command latch cycle */
678 this->hwcontrol(mtd, NAND_CTL_SETCLE);
679 /* Write out the command to the device. */
30f464b7 680 this->write_byte(mtd, (command & 0xff));
1da177e4
LT
681 /* End command latch cycle */
682 this->hwcontrol(mtd, NAND_CTL_CLRCLE);
683
684 if (column != -1 || page_addr != -1) {
685 this->hwcontrol(mtd, NAND_CTL_SETALE);
686
687 /* Serially input address */
688 if (column != -1) {
689 /* Adjust columns for 16 bit buswidth */
690 if (this->options & NAND_BUSWIDTH_16)
691 column >>= 1;
692 this->write_byte(mtd, column & 0xff);
693 this->write_byte(mtd, column >> 8);
61b03bd7 694 }
1da177e4 695 if (page_addr != -1) {
58dd8f2b
TG
696 this->write_byte(mtd, (uint8_t)(page_addr & 0xff));
697 this->write_byte(mtd, (uint8_t)((page_addr >> 8) & 0xff));
1da177e4
LT
698 /* One more address cycle for devices > 128MiB */
699 if (this->chipsize > (128 << 20))
58dd8f2b 700 this->write_byte(mtd, (uint8_t)((page_addr >> 16) & 0xff));
1da177e4
LT
701 }
702 /* Latch in address */
703 this->hwcontrol(mtd, NAND_CTL_CLRALE);
704 }
61b03bd7
TG
705
706 /*
707 * program and erase have their own busy handlers
30f464b7
DM
708 * status, sequential in, and deplete1 need no delay
709 */
1da177e4 710 switch (command) {
61b03bd7 711
1da177e4
LT
712 case NAND_CMD_CACHEDPROG:
713 case NAND_CMD_PAGEPROG:
714 case NAND_CMD_ERASE1:
715 case NAND_CMD_ERASE2:
716 case NAND_CMD_SEQIN:
717 case NAND_CMD_STATUS:
30f464b7 718 case NAND_CMD_DEPLETE1:
1da177e4
LT
719 return;
720
e0c7d767
DW
721 /*
722 * read error status commands require only a short delay
723 */
30f464b7
DM
724 case NAND_CMD_STATUS_ERROR:
725 case NAND_CMD_STATUS_ERROR0:
726 case NAND_CMD_STATUS_ERROR1:
727 case NAND_CMD_STATUS_ERROR2:
728 case NAND_CMD_STATUS_ERROR3:
729 udelay(this->chip_delay);
730 return;
1da177e4
LT
731
732 case NAND_CMD_RESET:
61b03bd7 733 if (this->dev_ready)
1da177e4
LT
734 break;
735 udelay(this->chip_delay);
736 this->hwcontrol(mtd, NAND_CTL_SETCLE);
737 this->write_byte(mtd, NAND_CMD_STATUS);
738 this->hwcontrol(mtd, NAND_CTL_CLRCLE);
e0c7d767 739 while (!(this->read_byte(mtd) & NAND_STATUS_READY)) ;
1da177e4
LT
740 return;
741
742 case NAND_CMD_READ0:
743 /* Begin command latch cycle */
744 this->hwcontrol(mtd, NAND_CTL_SETCLE);
745 /* Write out the start read command */
746 this->write_byte(mtd, NAND_CMD_READSTART);
747 /* End command latch cycle */
748 this->hwcontrol(mtd, NAND_CTL_CLRCLE);
749 /* Fall through into ready check */
61b03bd7 750
e0c7d767 751 /* This applies to read commands */
1da177e4 752 default:
61b03bd7 753 /*
1da177e4
LT
754 * If we don't have access to the busy pin, we apply the given
755 * command delay
e0c7d767 756 */
1da177e4 757 if (!this->dev_ready) {
e0c7d767 758 udelay(this->chip_delay);
1da177e4 759 return;
61b03bd7 760 }
1da177e4 761 }
3b88775c 762
1da177e4
LT
763 /* Apply this short delay always to ensure that we do wait tWB in
764 * any case on any machine. */
e0c7d767 765 ndelay(100);
3b88775c
TG
766
767 nand_wait_ready(mtd);
1da177e4
LT
768}
769
770/**
771 * nand_get_device - [GENERIC] Get chip for selected access
772 * @this: the nand chip descriptor
773 * @mtd: MTD device structure
61b03bd7 774 * @new_state: the state which is requested
1da177e4
LT
775 *
776 * Get the device and lock it for exclusive access
777 */
2c0a2bed
TG
778static int
779nand_get_device(struct nand_chip *this, struct mtd_info *mtd, int new_state)
1da177e4 780{
a36ed299
TG
781 spinlock_t *lock = &this->controller->lock;
782 wait_queue_head_t *wq = &this->controller->wq;
e0c7d767 783 DECLARE_WAITQUEUE(wait, current);
e0c7d767 784 retry:
0dfc6246
TG
785 spin_lock(lock);
786
1da177e4 787 /* Hardware controller shared among independend devices */
a36ed299
TG
788 /* Hardware controller shared among independend devices */
789 if (!this->controller->active)
790 this->controller->active = this;
791
792 if (this->controller->active == this && this->state == FL_READY) {
0dfc6246
TG
793 this->state = new_state;
794 spin_unlock(lock);
962034f4
VW
795 return 0;
796 }
797 if (new_state == FL_PM_SUSPENDED) {
798 spin_unlock(lock);
799 return (this->state == FL_PM_SUSPENDED) ? 0 : -EAGAIN;
0dfc6246
TG
800 }
801 set_current_state(TASK_UNINTERRUPTIBLE);
802 add_wait_queue(wq, &wait);
803 spin_unlock(lock);
804 schedule();
805 remove_wait_queue(wq, &wait);
1da177e4
LT
806 goto retry;
807}
808
809/**
810 * nand_wait - [DEFAULT] wait until the command is done
811 * @mtd: MTD device structure
812 * @this: NAND chip structure
813 * @state: state to select the max. timeout value
814 *
815 * Wait for command done. This applies to erase and program only
61b03bd7 816 * Erase can take up to 400ms and program up to 20ms according to
1da177e4
LT
817 * general NAND and SmartMedia specs
818 *
819*/
820static int nand_wait(struct mtd_info *mtd, struct nand_chip *this, int state)
821{
822
e0c7d767
DW
823 unsigned long timeo = jiffies;
824 int status;
61b03bd7 825
1da177e4 826 if (state == FL_ERASING)
e0c7d767 827 timeo += (HZ * 400) / 1000;
1da177e4 828 else
e0c7d767 829 timeo += (HZ * 20) / 1000;
1da177e4 830
8fe833c1
RP
831 led_trigger_event(nand_led_trigger, LED_FULL);
832
1da177e4
LT
833 /* Apply this short delay always to ensure that we do wait tWB in
834 * any case on any machine. */
e0c7d767 835 ndelay(100);
1da177e4
LT
836
837 if ((state == FL_ERASING) && (this->options & NAND_IS_AND))
e0c7d767 838 this->cmdfunc(mtd, NAND_CMD_STATUS_MULTI, -1, -1);
61b03bd7 839 else
e0c7d767 840 this->cmdfunc(mtd, NAND_CMD_STATUS, -1, -1);
1da177e4 841
61b03bd7 842 while (time_before(jiffies, timeo)) {
1da177e4
LT
843 /* Check, if we were interrupted */
844 if (this->state != state)
845 return 0;
846
847 if (this->dev_ready) {
848 if (this->dev_ready(mtd))
61b03bd7 849 break;
1da177e4
LT
850 } else {
851 if (this->read_byte(mtd) & NAND_STATUS_READY)
852 break;
853 }
20a6c211 854 cond_resched();
1da177e4 855 }
8fe833c1
RP
856 led_trigger_event(nand_led_trigger, LED_OFF);
857
e0c7d767 858 status = (int)this->read_byte(mtd);
1da177e4
LT
859 return status;
860}
861
862/**
863 * nand_write_page - [GENERIC] write one page
864 * @mtd: MTD device structure
865 * @this: NAND chip structure
866 * @page: startpage inside the chip, must be called with (page & this->pagemask)
867 * @oob_buf: out of band data buffer
868 * @oobsel: out of band selecttion structre
869 * @cached: 1 = enable cached programming if supported by chip
870 *
871 * Nand_page_program function is used for write and writev !
872 * This function will always program a full page of data
873 * If you call it with a non page aligned buffer, you're lost :)
874 *
875 * Cached programming is not supported yet.
876 */
e0c7d767 877static int nand_write_page(struct mtd_info *mtd, struct nand_chip *this, int page,
58dd8f2b 878 uint8_t *oob_buf, struct nand_oobinfo *oobsel, int cached)
1da177e4 879{
e0c7d767 880 int i, status;
58dd8f2b 881 uint8_t ecc_code[32];
e0c7d767
DW
882 int eccmode = oobsel->useecc ? this->eccmode : NAND_ECC_NONE;
883 int *oob_config = oobsel->eccpos;
884 int datidx = 0, eccidx = 0, eccsteps = this->eccsteps;
885 int eccbytes = 0;
61b03bd7 886
1da177e4
LT
887 /* FIXME: Enable cached programming */
888 cached = 0;
61b03bd7 889
1da177e4 890 /* Send command to begin auto page programming */
e0c7d767 891 this->cmdfunc(mtd, NAND_CMD_SEQIN, 0x00, page);
1da177e4
LT
892
893 /* Write out complete page of data, take care of eccmode */
894 switch (eccmode) {
e0c7d767 895 /* No ecc, write all */
1da177e4 896 case NAND_ECC_NONE:
e0c7d767 897 printk(KERN_WARNING "Writing data without ECC to NAND-FLASH is not recommended\n");
1da177e4
LT
898 this->write_buf(mtd, this->data_poi, mtd->oobblock);
899 break;
61b03bd7 900
e0c7d767 901 /* Software ecc 3/256, write all */
1da177e4
LT
902 case NAND_ECC_SOFT:
903 for (; eccsteps; eccsteps--) {
904 this->calculate_ecc(mtd, &this->data_poi[datidx], ecc_code);
905 for (i = 0; i < 3; i++, eccidx++)
906 oob_buf[oob_config[eccidx]] = ecc_code[i];
907 datidx += this->eccsize;
908 }
909 this->write_buf(mtd, this->data_poi, mtd->oobblock);
910 break;
911 default:
912 eccbytes = this->eccbytes;
913 for (; eccsteps; eccsteps--) {
914 /* enable hardware ecc logic for write */
915 this->enable_hwecc(mtd, NAND_ECC_WRITE);
916 this->write_buf(mtd, &this->data_poi[datidx], this->eccsize);
917 this->calculate_ecc(mtd, &this->data_poi[datidx], ecc_code);
918 for (i = 0; i < eccbytes; i++, eccidx++)
919 oob_buf[oob_config[eccidx]] = ecc_code[i];
920 /* If the hardware ecc provides syndromes then
921 * the ecc code must be written immidiately after
922 * the data bytes (words) */
923 if (this->options & NAND_HWECC_SYNDROME)
924 this->write_buf(mtd, ecc_code, eccbytes);
925 datidx += this->eccsize;
926 }
927 break;
928 }
61b03bd7 929
1da177e4
LT
930 /* Write out OOB data */
931 if (this->options & NAND_HWECC_SYNDROME)
932 this->write_buf(mtd, &oob_buf[oobsel->eccbytes], mtd->oobsize - oobsel->eccbytes);
61b03bd7 933 else
1da177e4
LT
934 this->write_buf(mtd, oob_buf, mtd->oobsize);
935
936 /* Send command to actually program the data */
e0c7d767 937 this->cmdfunc(mtd, cached ? NAND_CMD_CACHEDPROG : NAND_CMD_PAGEPROG, -1, -1);
1da177e4
LT
938
939 if (!cached) {
940 /* call wait ready function */
e0c7d767 941 status = this->waitfunc(mtd, this, FL_WRITING);
068e3c0a
DM
942
943 /* See if operation failed and additional status checks are available */
944 if ((status & NAND_STATUS_FAIL) && (this->errstat)) {
945 status = this->errstat(mtd, this, FL_WRITING, status, page);
946 }
947
1da177e4 948 /* See if device thinks it succeeded */
a4ab4c5d 949 if (status & NAND_STATUS_FAIL) {
e0c7d767 950 DEBUG(MTD_DEBUG_LEVEL0, "%s: " "Failed write, page 0x%08x, ", __FUNCTION__, page);
1da177e4
LT
951 return -EIO;
952 }
953 } else {
954 /* FIXME: Implement cached programming ! */
e0c7d767 955 /* wait until cache is ready */
1da177e4
LT
956 // status = this->waitfunc (mtd, this, FL_CACHEDRPG);
957 }
61b03bd7 958 return 0;
1da177e4
LT
959}
960
961#ifdef CONFIG_MTD_NAND_VERIFY_WRITE
962/**
963 * nand_verify_pages - [GENERIC] verify the chip contents after a write
964 * @mtd: MTD device structure
965 * @this: NAND chip structure
2c0a2bed 966 * @page: startpage inside the chip, must be called with (page & this->pagemask)
1da177e4
LT
967 * @numpages: number of pages to verify
968 * @oob_buf: out of band data buffer
969 * @oobsel: out of band selecttion structre
970 * @chipnr: number of the current chip
971 * @oobmode: 1 = full buffer verify, 0 = ecc only
972 *
973 * The NAND device assumes that it is always writing to a cleanly erased page.
61b03bd7 974 * Hence, it performs its internal write verification only on bits that
1da177e4 975 * transitioned from 1 to 0. The device does NOT verify the whole page on a
61b03bd7
TG
976 * byte by byte basis. It is possible that the page was not completely erased
977 * or the page is becoming unusable due to wear. The read with ECC would catch
978 * the error later when the ECC page check fails, but we would rather catch
1da177e4
LT
979 * it early in the page write stage. Better to write no data than invalid data.
980 */
e0c7d767 981static int nand_verify_pages(struct mtd_info *mtd, struct nand_chip *this, int page, int numpages,
58dd8f2b 982 uint8_t *oob_buf, struct nand_oobinfo *oobsel, int chipnr, int oobmode)
1da177e4 983{
e0c7d767
DW
984 int i, j, datidx = 0, oobofs = 0, res = -EIO;
985 int eccsteps = this->eccsteps;
986 int hweccbytes;
58dd8f2b 987 uint8_t oobdata[64];
1da177e4
LT
988
989 hweccbytes = (this->options & NAND_HWECC_SYNDROME) ? (oobsel->eccbytes / eccsteps) : 0;
990
991 /* Send command to read back the first page */
e0c7d767 992 this->cmdfunc(mtd, NAND_CMD_READ0, 0, page);
1da177e4 993
e0c7d767 994 for (;;) {
1da177e4
LT
995 for (j = 0; j < eccsteps; j++) {
996 /* Loop through and verify the data */
997 if (this->verify_buf(mtd, &this->data_poi[datidx], mtd->eccsize)) {
e0c7d767 998 DEBUG(MTD_DEBUG_LEVEL0, "%s: " "Failed write verify, page 0x%08x ", __FUNCTION__, page);
1da177e4
LT
999 goto out;
1000 }
1001 datidx += mtd->eccsize;
1002 /* Have we a hw generator layout ? */
1003 if (!hweccbytes)
1004 continue;
1005 if (this->verify_buf(mtd, &this->oob_buf[oobofs], hweccbytes)) {
e0c7d767 1006 DEBUG(MTD_DEBUG_LEVEL0, "%s: " "Failed write verify, page 0x%08x ", __FUNCTION__, page);
1da177e4
LT
1007 goto out;
1008 }
1009 oobofs += hweccbytes;
1010 }
1011
1012 /* check, if we must compare all data or if we just have to
1013 * compare the ecc bytes
1014 */
1015 if (oobmode) {
1016 if (this->verify_buf(mtd, &oob_buf[oobofs], mtd->oobsize - hweccbytes * eccsteps)) {
e0c7d767 1017 DEBUG(MTD_DEBUG_LEVEL0, "%s: " "Failed write verify, page 0x%08x ", __FUNCTION__, page);
1da177e4
LT
1018 goto out;
1019 }
1020 } else {
1021 /* Read always, else autoincrement fails */
1022 this->read_buf(mtd, oobdata, mtd->oobsize - hweccbytes * eccsteps);
1023
1024 if (oobsel->useecc != MTD_NANDECC_OFF && !hweccbytes) {
1025 int ecccnt = oobsel->eccbytes;
61b03bd7 1026
1da177e4
LT
1027 for (i = 0; i < ecccnt; i++) {
1028 int idx = oobsel->eccpos[i];
e0c7d767
DW
1029 if (oobdata[idx] != oob_buf[oobofs + idx]) {
1030 DEBUG(MTD_DEBUG_LEVEL0, "%s: Failed ECC write verify, page 0x%08x, %6i bytes were succesful\n",
1031 __FUNCTION__, page, i);
1da177e4
LT
1032 goto out;
1033 }
1034 }
61b03bd7 1035 }
1da177e4
LT
1036 }
1037 oobofs += mtd->oobsize - hweccbytes * eccsteps;
1038 page++;
1039 numpages--;
1040
61b03bd7 1041 /* Apply delay or wait for ready/busy pin
1da177e4
LT
1042 * Do this before the AUTOINCR check, so no problems
1043 * arise if a chip which does auto increment
1044 * is marked as NOAUTOINCR by the board driver.
1045 * Do this also before returning, so the chip is
1046 * ready for the next command.
e0c7d767 1047 */
61b03bd7 1048 if (!this->dev_ready)
e0c7d767 1049 udelay(this->chip_delay);
1da177e4 1050 else
3b88775c 1051 nand_wait_ready(mtd);
1da177e4
LT
1052
1053 /* All done, return happy */
1054 if (!numpages)
1055 return 0;
61b03bd7 1056
61b03bd7 1057 /* Check, if the chip supports auto page increment */
1da177e4 1058 if (!NAND_CANAUTOINCR(this))
e0c7d767 1059 this->cmdfunc(mtd, NAND_CMD_READ0, 0x00, page);
1da177e4 1060 }
61b03bd7 1061 /*
1da177e4
LT
1062 * Terminate the read command. We come here in case of an error
1063 * So we must issue a reset command.
1064 */
e0c7d767
DW
1065 out:
1066 this->cmdfunc(mtd, NAND_CMD_RESET, -1, -1);
1da177e4
LT
1067 return res;
1068}
1069#endif
1070
1071/**
068e3c0a 1072 * nand_read - [MTD Interface] MTD compability function for nand_do_read_ecc
1da177e4
LT
1073 * @mtd: MTD device structure
1074 * @from: offset to read from
1075 * @len: number of bytes to read
1076 * @retlen: pointer to variable to store the number of read bytes
1077 * @buf: the databuffer to put data
1078 *
068e3c0a
DM
1079 * This function simply calls nand_do_read_ecc with oob buffer and oobsel = NULL
1080 * and flags = 0xff
1081 */
58dd8f2b 1082static int nand_read(struct mtd_info *mtd, loff_t from, size_t len, size_t *retlen, uint8_t *buf)
1da177e4 1083{
e0c7d767 1084 return nand_do_read_ecc(mtd, from, len, retlen, buf, NULL, &mtd->oobinfo, 0xff);
22c60f5f 1085}
1da177e4 1086
1da177e4 1087/**
068e3c0a 1088 * nand_read_ecc - [MTD Interface] MTD compability function for nand_do_read_ecc
1da177e4
LT
1089 * @mtd: MTD device structure
1090 * @from: offset to read from
1091 * @len: number of bytes to read
1092 * @retlen: pointer to variable to store the number of read bytes
1093 * @buf: the databuffer to put data
1094 * @oob_buf: filesystem supplied oob data buffer
1095 * @oobsel: oob selection structure
1096 *
068e3c0a 1097 * This function simply calls nand_do_read_ecc with flags = 0xff
1da177e4 1098 */
e0c7d767 1099static int nand_read_ecc(struct mtd_info *mtd, loff_t from, size_t len,
58dd8f2b 1100 size_t *retlen, uint8_t *buf, uint8_t *oob_buf, struct nand_oobinfo *oobsel)
068e3c0a 1101{
22c60f5f
TG
1102 /* use userspace supplied oobinfo, if zero */
1103 if (oobsel == NULL)
1104 oobsel = &mtd->oobinfo;
068e3c0a
DM
1105 return nand_do_read_ecc(mtd, from, len, retlen, buf, oob_buf, oobsel, 0xff);
1106}
1107
068e3c0a
DM
1108/**
1109 * nand_do_read_ecc - [MTD Interface] Read data with ECC
1110 * @mtd: MTD device structure
1111 * @from: offset to read from
1112 * @len: number of bytes to read
1113 * @retlen: pointer to variable to store the number of read bytes
1114 * @buf: the databuffer to put data
bb75ba4c 1115 * @oob_buf: filesystem supplied oob data buffer (can be NULL)
22c60f5f 1116 * @oobsel: oob selection structure
068e3c0a
DM
1117 * @flags: flag to indicate if nand_get_device/nand_release_device should be preformed
1118 * and how many corrected error bits are acceptable:
1119 * bits 0..7 - number of tolerable errors
1120 * bit 8 - 0 == do not get/release chip, 1 == get/release chip
1121 *
1122 * NAND read with ECC
1123 */
e0c7d767 1124int nand_do_read_ecc(struct mtd_info *mtd, loff_t from, size_t len,
58dd8f2b 1125 size_t *retlen, uint8_t *buf, uint8_t *oob_buf, struct nand_oobinfo *oobsel, int flags)
1da177e4 1126{
22c60f5f 1127
1da177e4
LT
1128 int i, j, col, realpage, page, end, ecc, chipnr, sndcmd = 1;
1129 int read = 0, oob = 0, ecc_status = 0, ecc_failed = 0;
1130 struct nand_chip *this = mtd->priv;
58dd8f2b
TG
1131 uint8_t *data_poi, *oob_data = oob_buf;
1132 uint8_t ecc_calc[32];
1133 uint8_t ecc_code[32];
e0c7d767
DW
1134 int eccmode, eccsteps;
1135 int *oob_config, datidx;
1136 int blockcheck = (1 << (this->phys_erase_shift - this->page_shift)) - 1;
1137 int eccbytes;
1138 int compareecc = 1;
1139 int oobreadlen;
1da177e4 1140
e0c7d767 1141 DEBUG(MTD_DEBUG_LEVEL3, "nand_read_ecc: from = 0x%08x, len = %i\n", (unsigned int)from, (int)len);
1da177e4
LT
1142
1143 /* Do not allow reads past end of device */
1144 if ((from + len) > mtd->size) {
e0c7d767 1145 DEBUG(MTD_DEBUG_LEVEL0, "nand_read_ecc: Attempt read beyond end of device\n");
1da177e4
LT
1146 *retlen = 0;
1147 return -EINVAL;
1148 }
1149
1150 /* Grab the lock and see if the device is available */
068e3c0a 1151 if (flags & NAND_GET_DEVICE)
e0c7d767 1152 nand_get_device(this, mtd, FL_READING);
1da177e4 1153
1da177e4
LT
1154 /* Autoplace of oob data ? Use the default placement scheme */
1155 if (oobsel->useecc == MTD_NANDECC_AUTOPLACE)
1156 oobsel = this->autooob;
61b03bd7 1157
1da177e4
LT
1158 eccmode = oobsel->useecc ? this->eccmode : NAND_ECC_NONE;
1159 oob_config = oobsel->eccpos;
1160
1161 /* Select the NAND device */
1162 chipnr = (int)(from >> this->chip_shift);
1163 this->select_chip(mtd, chipnr);
1164
1165 /* First we calculate the starting page */
e0c7d767 1166 realpage = (int)(from >> this->page_shift);
1da177e4
LT
1167 page = realpage & this->pagemask;
1168
1169 /* Get raw starting column */
1170 col = from & (mtd->oobblock - 1);
1171
1172 end = mtd->oobblock;
1173 ecc = this->eccsize;
1174 eccbytes = this->eccbytes;
61b03bd7 1175
1da177e4
LT
1176 if ((eccmode == NAND_ECC_NONE) || (this->options & NAND_HWECC_SYNDROME))
1177 compareecc = 0;
1178
1179 oobreadlen = mtd->oobsize;
61b03bd7 1180 if (this->options & NAND_HWECC_SYNDROME)
1da177e4
LT
1181 oobreadlen -= oobsel->eccbytes;
1182
1183 /* Loop until all data read */
1184 while (read < len) {
61b03bd7 1185
1da177e4 1186 int aligned = (!col && (len - read) >= end);
61b03bd7 1187 /*
1da177e4
LT
1188 * If the read is not page aligned, we have to read into data buffer
1189 * due to ecc, else we read into return buffer direct
1190 */
1191 if (aligned)
1192 data_poi = &buf[read];
61b03bd7 1193 else
1da177e4 1194 data_poi = this->data_buf;
61b03bd7
TG
1195
1196 /* Check, if we have this page in the buffer
1da177e4
LT
1197 *
1198 * FIXME: Make it work when we must provide oob data too,
1199 * check the usage of data_buf oob field
1200 */
1201 if (realpage == this->pagebuf && !oob_buf) {
1202 /* aligned read ? */
1203 if (aligned)
e0c7d767 1204 memcpy(data_poi, this->data_buf, end);
1da177e4
LT
1205 goto readdata;
1206 }
1207
1208 /* Check, if we must send the read command */
1209 if (sndcmd) {
e0c7d767 1210 this->cmdfunc(mtd, NAND_CMD_READ0, 0x00, page);
1da177e4 1211 sndcmd = 0;
61b03bd7 1212 }
1da177e4
LT
1213
1214 /* get oob area, if we have no oob buffer from fs-driver */
90e260c8
TG
1215 if (!oob_buf || oobsel->useecc == MTD_NANDECC_AUTOPLACE ||
1216 oobsel->useecc == MTD_NANDECC_AUTOPL_USR)
1da177e4
LT
1217 oob_data = &this->data_buf[end];
1218
1219 eccsteps = this->eccsteps;
61b03bd7 1220
1da177e4 1221 switch (eccmode) {
e0c7d767
DW
1222 case NAND_ECC_NONE:{
1223 /* No ECC, Read in a page */
1224 static unsigned long lastwhinge = 0;
1225 if ((lastwhinge / HZ) != (jiffies / HZ)) {
1226 printk(KERN_WARNING
1227 "Reading data from NAND FLASH without ECC is not recommended\n");
1228 lastwhinge = jiffies;
1229 }
1230 this->read_buf(mtd, data_poi, end);
1231 break;
1da177e4 1232 }
61b03bd7 1233
1da177e4
LT
1234 case NAND_ECC_SOFT: /* Software ECC 3/256: Read in a page + oob data */
1235 this->read_buf(mtd, data_poi, end);
e0c7d767 1236 for (i = 0, datidx = 0; eccsteps; eccsteps--, i += 3, datidx += ecc)
1da177e4 1237 this->calculate_ecc(mtd, &data_poi[datidx], &ecc_calc[i]);
61b03bd7 1238 break;
1da177e4
LT
1239
1240 default:
e0c7d767 1241 for (i = 0, datidx = 0; eccsteps; eccsteps--, i += eccbytes, datidx += ecc) {
1da177e4
LT
1242 this->enable_hwecc(mtd, NAND_ECC_READ);
1243 this->read_buf(mtd, &data_poi[datidx], ecc);
1244
1245 /* HW ecc with syndrome calculation must read the
1246 * syndrome from flash immidiately after the data */
1247 if (!compareecc) {
1248 /* Some hw ecc generators need to know when the
1249 * syndrome is read from flash */
1250 this->enable_hwecc(mtd, NAND_ECC_READSYN);
1251 this->read_buf(mtd, &oob_data[i], eccbytes);
1252 /* We calc error correction directly, it checks the hw
1253 * generator for an error, reads back the syndrome and
1254 * does the error correction on the fly */
068e3c0a
DM
1255 ecc_status = this->correct_data(mtd, &data_poi[datidx], &oob_data[i], &ecc_code[i]);
1256 if ((ecc_status == -1) || (ecc_status > (flags && 0xff))) {
e0c7d767
DW
1257 DEBUG(MTD_DEBUG_LEVEL0, "nand_read_ecc: "
1258 "Failed ECC read, page 0x%08x on chip %d\n", page, chipnr);
1da177e4
LT
1259 ecc_failed++;
1260 }
1261 } else {
1262 this->calculate_ecc(mtd, &data_poi[datidx], &ecc_calc[i]);
61b03bd7 1263 }
1da177e4 1264 }
61b03bd7 1265 break;
1da177e4
LT
1266 }
1267
1268 /* read oobdata */
1269 this->read_buf(mtd, &oob_data[mtd->oobsize - oobreadlen], oobreadlen);
1270
1271 /* Skip ECC check, if not requested (ECC_NONE or HW_ECC with syndromes) */
1272 if (!compareecc)
61b03bd7
TG
1273 goto readoob;
1274
1da177e4
LT
1275 /* Pick the ECC bytes out of the oob data */
1276 for (j = 0; j < oobsel->eccbytes; j++)
1277 ecc_code[j] = oob_data[oob_config[j]];
1278
e0c7d767 1279 /* correct data, if necessary */
1da177e4
LT
1280 for (i = 0, j = 0, datidx = 0; i < this->eccsteps; i++, datidx += ecc) {
1281 ecc_status = this->correct_data(mtd, &data_poi[datidx], &ecc_code[j], &ecc_calc[j]);
61b03bd7 1282
1da177e4
LT
1283 /* Get next chunk of ecc bytes */
1284 j += eccbytes;
61b03bd7
TG
1285
1286 /* Check, if we have a fs supplied oob-buffer,
1da177e4
LT
1287 * This is the legacy mode. Used by YAFFS1
1288 * Should go away some day
1289 */
61b03bd7 1290 if (oob_buf && oobsel->useecc == MTD_NANDECC_PLACE) {
1da177e4
LT
1291 int *p = (int *)(&oob_data[mtd->oobsize]);
1292 p[i] = ecc_status;
1293 }
61b03bd7
TG
1294
1295 if ((ecc_status == -1) || (ecc_status > (flags && 0xff))) {
e0c7d767 1296 DEBUG(MTD_DEBUG_LEVEL0, "nand_read_ecc: " "Failed ECC read, page 0x%08x\n", page);
1da177e4
LT
1297 ecc_failed++;
1298 }
61b03bd7 1299 }
1da177e4 1300
e0c7d767 1301 readoob:
1da177e4
LT
1302 /* check, if we have a fs supplied oob-buffer */
1303 if (oob_buf) {
1304 /* without autoplace. Legacy mode used by YAFFS1 */
e0c7d767 1305 switch (oobsel->useecc) {
1da177e4 1306 case MTD_NANDECC_AUTOPLACE:
90e260c8 1307 case MTD_NANDECC_AUTOPL_USR:
1da177e4 1308 /* Walk through the autoplace chunks */
82e1d19f 1309 for (i = 0; oobsel->oobfree[i][1]; i++) {
1da177e4
LT
1310 int from = oobsel->oobfree[i][0];
1311 int num = oobsel->oobfree[i][1];
1312 memcpy(&oob_buf[oob], &oob_data[from], num);
82e1d19f 1313 oob += num;
1da177e4 1314 }
1da177e4
LT
1315 break;
1316 case MTD_NANDECC_PLACE:
1317 /* YAFFS1 legacy mode */
e0c7d767 1318 oob_data += this->eccsteps * sizeof(int);
1da177e4
LT
1319 default:
1320 oob_data += mtd->oobsize;
1321 }
1322 }
1323 readdata:
1324 /* Partial page read, transfer data into fs buffer */
61b03bd7 1325 if (!aligned) {
1da177e4
LT
1326 for (j = col; j < end && read < len; j++)
1327 buf[read++] = data_poi[j];
61b03bd7
TG
1328 this->pagebuf = realpage;
1329 } else
1da177e4
LT
1330 read += mtd->oobblock;
1331
61b03bd7 1332 /* Apply delay or wait for ready/busy pin
1da177e4
LT
1333 * Do this before the AUTOINCR check, so no problems
1334 * arise if a chip which does auto increment
1335 * is marked as NOAUTOINCR by the board driver.
e0c7d767 1336 */
61b03bd7 1337 if (!this->dev_ready)
e0c7d767 1338 udelay(this->chip_delay);
1da177e4 1339 else
3b88775c 1340 nand_wait_ready(mtd);
61b03bd7 1341
1da177e4 1342 if (read == len)
61b03bd7 1343 break;
1da177e4
LT
1344
1345 /* For subsequent reads align to page boundary. */
1346 col = 0;
1347 /* Increment page address */
1348 realpage++;
1349
1350 page = realpage & this->pagemask;
1351 /* Check, if we cross a chip boundary */
1352 if (!page) {
1353 chipnr++;
1354 this->select_chip(mtd, -1);
1355 this->select_chip(mtd, chipnr);
1356 }
61b03bd7
TG
1357 /* Check, if the chip supports auto page increment
1358 * or if we have hit a block boundary.
e0c7d767 1359 */
1da177e4 1360 if (!NAND_CANAUTOINCR(this) || !(page & blockcheck))
61b03bd7 1361 sndcmd = 1;
1da177e4
LT
1362 }
1363
1364 /* Deselect and wake up anyone waiting on the device */
068e3c0a
DM
1365 if (flags & NAND_GET_DEVICE)
1366 nand_release_device(mtd);
1da177e4
LT
1367
1368 /*
1369 * Return success, if no ECC failures, else -EBADMSG
1370 * fs driver will take care of that, because
1371 * retlen == desired len and result == -EBADMSG
1372 */
1373 *retlen = read;
1374 return ecc_failed ? -EBADMSG : 0;
1375}
1376
1377/**
1378 * nand_read_oob - [MTD Interface] NAND read out-of-band
1379 * @mtd: MTD device structure
1380 * @from: offset to read from
1381 * @len: number of bytes to read
1382 * @retlen: pointer to variable to store the number of read bytes
1383 * @buf: the databuffer to put data
1384 *
1385 * NAND read out-of-band data from the spare area
1386 */
58dd8f2b 1387static int nand_read_oob(struct mtd_info *mtd, loff_t from, size_t len, size_t *retlen, uint8_t *buf)
1da177e4
LT
1388{
1389 int i, col, page, chipnr;
1390 struct nand_chip *this = mtd->priv;
e0c7d767 1391 int blockcheck = (1 << (this->phys_erase_shift - this->page_shift)) - 1;
1da177e4 1392
e0c7d767 1393 DEBUG(MTD_DEBUG_LEVEL3, "nand_read_oob: from = 0x%08x, len = %i\n", (unsigned int)from, (int)len);
1da177e4
LT
1394
1395 /* Shift to get page */
1396 page = (int)(from >> this->page_shift);
1397 chipnr = (int)(from >> this->chip_shift);
61b03bd7 1398
1da177e4
LT
1399 /* Mask to get column */
1400 col = from & (mtd->oobsize - 1);
1401
1402 /* Initialize return length value */
1403 *retlen = 0;
1404
1405 /* Do not allow reads past end of device */
1406 if ((from + len) > mtd->size) {
e0c7d767 1407 DEBUG(MTD_DEBUG_LEVEL0, "nand_read_oob: Attempt read beyond end of device\n");
1da177e4
LT
1408 *retlen = 0;
1409 return -EINVAL;
1410 }
1411
1412 /* Grab the lock and see if the device is available */
e0c7d767 1413 nand_get_device(this, mtd, FL_READING);
1da177e4
LT
1414
1415 /* Select the NAND device */
1416 this->select_chip(mtd, chipnr);
1417
1418 /* Send the read command */
e0c7d767 1419 this->cmdfunc(mtd, NAND_CMD_READOOB, col, page & this->pagemask);
61b03bd7 1420 /*
1da177e4
LT
1421 * Read the data, if we read more than one page
1422 * oob data, let the device transfer the data !
1423 */
1424 i = 0;
1425 while (i < len) {
1426 int thislen = mtd->oobsize - col;
1427 thislen = min_t(int, thislen, len);
1428 this->read_buf(mtd, &buf[i], thislen);
1429 i += thislen;
1da177e4
LT
1430
1431 /* Read more ? */
1432 if (i < len) {
1433 page++;
1434 col = 0;
1435
1436 /* Check, if we cross a chip boundary */
1437 if (!(page & this->pagemask)) {
1438 chipnr++;
1439 this->select_chip(mtd, -1);
1440 this->select_chip(mtd, chipnr);
1441 }
61b03bd7
TG
1442
1443 /* Apply delay or wait for ready/busy pin
19870da7
TG
1444 * Do this before the AUTOINCR check, so no problems
1445 * arise if a chip which does auto increment
1446 * is marked as NOAUTOINCR by the board driver.
1447 */
61b03bd7 1448 if (!this->dev_ready)
e0c7d767 1449 udelay(this->chip_delay);
19870da7
TG
1450 else
1451 nand_wait_ready(mtd);
1452
61b03bd7
TG
1453 /* Check, if the chip supports auto page increment
1454 * or if we have hit a block boundary.
e0c7d767 1455 */
1da177e4
LT
1456 if (!NAND_CANAUTOINCR(this) || !(page & blockcheck)) {
1457 /* For subsequent page reads set offset to 0 */
e0c7d767 1458 this->cmdfunc(mtd, NAND_CMD_READOOB, 0x0, page & this->pagemask);
1da177e4
LT
1459 }
1460 }
1461 }
1462
1463 /* Deselect and wake up anyone waiting on the device */
1464 nand_release_device(mtd);
1465
1466 /* Return happy */
1467 *retlen = len;
1468 return 0;
1469}
1470
1471/**
1472 * nand_read_raw - [GENERIC] Read raw data including oob into buffer
1473 * @mtd: MTD device structure
1474 * @buf: temporary buffer
1475 * @from: offset to read from
1476 * @len: number of bytes to read
1477 * @ooblen: number of oob data bytes to read
1478 *
1479 * Read raw data including oob into buffer
1480 */
e0c7d767 1481int nand_read_raw(struct mtd_info *mtd, uint8_t *buf, loff_t from, size_t len, size_t ooblen)
1da177e4
LT
1482{
1483 struct nand_chip *this = mtd->priv;
e0c7d767
DW
1484 int page = (int)(from >> this->page_shift);
1485 int chip = (int)(from >> this->chip_shift);
1da177e4
LT
1486 int sndcmd = 1;
1487 int cnt = 0;
1488 int pagesize = mtd->oobblock + mtd->oobsize;
e0c7d767 1489 int blockcheck = (1 << (this->phys_erase_shift - this->page_shift)) - 1;
1da177e4
LT
1490
1491 /* Do not allow reads past end of device */
1492 if ((from + len) > mtd->size) {
e0c7d767 1493 DEBUG(MTD_DEBUG_LEVEL0, "nand_read_raw: Attempt read beyond end of device\n");
1da177e4
LT
1494 return -EINVAL;
1495 }
1496
1497 /* Grab the lock and see if the device is available */
e0c7d767 1498 nand_get_device(this, mtd, FL_READING);
1da177e4 1499
e0c7d767 1500 this->select_chip(mtd, chip);
61b03bd7 1501
1da177e4
LT
1502 /* Add requested oob length */
1503 len += ooblen;
61b03bd7 1504
1da177e4
LT
1505 while (len) {
1506 if (sndcmd)
e0c7d767 1507 this->cmdfunc(mtd, NAND_CMD_READ0, 0, page & this->pagemask);
61b03bd7 1508 sndcmd = 0;
1da177e4 1509
e0c7d767 1510 this->read_buf(mtd, &buf[cnt], pagesize);
1da177e4
LT
1511
1512 len -= pagesize;
1513 cnt += pagesize;
1514 page++;
61b03bd7
TG
1515
1516 if (!this->dev_ready)
e0c7d767 1517 udelay(this->chip_delay);
1da177e4 1518 else
3b88775c 1519 nand_wait_ready(mtd);
61b03bd7
TG
1520
1521 /* Check, if the chip supports auto page increment */
1da177e4
LT
1522 if (!NAND_CANAUTOINCR(this) || !(page & blockcheck))
1523 sndcmd = 1;
1524 }
1525
1526 /* Deselect and wake up anyone waiting on the device */
1527 nand_release_device(mtd);
1528 return 0;
1529}
1530
61b03bd7
TG
1531/**
1532 * nand_prepare_oobbuf - [GENERIC] Prepare the out of band buffer
1da177e4
LT
1533 * @mtd: MTD device structure
1534 * @fsbuf: buffer given by fs driver
1535 * @oobsel: out of band selection structre
1536 * @autoplace: 1 = place given buffer into the oob bytes
1537 * @numpages: number of pages to prepare
1538 *
1539 * Return:
1540 * 1. Filesystem buffer available and autoplacement is off,
1541 * return filesystem buffer
1542 * 2. No filesystem buffer or autoplace is off, return internal
1543 * buffer
1544 * 3. Filesystem buffer is given and autoplace selected
1545 * put data from fs buffer into internal buffer and
1546 * retrun internal buffer
1547 *
1548 * Note: The internal buffer is filled with 0xff. This must
1549 * be done only once, when no autoplacement happens
1550 * Autoplacement sets the buffer dirty flag, which
1551 * forces the 0xff fill before using the buffer again.
1552 *
1553*/
58dd8f2b 1554static uint8_t *nand_prepare_oobbuf(struct mtd_info *mtd, uint8_t *fsbuf, struct nand_oobinfo *oobsel,
e0c7d767 1555 int autoplace, int numpages)
1da177e4
LT
1556{
1557 struct nand_chip *this = mtd->priv;
1558 int i, len, ofs;
1559
1560 /* Zero copy fs supplied buffer */
61b03bd7 1561 if (fsbuf && !autoplace)
1da177e4
LT
1562 return fsbuf;
1563
1564 /* Check, if the buffer must be filled with ff again */
61b03bd7 1565 if (this->oobdirty) {
e0c7d767 1566 memset(this->oob_buf, 0xff, mtd->oobsize << (this->phys_erase_shift - this->page_shift));
1da177e4 1567 this->oobdirty = 0;
61b03bd7
TG
1568 }
1569
1da177e4
LT
1570 /* If we have no autoplacement or no fs buffer use the internal one */
1571 if (!autoplace || !fsbuf)
1572 return this->oob_buf;
61b03bd7 1573
1da177e4
LT
1574 /* Walk through the pages and place the data */
1575 this->oobdirty = 1;
1576 ofs = 0;
1577 while (numpages--) {
1578 for (i = 0, len = 0; len < mtd->oobavail; i++) {
1579 int to = ofs + oobsel->oobfree[i][0];
1580 int num = oobsel->oobfree[i][1];
e0c7d767 1581 memcpy(&this->oob_buf[to], fsbuf, num);
1da177e4
LT
1582 len += num;
1583 fsbuf += num;
1584 }
1585 ofs += mtd->oobavail;
1586 }
1587 return this->oob_buf;
1588}
1589
1590#define NOTALIGNED(x) (x & (mtd->oobblock-1)) != 0
1591
1592/**
1593 * nand_write - [MTD Interface] compability function for nand_write_ecc
1594 * @mtd: MTD device structure
1595 * @to: offset to write to
1596 * @len: number of bytes to write
1597 * @retlen: pointer to variable to store the number of written bytes
1598 * @buf: the data to write
1599 *
1600 * This function simply calls nand_write_ecc with oob buffer and oobsel = NULL
1601 *
1602*/
58dd8f2b 1603static int nand_write(struct mtd_info *mtd, loff_t to, size_t len, size_t *retlen, const uint8_t *buf)
1da177e4 1604{
e0c7d767 1605 return (nand_write_ecc(mtd, to, len, retlen, buf, NULL, NULL));
1da177e4 1606}
61b03bd7 1607
1da177e4
LT
1608/**
1609 * nand_write_ecc - [MTD Interface] NAND write with ECC
1610 * @mtd: MTD device structure
1611 * @to: offset to write to
1612 * @len: number of bytes to write
1613 * @retlen: pointer to variable to store the number of written bytes
1614 * @buf: the data to write
1615 * @eccbuf: filesystem supplied oob data buffer
1616 * @oobsel: oob selection structure
1617 *
1618 * NAND write with ECC
1619 */
e0c7d767 1620static int nand_write_ecc(struct mtd_info *mtd, loff_t to, size_t len,
58dd8f2b 1621 size_t *retlen, const uint8_t *buf, uint8_t *eccbuf,
e0c7d767 1622 struct nand_oobinfo *oobsel)
1da177e4
LT
1623{
1624 int startpage, page, ret = -EIO, oob = 0, written = 0, chipnr;
1625 int autoplace = 0, numpages, totalpages;
1626 struct nand_chip *this = mtd->priv;
58dd8f2b 1627 uint8_t *oobbuf, *bufstart;
e0c7d767 1628 int ppblock = (1 << (this->phys_erase_shift - this->page_shift));
1da177e4 1629
e0c7d767 1630 DEBUG(MTD_DEBUG_LEVEL3, "nand_write_ecc: to = 0x%08x, len = %i\n", (unsigned int)to, (int)len);
1da177e4
LT
1631
1632 /* Initialize retlen, in case of early exit */
1633 *retlen = 0;
1634
1635 /* Do not allow write past end of device */
1636 if ((to + len) > mtd->size) {
e0c7d767 1637 DEBUG(MTD_DEBUG_LEVEL0, "nand_write_ecc: Attempt to write past end of page\n");
1da177e4
LT
1638 return -EINVAL;
1639 }
1640
61b03bd7 1641 /* reject writes, which are not page aligned */
e0c7d767
DW
1642 if (NOTALIGNED(to) || NOTALIGNED(len)) {
1643 printk(KERN_NOTICE "nand_write_ecc: Attempt to write not page aligned data\n");
1da177e4
LT
1644 return -EINVAL;
1645 }
1646
1647 /* Grab the lock and see if the device is available */
e0c7d767 1648 nand_get_device(this, mtd, FL_WRITING);
1da177e4
LT
1649
1650 /* Calculate chipnr */
1651 chipnr = (int)(to >> this->chip_shift);
1652 /* Select the NAND device */
1653 this->select_chip(mtd, chipnr);
1654
1655 /* Check, if it is write protected */
1656 if (nand_check_wp(mtd))
1657 goto out;
1658
1659 /* if oobsel is NULL, use chip defaults */
61b03bd7
TG
1660 if (oobsel == NULL)
1661 oobsel = &mtd->oobinfo;
1662
1da177e4
LT
1663 /* Autoplace of oob data ? Use the default placement scheme */
1664 if (oobsel->useecc == MTD_NANDECC_AUTOPLACE) {
1665 oobsel = this->autooob;
1666 autoplace = 1;
61b03bd7 1667 }
90e260c8
TG
1668 if (oobsel->useecc == MTD_NANDECC_AUTOPL_USR)
1669 autoplace = 1;
1da177e4
LT
1670
1671 /* Setup variables and oob buffer */
1672 totalpages = len >> this->page_shift;
e0c7d767 1673 page = (int)(to >> this->page_shift);
1da177e4 1674 /* Invalidate the page cache, if we write to the cached page */
61b03bd7 1675 if (page <= this->pagebuf && this->pagebuf < (page + totalpages))
1da177e4 1676 this->pagebuf = -1;
61b03bd7 1677
1da177e4
LT
1678 /* Set it relative to chip */
1679 page &= this->pagemask;
1680 startpage = page;
1681 /* Calc number of pages we can write in one go */
e0c7d767
DW
1682 numpages = min(ppblock - (startpage & (ppblock - 1)), totalpages);
1683 oobbuf = nand_prepare_oobbuf(mtd, eccbuf, oobsel, autoplace, numpages);
58dd8f2b 1684 bufstart = (uint8_t *) buf;
1da177e4
LT
1685
1686 /* Loop until all data is written */
1687 while (written < len) {
1688
58dd8f2b 1689 this->data_poi = (uint8_t *) &buf[written];
1da177e4
LT
1690 /* Write one page. If this is the last page to write
1691 * or the last page in this block, then use the
1692 * real pageprogram command, else select cached programming
1693 * if supported by the chip.
1694 */
e0c7d767 1695 ret = nand_write_page(mtd, this, page, &oobbuf[oob], oobsel, (--numpages > 0));
1da177e4 1696 if (ret) {
e0c7d767 1697 DEBUG(MTD_DEBUG_LEVEL0, "nand_write_ecc: write_page failed %d\n", ret);
1da177e4 1698 goto out;
61b03bd7 1699 }
1da177e4
LT
1700 /* Next oob page */
1701 oob += mtd->oobsize;
1702 /* Update written bytes count */
1703 written += mtd->oobblock;
61b03bd7 1704 if (written == len)
1da177e4 1705 goto cmp;
61b03bd7 1706
1da177e4
LT
1707 /* Increment page address */
1708 page++;
1709
1710 /* Have we hit a block boundary ? Then we have to verify and
1711 * if verify is ok, we have to setup the oob buffer for
1712 * the next pages.
e0c7d767
DW
1713 */
1714 if (!(page & (ppblock - 1))) {
1da177e4
LT
1715 int ofs;
1716 this->data_poi = bufstart;
e0c7d767
DW
1717 ret = nand_verify_pages(mtd, this, startpage, page - startpage,
1718 oobbuf, oobsel, chipnr, (eccbuf != NULL));
1da177e4 1719 if (ret) {
e0c7d767 1720 DEBUG(MTD_DEBUG_LEVEL0, "nand_write_ecc: verify_pages failed %d\n", ret);
1da177e4 1721 goto out;
61b03bd7 1722 }
1da177e4
LT
1723 *retlen = written;
1724
1725 ofs = autoplace ? mtd->oobavail : mtd->oobsize;
1726 if (eccbuf)
1727 eccbuf += (page - startpage) * ofs;
1728 totalpages -= page - startpage;
e0c7d767 1729 numpages = min(totalpages, ppblock);
1da177e4
LT
1730 page &= this->pagemask;
1731 startpage = page;
e0c7d767 1732 oobbuf = nand_prepare_oobbuf(mtd, eccbuf, oobsel, autoplace, numpages);
868801e5 1733 oob = 0;
1da177e4
LT
1734 /* Check, if we cross a chip boundary */
1735 if (!page) {
1736 chipnr++;
1737 this->select_chip(mtd, -1);
1738 this->select_chip(mtd, chipnr);
1739 }
1740 }
1741 }
1742 /* Verify the remaining pages */
e0c7d767 1743 cmp:
1da177e4 1744 this->data_poi = bufstart;
e0c7d767 1745 ret = nand_verify_pages(mtd, this, startpage, totalpages, oobbuf, oobsel, chipnr, (eccbuf != NULL));
1da177e4
LT
1746 if (!ret)
1747 *retlen = written;
61b03bd7 1748 else
e0c7d767 1749 DEBUG(MTD_DEBUG_LEVEL0, "nand_write_ecc: verify_pages failed %d\n", ret);
1da177e4 1750
e0c7d767 1751 out:
1da177e4
LT
1752 /* Deselect and wake up anyone waiting on the device */
1753 nand_release_device(mtd);
1754
1755 return ret;
1756}
1757
1da177e4
LT
1758/**
1759 * nand_write_oob - [MTD Interface] NAND write out-of-band
1760 * @mtd: MTD device structure
1761 * @to: offset to write to
1762 * @len: number of bytes to write
1763 * @retlen: pointer to variable to store the number of written bytes
1764 * @buf: the data to write
1765 *
1766 * NAND write out-of-band
1767 */
58dd8f2b 1768static int nand_write_oob(struct mtd_info *mtd, loff_t to, size_t len, size_t *retlen, const uint8_t *buf)
1da177e4
LT
1769{
1770 int column, page, status, ret = -EIO, chipnr;
1771 struct nand_chip *this = mtd->priv;
1772
e0c7d767 1773 DEBUG(MTD_DEBUG_LEVEL3, "nand_write_oob: to = 0x%08x, len = %i\n", (unsigned int)to, (int)len);
1da177e4
LT
1774
1775 /* Shift to get page */
e0c7d767
DW
1776 page = (int)(to >> this->page_shift);
1777 chipnr = (int)(to >> this->chip_shift);
1da177e4
LT
1778
1779 /* Mask to get column */
1780 column = to & (mtd->oobsize - 1);
1781
1782 /* Initialize return length value */
1783 *retlen = 0;
1784
1785 /* Do not allow write past end of page */
1786 if ((column + len) > mtd->oobsize) {
e0c7d767 1787 DEBUG(MTD_DEBUG_LEVEL0, "nand_write_oob: Attempt to write past end of page\n");
1da177e4
LT
1788 return -EINVAL;
1789 }
1790
1791 /* Grab the lock and see if the device is available */
e0c7d767 1792 nand_get_device(this, mtd, FL_WRITING);
1da177e4
LT
1793
1794 /* Select the NAND device */
1795 this->select_chip(mtd, chipnr);
1796
1797 /* Reset the chip. Some chips (like the Toshiba TC5832DC found
1798 in one of my DiskOnChip 2000 test units) will clear the whole
1799 data page too if we don't do this. I have no clue why, but
1800 I seem to have 'fixed' it in the doc2000 driver in
1801 August 1999. dwmw2. */
1802 this->cmdfunc(mtd, NAND_CMD_RESET, -1, -1);
1803
1804 /* Check, if it is write protected */
1805 if (nand_check_wp(mtd))
1806 goto out;
61b03bd7 1807
1da177e4
LT
1808 /* Invalidate the page cache, if we write to the cached page */
1809 if (page == this->pagebuf)
1810 this->pagebuf = -1;
1811
1812 if (NAND_MUST_PAD(this)) {
1813 /* Write out desired data */
e0c7d767 1814 this->cmdfunc(mtd, NAND_CMD_SEQIN, mtd->oobblock, page & this->pagemask);
1da177e4
LT
1815 /* prepad 0xff for partial programming */
1816 this->write_buf(mtd, ffchars, column);
1817 /* write data */
1818 this->write_buf(mtd, buf, len);
1819 /* postpad 0xff for partial programming */
e0c7d767 1820 this->write_buf(mtd, ffchars, mtd->oobsize - (len + column));
1da177e4
LT
1821 } else {
1822 /* Write out desired data */
e0c7d767 1823 this->cmdfunc(mtd, NAND_CMD_SEQIN, mtd->oobblock + column, page & this->pagemask);
1da177e4
LT
1824 /* write data */
1825 this->write_buf(mtd, buf, len);
1826 }
1827 /* Send command to program the OOB data */
e0c7d767 1828 this->cmdfunc(mtd, NAND_CMD_PAGEPROG, -1, -1);
1da177e4 1829
e0c7d767 1830 status = this->waitfunc(mtd, this, FL_WRITING);
1da177e4
LT
1831
1832 /* See if device thinks it succeeded */
a4ab4c5d 1833 if (status & NAND_STATUS_FAIL) {
e0c7d767 1834 DEBUG(MTD_DEBUG_LEVEL0, "nand_write_oob: " "Failed write, page 0x%08x\n", page);
1da177e4
LT
1835 ret = -EIO;
1836 goto out;
1837 }
1838 /* Return happy */
1839 *retlen = len;
1840
1841#ifdef CONFIG_MTD_NAND_VERIFY_WRITE
1842 /* Send command to read back the data */
e0c7d767 1843 this->cmdfunc(mtd, NAND_CMD_READOOB, column, page & this->pagemask);
1da177e4
LT
1844
1845 if (this->verify_buf(mtd, buf, len)) {
e0c7d767 1846 DEBUG(MTD_DEBUG_LEVEL0, "nand_write_oob: " "Failed write verify, page 0x%08x\n", page);
1da177e4
LT
1847 ret = -EIO;
1848 goto out;
1849 }
1850#endif
1851 ret = 0;
e0c7d767 1852 out:
1da177e4
LT
1853 /* Deselect and wake up anyone waiting on the device */
1854 nand_release_device(mtd);
1855
1856 return ret;
1857}
1858
1da177e4
LT
1859/**
1860 * nand_writev - [MTD Interface] compabilty function for nand_writev_ecc
1861 * @mtd: MTD device structure
1862 * @vecs: the iovectors to write
1863 * @count: number of vectors
1864 * @to: offset to write to
1865 * @retlen: pointer to variable to store the number of written bytes
1866 *
1867 * NAND write with kvec. This just calls the ecc function
1868 */
e0c7d767
DW
1869static int nand_writev(struct mtd_info *mtd, const struct kvec *vecs, unsigned long count,
1870 loff_t to, size_t *retlen)
1da177e4 1871{
e0c7d767 1872 return (nand_writev_ecc(mtd, vecs, count, to, retlen, NULL, NULL));
1da177e4
LT
1873}
1874
1875/**
1876 * nand_writev_ecc - [MTD Interface] write with iovec with ecc
1877 * @mtd: MTD device structure
1878 * @vecs: the iovectors to write
1879 * @count: number of vectors
1880 * @to: offset to write to
1881 * @retlen: pointer to variable to store the number of written bytes
1882 * @eccbuf: filesystem supplied oob data buffer
1883 * @oobsel: oob selection structure
1884 *
1885 * NAND write with iovec with ecc
1886 */
e0c7d767 1887static int nand_writev_ecc(struct mtd_info *mtd, const struct kvec *vecs, unsigned long count,
58dd8f2b 1888 loff_t to, size_t *retlen, uint8_t *eccbuf, struct nand_oobinfo *oobsel)
1da177e4
LT
1889{
1890 int i, page, len, total_len, ret = -EIO, written = 0, chipnr;
1891 int oob, numpages, autoplace = 0, startpage;
1892 struct nand_chip *this = mtd->priv;
e0c7d767 1893 int ppblock = (1 << (this->phys_erase_shift - this->page_shift));
58dd8f2b 1894 uint8_t *oobbuf, *bufstart;
1da177e4
LT
1895
1896 /* Preset written len for early exit */
1897 *retlen = 0;
1898
1899 /* Calculate total length of data */
1900 total_len = 0;
1901 for (i = 0; i < count; i++)
e0c7d767 1902 total_len += (int)vecs[i].iov_len;
1da177e4 1903
e0c7d767 1904 DEBUG(MTD_DEBUG_LEVEL3, "nand_writev: to = 0x%08x, len = %i, count = %ld\n", (unsigned int)to, (unsigned int)total_len, count);
1da177e4
LT
1905
1906 /* Do not allow write past end of page */
1907 if ((to + total_len) > mtd->size) {
e0c7d767 1908 DEBUG(MTD_DEBUG_LEVEL0, "nand_writev: Attempted write past end of device\n");
1da177e4
LT
1909 return -EINVAL;
1910 }
1911
61b03bd7 1912 /* reject writes, which are not page aligned */
e0c7d767
DW
1913 if (NOTALIGNED(to) || NOTALIGNED(total_len)) {
1914 printk(KERN_NOTICE "nand_write_ecc: Attempt to write not page aligned data\n");
1da177e4
LT
1915 return -EINVAL;
1916 }
1917
1918 /* Grab the lock and see if the device is available */
e0c7d767 1919 nand_get_device(this, mtd, FL_WRITING);
1da177e4
LT
1920
1921 /* Get the current chip-nr */
e0c7d767 1922 chipnr = (int)(to >> this->chip_shift);
1da177e4
LT
1923 /* Select the NAND device */
1924 this->select_chip(mtd, chipnr);
1925
1926 /* Check, if it is write protected */
1927 if (nand_check_wp(mtd))
1928 goto out;
1929
1930 /* if oobsel is NULL, use chip defaults */
61b03bd7
TG
1931 if (oobsel == NULL)
1932 oobsel = &mtd->oobinfo;
1da177e4
LT
1933
1934 /* Autoplace of oob data ? Use the default placement scheme */
1935 if (oobsel->useecc == MTD_NANDECC_AUTOPLACE) {
1936 oobsel = this->autooob;
1937 autoplace = 1;
61b03bd7 1938 }
90e260c8
TG
1939 if (oobsel->useecc == MTD_NANDECC_AUTOPL_USR)
1940 autoplace = 1;
1da177e4
LT
1941
1942 /* Setup start page */
e0c7d767 1943 page = (int)(to >> this->page_shift);
1da177e4 1944 /* Invalidate the page cache, if we write to the cached page */
61b03bd7 1945 if (page <= this->pagebuf && this->pagebuf < ((to + total_len) >> this->page_shift))
1da177e4
LT
1946 this->pagebuf = -1;
1947
1948 startpage = page & this->pagemask;
1949
1950 /* Loop until all kvec' data has been written */
1951 len = 0;
1952 while (count) {
1953 /* If the given tuple is >= pagesize then
1954 * write it out from the iov
1955 */
1956 if ((vecs->iov_len - len) >= mtd->oobblock) {
1957 /* Calc number of pages we can write
1958 * out of this iov in one go */
1959 numpages = (vecs->iov_len - len) >> this->page_shift;
1960 /* Do not cross block boundaries */
e0c7d767
DW
1961 numpages = min(ppblock - (startpage & (ppblock - 1)), numpages);
1962 oobbuf = nand_prepare_oobbuf(mtd, NULL, oobsel, autoplace, numpages);
58dd8f2b 1963 bufstart = (uint8_t *) vecs->iov_base;
1da177e4
LT
1964 bufstart += len;
1965 this->data_poi = bufstart;
1966 oob = 0;
1967 for (i = 1; i <= numpages; i++) {
1968 /* Write one page. If this is the last page to write
61b03bd7 1969 * then use the real pageprogram command, else select
1da177e4
LT
1970 * cached programming if supported by the chip.
1971 */
e0c7d767
DW
1972 ret = nand_write_page(mtd, this, page & this->pagemask,
1973 &oobbuf[oob], oobsel, i != numpages);
1da177e4
LT
1974 if (ret)
1975 goto out;
1976 this->data_poi += mtd->oobblock;
1977 len += mtd->oobblock;
1978 oob += mtd->oobsize;
1979 page++;
1980 }
1981 /* Check, if we have to switch to the next tuple */
e0c7d767 1982 if (len >= (int)vecs->iov_len) {
1da177e4
LT
1983 vecs++;
1984 len = 0;
1985 count--;
1986 }
1987 } else {
61b03bd7 1988 /* We must use the internal buffer, read data out of each
1da177e4
LT
1989 * tuple until we have a full page to write
1990 */
1991 int cnt = 0;
1992 while (cnt < mtd->oobblock) {
61b03bd7 1993 if (vecs->iov_base != NULL && vecs->iov_len)
58dd8f2b 1994 this->data_buf[cnt++] = ((uint8_t *) vecs->iov_base)[len++];
1da177e4 1995 /* Check, if we have to switch to the next tuple */
e0c7d767 1996 if (len >= (int)vecs->iov_len) {
1da177e4
LT
1997 vecs++;
1998 len = 0;
1999 count--;
2000 }
2001 }
61b03bd7
TG
2002 this->pagebuf = page;
2003 this->data_poi = this->data_buf;
1da177e4 2004 bufstart = this->data_poi;
61b03bd7 2005 numpages = 1;
e0c7d767
DW
2006 oobbuf = nand_prepare_oobbuf(mtd, NULL, oobsel, autoplace, numpages);
2007 ret = nand_write_page(mtd, this, page & this->pagemask, oobbuf, oobsel, 0);
1da177e4
LT
2008 if (ret)
2009 goto out;
2010 page++;
2011 }
2012
2013 this->data_poi = bufstart;
e0c7d767 2014 ret = nand_verify_pages(mtd, this, startpage, numpages, oobbuf, oobsel, chipnr, 0);
1da177e4
LT
2015 if (ret)
2016 goto out;
61b03bd7 2017
1da177e4
LT
2018 written += mtd->oobblock * numpages;
2019 /* All done ? */
2020 if (!count)
2021 break;
2022
2023 startpage = page & this->pagemask;
2024 /* Check, if we cross a chip boundary */
2025 if (!startpage) {
2026 chipnr++;
2027 this->select_chip(mtd, -1);
2028 this->select_chip(mtd, chipnr);
2029 }
2030 }
2031 ret = 0;
e0c7d767 2032 out:
1da177e4
LT
2033 /* Deselect and wake up anyone waiting on the device */
2034 nand_release_device(mtd);
2035
2036 *retlen = written;
2037 return ret;
2038}
2039
2040/**
2041 * single_erease_cmd - [GENERIC] NAND standard block erase command function
2042 * @mtd: MTD device structure
2043 * @page: the page address of the block which will be erased
2044 *
2045 * Standard erase command for NAND chips
2046 */
e0c7d767 2047static void single_erase_cmd(struct mtd_info *mtd, int page)
1da177e4
LT
2048{
2049 struct nand_chip *this = mtd->priv;
2050 /* Send commands to erase a block */
e0c7d767
DW
2051 this->cmdfunc(mtd, NAND_CMD_ERASE1, -1, page);
2052 this->cmdfunc(mtd, NAND_CMD_ERASE2, -1, -1);
1da177e4
LT
2053}
2054
2055/**
2056 * multi_erease_cmd - [GENERIC] AND specific block erase command function
2057 * @mtd: MTD device structure
2058 * @page: the page address of the block which will be erased
2059 *
2060 * AND multi block erase command function
2061 * Erase 4 consecutive blocks
2062 */
e0c7d767 2063static void multi_erase_cmd(struct mtd_info *mtd, int page)
1da177e4
LT
2064{
2065 struct nand_chip *this = mtd->priv;
2066 /* Send commands to erase a block */
e0c7d767
DW
2067 this->cmdfunc(mtd, NAND_CMD_ERASE1, -1, page++);
2068 this->cmdfunc(mtd, NAND_CMD_ERASE1, -1, page++);
2069 this->cmdfunc(mtd, NAND_CMD_ERASE1, -1, page++);
2070 this->cmdfunc(mtd, NAND_CMD_ERASE1, -1, page);
2071 this->cmdfunc(mtd, NAND_CMD_ERASE2, -1, -1);
1da177e4
LT
2072}
2073
2074/**
2075 * nand_erase - [MTD Interface] erase block(s)
2076 * @mtd: MTD device structure
2077 * @instr: erase instruction
2078 *
2079 * Erase one ore more blocks
2080 */
e0c7d767 2081static int nand_erase(struct mtd_info *mtd, struct erase_info *instr)
1da177e4 2082{
e0c7d767 2083 return nand_erase_nand(mtd, instr, 0);
1da177e4 2084}
61b03bd7 2085
30f464b7 2086#define BBT_PAGE_MASK 0xffffff3f
1da177e4
LT
2087/**
2088 * nand_erase_intern - [NAND Interface] erase block(s)
2089 * @mtd: MTD device structure
2090 * @instr: erase instruction
2091 * @allowbbt: allow erasing the bbt area
2092 *
2093 * Erase one ore more blocks
2094 */
e0c7d767 2095int nand_erase_nand(struct mtd_info *mtd, struct erase_info *instr, int allowbbt)
1da177e4
LT
2096{
2097 int page, len, status, pages_per_block, ret, chipnr;
2098 struct nand_chip *this = mtd->priv;
30f464b7
DM
2099 int rewrite_bbt[NAND_MAX_CHIPS]={0}; /* flags to indicate the page, if bbt needs to be rewritten. */
2100 unsigned int bbt_masked_page; /* bbt mask to compare to page being erased. */
2101 /* It is used to see if the current page is in the same */
2102 /* 256 block group and the same bank as the bbt. */
1da177e4 2103
e0c7d767 2104 DEBUG(MTD_DEBUG_LEVEL3, "nand_erase: start = 0x%08x, len = %i\n", (unsigned int)instr->addr, (unsigned int)instr->len);
1da177e4
LT
2105
2106 /* Start address must align on block boundary */
2107 if (instr->addr & ((1 << this->phys_erase_shift) - 1)) {
e0c7d767 2108 DEBUG(MTD_DEBUG_LEVEL0, "nand_erase: Unaligned address\n");
1da177e4
LT
2109 return -EINVAL;
2110 }
2111
2112 /* Length must align on block boundary */
2113 if (instr->len & ((1 << this->phys_erase_shift) - 1)) {
e0c7d767 2114 DEBUG(MTD_DEBUG_LEVEL0, "nand_erase: Length not block aligned\n");
1da177e4
LT
2115 return -EINVAL;
2116 }
2117
2118 /* Do not allow erase past end of device */
2119 if ((instr->len + instr->addr) > mtd->size) {
e0c7d767 2120 DEBUG(MTD_DEBUG_LEVEL0, "nand_erase: Erase past end of device\n");
1da177e4
LT
2121 return -EINVAL;
2122 }
2123
2124 instr->fail_addr = 0xffffffff;
2125
2126 /* Grab the lock and see if the device is available */
e0c7d767 2127 nand_get_device(this, mtd, FL_ERASING);
1da177e4
LT
2128
2129 /* Shift to get first page */
e0c7d767
DW
2130 page = (int)(instr->addr >> this->page_shift);
2131 chipnr = (int)(instr->addr >> this->chip_shift);
1da177e4
LT
2132
2133 /* Calculate pages in each block */
2134 pages_per_block = 1 << (this->phys_erase_shift - this->page_shift);
2135
2136 /* Select the NAND device */
2137 this->select_chip(mtd, chipnr);
2138
2139 /* Check the WP bit */
2140 /* Check, if it is write protected */
2141 if (nand_check_wp(mtd)) {
e0c7d767 2142 DEBUG(MTD_DEBUG_LEVEL0, "nand_erase: Device is write protected!!!\n");
1da177e4
LT
2143 instr->state = MTD_ERASE_FAILED;
2144 goto erase_exit;
2145 }
2146
30f464b7
DM
2147 /* if BBT requires refresh, set the BBT page mask to see if the BBT should be rewritten */
2148 if (this->options & BBT_AUTO_REFRESH) {
2149 bbt_masked_page = this->bbt_td->pages[chipnr] & BBT_PAGE_MASK;
2150 } else {
2151 bbt_masked_page = 0xffffffff; /* should not match anything */
2152 }
2153
1da177e4
LT
2154 /* Loop through the pages */
2155 len = instr->len;
2156
2157 instr->state = MTD_ERASING;
2158
2159 while (len) {
2160 /* Check if we have a bad block, we do not erase bad blocks ! */
2161 if (nand_block_checkbad(mtd, ((loff_t) page) << this->page_shift, 0, allowbbt)) {
e0c7d767 2162 printk(KERN_WARNING "nand_erase: attempt to erase a bad block at page 0x%08x\n", page);
1da177e4
LT
2163 instr->state = MTD_ERASE_FAILED;
2164 goto erase_exit;
2165 }
61b03bd7
TG
2166
2167 /* Invalidate the page cache, if we erase the block which contains
1da177e4
LT
2168 the current cached page */
2169 if (page <= this->pagebuf && this->pagebuf < (page + pages_per_block))
2170 this->pagebuf = -1;
2171
e0c7d767 2172 this->erase_cmd(mtd, page & this->pagemask);
61b03bd7 2173
e0c7d767 2174 status = this->waitfunc(mtd, this, FL_ERASING);
1da177e4 2175
068e3c0a
DM
2176 /* See if operation failed and additional status checks are available */
2177 if ((status & NAND_STATUS_FAIL) && (this->errstat)) {
2178 status = this->errstat(mtd, this, FL_ERASING, status, page);
2179 }
2180
1da177e4 2181 /* See if block erase succeeded */
a4ab4c5d 2182 if (status & NAND_STATUS_FAIL) {
e0c7d767 2183 DEBUG(MTD_DEBUG_LEVEL0, "nand_erase: " "Failed erase, page 0x%08x\n", page);
1da177e4
LT
2184 instr->state = MTD_ERASE_FAILED;
2185 instr->fail_addr = (page << this->page_shift);
2186 goto erase_exit;
2187 }
30f464b7
DM
2188
2189 /* if BBT requires refresh, set the BBT rewrite flag to the page being erased */
2190 if (this->options & BBT_AUTO_REFRESH) {
61b03bd7 2191 if (((page & BBT_PAGE_MASK) == bbt_masked_page) &&
30f464b7
DM
2192 (page != this->bbt_td->pages[chipnr])) {
2193 rewrite_bbt[chipnr] = (page << this->page_shift);
2194 }
2195 }
61b03bd7 2196
1da177e4
LT
2197 /* Increment page address and decrement length */
2198 len -= (1 << this->phys_erase_shift);
2199 page += pages_per_block;
2200
2201 /* Check, if we cross a chip boundary */
2202 if (len && !(page & this->pagemask)) {
2203 chipnr++;
2204 this->select_chip(mtd, -1);
2205 this->select_chip(mtd, chipnr);
30f464b7 2206
61b03bd7 2207 /* if BBT requires refresh and BBT-PERCHIP,
30f464b7
DM
2208 * set the BBT page mask to see if this BBT should be rewritten */
2209 if ((this->options & BBT_AUTO_REFRESH) && (this->bbt_td->options & NAND_BBT_PERCHIP)) {
2210 bbt_masked_page = this->bbt_td->pages[chipnr] & BBT_PAGE_MASK;
2211 }
2212
1da177e4
LT
2213 }
2214 }
2215 instr->state = MTD_ERASE_DONE;
2216
e0c7d767 2217 erase_exit:
1da177e4
LT
2218
2219 ret = instr->state == MTD_ERASE_DONE ? 0 : -EIO;
2220 /* Do call back function */
2221 if (!ret)
2222 mtd_erase_callback(instr);
2223
2224 /* Deselect and wake up anyone waiting on the device */
2225 nand_release_device(mtd);
2226
30f464b7
DM
2227 /* if BBT requires refresh and erase was successful, rewrite any selected bad block tables */
2228 if ((this->options & BBT_AUTO_REFRESH) && (!ret)) {
2229 for (chipnr = 0; chipnr < this->numchips; chipnr++) {
2230 if (rewrite_bbt[chipnr]) {
2231 /* update the BBT for chip */
e0c7d767
DW
2232 DEBUG(MTD_DEBUG_LEVEL0, "nand_erase_nand: nand_update_bbt (%d:0x%0x 0x%0x)\n",
2233 chipnr, rewrite_bbt[chipnr], this->bbt_td->pages[chipnr]);
2234 nand_update_bbt(mtd, rewrite_bbt[chipnr]);
30f464b7
DM
2235 }
2236 }
2237 }
2238
1da177e4
LT
2239 /* Return more or less happy */
2240 return ret;
2241}
2242
2243/**
2244 * nand_sync - [MTD Interface] sync
2245 * @mtd: MTD device structure
2246 *
2247 * Sync is actually a wait for chip ready function
2248 */
e0c7d767 2249static void nand_sync(struct mtd_info *mtd)
1da177e4
LT
2250{
2251 struct nand_chip *this = mtd->priv;
2252
e0c7d767 2253 DEBUG(MTD_DEBUG_LEVEL3, "nand_sync: called\n");
1da177e4
LT
2254
2255 /* Grab the lock and see if the device is available */
e0c7d767 2256 nand_get_device(this, mtd, FL_SYNCING);
1da177e4 2257 /* Release it and go back */
e0c7d767 2258 nand_release_device(mtd);
1da177e4
LT
2259}
2260
1da177e4
LT
2261/**
2262 * nand_block_isbad - [MTD Interface] Check whether the block at the given offset is bad
2263 * @mtd: MTD device structure
2264 * @ofs: offset relative to mtd start
2265 */
e0c7d767 2266static int nand_block_isbad(struct mtd_info *mtd, loff_t ofs)
1da177e4
LT
2267{
2268 /* Check for invalid offset */
61b03bd7 2269 if (ofs > mtd->size)
1da177e4 2270 return -EINVAL;
61b03bd7 2271
e0c7d767 2272 return nand_block_checkbad(mtd, ofs, 1, 0);
1da177e4
LT
2273}
2274
2275/**
2276 * nand_block_markbad - [MTD Interface] Mark the block at the given offset as bad
2277 * @mtd: MTD device structure
2278 * @ofs: offset relative to mtd start
2279 */
e0c7d767 2280static int nand_block_markbad(struct mtd_info *mtd, loff_t ofs)
1da177e4
LT
2281{
2282 struct nand_chip *this = mtd->priv;
2283 int ret;
2284
e0c7d767
DW
2285 if ((ret = nand_block_isbad(mtd, ofs))) {
2286 /* If it was bad already, return success and do nothing. */
1da177e4
LT
2287 if (ret > 0)
2288 return 0;
e0c7d767
DW
2289 return ret;
2290 }
1da177e4
LT
2291
2292 return this->block_markbad(mtd, ofs);
2293}
2294
962034f4
VW
2295/**
2296 * nand_suspend - [MTD Interface] Suspend the NAND flash
2297 * @mtd: MTD device structure
2298 */
2299static int nand_suspend(struct mtd_info *mtd)
2300{
2301 struct nand_chip *this = mtd->priv;
2302
e0c7d767 2303 return nand_get_device(this, mtd, FL_PM_SUSPENDED);
962034f4
VW
2304}
2305
2306/**
2307 * nand_resume - [MTD Interface] Resume the NAND flash
2308 * @mtd: MTD device structure
2309 */
2310static void nand_resume(struct mtd_info *mtd)
2311{
2312 struct nand_chip *this = mtd->priv;
2313
2314 if (this->state == FL_PM_SUSPENDED)
2315 nand_release_device(mtd);
2316 else
2c0a2bed
TG
2317 printk(KERN_ERR "nand_resume() called for a chip which is not "
2318 "in suspended state\n");
962034f4
VW
2319}
2320
a36ed299
TG
2321/*
2322 * Free allocated data structures
2323 */
2324static void nand_free_kmem(struct nand_chip *this)
2325{
2326 /* Buffer allocated by nand_scan ? */
2327 if (this->options & NAND_OOBBUF_ALLOC)
2328 kfree(this->oob_buf);
2329 /* Buffer allocated by nand_scan ? */
2330 if (this->options & NAND_DATABUF_ALLOC)
2331 kfree(this->data_buf);
2332 /* Controller allocated by nand_scan ? */
2333 if (this->options & NAND_CONTROLLER_ALLOC)
2334 kfree(this->controller);
2335}
2336
7aa65bfd
TG
2337/*
2338 * Allocate buffers and data structures
1da177e4 2339 */
7aa65bfd 2340static int nand_allocate_kmem(struct mtd_info *mtd, struct nand_chip *this)
1da177e4 2341{
7aa65bfd 2342 size_t len;
1da177e4 2343
7aa65bfd
TG
2344 if (!this->oob_buf) {
2345 len = mtd->oobsize <<
2346 (this->phys_erase_shift - this->page_shift);
2347 this->oob_buf = kmalloc(len, GFP_KERNEL);
2348 if (!this->oob_buf)
2349 goto outerr;
2350 this->options |= NAND_OOBBUF_ALLOC;
552d9205
DW
2351 }
2352
7aa65bfd
TG
2353 if (!this->data_buf) {
2354 len = mtd->oobblock + mtd->oobsize;
2355 this->data_buf = kmalloc(len, GFP_KERNEL);
2356 if (!this->data_buf)
2357 goto outerr;
2358 this->options |= NAND_DATABUF_ALLOC;
2359 }
2360
2361 if (!this->controller) {
2362 this->controller = kzalloc(sizeof(struct nand_hw_control),
2363 GFP_KERNEL);
2364 if (!this->controller)
2365 goto outerr;
2366 this->options |= NAND_CONTROLLER_ALLOC;
2367 }
2368 return 0;
1da177e4 2369
7aa65bfd
TG
2370 outerr:
2371 printk(KERN_ERR "nand_scan(): Cannot allocate buffers\n");
2372 nand_free_kmem(this);
2373 return -ENOMEM;
2374}
2375
2376/*
2377 * Set default functions
2378 */
2379static void nand_set_defaults(struct nand_chip *this, int busw)
2380{
1da177e4
LT
2381 /* check for proper chip_delay setup, set 20us if not */
2382 if (!this->chip_delay)
2383 this->chip_delay = 20;
2384
2385 /* check, if a user supplied command function given */
2386 if (this->cmdfunc == NULL)
2387 this->cmdfunc = nand_command;
2388
2389 /* check, if a user supplied wait function given */
2390 if (this->waitfunc == NULL)
2391 this->waitfunc = nand_wait;
2392
2393 if (!this->select_chip)
2394 this->select_chip = nand_select_chip;
2395 if (!this->write_byte)
2396 this->write_byte = busw ? nand_write_byte16 : nand_write_byte;
2397 if (!this->read_byte)
2398 this->read_byte = busw ? nand_read_byte16 : nand_read_byte;
2399 if (!this->write_word)
2400 this->write_word = nand_write_word;
2401 if (!this->read_word)
2402 this->read_word = nand_read_word;
2403 if (!this->block_bad)
2404 this->block_bad = nand_block_bad;
2405 if (!this->block_markbad)
2406 this->block_markbad = nand_default_block_markbad;
2407 if (!this->write_buf)
2408 this->write_buf = busw ? nand_write_buf16 : nand_write_buf;
2409 if (!this->read_buf)
2410 this->read_buf = busw ? nand_read_buf16 : nand_read_buf;
2411 if (!this->verify_buf)
2412 this->verify_buf = busw ? nand_verify_buf16 : nand_verify_buf;
2413 if (!this->scan_bbt)
2414 this->scan_bbt = nand_default_bbt;
7aa65bfd
TG
2415}
2416
2417/*
2418 * Get the flash and manufacturer id and lookup if the typ is supported
2419 */
2420static struct nand_flash_dev *nand_get_flash_type(struct mtd_info *mtd,
2421 struct nand_chip *this,
2422 int busw, int *maf_id)
2423{
2424 struct nand_flash_dev *type = NULL;
2425 int i, dev_id, maf_idx;
1da177e4
LT
2426
2427 /* Select the device */
2428 this->select_chip(mtd, 0);
2429
2430 /* Send the command for reading device ID */
e0c7d767 2431 this->cmdfunc(mtd, NAND_CMD_READID, 0x00, -1);
1da177e4
LT
2432
2433 /* Read manufacturer and device IDs */
7aa65bfd
TG
2434 *maf_id = this->read_byte(mtd);
2435 dev_id = this->read_byte(mtd);
1da177e4 2436
7aa65bfd 2437 /* Lookup the flash id */
1da177e4 2438 for (i = 0; nand_flash_ids[i].name != NULL; i++) {
7aa65bfd
TG
2439 if (dev_id == nand_flash_ids[i].id) {
2440 type = &nand_flash_ids[i];
2441 break;
2442 }
2443 }
61b03bd7 2444
7aa65bfd
TG
2445 if (!type)
2446 return ERR_PTR(-ENODEV);
2447
2448 this->chipsize = nand_flash_ids[i].chipsize << 20;
2449
2450 /* Newer devices have all the information in additional id bytes */
2451 if (!nand_flash_ids[i].pagesize) {
2452 int extid;
2453 /* The 3rd id byte contains non relevant data ATM */
2454 extid = this->read_byte(mtd);
2455 /* The 4th id byte is the important one */
2456 extid = this->read_byte(mtd);
2457 /* Calc pagesize */
2458 mtd->oobblock = 1024 << (extid & 0x3);
2459 extid >>= 2;
2460 /* Calc oobsize */
2461 mtd->oobsize = (8 << (extid & 0x01)) * (mtd->oobblock >> 9);
2462 extid >>= 2;
2463 /* Calc blocksize. Blocksize is multiples of 64KiB */
2464 mtd->erasesize = (64 * 1024) << (extid & 0x03);
2465 extid >>= 2;
2466 /* Get buswidth information */
2467 busw = (extid & 0x01) ? NAND_BUSWIDTH_16 : 0;
61b03bd7 2468
7aa65bfd
TG
2469 } else {
2470 /*
2471 * Old devices have this data hardcoded in the device id table
2472 */
2473 mtd->erasesize = nand_flash_ids[i].erasesize;
2474 mtd->oobblock = nand_flash_ids[i].pagesize;
2475 mtd->oobsize = mtd->oobblock / 32;
2476 busw = nand_flash_ids[i].options & NAND_BUSWIDTH_16;
2477 }
1da177e4 2478
7aa65bfd
TG
2479 /* Try to identify manufacturer */
2480 for (maf_idx = 0; nand_manuf_ids[maf_idx].id != 0x0; maf_id++) {
2481 if (nand_manuf_ids[maf_idx].id == *maf_id)
2482 break;
2483 }
0ea4a755 2484
7aa65bfd
TG
2485 /*
2486 * Check, if buswidth is correct. Hardware drivers should set
2487 * this correct !
2488 */
2489 if (busw != (this->options & NAND_BUSWIDTH_16)) {
2490 printk(KERN_INFO "NAND device: Manufacturer ID:"
2491 " 0x%02x, Chip ID: 0x%02x (%s %s)\n", *maf_id,
2492 dev_id, nand_manuf_ids[maf_idx].name, mtd->name);
2493 printk(KERN_WARNING "NAND bus width %d instead %d bit\n",
2494 (this->options & NAND_BUSWIDTH_16) ? 16 : 8,
2495 busw ? 16 : 8);
2496 return ERR_PTR(-EINVAL);
2497 }
61b03bd7 2498
7aa65bfd
TG
2499 /* Calculate the address shift from the page size */
2500 this->page_shift = ffs(mtd->oobblock) - 1;
2501 /* Convert chipsize to number of pages per chip -1. */
2502 this->pagemask = (this->chipsize >> this->page_shift) - 1;
61b03bd7 2503
7aa65bfd
TG
2504 this->bbt_erase_shift = this->phys_erase_shift =
2505 ffs(mtd->erasesize) - 1;
2506 this->chip_shift = ffs(this->chipsize) - 1;
1da177e4 2507
7aa65bfd
TG
2508 /* Set the bad block position */
2509 this->badblockpos = mtd->oobblock > 512 ?
2510 NAND_LARGE_BADBLOCK_POS : NAND_SMALL_BADBLOCK_POS;
61b03bd7 2511
7aa65bfd
TG
2512 /* Get chip options, preserve non chip based options */
2513 this->options &= ~NAND_CHIPOPTIONS_MSK;
2514 this->options |= nand_flash_ids[i].options & NAND_CHIPOPTIONS_MSK;
2515
2516 /*
2517 * Set this as a default. Board drivers can override it, if necessary
2518 */
2519 this->options |= NAND_NO_AUTOINCR;
2520
2521 /* Check if this is a not a samsung device. Do not clear the
2522 * options for chips which are not having an extended id.
2523 */
2524 if (*maf_id != NAND_MFR_SAMSUNG && !nand_flash_ids[i].pagesize)
2525 this->options &= ~NAND_SAMSUNG_LP_OPTIONS;
2526
2527 /* Check for AND chips with 4 page planes */
2528 if (this->options & NAND_4PAGE_ARRAY)
2529 this->erase_cmd = multi_erase_cmd;
2530 else
2531 this->erase_cmd = single_erase_cmd;
2532
2533 /* Do not replace user supplied command function ! */
2534 if (mtd->oobblock > 512 && this->cmdfunc == nand_command)
2535 this->cmdfunc = nand_command_lp;
2536
2537 printk(KERN_INFO "NAND device: Manufacturer ID:"
2538 " 0x%02x, Chip ID: 0x%02x (%s %s)\n", *maf_id, dev_id,
2539 nand_manuf_ids[maf_idx].name, type->name);
2540
2541 return type;
2542}
2543
2544/* module_text_address() isn't exported, and it's mostly a pointless
2545 test if this is a module _anyway_ -- they'd have to try _really_ hard
2546 to call us from in-kernel code if the core NAND support is modular. */
2547#ifdef MODULE
2548#define caller_is_module() (1)
2549#else
2550#define caller_is_module() \
2551 module_text_address((unsigned long)__builtin_return_address(0))
2552#endif
2553
2554/**
2555 * nand_scan - [NAND Interface] Scan for the NAND device
2556 * @mtd: MTD device structure
2557 * @maxchips: Number of chips to scan for
2558 *
2559 * This fills out all the uninitialized function pointers
2560 * with the defaults.
2561 * The flash ID is read and the mtd/chip structures are
2562 * filled with the appropriate values. Buffers are allocated if
2563 * they are not provided by the board driver
2564 * The mtd->owner field must be set to the module of the caller
2565 *
2566 */
2567int nand_scan(struct mtd_info *mtd, int maxchips)
2568{
2569 int i, busw, nand_maf_id;
2570 struct nand_chip *this = mtd->priv;
2571 struct nand_flash_dev *type;
2572
2573 /* Many callers got this wrong, so check for it for a while... */
2574 if (!mtd->owner && caller_is_module()) {
2575 printk(KERN_CRIT "nand_scan() called with NULL mtd->owner!\n");
2576 BUG();
1da177e4
LT
2577 }
2578
7aa65bfd
TG
2579 /* Get buswidth to select the correct functions */
2580 busw = this->options & NAND_BUSWIDTH_16;
2581 /* Set the default functions */
2582 nand_set_defaults(this, busw);
2583
2584 /* Read the flash type */
2585 type = nand_get_flash_type(mtd, this, busw, &nand_maf_id);
2586
2587 if (IS_ERR(type)) {
e0c7d767 2588 printk(KERN_WARNING "No NAND device found!!!\n");
1da177e4 2589 this->select_chip(mtd, -1);
7aa65bfd 2590 return PTR_ERR(type);
1da177e4
LT
2591 }
2592
7aa65bfd 2593 /* Check for a chip array */
e0c7d767 2594 for (i = 1; i < maxchips; i++) {
1da177e4 2595 this->select_chip(mtd, i);
1da177e4 2596 /* Send the command for reading device ID */
e0c7d767 2597 this->cmdfunc(mtd, NAND_CMD_READID, 0x00, -1);
1da177e4
LT
2598 /* Read manufacturer and device IDs */
2599 if (nand_maf_id != this->read_byte(mtd) ||
7aa65bfd 2600 type->id != this->read_byte(mtd))
1da177e4
LT
2601 break;
2602 }
2603 if (i > 1)
2604 printk(KERN_INFO "%d NAND chips detected\n", i);
61b03bd7 2605
1da177e4
LT
2606 /* Store the number of chips and calc total size for mtd */
2607 this->numchips = i;
2608 mtd->size = i * this->chipsize;
7aa65bfd
TG
2609
2610 /* Allocate buffers and data structures */
2611 if (nand_allocate_kmem(mtd, this))
2612 return -ENOMEM;
2613
1da177e4 2614 /* Preset the internal oob buffer */
7aa65bfd
TG
2615 memset(this->oob_buf, 0xff,
2616 mtd->oobsize << (this->phys_erase_shift - this->page_shift));
1da177e4 2617
7aa65bfd
TG
2618 /*
2619 * If no default placement scheme is given, select an appropriate one
2620 */
1da177e4 2621 if (!this->autooob) {
61b03bd7 2622 switch (mtd->oobsize) {
1da177e4
LT
2623 case 8:
2624 this->autooob = &nand_oob_8;
2625 break;
2626 case 16:
2627 this->autooob = &nand_oob_16;
2628 break;
2629 case 64:
2630 this->autooob = &nand_oob_64;
2631 break;
2632 default:
7aa65bfd
TG
2633 printk(KERN_WARNING "No oob scheme defined for "
2634 "oobsize %d\n", mtd->oobsize);
1da177e4
LT
2635 BUG();
2636 }
2637 }
61b03bd7 2638
7aa65bfd
TG
2639 /*
2640 * The number of bytes available for the filesystem to place fs
2641 * dependend oob data
2642 */
998cf640
TG
2643 mtd->oobavail = 0;
2644 for (i = 0; this->autooob->oobfree[i][1]; i++)
2645 mtd->oobavail += this->autooob->oobfree[i][1];
1da177e4 2646
61b03bd7 2647 /*
7aa65bfd
TG
2648 * check ECC mode, default to software if 3byte/512byte hardware ECC is
2649 * selected and we have 256 byte pagesize fallback to software ECC
e0c7d767 2650 */
7aa65bfd 2651 this->eccsize = 256;
1da177e4
LT
2652 this->eccbytes = 3;
2653
2654 switch (this->eccmode) {
2655 case NAND_ECC_HW12_2048:
2656 if (mtd->oobblock < 2048) {
7aa65bfd
TG
2657 printk(KERN_WARNING "2048 byte HW ECC not possible on "
2658 "%d byte page size, fallback to SW ECC\n",
1da177e4
LT
2659 mtd->oobblock);
2660 this->eccmode = NAND_ECC_SOFT;
2661 this->calculate_ecc = nand_calculate_ecc;
2662 this->correct_data = nand_correct_data;
2663 } else
2664 this->eccsize = 2048;
2665 break;
2666
61b03bd7
TG
2667 case NAND_ECC_HW3_512:
2668 case NAND_ECC_HW6_512:
2669 case NAND_ECC_HW8_512:
1da177e4 2670 if (mtd->oobblock == 256) {
7aa65bfd
TG
2671 printk(KERN_WARNING "512 byte HW ECC not possible on "
2672 "256 Byte pagesize, fallback to SW ECC \n");
1da177e4
LT
2673 this->eccmode = NAND_ECC_SOFT;
2674 this->calculate_ecc = nand_calculate_ecc;
2675 this->correct_data = nand_correct_data;
61b03bd7 2676 } else
e0c7d767 2677 this->eccsize = 512; /* set eccsize to 512 */
1da177e4 2678 break;
61b03bd7 2679
1da177e4
LT
2680 case NAND_ECC_HW3_256:
2681 break;
61b03bd7
TG
2682
2683 case NAND_ECC_NONE:
7aa65bfd
TG
2684 printk(KERN_WARNING "NAND_ECC_NONE selected by board driver. "
2685 "This is not recommended !!\n");
1da177e4
LT
2686 this->eccmode = NAND_ECC_NONE;
2687 break;
2688
61b03bd7 2689 case NAND_ECC_SOFT:
1da177e4
LT
2690 this->calculate_ecc = nand_calculate_ecc;
2691 this->correct_data = nand_correct_data;
2692 break;
2693
2694 default:
7aa65bfd
TG
2695 printk(KERN_WARNING "Invalid NAND_ECC_MODE %d\n",
2696 this->eccmode);
61b03bd7
TG
2697 BUG();
2698 }
1da177e4 2699
7aa65bfd
TG
2700 /*
2701 * Check hardware ecc function availability and adjust number of ecc
2702 * bytes per calculation step
e0c7d767 2703 */
1da177e4
LT
2704 switch (this->eccmode) {
2705 case NAND_ECC_HW12_2048:
2706 this->eccbytes += 4;
61b03bd7 2707 case NAND_ECC_HW8_512:
1da177e4 2708 this->eccbytes += 2;
61b03bd7 2709 case NAND_ECC_HW6_512:
1da177e4 2710 this->eccbytes += 3;
61b03bd7 2711 case NAND_ECC_HW3_512:
1da177e4 2712 case NAND_ECC_HW3_256:
7aa65bfd
TG
2713 if (this->calculate_ecc && this->correct_data &&
2714 this->enable_hwecc)
1da177e4 2715 break;
7aa65bfd
TG
2716 printk(KERN_WARNING "No ECC functions supplied, "
2717 "Hardware ECC not possible\n");
61b03bd7 2718 BUG();
1da177e4 2719 }
61b03bd7 2720
1da177e4 2721 mtd->eccsize = this->eccsize;
61b03bd7 2722
7aa65bfd
TG
2723 /*
2724 * Set the number of read / write steps for one page depending on ECC
2725 * mode
2726 */
1da177e4
LT
2727 switch (this->eccmode) {
2728 case NAND_ECC_HW12_2048:
2729 this->eccsteps = mtd->oobblock / 2048;
2730 break;
2731 case NAND_ECC_HW3_512:
2732 case NAND_ECC_HW6_512:
2733 case NAND_ECC_HW8_512:
2734 this->eccsteps = mtd->oobblock / 512;
2735 break;
2736 case NAND_ECC_HW3_256:
61b03bd7 2737 case NAND_ECC_SOFT:
1da177e4
LT
2738 this->eccsteps = mtd->oobblock / 256;
2739 break;
61b03bd7
TG
2740
2741 case NAND_ECC_NONE:
1da177e4
LT
2742 this->eccsteps = 1;
2743 break;
2744 }
61b03bd7 2745
1da177e4
LT
2746 /* Initialize state, waitqueue and spinlock */
2747 this->state = FL_READY;
a36ed299
TG
2748 init_waitqueue_head(&this->controller->wq);
2749 spin_lock_init(&this->controller->lock);
1da177e4
LT
2750
2751 /* De-select the device */
2752 this->select_chip(mtd, -1);
2753
2754 /* Invalidate the pagebuffer reference */
2755 this->pagebuf = -1;
2756
2757 /* Fill in remaining MTD driver data */
2758 mtd->type = MTD_NANDFLASH;
2759 mtd->flags = MTD_CAP_NANDFLASH | MTD_ECC;
2760 mtd->ecctype = MTD_ECC_SW;
2761 mtd->erase = nand_erase;
2762 mtd->point = NULL;
2763 mtd->unpoint = NULL;
2764 mtd->read = nand_read;
2765 mtd->write = nand_write;
2766 mtd->read_ecc = nand_read_ecc;
2767 mtd->write_ecc = nand_write_ecc;
2768 mtd->read_oob = nand_read_oob;
2769 mtd->write_oob = nand_write_oob;
2770 mtd->readv = NULL;
2771 mtd->writev = nand_writev;
2772 mtd->writev_ecc = nand_writev_ecc;
2773 mtd->sync = nand_sync;
2774 mtd->lock = NULL;
2775 mtd->unlock = NULL;
962034f4
VW
2776 mtd->suspend = nand_suspend;
2777 mtd->resume = nand_resume;
1da177e4
LT
2778 mtd->block_isbad = nand_block_isbad;
2779 mtd->block_markbad = nand_block_markbad;
2780
2781 /* and make the autooob the default one */
2782 memcpy(&mtd->oobinfo, this->autooob, sizeof(mtd->oobinfo));
2783
0040bf38
TG
2784 /* Check, if we should skip the bad block table scan */
2785 if (this->options & NAND_SKIP_BBTSCAN)
2786 return 0;
1da177e4
LT
2787
2788 /* Build bad block table */
e0c7d767 2789 return this->scan_bbt(mtd);
1da177e4
LT
2790}
2791
2792/**
61b03bd7 2793 * nand_release - [NAND Interface] Free resources held by the NAND device
1da177e4
LT
2794 * @mtd: MTD device structure
2795*/
e0c7d767 2796void nand_release(struct mtd_info *mtd)
1da177e4
LT
2797{
2798 struct nand_chip *this = mtd->priv;
2799
2800#ifdef CONFIG_MTD_PARTITIONS
2801 /* Deregister partitions */
e0c7d767 2802 del_mtd_partitions(mtd);
1da177e4
LT
2803#endif
2804 /* Deregister the device */
e0c7d767 2805 del_mtd_device(mtd);
1da177e4 2806
fa671646 2807 /* Free bad block table memory */
e0c7d767 2808 kfree(this->bbt);
a36ed299
TG
2809 /* Free buffers */
2810 nand_free_kmem(this);
1da177e4
LT
2811}
2812
e0c7d767
DW
2813EXPORT_SYMBOL_GPL(nand_scan);
2814EXPORT_SYMBOL_GPL(nand_release);
8fe833c1
RP
2815
2816static int __init nand_base_init(void)
2817{
2818 led_trigger_register_simple("nand-disk", &nand_led_trigger);
2819 return 0;
2820}
2821
2822static void __exit nand_base_exit(void)
2823{
2824 led_trigger_unregister_simple(nand_led_trigger);
2825}
2826
2827module_init(nand_base_init);
2828module_exit(nand_base_exit);
2829
e0c7d767
DW
2830MODULE_LICENSE("GPL");
2831MODULE_AUTHOR("Steven J. Hill <sjhill@realitydiluted.com>, Thomas Gleixner <tglx@linutronix.de>");
2832MODULE_DESCRIPTION("Generic NAND flash driver code");