All of lore.kernel.org
 help / color / mirror / Atom feed
* [U-Boot] [PATCH v1] usb: gadget: f_dfu: write req->actual bytes
       [not found] <de749db9-9d5c-4777-b4e9-2c0dd1840cb8@email.android.com>
@ 2017-02-13 11:42 ` Felipe Balbi
  2017-02-13 13:41   ` Lukasz Majewski
  0 siblings, 1 reply; 13+ messages in thread
From: Felipe Balbi @ 2017-02-13 11:42 UTC (permalink / raw)
  To: u-boot


Hi Lukasz,

Lukasz Majewski <lukma@denx.de> writes:
> Hi Felipe,
>
> Thanks for the patch.
> Please see my comments below.
>
> On 13 Feb 2017 11:42 am, Felipe Balbi <felipe.balbi@linux.intel.com> wrote:
>
>  Hi, 
>
>  Marek Vasut <marex@denx.de> writes: 
>  > On 02/10/2017 05:32 PM, Andy Shevchenko wrote: 
>  >> From: Felipe Balbi <felipe.balbi@linux.intel.com> 
>  >> 
>  >> If last packet is short, we shouldn't write req->length bytes to 
>  >> non-volatile media, we should write only what's available to us, which 
>  >> is held in req->actual. 
>  >> 
>  >> Signed-off-by: Felipe Balbi <felipe.balbi@linux.intel.com> 
>  >> Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com> 
>  > 
>  > Since I have no clue about DFU internals, I will wait for Lukasz's Ack. 
>
>  you don't need to have any clues about DFU internals to realise that 
>  this fixes an actual bug, see below: 
>
> I don't know your exact use case. Please keep in mind that we most

eMMC :-)

> work on NAND and eMMC, which require the whole block write.

Well, then the file should have been padded already before sending it
over USB, right? :-)

You shouldn't write req->length if you don't receive req->length as you
are, potentially, writing garbage to the storage medium :-)

> However, I will setup test environment (after changing the job it was
> gone), test your patch and then let you know.

cool

>  >> drivers/usb/gadget/f_dfu.c | 2 +- 
>  >> 1 file changed, 1 insertion(+), 1 deletion(-) 
>  >> 
>  >> diff --git a/drivers/usb/gadget/f_dfu.c b/drivers/usb/gadget/f_dfu.c 
>  >> index 8e7c981657..64cdfa7c98 100644 
>  >> --- a/drivers/usb/gadget/f_dfu.c 
>  >> +++ b/drivers/usb/gadget/f_dfu.c 
>  >> @@ -159,7 +159,7 @@ static void dnload_request_complete(struct usb_ep *ep, struct usb_request *req) 
>  >> int ret; 
>  >> 
>  >> ret = dfu_write(dfu_get_entity(f_dfu->altsetting), req->buf, 
>  >> - req->length, f_dfu->blk_seq_num); 
>  >> + req->actual, f_dfu->blk_seq_num); 
>
>  DFU driver queues a request to USB controller. Per the gadget API 
>  req->length contains maximum amount of data to be 
>  transmitted. req->actual is written by USB controller with the actual 
>  amount of data that we transmitted. 
>
>  In the case of IN (TX), upon completion req->length and req->actual 
>  should always be equal (unless errors show up, etc) 
>
>  In the case of OUT (RX), upon completion req->actual MAY BE less than 
>  req->length and that's not an error. Say host sent us a short packet 
>  which causes early termination of transfer. 
>
>  With that in mind, let's consider the situation where we're receiving 
>  data from host using DFU. Let's assume that we have a 4096 byte buffer 
>  for transfers and we're receiving a binary that's 7679 bytes in size. 
>
>  Here's what we will do (pseudo-code): 
>
>  int remaining = 7679; 
>  char buf[4096]; 
>
>  while (remaining) { 
>  req->length = 4096; 
>  req->buf = buf; 
>  usb_ep_queue(req); 
>
>  /* wait for completion */ 
>
>  remaining -= req->actual; 
>
>  dfu_write(buf, req->length); /* this is the error */ 
>  } 
>
>  Can you see here that in the last packet we will write 4096 bytes when 
>  we should write only 3583? 
>
> In principle you are right. I need to check if this change will not
> introduce regressions.
>
> Can you share your use case?

Intel Edison running v2017.03-rc1 + patches (see [1]), flashing
u-boot.bin over DFU (see [2] for details). Without $subject, image has
to be aligned to 4096 bytes as below:

$ dd if=u-boot.bin of=u-boot-4k.bin bs=4k seek=1 && truncate -s %4096 u-boot-4k.bin

With $subject, I don't need truncate. We still need the 4096 byte of
zeroes in the beginning of the image for other reasons (which I really
don't know why at this point).

[1] https://github.com/andy-shev/u-boot/tree/edison
[2] https://communities.intel.com/message/435516#435516

-- 
balbi
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 832 bytes
Desc: not available
URL: <http://lists.denx.de/pipermail/u-boot/attachments/20170213/233a9b20/attachment.sig>

^ permalink raw reply	[flat|nested] 13+ messages in thread

* [U-Boot] [PATCH v1] usb: gadget: f_dfu: write req->actual bytes
  2017-02-13 11:42 ` [U-Boot] [PATCH v1] usb: gadget: f_dfu: write req->actual bytes Felipe Balbi
@ 2017-02-13 13:41   ` Lukasz Majewski
  2017-02-13 15:02     ` Andy Shevchenko
  2017-02-21 11:17     ` Felipe Balbi
  0 siblings, 2 replies; 13+ messages in thread
From: Lukasz Majewski @ 2017-02-13 13:41 UTC (permalink / raw)
  To: u-boot

Hi Felipe,

> 
> Hi Lukasz,
> 
> Lukasz Majewski <lukma@denx.de> writes:
> > Hi Felipe,
> >
> > Thanks for the patch.
> > Please see my comments below.
> >
> > On 13 Feb 2017 11:42 am, Felipe Balbi
> > <felipe.balbi@linux.intel.com> wrote:
> >
> >  Hi, 
> >
> >  Marek Vasut <marex@denx.de> writes: 
> >  > On 02/10/2017 05:32 PM, Andy Shevchenko wrote: 
> >  >> From: Felipe Balbi <felipe.balbi@linux.intel.com> 
> >  >> 
> >  >> If last packet is short, we shouldn't write req->length bytes
> >  >> to non-volatile media, we should write only what's available to
> >  >> us, which is held in req->actual. 
> >  >> 
> >  >> Signed-off-by: Felipe Balbi <felipe.balbi@linux.intel.com> 
> >  >> Signed-off-by: Andy Shevchenko
> >  >> <andriy.shevchenko@linux.intel.com> 
> >  > 
> >  > Since I have no clue about DFU internals, I will wait for
> >  > Lukasz's Ack. 
> >
> >  you don't need to have any clues about DFU internals to realise
> > that this fixes an actual bug, see below: 
> >
> > I don't know your exact use case. Please keep in mind that we most
> 
> eMMC :-)

