diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2011-11-07 09:11:16 -0800 | 
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2011-11-07 09:11:16 -0800 | 
| commit | e0d65113a70f1dc514e625cc4e7a7485a4bf72df (patch) | |
| tree | 7320a130dc304623f5cf4b5dd8f67fb1776225ca /drivers/mtd/nand/nand_base.c | |
| parent | cf5e15fbd72c13977720aa15b7b7e00e1d8fd8f2 (diff) | |
| parent | 48e546b7f281f251893baa40769581fd15f085fb (diff) | |
| download | olio-linux-3.10-e0d65113a70f1dc514e625cc4e7a7485a4bf72df.tar.xz olio-linux-3.10-e0d65113a70f1dc514e625cc4e7a7485a4bf72df.zip  | |
Merge git://git.infradead.org/mtd-2.6
* git://git.infradead.org/mtd-2.6: (226 commits)
  mtd: tests: annotate as DANGEROUS in Kconfig
  mtd: tests: don't use mtd0 as a default
  mtd: clean up usage of MTD_DOCPROBE_ADDRESS
  jffs2: add compr=lzo and compr=zlib options
  jffs2: implement mount option parsing and compression overriding
  mtd: nand: initialize ops.mode
  mtd: provide an alias for the redboot module name
  mtd: m25p80: don't probe device which has status of 'disabled'
  mtd: nand_h1900 never worked
  mtd: Add DiskOnChip G3 support
  mtd: m25p80: add EON flash EN25Q32B into spi flash id table
  mtd: mark block device queue as non-rotational
  mtd: r852: make r852_pm_ops static
  mtd: m25p80: add support for at25df321a spi data flash
  mtd: mxc_nand: preset_v1_v2: unlock all NAND flash blocks
  mtd: nand: switch `check_pattern()' to standard `memcmp()'
  mtd: nand: invalidate cache on unaligned reads
  mtd: nand: do not scan bad blocks with NAND_BBT_NO_OOB set
  mtd: nand: wait to set BBT version
  mtd: nand: scrub BBT on ECC errors
  ...
Fix up trivial conflicts:
 - arch/arm/mach-at91/board-usb-a9260.c
	Merged into board-usb-a926x.c
 - drivers/mtd/maps/lantiq-flash.c
	add_mtd_partitions -> mtd_device_register vs changed to use
	mtd_device_parse_register.
