| From: Joakim Tjernlund <joakim.tjernlund@transmode.se> |
| Date: Thu, 1 Mar 2018 14:39:40 +0100 |
| Subject: mtd: cfi: cmdset_0001: Workaround Micron Erase suspend bug. |
| |
| commit 46a16a2283f9e678a4e26829175e0c37a5191860 upstream. |
| |
| 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@infinera.com> |
| Reviewed-by: Richard Weinberger <richard@nod.at> |
| Signed-off-by: Boris Brezillon <boris.brezillon@bootlin.com> |
| Signed-off-by: Ben Hutchings <ben@decadent.org.uk> |
| --- |
| drivers/mtd/chips/cfi_cmdset_0001.c | 17 +++++++++++++++++ |
| 1 file changed, 17 insertions(+) |
| |
| --- 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 |
| 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) |
| { |
| @@ -830,6 +842,11 @@ static int chip_ready (struct map_info * |
| 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); |
| |