[flashrom] [commit] r1930 - trunk

repository service svn at flashrom.org
Fri Feb 19 00:11:52 CET 2016


Author: hailfinger
Date: Fri Feb 19 00:11:52 2016
New Revision: 1930
URL: http://flashrom.org/trac/flashrom/changeset/1930

Log:
Fix chip size limiting in atapromise

The current code is checking model_id to remember if a chip has already
been limited, but if flashchips.c contains two subsequent chips with
different vendor_id but identical model_id the adjustment will not be
done. Switch to checking the chip size instead.

If a chip has multiple whole-chip erase functions, only one will be
modified. Fix that.

Signed-off-by: Carl-Daniel Hailfinger <c-d.hailfinger.devel.2006 at gmx.net>
Tested-by: Joseph C. Lehner <joseph.c.lehner at gmail.com>
Acked-by: Urja Rannikko <urjaman at gmail.com>

Modified:
   trunk/atapromise.c

Modified: trunk/atapromise.c
==============================================================================
--- trunk/atapromise.c	Thu Feb 18 22:42:49 2016	(r1929)
+++ trunk/atapromise.c	Fri Feb 19 00:11:52 2016	(r1930)
@@ -79,38 +79,35 @@
 
 static void atapromise_limit_chip(struct flashchip *chip)
 {
-	static uint32_t last_model_id = 0;
 	unsigned int i, size;
-
-	if (chip->model_id == last_model_id)
-		return;
+	unsigned int usable_erasers = 0;
 
 	size = chip->total_size * 1024;
-	if (size > rom_size) {
-		/* Undefine all block_erasers that don't operate on the whole chip,
-		 * and adjust the eraseblock size of the one that does.
-		 */
-		for (i = 0; i < NUM_ERASEFUNCTIONS; ++i) {
-			if (chip->block_erasers[i].eraseblocks[0].size != size) {
-				chip->block_erasers[i].eraseblocks[0].count = 0;
-				chip->block_erasers[i].block_erase = NULL;
-			} else {
-				chip->block_erasers[i].eraseblocks[0].size = rom_size;
-				break;
-			}
-		}
 
-		if (i != NUM_ERASEFUNCTIONS) {
-			chip->total_size = rom_size / 1024;
-			if (chip->page_size > rom_size)
-				chip->page_size = rom_size;
+	/* Chip is small enough or already limited. */
+	if (size <= rom_size)
+		return;
+
+	/* Undefine all block_erasers that don't operate on the whole chip,
+	 * and adjust the eraseblock size of those which do.
+	 */
+	for (i = 0; i < NUM_ERASEFUNCTIONS; ++i) {
+		if (chip->block_erasers[i].eraseblocks[0].size != size) {
+			chip->block_erasers[i].eraseblocks[0].count = 0;
+			chip->block_erasers[i].block_erase = NULL;
 		} else {
-			msg_pdbg("Failed to adjust size of chip \"%s\" (%d kB).\n", chip->name,
-				 chip->total_size);
+			chip->block_erasers[i].eraseblocks[0].size = rom_size;
+			usable_erasers++;
 		}
 	}
 
-	last_model_id = chip->model_id;
+	if (usable_erasers) {
+		chip->total_size = rom_size / 1024;
+		if (chip->page_size > rom_size)
+			chip->page_size = rom_size;
+	} else {
+		msg_pdbg("Failed to adjust size of chip \"%s\" (%d kB).\n", chip->name, chip->total_size);
+	}
 }
 
 int atapromise_init(void)




More information about the flashrom mailing list