Split erase region walking out of erase_flash.
That allows us to use erase region walking for a combined erase/write
action, and is a prerequisite for partial flashing.

Signed-off-by: Carl-Daniel Hailfinger <c-d.hailfinger.devel.2...@gmx.net>

Index: flashrom-walk_eraseregions/flashrom.c
===================================================================
--- flashrom-walk_eraseregions/flashrom.c       (Revision 1072)
+++ flashrom-walk_eraseregions/flashrom.c       (Arbeitskopie)
@@ -1164,14 +1164,36 @@
        return ret;
 }
 
-int erase_flash(struct flashchip *flash)
+static int walk_eraseregions(struct flashchip *flash, int erasefunction, int 
(*do_something) (struct flashchip *flash, unsigned int addr, unsigned int len))
 {
-       int i, j, k, ret = 0, found = 0;
+       int i, j;
+       unsigned int done = 0;
        unsigned int start, len;
+       struct block_eraser eraser = flash->block_erasers[erasefunction];
+       for (i = 0; i < NUM_ERASEREGIONS; i++) {
+               /* count==0 for all automatically initialized array
+                * members so the loop below won't be executed for them.
+                */
+               for (j = 0; j < eraser.eraseblocks[i].count; j++) {
+                       start = done + eraser.eraseblocks[i].size * j;
+                       len = eraser.eraseblocks[i].size;
+                       msg_cdbg("0x%06x-0x%06x, ", start,
+                                    start + len - 1);
+                       if (do_something(flash, start, len))
+                               return 1;
+               }
+               done += eraser.eraseblocks[i].count *
+                       eraser.eraseblocks[i].size;
+       }
+       return 0;
+}
 
+int erase_flash(struct flashchip *flash)
+{
+       int k, ret = 0, found = 0;
+
        msg_cinfo("Erasing flash chip... ");
        for (k = 0; k < NUM_ERASEFUNCTIONS; k++) {
-               unsigned int done = 0;
                struct block_eraser eraser = flash->block_erasers[k];
 
                msg_cdbg("Looking at blockwise erase function %i... ", k);
@@ -1194,24 +1216,7 @@
                }
                found = 1;
                msg_cdbg("trying... ");
-               for (i = 0; i < NUM_ERASEREGIONS; i++) {
-                       /* count==0 for all automatically initialized array
-                        * members so the loop below won't be executed for them.
-                        */
-                       for (j = 0; j < eraser.eraseblocks[i].count; j++) {
-                               start = done + eraser.eraseblocks[i].size * j;
-                               len = eraser.eraseblocks[i].size;
-                               msg_cdbg("0x%06x-0x%06x, ", start,
-                                            start + len - 1);
-                               ret = eraser.block_erase(flash, start, len);
-                               if (ret)
-                                       break;
-                       }
-                       if (ret)
-                               break;
-                       done += eraser.eraseblocks[i].count *
-                               eraser.eraseblocks[i].size;
-               }
+               ret = walk_eraseregions(flash, k, eraser.block_erase);
                msg_cdbg("\n");
                /* If everything is OK, don't try another erase function. */
                if (!ret)


-- 
http://www.hailfinger.org/


_______________________________________________
flashrom mailing list
flashrom@flashrom.org
http://www.flashrom.org/mailman/listinfo/flashrom

Reply via email to