r22680 also applies to 2.6.32
authorflorian <florian@3c298f89-4303-0410-b956-a3cf2f4a3e73>
Mon, 16 Aug 2010 20:53:17 +0000 (20:53 +0000)
committerflorian <florian@3c298f89-4303-0410-b956-a3cf2f4a3e73>
Mon, 16 Aug 2010 20:53:17 +0000 (20:53 +0000)
git-svn-id: svn://svn.openwrt.org/openwrt/branches/backfire@22682 3c298f89-4303-0410-b956-a3cf2f4a3e73

target/linux/generic-2.6/patches-2.6.32/014-cfi_fix_amd_extended_table_check.patch
target/linux/generic-2.6/patches-2.6.32/089-mtd-samsung-flash.patch [new file with mode: 0644]

index 1faeb41eaa6e2293fa9189f81fa444f807008136..2618fafeb99abea83e2c607d0ca12f6444670fcb 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;
diff --git a/target/linux/generic-2.6/patches-2.6.32/089-mtd-samsung-flash.patch b/target/linux/generic-2.6/patches-2.6.32/089-mtd-samsung-flash.patch
new file mode 100644 (file)
index 0000000..4692335
--- /dev/null
@@ -0,0 +1,37 @@
+--- a/drivers/mtd/chips/cfi_cmdset_0002.c
++++ b/drivers/mtd/chips/cfi_cmdset_0002.c
+@@ -327,9 +327,32 @@ static void cfi_fixup_major_minor(struct
+ {
+       // manufacturers defined in include/linux/mtd/cfi.h
+-      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)