summaryrefslogtreecommitdiff
path: root/target/linux/generic/patches-2.6.34/014-cfi_fix_amd_extended_table_check.patch
blob: 7010d367b8f25449a593d19fbbe4e69f543ecc2c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
--- a/drivers/mtd/chips/cfi_cmdset_0002.c
+++ b/drivers/mtd/chips/cfi_cmdset_0002.c
@@ -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;
 
+	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 
 
 		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);
+			       "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;