Commit e42bd6a5 authored by Igor Kotrasinski's avatar Igor Kotrasinski Committed by Felipe Balbi

usb: gadget: dummy_hcd: fix rescan logic for transfer

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: default avatarIgor Kotrasinski <i.kotrasinsk@samsung.com>
Signed-off-by: default avatarFelipe Balbi <balbi@ti.com>
parent 5dda5be9
...@@ -1385,12 +1385,15 @@ static int transfer(struct dummy_hcd *dum_hcd, struct urb *urb, ...@@ -1385,12 +1385,15 @@ static int transfer(struct dummy_hcd *dum_hcd, struct urb *urb,
if (len == 0) if (len == 0)
break; break;
/* use an extra pass for the final short packet */ /* send multiple of maxpacket first, then remainder */
if (len > ep->ep.maxpacket) { if (len >= ep->ep.maxpacket) {
rescan = 1; is_short = 0;
len -= (len % ep->ep.maxpacket); 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); len = dummy_perform_transfer(urb, req, len);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment