diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c index 8adb59f8e4f1..aad63b5e4068 100644 --- a/drivers/usb/dwc3/gadget.c +++ b/drivers/usb/dwc3/gadget.c @@ -1062,7 +1062,14 @@ static void dwc3_prepare_one_trb_sg(struct dwc3_ep *dep, unsigned int rem = length % maxp; unsigned chain = true; - if (sg_is_last(s)) + /* + * IOMMU driver is clubbing the list of sgs which shares a page + * boundary into one and giving it to USB driver. With this the + * number of sgs mapped it not equal to the the number of sgs + * passed. Mark the chain bit to false if it is the last mapped + * sg. + */ + if (sg_is_last(s) || (i == remaining - 1)) chain = false; if (rem && usb_endpoint_dir_out(dep->endpoint.desc) && !chain) {