Commit bfd15c90 authored by Frieder Schrempf's avatar Frieder Schrempf Committed by Miquel Raynal
Browse files

mtd: onenand: Store bad block marker position in chip struct



The information about where the manufacturer puts the bad block
markers inside the bad block and in the OOB data is stored in
different places. Let's move this information to the chip struct,
as we did it for rawnand.

Signed-off-by: default avatarFrieder Schrempf <frieder.schrempf@kontron.de>
Reviewed-by: default avatarMiquel Raynal <miquel.raynal@bootlin.com>
Signed-off-by: default avatarMiquel Raynal <miquel.raynal@bootlin.com>
parent 04649ec1
Loading
Loading
Loading
Loading
+4 −1
Original line number Diff line number Diff line
@@ -2458,7 +2458,7 @@ static int onenand_default_block_markbad(struct mtd_info *mtd, loff_t ofs)
                bbm->bbt[block >> 2] |= 0x01 << ((block & 0x03) << 1);

        /* We write two bytes, so we don't have to mess with 16-bit access */
        ofs += mtd->oobsize + (bbm->badblockpos & ~0x01);
        ofs += mtd->oobsize + (this->badblockpos & ~0x01);
	/* FIXME : What to do when marking SLC block in partition
	 * 	   with MLC erasesize? For now, it is not advisable to
	 *	   create partitions containing both SLC and MLC regions.
@@ -3967,6 +3967,9 @@ int onenand_scan(struct mtd_info *mtd, int maxchips)
	if (!(this->options & ONENAND_SKIP_INITIAL_UNLOCKING))
		this->unlock_all(mtd);

	/* Set the bad block marker position */
	this->badblockpos = ONENAND_BADBLOCK_POS;

	ret = this->scan_bbt(mtd);
	if ((!FLEXONENAND(this)) || ret)
		return ret;
+0 −3
Original line number Diff line number Diff line
@@ -190,9 +190,6 @@ static int onenand_scan_bbt(struct mtd_info *mtd, struct nand_bbt_descr *bd)
	if (!bbm->bbt)
		return -ENOMEM;

	/* Set the bad block position */
	bbm->badblockpos = ONENAND_BADBLOCK_POS;

	/* Set erase shift */
	bbm->bbt_erase_shift = this->erase_shift;

+3 −0
Original line number Diff line number Diff line
@@ -94,6 +94,7 @@ struct onenand_chip {
	unsigned int		technology;
	unsigned int		density_mask;
	unsigned int		options;
	unsigned int		badblockpos;

	unsigned int		erase_shift;
	unsigned int		page_shift;
@@ -188,6 +189,8 @@ struct onenand_chip {
/* Check byte access in OneNAND */
#define ONENAND_CHECK_BYTE_ACCESS(addr)		(addr & 0x1)

#define ONENAND_BADBLOCK_POS		0

/*
 * Options bits
 */