size_t len, const char *buf, char *cmp_buf, size_t *skipped)
{
char *ptr = (char *)buf;
+ u32 start_offset = offset % flash->sector_size;
+ u32 read_offset = offset - start_offset;
- debug("offset=%#x, sector_size=%#x, len=%#zx\n",
- offset, flash->sector_size, len);
+ debug("offset=%#x+%#x, sector_size=%#x, len=%#zx\n",
+ read_offset, start_offset, flash->sector_size, len);
/* Read the entire sector so to allow for rewriting */
- if (spi_flash_read(flash, offset, flash->sector_size, cmp_buf))
+ if (spi_flash_read(flash, read_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);
+ if (memcmp(cmp_buf + start_offset, buf, len) == 0) {
+ debug("Skip region %x+%x size %zx: no change\n",
+ start_offset, read_offset, len);
*skipped += len;
return NULL;
}
return "erase";
/* If it's a partial sector, copy the data into the temp-buffer */
if (len != flash->sector_size) {
- memcpy(cmp_buf, buf, len);
+ memcpy(cmp_buf + start_offset, buf, len);
ptr = cmp_buf;
}
/* Write one complete sector */
for (; buf < end && !err_oper; buf += todo, offset += todo) {
todo = min_t(size_t, end - buf, flash->sector_size);
+ todo = min_t(size_t, end - buf,
+ flash->sector_size - (offset % flash->sector_size));
if (get_timer(last_update) > 100) {
printf(" \rUpdating, %zu%% %lu B/s",
100 - (end - buf) / scale,