Ok.

> 
> > work on NAND and eMMC, which require the whole block write.
> 
> Well, then the file should have been padded already before sending it
> over USB, right? :-)
> 
> You shouldn't write req->length if you don't receive req->length as
> you are, potentially, writing garbage to the storage medium :-)

Yes. Correct....

> 
> > However, I will setup test environment (after changing the job it
> > was gone), test your patch and then let you know.
> 
> cool
> 
> >  >> drivers/usb/gadget/f_dfu.c | 2 +- 
> >  >> 1 file changed, 1 insertion(+), 1 deletion(-) 
> >  >> 
> >  >> diff --git a/drivers/usb/gadget/f_dfu.c
> >  >> b/drivers/usb/gadget/f_dfu.c index 8e7c981657..64cdfa7c98
> >  >> 100644 --- a/drivers/usb/gadget/f_dfu.c 
> >  >> +++ b/drivers/usb/gadget/f_dfu.c 
> >  >> @@ -159,7 +159,7 @@ static void dnload_request_complete(struct
> >  >> usb_ep *ep, struct usb_request *req) int ret; 
> >  >> 
> >  >> ret = dfu_write(dfu_get_entity(f_dfu->altsetting), req->buf, 
> >  >> - req->length, f_dfu->blk_seq_num); 
> >  >> + req->actual, f_dfu->blk_seq_num); 
> >
> >  DFU driver queues a request to USB controller. Per the gadget API 
> >  req->length contains maximum amount of data to be 
> >  transmitted. req->actual is written by USB controller with the
> > actual amount of data that we transmitted. 
> >
> >  In the case of IN (TX), upon completion req->length and
> > req->actual should always be equal (unless errors show up, etc) 
> >
> >  In the case of OUT (RX), upon completion req->actual MAY BE less
> > than req->length and that's not an error. Say host sent us a short
> > packet which causes early termination of transfer. 
> >
> >  With that in mind, let's consider the situation where we're
> > receiving data from host using DFU. Let's assume that we have a
> > 4096 byte buffer for transfers and we're receiving a binary that's
> > 7679 bytes in size. 
> >
> >  Here's what we will do (pseudo-code): 
> >
> >  int remaining = 7679; 
> >  char buf[4096]; 
> >
> >  while (remaining) { 
> >  req->length = 4096; 
> >  req->buf = buf; 
> >  usb_ep_queue(req); 
> >
> >  /* wait for completion */ 
> >
> >  remaining -= req->actual; 
> >
> >  dfu_write(buf, req->length); /* this is the error */ 
> >  } 
> >
> >  Can you see here that in the last packet we will write 4096 bytes
> > when we should write only 3583? 
> >
> > In principle you are right. I need to check if this change will not
> > introduce regressions.
> >
> > Can you share your use case?
> 
> Intel Edison running v2017.03-rc1 + patches (see [1]), flashing
> u-boot.bin over DFU (see [2] for details). Without $subject, image has
> to be aligned to 4096 bytes as below:
> 
> $ dd if=u-boot.bin of=u-boot-4k.bin bs=4k seek=1 && truncate -s %4096
> u-boot-4k.bin
> 
> With $subject, I don't need truncate. We still need the 4096 byte of
> zeroes in the beginning of the image for other reasons (which I really
> don't know why at this point).
> 
> [1] https://github.com/andy-shev/u-boot/tree/edison
> [2] https://communities.intel.com/message/435516#435516
> 

Ok. I will check this. Thanks for pointing out :-)



Best regards,

Lukasz Majewski

--

DENX Software Engineering GmbH,      Managing Director: Wolfgang Denk
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: wd at denx.de
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 181 bytes
Desc: OpenPGP digital signature
URL: <http://lists.denx.de/pipermail/u-boot/attachments/20170213/b8a5fe80/attachment.sig>

^ permalink raw reply	[flat|nested] 13+ messages in thread

* [U-Boot] [PATCH v1] usb: gadget: f_dfu: write req->actual bytes
  2017-02-13 13:41   ` Lukasz Majewski
@ 2017-02-13 15:02     ` Andy Shevchenko
  2017-02-21 11:17     ` Felipe Balbi
  1 sibling, 0 replies; 13+ messages in thread
From: Andy Shevchenko @ 2017-02-13 15:02 UTC (permalink / raw)
  To: u-boot

On Mon, 2017-02-13 at 14:41 +0100, Lukasz Majewski wrote:

> > [1] https://github.com/andy-shev/u-boot/tree/edison
> > [2] https://communities.intel.com/message/435516#435516
> > 
> 
> Ok. I will check this. Thanks for pointing out :-)

Just in case, mentioned branch is occasionally rebased, so, for "stable"
code I do tags with "edison" prefix.

-- 
Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Intel Finland Oy

^ permalink raw reply	[flat|nested] 13+ messages in thread

* [U-Boot] [PATCH v1] usb: gadget: f_dfu: write req->actual bytes
  2017-02-13 13:41   ` Lukasz Majewski
  2017-02-13 15:02     ` Andy Shevchenko
@ 2017-02-21 11:17     ` Felipe Balbi
  2017-02-21 11:58       ` Lukasz Majewski
  1 sibling, 1 reply; 13+ messages in thread
From: Felipe Balbi @ 2017-02-21 11:17 UTC (permalink / raw)
  To: u-boot


Hi Lukasz,

Lukasz Majewski <lukma@denx.de> writes:
>> >  >> drivers/usb/gadget/f_dfu.c | 2 +- 
>> >  >> 1 file changed, 1 insertion(+), 1 deletion(-) 
>> >  >> 
>> >  >> diff --git a/drivers/usb/gadget/f_dfu.c
>> >  >> b/drivers/usb/gadget/f_dfu.c index 8e7c981657..64cdfa7c98
>> >  >> 100644 --- a/drivers/usb/gadget/f_dfu.c 
>> >  >> +++ b/drivers/usb/gadget/f_dfu.c 
>> >  >> @@ -159,7 +159,7 @@ static void dnload_request_complete(struct
>> >  >> usb_ep *ep, struct usb_request *req) int ret; 
>> >  >> 
>> >  >> ret = dfu_write(dfu_get_entity(f_dfu->altsetting), req->buf, 
>> >  >> - req->length, f_dfu->blk_seq_num); 
>> >  >> + req->actual, f_dfu->blk_seq_num); 
>> >
>> >  DFU driver queues a request to USB controller. Per the gadget API 
>> >  req->length contains maximum amount of data to be 
>> >  transmitted. req->actual is written by USB controller with the
>> > actual amount of data that we transmitted. 
>> >
>> >  In the case of IN (TX), upon completion req->length and
>> > req->actual should always be equal (unless errors show up, etc) 
>> >
>> >  In the case of OUT (RX), upon completion req->actual MAY BE less
>> > than req->length and that's not an error. Say host sent us a short
>> > packet which causes early termination of transfer. 
>> >
>> >  With that in mind, let's consider the situation where we're
>> > receiving data from host using DFU. Let's assume that we have a
>> > 4096 byte buffer for transfers and we're receiving a binary that's
>> > 7679 bytes in size. 
>> >
>> >  Here's what we will do (pseudo-code): 
>> >
>> >  int remaining = 7679; 
>> >  char buf[4096]; 
>> >
>> >  while (remaining) { 
>> >  req->length = 4096; 
>> >  req->buf = buf; 
>> >  usb_ep_queue(req); 
>> >
>> >  /* wait for completion */ 
>> >
>> >  remaining -= req->actual; 
>> >
>> >  dfu_write(buf, req->length); /* this is the error */ 
>> >  } 
>> >
>> >  Can you see here that in the last packet we will write 4096 bytes
>> > when we should write only 3583? 
>> >
>> > In principle you are right. I need to check if this change will not
>> > introduce regressions.
>> >
>> > Can you share your use case?
>> 
>> Intel Edison running v2017.03-rc1 + patches (see [1]), flashing
>> u-boot.bin over DFU (see [2] for details). Without $subject, image has
>> to be aligned to 4096 bytes as below:
>> 
>> $ dd if=u-boot.bin of=u-boot-4k.bin bs=4k seek=1 && truncate -s %4096
>> u-boot-4k.bin
>> 
>> With $subject, I don't need truncate. We still need the 4096 byte of
>> zeroes in the beginning of the image for other reasons (which I really
>> don't know why at this point).
>> 
>> [1] https://github.com/andy-shev/u-boot/tree/edison
>> [2] https://communities.intel.com/message/435516#435516
>> 
>
> Ok. I will check this. Thanks for pointing out :-)

Any updates here? I'd like to send Tangier Soc and Intel Edison Board
support but I kinda depend on this patch making upstream. I can resend
as part of the "add intel edison" series.

Let me know

-- 
balbi
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 832 bytes
Desc: not available
URL: <http://lists.denx.de/pipermail/u-boot/attachments/20170221/f5cf04fc/attachment.sig>

^ permalink raw reply	[flat|nested] 13+ messages in thread

* [U-Boot] [PATCH v1] usb: gadget: f_dfu: write req->actual bytes
  2017-02-21 11:17     ` Felipe Balbi
