aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--external/pflash/pflash.c16
-rw-r--r--libflash/libflash.c4
-rw-r--r--libflash/libflash.h4
3 files changed, 14 insertions, 10 deletions
diff --git a/external/pflash/pflash.c b/external/pflash/pflash.c
index d6b2b8e..381df24 100644
--- a/external/pflash/pflash.c
+++ b/external/pflash/pflash.c
@@ -325,16 +325,20 @@ static int erase_range(struct flash_details *flash,
*/
progress_init(size);
if (start & erase_mask) {
- /* Align to next erase block */
- rc = blocklevel_smart_erase(flash->bl, start,
- flash->erase_granule - (start & erase_mask));
+ /*
+ * Align to next erase block, or just do the entire
+ * thing if we fit within one erase block
+ */
+ uint32_t first_size = MIN(size, (flash->erase_granule - (start & erase_mask)));
+
+ rc = blocklevel_smart_erase(flash->bl, start, first_size);
if (rc) {
fprintf(stderr, "Failed to blocklevel_smart_erase(): %d\n", rc);
return 1;
}
- size -= flash->erase_granule - (start & erase_mask);
- done = flash->erase_granule - (start & erase_mask);
- start += flash->erase_granule - (start & erase_mask);
+ size -= first_size;
+ done = first_size;
+ start += first_size;
}
progress_tick(done);
while (size & ~(erase_mask)) {
diff --git a/libflash/libflash.c b/libflash/libflash.c
index bf2e58e..ad25b61 100644
--- a/libflash/libflash.c
+++ b/libflash/libflash.c
@@ -23,10 +23,6 @@
#include "ecc.h"
#include "blocklevel.h"
-#ifndef MIN
-#define MIN(a, b) ((a) < (b) ? (a) : (b))
-#endif
-
static const struct flash_info flash_info[] = {
{ 0xc22018, 0x01000000, FL_ERASE_ALL | FL_CAN_4B, "Macronix MXxxL12835F"},
{ 0xc22019, 0x02000000, FL_ERASE_ALL | FL_CAN_4B, "Macronix MXxxL25635F"},
diff --git a/libflash/libflash.h b/libflash/libflash.h
index ff3a982..01b4d60 100644
--- a/libflash/libflash.h
+++ b/libflash/libflash.h
@@ -28,6 +28,10 @@
*/
#include <libflash/errors.h>
+#ifndef MIN
+#define MIN(a, b) ((a) < (b) ? (a) : (b))
+#endif
+
/* Flash chip, opaque */
struct flash_chip;
struct spi_flash_ctrl;