Hi, Thinh Nguyen <Thinh.Nguyen@xxxxxxxxxxxx> writes: >> One thing I don't get from your patch is why you're completely removing >> the function and why isn't req->direction and actual == length not >> needed anymore. Could you explain? > > It's because there's no use for that function outside of checking for > number of pending SGs and resume. wait, huh? What about cases when user unplugs cable midtransfer? We have versions of dwc3 HW which fail to produce disconnect interrupt, right? >> @@ -2491,6 +2492,16 @@ static bool dwc3_gadget_ep_request_completed(struct dwc3_request *req) >> if (!req->direction) >> return true; >> >> + /* >> + * If there are pending scatterlist entries, we should >> + * continue processing them. >> + */ >> + if (req->num_pending_sgs) >> + return false; >> + >> + if (usb_endpoint_xfer_isoc(dep->endpoint.desc)) >> + do_something(); > > do_something() will always return true here. Will do "do_something", then return true or simply return true? >> return req->request.actual == req->request.length; > > This should always be true if the request completes. By spec, bulk and > interrupt endpoints data delivery are guaranteed, and the retry/error > detection is done at the lower level. If by chance that the host fails > to request for data multiple times at the packet level, it will issue a > ClearFeature(halt_ep) request to the endpoint. This will trigger dwc3 to > stop the endpoint and cancel the transfer, and we still won't resume > this transfer. we can unplug the cable at any time, even mid-transfer. -- balbi
Attachment:
signature.asc
Description: PGP signature