mtd: onenand: Store bad block marker position in chip struct
authorFrieder Schrempf <frieder.schrempf@kontron.de>
Wed, 17 Apr 2019 12:36:35 +0000 (12:36 +0000)
committerMiquel Raynal <miquel.raynal@bootlin.com>
Thu, 18 Apr 2019 06:54:07 +0000 (08:54 +0200)
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: Frieder Schrempf <frieder.schrempf@kontron.de>
Reviewed-by: Miquel Raynal <miquel.raynal@bootlin.com>
Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com>
drivers/mtd/nand/onenand/onenand_base.c
drivers/mtd/nand/onenand/onenand_bbt.c
include/linux/mtd/onenand.h

index 4ca4b194e7d724411de9ad2fbc43fbb7a338cb39..f41d7624855049d1546d3c74268759e069ad761f 100644 (file)
@@ -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;
index dde20487937dde328ce6b82d829c29c193eb75be..57c31c81be1865cdddd9f5451e7b1c4372d31897 100644 (file)
@@ -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;
 
index 0aaa98b219a461711306913674d5d582b40a617b..bfe9e10fae04b86c33913ec672a223501972ecdb 100644 (file)
@@ -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
  */