[U-Boot] [PATCH V2 2/2] usb: dwc2: remove restriction on buffer length

Stephen Warren swarren at wwwdotorg.org
Sun Mar 8 18:08:14 CET 2015


Each USB transfer is split up into chunks that are held in an aligned
buffer. This imposes a limit on the size of each chunk, but no limit on
the total size of transferred data. Fix the logic in chunk_msg() not to
reject large transfers, but simply take the size of the aligned buffer
into account when calculating the chunk size.

Signed-off-by: Stephen Warren <swarren at wwwdotorg.org>
---
v2: New patch.

 drivers/usb/host/dwc2.c | 12 +++---------
 1 file changed, 3 insertions(+), 9 deletions(-)

diff --git a/drivers/usb/host/dwc2.c b/drivers/usb/host/dwc2.c
index 05d21b7948f5..e370d29ffc8e 100644
--- a/drivers/usb/host/dwc2.c
+++ b/drivers/usb/host/dwc2.c
@@ -756,24 +756,18 @@ int chunk_msg(struct usb_device *dev, unsigned long pipe, int *pid, int in,
 	debug("%s: msg: pipe %lx pid %d in %d len %d\n", __func__, pipe, *pid,
 	      in, len);
 
-	if (len > DWC2_DATA_BUF_SIZE) {
-		printf("%s: %d is more then available buffer size (%d)\n",
-		       __func__, len, DWC2_DATA_BUF_SIZE);
-		dev->status = 0;
-		dev->act_len = 0;
-		return -EINVAL;
-	}
-
 	do {
 		/* Initialize channel */
 		dwc_otg_hc_init(regs, DWC2_HC_CHANNEL, devnum, ep, in, eptype,
 				max);
 
 		xfer_len = len - done;
-		/* Make sure that xfer_len is a multiple of max packet size. */
 		if (xfer_len > CONFIG_DWC2_MAX_TRANSFER_SIZE)
 			xfer_len = CONFIG_DWC2_MAX_TRANSFER_SIZE - max + 1;
+		if (xfer_len > DWC2_DATA_BUF_SIZE)
+			xfer_len = DWC2_DATA_BUF_SIZE - max + 1;
 
+		/* Make sure that xfer_len is a multiple of max packet size. */
 		if (xfer_len > 0) {
 			num_packets = (xfer_len + max - 1) / max;
 			if (num_packets > CONFIG_DWC2_MAX_PACKET_COUNT) {
-- 
1.9.1



More information about the U-Boot mailing list