fix samsung flash patch after r21408, thanks to Matthias Buecher (#7348)
[openwrt/openwrt.git] / target / linux / generic-2.6 / patches-2.6.34 / 014-samsung_flash
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;