--- a/drivers/mtd/chips/cfi_cmdset_0002.c +++ b/drivers/mtd/chips/cfi_cmdset_0002.c @@ -325,6 +325,8 @@ static struct cfi_fixup fixup_table[] = static void cfi_fixup_major_minor(struct cfi_private *cfi, struct cfi_pri_amdstd *extp) { + // manufacturers defined in include/linux/mtd/cfi.h + if (cfi->mfr == CFI_MFR_SAMSUNG && cfi->id == 0x257e && extp->MajorVersion == '0') extp->MajorVersion = '1'; @@ -355,6 +357,9 @@ struct mtd_info *cfi_cmdset_0002(struct mtd->name = map->name; mtd->writesize = 1; + printk(" CFI mfr 0x%08x\n", cfi->mfr); // TODO: Is there a more general place to print this info? + printk(" CFI id 0x%08x\n", cfi->id); + if (cfi->cfi_mode==CFI_MODE_CFI){ unsigned char bootloc; /* @@ -373,16 +378,24 @@ struct mtd_info *cfi_cmdset_0002(struct cfi_fixup_major_minor(cfi, extp); - if (extp->MajorVersion != '1' || - (extp->MinorVersion < '0' || extp->MinorVersion > '4')) { + // valid primary extension versions are: 1.0, 1.1, 1.2, 1.3 + // see: http://www.amd.com/us-en/assets/content_type/DownloadableAssets/cfi_r20.pdf, page 19 and on + // http://www.amd.com/us-en/assets/content_type/DownloadableAssets/cfi_100_20011201.pdf + if (extp->MajorVersion < '1' || + extp->MajorVersion > '1' || + (extp->MajorVersion == '1' && ( extp->MinorVersion < '0' || extp->MinorVersion > '3'))) { printk(KERN_ERR " Unknown Amd/Fujitsu Extended Query " - "version %c.%c.\n", extp->MajorVersion, - extp->MinorVersion); + "version %c.%c (0x%02x/0x%02x).\n", + extp->MajorVersion, extp->MinorVersion, + extp->MajorVersion, extp->MinorVersion); kfree(extp); kfree(mtd); return NULL; } + printk(" Amd/Fujitsu Extended Query version %c.%c.\n", + extp->MajorVersion, extp->MinorVersion); + /* Install our own private info structure */ cfi->cmdset_priv = extp;