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:

committed by
Felipe Balbi

parent
b8239dcc03
commit
21c3ee9386
@@ -1429,15 +1429,24 @@ top:
|
|||||||
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 */
|
||||||
|
Reference in New Issue
Block a user