|
|
|
@ -152,8 +152,10 @@ static const char *spi_flash_update_block(struct spi_flash *flash, u32 offset, |
|
|
|
|
{ |
|
|
|
|
debug("offset=%#x, sector_size=%#x, len=%#zx\n", |
|
|
|
|
offset, flash->sector_size, len); |
|
|
|
|
if (spi_flash_read(flash, offset, len, cmp_buf)) |
|
|
|
|
/* Read the entire sector so to allow for rewriting */ |
|
|
|
|
if (spi_flash_read(flash, offset, flash->sector_size, cmp_buf)) |
|
|
|
|
return "read"; |
|
|
|
|
/* Compare only what is meaningful (len) */ |
|
|
|
|
if (memcmp(cmp_buf, buf, len) == 0) { |
|
|
|
|
debug("Skip region %x size %zx: no change\n", |
|
|
|
|
offset, len); |
|
|
|
@ -163,8 +165,17 @@ static const char *spi_flash_update_block(struct spi_flash *flash, u32 offset, |
|
|
|
|
/* Erase the entire sector */ |
|
|
|
|
if (spi_flash_erase(flash, offset, flash->sector_size)) |
|
|
|
|
return "erase"; |
|
|
|
|
/* Write the initial part of the block from the source */ |
|
|
|
|
if (spi_flash_write(flash, offset, len, buf)) |
|
|
|
|
return "write"; |
|
|
|
|
/* If it's a partial sector, rewrite the existing part */ |
|
|
|
|
if (len != flash->sector_size) { |
|
|
|
|
/* Rewrite the original data to the end of the sector */ |
|
|
|
|
if (spi_flash_write(flash, offset + len, |
|
|
|
|
flash->sector_size - len, &cmp_buf[len])) |
|
|
|
|
return "write"; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return NULL; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|