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

Commit e0b58d0a authored by Maxim Levitsky's avatar Maxim Levitsky Committed by David Woodhouse
Browse files

mtd: nand: add ->badblockbits for minimum number of set bits in bad block byte



This can be used to protect against bitflips in that field, but now mostly
for smartmedia.

Signed-off-by: default avatarMaxim Levitsky <maximlevitsky@gmail.com>
Signed-off-by: default avatarDavid Woodhouse <David.Woodhouse@intel.com>
parent b64d39d8
Loading
Loading
Loading
Loading
+9 −4
Original line number Diff line number Diff line
@@ -364,14 +364,18 @@ static int nand_block_bad(struct mtd_info *mtd, loff_t ofs, int getchip)
		bad = cpu_to_le16(chip->read_word(mtd));
		if (chip->badblockpos & 0x1)
			bad >>= 8;
		if ((bad & 0xFF) != 0xff)
			res = 1;
		else
			bad &= 0xFF;
	} else {
		chip->cmdfunc(mtd, NAND_CMD_READOOB, chip->badblockpos, page);
		if (chip->read_byte(mtd) != 0xff)
			res = 1;
		bad = chip->read_byte(mtd);
	}

	if (likely(chip->badblockbits == 8))
		res = bad != 0xFF;
	else
		res = hweight8(bad) < chip->badblockbits;

	if (getchip)
		nand_release_device(mtd);

@@ -2884,6 +2888,7 @@ static struct nand_flash_dev *nand_get_flash_type(struct mtd_info *mtd,
	/* Set the bad block position */
	chip->badblockpos = mtd->writesize > 512 ?
		NAND_LARGE_BADBLOCK_POS : NAND_SMALL_BADBLOCK_POS;
	chip->badblockbits = 8;

	/* Get chip options, preserve non chip based options */
	chip->options &= ~NAND_CHIPOPTIONS_MSK;
+1 −0
Original line number Diff line number Diff line
@@ -401,6 +401,7 @@ struct nand_chip {
	int		subpagesize;
	uint8_t		cellinfo;
	int		badblockpos;
	int		badblockbits;

	flstate_t	state;