usb: dwc3: gadget: fix OUT eps buffer size alignment issue
authorWu Liang feng <wulf@rock-chips.com>
Mon, 6 Jun 2016 03:30:35 +0000 (11:30 +0800)
committerHuang, Tao <huangtao@rock-chips.com>
Tue, 7 Jun 2016 06:17:43 +0000 (14:17 +0800)
Per dwc3 databook "Buffer Size Rules and Zero-Length Packets",
dwc3 needs buffer size to be aligned to MaxPacketSize on ep out.

Change-Id: Iff0e9c29c02c09b93bb34fed178051c02221ecc7
Signed-off-by: Wu Liang feng <wulf@rock-chips.com>
drivers/usb/dwc3/gadget.c

index 66cc37985b0be473d9c325977819a8406241e60b..e735b2a88a1a2c31df5a7e753d9e6c1aa40123aa 100644 (file)
@@ -1010,6 +1010,17 @@ static int __dwc3_gadget_ep_queue(struct dwc3_ep *dep, struct dwc3_request *req)
 
        trace_dwc3_ep_queue(req);
 
+       /*
+        * Per databook, the total size of buffer must be a multiple
+        * of MaxPacketSize for OUT endpoints. And MaxPacketSize is
+        * configed for endpoints in dwc3_gadget_set_ep_config(),
+        * set to usb_endpoint_descriptor->wMaxPacketSize.
+        */
+       if (dep->direction == 0 &&
+           req->request.length % dep->endpoint.desc->wMaxPacketSize)
+               req->request.length = roundup(req->request.length,
+                                       dep->endpoint.desc->wMaxPacketSize);
+
        /*
         * We only add to our list of requests now and
         * start consuming the list once we get XferNotReady
@@ -1156,7 +1167,7 @@ static int dwc3_gadget_ep_queue(struct usb_ep *ep, struct usb_request *request,
         * any other request.
         */
        if (ret == 0 && request->zero && request->length &&
-           (request->length % ep->maxpacket == 0))
+           (request->length % ep->desc->wMaxPacketSize == 0))
                ret = __dwc3_gadget_ep_queue_zlp(dwc, dep);
 
        spin_unlock_irqrestore(&dwc->lock, flags);