static void dwc3_ep0_complete_data(struct dwc3 *dwc, const struct dwc3_event_depevt *event) { struct dwc3_request *r = NULL; struct usb_request *ur; struct dwc3_trb trb; struct dwc3_ep *dep; u32 transferred; u8 epnum; epnum = event->endpoint_number; dep = dwc->eps[epnum]; dwc->ep0_next_event = DWC3_EP0_NRDY_STATUS; if (!dwc->ep0_status_pending) { r = next_request(&dwc->eps[0]->request_list); ur = &r->request; } else { ur = &dwc->ep0_usb_req; dwc->ep0_status_pending = 0; } dwc3_trb_to_nat(dwc->ep0_trb, &trb); if (dwc->ep0_bounced) { struct dwc3_ep *ep0 = dwc->eps[0]; transferred = min_t(u32, ur->length, ep0->endpoint.maxpacket - trb.length); memcpy(ur->buf, dwc->ep0_bounce, transferred); dwc->ep0_bounced = false; } else { transferred = ur->length - trb.length; } ur->actual += transferred; if ((epnum & 1) && ur->actual < ur->length) { /* for some reason we did not get everything out */ dwc3_ep0_stall_and_restart(dwc); } else { /* * handle the case where we have to send a zero packet. This * seems to be case when req.length > maxpacket. Could it be? */ if (r) dwc3_gadget_giveback(dep, r, 0); } }
static void dwc3_ep0_complete_data(struct dwc3 *dwc, const struct dwc3_event_depevt *event) { struct dwc3_request *r = NULL; struct usb_request *ur; struct dwc3_trb trb; struct dwc3_ep *dep; u32 transfered; u8 epnum; epnum = event->endpoint_number; dep = dwc->eps[epnum]; if (!dwc->ep0_status_pending) { r = next_request(&dep->request_list); ur = &r->request; } else { ur = &dwc->ep0_usb_req; dwc->ep0_status_pending = 0; } dwc3_trb_to_nat(dwc->ep0_trb, &trb); transfered = ur->length - trb.length; ur->actual += transfered; if ((epnum & 1) && ur->actual < ur->length) { /* for some reason we did not get everything out */ dwc3_ep0_stall_and_restart(dwc); dwc3_gadget_giveback(dep, r, -ECONNRESET); } else { /* * handle the case where we have to send a zero packet. This * seems to be case when req.length > maxpacket. Could it be? */ /* The transfer is complete, wait for HOST */ if (epnum & 1) dwc->ep0state = EP0_IN_WAIT_NRDY; else dwc->ep0state = EP0_OUT_WAIT_NRDY; if (r) dwc3_gadget_giveback(dep, r, 0); } }