Просмотр исходного кода

fix samsung flash patch after r21408, thanks to Matthias Buecher (#7348)

SVN-Revision: 21775
Florian Fainelli 15 лет назад
Родитель
Сommit
368745c06a

+ 41 - 27
target/linux/generic-2.6/patches-2.6.32/014-samsung_flash

@@ -1,36 +1,50 @@
 --- a/drivers/mtd/chips/cfi_cmdset_0002.c
 +++ b/drivers/mtd/chips/cfi_cmdset_0002.c
-@@ -51,6 +51,7 @@
- #define SST49LF040B	        0x0050
- #define SST49LF008A		0x005a
- #define AT49BV6416		0x00d6
-+#define MANUFACTURER_SAMSUNG	0x00ec
+@@ -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;
  
- 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 *);
-@@ -375,12 +376,19 @@ struct mtd_info *cfi_cmdset_0002(struct
++	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 
  
- 		if (extp->MajorVersion != '1' ||
- 		    (extp->MinorVersion < '0' || extp->MinorVersion > '4')) {
--			printk(KERN_ERR "  Unknown Amd/Fujitsu Extended Query "
+ 		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;
+ 

+ 33 - 7
target/linux/generic-2.6/patches-2.6.32/089-mtd-samsung-flash.patch

@@ -1,11 +1,37 @@
 --- a/drivers/mtd/chips/cfi_cmdset_0002.c
 +++ b/drivers/mtd/chips/cfi_cmdset_0002.c
-@@ -374,7 +374,7 @@ struct mtd_info *cfi_cmdset_0002(struct
+@@ -327,9 +327,32 @@ static void cfi_fixup_major_minor(struct
+ {
+ 	// manufacturers defined in include/linux/mtd/cfi.h
  
- 		cfi_fixup_major_minor(cfi, extp);
+-	if (cfi->mfr == CFI_MFR_SAMSUNG && cfi->id == 0x257e &&
+-	    extp->MajorVersion == '0')
++	if (cfi->mfr == CFI_MFR_SAMSUNG &&
++	    extp->MajorVersion == '0') {
++		printk("  Fixed Samsung's Amd/Fujitsu Extended Query version from %c.%c",
++		       extp->MajorVersion, extp->MinorVersion);
++
+ 		extp->MajorVersion = '1';
++		extp->MinorVersion = '0';
++
++		printk(" to %c.%c.\n",
++		       extp->MajorVersion, extp->MinorVersion);
++	}
++
++	if (cfi->mfr == CFI_MFR_SAMSUNG &&
++	    extp->MajorVersion == '3' && extp->MinorVersion == '3') {
++		printk(KERN_NOTICE "  Newer Samsung flash detected, "
++		       "should be compatibile with Amd/Fujitsu.\n");
++
++		printk("  Fixed Samsung's Amd/Fujitsu Extended Query version from %c.%c",
++		       extp->MajorVersion, extp->MinorVersion);
++
++		extp->MajorVersion = '1';	// set to 1.3 (last defined version)
++		extp->MinorVersion = '3';
++
++		printk(" to %c.%c.\n",
++		       extp->MajorVersion, extp->MinorVersion);
++	}
+ }
  
--		if (extp->MajorVersion != '1' ||
-+		if (extp->MajorVersion < '0' || extp->MajorVersion > '3' ||
- 		    (extp->MinorVersion < '0' || extp->MinorVersion > '4')) {
- 		        if (cfi->mfr == MANUFACTURER_SAMSUNG &&
- 			    (extp->MajorVersion == '3' && extp->MinorVersion == '3')) {
+ struct mtd_info *cfi_cmdset_0002(struct map_info *map, int primary)

+ 41 - 27
target/linux/generic-2.6/patches-2.6.33/014-samsung_flash

@@ -1,36 +1,50 @@
 --- a/drivers/mtd/chips/cfi_cmdset_0002.c
 +++ b/drivers/mtd/chips/cfi_cmdset_0002.c
-@@ -51,6 +51,7 @@
- #define SST49LF040B	        0x0050
- #define SST49LF008A		0x005a
- #define AT49BV6416		0x00d6
-+#define MANUFACTURER_SAMSUNG	0x00ec
+@@ -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;
  
- 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 *);
-@@ -375,12 +376,19 @@ struct mtd_info *cfi_cmdset_0002(struct
++	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 
  
- 		if (extp->MajorVersion != '1' ||
- 		    (extp->MinorVersion < '0' || extp->MinorVersion > '4')) {
--			printk(KERN_ERR "  Unknown Amd/Fujitsu Extended Query "
+ 		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;
+ 

+ 33 - 7
target/linux/generic-2.6/patches-2.6.33/089-mtd-samsung-flash.patch

@@ -1,11 +1,37 @@
 --- a/drivers/mtd/chips/cfi_cmdset_0002.c
 +++ b/drivers/mtd/chips/cfi_cmdset_0002.c
-@@ -374,7 +374,7 @@ struct mtd_info *cfi_cmdset_0002(struct 
+@@ -327,9 +327,32 @@ static void cfi_fixup_major_minor(struct
+ {
+ 	// manufacturers defined in include/linux/mtd/cfi.h
  
- 		cfi_fixup_major_minor(cfi, extp);
+-	if (cfi->mfr == CFI_MFR_SAMSUNG && cfi->id == 0x257e &&
+-	    extp->MajorVersion == '0')
++	if (cfi->mfr == CFI_MFR_SAMSUNG &&
++	    extp->MajorVersion == '0') {
++		printk("  Fixed Samsung's Amd/Fujitsu Extended Query version from %c.%c",
++		       extp->MajorVersion, extp->MinorVersion);
++
+ 		extp->MajorVersion = '1';
++		extp->MinorVersion = '0';
++
++		printk(" to %c.%c.\n",
++		       extp->MajorVersion, extp->MinorVersion);
++	}
++
++	if (cfi->mfr == CFI_MFR_SAMSUNG &&
++	    extp->MajorVersion == '3' && extp->MinorVersion == '3') {
++		printk(KERN_NOTICE "  Newer Samsung flash detected, "
++		       "should be compatibile with Amd/Fujitsu.\n");
++
++		printk("  Fixed Samsung's Amd/Fujitsu Extended Query version from %c.%c",
++		       extp->MajorVersion, extp->MinorVersion);
++
++		extp->MajorVersion = '1';	// set to 1.3 (last defined version)
++		extp->MinorVersion = '3';
++
++		printk(" to %c.%c.\n",
++		       extp->MajorVersion, extp->MinorVersion);
++	}
+ }
  
--		if (extp->MajorVersion != '1' ||
-+		if (extp->MajorVersion < '0' || extp->MajorVersion > '3' ||
- 		    (extp->MinorVersion < '0' || extp->MinorVersion > '4')) {
- 		        if (cfi->mfr == MANUFACTURER_SAMSUNG &&
- 			    (extp->MajorVersion == '3' && extp->MinorVersion == '3')) {
+ struct mtd_info *cfi_cmdset_0002(struct map_info *map, int primary)

+ 41 - 27
target/linux/generic-2.6/patches-2.6.34/014-samsung_flash

@@ -1,36 +1,50 @@
 --- a/drivers/mtd/chips/cfi_cmdset_0002.c
 +++ b/drivers/mtd/chips/cfi_cmdset_0002.c
-@@ -51,6 +51,7 @@
- #define SST49LF040B	        0x0050
- #define SST49LF008A		0x005a
- #define AT49BV6416		0x00d6
-+#define MANUFACTURER_SAMSUNG	0x00ec
+@@ -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;
  
- 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 *);
-@@ -375,12 +376,19 @@ struct mtd_info *cfi_cmdset_0002(struct
++	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 
  
- 		if (extp->MajorVersion != '1' ||
- 		    (extp->MinorVersion < '0' || extp->MinorVersion > '4')) {
--			printk(KERN_ERR "  Unknown Amd/Fujitsu Extended Query "
+ 		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;
+ 

+ 33 - 7
target/linux/generic-2.6/patches-2.6.34/089-mtd-samsung-flash.patch

@@ -1,11 +1,37 @@
 --- a/drivers/mtd/chips/cfi_cmdset_0002.c
 +++ b/drivers/mtd/chips/cfi_cmdset_0002.c
-@@ -374,7 +374,7 @@ struct mtd_info *cfi_cmdset_0002(struct
+@@ -327,9 +327,32 @@ static void cfi_fixup_major_minor(struct
+ {
+ 	// manufacturers defined in include/linux/mtd/cfi.h
  
- 		cfi_fixup_major_minor(cfi, extp);
+-	if (cfi->mfr == CFI_MFR_SAMSUNG && cfi->id == 0x257e &&
+-	    extp->MajorVersion == '0')
++	if (cfi->mfr == CFI_MFR_SAMSUNG &&
++	    extp->MajorVersion == '0') {
++		printk("  Fixed Samsung's Amd/Fujitsu Extended Query version from %c.%c",
++		       extp->MajorVersion, extp->MinorVersion);
++
+ 		extp->MajorVersion = '1';
++		extp->MinorVersion = '0';
++
++		printk(" to %c.%c.\n",
++		       extp->MajorVersion, extp->MinorVersion);
++	}
++
++	if (cfi->mfr == CFI_MFR_SAMSUNG &&
++	    extp->MajorVersion == '3' && extp->MinorVersion == '3') {
++		printk(KERN_NOTICE "  Newer Samsung flash detected, "
++		       "should be compatibile with Amd/Fujitsu.\n");
++
++		printk("  Fixed Samsung's Amd/Fujitsu Extended Query version from %c.%c",
++		       extp->MajorVersion, extp->MinorVersion);
++
++		extp->MajorVersion = '1';	// set to 1.3 (last defined version)
++		extp->MinorVersion = '3';
++
++		printk(" to %c.%c.\n",
++		       extp->MajorVersion, extp->MinorVersion);
++	}
+ }
  
--		if (extp->MajorVersion != '1' ||
-+		if (extp->MajorVersion < '0' || extp->MajorVersion > '3' ||
- 		    (extp->MinorVersion < '0' || extp->MinorVersion > '4')) {
- 		        if (cfi->mfr == MANUFACTURER_SAMSUNG &&
- 			    (extp->MajorVersion == '3' && extp->MinorVersion == '3')) {
+ struct mtd_info *cfi_cmdset_0002(struct map_info *map, int primary)

+ 41 - 27
target/linux/generic-2.6/patches-2.6.35/014-samsung_flash

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

+ 34 - 8
target/linux/generic-2.6/patches-2.6.35/089-mtd-samsung-flash.patch

@@ -1,11 +1,37 @@
 --- a/drivers/mtd/chips/cfi_cmdset_0002.c
 +++ b/drivers/mtd/chips/cfi_cmdset_0002.c
-@@ -418,7 +418,7 @@
- 			 */
- 			cfi_fixup_major_minor(cfi, extp);
+@@ -374,9 +374,32 @@ static void cfi_fixup_major_minor(struct
+ {
+ 	// manufacturers defined in include/linux/mtd/cfi.h
  
--			if (extp->MajorVersion != '1' ||
-+			if (extp->MajorVersion < '0' || extp->MajorVersion > '3' ||
- 			    (extp->MinorVersion < '0' || extp->MinorVersion > '4')) {
- 			        if (cfi->mfr == MANUFACTURER_SAMSUNG &&
- 				    (extp->MajorVersion == '3' && extp->MinorVersion == '3')) {
+-	if (cfi->mfr == CFI_MFR_SAMSUNG && cfi->id == 0x257e &&
+-	    extp->MajorVersion == '0')
++	if (cfi->mfr == CFI_MFR_SAMSUNG &&
++	    extp->MajorVersion == '0') {
++		printk("  Fixed Samsung's Amd/Fujitsu Extended Query version from %c.%c",
++		       extp->MajorVersion, extp->MinorVersion);
++
+ 		extp->MajorVersion = '1';
++		extp->MinorVersion = '0';
++
++		printk(" to %c.%c.\n",
++		       extp->MajorVersion, extp->MinorVersion);
++	}
++
++	if (cfi->mfr == CFI_MFR_SAMSUNG &&
++	    extp->MajorVersion == '3' && extp->MinorVersion == '3') {
++		printk(KERN_NOTICE "  Newer Samsung flash detected, "
++		       "should be compatibile with Amd/Fujitsu.\n");
++
++		printk("  Fixed Samsung's Amd/Fujitsu Extended Query version from %c.%c",
++		       extp->MajorVersion, extp->MinorVersion);
++
++		extp->MajorVersion = '1';	// set to 1.3 (last defined version)
++		extp->MinorVersion = '3';
++
++		printk(" to %c.%c.\n",
++		       extp->MajorVersion, extp->MinorVersion);
++	}
+ }
+ 
+ struct mtd_info *cfi_cmdset_0002(struct map_info *map, int primary)