diff options
-rw-r--r-- | external/pflash/pflash.c | 16 | ||||
-rw-r--r-- | libflash/libflash.c | 4 | ||||
-rw-r--r-- | libflash/libflash.h | 4 |
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; |