Commit 4de512018ba7d57f1672be21c7459281f7c97514

Authored by Patrick Delaunay
Committed by Marek Vasut
1 parent bab0146ea9

dfu: allow dfu read on partition greater than 2GB

solve issue on get_medium_size() function
the detection of error is a simple test < 0
but for ARM platform, long is 32bits and 2GB = 0x80000000
is seen as error.

I solve the issue by changing the prototype fo the function
to separate size and result.
This patch prepare the next patch with size change to u64.

Signed-off-by: Patrick Delaunay <patrick.delaunay@st.com>

Showing 6 changed files with 22 additions and 16 deletions Side-by-side Diff

... ... @@ -339,9 +339,9 @@
339 339 if (dfu->i_buf_start == NULL)
340 340 return -ENOMEM;
341 341  
342   - dfu->r_left = dfu->get_medium_size(dfu);
343   - if (dfu->r_left < 0)
344   - return dfu->r_left;
  342 + ret = dfu->get_medium_size(dfu, &dfu->r_left);
  343 + if (ret < 0)
  344 + return ret;
345 345  
346 346 debug("%s: %s %ld [B]\n", __func__, dfu->name, dfu->r_left);
347 347  
drivers/dfu/dfu_mmc.c
... ... @@ -209,23 +209,23 @@
209 209 return ret;
210 210 }
211 211  
212   -long dfu_get_medium_size_mmc(struct dfu_entity *dfu)
  212 +int dfu_get_medium_size_mmc(struct dfu_entity *dfu, long *size)
213 213 {
214 214 int ret;
215   - long len;
216 215  
217 216 switch (dfu->layout) {
218 217 case DFU_RAW_ADDR:
219   - return dfu->data.mmc.lba_size * dfu->data.mmc.lba_blk_size;
  218 + *size = dfu->data.mmc.lba_size * dfu->data.mmc.lba_blk_size;
  219 + return 0;
220 220 case DFU_FS_FAT:
221 221 case DFU_FS_EXT4:
222 222 dfu_file_buf_filled = -1;
223   - ret = mmc_file_op(DFU_OP_SIZE, dfu, NULL, &len);
  223 + ret = mmc_file_op(DFU_OP_SIZE, dfu, NULL, size);
224 224 if (ret < 0)
225 225 return ret;
226   - if (len > CONFIG_SYS_DFU_MAX_FILE_SIZE)
  226 + if (*size > CONFIG_SYS_DFU_MAX_FILE_SIZE)
227 227 return -1;
228   - return len;
  228 + return 0;
229 229 default:
230 230 printf("%s: Layout (%s) not (yet) supported!\n", __func__,
231 231 dfu_get_layout(dfu->layout));
drivers/dfu/dfu_nand.c
... ... @@ -114,9 +114,11 @@
114 114 return ret;
115 115 }
116 116  
117   -long dfu_get_medium_size_nand(struct dfu_entity *dfu)
  117 +int dfu_get_medium_size_nand(struct dfu_entity *dfu, long *size)
118 118 {
119   - return dfu->data.nand.size;
  119 + *size = dfu->data.nand.size;
  120 +
  121 + return 0;
120 122 }
121 123  
122 124 static int dfu_read_medium_nand(struct dfu_entity *dfu, u64 offset, void *buf,
drivers/dfu/dfu_ram.c
... ... @@ -41,9 +41,11 @@
41 41 return dfu_transfer_medium_ram(DFU_OP_WRITE, dfu, offset, buf, len);
42 42 }
43 43  
44   -long dfu_get_medium_size_ram(struct dfu_entity *dfu)
  44 +int dfu_get_medium_size_ram(struct dfu_entity *dfu, long *size)
45 45 {
46   - return dfu->data.ram.size;
  46 + *size = dfu->data.ram.size;
  47 +
  48 + return 0;
47 49 }
48 50  
49 51 static int dfu_read_medium_ram(struct dfu_entity *dfu, u64 offset,
drivers/dfu/dfu_sf.c
... ... @@ -12,9 +12,11 @@
12 12 #include <spi.h>
13 13 #include <spi_flash.h>
14 14  
15   -static long dfu_get_medium_size_sf(struct dfu_entity *dfu)
  15 +static int dfu_get_medium_size_sf(struct dfu_entity *dfu, long *size)
16 16 {
17   - return dfu->data.sf.size;
  17 + *size = dfu->data.sf.size;
  18 +
  19 + return 0;
18 20 }
19 21  
20 22 static int dfu_read_medium_sf(struct dfu_entity *dfu, u64 offset, void *buf,
... ... @@ -110,7 +110,7 @@
110 110 struct sf_internal_data sf;
111 111 } data;
112 112  
113   - long (*get_medium_size)(struct dfu_entity *dfu);
  113 + int (*get_medium_size)(struct dfu_entity *dfu, long *size);
114 114  
115 115 int (*read_medium)(struct dfu_entity *dfu,
116 116 u64 offset, void *buf, long *len);