@ 2017-02-21 11:58       ` Lukasz Majewski
  2017-02-21 12:58         ` Felipe Balbi
  0 siblings, 1 reply; 13+ messages in thread
From: Lukasz Majewski @ 2017-02-21 11:58 UTC (permalink / raw)
  To: u-boot

Hi Felipe,

> 
> Hi Lukasz,
> 
> Lukasz Majewski <lukma@denx.de> writes:
> >> >  >> drivers/usb/gadget/f_dfu.c | 2 +- 
> >> >  >> 1 file changed, 1 insertion(+), 1 deletion(-) 
> >> >  >> 
> >> >  >> diff --git a/drivers/usb/gadget/f_dfu.c
> >> >  >> b/drivers/usb/gadget/f_dfu.c index 8e7c981657..64cdfa7c98
> >> >  >> 100644 --- a/drivers/usb/gadget/f_dfu.c 
> >> >  >> +++ b/drivers/usb/gadget/f_dfu.c 
> >> >  >> @@ -159,7 +159,7 @@ static void
> >> >  >> dnload_request_complete(struct usb_ep *ep, struct
> >> >  >> usb_request *req) int ret; 
> >> >  >> 
> >> >  >> ret = dfu_write(dfu_get_entity(f_dfu->altsetting), req->buf, 
> >> >  >> - req->length, f_dfu->blk_seq_num); 
> >> >  >> + req->actual, f_dfu->blk_seq_num); 
> >> >
> >> >  DFU driver queues a request to USB controller. Per the gadget
> >> > API req->length contains maximum amount of data to be 
> >> >  transmitted. req->actual is written by USB controller with the
> >> > actual amount of data that we transmitted. 
> >> >
> >> >  In the case of IN (TX), upon completion req->length and
> >> > req->actual should always be equal (unless errors show up, etc) 
> >> >
> >> >  In the case of OUT (RX), upon completion req->actual MAY BE less
> >> > than req->length and that's not an error. Say host sent us a
> >> > short packet which causes early termination of transfer. 
> >> >
> >> >  With that in mind, let's consider the situation where we're
> >> > receiving data from host using DFU. Let's assume that we have a
> >> > 4096 byte buffer for transfers and we're receiving a binary
> >> > that's 7679 bytes in size. 
> >> >
> >> >  Here's what we will do (pseudo-code): 
> >> >
> >> >  int remaining = 7679; 
> >> >  char buf[4096]; 
> >> >
> >> >  while (remaining) { 
> >> >  req->length = 4096; 
> >> >  req->buf = buf; 
> >> >  usb_ep_queue(req); 
> >> >
> >> >  /* wait for completion */ 
> >> >
> >> >  remaining -= req->actual; 
> >> >
> >> >  dfu_write(buf, req->length); /* this is the error */ 
> >> >  } 
> >> >
> >> >  Can you see here that in the last packet we will write 4096
> >> > bytes when we should write only 3583? 
> >> >
> >> > In principle you are right. I need to check if this change will
> >> > not introduce regressions.
> >> >
> >> > Can you share your use case?
> >> 
> >> Intel Edison running v2017.03-rc1 + patches (see [1]), flashing
> >> u-boot.bin over DFU (see [2] for details). Without $subject, image
> >> has to be aligned to 4096 bytes as below:
> >> 
> >> $ dd if=u-boot.bin of=u-boot-4k.bin bs=4k seek=1 && truncate -s
> >> %4096 u-boot-4k.bin
> >> 
> >> With $subject, I don't need truncate. We still need the 4096 byte
> >> of zeroes in the beginning of the image for other reasons (which I
> >> really don't know why at this point).
> >> 
> >> [1] https://github.com/andy-shev/u-boot/tree/edison
> >> [2] https://communities.intel.com/message/435516#435516
> >> 
> >
> > Ok. I will check this. Thanks for pointing out :-)
> 
> Any updates here? I'd like to send Tangier Soc and Intel Edison Board
> support but I kinda depend on this patch making upstream. I can resend
> as part of the "add intel edison" series.
> 
> Let me know

I'm setting up /test/py/dfu now on BBB. I will let you know by EOD.

> 




Best regards,

Lukasz Majewski

--

DENX Software Engineering GmbH,      Managing Director: Wolfgang Denk
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: wd at denx.de
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 181 bytes
Desc: OpenPGP digital signature
URL: <http://lists.denx.de/pipermail/u-boot/attachments/20170221/79a34d28/attachment.sig>

