[flashrom] [commit] r869 - trunk

svn at flashrom.org svn at flashrom.org
Tue Jan 19 07:42:46 CET 2010


Author: hailfinger
Date: 2010-01-19 07:42:46 +0100 (Tue, 19 Jan 2010)
New Revision: 869

Modified:
   trunk/flashrom.c
Log:
Add eraseblock functions to self-check. It doesn't make sense to have
different layouts for the same function on one chip.
Keep going if an error is found, we want all errors to be reported in
one fell swoop.

Signed-off-by: Carl-Daniel Hailfinger <c-d.hailfinger.devel.2006 at gmx.net>
Acked-by: Sean Nelson <audiohacked at gmail.com>


Modified: trunk/flashrom.c
===================================================================
--- trunk/flashrom.c	2010-01-19 03:24:55 UTC (rev 868)
+++ trunk/flashrom.c	2010-01-19 06:42:46 UTC (rev 869)
@@ -833,10 +833,13 @@
 	return 0;
 }
 
-/* This function shares a lot of its structure with erase_flash(). */
+/* This function shares a lot of its structure with erase_flash().
+ * Even if an error is found, the function will keep going and check the rest.
+ */
 int selfcheck_eraseblocks(struct flashchip *flash)
 {
-	int i, k;
+	int i, j, k;
+	int ret = 0;
 
 	for (k = 0; k < NUM_ERASEFUNCTIONS; k++) {
 		unsigned int done = 0;
@@ -850,8 +853,7 @@
 					"%i region %i has size 0. Please report"
 					" a bug at flashrom at flashrom.org\n",
 					flash->name, k, i);
-				return 1;
-				break;
+				ret = 1;
 			}
 			/* Blocks with zero count are bugs in flashchips.c. */
 			if (!eraser.eraseblocks[i].count &&
@@ -860,13 +862,15 @@
 					"%i region %i has count 0. Please report"
 					" a bug at flashrom at flashrom.org\n",
 					flash->name, k, i);
-				return 1;
-				break;
+				ret = 1;
 			}
 			done += eraser.eraseblocks[i].count *
 				eraser.eraseblocks[i].size;
 		}
-		/* This erase function is completely empty. */
+		/* Empty eraseblock definition with erase function.  */
+		if (!done && eraser.block_erase)
+			msg_pspew("Strange: Empty eraseblock definition with "
+				"non-empty erase function. Not an error.\n");
 		if (!done)
 			continue;
 		if (done != flash->total_size * 1024) {
@@ -875,10 +879,25 @@
 				" expected 0x%06x bytes. Please report a bug at"
 				" flashrom at flashrom.org\n", flash->name, k,
 				done, flash->total_size * 1024);
-			return 1;
+			ret = 1;
 		}
+		if (!eraser.block_erase)
+			continue;
+		/* Check if there are identical erase functions for different
+		 * layouts. That would imply "magic" erase functions. The
+		 * easiest way to check this is with function pointers.
+		 */
+		for (j = k + 1; j < NUM_ERASEFUNCTIONS; j++)
+			if (eraser.block_erase ==
+			    flash->block_erasers[j].block_erase) {
+				msg_gerr("ERROR: Flash chip %s erase function "
+					"%i and %i are identical. Please report"
+					" a bug at flashrom at flashrom.org\n",
+					flash->name, k, j);
+				ret = 1;
+			}
 	}
-	return 0;
+	return ret;
 }
 
 int erase_flash(struct flashchip *flash)





More information about the flashrom mailing list