[MTD] CHIPS: 0xFF intolerance for M29W128G

Message ID 62cbdcd90908270859t65ca7c3bs67cbbfa07b2c65a6@mail.gmail.com
State New, archived
Headers show

Commit Message

massimo cirillo Aug. 27, 2009, 3:59 p.m.
2009/8/26 Jamie Lokier <jamie@shareable.org>:
> massimo cirillo wrote:
>> From: Massimo Cirillo <maxcir@gmail.com>
>> The M29W128G Numonyx flash devices are intolerant to any 0xFF command:
>> in the Cfi_util.c the function cfi_qry_mode_off() (that resets the device
>> after the autoselect mode) must have a 0xF0 command after the 0xFF command.
>> Intel-like devices are not influenced by a 0xF0 command.
>> This fix solves also the cause of the fixup_M29W128G_write_buffer() fix,
>> that can be commented out now.
>> The following patch applies to 2.6.30 kernel.
> This change was discussed 1 year ago:
>   http://lists.infradead.org/pipermail/linux-mtd/2008-August/022497.html
> The conclusion was that 0xf0 after 0xff might not be safe for some
> chips ("early revisions of L30"), but nobody could confirm which
> chips, so Alexey Korolov suggested staying safe and using fixup
> functions.
> I'm inclined to think a per-manufacturer (ignoring chip-id) reset
> function would be better than the attempt to poke several different
> commands at a chip all mixed together in a careful order, knowing that
> some commands break some chips but later commands fix them again.
> -- Jamie

I've rewritten the patch: now only the function cfi_qry_mode_off()
has been patched, and only if the device is a M29W128G (16bit or 8bit)
a final 0xF0 is given. The fixup_M29W128G_write_buffer() keeps on being
removed, because the buffer write failure derived from the unstable
state due to the missing 0xF0 command.
Please give comments about this new version.

Signed-off-by: Massimo Cirillo <maxcir@gmail.com>

Best Regards,
Massimo Cirillo <maxcir@gmail.com>


diff --git a/drivers/mtd/chips/cfi_cmdset_0002.c
old mode 100644
new mode 100755
index 61ea833..86cc313
--- a/drivers/mtd/chips/cfi_cmdset_0002.c
+++ b/drivers/mtd/chips/cfi_cmdset_0002.c
@@ -308,7 +308,7 @@  static struct cfi_fixup cfi_fixup_table[] = {
 	{ CFI_MFR_AMD, 0x1301, fixup_s29gl064n_sectors, NULL, },
 	{ CFI_MFR_AMD, 0x1a00, fixup_s29gl032n_sectors, NULL, },
 	{ CFI_MFR_AMD, 0x1a01, fixup_s29gl032n_sectors, NULL, },
-	{ CFI_MFR_ST,  0x227E, fixup_M29W128G_write_buffer, NULL, },
+	/* { CFI_MFR_ST,  0x227E, fixup_M29W128G_write_buffer, NULL, }, */
 	{ CFI_MFR_ANY, CFI_ID_ANY, fixup_use_write_buffers, NULL, },
diff --git a/drivers/mtd/chips/cfi_util.c b/drivers/mtd/chips/cfi_util.c
old mode 100644
new mode 100755
index 34d40e2..43511ab
--- a/drivers/mtd/chips/cfi_util.c
+++ b/drivers/mtd/chips/cfi_util.c
@@ -81,6 +81,9 @@  void __xipram cfi_qry_mode_off(uint32_t base, struct
map_info *map,
 	cfi_send_gen_cmd(0xF0, 0, base, map, cfi, cfi->device_type, NULL);
 	cfi_send_gen_cmd(0xFF, 0, base, map, cfi, cfi->device_type, NULL);
+	/* send a 0xF0 if the device is M29W128G */
+	if ((cfi->mfr == CFI_MFR_ST) && (cfi->id == 0x227E || cfi->id == 0x7E))
+		cfi_send_gen_cmd(0xF0, 0, base, map, cfi, cfi->device_type, NULL);