^ permalink raw reply	[flat|nested] 13+ messages in thread

* [U-Boot] [PATCH v1] usb: gadget: f_dfu: write req->actual bytes
  2017-02-21 11:58       ` Lukasz Majewski
@ 2017-02-21 12:58         ` Felipe Balbi
  2017-02-21 13:21           ` Lukasz Majewski
  0 siblings, 1 reply; 13+ messages in thread
From: Felipe Balbi @ 2017-02-21 12:58 UTC (permalink / raw)
  To: u-boot


Hi,

Lukasz Majewski <lukma@denx.de> writes:
>> Lukasz Majewski <lukma@denx.de> writes:
>> >> >  >> drivers/usb/gadget/f_dfu.c | 2 +- 
>> >> >  >> 1 file changed, 1 insertion(+), 1 deletion(-) 
>> >> >  >> 
>> >> >  >> diff --git a/drivers/usb/gadget/f_dfu.c
>> >> >  >> b/drivers/usb/gadget/f_dfu.c index 8e7c981657..64cdfa7c98
>> >> >  >> 100644 --- a/drivers/usb/gadget/f_dfu.c 
>> >> >  >> +++ b/drivers/usb/gadget/f_dfu.c 
>> >> >  >> @@ -159,7 +159,7 @@ static void
>> >> >  >> dnload_request_complete(struct usb_ep *ep, struct
>> >> >  >> usb_request *req) int ret; 
>> >> >  >> 
>> >> >  >> ret = dfu_write(dfu_get_entity(f_dfu->altsetting), req->buf, 
>> >> >  >> - req->length, f_dfu->blk_seq_num); 
>> >> >  >> + req->actual, f_dfu->blk_seq_num); 
>> >> >
>> >> >  DFU driver queues a request to USB controller. Per the gadget
>> >> > API req->length contains maximum amount of data to be 
>> >> >  transmitted. req->actual is written by USB controller with the
>> >> > actual amount of data that we transmitted. 
>> >> >
>> >> >  In the case of IN (TX), upon completion req->length and
>> >> > req->actual should always be equal (unless errors show up, etc) 
>> >> >
>> >> >  In the case of OUT (RX), upon completion req->actual MAY BE less
>> >> > than req->length and that's not an error. Say host sent us a
>> >> > short packet which causes early termination of transfer. 
>> >> >
>> >> >  With that in mind, let's consider the situation where we're
>> >> > receiving data from host using DFU. Let's assume that we have a
>> >> > 4096 byte buffer for transfers and we're receiving a binary
>> >> > that's 7679 bytes in size. 
>> >> >
>> >> >  Here's what we will do (pseudo-code): 
>> >> >
>> >> >  int remaining = 7679; 
>> >> >  char buf[4096]; 
>> >> >
>> >> >  while (remaining) { 
>> >> >  req->length = 4096; 
>> >> >  req->buf = buf; 
>> >> >  usb_ep_queue(req); 
>> >> >
>> >> >  /* wait for completion */ 
>> >> >
>> >> >  remaining -= req->actual; 
>> >> >
>> >> >  dfu_write(buf, req->length); /* this is the error */ 
>> >> >  } 
>> >> >
>> >> >  Can you see here that in the last packet we will write 4096
>> >> > bytes when we should write only 3583? 
>> >> >
>> >> > In principle you are right. I need to check if this change will
>> >> > not introduce regressions.
>> >> >
>> >> > Can you share your use case?
>> >> 
>> >> Intel Edison running v2017.03-rc1 + patches (see [1]), flashing
>> >> u-boot.bin over DFU (see [2] for details). Without $subject, image
>> >> has to be aligned to 4096 bytes as below:
>> >> 
>> >> $ dd if=u-boot.bin of=u-boot-4k.bin bs=4k seek=1 && truncate -s
>> >> %4096 u-boot-4k.bin
>> >> 
>> >> With $subject, I don't need truncate. We still need the 4096 byte
>> >> of zeroes in the beginning of the image for other reasons (which I
>> >> really don't know why at this point).
>> >> 
>> >> [1] https://github.com/andy-shev/u-boot/tree/edison
>> >> [2] https://communities.intel.com/message/435516#435516
>> >> 
>> >
>> > Ok. I will check this. Thanks for pointing out :-)
>> 
>> Any updates here? I'd like to send Tangier Soc and Intel Edison Board
>> support but I kinda depend on this patch making upstream. I can resend
>> as part of the "add intel edison" series.
>> 
>> Let me know
>
> I'm setting up /test/py/dfu now on BBB. I will let you know by EOD.

Here's what I used for testing:

#!/usr/bin/env ruby

$errors = 0
$success = 0
$total = 0

$initial_size = 64
$max_size = 8 * 1024 * 1024 # 8MiB
$current_size = $initial_size

def create_file(size)
  `dd if=/dev/zero of=file.bin bs=#{size} count=1 > /dev/null 2>&1`
end

def send_file(size)
  `dfu-util -v -d 8087:0a99 -D file.bin > /dev/null 2>&1`
end

def transmit(size)
  create_file(size)
  send_file(size)
end

def transmit_and_check(size)
  transmit(size)

  if $?.success?
       $success += 1
       print "."
  else
       $errors += 1
       print "F"
  end

  $total += 1
end

while $current_size <= $max_size do
  transmit_and_check($current_size - 1)
  transmit_and_check($current_size)
  transmit_and_check($current_size + 1)

  $current_size *= 2
end

puts "\n"
puts "Test Done"
puts "Successes: #{$success}"
puts "Failures:  #{$errors}"
puts "Total:     #{$total}"

-- 
balbi
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 832 bytes
Desc: not available
URL: <http://lists.denx.de/pipermail/u-boot/attachments/20170221/ca59e706/attachment-0001.sig>

^ permalink raw reply	[flat|nested] 13+ messages in thread

