From ea7793fa3d213fd629fa2172e9b3927092ecdbfa Mon Sep 17 00:00:00 2001 From: Julius Werner Date: Mon, 17 Aug 2015 18:47:18 -0700 Subject: [PATCH] libpayload: usb: dwc2: Always return 'size' transferred bytes for OUT Seems like our transferred bytes calculation for OUT transfers that span more than one packet had been wrong, and we just got lucky that we never noticed it before. The HCTSIZ.xfersize register field we're reading only counts bytes transferred by the last packet we sent. OUT endpoints cannot have short transfers -- every transfer should either finish all bytes we wanted to send or end in a proper error condition. Therefore, in the absence of an error we can just conclude that all input bytes have been transferred. BRANCH=veyron BUG=chrome-os-partner:35525 TEST=SMSC95xx netboot on Jerry now works. Change-Id: Id0a127e6919f5786ba05218277705dda1067b8c3 Signed-off-by: Julius Werner Reviewed-on: https://chromium-review.googlesource.com/294169 Reviewed-by: David Hendricks Commit-Queue: David Hendricks Tested-by: David Hendricks --- payloads/libpayload/drivers/usb/dwc2.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/payloads/libpayload/drivers/usb/dwc2.c b/payloads/libpayload/drivers/usb/dwc2.c index 49f171b9ab..f5e8c74563 100644 --- a/payloads/libpayload/drivers/usb/dwc2.c +++ b/payloads/libpayload/drivers/usb/dwc2.c @@ -282,7 +282,7 @@ dwc2_do_xfer(endpoint_t *ep, int size, int pid, ep_dir_t dir, if (ret >= 0) { /* Calculate actual transferred length */ - transferred = (dir == EPDIR_IN) ? inpkt_length - ret : ret; + transferred = (dir == EPDIR_IN) ? inpkt_length - ret : size; if (do_copy && (dir == EPDIR_IN)) memcpy(data_buf, aligned_buf, transferred);