fix samsung flash patch after r21408, thanks to Matthias Buecher (#7348)
authorFlorian Fainelli <florian@openwrt.org>
Sun, 13 Jun 2010 09:53:55 +0000 (09:53 +0000)
committerFlorian Fainelli <florian@openwrt.org>
Sun, 13 Jun 2010 09:53:55 +0000 (09:53 +0000)
SVN-Revision: 21775

target/linux/generic-2.6/patches-2.6.32/014-samsung_flash
target/linux/generic-2.6/patches-2.6.32/089-mtd-samsung-flash.patch
target/linux/generic-2.6/patches-2.6.33/014-samsung_flash
target/linux/generic-2.6/patches-2.6.33/089-mtd-samsung-flash.patch
target/linux/generic-2.6/patches-2.6.34/014-samsung_flash
target/linux/generic-2.6/patches-2.6.34/089-mtd-samsung-flash.patch
target/linux/generic-2.6/patches-2.6.35/014-samsung_flash
target/linux/generic-2.6/patches-2.6.35/089-mtd-samsung-flash.patch

index e2a456915c5c764bf9b23f192bc74cd194560c09..7010d367b8f25449a593d19fbbe4e69f543ecc2c 100644 (file)
@@ -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;
index 4d1072cd4c4a97c469e1a27f9a352d5f74f1bbb8..46923358b31c0ac8f195c9dcbca795c92000225a 100644 (file)
@@ -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)
index e2a456915c5c764bf9b23f192bc74cd194560c09..7010d367b8f25449a593d19fbbe4e69f543ecc2c 100644 (file)
@@ -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;
index eab03db50d0b8cd052b7a4778dfcac90fa60b601..46923358b31c0ac8f195c9dcbca795c92000225a 100644 (file)
@@ -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)
index e2a456915c5c764bf9b23f192bc74cd194560c09..7010d367b8f25449a593d19fbbe4e69f543ecc2c 100644 (file)
@@ -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;
index 4d1072cd4c4a97c469e1a27f9a352d5f74f1bbb8..46923358b31c0ac8f195c9dcbca795c92000225a 100644 (file)
@@ -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)
index e448dfe08f3cadda8d7920de53a0505a5a740ebd..1b028edd982c75a709e8273d4f5646f52b0943d3 100644 (file)
@@ -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;
index 4160b813a25eff2ff8b8d1a42def02f2798842b8..7cb4efdffc75c00b541951324bb48a40fa4ea8d8 100644 (file)
@@ -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)