|
|
@@ -1,36 +1,50 @@
|
|
|
--- a/drivers/mtd/chips/cfi_cmdset_0002.c
|
|
|
+++ b/drivers/mtd/chips/cfi_cmdset_0002.c
|
|
|
-@@ -48,6 +48,7 @@
|
|
|
- #define SST49LF040B 0x0050
|
|
|
- #define SST49LF008A 0x005a
|
|
|
- #define AT49BV6416 0x00d6
|
|
|
-+#define MANUFACTURER_SAMSUNG 0x00ec
|
|
|
+@@ -372,6 +372,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';
|
|
|
+@@ -404,6 +406,9 @@ struct mtd_info *cfi_cmdset_0002(struct
|
|
|
|
|
|
- static int cfi_amdstd_read (struct mtd_info *, loff_t, size_t, size_t *, u_char *);
|
|
|
- static int cfi_amdstd_write_words(struct mtd_info *, loff_t, size_t, size_t *, const u_char *);
|
|
|
-@@ -419,12 +420,19 @@ struct mtd_info *cfi_cmdset_0002(struct
|
|
|
+ mtd->reboot_notifier.notifier_call = cfi_amdstd_reboot;
|
|
|
|
|
|
- if (extp->MajorVersion != '1' ||
|
|
|
- (extp->MinorVersion < '0' || extp->MinorVersion > '4')) {
|
|
|
-- printk(KERN_ERR " Unknown Amd/Fujitsu Extended Query "
|
|
|
++ 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;
|
|
|
+ __u16 adr = primary?cfi->cfiq->P_ADR:cfi->cfiq->A_ADR;
|
|
|
+@@ -417,16 +422,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);
|
|
|
-- kfree(extp);
|
|
|
-- kfree(mtd);
|
|
|
-- return NULL;
|
|
|
-+ if (cfi->mfr == MANUFACTURER_SAMSUNG &&
|
|
|
-+ (extp->MajorVersion == '3' && extp->MinorVersion == '3')) {
|
|
|
-+ printk(KERN_NOTICE " Newer Samsung flash detected, "
|
|
|
-+ "should be compatibile with Amd/Fujitsu.\n");
|
|
|
-+ }
|
|
|
-+ else {
|
|
|
-+ printk(KERN_ERR " Unknown Amd/Fujitsu Extended Query "
|
|
|
-+ "version %c.%c.\n", extp->MajorVersion,
|
|
|
-+ extp->MinorVersion);
|
|
|
-+ kfree(extp);
|
|
|
-+ kfree(mtd);
|
|
|
-+ return NULL;
|
|
|
-+ }
|
|
|
++ "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;
|
|
|
+
|