dfu: dfu_sf: Fix read offset
[oweals/u-boot.git] / drivers / dfu / dfu_sf.c
index 91f6df220b1dd7f11aabdaddb28fa7e3db32b44e..b6d5fe24dc82e56620460185c875243bb0c8ef63 100644 (file)
@@ -9,6 +9,7 @@
 #include <errno.h>
 #include <div64.h>
 #include <dfu.h>
+#include <spi.h>
 #include <spi_flash.h>
 
 static long dfu_get_medium_size_sf(struct dfu_entity *dfu)
@@ -19,7 +20,14 @@ static long dfu_get_medium_size_sf(struct dfu_entity *dfu)
 static int dfu_read_medium_sf(struct dfu_entity *dfu, u64 offset, void *buf,
                long *len)
 {
-       return spi_flash_read(dfu->data.sf.dev, offset, *len, buf);
+       return spi_flash_read(dfu->data.sf.dev, dfu->data.sf.start + offset,
+               *len, buf);
+}
+
+static u64 find_sector(struct dfu_entity *dfu, u64 start, u64 offset)
+{
+       return (lldiv((start + offset), dfu->data.sf.dev->sector_size)) *
+               dfu->data.sf.dev->sector_size;
 }
 
 static int dfu_write_medium_sf(struct dfu_entity *dfu,
@@ -27,11 +35,14 @@ static int dfu_write_medium_sf(struct dfu_entity *dfu,
 {
        int ret;
 
-       ret = spi_flash_erase(dfu->data.sf.dev, offset, *len);
+       ret = spi_flash_erase(dfu->data.sf.dev,
+                             find_sector(dfu, dfu->data.sf.start, offset),
+                             dfu->data.sf.dev->sector_size);
        if (ret)
                return ret;
 
-       ret = spi_flash_write(dfu->data.sf.dev, offset, *len, buf);
+       ret = spi_flash_write(dfu->data.sf.dev, dfu->data.sf.start + offset,
+                             *len, buf);
        if (ret)
                return ret;
 
@@ -105,8 +116,10 @@ static struct spi_flash *parse_dev(char *devstr)
 int dfu_fill_entity_sf(struct dfu_entity *dfu, char *devstr, char *s)
 {
        char *st;
+       char *devstr_bkup = strdup(devstr);
 
-       dfu->data.sf.dev = parse_dev(devstr);
+       dfu->data.sf.dev = parse_dev(devstr_bkup);
+       free(devstr_bkup);
        if (!dfu->data.sf.dev)
                return -ENODEV;