Commit 21c3ee93 authored by Igor Kotrasinski's avatar Igor Kotrasinski Committed by Felipe Balbi

usb: gadget: dummy_hcd: emulate sending zlp in packet logic

currently, when a zlp flag is set and an urb/usb_request
buffer is filled without a short packet, transfer() leaves
its status at -EINPROGRESS and does not rescan for short
packet.

In a scenario where ep.maxpacket bytes are copied,
URB_ZERO_PACKET is set, urb buffer is filled and usb_request
buffer is not, transfer() returns with an urb with
-EINPROGRESS status, which dummy_hcd treats as incomplete
transfer.

Check for zlp and rescan appropriately.
Signed-off-by: default avatarIgor Kotrasinski <i.kotrasinsk@samsung.com>
Signed-off-by: default avatarFelipe Balbi <balbi@ti.com>
parent b8239dcc
...@@ -1429,15 +1429,24 @@ static int transfer(struct dummy_hcd *dum_hcd, struct urb *urb, ...@@ -1429,15 +1429,24 @@ static int transfer(struct dummy_hcd *dum_hcd, struct urb *urb,
req->req.status = 0; req->req.status = 0;
} }
/* many requests terminate without a short packet */ /*
* many requests terminate without a short packet.
* send a zlp if demanded by flags.
*/
} else { } else {
if (req->req.length == req->req.actual if (req->req.length == req->req.actual) {
&& !req->req.zero) if (req->req.zero && to_host)
req->req.status = 0; rescan = 1;
if (urb->transfer_buffer_length == urb->actual_length else
&& !(urb->transfer_flags req->req.status = 0;
& URB_ZERO_PACKET)) }
*status = 0; if (urb->transfer_buffer_length == urb->actual_length) {
if (urb->transfer_flags & URB_ZERO_PACKET &&
!to_host)
rescan = 1;
else
*status = 0;
}
} }
/* device side completion --> continuable */ /* device side completion --> continuable */
......
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