* [U-Boot] [PATCH v1] usb: gadget: f_dfu: write req->actual bytes
  2017-02-21 12:58         ` Felipe Balbi
@ 2017-02-21 13:21           ` Lukasz Majewski
  2017-02-21 15:46             ` Felipe Balbi
  0 siblings, 1 reply; 13+ messages in thread
From: Lukasz Majewski @ 2017-02-21 13:21 UTC (permalink / raw)
  To: u-boot

Hi.

> 
> Hi,
> 
> Lukasz Majewski <lukma@denx.de> writes:
> >> Lukasz Majewski <lukma@denx.de> writes:
> >> >> >  >> drivers/usb/gadget/f_dfu.c | 2 +- 
> >> >> >  >> 1 file changed, 1 insertion(+), 1 deletion(-) 
> >> >> >  >> 
> >> >> >  >> diff --git a/drivers/usb/gadget/f_dfu.c
> >> >> >  >> b/drivers/usb/gadget/f_dfu.c index 8e7c981657..64cdfa7c98
> >> >> >  >> 100644 --- a/drivers/usb/gadget/f_dfu.c 
> >> >> >  >> +++ b/drivers/usb/gadget/f_dfu.c 
> >> >> >  >> @@ -159,7 +159,7 @@ static void
> >> >> >  >> dnload_request_complete(struct usb_ep *ep, struct
> >> >> >  >> usb_request *req) int ret; 
> >> >> >  >> 
> >> >> >  >> ret = dfu_write(dfu_get_entity(f_dfu->altsetting),
> >> >> >  >> req->buf, 
> >> >> >  >> - req->length, f_dfu->blk_seq_num); 
> >> >> >  >> + req->actual, f_dfu->blk_seq_num); 
> >> >> >
> >> >> >  DFU driver queues a request to USB controller. Per the gadget
> >> >> > API req->length contains maximum amount of data to be 
> >> >> >  transmitted. req->actual is written by USB controller with
> >> >> > the actual amount of data that we transmitted. 
> >> >> >
> >> >> >  In the case of IN (TX), upon completion req->length and
> >> >> > req->actual should always be equal (unless errors show up,
> >> >> > etc) 
> >> >> >
> >> >> >  In the case of OUT (RX), upon completion req->actual MAY BE
> >> >> > less than req->length and that's not an error. Say host sent
> >> >> > us a short packet which causes early termination of transfer. 
> >> >> >
> >> >> >  With that in mind, let's consider the situation where we're
> >> >> > receiving data from host using DFU. Let's assume that we have
> >> >> > a 4096 byte buffer for transfers and we're receiving a binary
> >> >> > that's 7679 bytes in size. 
> >> >> >
> >> >> >  Here's what we will do (pseudo-code): 
> >> >> >
> >> >> >  int remaining = 7679; 
> >> >> >  char buf[4096]; 
> >> >> >
> >> >> >  while (remaining) { 
> >> >> >  req->length = 4096; 
> >> >> >  req->buf = buf; 
> >> >> >  usb_ep_queue(req); 
> >> >> >
> >> >> >  /* wait for completion */ 
> >> >> >
> >> >> >  remaining -= req->actual; 
> >> >> >
> >> >> >  dfu_write(buf, req->length); /* this is the error */ 
> >> >> >  } 
> >> >> >
> >> >> >  Can you see here that in the last packet we will write 4096
> >> >> > bytes when we should write only 3583? 
> >> >> >
> >> >> > In principle you are right. I need to check if this change
> >> >> > will not introduce regressions.
> >> >> >
> >> >> > Can you share your use case?
> >> >> 
> >> >> Intel Edison running v2017.03-rc1 + patches (see [1]), flashing
> >> >> u-boot.bin over DFU (see [2] for details). Without $subject,
> >> >> image has to be aligned to 4096 bytes as below:
> >> >> 
> >> >> $ dd if=u-boot.bin of=u-boot-4k.bin bs=4k seek=1 && truncate -s
> >> >> %4096 u-boot-4k.bin
> >> >> 
> >> >> With $subject, I don't need truncate. We still need the 4096
> >> >> byte of zeroes in the beginning of the image for other reasons
> >> >> (which I really don't know why at this point).
> >> >> 
> >> >> [1] https://github.com/andy-shev/u-boot/tree/edison
> >> >> [2] https://communities.intel.com/message/435516#435516
> >> >> 
> >> >
> >> > Ok. I will check this. Thanks for pointing out :-)
> >> 
> >> Any updates here? I'd like to send Tangier Soc and Intel Edison
> >> Board support but I kinda depend on this patch making upstream. I
> >> can resend as part of the "add intel edison" series.
> >> 
> >> Let me know
> >
> > I'm setting up /test/py/dfu now on BBB. I will let you know by EOD.
> 
> Here's what I used for testing:

I do appreciate that you tested it - even better, that with different
approach.

However, some time ago Stephen Warren has rewritten tests for DFU, UMS
to use some python infrastructure. Those tests (especially DFU, test
corner cases - ZLP, +/-1B to packet size, etc).

If you want, you can add your board to them.

More info ./test/py {dfu, ums} and ./Documentation.

(Or you can wait a bit, so I will share my "fresh" BBB setup).

Best regards,
?ukasz

> 
> #!/usr/bin/env ruby
> 
> $errors = 0
> $success = 0
> $total = 0
> 
> $initial_size = 64
> $max_size = 8 * 1024 * 1024 # 8MiB
> $current_size = $initial_size
> 
> def create_file(size)
>   `dd if=/dev/zero of=file.bin bs=#{size} count=1 > /dev/null 2>&1`
> end
> 
> def send_file(size)
>   `dfu-util -v -d 8087:0a99 -D file.bin > /dev/null 2>&1`
> end
> 
> def transmit(size)
>   create_file(size)
>   send_file(size)
> end
> 
> def transmit_and_check(size)
>   transmit(size)
> 
>   if $?.success?
>        $success += 1
>        print "."
>   else
>        $errors += 1
>        print "F"
>   end
> 
>   $total += 1
> end
> 
> while $current_size <= $max_size do
>   transmit_and_check($current_size - 1)
>   transmit_and_check($current_size)
>   transmit_and_check($current_size + 1)
> 
>   $current_size *= 2
> end
> 
> puts "\n"
> puts "Test Done"
> puts "Successes: #{$success}"
> puts "Failures:  #{$errors}"
> puts "Total:     #{$total}"
> 




Best regards,

Lukasz Majewski

--

DENX Software Engineering GmbH,      Managing Director: Wolfgang Denk
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: wd at denx.de
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 181 bytes
Desc: OpenPGP digital signature
URL: <http://lists.denx.de/pipermail/u-boot/attachments/20170221/b74f4fc9/attachment.sig>

^ permalink raw reply	[flat|nested] 13+ messages in thread

