From d6d708d1a329a6369143e8dd34cf4e2c81d5d92f Mon Sep 17 00:00:00 2001 From: Yifeng Zhao Date: Thu, 27 Jun 2019 18:09:47 +0800 Subject: [PATCH] rockchip: drivers: mtd: nand: modify the bad block detection process Change-Id: I97c99e91516f34a270684cbb77820b4078f1cf03 Signed-off-by: Yifeng Zhao --- drivers/mtd/nand/rockchip_nand.c | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/drivers/mtd/nand/rockchip_nand.c b/drivers/mtd/nand/rockchip_nand.c index 2b9bde9604..0f3c5ff2c4 100644 --- a/drivers/mtd/nand/rockchip_nand.c +++ b/drivers/mtd/nand/rockchip_nand.c @@ -539,7 +539,7 @@ static int rockchip_nand_ecc_init(struct mtd_info *mtd, static int rockchip_nand_block_bad(struct mtd_info *mtd, loff_t ofs) { - int page, res = 0, i; + int page, res = 0; struct nand_chip *chip = mtd_to_nand(mtd); u16 bad = 0xff; int chipnr = (int)(ofs >> chip->chip_shift); @@ -549,13 +549,23 @@ static int rockchip_nand_block_bad(struct mtd_info *mtd, loff_t ofs) chip->cmdfunc(mtd, NAND_CMD_READ0, 0x00, page); if(rockchip_nand_hw_syndrome_pio_read_page(mtd, chip, chip->buffers->databuf, 0, page) == -1) { + /* first page of the block*/ chip->cmdfunc(mtd, NAND_CMD_READOOB, chip->badblockpos, page); - for (i = 0; i < 8; i++) { - bad = chip->read_byte(mtd); - if (bad) - break; - } - if (i >= 8) + bad = chip->read_byte(mtd); + if (bad != 0xFF) + res = 1; + /* second page of the block*/ + chip->cmdfunc(mtd, NAND_CMD_READOOB, chip->badblockpos, + page + 1); + bad = chip->read_byte(mtd); + if (bad != 0xFF) + res = 1; + /* last page of the block */ + page += ((mtd->erasesize - mtd->writesize) >> chip->chip_shift); + page--; + chip->cmdfunc(mtd, NAND_CMD_READOOB, chip->badblockpos, page); + bad = chip->read_byte(mtd); + if (bad != 0xFF) res = 1; } chip->select_chip(mtd, -1);