Re: raw/omap2: erasing issue

Roger Quadros
2022-06-29T13:44:36Z

Hi Yegor,

On 29/06/2022 14:33, Roger Quadros wrote:
> Hi Yegor,
>
> On 28/06/2022 14:59, Yegor Yefremov wrote:
>> On Tue, Jun 28, 2022 at 1:57 PM Yegor Yefremov
>> <yegorslists@googlemail.com> wrote:
>>>
>>> Hi Roger,
>>>
>>> On Tue, Jun 28, 2022 at 1:44 PM Roger Quadros <rogerq@kernel.org> wrote:
>>>>
>>>> Hi Yegor,
>>>>
>>>> On 28/06/2022 13:48, Yegor Yefremov wrote:
>>>>> Since linux 5.17 I get the following issue when doing ubiformat:
>>>>>
>>>>> # ubiformat -y /dev/mtd5
>>>>> ubiformat: mtd5 (nand), size 265945088 bytes (253.6 MiB), 2029
>>>>> eraseblocks of 131072 bytes (128.0 KiB), min. I/O size 2048 bytes
>>>>> libscan: scanning eraseblock 1097 -- 54 % complete eth1 timed out to bring up
>>>>> libscan: scanning eraseblock 2028 -- 100 % complete
>>>>> ubiformat: 2001 eraseblocks have valid erase counter, mean value is 9
>>>>> ubiformat: 2 eraseblocks are supposedly empty
>>>>> ubiformat: 26 bad eraseblocks found, numbers: 3, 4, 5, 6, 8, 9, 10,
>>>>> 11, 13, 14, 15, 16, 17, 18, 19, 20, 22, 23, 24, 25, 26, 27, 29, 30,
>>>>> 31, 32
>>>>
>>>> I'm guessing these bad blocks recently added due to the offending patch?
>>>
>>> Yes.
>>>
>>>>> ubiformat: formatting eras[ 33.644323] nand: nand_erase_nand:
>>>>> attempt to erase a bad block at page 0x00000d40
>>>>> ubiformat: formatting eraseblock 28[ 33.658809] nand:
>>>>> nand_erase_nand: attempt to erase a bad block at page 0x00000d80
>>>>> ubiformat: formatting eraseblock 29 -- 1 % [ 33.674531] nand:
>>>>> nand_erase_nand: attempt to erase a bad block at page 0x00000dc0
>>>>> ubiformat: formatting eraseblock 30 -- 1 % complete [ 33.684508]
>>>>> nand: nand_erase_nand: attempt to erase a bad block at page 0x00000e00
>>>>> ubiformat: formatting eraseblock 34 -- 1 % complete libmtd: error!:
>>>>> MEMERASE64 ioctl failed for eraseblock 34 (mtd5)
>>>>> error 5 (Input/output error)
>>>>>
>>>>> ubiformat: error!: failed to erase eraseblock 34
>>>>> error 5 (Input/output error)
>>>>> ubiformat: marking block 34 bad
>>>>> ubiformat: formatting eraseblock 35 -- 1 % complete libmtd: error!:
>>>>> MEMERASE64 ioctl failed for eraseblock 35 (mtd5)
>>>>> error 5 (Input/output error)
>>>>>
>>>>> ubiformat: error!: failed to erase eraseblock 35
>>>>> error 5 (Input/output error)
>>>>> ubiformat: marking block 35 bad
>>>>> ubiformat: formatting eraseblock 36 -- 1 % complete libmtd: error!:
>>>>> MEMERASE64 ioctl failed for eraseblock 36 (mtd5)
>>>>> error 5 (Input/output error)
>>>>>
>>>>> ubiformat: error!: failed to erase eraseblock 36
>>>>> error 5 (Input/output error)
>>>>> ubiformat: marking block 36 bad
>>>>> ubiformat: formatting eraseblock 37 -- 1 % complete libmtd: error!:
>>>>> MEMERASE64 ioctl failed for eraseblock 37 (mtd5)
>>>>> error 5 (Input/output error)
>>>>>
>>>>> ubiformat: error!: failed to erase eraseblock 37
>>>>> error 5 (Input/output error)
>>>>> ubiformat: marking block 37 bad
>>>>>
>>>>> ubiformat: error!: consecutive bad blocks exceed limit: 4, bad flash?
>>>>> # [ 36.322563] vwl1271: disabling
>>>>>
>>>>> git bisect pointed to the following commit:
>>>>>
>>>>> a9e849efca4f9c7732ea4a81f13ec96208994b22 is the first bad commit
>>>>> commit a9e849efca4f9c7732ea4a81f13ec96208994b22
>>>>> Author: Roger Quadros <rogerq@kernel.org>
>>>>> Date: Thu Dec 9 11:04:55 2021 +0200
>>>>>
>>>>> mtd: rawnand: omap2: move to exec_op interface
>>>>>
>>>>> Stop using legacy interface and move to the exec_op interface.
>>>>>
>>>>> Signed-off-by: Roger Quadros <rogerq@kernel.org>
>>>>> Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com>
>>>>> Link: https://lore.kernel.org/linux-mtd/20211209090458.24830-4-rogerq@kernel.org
>>>>>
>>>>> :040000 040000 2341051b8aa8e6b554b8a44d2934f76d1aa460c4
>>>>> c1727080ff16c403f4ad5ed840acc90127b632f8 M drivers
>>>>>
>>>>> Info to my NAND flash:
>>>>>
>>>>> [ 5.695760] nand: device found, Manufacturer ID: 0x2c, Chip ID: 0xda
>>>>> [ 5.702193] nand: Micron MT29F2G08ABAEAWP
>>>>> [ 5.706356] nand: 256 MiB, SLC, erase size: 128 KiB, page size:
>>>>> 2048, OOB size: 64
>>>>> [ 5.714204] nand: using OMAP_ECC_BCH8_CODE_HW ECC scheme
>>>>> [ 5.719673] 6 cmdlinepart partitions found on MTD device omap2-nand.0
>>>>> [ 5.726232] Creating 6 MTD partitions on "omap2-nand.0":
>>>>> [ 5.731594] 0x000000000000-0x000000020000 : "SPL"
>>>>> [ 5.737788] mtdblock: MTD device 'SPL' is NAND, please consider
>>>>> using UBI block devices instead.
>>>>> [ 5.750113] 0x000000020000-0x000000040000 : "SPL.backup1"
>>>>> [ 5.756916] mtdblock: MTD device 'SPL.backup1' is NAND, please
>>>>> consider using UBI block devices instead.
>>>>> [ 5.769870] 0x000000040000-0x000000060000 : "SPL.backup2"
>>>>> [ 5.776695] mtdblock: MTD device 'SPL.backup2' is NAND, please
>>>>> consider using UBI block devices instead.
>>>>> [ 5.789559] 0x000000060000-0x000000080000 : "SPL.backup3"
>>>>> [ 5.796423] mtdblock: MTD device 'SPL.backup3' is NAND, please
>>>>> consider using UBI block devices instead.
>>>>> [ 5.809341] 0x000000080000-0x000000260000 : "u-boot"
>>>>> [ 5.816652] mtdblock: MTD device 'u-boot' is NAND, please consider
>>>>> using UBI block devices instead.
>>>>> [ 5.829189] 0x000000260000-0x000010000000 : "UBI"
>>>>> [ 5.971508] mtdblock: MTD device 'UBI' is NAND, please consider
>>>>> using UBI block devices instead.
>>>>>
>>>>
>>>> What platform are you on?
>>>> I do remember testing this on omap3-beagle but it does not use BCH8 ECC scheme.
>>>
>>> I am on am335x [1]
>>>
>>> [1] https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/arch/arm/boot/dts/am335x-baltos-ir5221.dts?h=v5.19-rc4
>>
>> NAND node definition [1]:
>>
>> &gpmc {
>> pinctrl-names = "default";
>> pinctrl-0 = <&nandflash_pins_s0>;
>> ranges = <0 0 0x08000000 0x10000000>; /* CS0: NAND */
>> status = "okay";
>>
>> nand@0,0 {
>> compatible = "ti,omap2-nand";
>> reg = <0 0 4>; /* CS0, offset 0, IO size 4 */
>> interrupt-parent = <&gpmc>;
>> interrupts = <0 IRQ_TYPE_NONE>, /* fifoevent */
>> <1 IRQ_TYPE_NONE>; /* termcount */
>> rb-gpios = <&gpmc 0 GPIO_ACTIVE_HIGH>; /* gpmc_wait0 */
>> nand-bus-width = <8>;
>> ti,nand-ecc-opt = "bch8";
>> ti,nand-xfer-type = "polled";
>
> Could you please change this to "prefetch-polled" and see if it fixes the issue?
>

I tried to set ti,nand-xfer-type to "polled" on beagle-c4 board and could not reproduce the issue
I will need your help please to debug this issue.

Could you please apply the below patch on top of commit a9e849efca4f9c7732ea4a81f13ec96208994b22
and send me the full kernel log and output of ubiformat command?

Thanks!

cheers,
-roger

From 2775aca0411755c57f90e9c8a0061853275083b4 Mon Sep 17 00:00:00 2001
From: Roger Quadros <rogerq@kernel.org>
Date: Wed, 29 Jun 2022 16:40:51 +0300
Subject: [PATCH] debug: omap-nand: erase operations

add some debug prints in erase operation failure path

Signed-off-by: Roger Quadros <rogerq@kernel.org>
---
drivers/mtd/nand/raw/nand_base.c | 12 ++++++++++++
drivers/mtd/nand/raw/omap2.c | 3 +++
2 files changed, 15 insertions(+)

diff --git a/drivers/mtd/nand/raw/nand_base.c b/drivers/mtd/nand/raw/nand_base.c
index 113a2e9f43b1..3b1a599bcec5 100644
--- a/drivers/mtd/nand/raw/nand_base.c
+++ b/drivers/mtd/nand/raw/nand_base.c
@@ -1848,24 +1848,36 @@ int nand_erase_op(struct nand_chip *chip, unsigned int eraseblock)

ret = nand_exec_op(chip, &op);
if (ret)
+ {
+ pr_err("%s: exec_op failed %d\n", __func__, ret);
return ret;
+ }

ret = nand_status_op(chip, &status);
if (ret)
+ {
+ pr_err("%s: status_op failed %d\n", __func__, ret);
return ret;
+ }
} else {
chip->legacy.cmdfunc(chip, NAND_CMD_ERASE1, -1, page);
chip->legacy.cmdfunc(chip, NAND_CMD_ERASE2, -1, -1);

ret = chip->legacy.waitfunc(chip);
if (ret < 0)
+ {
+ pr_err("%s: legacy wait failed %d\n", __func__, ret);
return ret;
+ }

status = ret;
}

if (status & NAND_STATUS_FAIL)
+ {
+ pr_err("%s: NAND_STATUS fail\n", __func__);
return -EIO;
+ }

return 0;
}
diff --git a/drivers/mtd/nand/raw/omap2.c b/drivers/mtd/nand/raw/omap2.c
index 224c91282c87..5b1297333bed 100644
--- a/drivers/mtd/nand/raw/omap2.c
+++ b/drivers/mtd/nand/raw/omap2.c
@@ -2130,7 +2130,10 @@ static int omap_nand_exec_instr(struct nand_chip *chip,
nand_gpio_waitrdy(chip, info->ready_gpiod, instr->ctx.waitrdy.timeout_ms) :
nand_soft_waitrdy(chip, instr->ctx.waitrdy.timeout_ms);
if (ret)
+ {
+ dev_info(&info->pdev->dev, "%s: wait timeout %d, %px\n", __func__, ret, info->ready_gpiod);
return ret;
+ }
break;
}

--
2.17.1