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[dep->free_slot]; in dwc3_ep0_start_trans()
96 params.param0 = upper_32_bits(dwc->ep0_trb_addr); in dwc3_ep0_start_trans()
97 params.param1 = lower_32_bits(dwc->ep0_trb_addr); in dwc3_ep0_start_trans()
101 ret = dwc3_send_gadget_ep_cmd(dwc, dep->number, in dwc3_ep0_start_trans()
110 dep->resource_index = dwc3_gadget_ep_get_transfer_index(dwc, in dwc3_ep0_start_trans()
113 dwc->ep0_next_event = DWC3_EP0_COMPLETE; in dwc3_ep0_start_trans()
121 struct dwc3 *dwc = dep->dwc; in __dwc3_gadget_ep0_queue() local
143 if (dwc->ep0state != EP0_DATA_PHASE) { in __dwc3_gadget_ep0_queue()
144 dev_WARN(dwc->dev, "Unexpected pending request\n"); in __dwc3_gadget_ep0_queue()
148 __dwc3_ep0_do_control_data(dwc, dwc->eps[direction], req); in __dwc3_gadget_ep0_queue()
160 if (dwc->delayed_status) { in __dwc3_gadget_ep0_queue()
163 direction = !dwc->ep0_expect_in; in __dwc3_gadget_ep0_queue()
164 dwc->delayed_status = false; in __dwc3_gadget_ep0_queue()
165 usb_gadget_set_state(&dwc->gadget, USB_STATE_CONFIGURED); in __dwc3_gadget_ep0_queue()
167 if (dwc->ep0state == EP0_STATUS_PHASE) in __dwc3_gadget_ep0_queue()
168 __dwc3_ep0_do_control_status(dwc, dwc->eps[direction]); in __dwc3_gadget_ep0_queue()
208 if (dwc->three_stage_setup) { in __dwc3_gadget_ep0_queue()
211 direction = dwc->ep0_expect_in; in __dwc3_gadget_ep0_queue()
212 dwc->ep0state = EP0_DATA_PHASE; in __dwc3_gadget_ep0_queue()
214 __dwc3_ep0_do_control_data(dwc, dwc->eps[direction], req); in __dwc3_gadget_ep0_queue()
227 struct dwc3 *dwc = dep->dwc; in dwc3_gadget_ep0_queue() local
233 spin_lock_irqsave(&dwc->lock, flags); in dwc3_gadget_ep0_queue()
251 dwc3_ep0_state_string(dwc->ep0state)); in dwc3_gadget_ep0_queue()
256 spin_unlock_irqrestore(&dwc->lock, flags); in dwc3_gadget_ep0_queue()
261 static void dwc3_ep0_stall_and_restart(struct dwc3 *dwc) in dwc3_ep0_stall_and_restart() argument
266 dep = dwc->eps[1]; in dwc3_ep0_stall_and_restart()
270 dep = dwc->eps[0]; in dwc3_ep0_stall_and_restart()
273 dwc->delayed_status = false; in dwc3_ep0_stall_and_restart()
282 dwc->ep0state = EP0_SETUP_PHASE; in dwc3_ep0_stall_and_restart()
283 dwc3_ep0_out_start(dwc); in dwc3_ep0_stall_and_restart()
289 struct dwc3 *dwc = dep->dwc; in __dwc3_gadget_ep0_set_halt() local
291 dwc3_ep0_stall_and_restart(dwc); in __dwc3_gadget_ep0_set_halt()
299 struct dwc3 *dwc = dep->dwc; in dwc3_gadget_ep0_set_halt() local
303 spin_lock_irqsave(&dwc->lock, flags); in dwc3_gadget_ep0_set_halt()
305 spin_unlock_irqrestore(&dwc->lock, flags); in dwc3_gadget_ep0_set_halt()
310 void dwc3_ep0_out_start(struct dwc3 *dwc) in dwc3_ep0_out_start() argument
314 ret = dwc3_ep0_start_trans(dwc, 0, dwc->ctrl_req_addr, 8, in dwc3_ep0_out_start()
319 static struct dwc3_ep *dwc3_wIndex_to_dep(struct dwc3 *dwc, __le16 wIndex_le) in dwc3_wIndex_to_dep() argument
329 dep = dwc->eps[epnum]; in dwc3_wIndex_to_dep()
342 static int dwc3_ep0_handle_status(struct dwc3 *dwc, in dwc3_ep0_handle_status() argument
357 usb_status |= dwc->gadget.is_selfpowered; in dwc3_ep0_handle_status()
359 if (dwc->speed == DWC3_DSTS_SUPERSPEED) { in dwc3_ep0_handle_status()
360 reg = dwc3_readl(dwc->regs, DWC3_DCTL); in dwc3_ep0_handle_status()
377 dep = dwc3_wIndex_to_dep(dwc, ctrl->wIndex); in dwc3_ep0_handle_status()
388 response_pkt = (__le16 *) dwc->setup_buf; in dwc3_ep0_handle_status()
391 dep = dwc->eps[0]; in dwc3_ep0_handle_status()
392 dwc->ep0_usb_req.dep = dep; in dwc3_ep0_handle_status()
393 dwc->ep0_usb_req.request.length = sizeof(*response_pkt); in dwc3_ep0_handle_status()
394 dwc->ep0_usb_req.request.buf = dwc->setup_buf; in dwc3_ep0_handle_status()
395 dwc->ep0_usb_req.request.complete = dwc3_ep0_status_cmpl; in dwc3_ep0_handle_status()
397 return __dwc3_gadget_ep0_queue(dep, &dwc->ep0_usb_req); in dwc3_ep0_handle_status()
400 static int dwc3_ep0_handle_feature(struct dwc3 *dwc, in dwc3_ep0_handle_feature() argument
414 state = dwc->gadget.state; in dwc3_ep0_handle_feature()
429 if (dwc->speed != DWC3_DSTS_SUPERSPEED) in dwc3_ep0_handle_feature()
432 reg = dwc3_readl(dwc->regs, DWC3_DCTL); in dwc3_ep0_handle_feature()
437 dwc3_writel(dwc->regs, DWC3_DCTL, reg); in dwc3_ep0_handle_feature()
443 if (dwc->speed != DWC3_DSTS_SUPERSPEED) in dwc3_ep0_handle_feature()
446 reg = dwc3_readl(dwc->regs, DWC3_DCTL); in dwc3_ep0_handle_feature()
451 dwc3_writel(dwc->regs, DWC3_DCTL, reg); in dwc3_ep0_handle_feature()
463 dwc->test_mode_nr = wIndex >> 8; in dwc3_ep0_handle_feature()
464 dwc->test_mode = true; in dwc3_ep0_handle_feature()
489 dep = dwc3_wIndex_to_dep(dwc, wIndex); in dwc3_ep0_handle_feature()
510 static int dwc3_ep0_set_address(struct dwc3 *dwc, struct usb_ctrlrequest *ctrl) in dwc3_ep0_set_address() argument
512 enum usb_device_state state = dwc->gadget.state; in dwc3_ep0_set_address()
528 reg = dwc3_readl(dwc->regs, DWC3_DCFG); in dwc3_ep0_set_address()
531 dwc3_writel(dwc->regs, DWC3_DCFG, reg); in dwc3_ep0_set_address()
534 usb_gadget_set_state(&dwc->gadget, USB_STATE_ADDRESS); in dwc3_ep0_set_address()
536 usb_gadget_set_state(&dwc->gadget, USB_STATE_DEFAULT); in dwc3_ep0_set_address()
541 static int dwc3_ep0_delegate_req(struct dwc3 *dwc, struct usb_ctrlrequest *ctrl) in dwc3_ep0_delegate_req() argument
545 spin_unlock(&dwc->lock); in dwc3_ep0_delegate_req()
546 ret = dwc->gadget_driver->setup(&dwc->gadget, ctrl); in dwc3_ep0_delegate_req()
547 spin_lock(&dwc->lock); in dwc3_ep0_delegate_req()
551 static int dwc3_ep0_set_config(struct dwc3 *dwc, struct usb_ctrlrequest *ctrl) in dwc3_ep0_set_config() argument
553 enum usb_device_state state = dwc->gadget.state; in dwc3_ep0_set_config()
565 ret = dwc3_ep0_delegate_req(dwc, ctrl); in dwc3_ep0_set_config()
576 usb_gadget_set_state(&dwc->gadget, in dwc3_ep0_set_config()
583 reg = dwc3_readl(dwc->regs, DWC3_DCTL); in dwc3_ep0_set_config()
585 dwc3_writel(dwc->regs, DWC3_DCTL, reg); in dwc3_ep0_set_config()
587 dwc->resize_fifos = true; in dwc3_ep0_set_config()
593 ret = dwc3_ep0_delegate_req(dwc, ctrl); in dwc3_ep0_set_config()
595 usb_gadget_set_state(&dwc->gadget, in dwc3_ep0_set_config()
607 struct dwc3 *dwc = dep->dwc; in dwc3_ep0_set_sel_cmpl() local
623 dwc->u1sel = timing.u1sel; in dwc3_ep0_set_sel_cmpl()
624 dwc->u1pel = timing.u1pel; in dwc3_ep0_set_sel_cmpl()
625 dwc->u2sel = le16_to_cpu(timing.u2sel); in dwc3_ep0_set_sel_cmpl()
626 dwc->u2pel = le16_to_cpu(timing.u2pel); in dwc3_ep0_set_sel_cmpl()
628 reg = dwc3_readl(dwc->regs, DWC3_DCTL); in dwc3_ep0_set_sel_cmpl()
630 param = dwc->u2pel; in dwc3_ep0_set_sel_cmpl()
632 param = dwc->u1pel; in dwc3_ep0_set_sel_cmpl()
643 ret = dwc3_send_gadget_generic_command(dwc, in dwc3_ep0_set_sel_cmpl()
648 static int dwc3_ep0_set_sel(struct dwc3 *dwc, struct usb_ctrlrequest *ctrl) in dwc3_ep0_set_sel() argument
651 enum usb_device_state state = dwc->gadget.state; in dwc3_ep0_set_sel()
662 dev_err(dwc->dev, "Set SEL should be 6 bytes, got %d\n", in dwc3_ep0_set_sel()
675 dep = dwc->eps[0]; in dwc3_ep0_set_sel()
676 dwc->ep0_usb_req.dep = dep; in dwc3_ep0_set_sel()
677 dwc->ep0_usb_req.request.length = dep->endpoint.maxpacket; in dwc3_ep0_set_sel()
678 dwc->ep0_usb_req.request.buf = dwc->setup_buf; in dwc3_ep0_set_sel()
679 dwc->ep0_usb_req.request.complete = dwc3_ep0_set_sel_cmpl; in dwc3_ep0_set_sel()
681 return __dwc3_gadget_ep0_queue(dep, &dwc->ep0_usb_req); in dwc3_ep0_set_sel()
684 static int dwc3_ep0_set_isoch_delay(struct dwc3 *dwc, struct usb_ctrlrequest *ctrl) in dwc3_ep0_set_isoch_delay() argument
701 dwc->isoch_delay = wValue; in dwc3_ep0_set_isoch_delay()
706 static int dwc3_ep0_std_request(struct dwc3 *dwc, struct usb_ctrlrequest *ctrl) in dwc3_ep0_std_request() argument
713 ret = dwc3_ep0_handle_status(dwc, ctrl); in dwc3_ep0_std_request()
717 ret = dwc3_ep0_handle_feature(dwc, ctrl, 0); in dwc3_ep0_std_request()
721 ret = dwc3_ep0_handle_feature(dwc, ctrl, 1); in dwc3_ep0_std_request()
725 ret = dwc3_ep0_set_address(dwc, ctrl); in dwc3_ep0_std_request()
729 ret = dwc3_ep0_set_config(dwc, ctrl); in dwc3_ep0_std_request()
733 ret = dwc3_ep0_set_sel(dwc, ctrl); in dwc3_ep0_std_request()
737 ret = dwc3_ep0_set_isoch_delay(dwc, ctrl); in dwc3_ep0_std_request()
741 ret = dwc3_ep0_delegate_req(dwc, ctrl); in dwc3_ep0_std_request()
748 static void dwc3_ep0_inspect_setup(struct dwc3 *dwc, in dwc3_ep0_inspect_setup() argument
751 struct usb_ctrlrequest *ctrl = dwc->ctrl_req; in dwc3_ep0_inspect_setup()
755 if (!dwc->gadget_driver) in dwc3_ep0_inspect_setup()
762 dwc->three_stage_setup = false; in dwc3_ep0_inspect_setup()
763 dwc->ep0_expect_in = false; in dwc3_ep0_inspect_setup()
764 dwc->ep0_next_event = DWC3_EP0_NRDY_STATUS; in dwc3_ep0_inspect_setup()
766 dwc->three_stage_setup = true; in dwc3_ep0_inspect_setup()
767 dwc->ep0_expect_in = !!(ctrl->bRequestType & USB_DIR_IN); in dwc3_ep0_inspect_setup()
768 dwc->ep0_next_event = DWC3_EP0_NRDY_DATA; in dwc3_ep0_inspect_setup()
772 ret = dwc3_ep0_std_request(dwc, ctrl); in dwc3_ep0_inspect_setup()
774 ret = dwc3_ep0_delegate_req(dwc, ctrl); in dwc3_ep0_inspect_setup()
777 dwc->delayed_status = true; in dwc3_ep0_inspect_setup()
781 dwc3_ep0_stall_and_restart(dwc); in dwc3_ep0_inspect_setup()
784 static void dwc3_ep0_complete_data(struct dwc3 *dwc, in dwc3_ep0_complete_data() argument
801 ep0 = dwc->eps[0]; in dwc3_ep0_complete_data()
803 dwc->ep0_next_event = DWC3_EP0_NRDY_STATUS; in dwc3_ep0_complete_data()
805 trb = dwc->ep0_trb; in dwc3_ep0_complete_data()
831 if (dwc->ep0_bounced) { in dwc3_ep0_complete_data()
854 memcpy(buf, dwc->ep0_bounce, transferred); in dwc3_ep0_complete_data()
864 dwc3_ep0_stall_and_restart(dwc); in dwc3_ep0_complete_data()
872 dwc->ep0_next_event = DWC3_EP0_COMPLETE; in dwc3_ep0_complete_data()
874 ret = dwc3_ep0_start_trans(dwc, epnum, in dwc3_ep0_complete_data()
875 dwc->ctrl_req_addr, 0, in dwc3_ep0_complete_data()
882 static void dwc3_ep0_complete_status(struct dwc3 *dwc, in dwc3_ep0_complete_status() argument
890 dep = dwc->eps[0]; in dwc3_ep0_complete_status()
891 trb = dwc->ep0_trb; in dwc3_ep0_complete_status()
901 if (dwc->test_mode) { in dwc3_ep0_complete_status()
904 ret = dwc3_gadget_set_test_mode(dwc, dwc->test_mode_nr); in dwc3_ep0_complete_status()
907 dwc->test_mode_nr); in dwc3_ep0_complete_status()
908 dwc3_ep0_stall_and_restart(dwc); in dwc3_ep0_complete_status()
917 dwc->ep0state = EP0_SETUP_PHASE; in dwc3_ep0_complete_status()
918 dwc3_ep0_out_start(dwc); in dwc3_ep0_complete_status()
921 static void dwc3_ep0_xfer_complete(struct dwc3 *dwc, in dwc3_ep0_xfer_complete() argument
924 struct dwc3_ep *dep = dwc->eps[event->endpoint_number]; in dwc3_ep0_xfer_complete()
928 dwc->setup_packet_pending = false; in dwc3_ep0_xfer_complete()
930 switch (dwc->ep0state) { in dwc3_ep0_xfer_complete()
933 dwc3_ep0_inspect_setup(dwc, event); in dwc3_ep0_xfer_complete()
938 dwc3_ep0_complete_data(dwc, event); in dwc3_ep0_xfer_complete()
943 dwc3_ep0_complete_status(dwc, event); in dwc3_ep0_xfer_complete()
946 WARN(true, "UNKNOWN ep0state %d\n", dwc->ep0state); in dwc3_ep0_xfer_complete()
950 static void __dwc3_ep0_do_control_data(struct dwc3 *dwc, in __dwc3_ep0_do_control_data() argument
958 ret = dwc3_ep0_start_trans(dwc, dep->number, in __dwc3_ep0_do_control_data()
959 dwc->ctrl_req_addr, 0, in __dwc3_ep0_do_control_data()
966 ret = usb_gadget_map_request(&dwc->gadget, &req->request, in __dwc3_ep0_do_control_data()
969 dev_dbg(dwc->dev, "failed to map request\n"); in __dwc3_ep0_do_control_data()
978 ret = dwc3_ep0_start_trans(dwc, dep->number, in __dwc3_ep0_do_control_data()
988 dwc->ep0_bounced = true; in __dwc3_ep0_do_control_data()
990 ret = dwc3_ep0_start_trans(dwc, dep->number, in __dwc3_ep0_do_control_data()
991 dwc->ep0_bounce_addr, transfer_size, in __dwc3_ep0_do_control_data()
994 ret = usb_gadget_map_request(&dwc->gadget, &req->request, in __dwc3_ep0_do_control_data()
997 dev_dbg(dwc->dev, "failed to map request\n"); in __dwc3_ep0_do_control_data()
1001 ret = dwc3_ep0_start_trans(dwc, dep->number, req->request.dma, in __dwc3_ep0_do_control_data()
1011 struct dwc3 *dwc = dep->dwc; in dwc3_ep0_start_control_status() local
1014 type = dwc->three_stage_setup ? DWC3_TRBCTL_CONTROL_STATUS3 in dwc3_ep0_start_control_status()
1017 return dwc3_ep0_start_trans(dwc, dep->number, in dwc3_ep0_start_control_status()
1018 dwc->ctrl_req_addr, 0, type, false); in dwc3_ep0_start_control_status()
1021 static void __dwc3_ep0_do_control_status(struct dwc3 *dwc, struct dwc3_ep *dep) in __dwc3_ep0_do_control_status() argument
1023 if (dwc->resize_fifos) { in __dwc3_ep0_do_control_status()
1025 dwc3_gadget_resize_tx_fifos(dwc); in __dwc3_ep0_do_control_status()
1026 dwc->resize_fifos = 0; in __dwc3_ep0_do_control_status()
1032 static void dwc3_ep0_do_control_status(struct dwc3 *dwc, in dwc3_ep0_do_control_status() argument
1035 struct dwc3_ep *dep = dwc->eps[event->endpoint_number]; in dwc3_ep0_do_control_status()
1037 __dwc3_ep0_do_control_status(dwc, dep); in dwc3_ep0_do_control_status()
1040 static void dwc3_ep0_end_control_data(struct dwc3 *dwc, struct dwc3_ep *dep) in dwc3_ep0_end_control_data() argument
1053 ret = dwc3_send_gadget_ep_cmd(dwc, dep->number, cmd, ¶ms); in dwc3_ep0_end_control_data()
1058 static void dwc3_ep0_xfernotready(struct dwc3 *dwc, in dwc3_ep0_xfernotready() argument
1061 dwc->setup_packet_pending = true; in dwc3_ep0_xfernotready()
1076 if (dwc->ep0_expect_in != event->endpoint_number) { in dwc3_ep0_xfernotready()
1077 struct dwc3_ep *dep = dwc->eps[dwc->ep0_expect_in]; in dwc3_ep0_xfernotready()
1081 dwc3_ep0_end_control_data(dwc, dep); in dwc3_ep0_xfernotready()
1082 dwc3_ep0_stall_and_restart(dwc); in dwc3_ep0_xfernotready()
1089 if (dwc->ep0_next_event != DWC3_EP0_NRDY_STATUS) in dwc3_ep0_xfernotready()
1094 dwc->ep0state = EP0_STATUS_PHASE; in dwc3_ep0_xfernotready()
1096 if (dwc->delayed_status) { in dwc3_ep0_xfernotready()
1102 dwc3_ep0_do_control_status(dwc, event); in dwc3_ep0_xfernotready()
1106 void dwc3_ep0_interrupt(struct dwc3 *dwc, in dwc3_ep0_interrupt() argument
1114 dwc3_ep0_state_string(dwc->ep0state)); in dwc3_ep0_interrupt()
1118 dwc3_ep0_xfer_complete(dwc, event); in dwc3_ep0_interrupt()
1122 dwc3_ep0_xfernotready(dwc, event); in dwc3_ep0_interrupt()