* [U-Boot] [PATCH v1] usb: gadget: f_dfu: write req->actual bytes
  2017-02-21 13:21           ` Lukasz Majewski
@ 2017-02-21 15:46             ` Felipe Balbi
  2017-02-21 22:31               ` Lukasz Majewski
  0 siblings, 1 reply; 13+ messages in thread
From: Felipe Balbi @ 2017-02-21 15:46 UTC (permalink / raw)
  To: u-boot


Hi,

Lukasz Majewski <lukma@denx.de> writes:
>> Lukasz Majewski <lukma@denx.de> writes:
>> >> Lukasz Majewski <lukma@denx.de> writes:
>> >> >> >  >> drivers/usb/gadget/f_dfu.c | 2 +- 
>> >> >> >  >> 1 file changed, 1 insertion(+), 1 deletion(-) 
>> >> >> >  >> 
>> >> >> >  >> diff --git a/drivers/usb/gadget/f_dfu.c
>> >> >> >  >> b/drivers/usb/gadget/f_dfu.c index 8e7c981657..64cdfa7c98
>> >> >> >  >> 100644 --- a/drivers/usb/gadget/f_dfu.c 
>> >> >> >  >> +++ b/drivers/usb/gadget/f_dfu.c 
>> >> >> >  >> @@ -159,7 +159,7 @@ static void
>> >> >> >  >> dnload_request_complete(struct usb_ep *ep, struct
>> >> >> >  >> usb_request *req) int ret; 
>> >> >> >  >> 
>> >> >> >  >> ret = dfu_write(dfu_get_entity(f_dfu->altsetting),
>> >> >> >  >> req->buf, 
>> >> >> >  >> - req->length, f_dfu->blk_seq_num); 
>> >> >> >  >> + req->actual, f_dfu->blk_seq_num); 
>> >> >> >
>> >> >> >  DFU driver queues a request to USB controller. Per the gadget
>> >> >> > API req->length contains maximum amount of data to be 
>> >> >> >  transmitted. req->actual is written by USB controller with
>> >> >> > the actual amount of data that we transmitted. 
>> >> >> >
>> >> >> >  In the case of IN (TX), upon completion req->length and
>> >> >> > req->actual should always be equal (unless errors show up,
>> >> >> > etc) 
>> >> >> >
>> >> >> >  In the case of OUT (RX), upon completion req->actual MAY BE
>> >> >> > less than req->length and that's not an error. Say host sent
>> >> >> > us a short packet which causes early termination of transfer. 
>> >> >> >
>> >> >> >  With that in mind, let's consider the situation where we're
>> >> >> > receiving data from host using DFU. Let's assume that we have
>> >> >> > a 4096 byte buffer for transfers and we're receiving a binary
>> >> >> > that's 7679 bytes in size. 
>> >> >> >
>> >> >> >  Here's what we will do (pseudo-code): 
>> >> >> >
>> >> >> >  int remaining = 7679; 
>> >> >> >  char buf[4096]; 
>> >> >> >
>> >> >> >  while (remaining) { 
>> >> >> >  req->length = 4096; 
>> >> >> >  req->buf = buf; 
>> >> >> >  usb_ep_queue(req); 
>> >> >> >
>> >> >> >  /* wait for completion */ 
>> >> >> >
>> >> >> >  remaining -= req->actual; 
>> >> >> >
>> >> >> >  dfu_write(buf, req->length); /* this is the error */ 
>> >> >> >  } 
>> >> >> >
>> >> >> >  Can you see here that in the last packet we will write 4096
>> >> >> > bytes when we should write only 3583? 
>> >> >> >
>> >> >> > In principle you are right. I need to check if this change
>> >> >> > will not introduce regressions.
>> >> >> >
>> >> >> > Can you share your use case?
>> >> >> 
>> >> >> Intel Edison running v2017.03-rc1 + patches (see [1]), flashing
>> >> >> u-boot.bin over DFU (see [2] for details). Without $subject,
>> >> >> image has to be aligned to 4096 bytes as below:
>> >> >> 
>> >> >> $ dd if=u-boot.bin of=u-boot-4k.bin bs=4k seek=1 && truncate -s
>> >> >> %4096 u-boot-4k.bin
>> >> >> 
>> >> >> With $subject, I don't need truncate. We still need the 4096
>> >> >> byte of zeroes in the beginning of the image for other reasons
>> >> >> (which I really don't know why at this point).
>> >> >> 
>> >> >> [1] https://github.com/andy-shev/u-boot/tree/edison
>> >> >> [2] https://communities.intel.com/message/435516#435516
>> >> >> 
>> >> >
>> >> > Ok. I will check this. Thanks for pointing out :-)
>> >> 
>> >> Any updates here? I'd like to send Tangier Soc and Intel Edison
>> >> Board support but I kinda depend on this patch making upstream. I
>> >> can resend as part of the "add intel edison" series.
>> >> 
>> >> Let me know
>> >
>> > I'm setting up /test/py/dfu now on BBB. I will let you know by EOD.
>> 
>> Here's what I used for testing:
>
> I do appreciate that you tested it - even better, that with different
> approach.
>
> However, some time ago Stephen Warren has rewritten tests for DFU, UMS
> to use some python infrastructure. Those tests (especially DFU, test
> corner cases - ZLP, +/-1B to packet size, etc).

that's exactly what I tested :-)

> If you want, you can add your board to them.

I'll see how to do that and maybe add to the TODO list

-- 
balbi

^ permalink raw reply	[flat|nested] 13+ messages in thread

* [U-Boot] [PATCH v1] usb: gadget: f_dfu: write req->actual bytes
  2017-02-21 15:46             ` Felipe Balbi
@ 2017-02-21 22:31               ` Lukasz Majewski
  2017-02-22  9:21                 ` Felipe Balbi
  0 siblings, 1 reply; 13+ messages in thread
From: Lukasz Majewski @ 2017-02-21 22:31 UTC (permalink / raw)
  To: u-boot

Hi Felipe,

