Lines Matching refs:dwc

38 static void __dwc3_ep0_do_control_status(struct dwc3 *dwc, struct dwc3_ep *dep);
39 static void __dwc3_ep0_do_control_data(struct dwc3 *dwc,
58 static int dwc3_ep0_start_trans(struct dwc3 *dwc, u8 epnum, dma_addr_t buf_dma, in dwc3_ep0_start_trans() argument
67 dep = dwc->eps[epnum]; in dwc3_ep0_start_trans()
73 trb = dwc->ep0_trb; in dwc3_ep0_start_trans()
86 params.param0 = upper_32_bits(dwc->ep0_trb_addr); in dwc3_ep0_start_trans()
87 params.param1 = lower_32_bits(dwc->ep0_trb_addr); in dwc3_ep0_start_trans()
91 ret = dwc3_send_gadget_ep_cmd(dwc, dep->number, in dwc3_ep0_start_trans()
100 dep->resource_index = dwc3_gadget_ep_get_transfer_index(dwc, in dwc3_ep0_start_trans()
103 dwc->ep0_next_event = DWC3_EP0_COMPLETE; in dwc3_ep0_start_trans()
111 struct dwc3 *dwc = dep->dwc; in __dwc3_gadget_ep0_queue() local
133 if (dwc->ep0state != EP0_DATA_PHASE) { in __dwc3_gadget_ep0_queue()
134 dev_WARN(dwc->dev, "Unexpected pending request\n"); in __dwc3_gadget_ep0_queue()
138 __dwc3_ep0_do_control_data(dwc, dwc->eps[direction], req); in __dwc3_gadget_ep0_queue()
150 if (dwc->delayed_status) { in __dwc3_gadget_ep0_queue()
153 direction = !dwc->ep0_expect_in; in __dwc3_gadget_ep0_queue()
154 dwc->delayed_status = false; in __dwc3_gadget_ep0_queue()
155 usb_gadget_set_state(&dwc->gadget, USB_STATE_CONFIGURED); in __dwc3_gadget_ep0_queue()
157 if (dwc->ep0state == EP0_STATUS_PHASE) in __dwc3_gadget_ep0_queue()
158 __dwc3_ep0_do_control_status(dwc, dwc->eps[direction]); in __dwc3_gadget_ep0_queue()
198 if (dwc->three_stage_setup) { in __dwc3_gadget_ep0_queue()
201 direction = dwc->ep0_expect_in; in __dwc3_gadget_ep0_queue()
202 dwc->ep0state = EP0_DATA_PHASE; in __dwc3_gadget_ep0_queue()
204 __dwc3_ep0_do_control_data(dwc, dwc->eps[direction], req); in __dwc3_gadget_ep0_queue()
217 struct dwc3 *dwc = dep->dwc; in dwc3_gadget_ep0_queue() local
223 spin_lock_irqsave(&dwc->lock, flags); in dwc3_gadget_ep0_queue()
241 dwc3_ep0_state_string(dwc->ep0state)); in dwc3_gadget_ep0_queue()
246 spin_unlock_irqrestore(&dwc->lock, flags); in dwc3_gadget_ep0_queue()
251 static void dwc3_ep0_stall_and_restart(struct dwc3 *dwc) in dwc3_ep0_stall_and_restart() argument
256 dep = dwc->eps[1]; in dwc3_ep0_stall_and_restart()
260 dep = dwc->eps[0]; in dwc3_ep0_stall_and_restart()
263 dwc->delayed_status = false; in dwc3_ep0_stall_and_restart()
272 dwc->ep0state = EP0_SETUP_PHASE; in dwc3_ep0_stall_and_restart()
273 dwc3_ep0_out_start(dwc); in dwc3_ep0_stall_and_restart()
279 struct dwc3 *dwc = dep->dwc; in __dwc3_gadget_ep0_set_halt() local
281 dwc3_ep0_stall_and_restart(dwc); in __dwc3_gadget_ep0_set_halt()
289 struct dwc3 *dwc = dep->dwc; in dwc3_gadget_ep0_set_halt() local
293 spin_lock_irqsave(&dwc->lock, flags); in dwc3_gadget_ep0_set_halt()
295 spin_unlock_irqrestore(&dwc->lock, flags); in dwc3_gadget_ep0_set_halt()
300 void dwc3_ep0_out_start(struct dwc3 *dwc) in dwc3_ep0_out_start() argument
304 ret = dwc3_ep0_start_trans(dwc, 0, dwc->ctrl_req_addr, 8, in dwc3_ep0_out_start()
309 static struct dwc3_ep *dwc3_wIndex_to_dep(struct dwc3 *dwc, __le16 wIndex_le) in dwc3_wIndex_to_dep() argument
319 dep = dwc->eps[epnum]; in dwc3_wIndex_to_dep()
332 static int dwc3_ep0_handle_status(struct dwc3 *dwc, in dwc3_ep0_handle_status() argument
347 usb_status |= dwc->gadget.is_selfpowered; in dwc3_ep0_handle_status()
349 if (dwc->speed == DWC3_DSTS_SUPERSPEED) { in dwc3_ep0_handle_status()
350 reg = dwc3_readl(dwc->regs, DWC3_DCTL); in dwc3_ep0_handle_status()
367 dep = dwc3_wIndex_to_dep(dwc, ctrl->wIndex); in dwc3_ep0_handle_status()
378 response_pkt = (__le16 *) dwc->setup_buf; in dwc3_ep0_handle_status()
381 dep = dwc->eps[0]; in dwc3_ep0_handle_status()
382 dwc->ep0_usb_req.dep = dep; in dwc3_ep0_handle_status()
383 dwc->ep0_usb_req.request.length = sizeof(*response_pkt); in dwc3_ep0_handle_status()
384 dwc->ep0_usb_req.request.buf = dwc->setup_buf; in dwc3_ep0_handle_status()
385 dwc->ep0_usb_req.request.complete = dwc3_ep0_status_cmpl; in dwc3_ep0_handle_status()
387 return __dwc3_gadget_ep0_queue(dep, &dwc->ep0_usb_req); in dwc3_ep0_handle_status()
390 static int dwc3_ep0_handle_feature(struct dwc3 *dwc, in dwc3_ep0_handle_feature() argument
404 state = dwc->gadget.state; in dwc3_ep0_handle_feature()
419 if (dwc->speed != DWC3_DSTS_SUPERSPEED) in dwc3_ep0_handle_feature()
422 reg = dwc3_readl(dwc->regs, DWC3_DCTL); in dwc3_ep0_handle_feature()
427 dwc3_writel(dwc->regs, DWC3_DCTL, reg); in dwc3_ep0_handle_feature()
433 if (dwc->speed != DWC3_DSTS_SUPERSPEED) in dwc3_ep0_handle_feature()
436 reg = dwc3_readl(dwc->regs, DWC3_DCTL); in dwc3_ep0_handle_feature()
441 dwc3_writel(dwc->regs, DWC3_DCTL, reg); in dwc3_ep0_handle_feature()
453 dwc->test_mode_nr = wIndex >> 8; in dwc3_ep0_handle_feature()
454 dwc->test_mode = true; in dwc3_ep0_handle_feature()
479 dep = dwc3_wIndex_to_dep(dwc, wIndex); in dwc3_ep0_handle_feature()
500 static int dwc3_ep0_set_address(struct dwc3 *dwc, struct usb_ctrlrequest *ctrl) in dwc3_ep0_set_address() argument
502 enum usb_device_state state = dwc->gadget.state; in dwc3_ep0_set_address()
518 reg = dwc3_readl(dwc->regs, DWC3_DCFG); in dwc3_ep0_set_address()
521 dwc3_writel(dwc->regs, DWC3_DCFG, reg); in dwc3_ep0_set_address()
524 usb_gadget_set_state(&dwc->gadget, USB_STATE_ADDRESS); in dwc3_ep0_set_address()
526 usb_gadget_set_state(&dwc->gadget, USB_STATE_DEFAULT); in dwc3_ep0_set_address()
531 static int dwc3_ep0_delegate_req(struct dwc3 *dwc, struct usb_ctrlrequest *ctrl) in dwc3_ep0_delegate_req() argument
535 spin_unlock(&dwc->lock); in dwc3_ep0_delegate_req()
536 ret = dwc->gadget_driver->setup(&dwc->gadget, ctrl); in dwc3_ep0_delegate_req()
537 spin_lock(&dwc->lock); in dwc3_ep0_delegate_req()
541 static int dwc3_ep0_set_config(struct dwc3 *dwc, struct usb_ctrlrequest *ctrl) in dwc3_ep0_set_config() argument
543 enum usb_device_state state = dwc->gadget.state; in dwc3_ep0_set_config()
555 ret = dwc3_ep0_delegate_req(dwc, ctrl); in dwc3_ep0_set_config()
566 usb_gadget_set_state(&dwc->gadget, in dwc3_ep0_set_config()
573 reg = dwc3_readl(dwc->regs, DWC3_DCTL); in dwc3_ep0_set_config()
575 dwc3_writel(dwc->regs, DWC3_DCTL, reg); in dwc3_ep0_set_config()
577 dwc->resize_fifos = true; in dwc3_ep0_set_config()
583 ret = dwc3_ep0_delegate_req(dwc, ctrl); in dwc3_ep0_set_config()
585 usb_gadget_set_state(&dwc->gadget, in dwc3_ep0_set_config()
597 struct dwc3 *dwc = dep->dwc; in dwc3_ep0_set_sel_cmpl() local
613 dwc->u1sel = timing.u1sel; in dwc3_ep0_set_sel_cmpl()
614 dwc->u1pel = timing.u1pel; in dwc3_ep0_set_sel_cmpl()
615 dwc->u2sel = le16_to_cpu(timing.u2sel); in dwc3_ep0_set_sel_cmpl()
616 dwc->u2pel = le16_to_cpu(timing.u2pel); in dwc3_ep0_set_sel_cmpl()
618 reg = dwc3_readl(dwc->regs, DWC3_DCTL); in dwc3_ep0_set_sel_cmpl()
620 param = dwc->u2pel; in dwc3_ep0_set_sel_cmpl()
622 param = dwc->u1pel; in dwc3_ep0_set_sel_cmpl()
633 ret = dwc3_send_gadget_generic_command(dwc, in dwc3_ep0_set_sel_cmpl()
638 static int dwc3_ep0_set_sel(struct dwc3 *dwc, struct usb_ctrlrequest *ctrl) in dwc3_ep0_set_sel() argument
641 enum usb_device_state state = dwc->gadget.state; in dwc3_ep0_set_sel()
652 dev_err(dwc->dev, "Set SEL should be 6 bytes, got %d\n", in dwc3_ep0_set_sel()
665 dep = dwc->eps[0]; in dwc3_ep0_set_sel()
666 dwc->ep0_usb_req.dep = dep; in dwc3_ep0_set_sel()
667 dwc->ep0_usb_req.request.length = dep->endpoint.maxpacket; in dwc3_ep0_set_sel()
668 dwc->ep0_usb_req.request.buf = dwc->setup_buf; in dwc3_ep0_set_sel()
669 dwc->ep0_usb_req.request.complete = dwc3_ep0_set_sel_cmpl; in dwc3_ep0_set_sel()
671 return __dwc3_gadget_ep0_queue(dep, &dwc->ep0_usb_req); in dwc3_ep0_set_sel()
674 static int dwc3_ep0_set_isoch_delay(struct dwc3 *dwc, struct usb_ctrlrequest *ctrl) in dwc3_ep0_set_isoch_delay() argument
691 dwc->isoch_delay = wValue; in dwc3_ep0_set_isoch_delay()
696 static int dwc3_ep0_std_request(struct dwc3 *dwc, struct usb_ctrlrequest *ctrl) in dwc3_ep0_std_request() argument
703 ret = dwc3_ep0_handle_status(dwc, ctrl); in dwc3_ep0_std_request()
707 ret = dwc3_ep0_handle_feature(dwc, ctrl, 0); in dwc3_ep0_std_request()
711 ret = dwc3_ep0_handle_feature(dwc, ctrl, 1); in dwc3_ep0_std_request()
715 ret = dwc3_ep0_set_address(dwc, ctrl); in dwc3_ep0_std_request()
719 ret = dwc3_ep0_set_config(dwc, ctrl); in dwc3_ep0_std_request()
723 ret = dwc3_ep0_set_sel(dwc, ctrl); in dwc3_ep0_std_request()
727 ret = dwc3_ep0_set_isoch_delay(dwc, ctrl); in dwc3_ep0_std_request()
731 ret = dwc3_ep0_delegate_req(dwc, ctrl); in dwc3_ep0_std_request()
738 static void dwc3_ep0_inspect_setup(struct dwc3 *dwc, in dwc3_ep0_inspect_setup() argument
741 struct usb_ctrlrequest *ctrl = dwc->ctrl_req; in dwc3_ep0_inspect_setup()
745 if (!dwc->gadget_driver) in dwc3_ep0_inspect_setup()
752 dwc->three_stage_setup = false; in dwc3_ep0_inspect_setup()
753 dwc->ep0_expect_in = false; in dwc3_ep0_inspect_setup()
754 dwc->ep0_next_event = DWC3_EP0_NRDY_STATUS; in dwc3_ep0_inspect_setup()
756 dwc->three_stage_setup = true; in dwc3_ep0_inspect_setup()
757 dwc->ep0_expect_in = !!(ctrl->bRequestType & USB_DIR_IN); in dwc3_ep0_inspect_setup()
758 dwc->ep0_next_event = DWC3_EP0_NRDY_DATA; in dwc3_ep0_inspect_setup()
762 ret = dwc3_ep0_std_request(dwc, ctrl); in dwc3_ep0_inspect_setup()
764 ret = dwc3_ep0_delegate_req(dwc, ctrl); in dwc3_ep0_inspect_setup()
767 dwc->delayed_status = true; in dwc3_ep0_inspect_setup()
771 dwc3_ep0_stall_and_restart(dwc); in dwc3_ep0_inspect_setup()
774 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()
813 if (dwc->ep0_bounced) { in dwc3_ep0_complete_data()
825 memcpy(ur->buf, dwc->ep0_bounce, transferred); in dwc3_ep0_complete_data()
835 dwc3_ep0_stall_and_restart(dwc); in dwc3_ep0_complete_data()
843 dwc->ep0_next_event = DWC3_EP0_COMPLETE; in dwc3_ep0_complete_data()
845 ret = dwc3_ep0_start_trans(dwc, epnum, in dwc3_ep0_complete_data()
846 dwc->ctrl_req_addr, 0, in dwc3_ep0_complete_data()
853 static void dwc3_ep0_complete_status(struct dwc3 *dwc, in dwc3_ep0_complete_status() argument
861 dep = dwc->eps[0]; in dwc3_ep0_complete_status()
862 trb = dwc->ep0_trb; in dwc3_ep0_complete_status()
872 if (dwc->test_mode) { in dwc3_ep0_complete_status()
875 ret = dwc3_gadget_set_test_mode(dwc, dwc->test_mode_nr); in dwc3_ep0_complete_status()
878 dwc->test_mode_nr); in dwc3_ep0_complete_status()
879 dwc3_ep0_stall_and_restart(dwc); in dwc3_ep0_complete_status()
888 dwc->ep0state = EP0_SETUP_PHASE; in dwc3_ep0_complete_status()
889 dwc3_ep0_out_start(dwc); in dwc3_ep0_complete_status()
892 static void dwc3_ep0_xfer_complete(struct dwc3 *dwc, in dwc3_ep0_xfer_complete() argument
895 struct dwc3_ep *dep = dwc->eps[event->endpoint_number]; in dwc3_ep0_xfer_complete()
899 dwc->setup_packet_pending = false; in dwc3_ep0_xfer_complete()
901 switch (dwc->ep0state) { in dwc3_ep0_xfer_complete()
904 dwc3_ep0_inspect_setup(dwc, event); in dwc3_ep0_xfer_complete()
909 dwc3_ep0_complete_data(dwc, event); in dwc3_ep0_xfer_complete()
914 dwc3_ep0_complete_status(dwc, event); in dwc3_ep0_xfer_complete()
917 WARN(true, "UNKNOWN ep0state %d\n", dwc->ep0state); in dwc3_ep0_xfer_complete()
921 static void __dwc3_ep0_do_control_data(struct dwc3 *dwc, in __dwc3_ep0_do_control_data() argument
929 ret = dwc3_ep0_start_trans(dwc, dep->number, in __dwc3_ep0_do_control_data()
930 dwc->ctrl_req_addr, 0, in __dwc3_ep0_do_control_data()
937 ret = usb_gadget_map_request(&dwc->gadget, &req->request, in __dwc3_ep0_do_control_data()
940 dev_dbg(dwc->dev, "failed to map request\n"); in __dwc3_ep0_do_control_data()
948 dev_WARN(dwc->dev, "bounce buf can't handle req len\n"); in __dwc3_ep0_do_control_data()
952 dwc->ep0_bounced = true; in __dwc3_ep0_do_control_data()
959 ret = dwc3_ep0_start_trans(dwc, dep->number, in __dwc3_ep0_do_control_data()
960 dwc->ep0_bounce_addr, transfer_size, in __dwc3_ep0_do_control_data()
963 ret = usb_gadget_map_request(&dwc->gadget, &req->request, in __dwc3_ep0_do_control_data()
966 dev_dbg(dwc->dev, "failed to map request\n"); in __dwc3_ep0_do_control_data()
970 ret = dwc3_ep0_start_trans(dwc, dep->number, req->request.dma, in __dwc3_ep0_do_control_data()
979 struct dwc3 *dwc = dep->dwc; in dwc3_ep0_start_control_status() local
982 type = dwc->three_stage_setup ? DWC3_TRBCTL_CONTROL_STATUS3 in dwc3_ep0_start_control_status()
985 return dwc3_ep0_start_trans(dwc, dep->number, in dwc3_ep0_start_control_status()
986 dwc->ctrl_req_addr, 0, type); in dwc3_ep0_start_control_status()
989 static void __dwc3_ep0_do_control_status(struct dwc3 *dwc, struct dwc3_ep *dep) in __dwc3_ep0_do_control_status() argument
991 if (dwc->resize_fifos) { in __dwc3_ep0_do_control_status()
993 dwc3_gadget_resize_tx_fifos(dwc); in __dwc3_ep0_do_control_status()
994 dwc->resize_fifos = 0; in __dwc3_ep0_do_control_status()
1000 static void dwc3_ep0_do_control_status(struct dwc3 *dwc, in dwc3_ep0_do_control_status() argument
1003 struct dwc3_ep *dep = dwc->eps[event->endpoint_number]; in dwc3_ep0_do_control_status()
1005 __dwc3_ep0_do_control_status(dwc, dep); in dwc3_ep0_do_control_status()
1008 static void dwc3_ep0_end_control_data(struct dwc3 *dwc, struct dwc3_ep *dep) in dwc3_ep0_end_control_data() argument
1021 ret = dwc3_send_gadget_ep_cmd(dwc, dep->number, cmd, &params); in dwc3_ep0_end_control_data()
1026 static void dwc3_ep0_xfernotready(struct dwc3 *dwc, in dwc3_ep0_xfernotready() argument
1029 dwc->setup_packet_pending = true; in dwc3_ep0_xfernotready()
1044 if (dwc->ep0_expect_in != event->endpoint_number) { in dwc3_ep0_xfernotready()
1045 struct dwc3_ep *dep = dwc->eps[dwc->ep0_expect_in]; in dwc3_ep0_xfernotready()
1049 dwc3_ep0_end_control_data(dwc, dep); in dwc3_ep0_xfernotready()
1050 dwc3_ep0_stall_and_restart(dwc); in dwc3_ep0_xfernotready()
1057 if (dwc->ep0_next_event != DWC3_EP0_NRDY_STATUS) in dwc3_ep0_xfernotready()
1062 dwc->ep0state = EP0_STATUS_PHASE; in dwc3_ep0_xfernotready()
1064 if (dwc->delayed_status) { in dwc3_ep0_xfernotready()
1070 dwc3_ep0_do_control_status(dwc, event); in dwc3_ep0_xfernotready()
1074 void dwc3_ep0_interrupt(struct dwc3 *dwc, in dwc3_ep0_interrupt() argument
1082 dwc3_ep0_state_string(dwc->ep0state)); in dwc3_ep0_interrupt()
1086 dwc3_ep0_xfer_complete(dwc, event); in dwc3_ep0_interrupt()
1090 dwc3_ep0_xfernotready(dwc, event); in dwc3_ep0_interrupt()