void dwc3_ep0_interrupt(struct dwc3 *dwc, const const struct dwc3_event_depevt *event) { u8 epnum = event->endpoint_number; dev_dbg(dwc->dev, "%s while ep%d%s in state '%s'\n", dwc3_ep_event_string(event->endpoint_event), epnum, (epnum & 1) ? "in" : "out", dwc3_ep0_state_string(dwc->ep0state)); switch (event->endpoint_event) { case DWC3_DEPEVT_XFERCOMPLETE: dwc3_ep0_xfer_complete(dwc, event); break; case DWC3_DEPEVT_XFERNOTREADY: dwc3_ep0_xfernotready(dwc, event); break; case DWC3_DEPEVT_XFERINPROGRESS: case DWC3_DEPEVT_RXTXFIFOEVT: case DWC3_DEPEVT_STREAMEVT: case DWC3_DEPEVT_EPCMDCMPLT: break; } }
int dwc3_gadget_ep0_queue(struct usb_ep *ep, struct usb_request *request, gfp_t gfp_flags) { struct dwc3_request *req = to_dwc3_request(request); struct dwc3_ep *dep = to_dwc3_ep(ep); struct dwc3 *dwc = dep->dwc; int ret; if (!dep->desc) { dev_dbg(dwc->dev, "trying to queue request %p to disabled %s\n", request, dep->name); ret = -ESHUTDOWN; goto out; } /* we share one TRB for ep0/1 */ if (!list_empty(&dep->request_list)) { ret = -EBUSY; goto out; } dev_vdbg(dwc->dev, "queueing request %p to %s length %d, state '%s'\n", request, dep->name, request->length, dwc3_ep0_state_string(dwc->ep0state)); ret = __dwc3_gadget_ep0_queue(dep, req); out: return ret; }
int dwc3_gadget_ep0_queue(struct usb_ep *ep, struct usb_request *request, gfp_t gfp_flags) { struct dwc3_request *req = to_dwc3_request(request); struct dwc3_ep *dep = to_dwc3_ep(ep); struct dwc3 *dwc = dep->dwc; unsigned long flags; int ret; switch (dwc->ep0state) { case EP0_IN_DATA_PHASE: case EP0_IN_WAIT_GADGET: case EP0_IN_WAIT_NRDY: case EP0_IN_STATUS_PHASE: dep = dwc->eps[1]; break; case EP0_OUT_DATA_PHASE: case EP0_OUT_WAIT_GADGET: case EP0_OUT_WAIT_NRDY: case EP0_OUT_STATUS_PHASE: dep = dwc->eps[0]; break; default: return -EINVAL; } spin_lock_irqsave(&dwc->lock, flags); if (!dep->desc) { dev_dbg(dwc->dev, "trying to queue request %p to disabled %s\n", request, dep->name); ret = -ESHUTDOWN; goto out; } /* we share one TRB for ep0/1 */ if (!list_empty(&dwc->eps[0]->request_list) || !list_empty(&dwc->eps[1]->request_list) || dwc->ep0_status_pending) { ret = -EBUSY; goto out; } dev_vdbg(dwc->dev, "queueing request %p to %s length %d, state '%s'\n", request, dep->name, request->length, dwc3_ep0_state_string(dwc->ep0state)); ret = __dwc3_gadget_ep0_queue(dep, req); out: spin_unlock_irqrestore(&dwc->lock, flags); return ret; }
int dwc3_gadget_ep0_queue(struct usb_ep *ep, struct usb_request *request, gfp_t gfp_flags) { struct dwc3_request *req = to_dwc3_request(request); struct dwc3_ep *dep = to_dwc3_ep(ep); struct dwc3 *dwc = dep->dwc; unsigned long flags; int ret; spin_lock_irqsave(&dwc->lock, flags); if (!dep->endpoint.desc) { dwc3_trace(trace_dwc3_ep0, "trying to queue request %p to disabled %s", request, dep->name); ret = -ESHUTDOWN; goto out; } /* we share one TRB for ep0/1 */ if (!list_empty(&dep->request_list)) { ret = -EBUSY; goto out; } dwc3_trace(trace_dwc3_ep0, "queueing request %p to %s length %d state '%s'", request, dep->name, request->length, dwc3_ep0_state_string(dwc->ep0state)); ret = __dwc3_gadget_ep0_queue(dep, req); out: spin_unlock_irqrestore(&dwc->lock, flags); return ret; }