> 
> Hi,
> 
> Lukasz Majewski <lukma@denx.de> writes:
> >> Lukasz Majewski <lukma@denx.de> writes:
> >> >> Lukasz Majewski <lukma@denx.de> writes:
> >> >> >> >  >> drivers/usb/gadget/f_dfu.c | 2 +- 
> >> >> >> >  >> 1 file changed, 1 insertion(+), 1 deletion(-) 
> >> >> >> >  >> 
> >> >> >> >  >> diff --git a/drivers/usb/gadget/f_dfu.c
> >> >> >> >  >> b/drivers/usb/gadget/f_dfu.c index
> >> >> >> >  >> 8e7c981657..64cdfa7c98 100644 ---
> >> >> >> >  >> a/drivers/usb/gadget/f_dfu.c +++
> >> >> >> >  >> b/drivers/usb/gadget/f_dfu.c @@ -159,7 +159,7 @@
> >> >> >> >  >> static void dnload_request_complete(struct usb_ep *ep,
> >> >> >> >  >> struct usb_request *req) int ret; 
> >> >> >> >  >> 
> >> >> >> >  >> ret = dfu_write(dfu_get_entity(f_dfu->altsetting),
> >> >> >> >  >> req->buf, 
> >> >> >> >  >> - req->length, f_dfu->blk_seq_num); 
> >> >> >> >  >> + req->actual, f_dfu->blk_seq_num); 
> >> >> >> >
> >> >> >> >  DFU driver queues a request to USB controller. Per the
> >> >> >> > gadget API req->length contains maximum amount of data to
> >> >> >> > be transmitted. req->actual is written by USB controller
> >> >> >> > with the actual amount of data that we transmitted. 
> >> >> >> >
> >> >> >> >  In the case of IN (TX), upon completion req->length and
> >> >> >> > req->actual should always be equal (unless errors show up,
> >> >> >> > etc) 
> >> >> >> >
> >> >> >> >  In the case of OUT (RX), upon completion req->actual MAY
> >> >> >> > BE less than req->length and that's not an error. Say host
> >> >> >> > sent us a short packet which causes early termination of
> >> >> >> > transfer. 
> >> >> >> >
> >> >> >> >  With that in mind, let's consider the situation where
> >> >> >> > we're receiving data from host using DFU. Let's assume
> >> >> >> > that we have a 4096 byte buffer for transfers and we're
> >> >> >> > receiving a binary that's 7679 bytes in size. 
> >> >> >> >
> >> >> >> >  Here's what we will do (pseudo-code): 
> >> >> >> >
> >> >> >> >  int remaining = 7679; 
> >> >> >> >  char buf[4096]; 
> >> >> >> >
> >> >> >> >  while (remaining) { 
> >> >> >> >  req->length = 4096; 
> >> >> >> >  req->buf = buf; 
> >> >> >> >  usb_ep_queue(req); 
> >> >> >> >
> >> >> >> >  /* wait for completion */ 
> >> >> >> >
> >> >> >> >  remaining -= req->actual; 
> >> >> >> >
> >> >> >> >  dfu_write(buf, req->length); /* this is the error */ 
> >> >> >> >  } 
> >> >> >> >
> >> >> >> >  Can you see here that in the last packet we will write
> >> >> >> > 4096 bytes when we should write only 3583? 
> >> >> >> >
> >> >> >> > In principle you are right. I need to check if this change
> >> >> >> > will not introduce regressions.
> >> >> >> >
> >> >> >> > Can you share your use case?
> >> >> >> 
> >> >> >> Intel Edison running v2017.03-rc1 + patches (see [1]),
> >> >> >> flashing u-boot.bin over DFU (see [2] for details). Without
> >> >> >> $subject, image has to be aligned to 4096 bytes as below:
> >> >> >> 
> >> >> >> $ dd if=u-boot.bin of=u-boot-4k.bin bs=4k seek=1 && truncate
> >> >> >> -s %4096 u-boot-4k.bin
> >> >> >> 
> >> >> >> With $subject, I don't need truncate. We still need the 4096
> >> >> >> byte of zeroes in the beginning of the image for other
> >> >> >> reasons (which I really don't know why at this point).
> >> >> >> 
> >> >> >> [1] https://github.com/andy-shev/u-boot/tree/edison
> >> >> >> [2] https://communities.intel.com/message/435516#435516
> >> >> >> 
> >> >> >
> >> >> > Ok. I will check this. Thanks for pointing out :-)
> >> >> 
> >> >> Any updates here? I'd like to send Tangier Soc and Intel Edison
> >> >> Board support but I kinda depend on this patch making upstream.
> >> >> I can resend as part of the "add intel edison" series.
> >> >> 
> >> >> Let me know
> >> >
> >> > I'm setting up /test/py/dfu now on BBB. I will let you know by
> >> > EOD.
> >> 
> >> Here's what I used for testing:
> >
> > I do appreciate that you tested it - even better, that with
> > different approach.
> >
> > However, some time ago Stephen Warren has rewritten tests for DFU,
> > UMS to use some python infrastructure. Those tests (especially DFU,
> > test corner cases - ZLP, +/-1B to packet size, etc).
> 
> that's exactly what I tested :-)
> 
> > If you want, you can add your board to them.
> 
> I'll see how to do that and maybe add to the TODO list
> 

Acked-by: Lukasz Majewski <lukma@denx.de>

Tested-by: Lukasz Majewski <lukma@denx.de>

Test HW: BBB (am335x) - with tests/py/dfu

I've added your patch to u-boot-dfu tree. I will send PR tomorrow.

You may also want to look into patches from Patrick Delaunay (those
also will be added to PR):

http://patchwork.ozlabs.org/patch/704131/
http://patchwork.ozlabs.org/patch/706492/
http://patchwork.ozlabs.org/patch/706493/



Best regards,

Lukasz Majewski

--

DENX Software Engineering GmbH,      Managing Director: Wolfgang Denk
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: wd at denx.de

^ permalink raw reply	[flat|nested] 13+ messages in thread

* [U-Boot] [PATCH v1] usb: gadget: f_dfu: write req->actual bytes
  2017-02-21 22:31               ` Lukasz Majewski
@ 2017-02-22  9:21                 ` Felipe Balbi
  0 siblings, 0 replies; 13+ messages in thread
From: Felipe Balbi @ 2017-02-22  9:21 UTC (permalink / raw)
  To: u-boot


Hi,

Lukasz Majewski <lukma@denx.de> writes:

[snip]

>> > I do appreciate that you tested it - even better, that with
>> > different approach.
>> >
>> > However, some time ago Stephen Warren has rewritten tests for DFU,
>> > UMS to use some python infrastructure. Those tests (especially DFU,
>> > test corner cases - ZLP, +/-1B to packet size, etc).
>> 
>> that's exactly what I tested :-)
>> 
>> > If you want, you can add your board to them.
>> 
>> I'll see how to do that and maybe add to the TODO list
>> 
>
> Acked-by: Lukasz Majewski <lukma@denx.de>
>
> Tested-by: Lukasz Majewski <lukma@denx.de>
>
> Test HW: BBB (am335x) - with tests/py/dfu
>
> I've added your patch to u-boot-dfu tree. I will send PR tomorrow.

yeah, cool thanks ;-)

> You may also want to look into patches from Patrick Delaunay (those
> also will be added to PR):
>
> http://patchwork.ozlabs.org/patch/704131/
> http://patchwork.ozlabs.org/patch/706492/
> http://patchwork.ozlabs.org/patch/706493/

they look fine to my eyes. I have two extra patches (coming shortly) to
make USB Command Verifier tool (from USB-IF) happy with our DFU
implementation.

-- 
balbi
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 832 bytes
Desc: not available
URL: <http://lists.denx.de/pipermail/u-boot/attachments/20170222/7552f501/attachment.sig>

^ permalink raw reply	[flat|nested] 13+ messages in thread

* [U-Boot] [PATCH v1] usb: gadget: f_dfu: write req->actual bytes
  2017-02-10 17:50 ` Marek Vasut
@ 2017-02-13 10:42   ` Felipe Balbi
  0 siblings, 0 replies; 13+ messages in thread
From: Felipe Balbi @ 2017-02-13 10:42 UTC (permalink / raw)
  To: u-boot


Hi,

Marek Vasut <marex@denx.de> writes:
> On 02/10/2017 05:32 PM, Andy Shevchenko wrote:
>> From: Felipe Balbi <felipe.balbi@linux.intel.com>
>> 
>> If last packet is short, we shouldn't write req->length bytes to
>> non-volatile media, we should write only what's available to us, which
>> is held in req->actual.
>> 
>> Signed-off-by: Felipe Balbi <felipe.balbi@linux.intel.com>
>> Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
>
> Since I have no clue about DFU internals, I will wait for Lukasz's Ack.

