usb: dwc2: remove restriction on buffer length
authorStephen Warren <swarren@wwwdotorg.org>
Sun, 8 Mar 2015 17:08:14 +0000 (11:08 -0600)
committerMarek Vasut <marex@denx.de>
Tue, 14 Apr 2015 03:47:59 +0000 (05:47 +0200)
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@wwwdotorg.org>
drivers/usb/host/dwc2.c

index 05d21b7948f564f2a262b83d5000997b377c1c89..e370d29ffc8ea9f91b6fa7df1021fcdf37bcce6b 100644 (file)
@@ -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) {