[U-Boot] [PATCH] usb:gadget:f_thor: fix write to filesystem by add dfu_flush()

Since dfu read/write operations needs to be flushed manually, writing to filesystem on MMC by thor was broken. MMC raw write actually is working fine because current dfu_flush() function writes filesystem only. This commit adds dfu_flush() to f_thor and now filesystem write is working.
This change was tested on Trats2 board.
Signed-off-by: Przemyslaw Marczak p.marczak@samsung.com Cc: Lukasz Majewski l.majewski@samsung.com Cc: Marek Vasut marex@denx.de Cc: Heiko Schocher hs@denx.de Cc: Tom Rini trini@ti.com --- drivers/usb/gadget/f_thor.c | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-)
diff --git a/drivers/usb/gadget/f_thor.c b/drivers/usb/gadget/f_thor.c index f5c0224..ba47945 100644 --- a/drivers/usb/gadget/f_thor.c +++ b/drivers/usb/gadget/f_thor.c @@ -204,14 +204,14 @@ static long long int download_head(unsigned long long total,
static int download_tail(long long int left, int cnt) { + struct dfu_entity *dfu_entity = dfu_get_entity(alt_setting_num); void *transfer_buffer = dfu_get_buf(); int ret;
debug("%s: left: %llu cnt: %d\n", __func__, left, cnt);
if (left) { - ret = dfu_write(dfu_get_entity(alt_setting_num), - transfer_buffer, left, cnt++); + ret = dfu_write(dfu_entity, transfer_buffer, left, cnt++); if (ret) { error("DFU write failed [%d]: left: %llu", ret, left); return ret; @@ -225,11 +225,16 @@ static int download_tail(long long int left, int cnt) * This also frees memory malloc'ed by dfu_get_buf(), so no explicit * need fo call dfu_free_buf() is needed. */ - ret = dfu_write(dfu_get_entity(alt_setting_num), - transfer_buffer, 0, cnt); + ret = dfu_write(dfu_entity, transfer_buffer, 0, cnt); if (ret) error("DFU write failed [%d] cnt: %d", ret, cnt);
+ ret = dfu_flush(dfu_entity, transfer_buffer, 0, cnt); + if (ret) { + error("DFU flush failed!"); + return ret; + } + return ret; }

On Thursday, April 17, 2014 at 07:31:00 PM, Przemyslaw Marczak wrote:
Since dfu read/write operations needs to be flushed manually, writing to filesystem on MMC by thor was broken. MMC raw write actually is working fine because current dfu_flush() function writes filesystem only. This commit adds dfu_flush() to f_thor and now filesystem write is working.
This change was tested on Trats2 board.
Signed-off-by: Przemyslaw Marczak p.marczak@samsung.com Cc: Lukasz Majewski l.majewski@samsung.com Cc: Marek Vasut marex@denx.de Cc: Heiko Schocher hs@denx.de Cc: Tom Rini trini@ti.com
drivers/usb/gadget/f_thor.c | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-)
diff --git a/drivers/usb/gadget/f_thor.c b/drivers/usb/gadget/f_thor.c index f5c0224..ba47945 100644 --- a/drivers/usb/gadget/f_thor.c +++ b/drivers/usb/gadget/f_thor.c @@ -204,14 +204,14 @@ static long long int download_head(unsigned long long total,
static int download_tail(long long int left, int cnt) {
struct dfu_entity *dfu_entity = dfu_get_entity(alt_setting_num); void *transfer_buffer = dfu_get_buf(); int ret;
debug("%s: left: %llu cnt: %d\n", __func__, left, cnt);
if (left) {
ret = dfu_write(dfu_get_entity(alt_setting_num),
transfer_buffer, left, cnt++);
if (ret) { error("DFU write failed [%d]: left: %llu", ret, left); return ret;ret = dfu_write(dfu_entity, transfer_buffer, left, cnt++);
@@ -225,11 +225,16 @@ static int download_tail(long long int left, int cnt) * This also frees memory malloc'ed by dfu_get_buf(), so no explicit * need fo call dfu_free_buf() is needed. */
- ret = dfu_write(dfu_get_entity(alt_setting_num),
transfer_buffer, 0, cnt);
- ret = dfu_write(dfu_entity, transfer_buffer, 0, cnt); if (ret) error("DFU write failed [%d] cnt: %d", ret, cnt);
Please split this into two patches, one which does cleanup (that's the part above) and one which fixes the functionality (that's the part below).
- ret = dfu_flush(dfu_entity, transfer_buffer, 0, cnt);
- if (ret) {
error("DFU flush failed!");
return ret;
- }
- return ret;
}
Best regards, Marek Vasut

In thor's download_tail() function, dfu_get_entity() is called before each dfu_write() call and the returned entity pointers are the same. So dfu_get_entity() can be called just once and this patch changes this.
Signed-off-by: Przemyslaw Marczak p.marczak@samsung.com Cc: Lukasz Majewski l.majewski@samsung.com Cc: Marek Vasut marex@denx.de Cc: Heiko Schocher hs@denx.de Cc: Tom Rini trini@ti.com ---
Changes v2: - separate fix and cleanup into two commits
drivers/usb/gadget/f_thor.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-)
diff --git a/drivers/usb/gadget/f_thor.c b/drivers/usb/gadget/f_thor.c index f5c0224..231f9c0 100644 --- a/drivers/usb/gadget/f_thor.c +++ b/drivers/usb/gadget/f_thor.c @@ -204,14 +204,14 @@ static long long int download_head(unsigned long long total,
static int download_tail(long long int left, int cnt) { + struct dfu_entity *dfu_entity = dfu_get_entity(alt_setting_num); void *transfer_buffer = dfu_get_buf(); int ret;
debug("%s: left: %llu cnt: %d\n", __func__, left, cnt);
if (left) { - ret = dfu_write(dfu_get_entity(alt_setting_num), - transfer_buffer, left, cnt++); + ret = dfu_write(dfu_entity, transfer_buffer, left, cnt++); if (ret) { error("DFU write failed [%d]: left: %llu", ret, left); return ret; @@ -225,8 +225,7 @@ static int download_tail(long long int left, int cnt) * This also frees memory malloc'ed by dfu_get_buf(), so no explicit * need fo call dfu_free_buf() is needed. */ - ret = dfu_write(dfu_get_entity(alt_setting_num), - transfer_buffer, 0, cnt); + ret = dfu_write(dfu_entity, transfer_buffer, 0, cnt); if (ret) error("DFU write failed [%d] cnt: %d", ret, cnt);

Since dfu read/write operations needs to be flushed manually, writing to filesystem on MMC by thor was broken. MMC raw write actually is working fine because current dfu_flush() function writes filesystem only. This commit adds dfu_flush() to f_thor and now filesystem write is working.
This change was tested on Trats2 board.
Signed-off-by: Przemyslaw Marczak p.marczak@samsung.com Cc: Lukasz Majewski l.majewski@samsung.com Cc: Marek Vasut marex@denx.de Cc: Heiko Schocher hs@denx.de Cc: Tom Rini trini@ti.com ---
Changes v2: - separate fix and cleanup into two commits
drivers/usb/gadget/f_thor.c | 6 ++++++ 1 file changed, 6 insertions(+)
diff --git a/drivers/usb/gadget/f_thor.c b/drivers/usb/gadget/f_thor.c index 231f9c0..ba47945 100644 --- a/drivers/usb/gadget/f_thor.c +++ b/drivers/usb/gadget/f_thor.c @@ -229,6 +229,12 @@ static int download_tail(long long int left, int cnt) if (ret) error("DFU write failed [%d] cnt: %d", ret, cnt);
+ ret = dfu_flush(dfu_entity, transfer_buffer, 0, cnt); + if (ret) { + error("DFU flush failed!"); + return ret; + } + return ret; }

On Friday, April 18, 2014 at 09:48:25 AM, Przemyslaw Marczak wrote:
Since dfu read/write operations needs to be flushed manually, writing to filesystem on MMC by thor was broken. MMC raw write actually is working fine because current dfu_flush() function writes filesystem only. This commit adds dfu_flush() to f_thor and now filesystem write is working.
This change was tested on Trats2 board.
Signed-off-by: Przemyslaw Marczak p.marczak@samsung.com Cc: Lukasz Majewski l.majewski@samsung.com Cc: Marek Vasut marex@denx.de Cc: Heiko Schocher hs@denx.de Cc: Tom Rini trini@ti.com
Acked-by: Marek Vasut marex@denx.de
Best regards, Marek Vasut

On Friday, April 18, 2014 at 09:48:24 AM, Przemyslaw Marczak wrote:
In thor's download_tail() function, dfu_get_entity() is called before each dfu_write() call and the returned entity pointers are the same. So dfu_get_entity() can be called just once and this patch changes this.
Signed-off-by: Przemyslaw Marczak p.marczak@samsung.com Cc: Lukasz Majewski l.majewski@samsung.com Cc: Marek Vasut marex@denx.de Cc: Heiko Schocher hs@denx.de Cc: Tom Rini trini@ti.com
Acked-by: Marek Vasut marex@denx.de
Best regards, Marek Vasut

In thor's download_tail() function, dfu_get_entity() is called before each dfu_write() call and the returned entity pointers are the same. So dfu_get_entity() can be called just once and this patch changes this.
Signed-off-by: Przemyslaw Marczak p.marczak@samsung.com Cc: Lukasz Majewski l.majewski@samsung.com Cc: Marek Vasut marex@denx.de Cc: Heiko Schocher hs@denx.de Cc: Tom Rini trini@ti.com
--- Changes v2: - separate fix and cleanup into two commits
Changes v3: - download_tail(): add exit label --- drivers/usb/gadget/f_thor.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-)
diff --git a/drivers/usb/gadget/f_thor.c b/drivers/usb/gadget/f_thor.c index f5c0224..1190c74 100644 --- a/drivers/usb/gadget/f_thor.c +++ b/drivers/usb/gadget/f_thor.c @@ -204,17 +204,17 @@ static long long int download_head(unsigned long long total,
static int download_tail(long long int left, int cnt) { + struct dfu_entity *dfu_entity = dfu_get_entity(alt_setting_num); void *transfer_buffer = dfu_get_buf(); int ret;
debug("%s: left: %llu cnt: %d\n", __func__, left, cnt);
if (left) { - ret = dfu_write(dfu_get_entity(alt_setting_num), - transfer_buffer, left, cnt++); + ret = dfu_write(dfu_entity, transfer_buffer, left, cnt++); if (ret) { error("DFU write failed [%d]: left: %llu", ret, left); - return ret; + goto exit; } }
@@ -225,11 +225,11 @@ static int download_tail(long long int left, int cnt) * This also frees memory malloc'ed by dfu_get_buf(), so no explicit * need fo call dfu_free_buf() is needed. */ - ret = dfu_write(dfu_get_entity(alt_setting_num), - transfer_buffer, 0, cnt); + ret = dfu_write(dfu_entity, transfer_buffer, 0, cnt); if (ret) error("DFU write failed [%d] cnt: %d", ret, cnt);
+exit: return ret; }

Since dfu read/write operations needs to be flushed manually, writing to filesystem on MMC by thor was broken. MMC raw write actually is working fine because current dfu_flush() function writes filesystem only. This commit adds dfu_flush() to f_thor and now filesystem write is working.
This change was tested on Trats2 board.
Signed-off-by: Przemyslaw Marczak p.marczak@samsung.com Cc: Lukasz Majewski l.majewski@samsung.com Cc: Marek Vasut marex@denx.de Cc: Heiko Schocher hs@denx.de Cc: Tom Rini trini@ti.com
--- Changes v2: - separate fix and cleanup into two commits
Changes v3: - none
--- drivers/usb/gadget/f_thor.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-)
diff --git a/drivers/usb/gadget/f_thor.c b/drivers/usb/gadget/f_thor.c index 1190c74..1420606 100644 --- a/drivers/usb/gadget/f_thor.c +++ b/drivers/usb/gadget/f_thor.c @@ -226,8 +226,14 @@ static int download_tail(long long int left, int cnt) * need fo call dfu_free_buf() is needed. */ ret = dfu_write(dfu_entity, transfer_buffer, 0, cnt); - if (ret) + if (ret) { error("DFU write failed [%d] cnt: %d", ret, cnt); + goto exit; + } + + ret = dfu_flush(dfu_entity, transfer_buffer, 0, cnt); + if (ret) + error("DFU flush failed!");
exit: return ret;

Hi Przemyslaw,
Since dfu read/write operations needs to be flushed manually, writing to filesystem on MMC by thor was broken. MMC raw write actually is working fine because current dfu_flush() function writes filesystem only. This commit adds dfu_flush() to f_thor and now filesystem write is working.
This change was tested on Trats2 board.
Signed-off-by: Przemyslaw Marczak p.marczak@samsung.com Cc: Lukasz Majewski l.majewski@samsung.com Cc: Marek Vasut marex@denx.de Cc: Heiko Schocher hs@denx.de Cc: Tom Rini trini@ti.com
Changes v2:
- separate fix and cleanup into two commits
Changes v3:
- none
drivers/usb/gadget/f_thor.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-)
diff --git a/drivers/usb/gadget/f_thor.c b/drivers/usb/gadget/f_thor.c index 1190c74..1420606 100644 --- a/drivers/usb/gadget/f_thor.c +++ b/drivers/usb/gadget/f_thor.c @@ -226,8 +226,14 @@ static int download_tail(long long int left, int cnt) * need fo call dfu_free_buf() is needed. */ ret = dfu_write(dfu_entity, transfer_buffer, 0, cnt);
I think this dfu_write() call can be now removed, since what we expect now is to call the dfu_flush() here.
After this change please accordingly update the above comment.
- if (ret)
- if (ret) { error("DFU write failed [%d] cnt: %d", ret, cnt);
goto exit;
- }
- ret = dfu_flush(dfu_entity, transfer_buffer, 0, cnt);
- if (ret)
error("DFU flush failed!");
exit: return ret;

On Wednesday, April 23, 2014 at 02:40:52 PM, Lukasz Majewski wrote:
Hi Przemyslaw,
Since dfu read/write operations needs to be flushed manually, writing to filesystem on MMC by thor was broken. MMC raw write actually is working fine because current dfu_flush() function writes filesystem only. This commit adds dfu_flush() to f_thor and now filesystem write is working.
This change was tested on Trats2 board.
Signed-off-by: Przemyslaw Marczak p.marczak@samsung.com Cc: Lukasz Majewski l.majewski@samsung.com Cc: Marek Vasut marex@denx.de Cc: Heiko Schocher hs@denx.de Cc: Tom Rini trini@ti.com
Please submit new patches on top of u-boot-usb/master , thanks.
Best regards, Marek Vasut

In thor's download_tail() function, dfu_get_entity() is called before each dfu_write() call and the returned entity pointers are the same. So dfu_get_entity() can be called just once and this patch changes this.
Signed-off-by: Przemyslaw Marczak p.marczak@samsung.com Cc: Lukasz Majewski l.majewski@samsung.com Cc: Marek Vasut marex@denx.de Cc: Heiko Schocher hs@denx.de Cc: Tom Rini trini@ti.com
--- Changes v2: - separate fix and cleanup into two commits
Changes v3: - download_tail(): add exit label
Changes v4: - none --- drivers/usb/gadget/f_thor.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-)
diff --git a/drivers/usb/gadget/f_thor.c b/drivers/usb/gadget/f_thor.c index f5c0224..1190c74 100644 --- a/drivers/usb/gadget/f_thor.c +++ b/drivers/usb/gadget/f_thor.c @@ -204,17 +204,17 @@ static long long int download_head(unsigned long long total,
static int download_tail(long long int left, int cnt) { + struct dfu_entity *dfu_entity = dfu_get_entity(alt_setting_num); void *transfer_buffer = dfu_get_buf(); int ret;
debug("%s: left: %llu cnt: %d\n", __func__, left, cnt);
if (left) { - ret = dfu_write(dfu_get_entity(alt_setting_num), - transfer_buffer, left, cnt++); + ret = dfu_write(dfu_entity, transfer_buffer, left, cnt++); if (ret) { error("DFU write failed [%d]: left: %llu", ret, left); - return ret; + goto exit; } }
@@ -225,11 +225,11 @@ static int download_tail(long long int left, int cnt) * This also frees memory malloc'ed by dfu_get_buf(), so no explicit * need fo call dfu_free_buf() is needed. */ - ret = dfu_write(dfu_get_entity(alt_setting_num), - transfer_buffer, 0, cnt); + ret = dfu_write(dfu_entity, transfer_buffer, 0, cnt); if (ret) error("DFU write failed [%d] cnt: %d", ret, cnt);
+exit: return ret; }

Since dfu read/write operations needs to be flushed manually, writing to filesystem on MMC by thor was broken. MMC raw write actually is working fine because current dfu_flush() function writes filesystem only. This commit adds dfu_flush() to f_thor and now filesystem write is working.
This change was tested on Trats2 board.
Signed-off-by: Przemyslaw Marczak p.marczak@samsung.com Cc: Lukasz Majewski l.majewski@samsung.com Cc: Marek Vasut marex@denx.de Cc: Heiko Schocher hs@denx.de Cc: Tom Rini trini@ti.com
--- Changes v2: - separate fix and cleanup into two commits
Changes v3: - none
Changes v4: - download_tail(): remove dfu_write with 0 size --- drivers/usb/gadget/f_thor.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/drivers/usb/gadget/f_thor.c b/drivers/usb/gadget/f_thor.c index 1190c74..a3ab6b9 100644 --- a/drivers/usb/gadget/f_thor.c +++ b/drivers/usb/gadget/f_thor.c @@ -219,15 +219,15 @@ static int download_tail(long long int left, int cnt) }
/* - * To store last "packet" DFU storage backend requires dfu_write with - * size parameter equal to 0 + * To store last "packet" or write file from buffer to filesystem + * DFU storage backend requires dfu_flush * * This also frees memory malloc'ed by dfu_get_buf(), so no explicit * need fo call dfu_free_buf() is needed. */ - ret = dfu_write(dfu_entity, transfer_buffer, 0, cnt); + ret = dfu_flush(dfu_entity, transfer_buffer, 0, cnt); if (ret) - error("DFU write failed [%d] cnt: %d", ret, cnt); + error("DFU flush failed!");
exit: return ret;

Before dfu write and flush operations separation, dfu write data was flushed by host download request with len of zero size.
Since above change manually calling dfu write with zero size has non sense (e.g. in THOR). This should be done by flush operation. So now dfu_write_buffer_drain() is called in dfu_flush(). If there is any raw data to flush (like it can be in thor) then it will be physically written to medium.
Signed-off-by: Przemyslaw Marczak p.marczak@samsung.com
--- Changes v4: - new commit --- drivers/dfu/dfu.c | 4 ++++ 1 file changed, 4 insertions(+)
diff --git a/drivers/dfu/dfu.c b/drivers/dfu/dfu.c index 8a09aaf..94e9116 100644 --- a/drivers/dfu/dfu.c +++ b/drivers/dfu/dfu.c @@ -131,6 +131,10 @@ int dfu_flush(struct dfu_entity *dfu, void *buf, int size, int blk_seq_num) { int ret = 0;
+ ret = dfu_write_buffer_drain(dfu); + if (ret) + return ret; + if (dfu->flush_medium) ret = dfu->flush_medium(dfu);

Hello Heiko,
On 04/28/2014 06:57 PM, Przemyslaw Marczak wrote:
In thor's download_tail() function, dfu_get_entity() is called before each dfu_write() call and the returned entity pointers are the same. So dfu_get_entity() can be called just once and this patch changes this.
Signed-off-by: Przemyslaw Marczak p.marczak@samsung.com Cc: Lukasz Majewski l.majewski@samsung.com Cc: Marek Vasut marex@denx.de Cc: Heiko Schocher hs@denx.de Cc: Tom Rini trini@ti.com
Changes v2:
- separate fix and cleanup into two commits
Changes v3:
- download_tail(): add exit label
Changes v4:
- none
Could you look at those changes, please?
Thank you

Hello Marek,
On 04/28/2014 06:57 PM, Przemyslaw Marczak wrote:
In thor's download_tail() function, dfu_get_entity() is called before each dfu_write() call and the returned entity pointers are the same. So dfu_get_entity() can be called just once and this patch changes this.
Signed-off-by: Przemyslaw Marczak p.marczak@samsung.com Cc: Lukasz Majewski l.majewski@samsung.com Cc: Marek Vasut marex@denx.de Cc: Heiko Schocher hs@denx.de Cc: Tom Rini trini@ti.com
Changes v2:
- separate fix and cleanup into two commits
Changes v3:
- download_tail(): add exit label
Changes v4:
- none
I've checked the u-boot-usb/master tree and I found that one commit of this patch set is missed, because it is v3 (there was only two commits). Could you please apply the patch set version 4?
Thank you,

Hi Przemyslaw, Marek,
Hello Marek,
On 04/28/2014 06:57 PM, Przemyslaw Marczak wrote:
In thor's download_tail() function, dfu_get_entity() is called before each dfu_write() call and the returned entity pointers are the same. So dfu_get_entity() can be called just once and this patch changes this.
Signed-off-by: Przemyslaw Marczak p.marczak@samsung.com Cc: Lukasz Majewski l.majewski@samsung.com Cc: Marek Vasut marex@denx.de Cc: Heiko Schocher hs@denx.de Cc: Tom Rini trini@ti.com
Changes v2:
- separate fix and cleanup into two commits
Changes v3:
- download_tail(): add exit label
Changes v4:
- none
I've checked the u-boot-usb/master tree and I found that one commit of this patch set is missed, because it is v3 (there was only two commits). Could you please apply the patch set version 4?
I've discussed this issue with Przemek, and we agreed that Przemek will prepare diff patch between version 3, which is already in mainline and version 4.
Then, after ML review, I will pull them to u-boot-dfu branch.
Marek, does it work for you?
Thank you,

On Friday, May 09, 2014 at 10:35:54 AM, Lukasz Majewski wrote:
Hi Przemyslaw, Marek,
Hello Marek,
On 04/28/2014 06:57 PM, Przemyslaw Marczak wrote:
In thor's download_tail() function, dfu_get_entity() is called before each dfu_write() call and the returned entity pointers are the same. So dfu_get_entity() can be called just once and this patch changes this.
Signed-off-by: Przemyslaw Marczak p.marczak@samsung.com Cc: Lukasz Majewski l.majewski@samsung.com Cc: Marek Vasut marex@denx.de Cc: Heiko Schocher hs@denx.de Cc: Tom Rini trini@ti.com
Changes v2:
- separate fix and cleanup into two commits
Changes v3:
- download_tail(): add exit label
Changes v4:
- none
I've checked the u-boot-usb/master tree and I found that one commit of this patch set is missed, because it is v3 (there was only two commits). Could you please apply the patch set version 4?
I've discussed this issue with Przemek, and we agreed that Przemek will prepare diff patch between version 3, which is already in mainline and version 4.
Then, after ML review, I will pull them to u-boot-dfu branch.
Marek, does it work for you?
Yes, thanks.
Best regards, Marek Vasut
participants (3)
-
Lukasz Majewski
-
Marek Vasut
-
Przemyslaw Marczak