you don't need to have any clues about DFU internals to realise that
this fixes an actual bug, see below:

>>  drivers/usb/gadget/f_dfu.c | 2 +-
>>  1 file changed, 1 insertion(+), 1 deletion(-)
>> 
>> diff --git a/drivers/usb/gadget/f_dfu.c b/drivers/usb/gadget/f_dfu.c
>> index 8e7c981657..64cdfa7c98 100644
>> --- a/drivers/usb/gadget/f_dfu.c
>> +++ b/drivers/usb/gadget/f_dfu.c
>> @@ -159,7 +159,7 @@ static void dnload_request_complete(struct usb_ep *ep, struct usb_request *req)
>>  	int ret;
>>  
>>  	ret = dfu_write(dfu_get_entity(f_dfu->altsetting), req->buf,
>> -			req->length, f_dfu->blk_seq_num);
>> +			req->actual, f_dfu->blk_seq_num);

DFU driver queues a request to USB controller. Per the gadget API
req->length contains maximum amount of data to be
transmitted. req->actual is written by USB controller with the actual
amount of data that we transmitted.

In the case of IN (TX), upon completion req->length and req->actual
should always be equal (unless errors show up, etc)

In the case of OUT (RX), upon completion req->actual MAY BE less than
req->length and that's not an error. Say host sent us a short packet
which causes early termination of transfer.

With that in mind, let's consider the situation where we're receiving
data from host using DFU. Let's assume that we have a 4096 byte buffer
for transfers and we're receiving a binary that's 7679 bytes in size.

Here's what we will do (pseudo-code):

int remaining = 7679;
char buf[4096];

while (remaining) {
	req->length = 4096;
        req->buf = buf;
        usb_ep_queue(req);

        /* wait for completion */

        remaining -= req->actual;

        dfu_write(buf, req->length);  /* this is the error */
}

Can you see here that in the last packet we will write 4096 bytes when
we should write only 3583?

-- 
balbi
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 832 bytes
Desc: not available
URL: <http://lists.denx.de/pipermail/u-boot/attachments/20170213/9bebe731/attachment.sig>

^ permalink raw reply	[flat|nested] 13+ messages in thread

* [U-Boot] [PATCH v1] usb: gadget: f_dfu: write req->actual bytes
  2017-02-10 16:32 Andy Shevchenko
@ 2017-02-10 17:50 ` Marek Vasut
  2017-02-13 10:42   ` Felipe Balbi
  0 siblings, 1 reply; 13+ messages in thread
From: Marek Vasut @ 2017-02-10 17:50 UTC (permalink / raw)
  To: u-boot

On 02/10/2017 05:32 PM, Andy Shevchenko wrote:
> From: Felipe Balbi <felipe.balbi@linux.intel.com>
> 
> If last packet is short, we shouldn't write req->length bytes to
> non-volatile media, we should write only what's available to us, which
> is held in req->actual.
> 
> Signed-off-by: Felipe Balbi <felipe.balbi@linux.intel.com>
> Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>

Since I have no clue about DFU internals, I will wait for Lukasz's Ack.

> ---
>  drivers/usb/gadget/f_dfu.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/drivers/usb/gadget/f_dfu.c b/drivers/usb/gadget/f_dfu.c
> index 8e7c981657..64cdfa7c98 100644
> --- a/drivers/usb/gadget/f_dfu.c
> +++ b/drivers/usb/gadget/f_dfu.c
> @@ -159,7 +159,7 @@ static void dnload_request_complete(struct usb_ep *ep, struct usb_request *req)
>  	int ret;
>  
>  	ret = dfu_write(dfu_get_entity(f_dfu->altsetting), req->buf,
> -			req->length, f_dfu->blk_seq_num);
> +			req->actual, f_dfu->blk_seq_num);
>  	if (ret) {
>  		f_dfu->dfu_status = DFU_STATUS_errUNKNOWN;
>  		f_dfu->dfu_state = DFU_STATE_dfuERROR;
> 


-- 
Best regards,
Marek Vasut

^ permalink raw reply	[flat|nested] 13+ messages in thread

* [U-Boot] [PATCH v1] usb: gadget: f_dfu: write req->actual bytes
@ 2017-02-10 16:32 Andy Shevchenko
  2017-02-10 17:50 ` Marek Vasut
  0 siblings, 1 reply; 13+ messages in thread
From: Andy Shevchenko @ 2017-02-10 16:32 UTC (permalink / raw)
  To: u-boot

From: Felipe Balbi <felipe.balbi@linux.intel.com>

If last packet is short, we shouldn't write req->length bytes to
non-volatile media, we should write only what's available to us, which
is held in req->actual.

Signed-off-by: Felipe Balbi <felipe.balbi@linux.intel.com>
Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
---
 drivers/usb/gadget/f_dfu.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/usb/gadget/f_dfu.c b/drivers/usb/gadget/f_dfu.c
index 8e7c981657..64cdfa7c98 100644
--- a/drivers/usb/gadget/f_dfu.c
+++ b/drivers/usb/gadget/f_dfu.c
@@ -159,7 +159,7 @@ static void dnload_request_complete(struct usb_ep *ep, struct usb_request *req)
 	int ret;
 
 	ret = dfu_write(dfu_get_entity(f_dfu->altsetting), req->buf,
-			req->length, f_dfu->blk_seq_num);
+			req->actual, f_dfu->blk_seq_num);
 	if (ret) {
 		f_dfu->dfu_status = DFU_STATUS_errUNKNOWN;
 		f_dfu->dfu_state = DFU_STATE_dfuERROR;
-- 
2.11.0

^ permalink raw reply related	[flat|nested] 13+ messages in thread

end of thread, other threads:[~2017-02-22  9:21 UTC | newest]

Thread overview: 13+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
     [not found] <de749db9-9d5c-4777-b4e9-2c0dd1840cb8@email.android.com>
2017-02-13 11:42 ` [U-Boot] [PATCH v1] usb: gadget: f_dfu: write req->actual bytes Felipe Balbi
2017-02-13 13:41   ` Lukasz Majewski
2017-02-13 15:02     ` Andy Shevchenko
2017-02-21 11:17     ` Felipe Balbi
2017-02-21 11:58       ` Lukasz Majewski
2017-02-21 12:58         ` Felipe Balbi
2017-02-21 13:21           ` Lukasz Majewski
2017-02-21 15:46             ` Felipe Balbi
2017-02-21 22:31               ` Lukasz Majewski
2017-02-22  9:21                 ` Felipe Balbi
2017-02-10 16:32 Andy Shevchenko
2017-02-10 17:50 ` Marek Vasut
2017-02-13 10:42   ` Felipe Balbi

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.