]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
usb: dwc2: gadget: Adjust ISOC OUT request's actual len for DDMA
authorVahram Aharonyan <vahrama@synopsys.com>
Tue, 15 Nov 2016 03:16:46 +0000 (19:16 -0800)
committerFelipe Balbi <felipe.balbi@linux.intel.com>
Fri, 18 Nov 2016 11:54:48 +0000 (13:54 +0200)
In DDMA mode if programmed ISOC OUT transfer length is not DWORD
aligned, after closing descriptor HW leaves value of 4 - (ureq->length %
4) in the RX bytes. This is caused because DMA works using 4B chunks.
Example: if length = 9 and all 9 bytes were received from the bus, after
xfercomplete rx_bytes value is 3. Hence add this value to the amount of
transferred bytes.

Signed-off-by: Vahram Aharonyan <vahrama@synopsys.com>
Signed-off-by: John Youn <johnyoun@synopsys.com>
Signed-off-by: Felipe Balbi <felipe.balbi@linux.intel.com>
drivers/usb/dwc2/gadget.c

index 9f2875661bbd56b70a8d5aedf606f29a5cf530f6..d2442f4214856a706d14135b19a808f8ff81bb3a 100644 (file)
@@ -2001,6 +2001,10 @@ static void dwc2_gadget_complete_isoc_request_ddma(struct dwc2_hsotg_ep *hs_ep)
        ureq->actual = ureq->length -
                       ((desc_sts & mask) >> DEV_DMA_ISOC_NBYTES_SHIFT);
 
+       /* Adjust actual length for ISOC Out if length is not align of 4 */
+       if (!hs_ep->dir_in && ureq->length & 0x3)
+               ureq->actual += 4 - (ureq->length & 0x3);
+
        dwc2_hsotg_complete_request(hsotg, hs_ep, hs_req, 0);
 }