static void dwc3_ep0_inspect_setup(struct dwc3 *dwc, const struct dwc3_event_depevt *event) { struct usb_ctrlrequest *ctrl = dwc->ctrl_req; int ret = -EINVAL; u32 len; if (!dwc->gadget_driver) goto out; len = le16_to_cpu(ctrl->wLength); if (!len) { dwc->three_stage_setup = false; dwc->ep0_expect_in = false; dwc->ep0_next_event = DWC3_EP0_NRDY_STATUS; } else { dwc->three_stage_setup = true; dwc->ep0_expect_in = !!(ctrl->bRequestType & USB_DIR_IN); dwc->ep0_next_event = DWC3_EP0_NRDY_DATA; } if ((ctrl->bRequestType & USB_TYPE_MASK) == USB_TYPE_STANDARD) ret = dwc3_ep0_std_request(dwc, ctrl); else ret = dwc3_ep0_delegate_req(dwc, ctrl); if (ret == USB_GADGET_DELAYED_STATUS) dwc->delayed_status = true; out: if (ret < 0) dwc3_ep0_stall_and_restart(dwc); }
static void dwc3_ep0_inspect_setup(struct dwc3 *dwc, const struct dwc3_event_depevt *event) { struct usb_ctrlrequest *ctrl = dwc->ctrl_req; int ret; u32 len; if (!dwc->gadget_driver) goto err; len = le16_to_cpu(ctrl->wLength); if (!len) { dwc->ep0state = EP0_IN_WAIT_GADGET; dwc->three_stage_setup = 0; } else { dwc->three_stage_setup = 1; if (ctrl->bRequestType & USB_DIR_IN) dwc->ep0state = EP0_IN_DATA_PHASE; else dwc->ep0state = EP0_OUT_DATA_PHASE; } if ((ctrl->bRequestType & USB_TYPE_MASK) == USB_TYPE_STANDARD) ret = dwc3_ep0_std_request(dwc, ctrl); else ret = dwc3_ep0_delegate_req(dwc, ctrl); if (ret >= 0) return; err: dwc3_ep0_stall_and_restart(dwc); }