Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 02ed70bb authored by Brian Norris's avatar Brian Norris Committed by David Woodhouse
Browse files

mtd: nand: update nand_default_block_markbad()



This is an update that depends on the previous patches I sent.

We can now write to all the appropriate BB marker locations (i.e.
pages 1 AND 2, bytes 1 AND 6) with nand_default_block_markbad() if
necessary, according to the flags marked in chip->options.

Note that I removed the line:
	ofs += mtd->oobsize;
Unless I am wrong, this line was completely unnecessary in the
first place.

Signed-off-by: default avatarBrian Norris <norris@broadcom.com>
Signed-off-by: default avatarArtem Bityutskiy <Artem.Bityutskiy@nokia.com>
Signed-off-by: default avatarDavid Woodhouse <David.Woodhouse@intel.com>
parent 6ea9ad24
Loading
Loading
Loading
Loading
+24 −10
Original line number Diff line number Diff line
@@ -397,7 +397,7 @@ static int nand_default_block_markbad(struct mtd_info *mtd, loff_t ofs)
{
	struct nand_chip *chip = mtd->priv;
	uint8_t buf[2] = { 0, 0 };
	int block, ret;
	int block, ret, i = 0;

	if (chip->options & NAND_BBT_SCANLASTPAGE)
		ofs += mtd->erasesize - mtd->writesize;
@@ -411,17 +411,31 @@ static int nand_default_block_markbad(struct mtd_info *mtd, loff_t ofs)
	if (chip->options & NAND_USE_FLASH_BBT)
		ret = nand_update_bbt(mtd, ofs);
	else {
		/* We write two bytes, so we dont have to mess with 16 bit
		 * access
		 */
		nand_get_device(chip, mtd, FL_WRITING);
		ofs += mtd->oobsize;

		/* 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.
		 */
		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);

			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) &&
				i < 2);

		nand_release_device(mtd);
	}
	if (!ret)