Diffstat (limited to 'drivers/mtd/nand/nand_base.c')
| -rw-r--r-- | drivers/mtd/nand/nand_base.c | 1109 | 
1 files changed, 558 insertions, 551 deletions
diff --git a/drivers/mtd/nand/nand_base.c b/drivers/mtd/nand/nand_base.c index a46e9bb847b..3ed9c5e4d34 100644 --- a/drivers/mtd/nand/nand_base.c +++ b/drivers/mtd/nand/nand_base.c @@ -21,7 +21,7 @@   *  TODO:   *	Enable cached programming for 2k page size chips   *	Check, if mtd->ecctype should be set to MTD_ECC_HW - *	if we have HW ecc support. + *	if we have HW ECC support.   *	The AG-AND chips have nice features for speed improvement,   *	which are not supported yet. Read / program 4 pages in one go.   *	BBT table is not serialized, has to be fixed @@ -113,21 +113,19 @@ static int check_offs_len(struct mtd_info *mtd,  	/* Start address must align on block boundary */  	if (ofs & ((1 << chip->phys_erase_shift) - 1)) { -		DEBUG(MTD_DEBUG_LEVEL0, "%s: Unaligned address\n", __func__); +		pr_debug("%s: unaligned address\n", __func__);  		ret = -EINVAL;  	}  	/* Length must align on block boundary */  	if (len & ((1 << chip->phys_erase_shift) - 1)) { -		DEBUG(MTD_DEBUG_LEVEL0, "%s: Length not block aligned\n", -					__func__); +		pr_debug("%s: length not block aligned\n", __func__);  		ret = -EINVAL;  	}  	/* Do not allow past end of device */  	if (ofs + len > mtd->size) { -		DEBUG(MTD_DEBUG_LEVEL0, "%s: Past end of device\n", -					__func__); +		pr_debug("%s: past end of device\n", __func__);  		ret = -EINVAL;  	} @@ -136,9 +134,9 @@ static int check_offs_len(struct mtd_info *mtd,  /**   * nand_release_device - [GENERIC] release chip - * @mtd:	MTD device structure + * @mtd: MTD device structure   * - * Deselect, release chip lock and wake up anyone waiting on the device + * Deselect, release chip lock and wake up anyone waiting on the device.   */  static void nand_release_device(struct mtd_info *mtd)  { @@ -157,9 +155,9 @@ static void nand_release_device(struct mtd_info *mtd)  /**   * nand_read_byte - [DEFAULT] read one byte from the chip - * @mtd:	MTD device structure + * @mtd: MTD device structure   * - * Default read function for 8bit buswith + * Default read function for 8bit buswidth   */  static uint8_t nand_read_byte(struct mtd_info *mtd)  { @@ -169,10 +167,11 @@ static uint8_t nand_read_byte(struct mtd_info *mtd)  /**   * nand_read_byte16 - [DEFAULT] read one byte endianess aware from the chip - * @mtd:	MTD device structure + * nand_read_byte16 - [DEFAULT] read one byte endianness aware from the chip + * @mtd: MTD device structure + * + * Default read function for 16bit buswidth with endianness conversion.   * - * Default read function for 16bit buswith with - * endianess conversion   */  static uint8_t nand_read_byte16(struct mtd_info *mtd)  { @@ -182,10 +181,9 @@ static uint8_t nand_read_byte16(struct mtd_info *mtd)  /**   * nand_read_word - [DEFAULT] read one word from the chip - * @mtd:	MTD device structure + * @mtd: MTD device structure   * - * Default read function for 16bit buswith without - * endianess conversion + * Default read function for 16bit buswidth without endianness conversion.   */  static u16 nand_read_word(struct mtd_info *mtd)  { @@ -195,8 +193,8 @@ static u16 nand_read_word(struct mtd_info *mtd)  /**   * nand_select_chip - [DEFAULT] control CE line - * @mtd:	MTD device structure - * @chipnr:	chipnumber to select, -1 for deselect + * @mtd: MTD device structure + * @chipnr: chipnumber to select, -1 for deselect   *   * Default select function for 1 chip devices.   */ @@ -218,11 +216,11 @@ static void nand_select_chip(struct mtd_info *mtd, int chipnr)  /**   * nand_write_buf - [DEFAULT] write buffer to chip - * @mtd:	MTD device structure - * @buf:	data buffer - * @len:	number of bytes to write + * @mtd: MTD device structure + * @buf: data buffer + * @len: number of bytes to write   * - * Default write function for 8bit buswith + * Default write function for 8bit buswidth.   */  static void nand_write_buf(struct mtd_info *mtd, const uint8_t *buf, int len)  { @@ -235,11 +233,11 @@ static void nand_write_buf(struct mtd_info *mtd, const uint8_t *buf, int len)  /**   * nand_read_buf - [DEFAULT] read chip data into buffer - * @mtd:	MTD device structure - * @buf:	buffer to store date - * @len:	number of bytes to read + * @mtd: MTD device structure + * @buf: buffer to store date + * @len: number of bytes to read   * - * Default read function for 8bit buswith + * Default read function for 8bit buswidth.   */  static void nand_read_buf(struct mtd_info *mtd, uint8_t *buf, int len)  { @@ -252,11 +250,11 @@ static void nand_read_buf(struct mtd_info *mtd, uint8_t *buf, int len)  /**   * nand_verify_buf - [DEFAULT] Verify chip data against buffer - * @mtd:	MTD device structure - * @buf:	buffer containing the data to compare - * @len:	number of bytes to compare + * @mtd: MTD device structure + * @buf: buffer containing the data to compare + * @len: number of bytes to compare   * - * Default verify function for 8bit buswith + * Default verify function for 8bit buswidth.   */  static int nand_verify_buf(struct mtd_info *mtd, const uint8_t *buf, int len)  { @@ -271,11 +269,11 @@ static int nand_verify_buf(struct mtd_info *mtd, const uint8_t *buf, int len)  /**   * nand_write_buf16 - [DEFAULT] write buffer to chip - * @mtd:	MTD device structure - * @buf:	data buffer - * @len:	number of bytes to write + * @mtd: MTD device structure + * @buf: data buffer + * @len: number of bytes to write   * - * Default write function for 16bit buswith + * Default write function for 16bit buswidth.   */  static void nand_write_buf16(struct mtd_info *mtd, const uint8_t *buf, int len)  { @@ -291,11 +289,11 @@ static void nand_write_buf16(struct mtd_info *mtd, const uint8_t *buf, int len)  /**   * nand_read_buf16 - [DEFAULT] read chip data into buffer - * @mtd:	MTD device structure - * @buf:	buffer to store date - * @len:	number of bytes to read + * @mtd: MTD device structure + * @buf: buffer to store date + * @len: number of bytes to read   * - * Default read function for 16bit buswith + * Default read function for 16bit buswidth.   */  static void nand_read_buf16(struct mtd_info *mtd, uint8_t *buf, int len)  { @@ -310,11 +308,11 @@ static void nand_read_buf16(struct mtd_info *mtd, uint8_t *buf, int len)  /**   * nand_verify_buf16 - [DEFAULT] Verify chip data against buffer - * @mtd:	MTD device structure - * @buf:	buffer containing the data to compare - * @len:	number of bytes to compare + * @mtd: MTD device structure + * @buf: buffer containing the data to compare + * @len: number of bytes to compare   * - * Default verify function for 16bit buswith + * Default verify function for 16bit buswidth.   */  static int nand_verify_buf16(struct mtd_info *mtd, const uint8_t *buf, int len)  { @@ -332,9 +330,9 @@ static int nand_verify_buf16(struct mtd_info *mtd, const uint8_t *buf, int len)  /**   * nand_block_bad - [DEFAULT] Read bad block marker from the chip - * @mtd:	MTD device structure - * @ofs:	offset from device start - * @getchip:	0, if the chip is already selected + * @mtd: MTD device structure + * @ofs: offset from device start + * @getchip: 0, if the chip is already selected   *   * Check, if the block is bad.   */ @@ -344,7 +342,7 @@ static int nand_block_bad(struct mtd_info *mtd, loff_t ofs, int getchip)  	struct nand_chip *chip = mtd->priv;  	u16 bad; -	if (chip->options & NAND_BBT_SCANLASTPAGE) +	if (chip->bbt_options & NAND_BBT_SCANLASTPAGE)  		ofs += mtd->erasesize - mtd->writesize;  	page = (int)(ofs >> chip->page_shift) & chip->pagemask; @@ -384,11 +382,11 @@ static int nand_block_bad(struct mtd_info *mtd, loff_t ofs, int getchip)  /**   * nand_default_block_markbad - [DEFAULT] mark a block bad - * @mtd:	MTD device structure - * @ofs:	offset from device start + * @mtd: MTD device structure + * @ofs: offset from device start   * - * This is the default implementation, which can be overridden by - * a hardware specific driver. + * This is the default implementation, which can be overridden by a hardware + * specific driver.  */  static int nand_default_block_markbad(struct mtd_info *mtd, loff_t ofs)  { @@ -396,7 +394,7 @@ static int nand_default_block_markbad(struct mtd_info *mtd, loff_t ofs)  	uint8_t buf[2] = { 0, 0 };  	int block, ret, i = 0; -	if (chip->options & NAND_BBT_SCANLASTPAGE) +	if (chip->bbt_options & NAND_BBT_SCANLASTPAGE)  		ofs += mtd->erasesize - mtd->writesize;  	/* Get block number */ @@ -404,33 +402,31 @@ static int nand_default_block_markbad(struct mtd_info *mtd, loff_t ofs)  	if (chip->bbt)  		chip->bbt[block >> 2] |= 0x01 << ((block & 0x03) << 1); -	/* Do we have a flash based bad block table ? */ -	if (chip->options & NAND_USE_FLASH_BBT) +	/* Do we have a flash based bad block table? */ +	if (chip->bbt_options & NAND_BBT_USE_FLASH)  		ret = nand_update_bbt(mtd, ofs);  	else { +		struct mtd_oob_ops ops; +  		nand_get_device(chip, mtd, FL_WRITING); -		/* Write to first two pages and to byte 1 and 6 if necessary. -		 * If we write to more than one location, the first error -		 * encountered quits the procedure. We write two bytes per -		 * location, so we dont have to mess with 16 bit access. +		/* +		 * Write to first two pages if necessary. If we write to more +		 * than one location, the first error encountered quits the +		 * procedure. We write two bytes per location, so we dont have +		 * to mess with 16 bit access.  		 */ +		ops.len = ops.ooblen = 2; +		ops.datbuf = NULL; +		ops.oobbuf = buf; +		ops.ooboffs = chip->badblockpos & ~0x01; +		ops.mode = MTD_OPS_PLACE_OOB;  		do { -			chip->ops.len = chip->ops.ooblen = 2; -			chip->ops.datbuf = NULL; -			chip->ops.oobbuf = buf; -			chip->ops.ooboffs = chip->badblockpos & ~0x01; - -			ret = nand_do_write_oob(mtd, ofs, &chip->ops); +			ret = nand_do_write_oob(mtd, ofs, &ops); -			if (!ret && (chip->options & NAND_BBT_SCANBYTE1AND6)) { -				chip->ops.ooboffs = NAND_SMALL_BADBLOCK_POS -					& ~0x01; -				ret = nand_do_write_oob(mtd, ofs, &chip->ops); -			}  			i++;  			ofs += mtd->writesize; -		} while (!ret && (chip->options & NAND_BBT_SCAN2NDPAGE) && +		} while (!ret && (chip->bbt_options & NAND_BBT_SCAN2NDPAGE) &&  				i < 2);  		nand_release_device(mtd); @@ -443,16 +439,16 @@ static int nand_default_block_markbad(struct mtd_info *mtd, loff_t ofs)  /**   * nand_check_wp - [GENERIC] check if the chip is write protected - * @mtd:	MTD device structure - * Check, if the device is write protected + * @mtd: MTD device structure   * - * The function expects, that the device is already selected + * Check, if the device is write protected. The function expects, that the + * device is already selected.   */  static int nand_check_wp(struct mtd_info *mtd)  {  	struct nand_chip *chip = mtd->priv; -	/* broken xD cards report WP despite being writable */ +	/* Broken xD cards report WP despite being writable */  	if (chip->options & NAND_BROKEN_XD)  		return 0; @@ -463,10 +459,10 @@ static int nand_check_wp(struct mtd_info *mtd)  /**   * nand_block_checkbad - [GENERIC] Check if a block is marked bad - * @mtd:	MTD device structure - * @ofs:	offset from device start - * @getchip:	0, if the chip is already selected - * @allowbbt:	1, if its allowed to access the bbt area + * @mtd: MTD device structure + * @ofs: offset from device start + * @getchip: 0, if the chip is already selected + * @allowbbt: 1, if its allowed to access the bbt area   *   * Check, if the block is bad. Either by reading the bad block table or   * calling of the scan function. @@ -485,8 +481,8 @@ static int nand_block_checkbad(struct mtd_info *mtd, loff_t ofs, int getchip,  /**   * panic_nand_wait_ready - [GENERIC] Wait for the ready pin after commands. - * @mtd:	MTD device structure - * @timeo:	Timeout + * @mtd: MTD device structure + * @timeo: Timeout   *   * Helper function for nand_wait_ready used when needing to wait in interrupt   * context. @@ -505,10 +501,7 @@ static void panic_nand_wait_ready(struct mtd_info *mtd, unsigned long timeo)  	}  } -/* - * Wait for the ready pin, after a command - * The timeout is catched later. - */ +/* Wait for the ready pin, after a command. The timeout is caught later. */  void nand_wait_ready(struct mtd_info *mtd)  {  	struct nand_chip *chip = mtd->priv; @@ -519,7 +512,7 @@ void nand_wait_ready(struct mtd_info *mtd)  		return panic_nand_wait_ready(mtd, 400);  	led_trigger_event(nand_led_trigger, LED_FULL); -	/* wait until command is processed or timeout occures */ +	/* Wait until command is processed or timeout occurs */  	do {  		if (chip->dev_ready(mtd))  			break; @@ -531,13 +524,13 @@ EXPORT_SYMBOL_GPL(nand_wait_ready);  /**   * nand_command - [DEFAULT] Send command to NAND device - * @mtd:	MTD device structure - * @command:	the command to be sent - * @column:	the column address for this command, -1 if none - * @page_addr:	the page address for this command, -1 if none + * @mtd: MTD device structure + * @command: the command to be sent + * @column: the column address for this command, -1 if none + * @page_addr: the page address for this command, -1 if none   * - * Send command to NAND device. This function is used for small page - * devices (256/512 Bytes per page) + * Send command to NAND device. This function is used for small page devices + * (256/512 Bytes per page).   */  static void nand_command(struct mtd_info *mtd, unsigned int command,  			 int column, int page_addr) @@ -545,9 +538,7 @@ static void nand_command(struct mtd_info *mtd, unsigned int command,  	register struct nand_chip *chip = mtd->priv;  	int ctrl = NAND_CTRL_CLE | NAND_CTRL_CHANGE; -	/* -	 * Write out the command to the device. -	 */ +	/* Write out the command to the device */  	if (command == NAND_CMD_SEQIN) {  		int readcmd; @@ -567,9 +558,7 @@ static void nand_command(struct mtd_info *mtd, unsigned int command,  	}  	chip->cmd_ctrl(mtd, command, ctrl); -	/* -	 * Address cycle, when necessary -	 */ +	/* Address cycle, when necessary */  	ctrl = NAND_CTRL_ALE | NAND_CTRL_CHANGE;  	/* Serially input address */  	if (column != -1) { @@ -590,8 +579,8 @@ static void nand_command(struct mtd_info *mtd, unsigned int command,  	chip->cmd_ctrl(mtd, NAND_CMD_NONE, NAND_NCE | NAND_CTRL_CHANGE);  	/* -	 * program and erase have their own busy handlers -	 * status and sequential in needs no delay +	 * Program and erase have their own busy handlers status and sequential +	 * in needs no delay  	 */  	switch (command) { @@ -625,8 +614,10 @@ static void nand_command(struct mtd_info *mtd, unsigned int command,  			return;  		}  	} -	/* Apply this short delay always to ensure that we do wait tWB in -	 * any case on any machine. */ +	/* +	 * Apply this short delay always to ensure that we do wait tWB in +	 * any case on any machine. +	 */  	ndelay(100);  	nand_wait_ready(mtd); @@ -634,14 +625,14 @@ static void nand_command(struct mtd_info *mtd, unsigned int command,  /**   * nand_command_lp - [DEFAULT] Send command to NAND large page device - * @mtd:	MTD device structure - * @command:	the command to be sent - * @column:	the column address for this command, -1 if none - * @page_addr:	the page address for this command, -1 if none + * @mtd: MTD device structure + * @command: the command to be sent + * @column: the column address for this command, -1 if none + * @page_addr: the page address for this command, -1 if none   *   * Send command to NAND device. This is the version for the new large page - * devices We dont have the separate regions as we have in the small page - * devices.  We must emulate NAND_CMD_READOOB to keep the code compatible. + * devices. We don't have the separate regions as we have in the small page + * devices. We must emulate NAND_CMD_READOOB to keep the code compatible.   */  static void nand_command_lp(struct mtd_info *mtd, unsigned int command,  			    int column, int page_addr) @@ -683,8 +674,8 @@ static void nand_command_lp(struct mtd_info *mtd, unsigned int command,  	chip->cmd_ctrl(mtd, NAND_CMD_NONE, NAND_NCE | NAND_CTRL_CHANGE);  	/* -	 * program and erase have their own busy handlers -	 * status, sequential in, and deplete1 need no delay +	 * Program and erase have their own busy handlers status, sequential +	 * in, and deplete1 need no delay.  	 */  	switch (command) { @@ -698,14 +689,12 @@ static void nand_command_lp(struct mtd_info *mtd, unsigned int command,  	case NAND_CMD_DEPLETE1:  		return; -		/* -		 * read error status commands require only a short delay -		 */  	case NAND_CMD_STATUS_ERROR:  	case NAND_CMD_STATUS_ERROR0:  	case NAND_CMD_STATUS_ERROR1:  	case NAND_CMD_STATUS_ERROR2:  	case NAND_CMD_STATUS_ERROR3: +		/* Read error status commands require only a short delay */  		udelay(chip->chip_delay);  		return; @@ -739,7 +728,7 @@ static void nand_command_lp(struct mtd_info *mtd, unsigned int command,  	default:  		/*  		 * If we don't have access to the busy pin, we apply the given -		 * command delay +		 * command delay.  		 */  		if (!chip->dev_ready) {  			udelay(chip->chip_delay); @@ -747,8 +736,10 @@ static void nand_command_lp(struct mtd_info *mtd, unsigned int command,  		}  	} -	/* Apply this short delay always to ensure that we do wait tWB in -	 * any case on any machine. */ +	/* +	 * Apply this short delay always to ensure that we do wait tWB in +	 * any case on any machine. +	 */  	ndelay(100);  	nand_wait_ready(mtd); @@ -756,25 +747,25 @@ static void nand_command_lp(struct mtd_info *mtd, unsigned int command,  /**   * panic_nand_get_device - [GENERIC] Get chip for selected access - * @chip:	the nand chip descriptor - * @mtd:	MTD device structure - * @new_state:	the state which is requested + * @chip: the nand chip descriptor + * @mtd: MTD device structure + * @new_state: the state which is requested   *   * Used when in panic, no locks are taken.   */  static void panic_nand_get_device(struct nand_chip *chip,  		      struct mtd_info *mtd, int new_state)  { -	/* Hardware controller shared among independend devices */ +	/* Hardware controller shared among independent devices */  	chip->controller->active = chip;  	chip->state = new_state;  }  /**   * nand_get_device - [GENERIC] Get chip for selected access - * @chip:	the nand chip descriptor - * @mtd:	MTD device structure - * @new_state:	the state which is requested + * @chip: the nand chip descriptor + * @mtd: MTD device structure + * @new_state: the state which is requested   *   * Get the device and lock it for exclusive access   */ @@ -812,10 +803,10 @@ retry:  }  /** - * panic_nand_wait - [GENERIC]  wait until the command is done - * @mtd:	MTD device structure - * @chip:	NAND chip structure - * @timeo:	Timeout + * panic_nand_wait - [GENERIC] wait until the command is done + * @mtd: MTD device structure + * @chip: NAND chip structure + * @timeo: timeout   *   * Wait for command done. This is a helper function for nand_wait used when   * we are in interrupt context. May happen when in panic and trying to write @@ -838,13 +829,13 @@ static void panic_nand_wait(struct mtd_info *mtd, struct nand_chip *chip,  }  /** - * nand_wait - [DEFAULT]  wait until the command is done - * @mtd:	MTD device structure - * @chip:	NAND chip structure + * nand_wait - [DEFAULT] wait until the command is done + * @mtd: MTD device structure + * @chip: NAND chip structure   * - * Wait for command done. This applies to erase and program only - * Erase can take up to 400ms and program up to 20ms according to - * general NAND and SmartMedia specs + * Wait for command done. This applies to erase and program only. Erase can + * take up to 400ms and program up to 20ms according to general NAND and + * SmartMedia specs.   */  static int nand_wait(struct mtd_info *mtd, struct nand_chip *chip)  { @@ -859,8 +850,10 @@ static int nand_wait(struct mtd_info *mtd, struct nand_chip *chip)  	led_trigger_event(nand_led_trigger, LED_FULL); -	/* Apply this short delay always to ensure that we do wait tWB in -	 * any case on any machine. */ +	/* +	 * Apply this short delay always to ensure that we do wait tWB in any +	 * case on any machine. +	 */  	ndelay(100);  	if ((state == FL_ERASING) && (chip->options & NAND_IS_AND)) @@ -890,16 +883,15 @@ static int nand_wait(struct mtd_info *mtd, struct nand_chip *chip)  /**   * __nand_unlock - [REPLACEABLE] unlocks specified locked blocks - *   * @mtd: mtd info   * @ofs: offset to start unlock from   * @len: length to unlock - * @invert:   when = 0, unlock the range of blocks within the lower and - *                      upper boundary address - *            when = 1, unlock the range of blocks outside the boundaries - *                      of the lower and upper boundary address + * @invert: when = 0, unlock the range of blocks within the lower and + *                    upper boundary address + *          when = 1, unlock the range of blocks outside the boundaries + *                    of the lower and upper boundary address   * - * return - unlock status + * Returs unlock status.   */  static int __nand_unlock(struct mtd_info *mtd, loff_t ofs,  					uint64_t len, int invert) @@ -919,10 +911,9 @@ static int __nand_unlock(struct mtd_info *mtd, loff_t ofs,  	/* Call wait ready function */  	status = chip->waitfunc(mtd, chip); -	udelay(1000);  	/* See if device thinks it succeeded */  	if (status & 0x01) { -		DEBUG(MTD_DEBUG_LEVEL0, "%s: Error status = 0x%08x\n", +		pr_debug("%s: error status = 0x%08x\n",  					__func__, status);  		ret = -EIO;  	} @@ -932,12 +923,11 @@ static int __nand_unlock(struct mtd_info *mtd, loff_t ofs,  /**   * nand_unlock - [REPLACEABLE] unlocks specified locked blocks - *   * @mtd: mtd info   * @ofs: offset to start unlock from   * @len: length to unlock   * - * return - unlock status + * Returns unlock status.   */  int nand_unlock(struct mtd_info *mtd, loff_t ofs, uint64_t len)  { @@ -945,7 +935,7 @@ int nand_unlock(struct mtd_info *mtd, loff_t ofs, uint64_t len)  	int chipnr;  	struct nand_chip *chip = mtd->priv; -	DEBUG(MTD_DEBUG_LEVEL3, "%s: start = 0x%012llx, len = %llu\n", +	pr_debug("%s: start = 0x%012llx, len = %llu\n",  			__func__, (unsigned long long)ofs, len);  	if (check_offs_len(mtd, ofs, len)) @@ -964,7 +954,7 @@ int nand_unlock(struct mtd_info *mtd, loff_t ofs, uint64_t len)  	/* Check, if it is write protected */  	if (nand_check_wp(mtd)) { -		DEBUG(MTD_DEBUG_LEVEL0, "%s: Device is write protected!!!\n", +		pr_debug("%s: device is write protected!\n",  					__func__);  		ret = -EIO;  		goto out; @@ -981,18 +971,16 @@ EXPORT_SYMBOL(nand_unlock);  /**   * nand_lock - [REPLACEABLE] locks all blocks present in the device - *   * @mtd: mtd info   * @ofs: offset to start unlock from   * @len: length to unlock   * - * return - lock status + * This feature is not supported in many NAND parts. 'Micron' NAND parts do + * have this feature, but it allows only to lock all blocks, not for specified + * range for block. Implementing 'lock' feature by making use of 'unlock', for + * now.   * - * This feature is not supported in many NAND parts. 'Micron' NAND parts - * do have this feature, but it allows only to lock all blocks, not for - * specified range for block. - * - * Implementing 'lock' feature by making use of 'unlock', for now. + * Returns lock status.   */  int nand_lock(struct mtd_info *mtd, loff_t ofs, uint64_t len)  { @@ -1000,7 +988,7 @@ int nand_lock(struct mtd_info *mtd, loff_t ofs, uint64_t len)  	int chipnr, status, page;  	struct nand_chip *chip = mtd->priv; -	DEBUG(MTD_DEBUG_LEVEL3, "%s: start = 0x%012llx, len = %llu\n", +	pr_debug("%s: start = 0x%012llx, len = %llu\n",  			__func__, (unsigned long long)ofs, len);  	if (check_offs_len(mtd, ofs, len)) @@ -1015,7 +1003,7 @@ int nand_lock(struct mtd_info *mtd, loff_t ofs, uint64_t len)  	/* Check, if it is write protected */  	if (nand_check_wp(mtd)) { -		DEBUG(MTD_DEBUG_LEVEL0, "%s: Device is write protected!!!\n", +		pr_debug("%s: device is write protected!\n",  					__func__);  		status = MTD_ERASE_FAILED;  		ret = -EIO; @@ -1028,10 +1016,9 @@ int nand_lock(struct mtd_info *mtd, loff_t ofs, uint64_t len)  	/* Call wait ready function */  	status = chip->waitfunc(mtd, chip); -	udelay(1000);  	/* See if device thinks it succeeded */  	if (status & 0x01) { -		DEBUG(MTD_DEBUG_LEVEL0, "%s: Error status = 0x%08x\n", +		pr_debug("%s: error status = 0x%08x\n",  					__func__, status);  		ret = -EIO;  		goto out; @@ -1047,13 +1034,13 @@ out:  EXPORT_SYMBOL(nand_lock);  /** - * nand_read_page_raw - [Intern] read raw page data without ecc - * @mtd:	mtd info structure - * @chip:	nand chip info structure - * @buf:	buffer to store read data - * @page:	page number to read + * nand_read_page_raw - [INTERN] read raw page data without ecc + * @mtd: mtd info structure + * @chip: nand chip info structure + * @buf: buffer to store read data + * @page: page number to read   * - * Not for syndrome calculating ecc controllers, which use a special oob layout + * Not for syndrome calculating ECC controllers, which use a special oob layout.   */  static int nand_read_page_raw(struct mtd_info *mtd, struct nand_chip *chip,  			      uint8_t *buf, int page) @@ -1064,11 +1051,11 @@ static int nand_read_page_raw(struct mtd_info *mtd, struct nand_chip *chip,  }  /** - * nand_read_page_raw_syndrome - [Intern] read raw page data without ecc - * @mtd:	mtd info structure - * @chip:	nand chip info structure - * @buf:	buffer to store read data - * @page:	page number to read + * nand_read_page_raw_syndrome - [INTERN] read raw page data without ecc + * @mtd: mtd info structure + * @chip: nand chip info structure + * @buf: buffer to store read data + * @page: page number to read   *   * We need a special oob layout and handling even when OOB isn't used.   */ @@ -1107,11 +1094,11 @@ static int nand_read_page_raw_syndrome(struct mtd_info *mtd,  }  /** - * nand_read_page_swecc - [REPLACABLE] software ecc based page read function - * @mtd:	mtd info structure - * @chip:	nand chip info structure - * @buf:	buffer to store read data - * @page:	page number to read + * nand_read_page_swecc - [REPLACEABLE] software ECC based page read function + * @mtd: mtd info structure + * @chip: nand chip info structure + * @buf: buffer to store read data + * @page: page number to read   */  static int nand_read_page_swecc(struct mtd_info *mtd, struct nand_chip *chip,  				uint8_t *buf, int page) @@ -1148,12 +1135,12 @@ static int nand_read_page_swecc(struct mtd_info *mtd, struct nand_chip *chip,  }  /** - * nand_read_subpage - [REPLACABLE] software ecc based sub-page read function - * @mtd:	mtd info structure - * @chip:	nand chip info structure - * @data_offs:	offset of requested data within the page - * @readlen:	data length - * @bufpoi:	buffer to store read data + * nand_read_subpage - [REPLACEABLE] software ECC based sub-page read function + * @mtd: mtd info structure + * @chip: nand chip info structure + * @data_offs: offset of requested data within the page + * @readlen: data length + * @bufpoi: buffer to store read data   */  static int nand_read_subpage(struct mtd_info *mtd, struct nand_chip *chip,  			uint32_t data_offs, uint32_t readlen, uint8_t *bufpoi) @@ -1166,12 +1153,12 @@ static int nand_read_subpage(struct mtd_info *mtd, struct nand_chip *chip,  	int busw = (chip->options & NAND_BUSWIDTH_16) ? 2 : 1;  	int index = 0; -	/* Column address wihin the page aligned to ECC size (256bytes). */ +	/* Column address within the page aligned to ECC size (256bytes) */  	start_step = data_offs / chip->ecc.size;  	end_step = (data_offs + readlen - 1) / chip->ecc.size;  	num_steps = end_step - start_step + 1; -	/* Data size aligned to ECC ecc.size*/ +	/* Data size aligned to ECC ecc.size */  	datafrag_len = num_steps * chip->ecc.size;  	eccfrag_len = num_steps * chip->ecc.bytes; @@ -1183,13 +1170,14 @@ static int nand_read_subpage(struct mtd_info *mtd, struct nand_chip *chip,  	p = bufpoi + data_col_addr;  	chip->read_buf(mtd, p, datafrag_len); -	/* Calculate  ECC */ +	/* Calculate ECC */  	for (i = 0; i < eccfrag_len ; i += chip->ecc.bytes, p += chip->ecc.size)  		chip->ecc.calculate(mtd, p, &chip->buffers->ecccalc[i]); -	/* The performance is faster if to position offsets -	   according to ecc.pos. Let make sure here that -	   there are no gaps in ecc positions */ +	/* +	 * The performance is faster if we position offsets according to +	 * ecc.pos. Let's make sure that there are no gaps in ECC positions. +	 */  	for (i = 0; i < eccfrag_len - 1; i++) {  		if (eccpos[i + start_step * chip->ecc.bytes] + 1 !=  			eccpos[i + start_step * chip->ecc.bytes + 1]) { @@ -1201,8 +1189,10 @@ static int nand_read_subpage(struct mtd_info *mtd, struct nand_chip *chip,  		chip->cmdfunc(mtd, NAND_CMD_RNDOUT, mtd->writesize, -1);  		chip->read_buf(mtd, chip->oob_poi, mtd->oobsize);  	} else { -		/* send the command to read the particular ecc bytes */ -		/* take care about buswidth alignment in read_buf */ +		/* +		 * Send the command to read the particular ECC bytes take care +		 * about buswidth alignment in read_buf. +		 */  		index = start_step * chip->ecc.bytes;  		aligned_pos = eccpos[index] & ~(busw - 1); @@ -1235,13 +1225,13 @@ static int nand_read_subpage(struct mtd_info *mtd, struct nand_chip *chip,  }  /** - * nand_read_page_hwecc - [REPLACABLE] hardware ecc based page read function - * @mtd:	mtd info structure - * @chip:	nand chip info structure - * @buf:	buffer to store read data - * @page:	page number to read + * nand_read_page_hwecc - [REPLACEABLE] hardware ECC based page read function + * @mtd: mtd info structure + * @chip: nand chip info structure + * @buf: buffer to store read data + * @page: page number to read   * - * Not for syndrome calculating ecc controllers which need a special oob layout + * Not for syndrome calculating ECC controllers which need a special oob layout.   */  static int nand_read_page_hwecc(struct mtd_info *mtd, struct nand_chip *chip,  				uint8_t *buf, int page) @@ -1280,18 +1270,17 @@ static int nand_read_page_hwecc(struct mtd_info *mtd, struct nand_chip *chip,  }  /** - * nand_read_page_hwecc_oob_first - [REPLACABLE] hw ecc, read oob first - * @mtd:	mtd info structure - * @chip:	nand chip info structure - * @buf:	buffer to store read data - * @page:	page number to read + * nand_read_page_hwecc_oob_first - [REPLACEABLE] hw ecc, read oob first + * @mtd: mtd info structure + * @chip: nand chip info structure + * @buf: buffer to store read data + * @page: page number to read   * - * Hardware ECC for large page chips, require OOB to be read first. - * For this ECC mode, the write_page method is re-used from ECC_HW. - * These methods read/write ECC from the OOB area, unlike the - * ECC_HW_SYNDROME support with multiple ECC steps, follows the - * "infix ECC" scheme and reads/writes ECC from the data area, by - * overwriting the NAND manufacturer bad block markings. + * Hardware ECC for large page chips, require OOB to be read first. For this + * ECC mode, the write_page method is re-used from ECC_HW. These methods + * read/write ECC from the OOB area, unlike the ECC_HW_SYNDROME support with + * multiple ECC steps, follows the "infix ECC" scheme and reads/writes ECC from + * the data area, by overwriting the NAND manufacturer bad block markings.   */  static int nand_read_page_hwecc_oob_first(struct mtd_info *mtd,  	struct nand_chip *chip, uint8_t *buf, int page) @@ -1329,14 +1318,14 @@ static int nand_read_page_hwecc_oob_first(struct mtd_info *mtd,  }  /** - * nand_read_page_syndrome - [REPLACABLE] hardware ecc syndrom based page read - * @mtd:	mtd info structure - * @chip:	nand chip info structure - * @buf:	buffer to store read data - * @page:	page number to read + * nand_read_page_syndrome - [REPLACEABLE] hardware ECC syndrome based page read + * @mtd: mtd info structure + * @chip: nand chip info structure + * @buf: buffer to store read data + * @page: page number to read   * - * The hw generator calculates the error syndrome automatically. Therefor - * we need a special oob layout and handling. + * The hw generator calculates the error syndrome automatically. Therefore we + * need a special oob layout and handling.   */  static int nand_read_page_syndrome(struct mtd_info *mtd, struct nand_chip *chip,  				   uint8_t *buf, int page) @@ -1384,29 +1373,29 @@ static int nand_read_page_syndrome(struct mtd_info *mtd, struct nand_chip *chip,  }  /** - * nand_transfer_oob - [Internal] Transfer oob to client buffer - * @chip:	nand chip structure - * @oob:	oob destination address - * @ops:	oob ops structure - * @len:	size of oob to transfer + * nand_transfer_oob - [INTERN] Transfer oob to client buffer + * @chip: nand chip structure + * @oob: oob destination address + * @ops: oob ops structure + * @len: size of oob to transfer   */  static uint8_t *nand_transfer_oob(struct nand_chip *chip, uint8_t *oob,  				  struct mtd_oob_ops *ops, size_t len)  {  	switch (ops->mode) { -	case MTD_OOB_PLACE: -	case MTD_OOB_RAW: +	case MTD_OPS_PLACE_OOB: +	case MTD_OPS_RAW:  		memcpy(oob, chip->oob_poi + ops->ooboffs, len);  		return oob + len; -	case MTD_OOB_AUTO: { +	case MTD_OPS_AUTO_OOB: {  		struct nand_oobfree *free = chip->ecc.layout->oobfree;  		uint32_t boffs = 0, roffs = ops->ooboffs;  		size_t bytes = 0;  		for (; free->length && len; free++, len -= bytes) { -			/* Read request not from offset 0 ? */ +			/* Read request not from offset 0? */  			if (unlikely(roffs)) {  				if (roffs >= free->length) {  					roffs -= free->length; @@ -1432,11 +1421,10 @@ static uint8_t *nand_transfer_oob(struct nand_chip *chip, uint8_t *oob,  }  /** - * nand_do_read_ops - [Internal] Read data with ECC - * - * @mtd:	MTD device structure - * @from:	offset to read from - * @ops:	oob ops structure + * nand_do_read_ops - [INTERN] Read data with ECC + * @mtd: MTD device structure + * @from: offset to read from + * @ops: oob ops structure   *   * Internal function. Called with chip held.   */ @@ -1451,7 +1439,7 @@ static int nand_do_read_ops(struct mtd_info *mtd, loff_t from,  	int ret = 0;  	uint32_t readlen = ops->len;  	uint32_t oobreadlen = ops->ooblen; -	uint32_t max_oobsize = ops->mode == MTD_OOB_AUTO ? +	uint32_t max_oobsize = ops->mode == MTD_OPS_AUTO_OOB ?  		mtd->oobavail : mtd->oobsize;  	uint8_t *bufpoi, *oob, *buf; @@ -1473,7 +1461,7 @@ static int nand_do_read_ops(struct mtd_info *mtd, loff_t from,  		bytes = min(mtd->writesize - col, readlen);  		aligned = (bytes == mtd->writesize); -		/* Is the current page in the buffer ? */ +		/* Is the current page in the buffer? */  		if (realpage != chip->pagebuf || oob) {  			bufpoi = aligned ? buf : chip->buffers->databuf; @@ -1483,7 +1471,7 @@ static int nand_do_read_ops(struct mtd_info *mtd, loff_t from,  			}  			/* Now read the page into the buffer */ -			if (unlikely(ops->mode == MTD_OOB_RAW)) +			if (unlikely(ops->mode == MTD_OPS_RAW))  				ret = chip->ecc.read_page_raw(mtd, chip,  							      bufpoi, page);  			else if (!aligned && NAND_SUBPAGE_READ(chip) && !oob) @@ -1492,14 +1480,22 @@ static int nand_do_read_ops(struct mtd_info *mtd, loff_t from,  			else  				ret = chip->ecc.read_page(mtd, chip, bufpoi,  							  page); -			if (ret < 0) +			if (ret < 0) { +				if (!aligned) +					/* Invalidate page cache */ +					chip->pagebuf = -1;  				break; +			}  			/* Transfer not aligned data */  			if (!aligned) {  				if (!NAND_SUBPAGE_READ(chip) && !oob && -				    !(mtd->ecc_stats.failed - stats.failed)) +				    !(mtd->ecc_stats.failed - stats.failed) && +				    (ops->mode != MTD_OPS_RAW))  					chip->pagebuf = realpage; +				else +					/* Invalidate page cache */ +					chip->pagebuf = -1;  				memcpy(buf, chip->buffers->databuf + col, bytes);  			} @@ -1539,7 +1535,7 @@ static int nand_do_read_ops(struct mtd_info *mtd, loff_t from,  		if (!readlen)  			break; -		/* For subsequent reads align to page boundary. */ +		/* For subsequent reads align to page boundary */  		col = 0;  		/* Increment page address */  		realpage++; @@ -1552,8 +1548,9 @@ static int nand_do_read_ops(struct mtd_info *mtd, loff_t from,  			chip->select_chip(mtd, chipnr);  		} -		/* Check, if the chip supports auto page increment -		 * or if we have hit a block boundary. +		/* +		 * Check, if the chip supports auto page increment or if we +		 * have hit a block boundary.  		 */  		if (!NAND_CANAUTOINCR(chip) || !(page & blkcheck))  			sndcmd = 1; @@ -1574,18 +1571,19 @@ static int nand_do_read_ops(struct mtd_info *mtd, loff_t from,  /**   * nand_read - [MTD Interface] MTD compatibility function for nand_do_read_ecc - * @mtd:	MTD device structure - * @from:	offset to read from - * @len:	number of bytes to read - * @retlen:	pointer to variable to store the number of read bytes - * @buf:	the databuffer to put data + * @mtd: MTD device structure + * @from: offset to read from + * @len: number of bytes to read + * @retlen: pointer to variable to store the number of read bytes + * @buf: the databuffer to put data   * - * Get hold of the chip and call nand_do_read + * Get hold of the chip and call nand_do_read.   */  static int nand_read(struct mtd_info *mtd, loff_t from, size_t len,  		     size_t *retlen, uint8_t *buf)  {  	struct nand_chip *chip = mtd->priv; +	struct mtd_oob_ops ops;  	int ret;  	/* Do not allow reads past end of device */ @@ -1596,13 +1594,14 @@ static int nand_read(struct mtd_info *mtd, loff_t from, size_t len,  	nand_get_device(chip, mtd, FL_READING); -	chip->ops.len = len; -	chip->ops.datbuf = buf; -	chip->ops.oobbuf = NULL; +	ops.len = len; +	ops.datbuf = buf; +	ops.oobbuf = NULL; +	ops.mode = 0; -	ret = nand_do_read_ops(mtd, from, &chip->ops); +	ret = nand_do_read_ops(mtd, from, &ops); -	*retlen = chip->ops.retlen; +	*retlen = ops.retlen;  	nand_release_device(mtd); @@ -1610,11 +1609,11 @@ static int nand_read(struct mtd_info *mtd, loff_t from, size_t len,  }  /** - * nand_read_oob_std - [REPLACABLE] the most common OOB data read function - * @mtd:	mtd info structure - * @chip:	nand chip info structure - * @page:	page number to read - * @sndcmd:	flag whether to issue read command or not + * nand_read_oob_std - [REPLACEABLE] the most common OOB data read function + * @mtd: mtd info structure + * @chip: nand chip info structure + * @page: page number to read + * @sndcmd: flag whether to issue read command or not   */  static int nand_read_oob_std(struct mtd_info *mtd, struct nand_chip *chip,  			     int page, int sndcmd) @@ -1628,12 +1627,12 @@ static int nand_read_oob_std(struct mtd_info *mtd, struct nand_chip *chip,  }  /** - * nand_read_oob_syndrome - [REPLACABLE] OOB data read function for HW ECC + * nand_read_oob_syndrome - [REPLACEABLE] OOB data read function for HW ECC   *			    with syndromes - * @mtd:	mtd info structure - * @chip:	nand chip info structure - * @page:	page number to read - * @sndcmd:	flag whether to issue read command or not + * @mtd: mtd info structure + * @chip: nand chip info structure + * @page: page number to read + * @sndcmd: flag whether to issue read command or not   */  static int nand_read_oob_syndrome(struct mtd_info *mtd, struct nand_chip *chip,  				  int page, int sndcmd) @@ -1667,10 +1666,10 @@ static int nand_read_oob_syndrome(struct mtd_info *mtd, struct nand_chip *chip,  }  /** - * nand_write_oob_std - [REPLACABLE] the most common OOB data write function - * @mtd:	mtd info structure - * @chip:	nand chip info structure - * @page:	page number to write + * nand_write_oob_std - [REPLACEABLE] the most common OOB data write function + * @mtd: mtd info structure + * @chip: nand chip info structure + * @page: page number to write   */  static int nand_write_oob_std(struct mtd_info *mtd, struct nand_chip *chip,  			      int page) @@ -1690,11 +1689,11 @@ static int nand_write_oob_std(struct mtd_info *mtd, struct nand_chip *chip,  }  /** - * nand_write_oob_syndrome - [REPLACABLE] OOB data write function for HW ECC - *			     with syndrome - only for large page flash ! - * @mtd:	mtd info structure - * @chip:	nand chip info structure - * @page:	page number to write + * nand_write_oob_syndrome - [REPLACEABLE] OOB data write function for HW ECC + *			     with syndrome - only for large page flash + * @mtd: mtd info structure + * @chip: nand chip info structure + * @page: page number to write   */  static int nand_write_oob_syndrome(struct mtd_info *mtd,  				   struct nand_chip *chip, int page) @@ -1749,34 +1748,37 @@ static int nand_write_oob_syndrome(struct mtd_info *mtd,  }  /** - * nand_do_read_oob - [Intern] NAND read out-of-band - * @mtd:	MTD device structure - * @from:	offset to read from - * @ops:	oob operations description structure + * nand_do_read_oob - [INTERN] NAND read out-of-band + * @mtd: MTD device structure + * @from: offset to read from + * @ops: oob operations description structure   * - * NAND read out-of-band data from the spare area + * NAND read out-of-band data from the spare area.   */  static int nand_do_read_oob(struct mtd_info *mtd, loff_t from,  			    struct mtd_oob_ops *ops)  {  	int page, realpage, chipnr, sndcmd = 1;  	struct nand_chip *chip = mtd->priv; +	struct mtd_ecc_stats stats;  	int blkcheck = (1 << (chip->phys_erase_shift - chip->page_shift)) - 1;  	int readlen = ops->ooblen;  	int len;  	uint8_t *buf = ops->oobbuf; -	DEBUG(MTD_DEBUG_LEVEL3, "%s: from = 0x%08Lx, len = %i\n", +	pr_debug("%s: from = 0x%08Lx, len = %i\n",  			__func__, (unsigned long long)from, readlen); -	if (ops->mode == MTD_OOB_AUTO) +	stats = mtd->ecc_stats; + +	if (ops->mode == MTD_OPS_AUTO_OOB)  		len = chip->ecc.layout->oobavail;  	else  		len = mtd->oobsize;  	if (unlikely(ops->ooboffs >= len)) { -		DEBUG(MTD_DEBUG_LEVEL0, "%s: Attempt to start read " -					"outside oob\n", __func__); +		pr_debug("%s: attempt to start read outside oob\n", +				__func__);  		return -EINVAL;  	} @@ -1784,8 +1786,8 @@ static int nand_do_read_oob(struct mtd_info *mtd, loff_t from,  	if (unlikely(from >= mtd->size ||  		     ops->ooboffs + readlen > ((mtd->size >> chip->page_shift) -  					(from >> chip->page_shift)) * len)) { -		DEBUG(MTD_DEBUG_LEVEL0, "%s: Attempt read beyond end " -					"of device\n", __func__); +		pr_debug("%s: attempt to read beyond end of device\n", +				__func__);  		return -EINVAL;  	} @@ -1797,7 +1799,10 @@ static int nand_do_read_oob(struct mtd_info *mtd, loff_t from,  	page = realpage & chip->pagemask;  	while (1) { -		sndcmd = chip->ecc.read_oob(mtd, chip, page, sndcmd); +		if (ops->mode == MTD_OPS_RAW) +			sndcmd = chip->ecc.read_oob_raw(mtd, chip, page, sndcmd); +		else +			sndcmd = chip->ecc.read_oob(mtd, chip, page, sndcmd);  		len = min(len, readlen);  		buf = nand_transfer_oob(chip, buf, ops, len); @@ -1830,24 +1835,29 @@ static int nand_do_read_oob(struct mtd_info *mtd, loff_t from,  			chip->select_chip(mtd, chipnr);  		} -		/* Check, if the chip supports auto page increment -		 * or if we have hit a block boundary. +		/* +		 * Check, if the chip supports auto page increment or if we +		 * have hit a block boundary.  		 */  		if (!NAND_CANAUTOINCR(chip) || !(page & blkcheck))  			sndcmd = 1;  	}  	ops->oobretlen = ops->ooblen; -	return 0; + +	if (mtd->ecc_stats.failed - stats.failed) +		return -EBADMSG; + +	return  mtd->ecc_stats.corrected - stats.corrected ? -EUCLEAN : 0;  }  /**   * nand_read_oob - [MTD Interface] NAND read data and/or out-of-band - * @mtd:	MTD device structure - * @from:	offset to read from - * @ops:	oob operation description structure + * @mtd: MTD device structure + * @from: offset to read from + * @ops: oob operation description structure   * - * NAND read data and/or out-of-band data + * NAND read data and/or out-of-band data.   */  static int nand_read_oob(struct mtd_info *mtd, loff_t from,  			 struct mtd_oob_ops *ops) @@ -1859,17 +1869,17 @@ static int nand_read_oob(struct mtd_info *mtd, loff_t from,  	/* Do not allow reads past end of device */  	if (ops->datbuf && (from + ops->len) > mtd->size) { -		DEBUG(MTD_DEBUG_LEVEL0, "%s: Attempt read " -				"beyond end of device\n", __func__); +		pr_debug("%s: attempt to read beyond end of device\n", +				__func__);  		return -EINVAL;  	}  	nand_get_device(chip, mtd, FL_READING);  	switch (ops->mode) { -	case MTD_OOB_PLACE: -	case MTD_OOB_AUTO: -	case MTD_OOB_RAW: +	case MTD_OPS_PLACE_OOB: +	case MTD_OPS_AUTO_OOB: +	case MTD_OPS_RAW:  		break;  	default: @@ -1888,12 +1898,12 @@ out:  /** - * nand_write_page_raw - [Intern] raw page write function - * @mtd:	mtd info structure - * @chip:	nand chip info structure - * @buf:	data buffer + * nand_write_page_raw - [INTERN] raw page write function + * @mtd: mtd info structure + * @chip: nand chip info structure + * @buf: data buffer   * - * Not for syndrome calculating ecc controllers, which use a special oob layout + * Not for syndrome calculating ECC controllers, which use a special oob layout.   */  static void nand_write_page_raw(struct mtd_info *mtd, struct nand_chip *chip,  				const uint8_t *buf) @@ -1903,10 +1913,10 @@ static void nand_write_page_raw(struct mtd_info *mtd, struct nand_chip *chip,  }  /** - * nand_write_page_raw_syndrome - [Intern] raw page write function - * @mtd:	mtd info structure - * @chip:	nand chip info structure - * @buf:	data buffer + * nand_write_page_raw_syndrome - [INTERN] raw page write function + * @mtd: mtd info structure + * @chip: nand chip info structure + * @buf: data buffer   *   * We need a special oob layout and handling even when ECC isn't checked.   */ @@ -1942,10 +1952,10 @@ static void nand_write_page_raw_syndrome(struct mtd_info *mtd,  		chip->write_buf(mtd, oob, size);  }  /** - * nand_write_page_swecc - [REPLACABLE] software ecc based page write function - * @mtd:	mtd info structure - * @chip:	nand chip info structure - * @buf:	data buffer + * nand_write_page_swecc - [REPLACEABLE] software ECC based page write function + * @mtd: mtd info structure + * @chip: nand chip info structure + * @buf: data buffer   */  static void nand_write_page_swecc(struct mtd_info *mtd, struct nand_chip *chip,  				  const uint8_t *buf) @@ -1957,7 +1967,7 @@ static void nand_write_page_swecc(struct mtd_info *mtd, struct nand_chip *chip,  	const uint8_t *p = buf;  	uint32_t *eccpos = chip->ecc.layout->eccpos; -	/* Software ecc calculation */ +	/* Software ECC calculation */  	for (i = 0; eccsteps; eccsteps--, i += eccbytes, p += eccsize)  		chip->ecc.calculate(mtd, p, &ecc_calc[i]); @@ -1968,10 +1978,10 @@ static void nand_write_page_swecc(struct mtd_info *mtd, struct nand_chip *chip,  }  /** - * nand_write_page_hwecc - [REPLACABLE] hardware ecc based page write function - * @mtd:	mtd info structure - * @chip:	nand chip info structure - * @buf:	data buffer + * nand_write_page_hwecc - [REPLACEABLE] hardware ECC based page write function + * @mtd: mtd info structure + * @chip: nand chip info structure + * @buf: data buffer   */  static void nand_write_page_hwecc(struct mtd_info *mtd, struct nand_chip *chip,  				  const uint8_t *buf) @@ -1996,13 +2006,13 @@ static void nand_write_page_hwecc(struct mtd_info *mtd, struct nand_chip *chip,  }  /** - * nand_write_page_syndrome - [REPLACABLE] hardware ecc syndrom based page write - * @mtd:	mtd info structure - * @chip:	nand chip info structure - * @buf:	data buffer + * nand_write_page_syndrome - [REPLACEABLE] hardware ECC syndrome based page write + * @mtd: mtd info structure + * @chip: nand chip info structure + * @buf: data buffer   * - * The hw generator calculates the error syndrome automatically. Therefor - * we need a special oob layout and handling. + * The hw generator calculates the error syndrome automatically. Therefore we + * need a special oob layout and handling.   */  static void nand_write_page_syndrome(struct mtd_info *mtd,  				    struct nand_chip *chip, const uint8_t *buf) @@ -2041,12 +2051,12 @@ static void nand_write_page_syndrome(struct mtd_info *mtd,  /**   * nand_write_page - [REPLACEABLE] write one page - * @mtd:	MTD device structure - * @chip:	NAND chip descriptor - * @buf:	the data to write - * @page:	page number to write - * @cached:	cached programming - * @raw:	use _raw version of write_page + * @mtd: MTD device structure + * @chip: NAND chip descriptor + * @buf: the data to write + * @page: page number to write + * @cached: cached programming + * @raw: use _raw version of write_page   */  static int nand_write_page(struct mtd_info *mtd, struct nand_chip *chip,  			   const uint8_t *buf, int page, int cached, int raw) @@ -2061,8 +2071,8 @@ static int nand_write_page(struct mtd_info *mtd, struct nand_chip *chip,  		chip->ecc.write_page(mtd, chip, buf);  	/* -	 * Cached progamming disabled for now, Not sure if its worth the -	 * trouble. The speed gain is not very impressive. (2.3->2.6Mib/s) +	 * Cached progamming disabled for now. Not sure if it's worth the +	 * trouble. The speed gain is not very impressive. (2.3->2.6Mib/s).  	 */  	cached = 0; @@ -2072,7 +2082,7 @@ static int nand_write_page(struct mtd_info *mtd, struct nand_chip *chip,  		status = chip->waitfunc(mtd, chip);  		/*  		 * See if operation failed and additional status checks are -		 * available +		 * available.  		 */  		if ((status & NAND_STATUS_FAIL) && (chip->errstat))  			status = chip->errstat(mtd, chip, FL_WRITING, status, @@ -2096,29 +2106,37 @@ static int nand_write_page(struct mtd_info *mtd, struct nand_chip *chip,  }  /** - * nand_fill_oob - [Internal] Transfer client buffer to oob - * @chip:	nand chip structure - * @oob:	oob data buffer - * @len:	oob data write length - * @ops:	oob ops structure + * nand_fill_oob - [INTERN] Transfer client buffer to oob + * @mtd: MTD device structure + * @oob: oob data buffer + * @len: oob data write length + * @ops: oob ops structure   */ -static uint8_t *nand_fill_oob(struct nand_chip *chip, uint8_t *oob, size_t len, -						struct mtd_oob_ops *ops) +static uint8_t *nand_fill_oob(struct mtd_info *mtd, uint8_t *oob, size_t len, +			      struct mtd_oob_ops *ops)  { +	struct nand_chip *chip = mtd->priv; + +	/* +	 * Initialise to all 0xFF, to avoid the possibility of left over OOB +	 * data from a previous OOB read. +	 */ +	memset(chip->oob_poi, 0xff, mtd->oobsize); +  	switch (ops->mode) { -	case MTD_OOB_PLACE: -	case MTD_OOB_RAW: +	case MTD_OPS_PLACE_OOB: +	case MTD_OPS_RAW:  		memcpy(chip->oob_poi + ops->ooboffs, oob, len);  		return oob + len; -	case MTD_OOB_AUTO: { +	case MTD_OPS_AUTO_OOB: {  		struct nand_oobfree *free = chip->ecc.layout->oobfree;  		uint32_t boffs = 0, woffs = ops->ooboffs;  		size_t bytes = 0;  		for (; free->length && len; free++, len -= bytes) { -			/* Write request not from offset 0 ? */ +			/* Write request not from offset 0? */  			if (unlikely(woffs)) {  				if (woffs >= free->length) {  					woffs -= free->length; @@ -2146,12 +2164,12 @@ static uint8_t *nand_fill_oob(struct nand_chip *chip, uint8_t *oob, size_t len,  #define NOTALIGNED(x)	((x & (chip->subpagesize - 1)) != 0)  /** - * nand_do_write_ops - [Internal] NAND write with ECC - * @mtd:	MTD device structure - * @to:		offset to write to - * @ops:	oob operations description structure + * nand_do_write_ops - [INTERN] NAND write with ECC + * @mtd: MTD device structure + * @to: offset to write to + * @ops: oob operations description structure   * - * NAND write with ECC + * NAND write with ECC.   */  static int nand_do_write_ops(struct mtd_info *mtd, loff_t to,  			     struct mtd_oob_ops *ops) @@ -2161,7 +2179,7 @@ static int nand_do_write_ops(struct mtd_info *mtd, loff_t to,  	uint32_t writelen = ops->len;  	uint32_t oobwritelen = ops->ooblen; -	uint32_t oobmaxlen = ops->mode == MTD_OOB_AUTO ? +	uint32_t oobmaxlen = ops->mode == MTD_OPS_AUTO_OOB ?  				mtd->oobavail : mtd->oobsize;  	uint8_t *oob = ops->oobbuf; @@ -2172,10 +2190,10 @@ static int nand_do_write_ops(struct mtd_info *mtd, loff_t to,  	if (!writelen)  		return 0; -	/* reject writes, which are not page aligned */ +	/* Reject writes, which are not page aligned */  	if (NOTALIGNED(to) || NOTALIGNED(ops->len)) { -		printk(KERN_NOTICE "%s: Attempt to write not " -				"page aligned data\n", __func__); +		pr_notice("%s: attempt to write non page aligned data\n", +			   __func__);  		return -EINVAL;  	} @@ -2201,10 +2219,6 @@ static int nand_do_write_ops(struct mtd_info *mtd, loff_t to,  	    (chip->pagebuf << chip->page_shift) < (to + ops->len))  		chip->pagebuf = -1; -	/* If we're not given explicit OOB data, let it be 0xFF */ -	if (likely(!oob)) -		memset(chip->oob_poi, 0xff, mtd->oobsize); -  	/* Don't allow multipage oob writes with offset */  	if (oob && ops->ooboffs && (ops->ooboffs + ops->ooblen > oobmaxlen))  		return -EINVAL; @@ -2214,7 +2228,7 @@ static int nand_do_write_ops(struct mtd_info *mtd, loff_t to,  		int cached = writelen > bytes && page != blockmask;  		uint8_t *wbuf = buf; -		/* Partial page write ? */ +		/* Partial page write? */  		if (unlikely(column || writelen < (mtd->writesize - 1))) {  			cached = 0;  			bytes = min_t(int, bytes - column, (int) writelen); @@ -2226,12 +2240,15 @@ static int nand_do_write_ops(struct mtd_info *mtd, loff_t to,  		if (unlikely(oob)) {  			size_t len = min(oobwritelen, oobmaxlen); -			oob = nand_fill_oob(chip, oob, len, ops); +			oob = nand_fill_oob(mtd, oob, len, ops);  			oobwritelen -= len; +		} else { +			/* We still need to erase leftover OOB data */ +			memset(chip->oob_poi, 0xff, mtd->oobsize);  		}  		ret = chip->write_page(mtd, chip, wbuf, page, cached, -				       (ops->mode == MTD_OOB_RAW)); +				       (ops->mode == MTD_OPS_RAW));  		if (ret)  			break; @@ -2260,11 +2277,11 @@ static int nand_do_write_ops(struct mtd_info *mtd, loff_t to,  /**   * panic_nand_write - [MTD Interface] NAND write with ECC - * @mtd:	MTD device structure - * @to:		offset to write to - * @len:	number of bytes to write - * @retlen:	pointer to variable to store the number of written bytes - * @buf:	the data to write + * @mtd: MTD device structure + * @to: offset to write to + * @len: number of bytes to write + * @retlen: pointer to variable to store the number of written bytes + * @buf: the data to write   *   * NAND write with ECC. Used when performing writes in interrupt context, this   * may for example be called by mtdoops when writing an oops while in panic. @@ -2273,6 +2290,7 @@ static int panic_nand_write(struct mtd_info *mtd, loff_t to, size_t len,  			    size_t *retlen, const uint8_t *buf)  {  	struct nand_chip *chip = mtd->priv; +	struct mtd_oob_ops ops;  	int ret;  	/* Do not allow reads past end of device */ @@ -2281,36 +2299,38 @@ static int panic_nand_write(struct mtd_info *mtd, loff_t to, size_t len,  	if (!len)  		return 0; -	/* Wait for the device to get ready.  */ +	/* Wait for the device to get ready */  	panic_nand_wait(mtd, chip, 400); -	/* Grab the device.  */ +	/* Grab the device */  	panic_nand_get_device(chip, mtd, FL_WRITING); -	chip->ops.len = len; -	chip->ops.datbuf = (uint8_t *)buf; -	chip->ops.oobbuf = NULL; +	ops.len = len; +	ops.datbuf = (uint8_t *)buf; +	ops.oobbuf = NULL; +	ops.mode = 0; -	ret = nand_do_write_ops(mtd, to, &chip->ops); +	ret = nand_do_write_ops(mtd, to, &ops); -	*retlen = chip->ops.retlen; +	*retlen = ops.retlen;  	return ret;  }  /**   * nand_write - [MTD Interface] NAND write with ECC - * @mtd:	MTD device structure - * @to:		offset to write to - * @len:	number of bytes to write - * @retlen:	pointer to variable to store the number of written bytes - * @buf:	the data to write + * @mtd: MTD device structure + * @to: offset to write to + * @len: number of bytes to write + * @retlen: pointer to variable to store the number of written bytes + * @buf: the data to write   * - * NAND write with ECC + * NAND write with ECC.   */  static int nand_write(struct mtd_info *mtd, loff_t to, size_t len,  			  size_t *retlen, const uint8_t *buf)  {  	struct nand_chip *chip = mtd->priv; +	struct mtd_oob_ops ops;  	int ret;  	/* Do not allow reads past end of device */ @@ -2321,13 +2341,14 @@ static int nand_write(struct mtd_info *mtd, loff_t to, size_t len,  	nand_get_device(chip, mtd, FL_WRITING); -	chip->ops.len = len; -	chip->ops.datbuf = (uint8_t *)buf; -	chip->ops.oobbuf = NULL; +	ops.len = len; +	ops.datbuf = (uint8_t *)buf; +	ops.oobbuf = NULL; +	ops.mode = 0; -	ret = nand_do_write_ops(mtd, to, &chip->ops); +	ret = nand_do_write_ops(mtd, to, &ops); -	*retlen = chip->ops.retlen; +	*retlen = ops.retlen;  	nand_release_device(mtd); @@ -2336,11 +2357,11 @@ static int nand_write(struct mtd_info *mtd, loff_t to, size_t len,  /**   * nand_do_write_oob - [MTD Interface] NAND write out-of-band - * @mtd:	MTD device structure - * @to:		offset to write to - * @ops:	oob operation description structure + * @mtd: MTD device structure + * @to: offset to write to + * @ops: oob operation description structure   * - * NAND write out-of-band + * NAND write out-of-band.   */  static int nand_do_write_oob(struct mtd_info *mtd, loff_t to,  			     struct mtd_oob_ops *ops) @@ -2348,24 +2369,24 @@ static int nand_do_write_oob(struct mtd_info *mtd, loff_t to,  	int chipnr, page, status, len;  	struct nand_chip *chip = mtd->priv; -	DEBUG(MTD_DEBUG_LEVEL3, "%s: to = 0x%08x, len = %i\n", +	pr_debug("%s: to = 0x%08x, len = %i\n",  			 __func__, (unsigned int)to, (int)ops->ooblen); -	if (ops->mode == MTD_OOB_AUTO) +	if (ops->mode == MTD_OPS_AUTO_OOB)  		len = chip->ecc.layout->oobavail;  	else  		len = mtd->oobsize;  	/* Do not allow write past end of page */  	if ((ops->ooboffs + ops->ooblen) > len) { -		DEBUG(MTD_DEBUG_LEVEL0, "%s: Attempt to write " -				"past end of page\n", __func__); +		pr_debug("%s: attempt to write past end of page\n", +				__func__);  		return -EINVAL;  	}  	if (unlikely(ops->ooboffs >= len)) { -		DEBUG(MTD_DEBUG_LEVEL0, "%s: Attempt to start " -				"write outside oob\n", __func__); +		pr_debug("%s: attempt to start write outside oob\n", +				__func__);  		return -EINVAL;  	} @@ -2374,8 +2395,8 @@ static int nand_do_write_oob(struct mtd_info *mtd, loff_t to,  		     ops->ooboffs + ops->ooblen >  			((mtd->size >> chip->page_shift) -  			 (to >> chip->page_shift)) * len)) { -		DEBUG(MTD_DEBUG_LEVEL0, "%s: Attempt write beyond " -				"end of device\n", __func__); +		pr_debug("%s: attempt to write beyond end of device\n", +				__func__);  		return -EINVAL;  	} @@ -2401,10 +2422,12 @@ static int nand_do_write_oob(struct mtd_info *mtd, loff_t to,  	if (page == chip->pagebuf)  		chip->pagebuf = -1; -	memset(chip->oob_poi, 0xff, mtd->oobsize); -	nand_fill_oob(chip, ops->oobbuf, ops->ooblen, ops); -	status = chip->ecc.write_oob(mtd, chip, page & chip->pagemask); -	memset(chip->oob_poi, 0xff, mtd->oobsize); +	nand_fill_oob(mtd, ops->oobbuf, ops->ooblen, ops); + +	if (ops->mode == MTD_OPS_RAW) +		status = chip->ecc.write_oob_raw(mtd, chip, page & chip->pagemask); +	else +		status = chip->ecc.write_oob(mtd, chip, page & chip->pagemask);  	if (status)  		return status; @@ -2416,9 +2439,9 @@ static int nand_do_write_oob(struct mtd_info *mtd, loff_t to,  /**   * nand_write_oob - [MTD Interface] NAND write data and/or out-of-band - * @mtd:	MTD device structure - * @to:		offset to write to - * @ops:	oob operation description structure + * @mtd: MTD device structure + * @to: offset to write to + * @ops: oob operation description structure   */  static int nand_write_oob(struct mtd_info *mtd, loff_t to,  			  struct mtd_oob_ops *ops) @@ -2430,17 +2453,17 @@ static int nand_write_oob(struct mtd_info *mtd, loff_t to,  	/* Do not allow writes past end of device */  	if (ops->datbuf && (to + ops->len) > mtd->size) { -		DEBUG(MTD_DEBUG_LEVEL0, "%s: Attempt write beyond " -				"end of device\n", __func__); +		pr_debug("%s: attempt to write beyond end of device\n", +				__func__);  		return -EINVAL;  	}  	nand_get_device(chip, mtd, FL_WRITING);  	switch (ops->mode) { -	case MTD_OOB_PLACE: -	case MTD_OOB_AUTO: -	case MTD_OOB_RAW: +	case MTD_OPS_PLACE_OOB: +	case MTD_OPS_AUTO_OOB: +	case MTD_OPS_RAW:  		break;  	default: @@ -2458,11 +2481,11 @@ out:  }  /** - * single_erease_cmd - [GENERIC] NAND standard block erase command function - * @mtd:	MTD device structure - * @page:	the page address of the block which will be erased + * single_erase_cmd - [GENERIC] NAND standard block erase command function + * @mtd: MTD device structure + * @page: the page address of the block which will be erased   * - * Standard erase command for NAND chips + * Standard erase command for NAND chips.   */  static void single_erase_cmd(struct mtd_info *mtd, int page)  { @@ -2473,12 +2496,11 @@ static void single_erase_cmd(struct mtd_info *mtd, int page)  }  /** - * multi_erease_cmd - [GENERIC] AND specific block erase command function - * @mtd:	MTD device structure - * @page:	the page address of the block which will be erased + * multi_erase_cmd - [GENERIC] AND specific block erase command function + * @mtd: MTD device structure + * @page: the page address of the block which will be erased   * - * AND multi block erase command function - * Erase 4 consecutive blocks + * AND multi block erase command function. Erase 4 consecutive blocks.   */  static void multi_erase_cmd(struct mtd_info *mtd, int page)  { @@ -2493,10 +2515,10 @@ static void multi_erase_cmd(struct mtd_info *mtd, int page)  /**   * nand_erase - [MTD Interface] erase block(s) - * @mtd:	MTD device structure - * @instr:	erase instruction + * @mtd: MTD device structure + * @instr: erase instruction   * - * Erase one ore more blocks + * Erase one ore more blocks.   */  static int nand_erase(struct mtd_info *mtd, struct erase_info *instr)  { @@ -2505,12 +2527,12 @@ static int nand_erase(struct mtd_info *mtd, struct erase_info *instr)  #define BBT_PAGE_MASK	0xffffff3f  /** - * nand_erase_nand - [Internal] erase block(s) - * @mtd:	MTD device structure - * @instr:	erase instruction - * @allowbbt:	allow erasing the bbt area + * nand_erase_nand - [INTERN] erase block(s) + * @mtd: MTD device structure + * @instr: erase instruction + * @allowbbt: allow erasing the bbt area   * - * Erase one ore more blocks + * Erase one ore more blocks.   */  int nand_erase_nand(struct mtd_info *mtd, struct erase_info *instr,  		    int allowbbt) @@ -2521,9 +2543,9 @@ int nand_erase_nand(struct mtd_info *mtd, struct erase_info *instr,  	unsigned int bbt_masked_page = 0xffffffff;  	loff_t len; -	DEBUG(MTD_DEBUG_LEVEL3, "%s: start = 0x%012llx, len = %llu\n", -				__func__, (unsigned long long)instr->addr, -				(unsigned long long)instr->len); +	pr_debug("%s: start = 0x%012llx, len = %llu\n", +			__func__, (unsigned long long)instr->addr, +			(unsigned long long)instr->len);  	if (check_offs_len(mtd, instr->addr, instr->len))  		return -EINVAL; @@ -2545,8 +2567,8 @@ int nand_erase_nand(struct mtd_info *mtd, struct erase_info *instr,  	/* Check, if it is write protected */  	if (nand_check_wp(mtd)) { -		DEBUG(MTD_DEBUG_LEVEL0, "%s: Device is write protected!!!\n", -					__func__); +		pr_debug("%s: device is write protected!\n", +				__func__);  		instr->state = MTD_ERASE_FAILED;  		goto erase_exit;  	} @@ -2555,7 +2577,7 @@ int nand_erase_nand(struct mtd_info *mtd, struct erase_info *instr,  	 * If BBT requires refresh, set the BBT page mask to see if the BBT  	 * should be rewritten. Otherwise the mask is set to 0xffffffff which  	 * can not be matched. This is also done when the bbt is actually -	 * erased to avoid recusrsive updates +	 * erased to avoid recursive updates.  	 */  	if (chip->options & BBT_AUTO_REFRESH && !allowbbt)  		bbt_masked_page = chip->bbt_td->pages[chipnr] & BBT_PAGE_MASK; @@ -2566,20 +2588,18 @@ int nand_erase_nand(struct mtd_info *mtd, struct erase_info *instr,  	instr->state = MTD_ERASING;  	while (len) { -		/* -		 * heck if we have a bad block, we do not erase bad blocks ! -		 */ +		/* Heck if we have a bad block, we do not erase bad blocks! */  		if (nand_block_checkbad(mtd, ((loff_t) page) <<  					chip->page_shift, 0, allowbbt)) { -			printk(KERN_WARNING "%s: attempt to erase a bad block " -					"at page 0x%08x\n", __func__, page); +			pr_warn("%s: attempt to erase a bad block at page 0x%08x\n", +				    __func__, page);  			instr->state = MTD_ERASE_FAILED;  			goto erase_exit;  		}  		/*  		 * Invalidate the page cache, if we erase the block which -		 * contains the current cached page +		 * contains the current cached page.  		 */  		if (page <= chip->pagebuf && chip->pagebuf <  		    (page + pages_per_block)) @@ -2599,8 +2619,8 @@ int nand_erase_nand(struct mtd_info *mtd, struct erase_info *instr,  		/* See if block erase succeeded */  		if (status & NAND_STATUS_FAIL) { -			DEBUG(MTD_DEBUG_LEVEL0, "%s: Failed erase, " -					"page 0x%08x\n", __func__, page); +			pr_debug("%s: failed erase, page 0x%08x\n", +					__func__, page);  			instr->state = MTD_ERASE_FAILED;  			instr->fail_addr =  				((loff_t)page << chip->page_shift); @@ -2609,7 +2629,7 @@ int nand_erase_nand(struct mtd_info *mtd, struct erase_info *instr,  		/*  		 * If BBT requires refresh, set the BBT rewrite flag to the -		 * page being erased +		 * page being erased.  		 */  		if (bbt_masked_page != 0xffffffff &&  		    (page & BBT_PAGE_MASK) == bbt_masked_page) @@ -2628,7 +2648,7 @@ int nand_erase_nand(struct mtd_info *mtd, struct erase_info *instr,  			/*  			 * If BBT requires refresh and BBT-PERCHIP, set the BBT -			 * page mask to see if this BBT should be rewritten +			 * page mask to see if this BBT should be rewritten.  			 */  			if (bbt_masked_page != 0xffffffff &&  			    (chip->bbt_td->options & NAND_BBT_PERCHIP)) @@ -2651,7 +2671,7 @@ erase_exit:  	/*  	 * If BBT requires refresh and erase was successful, rewrite any -	 * selected bad block tables +	 * selected bad block tables.  	 */  	if (bbt_masked_page == 0xffffffff || ret)  		return ret; @@ -2659,10 +2679,10 @@ erase_exit:  	for (chipnr = 0; chipnr < chip->numchips; chipnr++) {  		if (!rewrite_bbt[chipnr])  			continue; -		/* update the BBT for chip */ -		DEBUG(MTD_DEBUG_LEVEL0, "%s: nand_update_bbt " -			"(%d:0x%0llx 0x%0x)\n", __func__, chipnr, -			rewrite_bbt[chipnr], chip->bbt_td->pages[chipnr]); +		/* Update the BBT for chip */ +		pr_debug("%s: nand_update_bbt (%d:0x%0llx 0x%0x)\n", +				__func__, chipnr, rewrite_bbt[chipnr], +				chip->bbt_td->pages[chipnr]);  		nand_update_bbt(mtd, rewrite_bbt[chipnr]);  	} @@ -2672,15 +2692,15 @@ erase_exit:  /**   * nand_sync - [MTD Interface] sync - * @mtd:	MTD device structure + * @mtd: MTD device structure   * - * Sync is actually a wait for chip ready function + * Sync is actually a wait for chip ready function.   */  static void nand_sync(struct mtd_info *mtd)  {  	struct nand_chip *chip = mtd->priv; -	DEBUG(MTD_DEBUG_LEVEL3, "%s: called\n", __func__); +	pr_debug("%s: called\n", __func__);  	/* Grab the lock and see if the device is available */  	nand_get_device(chip, mtd, FL_SYNCING); @@ -2690,8 +2710,8 @@ static void nand_sync(struct mtd_info *mtd)  /**   * nand_block_isbad - [MTD Interface] Check if block at offset is bad - * @mtd:	MTD device structure - * @offs:	offset relative to mtd start + * @mtd: MTD device structure + * @offs: offset relative to mtd start   */  static int nand_block_isbad(struct mtd_info *mtd, loff_t offs)  { @@ -2704,8 +2724,8 @@ static int nand_block_isbad(struct mtd_info *mtd, loff_t offs)  /**   * nand_block_markbad - [MTD Interface] Mark block at the given offset as bad - * @mtd:	MTD device structure - * @ofs:	offset relative to mtd start + * @mtd: MTD device structure + * @ofs: offset relative to mtd start   */  static int nand_block_markbad(struct mtd_info *mtd, loff_t ofs)  { @@ -2714,7 +2734,7 @@ static int nand_block_markbad(struct mtd_info *mtd, loff_t ofs)  	ret = nand_block_isbad(mtd, ofs);  	if (ret) { -		/* If it was bad already, return success and do nothing. */ +		/* If it was bad already, return success and do nothing */  		if (ret > 0)  			return 0;  		return ret; @@ -2725,7 +2745,7 @@ static int nand_block_markbad(struct mtd_info *mtd, loff_t ofs)  /**   * nand_suspend - [MTD Interface] Suspend the NAND flash - * @mtd:	MTD device structure + * @mtd: MTD device structure   */  static int nand_suspend(struct mtd_info *mtd)  { @@ -2736,7 +2756,7 @@ static int nand_suspend(struct mtd_info *mtd)  /**   * nand_resume - [MTD Interface] Resume the NAND flash - * @mtd:	MTD device structure + * @mtd: MTD device structure   */  static void nand_resume(struct mtd_info *mtd)  { @@ -2745,13 +2765,11 @@ static void nand_resume(struct mtd_info *mtd)  	if (chip->state == FL_PM_SUSPENDED)  		nand_release_device(mtd);  	else -		printk(KERN_ERR "%s called for a chip which is not " -		       "in suspended state\n", __func__); +		pr_err("%s called for a chip which is not in suspended state\n", +			__func__);  } -/* - * Set default functions - */ +/* Set default functions */  static void nand_set_defaults(struct nand_chip *chip, int busw)  {  	/* check for proper chip_delay setup, set 20us if not */ @@ -2793,23 +2811,21 @@ static void nand_set_defaults(struct nand_chip *chip, int busw)  } -/* - * sanitize ONFI strings so we can safely print them - */ +/* Sanitize ONFI strings so we can safely print them */  static void sanitize_string(uint8_t *s, size_t len)  {  	ssize_t i; -	/* null terminate */ +	/* Null terminate */  	s[len - 1] = 0; -	/* remove non printable chars */ +	/* Remove non printable chars */  	for (i = 0; i < len - 1; i++) {  		if (s[i] < ' ' || s[i] > 127)  			s[i] = '?';  	} -	/* remove trailing spaces */ +	/* Remove trailing spaces */  	strim(s);  } @@ -2826,28 +2842,28 @@ static u16 onfi_crc16(u16 crc, u8 const *p, size_t len)  }  /* - * Check if the NAND chip is ONFI compliant, returns 1 if it is, 0 otherwise + * Check if the NAND chip is ONFI compliant, returns 1 if it is, 0 otherwise.   */  static int nand_flash_detect_onfi(struct mtd_info *mtd, struct nand_chip *chip, -					int busw) +					int *busw)  {  	struct nand_onfi_params *p = &chip->onfi_params;  	int i;  	int val; -	/* try ONFI for unknow chip or LP */ +	/* Try ONFI for unknown chip or LP */  	chip->cmdfunc(mtd, NAND_CMD_READID, 0x20, -1);  	if (chip->read_byte(mtd) != 'O' || chip->read_byte(mtd) != 'N' ||  		chip->read_byte(mtd) != 'F' || chip->read_byte(mtd) != 'I')  		return 0; -	printk(KERN_INFO "ONFI flash detected\n"); +	pr_info("ONFI flash detected\n");  	chip->cmdfunc(mtd, NAND_CMD_PARAM, 0, -1);  	for (i = 0; i < 3; i++) {  		chip->read_buf(mtd, (uint8_t *)p, sizeof(*p));  		if (onfi_crc16(ONFI_CRC_BASE, (uint8_t *)p, 254) ==  				le16_to_cpu(p->crc)) { -			printk(KERN_INFO "ONFI param page %d valid\n", i); +			pr_info("ONFI param page %d valid\n", i);  			break;  		}  	} @@ -2855,7 +2871,7 @@ static int nand_flash_detect_onfi(struct mtd_info *mtd, struct nand_chip *chip,  	if (i == 3)  		return 0; -	/* check version */ +	/* Check version */  	val = le16_to_cpu(p->revision);  	if (val & (1 << 5))  		chip->onfi_version = 23; @@ -2871,8 +2887,7 @@ static int nand_flash_detect_onfi(struct mtd_info *mtd, struct nand_chip *chip,  		chip->onfi_version = 0;  	if (!chip->onfi_version) { -		printk(KERN_INFO "%s: unsupported ONFI version: %d\n", -								__func__, val); +		pr_info("%s: unsupported ONFI version: %d\n", __func__, val);  		return 0;  	} @@ -2884,9 +2899,9 @@ static int nand_flash_detect_onfi(struct mtd_info *mtd, struct nand_chip *chip,  	mtd->erasesize = le32_to_cpu(p->pages_per_block) * mtd->writesize;  	mtd->oobsize = le16_to_cpu(p->spare_bytes_per_page);  	chip->chipsize = (uint64_t)le32_to_cpu(p->blocks_per_lun) * mtd->erasesize; -	busw = 0; +	*busw = 0;  	if (le16_to_cpu(p->features) & 1) -		busw = NAND_BUSWIDTH_16; +		*busw = NAND_BUSWIDTH_16;  	chip->options &= ~NAND_CHIPOPTIONS_MSK;  	chip->options |= (NAND_NO_READRDY | @@ -2896,7 +2911,7 @@ static int nand_flash_detect_onfi(struct mtd_info *mtd, struct nand_chip *chip,  }  /* - * Get the flash and manufacturer id and lookup if the type is supported + * Get the flash and manufacturer id and lookup if the type is supported.   */  static struct nand_flash_dev *nand_get_flash_type(struct mtd_info *mtd,  						  struct nand_chip *chip, @@ -2913,7 +2928,7 @@ static struct nand_flash_dev *nand_get_flash_type(struct mtd_info *mtd,  	/*  	 * Reset the chip, required by some chips (e.g. Micron MT29FxGxxxxx) -	 * after power-up +	 * after power-up.  	 */  	chip->cmdfunc(mtd, NAND_CMD_RESET, -1, -1); @@ -2924,7 +2939,8 @@ static struct nand_flash_dev *nand_get_flash_type(struct mtd_info *mtd,  	*maf_id = chip->read_byte(mtd);  	*dev_id = chip->read_byte(mtd); -	/* Try again to make sure, as some systems the bus-hold or other +	/* +	 * Try again to make sure, as some systems the bus-hold or other  	 * interface concerns can cause random data which looks like a  	 * possibly credible NAND flash to appear. If the two results do  	 * not match, ignore the device completely. @@ -2936,9 +2952,9 @@ static struct nand_flash_dev *nand_get_flash_type(struct mtd_info *mtd,  		id_data[i] = chip->read_byte(mtd);  	if (id_data[0] != *maf_id || id_data[1] != *dev_id) { -		printk(KERN_INFO "%s: second ID read did not match " -		       "%02x,%02x against %02x,%02x\n", __func__, -		       *maf_id, *dev_id, id_data[0], id_data[1]); +		pr_info("%s: second ID read did not match " +			"%02x,%02x against %02x,%02x\n", __func__, +			*maf_id, *dev_id, id_data[0], id_data[1]);  		return ERR_PTR(-ENODEV);  	} @@ -2952,7 +2968,7 @@ static struct nand_flash_dev *nand_get_flash_type(struct mtd_info *mtd,  	chip->onfi_version = 0;  	if (!type->name || !type->pagesize) {  		/* Check is chip is ONFI compliant */ -		ret = nand_flash_detect_onfi(mtd, chip, busw); +		ret = nand_flash_detect_onfi(mtd, chip, &busw);  		if (ret)  			goto ident_done;  	} @@ -2973,7 +2989,7 @@ static struct nand_flash_dev *nand_get_flash_type(struct mtd_info *mtd,  	chip->chipsize = (uint64_t)type->chipsize << 20;  	if (!type->pagesize && chip->init_size) { -		/* set the pagesize, oobsize, erasesize by the driver*/ +		/* Set the pagesize, oobsize, erasesize by the driver */  		busw = chip->init_size(mtd, chip, id_data);  	} else if (!type->pagesize) {  		int extid; @@ -3033,7 +3049,7 @@ static struct nand_flash_dev *nand_get_flash_type(struct mtd_info *mtd,  		}  	} else {  		/* -		 * Old devices have chip data hardcoded in the device id table +		 * Old devices have chip data hardcoded in the device id table.  		 */  		mtd->erasesize = type->erasesize;  		mtd->writesize = type->pagesize; @@ -3043,7 +3059,7 @@ static struct nand_flash_dev *nand_get_flash_type(struct mtd_info *mtd,  		/*  		 * Check for Spansion/AMD ID + repeating 5th, 6th byte since  		 * some Spansion chips have erasesize that conflicts with size -		 * listed in nand_ids table +		 * listed in nand_ids table.  		 * Data sheet (5 byte ID): Spansion S30ML-P ORNAND (p.39)  		 */  		if (*maf_id == NAND_MFR_AMD && id_data[4] != 0x00 && @@ -3057,15 +3073,16 @@ static struct nand_flash_dev *nand_get_flash_type(struct mtd_info *mtd,  	chip->options &= ~NAND_CHIPOPTIONS_MSK;  	chip->options |= type->options & NAND_CHIPOPTIONS_MSK; -	/* Check if chip is a not a samsung device. Do not clear the -	 * options for chips which are not having an extended id. +	/* +	 * Check if chip is not a Samsung device. Do not clear the +	 * options for chips which do not have an extended id.  	 */  	if (*maf_id != NAND_MFR_SAMSUNG && !type->pagesize)  		chip->options &= ~NAND_SAMSUNG_LP_OPTIONS;  ident_done:  	/* -	 * Set chip as a default. Board drivers can override it, if necessary +	 * Set chip as a default. Board drivers can override it, if necessary.  	 */  	chip->options |= NAND_NO_AUTOINCR; @@ -3077,21 +3094,21 @@ ident_done:  	/*  	 * Check, if buswidth is correct. Hardware drivers should set -	 * chip correct ! +	 * chip correct!  	 */  	if (busw != (chip->options & NAND_BUSWIDTH_16)) { -		printk(KERN_INFO "NAND device: Manufacturer ID:" -		       " 0x%02x, Chip ID: 0x%02x (%s %s)\n", *maf_id, -		       *dev_id, nand_manuf_ids[maf_idx].name, mtd->name); -		printk(KERN_WARNING "NAND bus width %d instead %d bit\n", -		       (chip->options & NAND_BUSWIDTH_16) ? 16 : 8, -		       busw ? 16 : 8); +		pr_info("NAND device: Manufacturer ID:" +			" 0x%02x, Chip ID: 0x%02x (%s %s)\n", *maf_id, +			*dev_id, nand_manuf_ids[maf_idx].name, mtd->name); +		pr_warn("NAND bus width %d instead %d bit\n", +			   (chip->options & NAND_BUSWIDTH_16) ? 16 : 8, +			   busw ? 16 : 8);  		return ERR_PTR(-EINVAL);  	}  	/* Calculate the address shift from the page size */  	chip->page_shift = ffs(mtd->writesize) - 1; -	/* Convert chipsize to number of pages per chip -1. */ +	/* Convert chipsize to number of pages per chip -1 */  	chip->pagemask = (chip->chipsize >> chip->page_shift) - 1;  	chip->bbt_erase_shift = chip->phys_erase_shift = @@ -3121,7 +3138,7 @@ ident_done:  	if ((chip->cellinfo & NAND_CI_CELLTYPE_MSK) &&  			(*maf_id == NAND_MFR_SAMSUNG ||  			 *maf_id == NAND_MFR_HYNIX)) -		chip->options |= NAND_BBT_SCANLASTPAGE; +		chip->bbt_options |= NAND_BBT_SCANLASTPAGE;  	else if ((!(chip->cellinfo & NAND_CI_CELLTYPE_MSK) &&  				(*maf_id == NAND_MFR_SAMSUNG ||  				 *maf_id == NAND_MFR_HYNIX || @@ -3129,17 +3146,7 @@ ident_done:  				 *maf_id == NAND_MFR_AMD)) ||  			(mtd->writesize == 2048 &&  			 *maf_id == NAND_MFR_MICRON)) -		chip->options |= NAND_BBT_SCAN2NDPAGE; - -	/* -	 * Numonyx/ST 2K pages, x8 bus use BOTH byte 1 and 6 -	 */ -	if (!(busw & NAND_BUSWIDTH_16) && -			*maf_id == NAND_MFR_STMICRO && -			mtd->writesize == 2048) { -		chip->options |= NAND_BBT_SCANBYTE1AND6; -		chip->badblockpos = 0; -	} +		chip->bbt_options |= NAND_BBT_SCAN2NDPAGE;  	/* Check for AND chips with 4 page planes */  	if (chip->options & NAND_4PAGE_ARRAY) @@ -3147,12 +3154,11 @@ ident_done:  	else  		chip->erase_cmd = single_erase_cmd; -	/* Do not replace user supplied command function ! */ +	/* Do not replace user supplied command function! */  	if (mtd->writesize > 512 && chip->cmdfunc == nand_command)  		chip->cmdfunc = nand_command_lp; -	/* TODO onfi flash name */ -	printk(KERN_INFO "NAND device: Manufacturer ID:" +	pr_info("NAND device: Manufacturer ID:"  		" 0x%02x, Chip ID: 0x%02x (%s %s)\n", *maf_id, *dev_id,  		nand_manuf_ids[maf_idx].name,  		chip->onfi_version ? chip->onfi_params.model : type->name); @@ -3162,12 +3168,12 @@ ident_done:  /**   * nand_scan_ident - [NAND Interface] Scan for the NAND device - * @mtd:	     MTD device structure - * @maxchips:	     Number of chips to scan for - * @table:	     Alternative NAND ID table + * @mtd: MTD device structure + * @maxchips: number of chips to scan for + * @table: alternative NAND ID table   * - * This is the first phase of the normal nand_scan() function. It - * reads the flash ID and sets up MTD fields accordingly. + * This is the first phase of the normal nand_scan() function. It reads the + * flash ID and sets up MTD fields accordingly.   *   * The mtd->owner field must be set to the module of the caller.   */ @@ -3189,7 +3195,7 @@ int nand_scan_ident(struct mtd_info *mtd, int maxchips,  	if (IS_ERR(type)) {  		if (!(chip->options & NAND_SCAN_SILENT_NODEV)) -			printk(KERN_WARNING "No NAND device found.\n"); +			pr_warn("No NAND device found\n");  		chip->select_chip(mtd, -1);  		return PTR_ERR(type);  	} @@ -3207,7 +3213,7 @@ int nand_scan_ident(struct mtd_info *mtd, int maxchips,  			break;  	}  	if (i > 1) -		printk(KERN_INFO "%d NAND chips detected\n", i); +		pr_info("%d NAND chips detected\n", i);  	/* Store the number of chips and calc total size for mtd */  	chip->numchips = i; @@ -3220,11 +3226,11 @@ EXPORT_SYMBOL(nand_scan_ident);  /**   * nand_scan_tail - [NAND Interface] Scan for the NAND device - * @mtd:	    MTD device structure + * @mtd: MTD device structure   * - * This is the second phase of the normal nand_scan() function. It - * fills out all the uninitialized function pointers with the defaults - * and scans for a bad block table if appropriate. + * This is the second phase of the normal nand_scan() function. It fills out + * all the uninitialized function pointers with the defaults and scans for a + * bad block table if appropriate.   */  int nand_scan_tail(struct mtd_info *mtd)  { @@ -3240,7 +3246,7 @@ int nand_scan_tail(struct mtd_info *mtd)  	chip->oob_poi = chip->buffers->databuf + mtd->writesize;  	/* -	 * If no default placement scheme is given, select an appropriate one +	 * If no default placement scheme is given, select an appropriate one.  	 */  	if (!chip->ecc.layout && (chip->ecc.mode != NAND_ECC_SOFT_BCH)) {  		switch (mtd->oobsize) { @@ -3257,8 +3263,8 @@ int nand_scan_tail(struct mtd_info *mtd)  			chip->ecc.layout = &nand_oob_128;  			break;  		default: -			printk(KERN_WARNING "No oob scheme defined for " -			       "oobsize %d\n", mtd->oobsize); +			pr_warn("No oob scheme defined for oobsize %d\n", +				   mtd->oobsize);  			BUG();  		}  	} @@ -3267,7 +3273,7 @@ int nand_scan_tail(struct mtd_info *mtd)  		chip->write_page = nand_write_page;  	/* -	 * check ECC mode, default to software if 3byte/512byte hardware ECC is +	 * Check ECC mode, default to software if 3byte/512byte hardware ECC is  	 * selected and we have 256 byte pagesize fallback to software ECC  	 */ @@ -3276,15 +3282,15 @@ int nand_scan_tail(struct mtd_info *mtd)  		/* Similar to NAND_ECC_HW, but a separate read_page handle */  		if (!chip->ecc.calculate || !chip->ecc.correct ||  		     !chip->ecc.hwctl) { -			printk(KERN_WARNING "No ECC functions supplied; " -			       "Hardware ECC not possible\n"); +			pr_warn("No ECC functions supplied; " +				   "hardware ECC not possible\n");  			BUG();  		}  		if (!chip->ecc.read_page)  			chip->ecc.read_page = nand_read_page_hwecc_oob_first;  	case NAND_ECC_HW: -		/* Use standard hwecc read page function ? */ +		/* Use standard hwecc read page function? */  		if (!chip->ecc.read_page)  			chip->ecc.read_page = nand_read_page_hwecc;  		if (!chip->ecc.write_page) @@ -3305,11 +3311,11 @@ int nand_scan_tail(struct mtd_info *mtd)  		     chip->ecc.read_page == nand_read_page_hwecc ||  		     !chip->ecc.write_page ||  		     chip->ecc.write_page == nand_write_page_hwecc)) { -			printk(KERN_WARNING "No ECC functions supplied; " -			       "Hardware ECC not possible\n"); +			pr_warn("No ECC functions supplied; " +				   "hardware ECC not possible\n");  			BUG();  		} -		/* Use standard syndrome read/write page function ? */ +		/* Use standard syndrome read/write page function? */  		if (!chip->ecc.read_page)  			chip->ecc.read_page = nand_read_page_syndrome;  		if (!chip->ecc.write_page) @@ -3325,9 +3331,9 @@ int nand_scan_tail(struct mtd_info *mtd)  		if (mtd->writesize >= chip->ecc.size)  			break; -		printk(KERN_WARNING "%d byte HW ECC not possible on " -		       "%d byte page size, fallback to SW ECC\n", -		       chip->ecc.size, mtd->writesize); +		pr_warn("%d byte HW ECC not possible on " +			   "%d byte page size, fallback to SW ECC\n", +			   chip->ecc.size, mtd->writesize);  		chip->ecc.mode = NAND_ECC_SOFT;  	case NAND_ECC_SOFT: @@ -3347,7 +3353,7 @@ int nand_scan_tail(struct mtd_info *mtd)  	case NAND_ECC_SOFT_BCH:  		if (!mtd_nand_has_bch()) { -			printk(KERN_WARNING "CONFIG_MTD_ECC_BCH not enabled\n"); +			pr_warn("CONFIG_MTD_ECC_BCH not enabled\n");  			BUG();  		}  		chip->ecc.calculate = nand_bch_calculate_ecc; @@ -3362,8 +3368,8 @@ int nand_scan_tail(struct mtd_info *mtd)  		/*  		 * Board driver should supply ecc.size and ecc.bytes values to  		 * select how many bits are correctable; see nand_bch_init() -		 * for details. -		 * Otherwise, default to 4 bits for large page devices +		 * for details. Otherwise, default to 4 bits for large page +		 * devices.  		 */  		if (!chip->ecc.size && (mtd->oobsize >= 64)) {  			chip->ecc.size = 512; @@ -3374,14 +3380,14 @@ int nand_scan_tail(struct mtd_info *mtd)  					       chip->ecc.bytes,  					       &chip->ecc.layout);  		if (!chip->ecc.priv) { -			printk(KERN_WARNING "BCH ECC initialization failed!\n"); +			pr_warn("BCH ECC initialization failed!\n");  			BUG();  		}  		break;  	case NAND_ECC_NONE: -		printk(KERN_WARNING "NAND_ECC_NONE selected by board driver. " -		       "This is not recommended !!\n"); +		pr_warn("NAND_ECC_NONE selected by board driver. " +			   "This is not recommended!\n");  		chip->ecc.read_page = nand_read_page_raw;  		chip->ecc.write_page = nand_write_page_raw;  		chip->ecc.read_oob = nand_read_oob_std; @@ -3393,14 +3399,19 @@ int nand_scan_tail(struct mtd_info *mtd)  		break;  	default: -		printk(KERN_WARNING "Invalid NAND_ECC_MODE %d\n", -		       chip->ecc.mode); +		pr_warn("Invalid NAND_ECC_MODE %d\n", chip->ecc.mode);  		BUG();  	} +	/* For many systems, the standard OOB write also works for raw */ +	if (!chip->ecc.read_oob_raw) +		chip->ecc.read_oob_raw = chip->ecc.read_oob; +	if (!chip->ecc.write_oob_raw) +		chip->ecc.write_oob_raw = chip->ecc.write_oob; +  	/*  	 * The number of bytes available for a client to place data into -	 * the out of band area +	 * the out of band area.  	 */  	chip->ecc.layout->oobavail = 0;  	for (i = 0; chip->ecc.layout->oobfree[i].length @@ -3411,19 +3422,16 @@ int nand_scan_tail(struct mtd_info *mtd)  	/*  	 * Set the number of read / write steps for one page depending on ECC -	 * mode +	 * mode.  	 */  	chip->ecc.steps = mtd->writesize / chip->ecc.size;  	if (chip->ecc.steps * chip->ecc.size != mtd->writesize) { -		printk(KERN_WARNING "Invalid ecc parameters\n"); +		pr_warn("Invalid ECC parameters\n");  		BUG();  	}  	chip->ecc.total = chip->ecc.steps * chip->ecc.bytes; -	/* -	 * Allow subpage writes up to ecc.steps. Not possible for MLC -	 * FLASH. -	 */ +	/* Allow subpage writes up to ecc.steps. Not possible for MLC flash */  	if (!(chip->options & NAND_NO_SUBPAGE_WRITE) &&  	    !(chip->cellinfo & NAND_CI_CELLTYPE_MSK)) {  		switch (chip->ecc.steps) { @@ -3481,9 +3489,11 @@ int nand_scan_tail(struct mtd_info *mtd)  }  EXPORT_SYMBOL(nand_scan_tail); -/* is_module_text_address() isn't exported, and it's mostly a pointless +/* + * is_module_text_address() isn't exported, and it's mostly a pointless   * test if this is a module _anyway_ -- they'd have to try _really_ hard - * to call us from in-kernel code if the core NAND support is modular. */ + * to call us from in-kernel code if the core NAND support is modular. + */  #ifdef MODULE  #define caller_is_module() (1)  #else @@ -3493,15 +3503,13 @@ EXPORT_SYMBOL(nand_scan_tail);  /**   * nand_scan - [NAND Interface] Scan for the NAND device - * @mtd:	MTD device structure - * @maxchips:	Number of chips to scan for - * - * This fills out all the uninitialized function pointers - * with the defaults. - * The flash ID is read and the mtd/chip structures are - * filled with the appropriate values. - * The mtd->owner field must be set to the module of the caller + * @mtd: MTD device structure + * @maxchips: number of chips to scan for   * + * This fills out all the uninitialized function pointers with the defaults. + * The flash ID is read and the mtd/chip structures are filled with the + * appropriate values. The mtd->owner field must be set to the module of the + * caller.   */  int nand_scan(struct mtd_info *mtd, int maxchips)  { @@ -3509,8 +3517,7 @@ int nand_scan(struct mtd_info *mtd, int maxchips)  	/* Many callers got this wrong, so check for it for a while... */  	if (!mtd->owner && caller_is_module()) { -		printk(KERN_CRIT "%s called with NULL mtd->owner!\n", -				__func__); +		pr_crit("%s called with NULL mtd->owner!\n", __func__);  		BUG();  	} @@ -3523,8 +3530,8 @@ EXPORT_SYMBOL(nand_scan);  /**   * nand_release - [NAND Interface] Free resources held by the NAND device - * @mtd:	MTD device structure -*/ + * @mtd: MTD device structure + */  void nand_release(struct mtd_info *mtd)  {  	struct nand_chip *chip = mtd->priv;  |