s3c-otg: fastboot: fixes and cleanup
cover s3c-otg: fastboot: fixes and cleanup
Hi,
These are the patches discussed in the thread [1].
This should fix fastboot on boards using s3c-otg/dwc2 gadget controller.
[1] - https://www.mail-archive.com/u-boot at lists.denx.de/msg209740.html
NOTE: I haven't tested this extensively on TI platforms other than just a fastboot download command.
--
cheers,
-roger
Roger Quadros (3):
fastboot: Clean up bulk-out logic
usb: s3c-otg: Fix short packet for request size > ep.maxpacket
usb: s3c-otg: Fix remaining bytes in debug messages
drivers/usb/gadget/dwc2_udc_otg_xfer_dma.c | 6 ++-- drivers/usb/gadget/f_fastboot.c | 50 ++++++++++++++---------------- 2 files changed, 26 insertions(+), 30 deletions(-)
Signature · 1 line
2.5.0
PATCH 1/3 fastboot: Clean up bulk-out logic
Just use ep->maxpacket to get the maxpacket size
and simplify the bulk-out maxpacket alignment.
--- drivers/usb/gadget/f_fastboot.c | 50 +++++++++++++++++++---------------------- 1 file changed, 23 insertions(+), 27 deletions(-)
drivers/usb/gadget/f_fastboot.c +23 -27
@@ -39,6 +39,11 @@#define TX_ENDPOINT_MAXIMUM_PACKET_SIZE (0x0040)#define EP_BUFFER_SIZE 4096 +/* +* EP_BUFFER_SIZE must always be an integral multiple of maxpacket size +* (64 or 512 or 1024), else we break on certain controllers like DWC3 +* that expect bulk OUT requests to be divisible by maxpacket size. +*/ struct f_fastboot {struct usb_function usb_function;
@@ -57,7 +62,6 @@ static struct f_fastboot *fastboot_func;static unsigned int fastboot_flash_session_id;static unsigned int download_size;static unsigned int download_bytes; -static bool is_high_speed;static struct usb_endpoint_descriptor fs_ep_in = { .bLength =USB_DT_ENDPOINT_SIZE ,
@@ -269,11 +273,6 @@ static int fastboot_set_alt(struct usb_function *f,debug ("%s: func: %s intf: %d alt: %d\n" , __func__, f->name, interface, alt); -if (gadget->speed ==USB_SPEED_HIGH ) - is_high_speed = true; -else - is_high_speed = false; - d =fb_ep_desc (gadget, &fs_ep_out, &hs_ep_out); ret =usb_ep_enable (f_fb->out_ep, d);if (ret) {
@@ -455,20 +454,27 @@ static void cb_getvar(struct usb_ep *ep, struct usb_request *req)fastboot_tx_write_str (response); } -static unsigned int rx_bytes_expected (unsigned int maxpacket) +static unsigned int rx_bytes_expected (struct usb_ep *ep) {int rx_remain = download_size - download_bytes; -int rem =0 ; -if (rx_remain <0 ) +unsigned int rem; +unsigned int maxpacket = ep->maxpacket; + +if (rx_remain <=0 )return 0 ; -if (rx_remain >EP_BUFFER_SIZE ) +else if (rx_remain >EP_BUFFER_SIZE )return EP_BUFFER_SIZE ; -if (rx_remain < maxpacket) { - rx_remain = maxpacket; - }else if (rx_remain % maxpacket !=0 ) { - rem = rx_remain % maxpacket; + +/* +* Some controllers e.g. DWC3 don't like OUT transfers to be +* not ending in maxpacket boundary. So just make them happy by +* always requesting for integral multiple of maxpackets. +* This shouldn't bother controllers that don't care about it. +*/ + rem = rx_remain % maxpacket; +if (rem >0 ) rx_remain = rx_remain + (maxpacket - rem); - } +return rx_remain; }
@@ -480,7 +486,6 @@ static void rx_handler_dl_image(struct usb_ep *ep, struct usb_request *req)const unsigned char *buffer = req->buf;unsigned int buffer_size = req->actual;unsigned int pre_dot_num, now_dot_num; -unsigned int max;if (req->status !=0 ) {printf ("Bad status: %d\n" , req->status);
@@ -518,11 +523,7 @@ static void rx_handler_dl_image(struct usb_ep *ep, struct usb_request *req)printf ("\ndownloading of %d bytes finished\n" , download_bytes); }else { - max = is_high_speed ? hs_ep_out.wMaxPacketSize : - fs_ep_out.wMaxPacketSize; - req->length =rx_bytes_expected (max); -if (req->length < ep->maxpacket) - req->length = ep->maxpacket; + req->length =rx_bytes_expected (ep); } req->actual =0 ;
@@ -533,7 +534,6 @@ static void cb_download(struct usb_ep *ep, struct usb_request *req) {char *cmd = req->buf;char response[FASTBOOT_RESPONSE_LEN ]; -unsigned int max;strsep (&cmd,":" ); download_size =simple_strtoul (cmd,NULL ,16 );
@@ -549,11 +549,7 @@ static void cb_download(struct usb_ep *ep, struct usb_request *req) }else {sprintf (response,"DATA%08x" , download_size); req->complete = rx_handler_dl_image; - max = is_high_speed ? hs_ep_out.wMaxPacketSize : - fs_ep_out.wMaxPacketSize; - req->length =rx_bytes_expected (max); -if (req->length < ep->maxpacket) - req->length = ep->maxpacket; + req->length =rx_bytes_expected (ep); }fastboot_tx_write_str (response); }
Signature · 1 line
2.5.0
PATCH 1/3 fastboot: Clean up bulk-out logic
Hi Roger,
Quoted 119 lines
Just use
ep->maxpacketto get the maxpacket size
and simplify the bulk-out maxpacket alignment.Signed-off-by Roger Quadros <[email protected]>Tested-by Steve Rae <[email protected]>--- drivers/usb/gadget/f_fastboot.c | 50+++++++++++++++++++---------------------- 1 file changed, 23 insertions(+), 27 deletions(-)
(quoted diff) +0
-0
b/drivers/usb/gadget/f_fastboot.cindex 7961231..28b244a 100644drivers/usb/gadget/f_fastboot.c +2
-0@@ -39,6 +39,11 @@#define TX_ENDPOINT_MAXIMUM_PACKET_SIZE (0x0040)#define EP_BUFFER_SIZE 4096 +/* +* EP_BUFFER_SIZE must always be an integral multiple of maxpacket size
+ * (64 or 512 or 1024), else we break on certain controllers like DWC3
+ * that expect bulk OUT requests to be divisible by maxpacket size.
+ */struct
f_fastboot{drivers/usb/gadget/f_fastboot.c +10
-14struct usb_function usb_function;@@ -57,7 +62,6 @@ static struct f_fastboot *fastboot_func;static unsigned int fastboot_flash_session_id;static unsigned int download_size;static unsigned int download_bytes; -static bool is_high_speed;static struct usb_endpoint_descriptor fs_ep_in = { .bLength =USB_DT_ENDPOINT_SIZE ,@@ -269,11 +273,6 @@ static int fastboot_set_alt(struct usb_function *f,debug ("%s: func: %s intf: %d alt: %d\n" , __func__, f->name, interface, alt); -if (gadget->speed ==USB_SPEED_HIGH ) - is_high_speed = true; -else - is_high_speed = false; - d =fb_ep_desc (gadget, &fs_ep_out, &hs_ep_out); ret =usb_ep_enable (f_fb->out_ep, d);if (ret) {@@ -455,20 +454,27 @@ static void cb_getvar(struct usb_ep *ep, struct usb_request *req) fastboot_tx_write_str(response); } -static unsigned int rx_bytes_expected (unsigned int maxpacket) +static unsigned int rx_bytes_expected (struct usb_ep *ep) {int rx_remain = download_size - download_bytes; -int rem =0 ; -if (rx_remain <0 ) +unsigned int rem; +unsigned int maxpacket = ep->maxpacket; + +if (rx_remain <=0 )return 0 ; -if (rx_remain >EP_BUFFER_SIZE ) +else if (rx_remain >EP_BUFFER_SIZE )return EP_BUFFER_SIZE ; -if (rx_remain < maxpacket) { - rx_remain = maxpacket; - }else if (rx_remain % maxpacket !=0 ) { - rem = rx_remain % maxpacket; + +/* +* Some controllers e.g. DWC3 don't like OUT transfers to be +* not ending in maxpacket boundary. So just make them happy by
drivers/usb/gadget/f_fastboot.c +2
-0+* always requesting for integral multiple of maxpackets. +* This shouldn't bother controllers that don't care about it.
drivers/usb/gadget/f_fastboot.c +5
-8+*/ + rem = rx_remain % maxpacket; +if (rem >0 ) rx_remain = rx_remain + (maxpacket - rem); - } +return rx_remain; }@@ -480,7 +486,6 @@ static void rx_handler_dl_image(struct usb_ep *ep, struct usb_request *req) const unsigned char *buffer = req->buf;unsigned int buffer_size = req->actual;unsigned int pre_dot_num, now_dot_num; -unsigned int max;if (req->status !=0 ) {printf ("Bad status: %d\n" , req->status);@@ -518,11 +523,7 @@ static void rx_handler_dl_image(struct usb_ep *ep, struct usb_request *req)printf ("\ndownloading of %d bytes finished\n" , download_bytes); }else { - max = is_high_speed ? hs_ep_out.wMaxPacketSize : - fs_ep_out.wMaxPacketSize; - req->length =rx_bytes_expected (max); -if (req->length < ep->maxpacket) - req->length = ep->maxpacket; + req->length =rx_bytes_expected (ep); } req->actual =0 ;@@ -533,7 +534,6 @@ static void cb_download(struct usb_ep *ep, struct usb_request *req) {char *cmd = req->buf;char response[FASTBOOT_RESPONSE_LEN ]; -unsigned int max;strsep (&cmd,":" ); download_size =simple_strtoul (cmd,NULL ,16 );@@ -549,11 +549,7 @@ static void cb_download(struct usb_ep *ep, struct usb_request *req) } else {sprintf (response,"DATA%08x" , download_size);
drivers/usb/gadget/f_fastboot.c static void cb_download(struct usb_ep *ep, · line 555
Quoted 10 lines
drivers/usb/gadget/f_fastboot.c +1
-5req->complete = rx_handler_dl_image; - max = is_high_speed ? hs_ep_out.wMaxPacketSize : - fs_ep_out.wMaxPacketSize; - req->length =rx_bytes_expected (max); -if (req->length < ep->maxpacket) - req->length = ep->maxpacket; + req->length =rx_bytes_expected (ep); }fastboot_tx_write_str (response); }
Signature · 5 lines
Best regards, Lukasz Majewski Samsung R&D Institute Poland (SRPOL) | Linux Platform Group
PATCH 1/3 fastboot: Clean up bulk-out logic
In reply to Roger QuadrosHi Roger,
Quoted 119 lines
Just use
ep->maxpacketto get the maxpacket size
and simplify the bulk-out maxpacket alignment.Signed-off-by Roger Quadros <[email protected]>Tested-by Steve Rae <[email protected]>--- drivers/usb/gadget/f_fastboot.c | 50+++++++++++++++++++---------------------- 1 file changed, 23 insertions(+), 27 deletions(-)
(quoted diff) +0
-0
b/drivers/usb/gadget/f_fastboot.cindex 7961231..28b244a 100644drivers/usb/gadget/f_fastboot.c +2
-0@@ -39,6 +39,11 @@#define TX_ENDPOINT_MAXIMUM_PACKET_SIZE (0x0040)#define EP_BUFFER_SIZE 4096 +/* +* EP_BUFFER_SIZE must always be an integral multiple of maxpacket size
+ * (64 or 512 or 1024), else we break on certain controllers like DWC3
+ * that expect bulk OUT requests to be divisible by maxpacket size.
+ */struct
f_fastboot{drivers/usb/gadget/f_fastboot.c +10
-14struct usb_function usb_function;@@ -57,7 +62,6 @@ static struct f_fastboot *fastboot_func;static unsigned int fastboot_flash_session_id;static unsigned int download_size;static unsigned int download_bytes; -static bool is_high_speed;static struct usb_endpoint_descriptor fs_ep_in = { .bLength =USB_DT_ENDPOINT_SIZE ,@@ -269,11 +273,6 @@ static int fastboot_set_alt(struct usb_function *f,debug ("%s: func: %s intf: %d alt: %d\n" , __func__, f->name, interface, alt); -if (gadget->speed ==USB_SPEED_HIGH ) - is_high_speed = true; -else - is_high_speed = false; - d =fb_ep_desc (gadget, &fs_ep_out, &hs_ep_out); ret =usb_ep_enable (f_fb->out_ep, d);if (ret) {@@ -455,20 +454,27 @@ static void cb_getvar(struct usb_ep *ep, struct usb_request *req) fastboot_tx_write_str(response); } -static unsigned int rx_bytes_expected (unsigned int maxpacket) +static unsigned int rx_bytes_expected (struct usb_ep *ep) {int rx_remain = download_size - download_bytes; -int rem =0 ; -if (rx_remain <0 ) +unsigned int rem; +unsigned int maxpacket = ep->maxpacket; + +if (rx_remain <=0 )return 0 ; -if (rx_remain >EP_BUFFER_SIZE ) +else if (rx_remain >EP_BUFFER_SIZE )return EP_BUFFER_SIZE ; -if (rx_remain < maxpacket) { - rx_remain = maxpacket; - }else if (rx_remain % maxpacket !=0 ) { - rem = rx_remain % maxpacket; + +/* +* Some controllers e.g. DWC3 don't like OUT transfers to be +* not ending in maxpacket boundary. So just make them happy by
drivers/usb/gadget/f_fastboot.c +2
-0+* always requesting for integral multiple of maxpackets. +* This shouldn't bother controllers that don't care about it.
drivers/usb/gadget/f_fastboot.c +5
-8+*/ + rem = rx_remain % maxpacket; +if (rem >0 ) rx_remain = rx_remain + (maxpacket - rem); - } +return rx_remain; }@@ -480,7 +486,6 @@ static void rx_handler_dl_image(struct usb_ep *ep, struct usb_request *req) const unsigned char *buffer = req->buf;unsigned int buffer_size = req->actual;unsigned int pre_dot_num, now_dot_num; -unsigned int max;if (req->status !=0 ) {printf ("Bad status: %d\n" , req->status);@@ -518,11 +523,7 @@ static void rx_handler_dl_image(struct usb_ep *ep, struct usb_request *req)printf ("\ndownloading of %d bytes finished\n" , download_bytes); }else { - max = is_high_speed ? hs_ep_out.wMaxPacketSize : - fs_ep_out.wMaxPacketSize; - req->length =rx_bytes_expected (max); -if (req->length < ep->maxpacket) - req->length = ep->maxpacket; + req->length =rx_bytes_expected (ep); } req->actual =0 ;@@ -533,7 +534,6 @@ static void cb_download(struct usb_ep *ep, struct usb_request *req) {char *cmd = req->buf;char response[FASTBOOT_RESPONSE_LEN ]; -unsigned int max;strsep (&cmd,":" ); download_size =simple_strtoul (cmd,NULL ,16 );@@ -549,11 +549,7 @@ static void cb_download(struct usb_ep *ep, struct usb_request *req) } else {sprintf (response,"DATA%08x" , download_size);
drivers/usb/gadget/f_fastboot.c static void cb_download(struct usb_ep *ep, · line 555
Quoted 10 lines
drivers/usb/gadget/f_fastboot.c +1
-5req->complete = rx_handler_dl_image; - max = is_high_speed ? hs_ep_out.wMaxPacketSize : - fs_ep_out.wMaxPacketSize; - req->length =rx_bytes_expected (max); -if (req->length < ep->maxpacket) - req->length = ep->maxpacket; + req->length =rx_bytes_expected (ep); }fastboot_tx_write_str (response); }
I cannot apply this patch on temporary u-boot-usb/master branch (SHA1: e6c0bc0643e5a4387fecbcf83080d0b796eb067c).
Could you apply your changes (from this patch) on top of newest u-boot-usb repo?
Signature · 5 lines
Best regards, Lukasz Majewski Samsung R&D Institute Poland (SRPOL) | Linux Platform Group
PATCH 1/3 fastboot: Clean up bulk-out logic
Quoted 135 lines · Lukasz Majewski
Hi Roger,
Quoted 119 lines
Just use
ep->maxpacketto get the maxpacket size
and simplify the bulk-out maxpacket alignment.Signed-off-by Roger Quadros <[email protected]>Tested-by Steve Rae <[email protected]>--- drivers/usb/gadget/f_fastboot.c | 50+++++++++++++++++++---------------------- 1 file changed, 23 insertions(+), 27 deletions(-)
(quoted diff) +0
-0
b/drivers/usb/gadget/f_fastboot.cindex 7961231..28b244a 100644drivers/usb/gadget/f_fastboot.c +2
-0@@ -39,6 +39,11 @@#define TX_ENDPOINT_MAXIMUM_PACKET_SIZE (0x0040)#define EP_BUFFER_SIZE 4096 +/* +* EP_BUFFER_SIZE must always be an integral multiple of maxpacket size
+ * (64 or 512 or 1024), else we break on certain controllers like DWC3
+ * that expect bulk OUT requests to be divisible by maxpacket size.
+ */struct f_fastboot { struct usb_function usb_function;drivers/usb/gadget/f_fastboot.c +10
-14@@ -57,7 +62,6 @@ static struct f_fastboot *fastboot_func;static unsigned int fastboot_flash_session_id;static unsigned int download_size;static unsigned int download_bytes; -static bool is_high_speed;static struct usb_endpoint_descriptor fs_ep_in = { .bLength =USB_DT_ENDPOINT_SIZE ,@@ -269,11 +273,6 @@ static int fastboot_set_alt(struct usb_function *f,debug ("%s: func: %s intf: %d alt: %d\n" , __func__, f->name, interface, alt); -if (gadget->speed ==USB_SPEED_HIGH ) - is_high_speed = true; -else - is_high_speed = false; - d =fb_ep_desc (gadget, &fs_ep_out, &hs_ep_out); ret =usb_ep_enable (f_fb->out_ep, d);if (ret) {@@ -455,20 +454,27 @@ static void cb_getvar(struct usb_ep *ep, struct usb_request *req) fastboot_tx_write_str(response); } -static unsigned int rx_bytes_expected (unsigned int maxpacket) +static unsigned int rx_bytes_expected (struct usb_ep *ep) {int rx_remain = download_size - download_bytes; -int rem =0 ; -if (rx_remain <0 ) +unsigned int rem; +unsigned int maxpacket = ep->maxpacket; + +if (rx_remain <=0 )return 0 ; -if (rx_remain >EP_BUFFER_SIZE ) +else if (rx_remain >EP_BUFFER_SIZE )return EP_BUFFER_SIZE ; -if (rx_remain < maxpacket) { - rx_remain = maxpacket; - }else if (rx_remain % maxpacket !=0 ) { - rem = rx_remain % maxpacket; + +/* +* Some controllers e.g. DWC3 don't like OUT transfers to be +* not ending in maxpacket boundary. So just make them happy by
drivers/usb/gadget/f_fastboot.c +2
-0+* always requesting for integral multiple of maxpackets. +* This shouldn't bother controllers that don't care about it.
drivers/usb/gadget/f_fastboot.c +5
-8+*/ + rem = rx_remain % maxpacket; +if (rem >0 ) rx_remain = rx_remain + (maxpacket - rem); - } +return rx_remain; }@@ -480,7 +486,6 @@ static void rx_handler_dl_image(struct usb_ep *ep, struct usb_request *req) const unsigned char *buffer = req->buf;unsigned int buffer_size = req->actual;unsigned int pre_dot_num, now_dot_num; -unsigned int max;if (req->status !=0 ) {printf ("Bad status: %d\n" , req->status);@@ -518,11 +523,7 @@ static void rx_handler_dl_image(struct usb_ep *ep, struct usb_request *req)printf ("\ndownloading of %d bytes finished\n" , download_bytes); }else { - max = is_high_speed ? hs_ep_out.wMaxPacketSize : - fs_ep_out.wMaxPacketSize; - req->length =rx_bytes_expected (max); -if (req->length < ep->maxpacket) - req->length = ep->maxpacket; + req->length =rx_bytes_expected (ep); } req->actual =0 ;@@ -533,7 +534,6 @@ static void cb_download(struct usb_ep *ep, struct usb_request *req) {char *cmd = req->buf;char response[FASTBOOT_RESPONSE_LEN ]; -unsigned int max;strsep (&cmd,":" ); download_size =simple_strtoul (cmd,NULL ,16 );@@ -549,11 +549,7 @@ static void cb_download(struct usb_ep *ep, struct usb_request *req) } else {sprintf (response,"DATA%08x" , download_size);drivers/usb/gadget/f_fastboot.c static void cb_download(struct usb_ep *ep, · line 555
Quoted 10 lines
drivers/usb/gadget/f_fastboot.c +1
-5req->complete = rx_handler_dl_image; - max = is_high_speed ? hs_ep_out.wMaxPacketSize : - fs_ep_out.wMaxPacketSize; - req->length =rx_bytes_expected (max); -if (req->length < ep->maxpacket) - req->length = ep->maxpacket; + req->length =rx_bytes_expected (ep); }fastboot_tx_write_str (response); }I cannot apply this patch on temporary u-boot-usb/master branch (SHA1:
e6c0bc0643e5a4387fecbcf83080d0b796eb067c).
Quoted 4 lines
Could you apply your changes (from this patch) on top of newest u-boot-usb repo?
Lukasz, (in case Roger doesn't reply soon....)
-- this needs to be applied on top of his earlier patches:
(1) http://patchwork.ozlabs.org/patch/609417/
[U-Boot,1/2] fastboot: Fix wMaxPacketSize for High-Speed IN endpoint
(2) http://patchwork.ozlabs.org/patch/609896/
[U-Boot,v2,2/2] fastboot: Enable the respective speed endpoints at
runtime
... then this one will apply (http://patchwork.ozlabs.org/patch/612006/)
Thanks, Steve
--
Quoted 6 lines
Best regards,
Lukasz Majewski
Samsung R&D Institute Poland (SRPOL) | Linux Platform Group
PATCH 1/3 fastboot: Clean up bulk-out logic
Quoted 150 lines · On Thu, 21 Apr 2016 19:59:21 -0700 Steve Rae <[email protected]> wrote:
Quoted 136 lines · Lukasz Majewski
Hi Roger,
Quoted 120 lines
Just use
ep->maxpacketto get the maxpacket size
and simplify the bulk-out maxpacket alignment.Signed-off-by Roger Quadros <[email protected]>Tested-by Steve Rae <[email protected]>--- drivers/usb/gadget/f_fastboot.c | 50+++++++++++++++++++---------------------- 1 file changed, 23 insertions(+), 27 deletions(-)
(quoted diff) +0
-0
b/drivers/usb/gadget/f_fastboot.cindex 7961231..28b244a 100644drivers/usb/gadget/f_fastboot.c +2
-0@@ -39,6 +39,11 @@#define TX_ENDPOINT_MAXIMUM_PACKET_SIZE (0x0040)#define EP_BUFFER_SIZE 4096 +/* +* EP_BUFFER_SIZE must always be an integral multiple of maxpacket size
+ * (64 or 512 or 1024), else we break on certain controllers like DWC3
+ * that expect bulk OUT requests to be divisible by maxpacket size.
+ */struct f_fastboot { struct usb_function usb_function;drivers/usb/gadget/f_fastboot.c +10
-14@@ -57,7 +62,6 @@ static struct f_fastboot *fastboot_func;static unsigned int fastboot_flash_session_id;static unsigned int download_size;static unsigned int download_bytes; -static bool is_high_speed;static struct usb_endpoint_descriptor fs_ep_in = { .bLength =USB_DT_ENDPOINT_SIZE ,@@ -269,11 +273,6 @@ static int fastboot_set_alt(struct usb_function *f,debug ("%s: func: %s intf: %d alt: %d\n" , __func__, f->name, interface, alt); -if (gadget->speed ==USB_SPEED_HIGH ) - is_high_speed = true; -else - is_high_speed = false; - d =fb_ep_desc (gadget, &fs_ep_out, &hs_ep_out); ret =usb_ep_enable (f_fb->out_ep, d);if (ret) {@@ -455,20 +454,27 @@ static void cb_getvar(struct usb_ep *ep, struct usb_request *req) fastboot_tx_write_str(response); } -static unsigned int rx_bytes_expected (unsigned int maxpacket) +static unsigned int rx_bytes_expected (struct usb_ep *ep) {int rx_remain = download_size - download_bytes; -int rem =0 ; -if (rx_remain <0 ) +unsigned int rem; +unsigned int maxpacket = ep->maxpacket; + +if (rx_remain <=0 )return 0 ; -if (rx_remain >EP_BUFFER_SIZE ) +else if (rx_remain >EP_BUFFER_SIZE )return EP_BUFFER_SIZE ; -if (rx_remain < maxpacket) { - rx_remain = maxpacket; - }else if (rx_remain % maxpacket !=0 ) { - rem = rx_remain % maxpacket; + +/* +* Some controllers e.g. DWC3 don't like OUT transfers to be +* not ending in maxpacket boundary. So just make them happy by
drivers/usb/gadget/f_fastboot.c +2
-0+* always requesting for integral multiple of maxpackets. +* This shouldn't bother controllers that don't care about it.
drivers/usb/gadget/f_fastboot.c +5
-8+*/ + rem = rx_remain % maxpacket; +if (rem >0 ) rx_remain = rx_remain + (maxpacket - rem); - } +return rx_remain; }@@ -480,7 +486,6 @@ static void rx_handler_dl_image(struct usb_ep *ep, struct usb_request *req) const unsigned char *buffer = req->buf;unsigned int buffer_size = req->actual;unsigned int pre_dot_num, now_dot_num; -unsigned int max;if (req->status !=0 ) {printf ("Bad status: %d\n" , req->status);@@ -518,11 +523,7 @@ static void rx_handler_dl_image(struct usb_ep *ep, struct usb_request *req)printf ("\ndownloading of %d bytes finished\n" , download_bytes); }else { - max = is_high_speed ? hs_ep_out.wMaxPacketSize : - fs_ep_out.wMaxPacketSize; - req->length =rx_bytes_expected (max); -if (req->length < ep->maxpacket) - req->length = ep->maxpacket; + req->length =rx_bytes_expected (ep); } req->actual =0 ;@@ -533,7 +534,6 @@ static void cb_download(struct usb_ep *ep, struct usb_request *req) {char *cmd = req->buf;char response[FASTBOOT_RESPONSE_LEN ]; -unsigned int max;strsep (&cmd,":" ); download_size =simple_strtoul (cmd,NULL ,16 );@@ -549,11 +549,7 @@ static void cb_download(struct usb_ep *ep, struct usb_request *req) } else {sprintf (response,"DATA%08x" , download_size);drivers/usb/gadget/f_fastboot.c static void cb_download(struct usb_ep *ep, · line 555
Quoted 10 lines
drivers/usb/gadget/f_fastboot.c +1
-5req->complete = rx_handler_dl_image; - max = is_high_speed ? hs_ep_out.wMaxPacketSize : - fs_ep_out.wMaxPacketSize; - req->length =rx_bytes_expected (max); -if (req->length < ep->maxpacket) - req->length = ep->maxpacket; + req->length =rx_bytes_expected (ep); }fastboot_tx_write_str (response); }I cannot apply this patch on temporary u-boot-usb/master branch (SHA1:
e6c0bc0643e5a4387fecbcf83080d0b796eb067c).Quoted 4 lines
Could you apply your changes (from this patch) on top of newest u-boot-usb repo?
Lukasz, (in case Roger doesn't reply soon....)
-- this needs to be applied on top of his earlier patches:
(1) http://patchwork.ozlabs.org/patch/609417/
[U-Boot,1/2] fastboot: Fix wMaxPacketSize for High-Speed IN
endpoint (2) http://patchwork.ozlabs.org/patch/609896/
[U-Boot,v2,2/2] fastboot: Enable the respective speed
endpoints at runtime
Quoted 2 lines
... then this one will apply
(http://patchwork.ozlabs.org/patch/612006/)
Steve, thanks for tip. I was missing this information :-)
Best regards,
?ukasz
Quoted 6 lines
Thanks, Steve
--
Quoted 2 lines
Best regards,
Quoted 8 lines
Quoted 4 lines
Lukasz Majewski
Samsung R&D Institute Poland (SRPOL) | Linux Platform Group
_______________________________________________
U-Boot mailing list
U-Boot at lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot
-------------- 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/20160422/fc936c89/attachment.sig>
PATCH 2/3 usb: s3c-otg: Fix short packet for request size > ep.maxpacket
In reply to Roger QuadrosRequest size can be greater than ep.packet and still end in a short packet. We need to tackle this case as end of transfer (if short_not_ok is not set) as indicated in USB 2.0 Specification [1], else we get stuck up on certain protocols like fastboot.
[1] - USB2.0 Specification, Section 5.3.2 Pipes
--- drivers/usb/gadget/dwc2_udc_otg_xfer_dma.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/usb/gadget/dwc2_udc_otg_xfer_dma.c +1 -1
@@ -229,7 +229,7 @@ static void complete_rx(struct dwc2_udc *dev, u8 ep_num) ROUND(xfer_size, CONFIG_SYS_CACHELINE_SIZE)); req->req.actual +=min (xfer_size, req->req.length - req->req.actual); - is_short = (xfer_size < ep->ep.maxpacket); + is_short = xfer_size % ep->ep.maxpacket;debug_cond (DEBUG_OUT_EP !=0 , "%s: RX DMA done : ep = %d, rx bytes = %d/%d, "
Signature · 1 line
2.5.0
PATCH 2/3 usb: s3c-otg: Fix short packet for request size > ep.maxpacket
Hi Roger,
Quoted 19 lines
Request size can be greater than ep.packet and still end in a short packet. We need to tackle this case as end of transfer (if
short_not_okis not set) as indicated in USB 2.0 Specification [1], else we get stuck up on certain protocols like fastboot.[1] - USB2.0 Specification, Section 5.3.2 Pipes
Reported-by Steve Rae <[email protected]>Signed-off-by Roger Quadros <[email protected]>Tested-by Steve Rae <[email protected]>--- drivers/usb/gadget/dwc2_udc_otg_xfer_dma.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)(quoted diff) +0
-0
b/drivers/usb/gadget/dwc2_udc_otg_xfer_dma.cindex bce9c30..a31d875 100644 ---a/drivers/usb/gadget/dwc2_udc_otg_xfer_dma.c+++b/drivers/usb/gadget/dwc2_udc_otg_xfer_dma.c
drivers/usb/gadget/dwc2_udc_otg_xfer_dma.c static void complete_rx(struct dwc2_udc *dev, u8 · line 233
Quoted 6 lines
drivers/usb/gadget/dwc2_udc_otg_xfer_dma.c +1
-1@@ -229,7 +229,7 @@ static void complete_rx(struct dwc2_udc *dev, u8 ep_num) ROUND(xfer_size, CONFIG_SYS_CACHELINE_SIZE)); req->req.actual +=min (xfer_size, req->req.length - req->req.actual); - is_short = (xfer_size < ep->ep.maxpacket); + is_short = xfer_size % ep->ep.maxpacket;
is_short is a flag - so maybe it would be better to write something like:
is_short = !!(xfer_size % ep->ep.maxpacket)) ?
I'm going to test those patches on my boards. I will share the results ASAP.
Quoted 3 lines
drivers/usb/gadget/dwc2_udc_otg_xfer_dma.c +0
-0debug_cond (DEBUG_OUT_EP !=0 , "%s: RX DMA done : ep = %d, rx bytes = %d/%d, "
Signature · 5 lines
Best regards, Lukasz Majewski Samsung R&D Institute Poland (SRPOL) | Linux Platform Group
PATCH 2/3 usb: s3c-otg: Fix short packet for request size > ep.maxpacket
Hi Lukasz,
Quoted 23 lines · Lukasz Majewski
Hi Roger,
Quoted 21 lines
Request size can be greater than ep.packet and still end in a short packet. We need to tackle this case as end of transfer (if
short_not_okis not set) as indicated in USB 2.0 Specification [1], else we get stuck up on certain protocols like fastboot.[1] - USB2.0 Specification, Section 5.3.2 Pipes
Reported-by Steve Rae <[email protected]>Signed-off-by Roger Quadros <[email protected]>Tested-by Steve Rae <[email protected]>--- drivers/usb/gadget/dwc2_udc_otg_xfer_dma.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)(quoted diff) +0
-0
b/drivers/usb/gadget/dwc2_udc_otg_xfer_dma.cindex bce9c30..a31d875 100644 ---a/drivers/usb/gadget/dwc2_udc_otg_xfer_dma.c+++b/drivers/usb/gadget/dwc2_udc_otg_xfer_dma.c(quoted diff) +0
-0@@ -229,7 +229,7 @@ static void complete_rx(struct dwc2_udc *dev, u8 ep_num) ROUND(xfer_size, CONFIG_SYS_CACHELINE_SIZE));
Quoted 7 lines
drivers/usb/gadget/dwc2_udc_otg_xfer_dma.c static void complete_rx(struct dwc2_udc *dev, u8 ep_num) · line 232
Quoted 4 lines
drivers/usb/gadget/dwc2_udc_otg_xfer_dma.c +1
-1req->req.actual +=min (xfer_size, req->req.length - req->req.actual); - is_short = (xfer_size < ep->ep.maxpacket); + is_short = xfer_size % ep->ep.maxpacket;
is_shortis a flag - so maybe it would be better to write something like:
but it is defined as u32 so I thought it might as well print the short packet length instead of just 1/0.
Quoted 12 lines
is_short= !!(xfer_size %ep->ep.maxpacket)) ?I'm going to test those patches on my boards. I will share the results ASAP.
Quoted 3 lines
drivers/usb/gadget/dwc2_udc_otg_xfer_dma.c +0
-0debug_cond (DEBUG_OUT_EP !=0 , "%s: RX DMA done : ep = %d, rx bytes = %d/%d, "
--
cheers,
-roger
PATCH 2/3 usb: s3c-otg: Fix short packet for request size > ep.maxpacket
Hi Roger,
Quoted 34 lines
Hi Lukasz,
Quoted 23 lines · Lukasz Majewski
Hi Roger,
Quoted 21 lines
Request size can be greater than ep.packet and still end in a short packet. We need to tackle this case as end of transfer (if
short_not_okis not set) as indicated in USB 2.0 Specification [1], else we get stuck up on certain protocols like fastboot.[1] - USB2.0 Specification, Section 5.3.2 Pipes
Reported-by Steve Rae <[email protected]>Signed-off-by Roger Quadros <[email protected]>Tested-by Steve Rae <[email protected]>--- drivers/usb/gadget/dwc2_udc_otg_xfer_dma.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)(quoted diff) +0
-0
b/drivers/usb/gadget/dwc2_udc_otg_xfer_dma.cindex bce9c30..a31d875 100644 ---a/drivers/usb/gadget/dwc2_udc_otg_xfer_dma.c+++b/drivers/usb/gadget/dwc2_udc_otg_xfer_dma.c(quoted diff) +0
-0@@ -229,7 +229,7 @@ static void complete_rx(struct dwc2_udc *dev, u8 ep_num) ROUND(xfer_size, CONFIG_SYS_CACHELINE_SIZE));Quoted 7 lines
drivers/usb/gadget/dwc2_udc_otg_xfer_dma.c static void complete_rx(struct dwc2_udc *dev, u8 ep_num) · line 232
Quoted 4 lines
drivers/usb/gadget/dwc2_udc_otg_xfer_dma.c +1
-1req->req.actual +=min (xfer_size, req->req.length - req->req.actual); - is_short = (xfer_size < ep->ep.maxpacket); + is_short = xfer_size % ep->ep.maxpacket;
is_shortis a flag - so maybe it would be better to write something like:
Quoted 2 lines
but it is defined as u32 so I thought it might as well print the short packet length instead of just 1/0.
I mean that it looks strange for me in debug message when one see:
"is_short: 8" (as it was shown at Steve's output).
Quoted 18 lines
Quoted 13 lines
is_short= !!(xfer_size %ep->ep.maxpacket)) ?I'm going to test those patches on my boards. I will share the results ASAP.
Quoted 3 lines
drivers/usb/gadget/dwc2_udc_otg_xfer_dma.c +0
-0debug_cond (DEBUG_OUT_EP !=0 , "%s: RX DMA done : ep = %d, rx bytes = %d/%d, "--
cheers,
-roger
Signature · 5 lines
Best regards, Lukasz Majewski Samsung R&D Institute Poland (SRPOL) | Linux Platform Group
PATCH 2/3 usb: s3c-otg: Fix short packet for request size > ep.maxpacket
Quoted 36 lines · Lukasz Majewski
Hi Roger,
Quoted 34 lines
Hi Lukasz,
Quoted 30 lines · Lukasz Majewski
Hi Roger,
Quoted 19 lines
Request size can be greater than ep.packet and still end in a short packet. We need to tackle this case as end of transfer (if
short_not_okis not set) as indicated in USB 2.0 Specification [1], else we get stuck up on certain protocols like fastboot.[1] - USB2.0 Specification, Section 5.3.2 Pipes
Reported-by Steve Rae <[email protected]>Signed-off-by Roger Quadros <[email protected]>Tested-by Steve Rae <[email protected]>--- drivers/usb/gadget/dwc2_udc_otg_xfer_dma.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)(quoted diff) +0
-0
b/drivers/usb/gadget/dwc2_udc_otg_xfer_dma.cindex bce9c30..a31d875 100644 ---a/drivers/usb/gadget/dwc2_udc_otg_xfer_dma.c+++b/drivers/usb/gadget/dwc2_udc_otg_xfer_dma.cdrivers/usb/gadget/dwc2_udc_otg_xfer_dma.c static void complete_rx(struct dwc2_udc *dev, · line 233
Quoted 6 lines
drivers/usb/gadget/dwc2_udc_otg_xfer_dma.c +1
-1@@ -229,7 +229,7 @@ static void complete_rx(struct dwc2_udc *dev, u8 ep_num) ROUND(xfer_size, CONFIG_SYS_CACHELINE_SIZE)); req->req.actual +=min (xfer_size, req->req.length - req->req.actual); - is_short = (xfer_size < ep->ep.maxpacket); + is_short = xfer_size % ep->ep.maxpacket;
is_shortis a flag - so maybe it would be better to write something like:
Quoted 6 lines
Quoted 2 lines
but it is defined as u32 so I thought it might as well print the short packet length instead of just 1/0.
I mean that it looks strange for me in debug message when one see:
"
is_short: 8" (as it was shown at Steve's output).
Agreed. I'll convert it to boolean then.
--
cheers,
-roger
PATCH v2 2/3 usb: s3c-otg: Fix short packet for request size > ep.maxpacket
In reply to Roger QuadrosRequest size can be greater than ep.packet and still end in a short packet. We need to tackle this case as end of transfer (if short_not_ok is not set) as indicated in USB 2.0 Specification [1], else we get stuck up on certain protocols like fastboot.
[1] - USB2.0 Specification, Section 5.3.2 Pipes
--- drivers/usb/gadget/dwc2_udc_otg_xfer_dma.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/usb/gadget/dwc2_udc_otg_xfer_dma.c +1 -1
@@ -229,7 +229,7 @@ static void complete_rx(struct dwc2_udc *dev, u8 ep_num) ROUND(xfer_size, CONFIG_SYS_CACHELINE_SIZE)); req->req.actual +=min (xfer_size, req->req.length - req->req.actual); - is_short = (xfer_size < ep->ep.maxpacket); + is_short = !!(xfer_size % ep->ep.maxpacket);debug_cond (DEBUG_OUT_EP !=0 , "%s: RX DMA done : ep = %d, rx bytes = %d/%d, "
Signature · 1 line
2.5.0
PATCH v2 2/3 usb: s3c-otg: Fix short packet for request size > ep.maxpacket
Hi Roger,
Quoted 27 lines
Request size can be greater than ep.packet and still end in a short packet. We need to tackle this case as end of transfer (if
short_not_okis not set) as indicated in USB 2.0 Specification [1], else we get stuck up on certain protocols like fastboot.[1] - USB2.0 Specification, Section 5.3.2 Pipes
Reported-by Steve Rae <[email protected]>Signed-off-by Roger Quadros <[email protected]>Tested-by Steve Rae <[email protected]>--- drivers/usb/gadget/dwc2_udc_otg_xfer_dma.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)(quoted diff) +0
-0
b/drivers/usb/gadget/dwc2_udc_otg_xfer_dma.cindex bce9c30..9aa0f33 100644 ---a/drivers/usb/gadget/dwc2_udc_otg_xfer_dma.c+++b/drivers/usb/gadget/dwc2_udc_otg_xfer_dma.cdrivers/usb/gadget/dwc2_udc_otg_xfer_dma.c +1
-1@@ -229,7 +229,7 @@ static void complete_rx(struct dwc2_udc *dev, u8 ep_num) ROUND(xfer_size, CONFIG_SYS_CACHELINE_SIZE)); req->req.actual +=min (xfer_size, req->req.length - req->req.actual); - is_short = (xfer_size < ep->ep.maxpacket); + is_short = !!(xfer_size % ep->ep.maxpacket); debug_cond(DEBUG_OUT_EP != 0,
Quoted 1 line
"%s: RX DMA done : ep = %d, rx bytes = %d/%d, "
Test HW: Odroid U3 (Exynos 4412)
Test: ./test/py DFU & UMS
Signature · 5 lines
Best regards, Lukasz Majewski Samsung R&D Institute Poland (SRPOL) | Linux Platform Group
PATCH 3/3 usb: s3c-otg: Fix remaining bytes in debug messages
In reply to Roger QuadrosRemaining bytes means bytes that are not yet transferred and not the bytes that were transferred in the last transfer.
--- drivers/usb/gadget/dwc2_udc_otg_xfer_dma.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/usb/gadget/dwc2_udc_otg_xfer_dma.c +2 -2
@@ -235,7 +235,7 @@ static void complete_rx(struct dwc2_udc *dev, u8 ep_num)"%s: RX DMA done : ep = %d, rx bytes = %d/%d, " "is_short = %d, DOEPTSIZ = 0x%x, remained bytes = %d\n" , __func__, ep_num, req->req.actual, req->req.length, - is_short, ep_tsr, xfer_size); + is_short, ep_tsr, req->req.length - req->req.actual);if (is_short || req->req.actual == req->req.length) {if (ep_num ==EP0_CON && dev->ep0state ==DATA_STATE_RECV ) {
@@ -292,7 +292,7 @@ static void complete_tx(struct dwc2_udc *dev, u8 ep_num)"%s: TX DMA done : ep = %d, tx bytes = %d/%d, " "is_short = %d, DIEPTSIZ = 0x%x, remained bytes = %d\n" , __func__, ep_num, req->req.actual, req->req.length, - is_short, ep_tsr, xfer_size); + is_short, ep_tsr, req->req.length - req->req.actual);if (ep_num ==0 ) {if (dev->ep0state ==DATA_STATE_XMIT ) {
Signature · 1 line
2.5.0
PATCH 3/3 usb: s3c-otg: Fix remaining bytes in debug messages
Hi Roger,
Quoted 25 lines
Remaining bytes means bytes that are not yet transferred and not the bytes that were transferred in the last transfer.
Reported-by Lukasz Majewski <[email protected]>Signed-off-by Roger Quadros <[email protected]>--- drivers/usb/gadget/dwc2_udc_otg_xfer_dma.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)(quoted diff) +0
-0
b/drivers/usb/gadget/dwc2_udc_otg_xfer_dma.cindex a31d875..0594c3d 100644 ---a/drivers/usb/gadget/dwc2_udc_otg_xfer_dma.c+++b/drivers/usb/gadget/dwc2_udc_otg_xfer_dma.c(quoted diff) +0
-0@@ -235,7 +235,7 @@ static void complete_rx(struct dwc2_udc *dev, u8
ep_num) "%s: RX DMA done : ep = %d, rx bytes = %d/%d, "
"is_short= %d, DOEPTSIZ = 0x%x, remained bytes =
%d\n",__func__,ep_num,req->req.actual,req->req.length,(quoted diff) +1
-1- is_short, ep_tsr, xfer_size); + is_short, ep_tsr, req->req.length -
req->req.actual);(quoted diff) +0
-0if (is_short || req->req.actual == req->req.length) { if (ep_num == EP0_CON && dev->ep0state ==
DATA_STATE_RECV) { @@ -292,7 +292,7 @@ static voidcomplete_tx(struct dwc2_udc *dev, u8 ep_num)"%s: TX DMA done : ep = %d, tx bytes = %d/%d, " "is_short= %d, DIEPTSIZ = 0x%x, remained bytes = %d\n",
drivers/usb/gadget/dwc2_udc_otg_xfer_dma.c static void complete_tx(struct dwc2_udc *dev, u8 ep_num) · line 298
Quoted 6 lines
drivers/usb/gadget/dwc2_udc_otg_xfer_dma.c +1
-1__func__, ep_num, req->req.actual, req->req.length, - is_short, ep_tsr, xfer_size); + is_short, ep_tsr, req->req.length - req->req.actual);if (ep_num ==0 ) {if (dev->ep0state ==DATA_STATE_XMIT ) {
Signature · 5 lines
Best regards, Lukasz Majewski Samsung R&D Institute Poland (SRPOL) | Linux Platform Group
PATCH 3/3 usb: s3c-otg: Fix remaining bytes in debug messages
Quoted 31 lines · Lukasz Majewski
Hi Roger,
Quoted 29 lines
Remaining bytes means bytes that are not yet transferred and not the bytes that were transferred in the last transfer.
Reported-by Lukasz Majewski <[email protected]>Signed-off-by Roger Quadros <[email protected]>--- drivers/usb/gadget/dwc2_udc_otg_xfer_dma.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)(quoted diff) +0
-0
b/drivers/usb/gadget/dwc2_udc_otg_xfer_dma.cindex a31d875..0594c3d 100644 ---a/drivers/usb/gadget/dwc2_udc_otg_xfer_dma.c+++b/drivers/usb/gadget/dwc2_udc_otg_xfer_dma.c(quoted diff) +0
-0@@ -235,7 +235,7 @@ static void complete_rx(struct dwc2_udc *dev, u8
ep_num) "%s: RX DMA done : ep = %d, rx bytes = %d/%d, ""is_short = %d, DOEPTSIZ = 0x%x, remained bytes =%d\n",
__func__,ep_num,req->req.actual,req->req.length,(quoted diff) +1
-1- is_short, ep_tsr, xfer_size); + is_short, ep_tsr, req->req.length -req->req.actual); if (is_short || req->req.actual == req->req.length) { if (ep_num == EP0_CON && dev->ep0state == DATA_STATE_RECV) { @@ -292,7 +292,7 @@ static void complete_tx(struct dwc2_udc *dev, u8 ep_num) "%s: TX DMA done : ep = %d, tx bytes = %d/%d, " "is_short = %d, DIEPTSIZ = 0x%x, remained bytes = %d\n", __func__, ep_num, req->req.actual, req->req.length,(quoted diff) +1
-1- is_short, ep_tsr, xfer_size); + is_short, ep_tsr, req->req.length - req->req.actual);
Quoted 6 lines
Quoted 2 lines
if (ep_num == 0) { if (dev->ep0state == DATA_STATE_XMIT) {Acked-by Lukasz Majewski <[email protected]>Tested-by Steve Rae <[email protected]>
[Test HW: bcm28155_ap board]
Thanks, Steve
Quoted 7 lines
--
Best regards,Lukasz Majewski
Samsung R&D Institute Poland (SRPOL) | Linux Platform Group
PATCH 3/3 usb: s3c-otg: Fix remaining bytes in debug messages
Quoted 41 lines · Steve Rae
Quoted 36 lines · Lukasz Majewski
Hi Roger,
Quoted 26 lines
Remaining bytes means bytes that are not yet transferred and not the bytes that were transferred in the last transfer.
Reported-by Lukasz Majewski <[email protected]>Signed-off-by Roger Quadros <[email protected]>--- drivers/usb/gadget/dwc2_udc_otg_xfer_dma.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)(quoted diff) +0
-0
b/drivers/usb/gadget/dwc2_udc_otg_xfer_dma.cindex a31d875..0594c3d 100644 ---a/drivers/usb/gadget/dwc2_udc_otg_xfer_dma.c+++b/drivers/usb/gadget/dwc2_udc_otg_xfer_dma.c(quoted diff) +0
-0@@ -235,7 +235,7 @@ static void complete_rx(struct dwc2_udc *dev, u8
ep_num) "%s: RX DMA done : ep = %d, rx bytes = %d/%d, ""is_short = %d, DOEPTSIZ = 0x%x, remained bytes =%d\n",
__func__,ep_num,req->req.actual,req->req.length,(quoted diff) +1
-1- is_short, ep_tsr, xfer_size); + is_short, ep_tsr, req->req.length -req->req.actual); if (is_short || req->req.actual == req->req.length) { if (ep_num == EP0_CON && dev->ep0state == DATA_STATE_RECV) { @@ -292,7 +292,7 @@ static void complete_tx(struct dwc2_udc *dev, u8 ep_num) "%s: TX DMA done : ep = %d, tx bytes = %d/%d, " "is_short = %d, DIEPTSIZ = 0x%x, remained bytes = %d\n", __func__, ep_num, req->req.actual, req->req.length,drivers/usb/gadget/dwc2_udc_otg_xfer_dma.c static void complete_tx(struct dwc2_udc *dev, u8 ep_num) · line 298
Quoted 5 lines
drivers/usb/gadget/dwc2_udc_otg_xfer_dma.c +1
-1- is_short, ep_tsr, xfer_size); + is_short, ep_tsr, req->req.length - req->req.actual);if (ep_num ==0 ) {if (dev->ep0state ==DATA_STATE_XMIT ) {Acked-by Lukasz Majewski <[email protected]>
Quoted 5 lines
Quoted 1 line
Tested-by Steve Rae <[email protected]>[Test HW:
bcm28155_apboard]Thanks, Steve
retry because patchworks missed this....
Quoted 11 lines
Quoted 9 lines
--
Best regards,Lukasz Majewski
Samsung R&D Institute Poland (SRPOL) | Linux Platform Group