usb/gadget: fix MTP enumeration issue under super speed mode
authorJiebing Li <jiebing.li@intel.com>
Wed, 3 Dec 2014 04:29:12 +0000 (12:29 +0800)
committerDanny Wood <danwood76@gmail.com>
Tue, 12 Feb 2019 13:38:29 +0000 (13:38 +0000)
MTP function doesn't show as a drive in Windows when the device
is connected to PC's USB3 port, because device fails to respond
ACK to BULK OUT transfer request.

This patch modifies MTP OUT request length as multiple of MaxPacketSize
per databook requirement in order to fix this issue.

Change-Id: I7eedfc5a127b0104e49dcc97bc939a5e8137c223
Signed-off-by: Jiebing Li <jiebing.li@intel.com>
drivers/usb/gadget/f_mtp.c

index 1e2b1d4381c956fabfa4c3b8a7d36d6c330eeccf..2022dc6828c2554854f71929523d12581929c8ad 100644 (file)
@@ -535,13 +535,15 @@ static ssize_t mtp_read(struct file *fp, char __user *buf,
        ssize_t r = count;
        unsigned xfer;
        int ret = 0;
+       size_t len;
 
        DBG(cdev, "mtp_read(%zu)\n", count);
 
        if (dev == NULL || dev->ep_out == NULL)
                 return -ENODEV;
 
-       if (count > MTP_BULK_BUFFER_SIZE)
+       len = usb_ep_align_maybe(cdev->gadget, dev->ep_out, count);
+       if (len > MTP_BULK_BUFFER_SIZE)
                return -EINVAL;
 
        /* we will block until we're online */
@@ -565,7 +567,7 @@ static ssize_t mtp_read(struct file *fp, char __user *buf,
 requeue_req:
        /* queue a request */
        req = dev->rx_req[0];
-       req->length = count;
+       req->length = len;
        dev->rx_done = 0;
        set_read_req_length(req);
        ret = usb_ep_queue(dev->ep_out, req, GFP_KERNEL);