summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorflorian <florian@3c298f89-4303-0410-b956-a3cf2f4a3e73>2010-06-13 09:53:55 +0000
committerflorian <florian@3c298f89-4303-0410-b956-a3cf2f4a3e73>2010-06-13 09:53:55 +0000
commitcd5addd4e056b9b0a580d1d6773204a7dccc6257 (patch)
treef8ce1f360f080560a1477d5bd9b856183a326323
parent3d61140414418416e091ddb6cdd005d03566b1ac (diff)
[kernel] fix samsung flash patch after r21408, thanks to Matthias Buecher (#7348)
git-svn-id: svn://svn.openwrt.org/openwrt/trunk@21775 3c298f89-4303-0410-b956-a3cf2f4a3e73
-rw-r--r--target/linux/generic-2.6/patches-2.6.32/014-samsung_flash68
-rw-r--r--target/linux/generic-2.6/patches-2.6.32/089-mtd-samsung-flash.patch40
-rw-r--r--target/linux/generic-2.6/patches-2.6.33/014-samsung_flash68
-rw-r--r--target/linux/generic-2.6/patches-2.6.33/089-mtd-samsung-flash.patch40
-rw-r--r--target/linux/generic-2.6/patches-2.6.34/014-samsung_flash68
-rw-r--r--target/linux/generic-2.6/patches-2.6.34/089-mtd-samsung-flash.patch40
-rw-r--r--target/linux/generic-2.6/patches-2.6.35/014-samsung_flash68
-rw-r--r--target/linux/generic-2.6/patches-2.6.35/089-mtd-samsung-flash.patch42
8 files changed, 297 insertions, 137 deletions
diff --git a/target/linux/generic-2.6/patches-2.6.32/014-samsung_flash b/target/linux/generic-2.6/patches-2.6.32/014-samsung_flash
index e2a456915c..7010d367b8 100644
--- a/target/linux/generic-2.6/patches-2.6.32/014-samsung_flash
+++ b/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;
+
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
index 4d1072cd4c..46923358b3 100644
--- 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
@@ -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)
diff --git a/target/linux/generic-2.6/patches-2.6.33/014-samsung_flash b/target/linux/generic-2.6/patches-2.6.33/014-samsung_flash
index e2a456915c..7010d367b8 100644
--- a/target/linux/generic-2.6/patches-2.6.33/014-samsung_flash
+++ b/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;
+
diff --git a/target/linux/generic-2.6/patches-2.6.33/089-mtd-samsung-flash.patch b/target/linux/generic-2.6/patches-2.6.33/089-mtd-samsung-flash.patch
index eab03db50d..46923358b3 100644
--- a/target/linux/generic-2.6/patches-2.6.33/089-mtd-samsung-flash.patch
+++ b/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)
diff --git a/target/linux/generic-2.6/patches-2.6.34/014-samsung_flash b/target/linux/generic-2.6/patches-2.6.34/014-samsung_flash
index e2a456915c..7010d367b8 100644
--- a/target/linux/generic-2.6/patches-2.6.34/014-samsung_flash
+++ b/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;
+
diff --git a/target/linux/generic-2.6/patches-2.6.34/089-mtd-samsung-flash.patch b/target/linux/generic-2.6/patches-2.6.34/089-mtd-samsung-flash.patch
index 4d1072cd4c..46923358b3 100644
--- a/target/linux/generic-2.6/patches-2.6.34/089-mtd-samsung-flash.patch
+++ b/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)
diff --git a/target/linux/generic-2.6/patches-2.6.35/014-samsung_flash b/target/linux/generic-2.6/patches-2.6.35/014-samsung_flash
index e448dfe08f..1b028edd98 100644
--- a/target/linux/generic-2.6/patches-2.6.35/014-samsung_flash
+++ b/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;
+
diff --git a/target/linux/generic-2.6/patches-2.6.35/089-mtd-samsung-flash.patch b/target/linux/generic-2.6/patches-2.6.35/089-mtd-samsung-flash.patch
index 4160b813a2..7cb4efdffc 100644
--- a/target/linux/generic-2.6/patches-2.6.35/089-mtd-samsung-flash.patch
+++ b/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)