In the unlikely event of bad block,
it should update its block status to BBT, 
In this case, there are 2 kind of issue for handling
a) Mark bad block status to BBT:  It was fixed by Patric's patch
b) Clear status to BBT:  I posted patch for this issue 

Patch:
Issue of handing BBT (Bad Block Table) for 
some particular blocks (Ex:10, 11)
Updating status is, first clear status, second set bad block status.
Patrick's patch is only fixed the issue for setting status process,
so this patch fix the clearing status process.

Signed-off-by: Yoshio Furuyama <ytc-mb-yfuruya...@kioxia.com>
---
 drivers/mtd/nand/bbt.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/mtd/nand/bbt.c b/drivers/mtd/nand/bbt.c
index 64af6898131d..0780896eaafe 100644
--- a/drivers/mtd/nand/bbt.c
+++ b/drivers/mtd/nand/bbt.c
@@ -112,11 +112,13 @@ int nanddev_bbt_set_block_status(struct nand_device 
*nand, unsigned int entry,
                             ((entry * bits_per_block) / BITS_PER_LONG);
        unsigned int offs = (entry * bits_per_block) % BITS_PER_LONG;
        unsigned long val = status & GENMASK(bits_per_block - 1, 0);
+       unsigned long shift = ((bits_per_block + offs <= BITS_PER_LONG) ?
+                                       (offs + bits_per_block - 1) : 
(BITS_PER_LONG - 1));
 
        if (entry >= nanddev_neraseblocks(nand))
                return -ERANGE;
 
-       pos[0] &= ~GENMASK(offs + bits_per_block - 1, offs);
+       pos[0] &= ~GENMASK(shift, offs);
        pos[0] |= val << offs;
 
        if (bits_per_block + offs > BITS_PER_LONG) {
-- 
2.25.1

Reply via email to