]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
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)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 5 Nov 2020 10:08:49 +0000 (11:08 +0100)
commit ca3df3468eec87f6374662f7de425bc44c3810c1 upstream.

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>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/usb/dwc3/gadget.c

index 37cc3fd7c3cadc2e8edab682fb55f645b43047b6..f0d2f0a4e99081ef45fd6bd1b56c64ee31a1ed9b 100644 (file)
@@ -1057,6 +1057,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;
 
@@ -1068,8 +1070,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 chain = true;