On Tue, 15 Sep 2015, Igor Kotrasinski wrote: > transfer() schedules a rescan for transfers larger than > maxpacket, which is wrong for transfers that are multiples > of maxpacket. > > Rewrite to fix and clarify packet multiple / remainder > transfer logic. > > Signed-off-by: Igor Kotrasinski <i.kotrasinsk@xxxxxxxxxxx> > --- > drivers/usb/gadget/udc/dummy_hcd.c | 13 ++++++++----- > 1 file changed, 8 insertions(+), 5 deletions(-) > > diff --git a/drivers/usb/gadget/udc/dummy_hcd.c b/drivers/usb/gadget/udc/dummy_hcd.c > index da38475..2ecec06a 100644 > --- a/drivers/usb/gadget/udc/dummy_hcd.c > +++ b/drivers/usb/gadget/udc/dummy_hcd.c > @@ -1320,12 +1320,15 @@ top: > if (len == 0) > break; > > - /* use an extra pass for the final short packet */ > - if (len > ep->ep.maxpacket) { > - rescan = 1; > - len -= (len % ep->ep.maxpacket); > + /* send multiple of maxpacket first, then remainder */ > + if (len >= ep->ep.maxpacket) { > + is_short = 0; > + if (len % ep->ep.maxpacket) > + rescan = 1; > + len -= len % ep->ep.maxpacket; > + } else { > + is_short = 1; > } > - is_short = (len % ep->ep.maxpacket) != 0; > > len = dummy_perform_transfer(urb, req, len); Acked-by: Alan Stern <stern@xxxxxxxxxxxxxxxxxxx> -- To unsubscribe from this list: send the line "unsubscribe linux-usb" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html