Re: [U-Boot] [PATCH v4] dfu, nand, ubi: add partubi alt settings for updating ubi partition

2013-07-24 Thread Scott Wood

On 07/23/2013 11:30:55 PM, Heiko Schocher wrote:

Hello Scott,

Am 24.07.2013 01:22, schrieb Scott Wood:

On 07/18/2013 11:32:14 PM, Heiko Schocher wrote:

+static int dfu_flush_medium_nand(struct dfu_entity *dfu)
+{
+ int ret = 0;
+
+ /* in case of ubi partition, erase rest of the partition */
+ if (dfu-data.nand.ubi) {
+ nand_info_t *nand;
+ nand_erase_options_t opts;
+
+ if (nand_curr_device  0 ||
+ nand_curr_device = CONFIG_SYS_MAX_NAND_DEVICE ||
+ !nand_info[nand_curr_device].name) {
+ printf(%s: invalid nand device\n, __func__);
+ return -1;
+ }
+
+ nand = nand_info[nand_curr_device];
+
+ memset(opts, 0, sizeof(opts));
+ opts.offset = dfu-data.nand.start + dfu-offset +
+ dfu-bad_skip;
+ opts.length = dfu-data.nand.start +
+ dfu-data.nand.size - opts.offset;


opts.length is equivalent to dfu-data.nand.size - dfu-offset -  
dfu-bad_skip. Is this correct? dfu-data.nand.size includes  
dfu-offset, but dfu-data.nand.start doesn't?


Yes, it is correct!


No need to shout...


I could not parse dfu-data.nand.size includes dfu-offset, but
dfu-data.nand.start doesn't ... What do you mean?


I think my confusion was over what dfu-offset and nand.start  
represent.  If nand.start/nand.size describe the raw partition, and  
dfu-offset is the offset into that partition that the image starts at,  
then this looks OK.


-Scott
___
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot


Re: [U-Boot] [PATCH v4] dfu, nand, ubi: add partubi alt settings for updating ubi partition

2013-07-24 Thread Heiko Schocher

Hello Scott,

Am 24.07.2013 21:08, schrieb Scott Wood:

On 07/23/2013 11:30:55 PM, Heiko Schocher wrote:

Hello Scott,

Am 24.07.2013 01:22, schrieb Scott Wood:

On 07/18/2013 11:32:14 PM, Heiko Schocher wrote:

+static int dfu_flush_medium_nand(struct dfu_entity *dfu)
+{
+ int ret = 0;
+
+ /* in case of ubi partition, erase rest of the partition */
+ if (dfu-data.nand.ubi) {
+ nand_info_t *nand;
+ nand_erase_options_t opts;
+
+ if (nand_curr_device  0 ||
+ nand_curr_device = CONFIG_SYS_MAX_NAND_DEVICE ||
+ !nand_info[nand_curr_device].name) {
+ printf(%s: invalid nand device\n, __func__);
+ return -1;
+ }
+
+ nand = nand_info[nand_curr_device];
+
+ memset(opts, 0, sizeof(opts));
+ opts.offset = dfu-data.nand.start + dfu-offset +
+ dfu-bad_skip;
+ opts.length = dfu-data.nand.start +
+ dfu-data.nand.size - opts.offset;


opts.length is equivalent to dfu-data.nand.size - dfu-offset - dfu-bad_skip. Is this 
correct? dfu-data.nand.size includes dfu-offset, but dfu-data.nand.start doesn't?


Yes, it is correct!


No need to shout...


Sorry, I did not intent to shout ...


I could not parse dfu-data.nand.size includes dfu-offset, but
dfu-data.nand.start doesn't ... What do you mean?


I think my confusion was over what dfu-offset and nand.start represent. If 
nand.start/nand.size describe the raw partition, and dfu-offset is the offset 
into that partition that the image starts at, then this looks OK.


Ok, I send an update of this patch for your other comment, thanks.

bye,
Heiko
--
DENX Software Engineering GmbH, MD: Wolfgang Denk  Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
___
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot


Re: [U-Boot] [PATCH v4] dfu, nand, ubi: add partubi alt settings for updating ubi partition

2013-07-23 Thread Heiko Schocher

Hello Scott,

Am 22.07.2013 23:24, schrieb Scott Wood:

On 07/18/2013 11:32:14 PM, Heiko Schocher wrote:

updating an ubi partition needs a completely erased mtd partition,
see:
http://lists.infradead.org/pipermail/linux-mtd/2011-May/035416.html

So, add partubi alt setting for the dfu_alt_info environment
variable to mark this partition as an ubi partition. In case we
update an ubi partition, we erase after flashing the image into the
partition, the remaining sektors.

Signed-off-by: Heiko Schocher h...@denx.de
Cc: Pantelis Antoniou pa...@antoniou-consulting.com
Cc: Tom Rini tr...@ti.com
Cc: Lukasz Majewski l.majew...@samsung.com
Cc: Kyungmin Park kyungmin.p...@samsung.com
Cc: Marek Vasut ma...@denx.de
Cc: Wolfgang Denk w...@denx.de

---

- This patch is also a good starting point to fix up updating ubi, as
we currently use nand erase for erasing the sektors. This is
not the prefered way for writing an ubi image, see:
http://www.linux-mtd.infradead.org/faq/ubi.html#L_flash_img

This must be fixed ... we have no ubiformat in u-boot, or?


In the meantime, should you be using WITH_DROP_FFS when ubi is set? Though we 
really should be skipping FFs at the end of each block, rather than just at the end of 
the image.


Yes, but this would be another patch, as this patch did not
touch the nand write part ...!


- changes for v2:
- do not use spread = 1 for nand_erase_opts, to prevent
errormessage if there are bad blocks in the erase range.

- changes for v3:
- add comment from Marek Vasut:
- prevent losing memory
- added comment from Lukasz Majewski:
- move code to dfu_nand.c dfu_flush_medium_nand()

- changes for v4:
- add comment from Lukasz Majewski:
- move ubi var to internal struct struct nand_internal_data
---
drivers/dfu/dfu_nand.c | 58 ++
include/dfu.h | 2 ++
2 Dateien geändert, 60 Zeilen hinzugefügt(+)

diff --git a/drivers/dfu/dfu_nand.c b/drivers/dfu/dfu_nand.c
index 07dee89..c0f8adf 100644
--- a/drivers/dfu/dfu_nand.c
+++ b/drivers/dfu/dfu_nand.c
@@ -148,11 +148,43 @@ static int dfu_read_medium_nand(struct dfu_entity *dfu, 
u64 offset, void *buf,
return ret;
}

+static int dfu_flush_medium_nand(struct dfu_entity *dfu)
+{
+ int ret = 0;
+
+ /* in case of ubi partition, erase rest of the partition */


Did you have a chance to investigate the errors you saw when erasing the whole partition up front? 
If there's other DFU data in the partition that needs to be preserved, then replace 
partition with area reserved for this image.


Currently no :-(

But I hope to get the chance to fix this in the correct way, by
introducing an ubi format ... command ...

bye,
Heiko
--
DENX Software Engineering GmbH, MD: Wolfgang Denk  Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
___
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot


Re: [U-Boot] [PATCH v4] dfu, nand, ubi: add partubi alt settings for updating ubi partition

2013-07-23 Thread Scott Wood

On 07/23/2013 08:12:03 AM, Heiko Schocher wrote:

Hello Scott,

Am 22.07.2013 23:24, schrieb Scott Wood:

On 07/18/2013 11:32:14 PM, Heiko Schocher wrote:
- This patch is also a good starting point to fix up updating ubi,  
as

we currently use nand erase for erasing the sektors. This is
not the prefered way for writing an ubi image, see:
http://www.linux-mtd.infradead.org/faq/ubi.html#L_flash_img

This must be fixed ... we have no ubiformat in u-boot, or?


In the meantime, should you be using WITH_DROP_FFS when ubi is  
set? Though we really should be skipping FFs at the end of each  
block, rather than just at the end of the image.


Yes, but this would be another patch, as this patch did not
touch the nand write part ...!


It was a response to the comment, not to the patch.

-Scott
___
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot


Re: [U-Boot] [PATCH v4] dfu, nand, ubi: add partubi alt settings for updating ubi partition

2013-07-23 Thread Scott Wood

On 07/18/2013 11:32:14 PM, Heiko Schocher wrote:

+static int dfu_flush_medium_nand(struct dfu_entity *dfu)
+{
+   int ret = 0;
+
+   /* in case of ubi partition, erase rest of the partition */
+   if (dfu-data.nand.ubi) {
+   nand_info_t *nand;
+   nand_erase_options_t opts;
+
+   if (nand_curr_device  0 ||
+   nand_curr_device = CONFIG_SYS_MAX_NAND_DEVICE ||
+   !nand_info[nand_curr_device].name) {
+   printf(%s: invalid nand device\n, __func__);
+   return -1;
+   }
+
+   nand = nand_info[nand_curr_device];
+
+   memset(opts, 0, sizeof(opts));
+   opts.offset = dfu-data.nand.start + dfu-offset +
+   dfu-bad_skip;
+   opts.length = dfu-data.nand.start +
+   dfu-data.nand.size - opts.offset;


opts.length is equivalent to dfu-data.nand.size - dfu-offset -  
dfu-bad_skip.  Is this correct?  dfu-data.nand.size includes  
dfu-offset, but dfu-data.nand.start doesn't?


@@ -185,7 +217,32 @@ int dfu_fill_entity_nand(struct dfu_entity *dfu,  
char *s)


dfu-data.nand.start = pi-offset;
+   } else if (!strcmp(st, partubi)) {
dfu-data.nand.size = pi-size;
+   char mtd_id[32];
+   struct mtd_device *mtd_dev;
+   u8 part_num;
+   struct part_info *pi;

+   dfu-layout = DFU_RAW_ADDR;
+
+   dev = simple_strtoul(s, s, 10);
+   s++;
+   part = simple_strtoul(s, s, 10);
+
+   sprintf(mtd_id, %s%d,%d, nand, dev, part - 1);
+   printf(using id '%s'\n, mtd_id);
+
+   mtdparts_init();
+
+		ret = find_dev_and_part(mtd_id, mtd_dev, part_num,  
pi);

+   if (ret != 0) {
+   printf(Could not locate '%s'\n, mtd_id);
+   return -1;
+   }
+
+   dfu-data.nand.start = pi-offset;
+   dfu-data.nand.size = pi-size;
+   dfu-data.nand.ubi = 1;


Please don't duplicate all of this just to set one flag at the end.

-Scott
___
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot


Re: [U-Boot] [PATCH v4] dfu, nand, ubi: add partubi alt settings for updating ubi partition

2013-07-23 Thread Heiko Schocher

Hello Scott,

Am 24.07.2013 01:22, schrieb Scott Wood:

On 07/18/2013 11:32:14 PM, Heiko Schocher wrote:

+static int dfu_flush_medium_nand(struct dfu_entity *dfu)
+{
+ int ret = 0;
+
+ /* in case of ubi partition, erase rest of the partition */
+ if (dfu-data.nand.ubi) {
+ nand_info_t *nand;
+ nand_erase_options_t opts;
+
+ if (nand_curr_device  0 ||
+ nand_curr_device = CONFIG_SYS_MAX_NAND_DEVICE ||
+ !nand_info[nand_curr_device].name) {
+ printf(%s: invalid nand device\n, __func__);
+ return -1;
+ }
+
+ nand = nand_info[nand_curr_device];
+
+ memset(opts, 0, sizeof(opts));
+ opts.offset = dfu-data.nand.start + dfu-offset +
+ dfu-bad_skip;
+ opts.length = dfu-data.nand.start +
+ dfu-data.nand.size - opts.offset;


opts.length is equivalent to dfu-data.nand.size - dfu-offset - dfu-bad_skip. Is this 
correct? dfu-data.nand.size includes dfu-offset, but dfu-data.nand.start doesn't?


Yes, it is correct!

I could not parse dfu-data.nand.size includes dfu-offset, but
dfu-data.nand.start doesn't ... What do you mean?

I need to calculate opts-offset and opts.length for nand_erase_opts():
opts.offset contains the starting sector where the erase should begin
 dfu-data.nand.start is equal to the starting sector of the
 partition, so this is needed here + dfu-offset + dfu-bad_skip
 and we are at our starting point.

opts.length contains the count of sectors to erase.
 I just did here end_sector - start_sector with:
 end_sector = dfu-data.nand.start + dfu-data.nand.size
 start_sector = opts.offset

Maybe my calculation of opts.length is confusing, and I should
use dfu-data.nand.size - dfu-offset - dfu-bad_skip ?


@@ -185,7 +217,32 @@ int dfu_fill_entity_nand(struct dfu_entity *dfu, char *s)

dfu-data.nand.start = pi-offset;
+ } else if (!strcmp(st, partubi)) {
dfu-data.nand.size = pi-size;
+ char mtd_id[32];
+ struct mtd_device *mtd_dev;
+ u8 part_num;
+ struct part_info *pi;

+ dfu-layout = DFU_RAW_ADDR;
+
+ dev = simple_strtoul(s, s, 10);
+ s++;
+ part = simple_strtoul(s, s, 10);
+
+ sprintf(mtd_id, %s%d,%d, nand, dev, part - 1);
+ printf(using id '%s'\n, mtd_id);
+
+ mtdparts_init();
+
+ ret = find_dev_and_part(mtd_id, mtd_dev, part_num, pi);
+ if (ret != 0) {
+ printf(Could not locate '%s'\n, mtd_id);
+ return -1;
+ }
+
+ dfu-data.nand.start = pi-offset;
+ dfu-data.nand.size = pi-size;
+ dfu-data.nand.ubi = 1;


Please don't duplicate all of this just to set one flag at the end.


You are right! Fixed!

Thanks!

bye,
Heiko
--
DENX Software Engineering GmbH, MD: Wolfgang Denk  Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
___
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot


Re: [U-Boot] [PATCH v4] dfu, nand, ubi: add partubi alt settings for updating ubi partition

2013-07-22 Thread Scott Wood

On 07/18/2013 11:32:14 PM, Heiko Schocher wrote:

updating an ubi partition needs a completely erased mtd partition,
see:
http://lists.infradead.org/pipermail/linux-mtd/2011-May/035416.html

So, add partubi alt setting for the dfu_alt_info environment
variable to mark this partition as an ubi partition. In case we
update an ubi partition, we erase after flashing the image into the
partition, the remaining sektors.

Signed-off-by: Heiko Schocher h...@denx.de
Cc: Pantelis Antoniou pa...@antoniou-consulting.com
Cc: Tom Rini tr...@ti.com
Cc: Lukasz Majewski l.majew...@samsung.com
Cc: Kyungmin Park kyungmin.p...@samsung.com
Cc: Marek Vasut ma...@denx.de
Cc: Wolfgang Denk w...@denx.de

---

- This patch is also a good starting point to fix up updating ubi, as
  we currently use nand erase for erasing the sektors. This is
  not the prefered way for writing an ubi image, see:
  http://www.linux-mtd.infradead.org/faq/ubi.html#L_flash_img

  This must be fixed ... we have no ubiformat in u-boot, or?


In the meantime, should you be using WITH_DROP_FFS when ubi is set?   
Though we really should be skipping FFs at the end of each block,  
rather than just at the end of the image.



- changes for v2:
  - do not use spread = 1 for nand_erase_opts, to prevent
errormessage if there are bad blocks in the erase range.

- changes for v3:
  - add comment from Marek Vasut:
- prevent losing memory
  - added comment from Lukasz Majewski:
- move code to dfu_nand.c dfu_flush_medium_nand()

- changes for v4:
  - add comment from Lukasz Majewski:
- move ubi var to internal struct struct nand_internal_data
---
 drivers/dfu/dfu_nand.c | 58  
++

 include/dfu.h  |  2 ++
 2 Dateien geändert, 60 Zeilen hinzugefügt(+)

diff --git a/drivers/dfu/dfu_nand.c b/drivers/dfu/dfu_nand.c
index 07dee89..c0f8adf 100644
--- a/drivers/dfu/dfu_nand.c
+++ b/drivers/dfu/dfu_nand.c
@@ -148,11 +148,43 @@ static int dfu_read_medium_nand(struct  
dfu_entity *dfu, u64 offset, void *buf,

return ret;
 }

+static int dfu_flush_medium_nand(struct dfu_entity *dfu)
+{
+   int ret = 0;
+
+   /* in case of ubi partition, erase rest of the partition */


Did you have a chance to investigate the errors you saw when erasing  
the whole partition up front?  If there's other DFU data in the  
partition that needs to be preserved, then replace partition with  
area reserved for this image.


-Scott
___
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot


Re: [U-Boot] [PATCH v4] dfu, nand, ubi: add partubi alt settings for updating ubi partition

2013-07-19 Thread Lukasz Majewski
On Fri, 19 Jul 2013 06:32:14 +0200 Heiko Schocher h...@denx.de wrote,

Hi Heiko,

 updating an ubi partition needs a completely erased mtd partition,
 see:
 http://lists.infradead.org/pipermail/linux-mtd/2011-May/035416.html
 
 So, add partubi alt setting for the dfu_alt_info environment
 variable to mark this partition as an ubi partition. In case we
 update an ubi partition, we erase after flashing the image into the
 partition, the remaining sektors.

I've tested it on Trats. This patch seems to be orthogonal and doesn't
interfere with eMMC.

Tested-by: Lukasz Majewski l.majew...@samsung.com
Ack-by: Lukasz Majewski l.majew...@samsung.com



 
 Signed-off-by: Heiko Schocher h...@denx.de
 Cc: Pantelis Antoniou pa...@antoniou-consulting.com
 Cc: Tom Rini tr...@ti.com
 Cc: Lukasz Majewski l.majew...@samsung.com
 Cc: Kyungmin Park kyungmin.p...@samsung.com
 Cc: Marek Vasut ma...@denx.de
 Cc: Wolfgang Denk w...@denx.de
 
 ---
 
 - This patch is also a good starting point to fix up updating ubi, as
   we currently use nand erase for erasing the sektors. This is
   not the prefered way for writing an ubi image, see:
   http://www.linux-mtd.infradead.org/faq/ubi.html#L_flash_img
 
   This must be fixed ... we have no ubiformat in u-boot, or?
 
 - changes for v2:
   - do not use spread = 1 for nand_erase_opts, to prevent
 errormessage if there are bad blocks in the erase range.
 
 - changes for v3:
   - add comment from Marek Vasut:
 - prevent losing memory
   - added comment from Lukasz Majewski:
 - move code to dfu_nand.c dfu_flush_medium_nand()
 
 - changes for v4:
   - add comment from Lukasz Majewski:
 - move ubi var to internal struct struct nand_internal_data
 ---
  drivers/dfu/dfu_nand.c | 58
 ++
 include/dfu.h  |  2 ++ 2 Dateien geändert, 60 Zeilen
 hinzugefügt(+)
 
 diff --git a/drivers/dfu/dfu_nand.c b/drivers/dfu/dfu_nand.c
 index 07dee89..c0f8adf 100644
 --- a/drivers/dfu/dfu_nand.c
 +++ b/drivers/dfu/dfu_nand.c
 @@ -148,11 +148,43 @@ static int dfu_read_medium_nand(struct
 dfu_entity *dfu, u64 offset, void *buf, return ret;
  }
  
 +static int dfu_flush_medium_nand(struct dfu_entity *dfu)
 +{
 + int ret = 0;
 +
 + /* in case of ubi partition, erase rest of the partition */
 + if (dfu-data.nand.ubi) {
 + nand_info_t *nand;
 + nand_erase_options_t opts;
 +
 + if (nand_curr_device  0 ||
 + nand_curr_device = CONFIG_SYS_MAX_NAND_DEVICE ||
 + !nand_info[nand_curr_device].name) {
 + printf(%s: invalid nand device\n,
 __func__);
 + return -1;
 + }
 +
 + nand = nand_info[nand_curr_device];
 +
 + memset(opts, 0, sizeof(opts));
 + opts.offset = dfu-data.nand.start + dfu-offset +
 + dfu-bad_skip;
 + opts.length = dfu-data.nand.start +
 + dfu-data.nand.size - opts.offset;
 + ret = nand_erase_opts(nand, opts);
 + if (ret != 0)
 + printf(Failure erase: %d\n, ret);
 + }
 +
 + return ret;
 +}
 +
  int dfu_fill_entity_nand(struct dfu_entity *dfu, char *s)
  {
   char *st;
   int ret, dev, part;
  
 + dfu-data.nand.ubi = 0;
   dfu-dev_type = DFU_DEV_NAND;
   st = strsep(s,  );
   if (!strcmp(st, raw)) {
 @@ -185,7 +217,32 @@ int dfu_fill_entity_nand(struct dfu_entity *dfu,
 char *s) 
   dfu-data.nand.start = pi-offset;
   dfu-data.nand.size = pi-size;
 + } else if (!strcmp(st, partubi)) {
 + char mtd_id[32];
 + struct mtd_device *mtd_dev;
 + u8 part_num;
 + struct part_info *pi;
  
 + dfu-layout = DFU_RAW_ADDR;
 +
 + dev = simple_strtoul(s, s, 10);
 + s++;
 + part = simple_strtoul(s, s, 10);
 +
 + sprintf(mtd_id, %s%d,%d, nand, dev, part - 1);
 + printf(using id '%s'\n, mtd_id);
 +
 + mtdparts_init();
 +
 + ret = find_dev_and_part(mtd_id, mtd_dev, part_num,
 pi);
 + if (ret != 0) {
 + printf(Could not locate '%s'\n, mtd_id);
 + return -1;
 + }
 +
 + dfu-data.nand.start = pi-offset;
 + dfu-data.nand.size = pi-size;
 + dfu-data.nand.ubi = 1;
   } else {
   printf(%s: Memory layout (%s) not supported!\n,
 __func__, st); return -1;
 @@ -193,6 +250,7 @@ int dfu_fill_entity_nand(struct dfu_entity *dfu,
 char *s) 
   dfu-read_medium = dfu_read_medium_nand;
   dfu-write_medium = dfu_write_medium_nand;
 + dfu-flush_medium = dfu_flush_medium_nand;
  
   /* initial state */
   dfu-inited = 0;
 diff --git a/include/dfu.h b/include/dfu.h
 index 124653c..4de7b34 100644
 --- a/include/dfu.h
 +++ b/include/dfu.h
 @@ -59,6 +59,8 @@ struct 

Re: [U-Boot] [PATCH v4] dfu, nand, ubi: add partubi alt settings for updating ubi partition

2013-07-19 Thread Marek Vasut
Dear Lukasz Majewski,

 On Fri, 19 Jul 2013 06:32:14 +0200 Heiko Schocher h...@denx.de wrote,
 
 Hi Heiko,
 
  updating an ubi partition needs a completely erased mtd partition,
  see:
  http://lists.infradead.org/pipermail/linux-mtd/2011-May/035416.html
  
  So, add partubi alt setting for the dfu_alt_info environment
  variable to mark this partition as an ubi partition. In case we
  update an ubi partition, we erase after flashing the image into the
  partition, the remaining sektors.
 
 I've tested it on Trats. This patch seems to be orthogonal and doesn't
 interfere with eMMC.
 
 Tested-by: Lukasz Majewski l.majew...@samsung.com
 Ack-by: Lukasz Majewski l.majew...@samsung.com

I'll wait for Scott's ACK and then pick this, ok?

Best regards,
Marek Vasut
___
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot


[U-Boot] [PATCH v4] dfu, nand, ubi: add partubi alt settings for updating ubi partition

2013-07-18 Thread Heiko Schocher
updating an ubi partition needs a completely erased mtd partition,
see:
http://lists.infradead.org/pipermail/linux-mtd/2011-May/035416.html

So, add partubi alt setting for the dfu_alt_info environment
variable to mark this partition as an ubi partition. In case we
update an ubi partition, we erase after flashing the image into the
partition, the remaining sektors.

Signed-off-by: Heiko Schocher h...@denx.de
Cc: Pantelis Antoniou pa...@antoniou-consulting.com
Cc: Tom Rini tr...@ti.com
Cc: Lukasz Majewski l.majew...@samsung.com
Cc: Kyungmin Park kyungmin.p...@samsung.com
Cc: Marek Vasut ma...@denx.de
Cc: Wolfgang Denk w...@denx.de

---

- This patch is also a good starting point to fix up updating ubi, as
  we currently use nand erase for erasing the sektors. This is
  not the prefered way for writing an ubi image, see:
  http://www.linux-mtd.infradead.org/faq/ubi.html#L_flash_img

  This must be fixed ... we have no ubiformat in u-boot, or?

- changes for v2:
  - do not use spread = 1 for nand_erase_opts, to prevent
errormessage if there are bad blocks in the erase range.

- changes for v3:
  - add comment from Marek Vasut:
- prevent losing memory
  - added comment from Lukasz Majewski:
- move code to dfu_nand.c dfu_flush_medium_nand()

- changes for v4:
  - add comment from Lukasz Majewski:
- move ubi var to internal struct struct nand_internal_data
---
 drivers/dfu/dfu_nand.c | 58 ++
 include/dfu.h  |  2 ++
 2 Dateien geändert, 60 Zeilen hinzugefügt(+)

diff --git a/drivers/dfu/dfu_nand.c b/drivers/dfu/dfu_nand.c
index 07dee89..c0f8adf 100644
--- a/drivers/dfu/dfu_nand.c
+++ b/drivers/dfu/dfu_nand.c
@@ -148,11 +148,43 @@ static int dfu_read_medium_nand(struct dfu_entity *dfu, 
u64 offset, void *buf,
return ret;
 }
 
+static int dfu_flush_medium_nand(struct dfu_entity *dfu)
+{
+   int ret = 0;
+
+   /* in case of ubi partition, erase rest of the partition */
+   if (dfu-data.nand.ubi) {
+   nand_info_t *nand;
+   nand_erase_options_t opts;
+
+   if (nand_curr_device  0 ||
+   nand_curr_device = CONFIG_SYS_MAX_NAND_DEVICE ||
+   !nand_info[nand_curr_device].name) {
+   printf(%s: invalid nand device\n, __func__);
+   return -1;
+   }
+
+   nand = nand_info[nand_curr_device];
+
+   memset(opts, 0, sizeof(opts));
+   opts.offset = dfu-data.nand.start + dfu-offset +
+   dfu-bad_skip;
+   opts.length = dfu-data.nand.start +
+   dfu-data.nand.size - opts.offset;
+   ret = nand_erase_opts(nand, opts);
+   if (ret != 0)
+   printf(Failure erase: %d\n, ret);
+   }
+
+   return ret;
+}
+
 int dfu_fill_entity_nand(struct dfu_entity *dfu, char *s)
 {
char *st;
int ret, dev, part;
 
+   dfu-data.nand.ubi = 0;
dfu-dev_type = DFU_DEV_NAND;
st = strsep(s,  );
if (!strcmp(st, raw)) {
@@ -185,7 +217,32 @@ int dfu_fill_entity_nand(struct dfu_entity *dfu, char *s)
 
dfu-data.nand.start = pi-offset;
dfu-data.nand.size = pi-size;
+   } else if (!strcmp(st, partubi)) {
+   char mtd_id[32];
+   struct mtd_device *mtd_dev;
+   u8 part_num;
+   struct part_info *pi;
 
+   dfu-layout = DFU_RAW_ADDR;
+
+   dev = simple_strtoul(s, s, 10);
+   s++;
+   part = simple_strtoul(s, s, 10);
+
+   sprintf(mtd_id, %s%d,%d, nand, dev, part - 1);
+   printf(using id '%s'\n, mtd_id);
+
+   mtdparts_init();
+
+   ret = find_dev_and_part(mtd_id, mtd_dev, part_num, pi);
+   if (ret != 0) {
+   printf(Could not locate '%s'\n, mtd_id);
+   return -1;
+   }
+
+   dfu-data.nand.start = pi-offset;
+   dfu-data.nand.size = pi-size;
+   dfu-data.nand.ubi = 1;
} else {
printf(%s: Memory layout (%s) not supported!\n, __func__, st);
return -1;
@@ -193,6 +250,7 @@ int dfu_fill_entity_nand(struct dfu_entity *dfu, char *s)
 
dfu-read_medium = dfu_read_medium_nand;
dfu-write_medium = dfu_write_medium_nand;
+   dfu-flush_medium = dfu_flush_medium_nand;
 
/* initial state */
dfu-inited = 0;
diff --git a/include/dfu.h b/include/dfu.h
index 124653c..4de7b34 100644
--- a/include/dfu.h
+++ b/include/dfu.h
@@ -59,6 +59,8 @@ struct nand_internal_data {
 
unsigned int dev;
unsigned int part;
+   /* for nand/ubi use */
+   unsigned int ubi;
 };
 
 static inline unsigned int get_mmc_blk_size(int dev)
-- 
1.7.11.7

___
U-Boot mailing list