usb: dwc3: gadget: Check MPS of the request length
authorThinh Nguyen <Thinh.Nguyen@synopsys.com>
Thu, 24 Sep 2020 08:21:18 +0000 (01:21 -0700)
committerFelipe Balbi <balbi@kernel.org>
Fri, 2 Oct 2020 06:57:44 +0000 (09:57 +0300)
When preparing for SG, not all the entries are prepared at once. When
resume, don't use the remaining request length to calculate for MPS
alignment. Use the entire request->length to do that.

Cc: stable@vger.kernel.org
Fixes: 5d187c0454ef ("usb: dwc3: gadget: Don't setup more than requested")
Signed-off-by: Thinh Nguyen <Thinh.Nguyen@synopsys.com>
Signed-off-by: Felipe Balbi <balbi@kernel.org>
drivers/usb/dwc3/gadget.c

index b2dfb3a..7e1909d 100644 (file)
@@ -1098,6 +1098,8 @@ static void dwc3_prepare_one_trb_sg(struct dwc3_ep *dep,
        struct scatterlist *s;
        int             i;
        unsigned int length = req->request.length;
+       unsigned int maxp = usb_endpoint_maxp(dep->endpoint.desc);
+       unsigned int rem = length % maxp;
        unsigned int remaining = req->request.num_mapped_sgs
                - req->num_queued_sgs;
 
@@ -1109,8 +1111,6 @@ static void dwc3_prepare_one_trb_sg(struct dwc3_ep *dep,
                length -= sg_dma_len(s);
 
        for_each_sg(sg, s, remaining, i) {
-               unsigned int maxp = usb_endpoint_maxp(dep->endpoint.desc);
-               unsigned int rem = length % maxp;
                unsigned int trb_length;
                unsigned int chain = true;