[kernel] fix samsung flash patch after r21408, thanks to Matthias Buecher (#7348)
[openwrt.git] / target / linux / generic-2.6 / patches-2.6.35 / 014-samsung_flash
index e448dfe..1b028ed 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;
This page took 0.021451 seconds and 4 git commands to generate.