Skip to contentSkip to conversation

mtd: spinand: Disable continuous read during probe

PATCH Superseded David LaPorte 2 participants 2 messages Jan 29 – Jan 30

Subsystems (2)

v1 of 2 Superseded Latest is v2 →

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 mtd: spinand: Disable continuous read during probe

Macronix serial NAND devices with continuous read support do not clear the configuration register on soft reset and lack a hardware reset pin. When continuous read is interrupted (e.g., during reboot), the feature remains enabled at the device level.

With continuous read enabled, the OOB area becomes inaccessible and all reads are instead directed to the main area. As a result, during partition allocation as part of MTD device registration, the first two bytes of the main area for the master block are read and indicate that the block is bad. This process repeats for every subsequent block for the partition.

All reads and writes that reference the BBT find no good blocks and fail.

The only paths for recovery from this state are triggering the continuous read feature by way of raw MTD reads or through a NAND device power drain.

Disable continuous read explicitly during spinand probe to ensure quiescent feature state.

Fixes 631cfdd0520d ("mtd: spi-nand: Add continuous read support")

---
Testing details:
- Instrumented feature enablement and verified fix with affected Macronix serial NAND device: warm reboot without patch marks all blocks bad during partition allocation; with patch applied, device registers cleanly with no bad blocks marked
- Patch cherry-picks cleanly to mainline v6.19-rc6 and builds without warnings
- Boot tested mainline + patch on aarch64 host without SPI interface

---
 drivers/mtd/nand/spi/core.c | 1 +
 1 file changed, 1 insertion(+)
drivers/mtd/nand/spi/core.c +1 -0
index d207286572d8..1fb05ac8678b 100644
@@ -859,6 +859,7 @@ static void spinand_cont_read_init(struct spinand_device *spinand)
 	    (engine_type == NAND_ECC_ENGINE_TYPE_ON_DIE ||
 	     engine_type == NAND_ECC_ENGINE_TYPE_NONE)) {
 		spinand->cont_read_possible = true;
+		spinand_cont_read_enable(spinand, false);
 	}
 }
 

--
2.43.0

#1 lore raw
Quoted 45 lines · David LaPorte

[You don't often get email from [email protected]. Learn why this is important at https://aka.ms/LearnAboutSenderIdentification ]

Macronix serial NAND devices with continuous read support do not clear the configuration register on soft reset and lack a hardware reset pin. When continuous read is interrupted (e.g., during reboot), the feature remains enabled at the device level.

With continuous read enabled, the OOB area becomes inaccessible and all reads are instead directed to the main area. As a result, during partition allocation as part of MTD device registration, the first two bytes of the main area for the master block are read and indicate that the block is bad. This process repeats for every subsequent block for the partition.

All reads and writes that reference the BBT find no good blocks and fail.

The only paths for recovery from this state are triggering the continuous read feature by way of raw MTD reads or through a NAND device power drain.

Disable continuous read explicitly during spinand probe to ensure quiescent feature state.

Fixes 631cfdd0520d ("mtd: spi-nand: Add continuous read support")

---
Testing details:
- Instrumented feature enablement and verified fix with affected Macronix serial NAND device: warm reboot without patch marks all blocks bad during partition allocation; with patch applied, device registers cleanly with no bad blocks marked
- Patch cherry-picks cleanly to mainline v6.19-rc6 and builds without warnings
- Boot tested mainline + patch on aarch64 host without SPI interface

---
 drivers/mtd/nand/spi/core.c | 1 +
 1 file changed, 1 insertion(+)
drivers/mtd/nand/spi/core.c +0 -0
index d207286572d8..1fb05ac8678b 100644

drivers/mtd/nand/spi/core.c static void spinand_cont_read_init(struct spinand_device *spinand) · line 862

Quoted 4 lines
drivers/mtd/nand/spi/core.c +1 -0
@@ -859,6 +859,7 @@ static void spinand_cont_read_init(struct spinand_device *spinand)
            (engine_type == NAND_ECC_ENGINE_TYPE_ON_DIE ||
             engine_type == NAND_ECC_ENGINE_TYPE_NONE)) {
                spinand->cont_read_possible = true;
+               spinand_cont_read_enable(spinand, false);

I think a comment should be added here explaining why you disable cont_read here

Quoted 6 lines
drivers/mtd/nand/spi/core.c +0 -1
        }
 }
 
--

2.43.0