From patchwork Thu Aug 27 15:59:49 2009 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Subject: [MTD] CHIPS: 0xFF intolerance for M29W128G Date: Thu, 27 Aug 2009 05:59:49 -0000 From: massimo cirillo X-Patchwork-Id: 32256 Message-Id: <62cbdcd90908270859t65ca7c3bs67cbbfa07b2c65a6@mail.gmail.com> To: Jamie Lokier Cc: augulis.darius@gmail.com, linux-mtd@lists.infradead.org, RichardRetanubun@ruggedcom.com 2009/8/26 Jamie Lokier : > massimo cirillo wrote: >> From: Massimo Cirillo >> >> 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 > 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 --- -- Best Regards, Massimo Cirillo diff --git a/drivers/mtd/chips/cfi_cmdset_0002.c b/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, }, */ #if !FORCE_WORD_WRITE { CFI_MFR_ANY, CFI_ID_ANY, fixup_use_write_buffers, NULL, }, #endif 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); } EXPORT_SYMBOL_GPL(cfi_qry_mode_off);