[flashrom] [commit] r1496 - trunk

repository service svn at flashrom.org
Thu Feb 16 21:31:27 CET 2012


Author: hailfinger
Date: Thu Feb 16 21:31:25 2012
New Revision: 1496
URL: http://flashrom.org/trac/flashrom/changeset/1496

Log:
Reenable forced read

Forced read functionality was disabled when programmer registration was
merged in r1475.

We now support registering more than one controller at once for each bus
type. This can happen e.g. if one SPI controller has an attached flash
chip and one controller doesn't. In such a case we rely on the probe
mechanism to find exactly one chip, and the probe mechanism will
remember which controller/bus the flash chip is attached to. A forced
read does not have the luxury of knowing which compatible controller to
use, so this case is handled by always picking the first one. That may
or may not be the correct one, but there is no way (yet) to specify
which controller a flash chip is attached to.

Signed-off-by: Carl-Daniel Hailfinger <c-d.hailfinger.devel.2006 at gmx.net>
Acked-by: Stefan Tauner <stefan.tauner at student.tuwien.ac.at>

Modified:
   trunk/cli_classic.c

Modified: trunk/cli_classic.c
==============================================================================
--- trunk/cli_classic.c	Thu Feb 16 02:43:06 2012	(r1495)
+++ trunk/cli_classic.c	Thu Feb 16 21:31:25 2012	(r1496)
@@ -168,7 +168,7 @@
 	struct flashctx *fill_flash;
 	const char *name;
 	int namelen, opt, i, j;
-	int startchip = 0, chipcount = 0, option_index = 0, force = 0;
+	int startchip = -1, chipcount = 0, option_index = 0, force = 0;
 #if CONFIG_PRINT_WIKI == 1
 	int list_supported_wiki = 0;
 #endif
@@ -456,11 +456,27 @@
 			printf("Note: flashrom can never write if the flash "
 			       "chip isn't found automatically.\n");
 		}
-#if 0 // FIXME: What happens for a forced chip read if multiple compatible programmers are registered?
 		if (force && read_it && chip_to_probe) {
+			struct registered_programmer *pgm;
+			int compatible_programmers = 0;
 			printf("Force read (-f -r -c) requested, pretending "
 			       "the chip is there:\n");
-			startchip = probe_flash(0, &flashes[0], 1);
+			/* This loop just counts compatible controllers. */
+			for (j = 0; j < registered_programmer_count; j++) {
+				pgm = &registered_programmers[j];
+				if (pgm->buses_supported & flashes[0].bustype)
+					compatible_programmers++;
+			}
+			if (compatible_programmers > 1)
+				printf("More than one compatible controller "
+				       "found for the requested flash chip, "
+				       "using the first one.\n");
+			for (j = 0; j < registered_programmer_count; j++) {
+				pgm = &registered_programmers[j];
+				startchip = probe_flash(pgm, 0, &flashes[0], 1);
+				if (startchip != -1)
+					break;
+			}
 			if (startchip == -1) {
 				printf("Probing for flash chip '%s' failed.\n",
 				       chip_to_probe);
@@ -471,7 +487,6 @@
 			       "contain garbage.\n");
 			return read_flash_to_file(&flashes[0], filename);
 		}
-#endif
 		ret = 1;
 		goto out_shutdown;
 	} else if (!chip_to_probe) {




More information about the flashrom mailing list