mtd: cfi: cmdset_0001: Workaround Micron Erase suspend bug.

Linux-MTD Mailing List linux-mtd at lists.infradead.org
Tue Apr 24 08:59:07 PDT 2018


Gitweb:     http://git.infradead.org/?p=mtd-2.6.git;a=commit;h=46a16a2283f9e678a4e26829175e0c37a5191860
Commit:     46a16a2283f9e678a4e26829175e0c37a5191860
Parent:     6510bbc88e3258631831ade49033537081950605
Author:     Joakim Tjernlund <joakim.tjernlund at transmode.se>
AuthorDate: Thu Mar 1 14:39:40 2018 +0100
Committer:  Boris Brezillon <boris.brezillon at bootlin.com>
CommitDate: Tue Apr 24 17:42:06 2018 +0200

    mtd: cfi: cmdset_0001: Workaround Micron Erase suspend bug.
    
    Some Micron chips does not work well wrt Erase suspend for
    boot blocks. This avoids the issue by not allowing Erase suspend
    for the boot blocks for the 28F00AP30(1GBit) chip.
    
    Signed-off-by: Joakim Tjernlund <joakim.tjernlund at infinera.com>
    Cc: <stable at vger.kernel.org>
    Reviewed-by: Richard Weinberger <richard at nod.at>
    Signed-off-by: Boris Brezillon <boris.brezillon at bootlin.com>
---
 drivers/mtd/chips/cfi_cmdset_0001.c | 17 +++++++++++++++++
 1 file changed, 17 insertions(+)

diff --git a/drivers/mtd/chips/cfi_cmdset_0001.c b/drivers/mtd/chips/cfi_cmdset_0001.c
index 8833115fbc11..f5695be14499 100644
--- a/drivers/mtd/chips/cfi_cmdset_0001.c
+++ b/drivers/mtd/chips/cfi_cmdset_0001.c
@@ -45,6 +45,7 @@
 #define I82802AB	0x00ad
 #define I82802AC	0x00ac
 #define PF38F4476	0x881c
+#define M28F00AP30	0x8963
 /* STMicroelectronics chips */
 #define M50LPW080       0x002F
 #define M50FLW080A	0x0080
@@ -375,6 +376,17 @@ static void cfi_fixup_major_minor(struct cfi_private *cfi,
 		extp->MinorVersion = '1';
 }
 
+static int cfi_is_micron_28F00AP30(struct cfi_private *cfi, struct flchip *chip)
+{
+	/*
+	 * Micron(was Numonyx) 1Gbit bottom boot are buggy w.r.t
+	 * Erase Supend for their small Erase Blocks(0x8000)
+	 */
+	if (cfi->mfr == CFI_MFR_INTEL && cfi->id == M28F00AP30)
+		return 1;
+	return 0;
+}
+
 static inline struct cfi_pri_intelext *
 read_pri_intelext(struct map_info *map, __u16 adr)
 {
@@ -836,6 +848,11 @@ static int chip_ready (struct map_info *map, struct flchip *chip, unsigned long
 		    chip->in_progress_block_addr)
 			goto sleep;
 
+		/* do not suspend small EBs, buggy Micron Chips */
+		if (cfi_is_micron_28F00AP30(cfi, chip) &&
+		    (chip->in_progress_block_mask == ~(0x8000-1)))
+			goto sleep;
+
 		/* Erase suspend */
 		map_write(map, CMD(0xB0), chip->in_progress_block_addr);
 



More information about the linux-mtd-cvs mailing list