Lines Matching refs:dwc
30 static void __dwc3_ep0_do_control_status(struct dwc3 *dwc, struct dwc3_ep *dep);
31 static void __dwc3_ep0_do_control_data(struct dwc3 *dwc,
50 static int dwc3_ep0_start_trans(struct dwc3 *dwc, u8 epnum, dma_addr_t buf_dma, in dwc3_ep0_start_trans() argument
59 dep = dwc->eps[epnum]; in dwc3_ep0_start_trans()
61 dev_vdbg(dwc->dev, "%s still busy", dep->name); in dwc3_ep0_start_trans()
65 trb = &dwc->ep0_trb[dep->free_slot]; in dwc3_ep0_start_trans()
91 params.param0 = upper_32_bits(dwc->ep0_trb_addr); in dwc3_ep0_start_trans()
92 params.param1 = lower_32_bits(dwc->ep0_trb_addr); in dwc3_ep0_start_trans()
94 ret = dwc3_send_gadget_ep_cmd(dwc, dep->number, in dwc3_ep0_start_trans()
97 dev_dbg(dwc->dev, "%s STARTTRANSFER failed", dep->name); in dwc3_ep0_start_trans()
102 dep->resource_index = dwc3_gadget_ep_get_transfer_index(dwc, in dwc3_ep0_start_trans()
105 dwc->ep0_next_event = DWC3_EP0_COMPLETE; in dwc3_ep0_start_trans()
113 struct dwc3 *dwc = dep->dwc; in __dwc3_gadget_ep0_queue() local
135 if (dwc->ep0state != EP0_DATA_PHASE) { in __dwc3_gadget_ep0_queue()
136 dev_WARN(dwc->dev, "Unexpected pending request\n"); in __dwc3_gadget_ep0_queue()
140 __dwc3_ep0_do_control_data(dwc, dwc->eps[direction], req); in __dwc3_gadget_ep0_queue()
152 if (dwc->delayed_status) { in __dwc3_gadget_ep0_queue()
155 direction = !dwc->ep0_expect_in; in __dwc3_gadget_ep0_queue()
156 dwc->delayed_status = false; in __dwc3_gadget_ep0_queue()
157 usb_gadget_set_state(&dwc->gadget, USB_STATE_CONFIGURED); in __dwc3_gadget_ep0_queue()
159 if (dwc->ep0state == EP0_STATUS_PHASE) in __dwc3_gadget_ep0_queue()
160 __dwc3_ep0_do_control_status(dwc, dwc->eps[direction]); in __dwc3_gadget_ep0_queue()
162 dev_dbg(dwc->dev, "too early for delayed status"); in __dwc3_gadget_ep0_queue()
199 if (dwc->three_stage_setup) { in __dwc3_gadget_ep0_queue()
202 direction = dwc->ep0_expect_in; in __dwc3_gadget_ep0_queue()
203 dwc->ep0state = EP0_DATA_PHASE; in __dwc3_gadget_ep0_queue()
205 __dwc3_ep0_do_control_data(dwc, dwc->eps[direction], req); in __dwc3_gadget_ep0_queue()
218 struct dwc3 *dwc = dep->dwc; in dwc3_gadget_ep0_queue() local
224 spin_lock_irqsave(&dwc->lock, flags); in dwc3_gadget_ep0_queue()
226 dev_dbg(dwc->dev, "trying to queue request %p to disabled %s", in dwc3_gadget_ep0_queue()
238 dev_vdbg(dwc->dev, "queueing request %p to %s length %d state '%s'", in dwc3_gadget_ep0_queue()
240 dwc3_ep0_state_string(dwc->ep0state)); in dwc3_gadget_ep0_queue()
245 spin_unlock_irqrestore(&dwc->lock, flags); in dwc3_gadget_ep0_queue()
250 static void dwc3_ep0_stall_and_restart(struct dwc3 *dwc) in dwc3_ep0_stall_and_restart() argument
255 dep = dwc->eps[1]; in dwc3_ep0_stall_and_restart()
259 dep = dwc->eps[0]; in dwc3_ep0_stall_and_restart()
262 dwc->delayed_status = false; in dwc3_ep0_stall_and_restart()
271 dwc->ep0state = EP0_SETUP_PHASE; in dwc3_ep0_stall_and_restart()
272 dwc3_ep0_out_start(dwc); in dwc3_ep0_stall_and_restart()
278 struct dwc3 *dwc = dep->dwc; in __dwc3_gadget_ep0_set_halt() local
280 dwc3_ep0_stall_and_restart(dwc); in __dwc3_gadget_ep0_set_halt()
290 spin_lock_irqsave(&dwc->lock, flags); in dwc3_gadget_ep0_set_halt()
292 spin_unlock_irqrestore(&dwc->lock, flags); in dwc3_gadget_ep0_set_halt()
297 void dwc3_ep0_out_start(struct dwc3 *dwc) in dwc3_ep0_out_start() argument
301 ret = dwc3_ep0_start_trans(dwc, 0, dwc->ctrl_req_addr, 8, in dwc3_ep0_out_start()
306 static struct dwc3_ep *dwc3_wIndex_to_dep(struct dwc3 *dwc, __le16 wIndex_le) in dwc3_wIndex_to_dep() argument
316 dep = dwc->eps[epnum]; in dwc3_wIndex_to_dep()
329 static int dwc3_ep0_handle_status(struct dwc3 *dwc, in dwc3_ep0_handle_status() argument
344 usb_status |= dwc->is_selfpowered << USB_DEVICE_SELF_POWERED; in dwc3_ep0_handle_status()
346 if (dwc->speed == DWC3_DSTS_SUPERSPEED) { in dwc3_ep0_handle_status()
347 reg = dwc3_readl(dwc->regs, DWC3_DCTL); in dwc3_ep0_handle_status()
364 dep = dwc3_wIndex_to_dep(dwc, ctrl->wIndex); in dwc3_ep0_handle_status()
375 response_pkt = (__le16 *) dwc->setup_buf; in dwc3_ep0_handle_status()
378 dep = dwc->eps[0]; in dwc3_ep0_handle_status()
379 dwc->ep0_usb_req.dep = dep; in dwc3_ep0_handle_status()
380 dwc->ep0_usb_req.request.length = sizeof(*response_pkt); in dwc3_ep0_handle_status()
381 dwc->ep0_usb_req.request.buf = dwc->setup_buf; in dwc3_ep0_handle_status()
382 dwc->ep0_usb_req.request.complete = dwc3_ep0_status_cmpl; in dwc3_ep0_handle_status()
384 return __dwc3_gadget_ep0_queue(dep, &dwc->ep0_usb_req); in dwc3_ep0_handle_status()
387 static int dwc3_ep0_handle_feature(struct dwc3 *dwc, in dwc3_ep0_handle_feature() argument
401 state = dwc->gadget.state; in dwc3_ep0_handle_feature()
416 if (dwc->speed != DWC3_DSTS_SUPERSPEED) in dwc3_ep0_handle_feature()
419 reg = dwc3_readl(dwc->regs, DWC3_DCTL); in dwc3_ep0_handle_feature()
420 if (set && !dwc->dis_u1u2_quirk) in dwc3_ep0_handle_feature()
424 dwc3_writel(dwc->regs, DWC3_DCTL, reg); in dwc3_ep0_handle_feature()
430 if (dwc->speed != DWC3_DSTS_SUPERSPEED) in dwc3_ep0_handle_feature()
433 reg = dwc3_readl(dwc->regs, DWC3_DCTL); in dwc3_ep0_handle_feature()
434 if (set && !dwc->dis_u1u2_quirk) in dwc3_ep0_handle_feature()
438 dwc3_writel(dwc->regs, DWC3_DCTL, reg); in dwc3_ep0_handle_feature()
450 dwc->test_mode_nr = wIndex >> 8; in dwc3_ep0_handle_feature()
451 dwc->test_mode = true; in dwc3_ep0_handle_feature()
476 dep = dwc3_wIndex_to_dep(dwc, wIndex); in dwc3_ep0_handle_feature()
497 static int dwc3_ep0_set_address(struct dwc3 *dwc, struct usb_ctrlrequest *ctrl) in dwc3_ep0_set_address() argument
499 enum usb_device_state state = dwc->gadget.state; in dwc3_ep0_set_address()
505 dev_dbg(dwc->dev, "invalid device address %d", addr); in dwc3_ep0_set_address()
510 dev_dbg(dwc->dev, "trying to set address when configured"); in dwc3_ep0_set_address()
514 dwc->connected = 1; in dwc3_ep0_set_address()
515 reg = dwc3_readl(dwc->regs, DWC3_DCFG); in dwc3_ep0_set_address()
518 dwc3_writel(dwc->regs, DWC3_DCFG, reg); in dwc3_ep0_set_address()
521 usb_gadget_set_state(&dwc->gadget, USB_STATE_ADDRESS); in dwc3_ep0_set_address()
523 usb_gadget_set_state(&dwc->gadget, USB_STATE_DEFAULT); in dwc3_ep0_set_address()
528 static int dwc3_ep0_delegate_req(struct dwc3 *dwc, struct usb_ctrlrequest *ctrl) in dwc3_ep0_delegate_req() argument
532 spin_unlock(&dwc->lock); in dwc3_ep0_delegate_req()
533 ret = dwc->gadget_driver->setup(&dwc->gadget, ctrl); in dwc3_ep0_delegate_req()
534 spin_lock(&dwc->lock); in dwc3_ep0_delegate_req()
538 static int dwc3_ep0_set_config(struct dwc3 *dwc, struct usb_ctrlrequest *ctrl) in dwc3_ep0_set_config() argument
540 enum usb_device_state state = dwc->gadget.state; in dwc3_ep0_set_config()
545 dwc->start_config_issued = false; in dwc3_ep0_set_config()
553 ret = dwc3_ep0_delegate_req(dwc, ctrl); in dwc3_ep0_set_config()
564 usb_gadget_set_state(&dwc->gadget, in dwc3_ep0_set_config()
571 reg = dwc3_readl(dwc->regs, DWC3_DCTL); in dwc3_ep0_set_config()
572 if (dwc->dis_u1u2_quirk) in dwc3_ep0_set_config()
576 dwc3_writel(dwc->regs, DWC3_DCTL, reg); in dwc3_ep0_set_config()
578 dwc->resize_fifos = true; in dwc3_ep0_set_config()
579 dev_dbg(dwc->dev, "resize FIFOs flag SET"); in dwc3_ep0_set_config()
584 ret = dwc3_ep0_delegate_req(dwc, ctrl); in dwc3_ep0_set_config()
586 usb_gadget_set_state(&dwc->gadget, in dwc3_ep0_set_config()
598 struct dwc3 *dwc = dep->dwc; in dwc3_ep0_set_sel_cmpl() local
614 dwc->u1sel = timing.u1sel; in dwc3_ep0_set_sel_cmpl()
615 dwc->u1pel = timing.u1pel; in dwc3_ep0_set_sel_cmpl()
616 dwc->u2sel = le16_to_cpu(timing.u2sel); in dwc3_ep0_set_sel_cmpl()
617 dwc->u2pel = le16_to_cpu(timing.u2pel); in dwc3_ep0_set_sel_cmpl()
619 reg = dwc3_readl(dwc->regs, DWC3_DCTL); in dwc3_ep0_set_sel_cmpl()
621 param = dwc->u2pel; in dwc3_ep0_set_sel_cmpl()
623 param = dwc->u1pel; in dwc3_ep0_set_sel_cmpl()
634 ret = dwc3_send_gadget_generic_command(dwc, in dwc3_ep0_set_sel_cmpl()
639 static int dwc3_ep0_set_sel(struct dwc3 *dwc, struct usb_ctrlrequest *ctrl) in dwc3_ep0_set_sel() argument
642 enum usb_device_state state = dwc->gadget.state; in dwc3_ep0_set_sel()
651 dev_err(dwc->dev, "Set SEL should be 6 bytes, got %d\n", in dwc3_ep0_set_sel()
664 dep = dwc->eps[0]; in dwc3_ep0_set_sel()
665 dwc->ep0_usb_req.dep = dep; in dwc3_ep0_set_sel()
666 dwc->ep0_usb_req.request.length = dep->endpoint.maxpacket; in dwc3_ep0_set_sel()
667 dwc->ep0_usb_req.request.buf = dwc->setup_buf; in dwc3_ep0_set_sel()
668 dwc->ep0_usb_req.request.complete = dwc3_ep0_set_sel_cmpl; in dwc3_ep0_set_sel()
670 return __dwc3_gadget_ep0_queue(dep, &dwc->ep0_usb_req); in dwc3_ep0_set_sel()
673 static int dwc3_ep0_set_isoch_delay(struct dwc3 *dwc, struct usb_ctrlrequest *ctrl) in dwc3_ep0_set_isoch_delay() argument
690 dwc->isoch_delay = wValue; in dwc3_ep0_set_isoch_delay()
695 static int dwc3_ep0_std_request(struct dwc3 *dwc, struct usb_ctrlrequest *ctrl) in dwc3_ep0_std_request() argument
701 dev_vdbg(dwc->dev, "USB_REQ_GET_STATUS"); in dwc3_ep0_std_request()
702 ret = dwc3_ep0_handle_status(dwc, ctrl); in dwc3_ep0_std_request()
705 dev_vdbg(dwc->dev, "USB_REQ_CLEAR_FEATURE"); in dwc3_ep0_std_request()
706 ret = dwc3_ep0_handle_feature(dwc, ctrl, 0); in dwc3_ep0_std_request()
709 dev_vdbg(dwc->dev, "USB_REQ_SET_FEATURE"); in dwc3_ep0_std_request()
710 ret = dwc3_ep0_handle_feature(dwc, ctrl, 1); in dwc3_ep0_std_request()
713 dev_vdbg(dwc->dev, "USB_REQ_SET_ADDRESS"); in dwc3_ep0_std_request()
714 ret = dwc3_ep0_set_address(dwc, ctrl); in dwc3_ep0_std_request()
717 dev_vdbg(dwc->dev, "USB_REQ_SET_CONFIGURATION"); in dwc3_ep0_std_request()
718 ret = dwc3_ep0_set_config(dwc, ctrl); in dwc3_ep0_std_request()
721 dev_vdbg(dwc->dev, "USB_REQ_SET_SEL"); in dwc3_ep0_std_request()
722 ret = dwc3_ep0_set_sel(dwc, ctrl); in dwc3_ep0_std_request()
725 dev_vdbg(dwc->dev, "USB_REQ_SET_ISOCH_DELAY"); in dwc3_ep0_std_request()
726 ret = dwc3_ep0_set_isoch_delay(dwc, ctrl); in dwc3_ep0_std_request()
729 dev_vdbg(dwc->dev, "Forwarding to gadget driver"); in dwc3_ep0_std_request()
730 ret = dwc3_ep0_delegate_req(dwc, ctrl); in dwc3_ep0_std_request()
737 static void dwc3_ep0_inspect_setup(struct dwc3 *dwc, in dwc3_ep0_inspect_setup() argument
740 struct usb_ctrlrequest *ctrl = dwc->ctrl_req; in dwc3_ep0_inspect_setup()
744 if (!dwc->gadget_driver) in dwc3_ep0_inspect_setup()
749 dwc->three_stage_setup = false; in dwc3_ep0_inspect_setup()
750 dwc->ep0_expect_in = false; in dwc3_ep0_inspect_setup()
751 dwc->ep0_next_event = DWC3_EP0_NRDY_STATUS; in dwc3_ep0_inspect_setup()
753 dwc->three_stage_setup = true; in dwc3_ep0_inspect_setup()
754 dwc->ep0_expect_in = !!(ctrl->bRequestType & USB_DIR_IN); in dwc3_ep0_inspect_setup()
755 dwc->ep0_next_event = DWC3_EP0_NRDY_DATA; in dwc3_ep0_inspect_setup()
759 ret = dwc3_ep0_std_request(dwc, ctrl); in dwc3_ep0_inspect_setup()
761 ret = dwc3_ep0_delegate_req(dwc, ctrl); in dwc3_ep0_inspect_setup()
764 dwc->delayed_status = true; in dwc3_ep0_inspect_setup()
768 dwc3_ep0_stall_and_restart(dwc); in dwc3_ep0_inspect_setup()
771 static void dwc3_ep0_complete_data(struct dwc3 *dwc, in dwc3_ep0_complete_data() argument
787 ep0 = dwc->eps[0]; in dwc3_ep0_complete_data()
789 dwc->ep0_next_event = DWC3_EP0_NRDY_STATUS; in dwc3_ep0_complete_data()
791 trb = dwc->ep0_trb; in dwc3_ep0_complete_data()
801 dev_dbg(dwc->dev, "Setup Pending received"); in dwc3_ep0_complete_data()
816 if (dwc->ep0_bounced) { in dwc3_ep0_complete_data()
838 dwc3_flush_cache((uintptr_t)dwc->ep0_bounce, DWC3_EP0_BOUNCE_SIZE); in dwc3_ep0_complete_data()
839 memcpy(buf, dwc->ep0_bounce, transferred); in dwc3_ep0_complete_data()
849 dwc3_ep0_stall_and_restart(dwc); in dwc3_ep0_complete_data()
857 dwc->ep0_next_event = DWC3_EP0_COMPLETE; in dwc3_ep0_complete_data()
859 ret = dwc3_ep0_start_trans(dwc, epnum, in dwc3_ep0_complete_data()
860 dwc->ctrl_req_addr, 0, in dwc3_ep0_complete_data()
867 static void dwc3_ep0_complete_status(struct dwc3 *dwc, in dwc3_ep0_complete_status() argument
875 dep = dwc->eps[0]; in dwc3_ep0_complete_status()
876 trb = dwc->ep0_trb; in dwc3_ep0_complete_status()
884 if (dwc->test_mode) { in dwc3_ep0_complete_status()
887 ret = dwc3_gadget_set_test_mode(dwc, dwc->test_mode_nr); in dwc3_ep0_complete_status()
889 dev_dbg(dwc->dev, "Invalid Test #%d", in dwc3_ep0_complete_status()
890 dwc->test_mode_nr); in dwc3_ep0_complete_status()
891 dwc3_ep0_stall_and_restart(dwc); in dwc3_ep0_complete_status()
898 dev_dbg(dwc->dev, "Setup Pending received"); in dwc3_ep0_complete_status()
900 dwc->ep0state = EP0_SETUP_PHASE; in dwc3_ep0_complete_status()
901 dwc3_ep0_out_start(dwc); in dwc3_ep0_complete_status()
904 static void dwc3_ep0_xfer_complete(struct dwc3 *dwc, in dwc3_ep0_xfer_complete() argument
907 struct dwc3_ep *dep = dwc->eps[event->endpoint_number]; in dwc3_ep0_xfer_complete()
911 dwc->setup_packet_pending = false; in dwc3_ep0_xfer_complete()
913 switch (dwc->ep0state) { in dwc3_ep0_xfer_complete()
915 dev_vdbg(dwc->dev, "Setup Phase"); in dwc3_ep0_xfer_complete()
916 dwc3_ep0_inspect_setup(dwc, event); in dwc3_ep0_xfer_complete()
920 dev_vdbg(dwc->dev, "Data Phase"); in dwc3_ep0_xfer_complete()
921 dwc3_ep0_complete_data(dwc, event); in dwc3_ep0_xfer_complete()
925 dev_vdbg(dwc->dev, "Status Phase"); in dwc3_ep0_xfer_complete()
926 dwc3_ep0_complete_status(dwc, event); in dwc3_ep0_xfer_complete()
929 WARN(true, "UNKNOWN ep0state %d\n", dwc->ep0state); in dwc3_ep0_xfer_complete()
933 static void __dwc3_ep0_do_control_data(struct dwc3 *dwc, in __dwc3_ep0_do_control_data() argument
941 ret = dwc3_ep0_start_trans(dwc, dep->number, in __dwc3_ep0_do_control_data()
942 dwc->ctrl_req_addr, 0, in __dwc3_ep0_do_control_data()
949 ret = usb_gadget_map_request(&dwc->gadget, &req->request, in __dwc3_ep0_do_control_data()
952 dev_dbg(dwc->dev, "failed to map request\n"); in __dwc3_ep0_do_control_data()
960 ret = dwc3_ep0_start_trans(dwc, dep->number, in __dwc3_ep0_do_control_data()
969 dwc->ep0_bounced = true; in __dwc3_ep0_do_control_data()
976 ret = dwc3_ep0_start_trans(dwc, dep->number, in __dwc3_ep0_do_control_data()
977 dwc->ep0_bounce_addr, transfer_size, in __dwc3_ep0_do_control_data()
980 ret = usb_gadget_map_request(&dwc->gadget, &req->request, in __dwc3_ep0_do_control_data()
983 dev_dbg(dwc->dev, "failed to map request\n"); in __dwc3_ep0_do_control_data()
987 ret = dwc3_ep0_start_trans(dwc, dep->number, req->request.dma, in __dwc3_ep0_do_control_data()
997 struct dwc3 *dwc = dep->dwc; in dwc3_ep0_start_control_status() local
1000 type = dwc->three_stage_setup ? DWC3_TRBCTL_CONTROL_STATUS3 in dwc3_ep0_start_control_status()
1003 return dwc3_ep0_start_trans(dwc, dep->number, in dwc3_ep0_start_control_status()
1004 dwc->ctrl_req_addr, 0, type, 0); in dwc3_ep0_start_control_status()
1007 static void __dwc3_ep0_do_control_status(struct dwc3 *dwc, struct dwc3_ep *dep) in __dwc3_ep0_do_control_status() argument
1009 if (dwc->resize_fifos) { in __dwc3_ep0_do_control_status()
1010 dev_dbg(dwc->dev, "Resizing FIFOs"); in __dwc3_ep0_do_control_status()
1011 dwc3_gadget_resize_tx_fifos(dwc); in __dwc3_ep0_do_control_status()
1012 dwc->resize_fifos = 0; in __dwc3_ep0_do_control_status()
1018 static void dwc3_ep0_do_control_status(struct dwc3 *dwc, in dwc3_ep0_do_control_status() argument
1021 struct dwc3_ep *dep = dwc->eps[event->endpoint_number]; in dwc3_ep0_do_control_status()
1023 __dwc3_ep0_do_control_status(dwc, dep); in dwc3_ep0_do_control_status()
1026 static void dwc3_ep0_end_control_data(struct dwc3 *dwc, struct dwc3_ep *dep) in dwc3_ep0_end_control_data() argument
1039 ret = dwc3_send_gadget_ep_cmd(dwc, dep->number, cmd, ¶ms); in dwc3_ep0_end_control_data()
1044 static void dwc3_ep0_xfernotready(struct dwc3 *dwc, in dwc3_ep0_xfernotready() argument
1047 dwc->setup_packet_pending = true; in dwc3_ep0_xfernotready()
1051 dev_vdbg(dwc->dev, "Control Data"); in dwc3_ep0_xfernotready()
1062 if (dwc->ep0_expect_in != event->endpoint_number) { in dwc3_ep0_xfernotready()
1063 struct dwc3_ep *dep = dwc->eps[dwc->ep0_expect_in]; in dwc3_ep0_xfernotready()
1065 dev_vdbg(dwc->dev, "Wrong direction for Data phase"); in dwc3_ep0_xfernotready()
1066 dwc3_ep0_end_control_data(dwc, dep); in dwc3_ep0_xfernotready()
1067 dwc3_ep0_stall_and_restart(dwc); in dwc3_ep0_xfernotready()
1074 if (dwc->ep0_next_event != DWC3_EP0_NRDY_STATUS) in dwc3_ep0_xfernotready()
1077 dev_vdbg(dwc->dev, "Control Status"); in dwc3_ep0_xfernotready()
1079 dwc->ep0state = EP0_STATUS_PHASE; in dwc3_ep0_xfernotready()
1081 if (dwc->delayed_status) { in dwc3_ep0_xfernotready()
1083 dev_vdbg(dwc->dev, "Delayed Status"); in dwc3_ep0_xfernotready()
1087 dwc3_ep0_do_control_status(dwc, event); in dwc3_ep0_xfernotready()
1091 void dwc3_ep0_interrupt(struct dwc3 *dwc, in dwc3_ep0_interrupt() argument
1096 dev_dbg(dwc->dev, "%s while ep%d%s in state '%s'", in dwc3_ep0_interrupt()
1099 dwc3_ep0_state_string(dwc->ep0state)); in dwc3_ep0_interrupt()
1103 dwc3_ep0_xfer_complete(dwc, event); in dwc3_ep0_interrupt()
1107 dwc3_ep0_xfernotready(dwc, event); in dwc3_ep0_interrupt()