Skip to contentSkip to conversation

dfu: allow get_medium_size() to return bigger medium sizes than 2GiB

RFC PATCH New Heiko Schocher 3 participants 7 messages Jan 28, 2016 – Jan 29, 2016

lore
Share & tools
lore
#0 lore raw

RFC PATCH 1/1 dfu: allow get_medium_size() to return bigger medium sizes than 2GiB

change the get_medium_size() function from
- long (*get_medium_size)(struct dfu_entity *dfu);
+ int (*get_medium_size)(struct dfu_entity *dfu, u64 *size);

so it can return bigger medium sizes than 2GiB, and the return value is seperate from the size.

---
I just have a DDP nand with a size of 4GiB, and the mtd partition layout is:
device nand2 <omap2-nand.0>, # parts = 9

 #: name                size            offset          mask_flags
 0: spl                 0x00080000      0x00000000      0
 1: spl.backup1         0x00080000      0x00080000      0
 2: spl.backup2         0x00080000      0x00100000      0
 3: spl.backup3         0x00080000      0x00180000      0
 4: u-boot              0x00780000      0x00200000      0
 5: u-boot.env0         0x00200000      0x00980000      0
 6: u-boot.env1         0x00200000      0x00b80000      0
 7: mtdoops             0x00200000      0x00d80000      0
 8: rootfs              0xff080000      0x00f80000      0

so the last partition is to big for returning the size in a long.

 drivers/dfu/dfu.c      | 8 ++++----
 drivers/dfu/dfu_mmc.c  | 8 +++++---
 drivers/dfu/dfu_nand.c | 5 +++--
 drivers/dfu/dfu_ram.c  | 5 +++--
 drivers/dfu/dfu_sf.c   | 5 +++--
 include/dfu.h          | 4 ++--
 6 files changed, 20 insertions(+), 15 deletions(-)
drivers/dfu/dfu.c +4 -4
index 8f5915e..daa2eb9 100644
@@ -335,11 +335,11 @@ int dfu_read(struct dfu_entity *dfu, void *buf, int size, int blk_seq_num)
 		if (dfu->i_buf_start == NULL)
 			return -ENOMEM;
 
-		dfu->r_left = dfu->get_medium_size(dfu);
-		if (dfu->r_left < 0)
-			return dfu->r_left;
+		ret = dfu->get_medium_size(dfu, &dfu->r_left);
+		if (ret < 0)
+			return ret;
 
-		debug("%s: %s %ld [B]\n", __func__, dfu->name, dfu->r_left);
+		debug("%s: %s %lld [B]\n", __func__, dfu->name, dfu->r_left);
 
 		dfu->i_blk_seq_num = 0;
 		dfu->crc = 0;
drivers/dfu/dfu_mmc.c +5 -3
index 395d472..5c1c1d1 100644
@@ -205,14 +205,15 @@ int dfu_flush_medium_mmc(struct dfu_entity *dfu)
 	return ret;
 }
 
