mirror of
https://github.com/torvalds/linux.git
synced 2024-12-27 05:11:48 +00:00
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: Igor Kotrasinski <i.kotrasinsk@samsung.com> Signed-off-by: Felipe Balbi <balbi@ti.com>
This commit is contained in:
parent
b8239dcc03
commit
21c3ee9386
@ -1429,15 +1429,24 @@ top:
|
||||
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 {
|
||||
if (req->req.length == req->req.actual
|
||||
&& !req->req.zero)
|
||||
req->req.status = 0;
|
||||
if (urb->transfer_buffer_length == urb->actual_length
|
||||
&& !(urb->transfer_flags
|
||||
& URB_ZERO_PACKET))
|
||||
*status = 0;
|
||||
if (req->req.length == req->req.actual) {
|
||||
if (req->req.zero && to_host)
|
||||
rescan = 1;
|
||||
else
|
||||
req->req.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 */
|
||||
|
Loading…
Reference in New Issue
Block a user