|
@@ -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);
|
|
|
|