-long dfu_get_medium_size_mmc(struct dfu_entity *dfu)
+int dfu_get_medium_size_mmc(struct dfu_entity *dfu, u64 *size)
 {
 	int ret;
 	long len;
 
 	switch (dfu->layout) {
 	case DFU_RAW_ADDR:
-		return dfu->data.mmc.lba_size * dfu->data.mmc.lba_blk_size;
+		*size = dfu->data.mmc.lba_size * dfu->data.mmc.lba_blk_size;
+		return 0;
 	case DFU_FS_FAT:
 	case DFU_FS_EXT4:
 		dfu_file_buf_filled = -1;
@@ -221,7 +222,8 @@ long dfu_get_medium_size_mmc(struct dfu_entity *dfu)
 			return ret;
 		if (len > CONFIG_SYS_DFU_MAX_FILE_SIZE)
 			return -1;
-		return len;
+		*size = len;
+		return 0;
 	default:
 		printf("%s: Layout (%s) not (yet) supported!\n", __func__,
 		       dfu_get_layout(dfu->layout));
drivers/dfu/dfu_nand.c +3 -2
index a975492..4612e09 100644
@@ -114,9 +114,10 @@ static int dfu_write_medium_nand(struct dfu_entity *dfu,
 	return ret;
 }
 
-long dfu_get_medium_size_nand(struct dfu_entity *dfu)
+int dfu_get_medium_size_nand(struct dfu_entity *dfu, u64 *size)
 {
-	return dfu->data.nand.size;
+	*size = dfu->data.nand.size;
+	return 0;
 }
 
 static int dfu_read_medium_nand(struct dfu_entity *dfu, u64 offset, void *buf,
drivers/dfu/dfu_ram.c +3 -2
index e094a94..466759d 100644
@@ -41,9 +41,10 @@ static int dfu_write_medium_ram(struct dfu_entity *dfu, u64 offset,
 	return dfu_transfer_medium_ram(DFU_OP_WRITE, dfu, offset, buf, len);
 }
 
-long dfu_get_medium_size_ram(struct dfu_entity *dfu)
+int dfu_get_medium_size_ram(struct dfu_entity *dfu, u64 *size)
 {
-	return dfu->data.ram.size;
+	*size = dfu->data.ram.size;
+	return 0;
 }
 
 static int dfu_read_medium_ram(struct dfu_entity *dfu, u64 offset,
drivers/dfu/dfu_sf.c +3 -2
index 9702eee..35c5fa1 100644
@@ -12,9 +12,10 @@
 #include <spi.h>
 #include <spi_flash.h>
 
-static long dfu_get_medium_size_sf(struct dfu_entity *dfu)
+int dfu_get_medium_size_sf(struct dfu_entity *dfu, u64 *size)
 {
-	return dfu->data.sf.size;
+	*size = dfu->data.sf.size;
+	return 0;
 }
 
 static int dfu_read_medium_sf(struct dfu_entity *dfu, u64 offset, void *buf,
include/dfu.h +2 -2
index 6118dc2..323b032 100644
@@ -110,7 +110,7 @@ struct dfu_entity {
 		struct sf_internal_data sf;
 	} data;
 
-	long (*get_medium_size)(struct dfu_entity *dfu);
+	int (*get_medium_size)(struct dfu_entity *dfu, u64 *size);
 
 	int (*read_medium)(struct dfu_entity *dfu,
 			u64 offset, void *buf, long *len);
@@ -132,7 +132,7 @@ struct dfu_entity {
 	u8 *i_buf;
 	u8 *i_buf_start;
 	u8 *i_buf_end;
-	long r_left;
+	u64 r_left;
 	long b_left;
 
 	u32 bad_skip;	/* for nand use */
Signature · 1 line
2.5.0
#1 lore raw

RFC PATCH 1/1 dfu: allow get_medium_size() to return bigger medium sizes than 2GiB

Hi Heiko,

Quoted 60 lines

change the get_medium_size() function from

include/dfu.h +1 -1
-       long (*get_medium_size)(struct dfu_entity *dfu);
+       int (*get_medium_size)(struct dfu_entity *dfu, u64 *size);

so it can return bigger medium sizes than 2GiB, and the return value is seperate from the size.

---
I just have a DDP nand with a size of 4GiB, and the mtd partition layout is:
device nand2 <omap2-nand.0>, # parts = 9

 #: name                size            offset          mask_flags
 0: spl                 0x00080000      0x00000000      0
 1: spl.backup1         0x00080000      0x00080000      0
 2: spl.backup2         0x00080000      0x00100000      0
 3: spl.backup3         0x00080000      0x00180000      0
 4: u-boot              0x00780000      0x00200000      0
 5: u-boot.env0         0x00200000      0x00980000      0
 6: u-boot.env1         0x00200000      0x00b80000      0
 7: mtdoops             0x00200000      0x00d80000      0
 8: rootfs              0xff080000      0x00f80000      0

so the last partition is to big for returning the size in a long.

 drivers/dfu/dfu.c      | 8 ++++----
 drivers/dfu/dfu_mmc.c  | 8 +++++---
 drivers/dfu/dfu_nand.c | 5 +++--
 drivers/dfu/dfu_ram.c  | 5 +++--
 drivers/dfu/dfu_sf.c   | 5 +++--
 include/dfu.h          | 4 ++--
 6 files changed, 20 insertions(+), 15 deletions(-)
drivers/dfu/dfu.c +4 -4
index 8f5915e..daa2eb9 100644
@@ -335,11 +335,11 @@ int dfu_read(struct dfu_entity *dfu, void *buf,
 int size, int blk_seq_num) if (dfu->i_buf_start == NULL)
 			return -ENOMEM;
 
-		dfu->r_left = dfu->get_medium_size(dfu);
-		if (dfu->r_left < 0)
-			return dfu->r_left;
+		ret = dfu->get_medium_size(dfu, &dfu->r_left);
+		if (ret < 0)
+			return ret;
 
-		debug("%s: %s %ld [B]\n", __func__, dfu->name,
 dfu->r_left);
+		debug("%s: %s %lld [B]\n", __func__, dfu->name,
 dfu->r_left); 
 		dfu->i_blk_seq_num = 0;
drivers/dfu/dfu.c +0 -0
 		dfu->crc = 0;
drivers/dfu/dfu_mmc.c +0 -0
index 395d472..5c1c1d1 100644

drivers/dfu/dfu_mmc.c int dfu_flush_medium_mmc(struct dfu_entity *dfu) · line 208

Quoted 5 lines
drivers/dfu/dfu_mmc.c +1 -1
@@ -205,14 +205,15 @@ int dfu_flush_medium_mmc(struct dfu_entity *dfu)
 	return ret;
 }
 
-long dfu_get_medium_size_mmc(struct dfu_entity *dfu)
+int dfu_get_medium_size_mmc(struct dfu_entity *dfu, u64 *size)

The idea to use the return value to get error code and separate pointer for passing the size is the way to go in my opinion.

The problem is in details. Please find my comments below.

Quoted 63 lines
drivers/dfu/dfu_mmc.c +2 -1
 {
 	int ret;
 	long len;
 
 	switch (dfu->layout) {
 	case DFU_RAW_ADDR:
-		return dfu->data.mmc.lba_size *
 dfu->data.mmc.lba_blk_size;
+		*size = dfu->data.mmc.lba_size *
 dfu->data.mmc.lba_blk_size;
+		return 0;
 	case DFU_FS_FAT:
drivers/dfu/dfu_mmc.c +2 -1
 	case DFU_FS_EXT4:
 		dfu_file_buf_filled = -1;
@@ -221,7 +222,8 @@ long dfu_get_medium_size_mmc(struct dfu_entity
 *dfu) return ret;
 		if (len > CONFIG_SYS_DFU_MAX_FILE_SIZE)
 			return -1;
-		return len;
+		*size = len;
+		return 0;
 	default:
 		printf("%s: Layout (%s) not (yet) supported!\n",
 __func__, dfu_get_layout(dfu->layout));
drivers/dfu/dfu_nand.c +3 -2
index a975492..4612e09 100644
@@ -114,9 +114,10 @@ static int dfu_write_medium_nand(struct
 dfu_entity *dfu, return ret;
 }
 
-long dfu_get_medium_size_nand(struct dfu_entity *dfu)
+int dfu_get_medium_size_nand(struct dfu_entity *dfu, u64 *size)
 {
-	return dfu->data.nand.size;
+	*size = dfu->data.nand.size;
+	return 0;
 }
 
 static int dfu_read_medium_nand(struct dfu_entity *dfu, u64 offset,

void *buf, diff --git a/drivers/dfu/dfu_ram.c b/drivers/dfu/dfu_ram.c index e094a94..466759d 100644

drivers/dfu/dfu_ram.c +3 -2
@@ -41,9 +41,10 @@ static int dfu_write_medium_ram(struct dfu_entity
 *dfu, u64 offset, return dfu_transfer_medium_ram(DFU_OP_WRITE, dfu,
 offset, buf, len); }
 
-long dfu_get_medium_size_ram(struct dfu_entity *dfu)
+int dfu_get_medium_size_ram(struct dfu_entity *dfu, u64 *size)
 {
-	return dfu->data.ram.size;
+	*size = dfu->data.ram.size;
+	return 0;
 }
 
 static int dfu_read_medium_ram(struct dfu_entity *dfu, u64 offset,
drivers/dfu/dfu_sf.c +0 -0
index 9702eee..35c5fa1 100644

drivers/dfu/dfu_sf.c line 15

Quoted 5 lines
drivers/dfu/dfu_sf.c +1 -1
@@ -12,9 +12,10 @@
 #include <spi.h>
 #include <spi_flash.h>
 
-static long dfu_get_medium_size_sf(struct dfu_entity *dfu)
+int dfu_get_medium_size_sf(struct dfu_entity *dfu, u64 *size)

Originally the dfu_get_medium_size returns int. It is not suitable for sizes > 2GiB.

I don't like the u64 for *size, since we use that size to perform some arithmetic operation and comparison (>) in the dfu.c file. I would prefer to have long long here.

Quoted 21 lines
drivers/dfu/dfu_sf.c +2 -1
 {
-	return dfu->data.sf.size;
+	*size = dfu->data.sf.size;
+	return 0;
 }
 
 static int dfu_read_medium_sf(struct dfu_entity *dfu, u64 offset,

void *buf, diff --git a/include/dfu.h b/include/dfu.h index 6118dc2..323b032 100644

include/dfu.h +1 -1
@@ -110,7 +110,7 @@ struct dfu_entity {
 		struct sf_internal_data sf;
 	} data;
 
-	long (*get_medium_size)(struct dfu_entity *dfu);
+	int (*get_medium_size)(struct dfu_entity *dfu, u64 *size);
 
 	int (*read_medium)(struct dfu_entity *dfu,
 			u64 offset, void *buf, long *len);

include/dfu.h struct dfu_entity { · line 135

Quoted 5 lines
include/dfu.h +1 -1
@@ -132,7 +132,7 @@ struct dfu_entity {
 	u8 *i_buf;
 	u8 *i_buf_start;
 	u8 *i_buf_end;
-	long r_left;
+	u64 r_left;

This patch changes r_left to be unsigned, but leaves b_left as signed (long).

I think that both b_left and r_left should be promoted to long long.

Quoted 3 lines
include/dfu.h +0 -0
 	long b_left;
 
 	u32 bad_skip;	/* for nand use */
Signature · 5 lines
Best regards,

Lukasz Majewski

Samsung R&D Institute Poland (SRPOL) | Linux Platform Group
#2 lore raw

RFC PATCH 1/1 dfu: allow get_medium_size() to return bigger medium sizes than 2GiB

Hello Lukasz,

Am 28.01.2016 um 15:56 schrieb Lukasz Majewski:

Quoted 65 lines

Hi Heiko,

Quoted 63 lines

change the get_medium_size() function from

include/dfu.h +1 -1
-       long (*get_medium_size)(struct dfu_entity *dfu);
+       int (*get_medium_size)(struct dfu_entity *dfu, u64 *size);

so it can return bigger medium sizes than 2GiB, and the return value is seperate from the size.

---
I just have a DDP nand with a size of 4GiB, and the mtd partition layout is:
device nand2 <omap2-nand.0>, # parts = 9

  #: name                size            offset          mask_flags
  0: spl                 0x00080000      0x00000000      0
  1: spl.backup1         0x00080000      0x00080000      0
  2: spl.backup2         0x00080000      0x00100000      0
  3: spl.backup3         0x00080000      0x00180000      0
  4: u-boot              0x00780000      0x00200000      0
  5: u-boot.env0         0x00200000      0x00980000      0
  6: u-boot.env1         0x00200000      0x00b80000      0
  7: mtdoops             0x00200000      0x00d80000      0
  8: rootfs              0xff080000      0x00f80000      0

so the last partition is to big for returning the size in a long.

  drivers/dfu/dfu.c      | 8 ++++----
  drivers/dfu/dfu_mmc.c  | 8 +++++---
  drivers/dfu/dfu_nand.c | 5 +++--
  drivers/dfu/dfu_ram.c  | 5 +++--
  drivers/dfu/dfu_sf.c   | 5 +++--
  include/dfu.h          | 4 ++--
  6 files changed, 20 insertions(+), 15 deletions(-)
drivers/dfu/dfu.c +4 -4
index 8f5915e..daa2eb9 100644
@@ -335,11 +335,11 @@ int dfu_read(struct dfu_entity *dfu, void *buf,
 int size, int blk_seq_num) if (dfu->i_buf_start == NULL)
  			return -ENOMEM;
 
-		dfu->r_left = dfu->get_medium_size(dfu);
-		if (dfu->r_left < 0)
-			return dfu->r_left;
+		ret = dfu->get_medium_size(dfu, &dfu->r_left);
+		if (ret < 0)
+			return ret;
 
-		debug("%s: %s %ld [B]\n", __func__, dfu->name,
 dfu->r_left);
+		debug("%s: %s %lld [B]\n", __func__, dfu->name,
 dfu->r_left);
  		dfu->i_blk_seq_num = 0;
  		dfu->crc = 0;
drivers/dfu/dfu_mmc.c +0 -0
index 395d472..5c1c1d1 100644
@@ -205,14 +205,15 @@ int dfu_flush_medium_mmc(struct dfu_entity *dfu)
  	return ret;
  }
 
Quoted 5 lines

drivers/dfu/dfu_mmc.c int dfu_flush_medium_mmc(struct dfu_entity *dfu) · line 208

Quoted 2 lines
drivers/dfu/dfu_mmc.c +1 -1
-long dfu_get_medium_size_mmc(struct dfu_entity *dfu)
+int dfu_get_medium_size_mmc(struct dfu_entity *dfu, u64 *size)

The idea to use the return value to get error code and separate pointer for passing the size is the way to go in my opinion.

Thats, why I posted it as an RFC, I was unsure too...

Quoted 74 lines

The problem is in details. Please find my comments below.

Quoted 63 lines
drivers/dfu/dfu_mmc.c +2 -1
  {
  	int ret;
  	long len;
 
  	switch (dfu->layout) {
  	case DFU_RAW_ADDR:
-		return dfu->data.mmc.lba_size *
 dfu->data.mmc.lba_blk_size;
+		*size = dfu->data.mmc.lba_size *
 dfu->data.mmc.lba_blk_size;
+		return 0;
  	case DFU_FS_FAT:
  	case DFU_FS_EXT4:
  		dfu_file_buf_filled = -1;
drivers/dfu/dfu_mmc.c +2 -1
@@ -221,7 +222,8 @@ long dfu_get_medium_size_mmc(struct dfu_entity
 *dfu) return ret;
  		if (len > CONFIG_SYS_DFU_MAX_FILE_SIZE)
  			return -1;
-		return len;
+		*size = len;
+		return 0;
  	default:
  		printf("%s: Layout (%s) not (yet) supported!\n",
 __func__, dfu_get_layout(dfu->layout));
drivers/dfu/dfu_nand.c +3 -2
index a975492..4612e09 100644
@@ -114,9 +114,10 @@ static int dfu_write_medium_nand(struct
 dfu_entity *dfu, return ret;
  }
 
-long dfu_get_medium_size_nand(struct dfu_entity *dfu)
+int dfu_get_medium_size_nand(struct dfu_entity *dfu, u64 *size)
  {
-	return dfu->data.nand.size;
+	*size = dfu->data.nand.size;
+	return 0;
  }
 
  static int dfu_read_medium_nand(struct dfu_entity *dfu, u64 offset,

void *buf, diff --git a/drivers/dfu/dfu_ram.c b/drivers/dfu/dfu_ram.c index e094a94..466759d 100644

drivers/dfu/dfu_ram.c +3 -2
@@ -41,9 +41,10 @@ static int dfu_write_medium_ram(struct dfu_entity
 *dfu, u64 offset, return dfu_transfer_medium_ram(DFU_OP_WRITE, dfu,
 offset, buf, len); }
 
-long dfu_get_medium_size_ram(struct dfu_entity *dfu)
+int dfu_get_medium_size_ram(struct dfu_entity *dfu, u64 *size)
  {
-	return dfu->data.ram.size;
+	*size = dfu->data.ram.size;
+	return 0;
  }
 
  static int dfu_read_medium_ram(struct dfu_entity *dfu, u64 offset,
drivers/dfu/dfu_sf.c +0 -0
index 9702eee..35c5fa1 100644

drivers/dfu/dfu_sf.c line 15

Quoted 5 lines
drivers/dfu/dfu_sf.c +1 -1
@@ -12,9 +12,10 @@
  #include <spi.h>
  #include <spi_flash.h>
 
-static long dfu_get_medium_size_sf(struct dfu_entity *dfu)
+int dfu_get_medium_size_sf(struct dfu_entity *dfu, u64 *size)

Originally the dfu_get_medium_size returns int. It is not suitable for sizes > 2GiB.

Quoted 3 lines

I don't like the u64 for *size, since we use that size to perform some arithmetic operation and comparison (>) in the dfu.c file. I would prefer to have long long here.

Ok.

Quoted 30 lines
Quoted 21 lines
drivers/dfu/dfu_sf.c +2 -1
  {
-	return dfu->data.sf.size;
+	*size = dfu->data.sf.size;
+	return 0;
  }
 
  static int dfu_read_medium_sf(struct dfu_entity *dfu, u64 offset,

void *buf, diff --git a/include/dfu.h b/include/dfu.h index 6118dc2..323b032 100644

include/dfu.h +1 -1
@@ -110,7 +110,7 @@ struct dfu_entity {
  		struct sf_internal_data sf;
  	} data;
 
-	long (*get_medium_size)(struct dfu_entity *dfu);
+	int (*get_medium_size)(struct dfu_entity *dfu, u64 *size);
 
  	int (*read_medium)(struct dfu_entity *dfu,
  			u64 offset, void *buf, long *len);

include/dfu.h struct dfu_entity { · line 135

Quoted 5 lines
include/dfu.h +1 -1
@@ -132,7 +132,7 @@ struct dfu_entity {
  	u8 *i_buf;
  	u8 *i_buf_start;
  	u8 *i_buf_end;
-	long r_left;
+	u64 r_left;

This patch changes r_left to be unsigned, but leaves b_left as signed (long).

Quoted 1 line

I think that both b_left and r_left should be promoted to long long.

Ok, I change it to long long ... but, I have detected another problem:

drivers/dfu/dfu_nand.c:

static int nand_block_op(enum dfu_op op, struct dfu_entity *dfu,
u64 offset, void *buf, long *len)

{
         loff_t start, lim;
         size_t count, actual;
         int ret;
         nand_info_t *nand;

         /* if buf == NULL return total size of the area */
         if (buf == NULL) {
                 *len = dfu->data.nand.size;
                 return 0;
         }

returns also a long only. nand_block_op gets called in the end from

static int dfu_write_medium_nand(struct dfu_entity *dfu,
u64 offset, void *buf, long *len)

and

static int dfu_read_medium_nand(struct dfu_entity *dfu, u64 offset, void *buf,
long *len)
{

So I have to change also this functions ... Why returns the read/write operation the length of the complete area, if buf is NULL ? Is this a DFU feature?

bye,
Heiko

Quoted 7 lines
Quoted 4 lines
include/dfu.h +0 -0
  	long b_left;
 
  	u32 bad_skip;	/* for nand use */
Signature · 2 lines
DENX Software Engineering GmbH,      Managing Director: Wolfgang Denk
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
#3 lore raw

RFC PATCH 1/1 dfu: allow get_medium_size() to return bigger medium sizes than 2GiB

Hi Heiko,

Quoted 213 lines

Hello Lukasz,

Am 28.01.2016 um 15:56 schrieb Lukasz Majewski:

Quoted 65 lines

Hi Heiko,

Quoted 63 lines

change the get_medium_size() function from

include/dfu.h +1 -1
-       long (*get_medium_size)(struct dfu_entity *dfu);
+       int (*get_medium_size)(struct dfu_entity *dfu, u64 *size);

so it can return bigger medium sizes than 2GiB, and the return value is seperate from the size.

---
I just have a DDP nand with a size of 4GiB, and the mtd partition layout is:
device nand2 <omap2-nand.0>, # parts = 9

  #: name                size            offset          mask_flags
  0: spl                 0x00080000      0x00000000      0
  1: spl.backup1         0x00080000      0x00080000      0
  2: spl.backup2         0x00080000      0x00100000      0
  3: spl.backup3         0x00080000      0x00180000      0
  4: u-boot              0x00780000      0x00200000      0
  5: u-boot.env0         0x00200000      0x00980000      0
  6: u-boot.env1         0x00200000      0x00b80000      0
  7: mtdoops             0x00200000      0x00d80000      0
  8: rootfs              0xff080000      0x00f80000      0

so the last partition is to big for returning the size in a long.

  drivers/dfu/dfu.c      | 8 ++++----
  drivers/dfu/dfu_mmc.c  | 8 +++++---
  drivers/dfu/dfu_nand.c | 5 +++--
  drivers/dfu/dfu_ram.c  | 5 +++--
  drivers/dfu/dfu_sf.c   | 5 +++--
  include/dfu.h          | 4 ++--
  6 files changed, 20 insertions(+), 15 deletions(-)
drivers/dfu/dfu.c +4 -4
index 8f5915e..daa2eb9 100644
@@ -335,11 +335,11 @@ int dfu_read(struct dfu_entity *dfu, void
 *buf, int size, int blk_seq_num) if (dfu->i_buf_start == NULL)
  			return -ENOMEM;
 
-		dfu->r_left = dfu->get_medium_size(dfu);
-		if (dfu->r_left < 0)
-			return dfu->r_left;
+		ret = dfu->get_medium_size(dfu, &dfu->r_left);
+		if (ret < 0)
+			return ret;
 
-		debug("%s: %s %ld [B]\n", __func__, dfu->name,
 dfu->r_left);
+		debug("%s: %s %lld [B]\n", __func__, dfu->name,
 dfu->r_left);
  		dfu->i_blk_seq_num = 0;
  		dfu->crc = 0;
drivers/dfu/dfu_mmc.c +0 -0
index 395d472..5c1c1d1 100644
@@ -205,14 +205,15 @@ int dfu_flush_medium_mmc(struct dfu_entity
 *dfu) return ret;
  }
 
Quoted 5 lines

drivers/dfu/dfu_mmc.c int dfu_flush_medium_mmc(struct dfu_entity *dfu) · line 208

Quoted 2 lines
drivers/dfu/dfu_mmc.c +1 -1
-long dfu_get_medium_size_mmc(struct dfu_entity *dfu)
+int dfu_get_medium_size_mmc(struct dfu_entity *dfu, u64 *size)

The idea to use the return value to get error code and separate pointer for passing the size is the way to go in my opinion.

Thats, why I posted it as an RFC, I was unsure too...

Quoted 74 lines

The problem is in details. Please find my comments below.

Quoted 63 lines
drivers/dfu/dfu_mmc.c +2 -1
  {
  	int ret;
  	long len;
 
  	switch (dfu->layout) {
  	case DFU_RAW_ADDR:
-		return dfu->data.mmc.lba_size *
 dfu->data.mmc.lba_blk_size;
+		*size = dfu->data.mmc.lba_size *
 dfu->data.mmc.lba_blk_size;
+		return 0;
  	case DFU_FS_FAT:
  	case DFU_FS_EXT4:
  		dfu_file_buf_filled = -1;
drivers/dfu/dfu_mmc.c +2 -1
@@ -221,7 +222,8 @@ long dfu_get_medium_size_mmc(struct dfu_entity
 *dfu) return ret;
  		if (len > CONFIG_SYS_DFU_MAX_FILE_SIZE)
  			return -1;
-		return len;
+		*size = len;
+		return 0;
  	default:
  		printf("%s: Layout (%s) not (yet) supported!\n",
 __func__, dfu_get_layout(dfu->layout));
drivers/dfu/dfu_nand.c +3 -2
index a975492..4612e09 100644
@@ -114,9 +114,10 @@ static int dfu_write_medium_nand(struct
 dfu_entity *dfu, return ret;
  }
 
-long dfu_get_medium_size_nand(struct dfu_entity *dfu)
+int dfu_get_medium_size_nand(struct dfu_entity *dfu, u64 *size)
  {
-	return dfu->data.nand.size;
+	*size = dfu->data.nand.size;
+	return 0;
  }
 
  static int dfu_read_medium_nand(struct dfu_entity *dfu, u64

offset, void *buf, diff --git a/drivers/dfu/dfu_ram.c b/drivers/dfu/dfu_ram.c index e094a94..466759d 100644

drivers/dfu/dfu_ram.c +0 -0
@@ -41,9 +41,10 @@ static int dfu_write_medium_ram(struct

dfu_entity *dfu, u64 offset, return dfu_transfer_medium_ram(DFU_OP_WRITE, dfu, offset, buf, len); }

drivers/dfu/dfu_ram.c +3 -2
-long dfu_get_medium_size_ram(struct dfu_entity *dfu)
+int dfu_get_medium_size_ram(struct dfu_entity *dfu, u64 *size)
  {
-	return dfu->data.ram.size;
+	*size = dfu->data.ram.size;
+	return 0;
  }
 
  static int dfu_read_medium_ram(struct dfu_entity *dfu, u64

offset, diff --git a/drivers/dfu/dfu_sf.c b/drivers/dfu/dfu_sf.c index 9702eee..35c5fa1 100644

drivers/dfu/dfu_sf.c line 15

Quoted 5 lines
drivers/dfu/dfu_sf.c +1 -1
@@ -12,9 +12,10 @@
  #include <spi.h>
  #include <spi_flash.h>
 
-static long dfu_get_medium_size_sf(struct dfu_entity *dfu)
+int dfu_get_medium_size_sf(struct dfu_entity *dfu, u64 *size)

Originally the dfu_get_medium_size returns int. It is not suitable for sizes > 2GiB.

Quoted 3 lines

I don't like the u64 for *size, since we use that size to perform some arithmetic operation and comparison (>) in the dfu.c file. I would prefer to have long long here.

Ok.

Quoted 30 lines
Quoted 21 lines
drivers/dfu/dfu_sf.c +2 -1
  {
-	return dfu->data.sf.size;
+	*size = dfu->data.sf.size;
+	return 0;
  }
 
  static int dfu_read_medium_sf(struct dfu_entity *dfu, u64 offset,

void *buf, diff --git a/include/dfu.h b/include/dfu.h index 6118dc2..323b032 100644

include/dfu.h +1 -1
@@ -110,7 +110,7 @@ struct dfu_entity {
  		struct sf_internal_data sf;
  	} data;
 
-	long (*get_medium_size)(struct dfu_entity *dfu);
+	int (*get_medium_size)(struct dfu_entity *dfu, u64 *size);
 
  	int (*read_medium)(struct dfu_entity *dfu,
  			u64 offset, void *buf, long *len);

include/dfu.h struct dfu_entity { · line 135

Quoted 5 lines
include/dfu.h +1 -1
@@ -132,7 +132,7 @@ struct dfu_entity {
  	u8 *i_buf;
  	u8 *i_buf_start;
  	u8 *i_buf_end;
-	long r_left;
+	u64 r_left;

This patch changes r_left to be unsigned, but leaves b_left as signed (long).

Quoted 1 line

I think that both b_left and r_left should be promoted to long long.

Ok, I change it to long long ... but, I have detected another problem:

drivers/dfu/dfu_nand.c:

static int nand_block_op(enum dfu_op op, struct dfu_entity *dfu,
u64 offset, void *buf, long *len)

{
         loff_t start, lim;
         size_t count, actual;
         int ret;
         nand_info_t *nand;

         /* if buf == NULL return total size of the area */
         if (buf == NULL) {
                 *len = dfu->data.nand.size;
                 return 0;
         }

returns also a long only. nand_block_op gets called in the end from

static int dfu_write_medium_nand(struct dfu_entity *dfu,
u64 offset, void *buf, long *len)

and

Quoted 7 lines

static int dfu_read_medium_nand(struct dfu_entity *dfu, u64 offset, void *buf, long *len)
{

So I have to change also this functions ... Why returns the read/write operation the length of the complete area, if buf is NULL ? Is this a DFU feature?

Git blame hints that this code is a reminiscent of first code, which added NAND support to dfu (SHA1: c6631764, year 2013).

It seems like in the past the nand_block_op() has been called with buf = NULL parameter to read the NAND area size.

However, Stephen Warren has added the get_medium_size_nand() function a year later (in 2014) to read the medium size.

Hence it seems to me, that the buf == NULL code in nand_block_op could be safely removed.

As I've check - in contemporary u-boot - there is no call to this function with buf NULL parameter.

Quoted 11 lines

bye,
Heiko

Quoted 7 lines
Quoted 4 lines
include/dfu.h +0 -0
  	long b_left;
 
  	u32 bad_skip;	/* for nand use */
Signature · 5 lines
Best regards,

Lukasz Majewski

Samsung R&D Institute Poland (SRPOL) | Linux Platform Group
#4 lore raw

RFC PATCH 1/1 dfu: allow get_medium_size() to return bigger medium sizes than 2GiB

In reply to Heiko Schocher
Quoted 24 lines · Heiko Schocher

change the get_medium_size() function from

include/dfu.h +1 -1
-       long (*get_medium_size)(struct dfu_entity *dfu);
+       int (*get_medium_size)(struct dfu_entity *dfu, u64 *size);

so it can return bigger medium sizes than 2GiB, and the return value is seperate from the size.

---
I just have a DDP nand with a size of 4GiB, and the mtd partition layout is:
device nand2 <omap2-nand.0>, # parts = 9

 #: name                size            offset          mask_flags
 0: spl                 0x00080000      0x00000000      0
 1: spl.backup1         0x00080000      0x00080000      0
 2: spl.backup2         0x00080000      0x00100000      0
 3: spl.backup3         0x00080000      0x00180000      0
 4: u-boot              0x00780000      0x00200000      0
 5: u-boot.env0         0x00200000      0x00980000      0
 6: u-boot.env1         0x00200000      0x00b80000      0
 7: mtdoops             0x00200000      0x00d80000      0
 8: rootfs              0xff080000      0x00f80000      0
Quoted 1 line

so the last partition is to big for returning the size in a long.

to -> too

Quoted 34 lines
 drivers/dfu/dfu.c      | 8 ++++----
 drivers/dfu/dfu_mmc.c  | 8 +++++---
 drivers/dfu/dfu_nand.c | 5 +++--
 drivers/dfu/dfu_ram.c  | 5 +++--
 drivers/dfu/dfu_sf.c   | 5 +++--
 include/dfu.h          | 4 ++--
 6 files changed, 20 insertions(+), 15 deletions(-)
drivers/dfu/dfu.c +4 -4
index 8f5915e..daa2eb9 100644
@@ -335,11 +335,11 @@ int dfu_read(struct dfu_entity *dfu, void *buf, int size, int blk_seq_num)
                if (dfu->i_buf_start == NULL)
                        return -ENOMEM;
 
-               dfu->r_left = dfu->get_medium_size(dfu);
-               if (dfu->r_left < 0)
-                       return dfu->r_left;
+               ret = dfu->get_medium_size(dfu, &dfu->r_left);
+               if (ret < 0)
+                       return ret;
 
-               debug("%s: %s %ld [B]\n", __func__, dfu->name, dfu->r_left);
+               debug("%s: %s %lld [B]\n", __func__, dfu->name, dfu->r_left);
 
                dfu->i_blk_seq_num = 0;
                dfu->crc = 0;
drivers/dfu/dfu_mmc.c +0 -0
index 395d472..5c1c1d1 100644

drivers/dfu/dfu_mmc.c int dfu_flush_medium_mmc(struct dfu_entity *dfu) · line 208

Quoted 5 lines
drivers/dfu/dfu_mmc.c +1 -1
@@ -205,14 +205,15 @@ int dfu_flush_medium_mmc(struct dfu_entity *dfu)
        return ret;
 }
 
-long dfu_get_medium_size_mmc(struct dfu_entity *dfu)
+int dfu_get_medium_size_mmc(struct dfu_entity *dfu, u64 *size)

i64 size? Same for all other places.

drivers/dfu/dfu_mmc.c int dfu_flush_medium_mmc(struct dfu_entity *dfu) · line 215

Quoted 8 lines
drivers/dfu/dfu_mmc.c +1 -1
 {
        int ret;
        long len;
 
        switch (dfu->layout) {
        case DFU_RAW_ADDR:
-               return dfu->data.mmc.lba_size * dfu->data.mmc.lba_blk_size;
+               *size = dfu->data.mmc.lba_size * dfu->data.mmc.lba_blk_size;

You need to check that size is not NULL before dereferencing it. Same for all other places.

Quoted 94 lines
drivers/dfu/dfu_mmc.c +3 -1
+               return 0;
        case DFU_FS_FAT:
        case DFU_FS_EXT4:
                dfu_file_buf_filled = -1;
@@ -221,7 +222,8 @@ long dfu_get_medium_size_mmc(struct dfu_entity *dfu)
                        return ret;
                if (len > CONFIG_SYS_DFU_MAX_FILE_SIZE)
                        return -1;
-               return len;
+               *size = len;
+               return 0;
        default:
                printf("%s: Layout (%s) not (yet) supported!\n", __func__,
                       dfu_get_layout(dfu->layout));
drivers/dfu/dfu_nand.c +3 -2
index a975492..4612e09 100644
@@ -114,9 +114,10 @@ static int dfu_write_medium_nand(struct dfu_entity *dfu,
        return ret;
 }
 
-long dfu_get_medium_size_nand(struct dfu_entity *dfu)
+int dfu_get_medium_size_nand(struct dfu_entity *dfu, u64 *size)
 {
-       return dfu->data.nand.size;
+       *size = dfu->data.nand.size;
+       return 0;
 }
 
 static int dfu_read_medium_nand(struct dfu_entity *dfu, u64 offset, void *buf,
drivers/dfu/dfu_ram.c +3 -2
index e094a94..466759d 100644
@@ -41,9 +41,10 @@ static int dfu_write_medium_ram(struct dfu_entity *dfu, u64 offset,
        return dfu_transfer_medium_ram(DFU_OP_WRITE, dfu, offset, buf, len);
 }
 
-long dfu_get_medium_size_ram(struct dfu_entity *dfu)
+int dfu_get_medium_size_ram(struct dfu_entity *dfu, u64 *size)
 {
-       return dfu->data.ram.size;
+       *size = dfu->data.ram.size;
+       return 0;
 }
 
 static int dfu_read_medium_ram(struct dfu_entity *dfu, u64 offset,
drivers/dfu/dfu_sf.c +3 -2
index 9702eee..35c5fa1 100644
@@ -12,9 +12,10 @@
 #include <spi.h>
 #include <spi_flash.h>
 
-static long dfu_get_medium_size_sf(struct dfu_entity *dfu)
+int dfu_get_medium_size_sf(struct dfu_entity *dfu, u64 *size)
 {
-       return dfu->data.sf.size;
+       *size = dfu->data.sf.size;
+       return 0;
 }
 
 static int dfu_read_medium_sf(struct dfu_entity *dfu, u64 offset, void *buf,
include/dfu.h +2 -3
index 6118dc2..323b032 100644
@@ -110,7 +110,7 @@ struct dfu_entity {
                struct sf_internal_data sf;
        } data;
 
-       long (*get_medium_size)(struct dfu_entity *dfu);
+       int (*get_medium_size)(struct dfu_entity *dfu, u64 *size);
 
        int (*read_medium)(struct dfu_entity *dfu,
                        u64 offset, void *buf, long *len);
@@ -132,7 +132,7 @@ struct dfu_entity {
        u8 *i_buf;
        u8 *i_buf_start;
        u8 *i_buf_end;
-       long r_left;
+       u64 r_left;
        long b_left;
 
        u32 bad_skip;   /* for nand use */
--

2.5.0

_______________________________________________
U-Boot mailing list
U-Boot at lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot

#5 lore raw

RFC PATCH 1/1 dfu: allow get_medium_size() to return bigger medium sizes than 2GiB

Hello Joe,

Am 28.01.2016 um 16:03 schrieb Joe Hershberger:

Quoted 66 lines · Heiko Schocher
Quoted 24 lines

change the get_medium_size() function from

include/dfu.h +1 -1
-       long (*get_medium_size)(struct dfu_entity *dfu);
+       int (*get_medium_size)(struct dfu_entity *dfu, u64 *size);

so it can return bigger medium sizes than 2GiB, and the return value is seperate from the size.

---
I just have a DDP nand with a size of 4GiB, and the mtd partition layout is:
device nand2 <omap2-nand.0>, # parts = 9

  #: name                size            offset          mask_flags
  0: spl                 0x00080000      0x00000000      0
  1: spl.backup1         0x00080000      0x00080000      0
  2: spl.backup2         0x00080000      0x00100000      0
  3: spl.backup3         0x00080000      0x00180000      0
  4: u-boot              0x00780000      0x00200000      0
  5: u-boot.env0         0x00200000      0x00980000      0
  6: u-boot.env1         0x00200000      0x00b80000      0
  7: mtdoops             0x00200000      0x00d80000      0
  8: rootfs              0xff080000      0x00f80000      0
Quoted 1 line

so the last partition is to big for returning the size in a long.

to -> too

Quoted 37 lines
  drivers/dfu/dfu.c      | 8 ++++----
  drivers/dfu/dfu_mmc.c  | 8 +++++---
  drivers/dfu/dfu_nand.c | 5 +++--
  drivers/dfu/dfu_ram.c  | 5 +++--
  drivers/dfu/dfu_sf.c   | 5 +++--
  include/dfu.h          | 4 ++--
  6 files changed, 20 insertions(+), 15 deletions(-)
drivers/dfu/dfu.c +4 -4
index 8f5915e..daa2eb9 100644
@@ -335,11 +335,11 @@ int dfu_read(struct dfu_entity *dfu, void *buf, int size, int blk_seq_num)
                 if (dfu->i_buf_start == NULL)
                         return -ENOMEM;
 
-               dfu->r_left = dfu->get_medium_size(dfu);
-               if (dfu->r_left < 0)
-                       return dfu->r_left;
+               ret = dfu->get_medium_size(dfu, &dfu->r_left);
+               if (ret < 0)
+                       return ret;
 
-               debug("%s: %s %ld [B]\n", __func__, dfu->name, dfu->r_left);
+               debug("%s: %s %lld [B]\n", __func__, dfu->name, dfu->r_left);
 
                 dfu->i_blk_seq_num = 0;
                 dfu->crc = 0;
drivers/dfu/dfu_mmc.c +0 -0
index 395d472..5c1c1d1 100644
@@ -205,14 +205,15 @@ int dfu_flush_medium_mmc(struct dfu_entity *dfu)
         return ret;
  }
 
Quoted 4 lines

drivers/dfu/dfu_mmc.c int dfu_flush_medium_mmc(struct dfu_entity *dfu) · line 208

Quoted 2 lines
drivers/dfu/dfu_mmc.c +1 -1
-long dfu_get_medium_size_mmc(struct dfu_entity *dfu)
+int dfu_get_medium_size_mmc(struct dfu_entity *dfu, u64 *size)

i64 size? Same for all other places.

Lukasz mentioned "long long" ...

Quoted 11 lines

drivers/dfu/dfu_mmc.c int dfu_flush_medium_mmc(struct dfu_entity *dfu) · line 215

Quoted 8 lines
drivers/dfu/dfu_mmc.c +1 -1
  {
         int ret;
         long len;
 
         switch (dfu->layout) {
         case DFU_RAW_ADDR:
-               return dfu->data.mmc.lba_size * dfu->data.mmc.lba_blk_size;
+               *size = dfu->data.mmc.lba_size * dfu->data.mmc.lba_blk_size;

You need to check that size is not NULL before dereferencing it. Same for all other places.

Correct, add it.

Quoted 95 lines
Quoted 94 lines
drivers/dfu/dfu_mmc.c +3 -1
+               return 0;
         case DFU_FS_FAT:
         case DFU_FS_EXT4:
                 dfu_file_buf_filled = -1;
@@ -221,7 +222,8 @@ long dfu_get_medium_size_mmc(struct dfu_entity *dfu)
                         return ret;
                 if (len > CONFIG_SYS_DFU_MAX_FILE_SIZE)
                         return -1;
-               return len;
+               *size = len;
+               return 0;
         default:
                 printf("%s: Layout (%s) not (yet) supported!\n", __func__,
                        dfu_get_layout(dfu->layout));
drivers/dfu/dfu_nand.c +3 -2
index a975492..4612e09 100644
@@ -114,9 +114,10 @@ static int dfu_write_medium_nand(struct dfu_entity *dfu,
         return ret;
  }
 
-long dfu_get_medium_size_nand(struct dfu_entity *dfu)
+int dfu_get_medium_size_nand(struct dfu_entity *dfu, u64 *size)
  {
-       return dfu->data.nand.size;
+       *size = dfu->data.nand.size;
+       return 0;
  }
 
  static int dfu_read_medium_nand(struct dfu_entity *dfu, u64 offset, void *buf,
drivers/dfu/dfu_ram.c +3 -2
index e094a94..466759d 100644
@@ -41,9 +41,10 @@ static int dfu_write_medium_ram(struct dfu_entity *dfu, u64 offset,
         return dfu_transfer_medium_ram(DFU_OP_WRITE, dfu, offset, buf, len);
  }
 
-long dfu_get_medium_size_ram(struct dfu_entity *dfu)
+int dfu_get_medium_size_ram(struct dfu_entity *dfu, u64 *size)
  {
-       return dfu->data.ram.size;
+       *size = dfu->data.ram.size;
+       return 0;
  }
 
  static int dfu_read_medium_ram(struct dfu_entity *dfu, u64 offset,
drivers/dfu/dfu_sf.c +3 -2
index 9702eee..35c5fa1 100644
@@ -12,9 +12,10 @@
  #include <spi.h>
  #include <spi_flash.h>
 
-static long dfu_get_medium_size_sf(struct dfu_entity *dfu)
+int dfu_get_medium_size_sf(struct dfu_entity *dfu, u64 *size)
  {
-       return dfu->data.sf.size;
+       *size = dfu->data.sf.size;
+       return 0;
  }
 
  static int dfu_read_medium_sf(struct dfu_entity *dfu, u64 offset, void *buf,
include/dfu.h +2 -3
index 6118dc2..323b032 100644
@@ -110,7 +110,7 @@ struct dfu_entity {
                 struct sf_internal_data sf;
         } data;
 
-       long (*get_medium_size)(struct dfu_entity *dfu);
+       int (*get_medium_size)(struct dfu_entity *dfu, u64 *size);
 
         int (*read_medium)(struct dfu_entity *dfu,
                         u64 offset, void *buf, long *len);
@@ -132,7 +132,7 @@ struct dfu_entity {
         u8 *i_buf;
         u8 *i_buf_start;
         u8 *i_buf_end;
-       long r_left;
+       u64 r_left;
         long b_left;
 
         u32 bad_skip;   /* for nand use */
--

2.5.0

_______________________________________________
U-Boot mailing list
U-Boot at lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot

Signature · 2 lines
DENX Software Engineering GmbH,      Managing Director: Wolfgang Denk
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
#6 lore raw

RFC PATCH 1/1 dfu: allow get_medium_size() to return bigger medium sizes than 2GiB

Quoted 76 lines · Heiko Schocher

Hello Joe,

Am 28.01.2016 um 16:03 schrieb Joe Hershberger:

Quoted 72 lines · Heiko Schocher
Quoted 25 lines

change the get_medium_size() function from

include/dfu.h +1 -1
-       long (*get_medium_size)(struct dfu_entity *dfu);
+       int (*get_medium_size)(struct dfu_entity *dfu, u64 *size);

so it can return bigger medium sizes than 2GiB, and the return value is seperate from the size.

---
I just have a DDP nand with a size of 4GiB, and the mtd partition layout is:
device nand2 <omap2-nand.0>, # parts = 9

  #: name                size            offset          mask_flags
  0: spl                 0x00080000      0x00000000      0
  1: spl.backup1         0x00080000      0x00080000      0
  2: spl.backup2         0x00080000      0x00100000      0
  3: spl.backup3         0x00080000      0x00180000      0
  4: u-boot              0x00780000      0x00200000      0
  5: u-boot.env0         0x00200000      0x00980000      0
  6: u-boot.env1         0x00200000      0x00b80000      0
  7: mtdoops             0x00200000      0x00d80000      0
  8: rootfs              0xff080000      0x00f80000      0
Quoted 1 line

so the last partition is to big for returning the size in a long.

to -> too

Quoted 40 lines
  drivers/dfu/dfu.c      | 8 ++++----
  drivers/dfu/dfu_mmc.c  | 8 +++++---
  drivers/dfu/dfu_nand.c | 5 +++--
  drivers/dfu/dfu_ram.c  | 5 +++--
  drivers/dfu/dfu_sf.c   | 5 +++--
  include/dfu.h          | 4 ++--
  6 files changed, 20 insertions(+), 15 deletions(-)
drivers/dfu/dfu.c +4 -4
index 8f5915e..daa2eb9 100644
@@ -335,11 +335,11 @@ int dfu_read(struct dfu_entity *dfu, void *buf, int
 size, int blk_seq_num)
                 if (dfu->i_buf_start == NULL)
                         return -ENOMEM;
 
-               dfu->r_left = dfu->get_medium_size(dfu);
-               if (dfu->r_left < 0)
-                       return dfu->r_left;
+               ret = dfu->get_medium_size(dfu, &dfu->r_left);
+               if (ret < 0)
+                       return ret;
 
-               debug("%s: %s %ld [B]\n", __func__, dfu->name,
 dfu->r_left);
+               debug("%s: %s %lld [B]\n", __func__, dfu->name,
 dfu->r_left);
                 dfu->i_blk_seq_num = 0;
                 dfu->crc = 0;
drivers/dfu/dfu_mmc.c +0 -0
index 395d472..5c1c1d1 100644
@@ -205,14 +205,15 @@ int dfu_flush_medium_mmc(struct dfu_entity *dfu)
         return ret;
  }
 
Quoted 8 lines
Quoted 5 lines

drivers/dfu/dfu_mmc.c int dfu_flush_medium_mmc(struct dfu_entity *dfu) · line 208

Quoted 2 lines
drivers/dfu/dfu_mmc.c +1 -1
-long dfu_get_medium_size_mmc(struct dfu_entity *dfu)
+int dfu_get_medium_size_mmc(struct dfu_entity *dfu, u64 *size)

i64 size? Same for all other places.

Lukasz mentioned "long long" ...

That's OK too.

Quoted 125 lines
Quoted 12 lines

drivers/dfu/dfu_mmc.c int dfu_flush_medium_mmc(struct dfu_entity *dfu)

Quoted 10 lines
drivers/dfu/dfu_mmc.c +1 -1
  {
         int ret;
         long len;
 
         switch (dfu->layout) {
         case DFU_RAW_ADDR:
-               return dfu->data.mmc.lba_size *
 dfu->data.mmc.lba_blk_size;
+               *size = dfu->data.mmc.lba_size *
 dfu->data.mmc.lba_blk_size;
Quoted 2 lines

You need to check that size is not NULL before dereferencing it. Same for all other places.

Correct, add it.

Quoted 92 lines
Quoted 92 lines
drivers/dfu/dfu_mmc.c +1 -0
+               return 0;
         case DFU_FS_FAT:
         case DFU_FS_EXT4:
                 dfu_file_buf_filled = -1;
drivers/dfu/dfu_mmc.c +2 -1
@@ -221,7 +222,8 @@ long dfu_get_medium_size_mmc(struct dfu_entity *dfu)
                         return ret;
                 if (len > CONFIG_SYS_DFU_MAX_FILE_SIZE)
                         return -1;
-               return len;
+               *size = len;
+               return 0;
         default:
                 printf("%s: Layout (%s) not (yet) supported!\n",
 __func__,
                        dfu_get_layout(dfu->layout));
drivers/dfu/dfu_nand.c +3 -2
index a975492..4612e09 100644
@@ -114,9 +114,10 @@ static int dfu_write_medium_nand(struct dfu_entity
 *dfu,
         return ret;
  }
 
-long dfu_get_medium_size_nand(struct dfu_entity *dfu)
+int dfu_get_medium_size_nand(struct dfu_entity *dfu, u64 *size)
  {
-       return dfu->data.nand.size;
+       *size = dfu->data.nand.size;
+       return 0;
  }
 

static int dfu_read_medium_nand(struct dfu_entity *dfu, u64 offset,
void *buf,

drivers/dfu/dfu_ram.c +3 -2
index e094a94..466759d 100644
@@ -41,9 +41,10 @@ static int dfu_write_medium_ram(struct dfu_entity
 *dfu, u64 offset,
         return dfu_transfer_medium_ram(DFU_OP_WRITE, dfu, offset, buf,
 len);
  }
 
-long dfu_get_medium_size_ram(struct dfu_entity *dfu)
+int dfu_get_medium_size_ram(struct dfu_entity *dfu, u64 *size)
  {
-       return dfu->data.ram.size;
+       *size = dfu->data.ram.size;
+       return 0;
  }

static int dfu_read_medium_ram(struct dfu_entity *dfu, u64 offset,

drivers/dfu/dfu_sf.c +3 -2
index 9702eee..35c5fa1 100644
@@ -12,9 +12,10 @@
  #include <spi.h>
  #include <spi_flash.h>
 
-static long dfu_get_medium_size_sf(struct dfu_entity *dfu)
+int dfu_get_medium_size_sf(struct dfu_entity *dfu, u64 *size)
  {
-       return dfu->data.sf.size;
+       *size = dfu->data.sf.size;
+       return 0;
  }
 
  static int dfu_read_medium_sf(struct dfu_entity *dfu, u64 offset, void

*buf,

include/dfu.h +2 -2
index 6118dc2..323b032 100644
@@ -110,7 +110,7 @@ struct dfu_entity {
                 struct sf_internal_data sf;
         } data;
 
-       long (*get_medium_size)(struct dfu_entity *dfu);
+       int (*get_medium_size)(struct dfu_entity *dfu, u64 *size);
 
         int (*read_medium)(struct dfu_entity *dfu,
                         u64 offset, void *buf, long *len);
@@ -132,7 +132,7 @@ struct dfu_entity {
         u8 *i_buf;
         u8 *i_buf_start;
         u8 *i_buf_end;
-       long r_left;
+       u64 r_left;
         long b_left;
 
Quoted 10 lines
Quoted 8 lines
include/dfu.h +0 -1
         u32 bad_skip;   /* for nand use */
--

2.5.0

_______________________________________________
U-Boot mailing list
U-Boot at lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot

--
DENX Software Engineering GmbH, Managing Director: Wolfgang Denk
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany