All pastes #1286982 Raw Edit

CFI revision for AMD/Spansion

public text v1 · immutable
#1286982 ·published 2008-12-16 18:30 UTC
rendered paste body
diff --git a/drivers/mtd/chips/cfi_cmdset_0002.c b/drivers/mtd/chips/cfi_cmdset_0002.c
index d74ec46..40818d4 100644
--- a/drivers/mtd/chips/cfi_cmdset_0002.c
+++ b/drivers/mtd/chips/cfi_cmdset_0002.c
@@ -152,39 +152,28 @@ static void fixup_amd_bootblock(struct mtd_info *mtd, void* param)
 			"%s: JEDEC Vendor ID is 0x%02X Device ID is 0x%02X\n",
 			map->name, cfi->mfr, cfi->id);
 
-		/* AFAICS all 29LV400 with a bottom boot block have a device ID
-		 * of 0x22BA in 16-bit mode and 0xBA in 8-bit mode.
-		 * These were badly detected as they have the 0x80 bit set
-		 * so treat them as a special case.
-		 */
-		if (((cfi->id == 0xBA) || (cfi->id == 0x22BA)) &&
-
-			/* Macronix added CFI to their 2nd generation
-			 * MX29LV400C B/T but AFAICS no other 29LV400 (AMD,
-			 * Fujitsu, Spansion, EON, ESI and older Macronix)
-			 * has CFI.
-			 *
-			 * Therefore also check the manufacturer.
-			 * This reduces the risk of false detection due to
-			 * the 8-bit device ID.
-			 */
-			(cfi->mfr == MANUFACTURER_MACRONIX)) {
-			DEBUG(MTD_DEBUG_LEVEL1,
-				"%s: Macronix MX29LV400C with bottom boot block"
-				" detected\n", map->name);
-			extp->TopBottom = 2;	/* bottom boot */
-		} else
-		if (cfi->id & 0x80) {
-			printk(KERN_WARNING "%s: JEDEC Device ID is 0x%02X. Assuming broken CFI table.\n", map->name, cfi->id);
-			extp->TopBottom = 3;	/* top boot */
-		} else {
-			extp->TopBottom = 2;	/* bottom boot */
-		}
-
+                switch ((cfi->mfr << 16) | (cfi->id & 0xffff)) {
+                case (MANUFACTURER_MACRONIX << 16) | 0x00ba: /* Macronix MX29LV400C */
+                case (MANUFACTURER_MACRONIX << 16) | 0x22ba: /* Macronix MX29LV400C */
+                        extp->TopBottom = 2;                 /* bottom-boot */
+                        break;
+                case (MANUFACTURER_MACRONIX << 16) | 0x00b9: /* Macronix MX29LV400C */
+                case (MANUFACTURER_MACRONIX << 16) | 0x22b9: /* Macronix MX29LV400C */
+                        extp->TopBottom = 3;                 /* top-boot */
+                        break;
+                default:
+                        /* Default case, use bit 7 of the ID to detect
+                         * that we have a top-boot device.  AFAICT,
+                         * there isn't any proof that this is a valid
+                         * test, but the code has been working this
+                         * way since 2001. */
+                        extp->TopBottom = (cfi->id & 0x80) ? 3 /* top-boot */ : 2 /* bottom-boot */;
+                }
 		DEBUG(MTD_DEBUG_LEVEL1,
-			"%s: AMD CFI PRI V%c.%c has no boot block field;"
-			" deduced %s from Device ID\n", map->name, major, minor,
-			extp->TopBottom == 2 ? "bottom" : "top");
+                      "%s: AMD/Spansion CFI PRI V%c.%c has no boot block field;"
+                      " deduced %s from Manufacturer/Device ID %0x/%0x\n", map->name, major, minor,
+                      extp->TopBottom == 2 ? "bottom" : "top",
+                      cfi->mfr, cfi->id);
 	}
 }
 #endif