Lines Matching defs: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,
38 struct dwc3 *dwc;
40 dwc = dep->dwc;
41 trb = &dwc->ep0_trb[dep->trb_enqueue];
66 struct dwc3 *dwc;
72 dwc = dep->dwc;
75 params.param0 = upper_32_bits(dwc->ep0_trb_addr);
76 params.param1 = lower_32_bits(dwc->ep0_trb_addr);
82 dwc->ep0_next_event = DWC3_EP0_COMPLETE;
90 struct dwc3 *dwc = dep->dwc;
112 if (dwc->ep0state != EP0_DATA_PHASE) {
113 dev_WARN(dwc->dev, "Unexpected pending request\n");
117 __dwc3_ep0_do_control_data(dwc, dwc->eps[direction], req);
129 if (dwc->delayed_status) {
132 direction = !dwc->ep0_expect_in;
133 dwc->delayed_status = false;
134 usb_gadget_set_state(dwc->gadget, USB_STATE_CONFIGURED);
136 if (dwc->ep0state == EP0_STATUS_PHASE)
137 __dwc3_ep0_do_control_status(dwc, dwc->eps[direction]);
174 if (dwc->three_stage_setup) {
177 direction = dwc->ep0_expect_in;
178 dwc->ep0state = EP0_DATA_PHASE;
180 __dwc3_ep0_do_control_data(dwc, dwc->eps[direction], req);
193 struct dwc3 *dwc = dep->dwc;
199 spin_lock_irqsave(&dwc->lock, flags);
200 if (!dep->endpoint.desc || !dwc->pullups_connected) {
201 dev_err(dwc->dev, "%s: can't queue to disabled endpoint\n",
216 spin_unlock_irqrestore(&dwc->lock, flags);
221 static void dwc3_ep0_stall_and_restart(struct dwc3 *dwc)
226 dep = dwc->eps[1];
230 dep = dwc->eps[0];
233 dwc->delayed_status = false;
239 if (!dwc->connected)
245 dwc->ep0state = EP0_SETUP_PHASE;
246 dwc3_ep0_out_start(dwc);
252 struct dwc3 *dwc = dep->dwc;
254 dwc3_ep0_stall_and_restart(dwc);
262 struct dwc3 *dwc = dep->dwc;
266 spin_lock_irqsave(&dwc->lock, flags);
268 spin_unlock_irqrestore(&dwc->lock, flags);
273 void dwc3_ep0_out_start(struct dwc3 *dwc)
278 complete(&dwc->ep0_in_setup);
280 dep = dwc->eps[0];
281 dwc3_ep0_prepare_one_trb(dep, dwc->ep0_trb_addr, 8,
287 static struct dwc3_ep *dwc3_wIndex_to_dep(struct dwc3 *dwc, __le16 wIndex_le)
297 dep = dwc->eps[epnum];
313 static int dwc3_ep0_handle_status(struct dwc3 *dwc,
334 usb_status |= dwc->gadget->is_selfpowered;
336 if ((dwc->speed == DWC3_DSTS_SUPERSPEED) ||
337 (dwc->speed == DWC3_DSTS_SUPERSPEED_PLUS)) {
338 reg = dwc3_readl(dwc->regs, DWC3_DCTL);
355 dep = dwc3_wIndex_to_dep(dwc, ctrl->wIndex);
366 response_pkt = (__le16 *) dwc->setup_buf;
369 dep = dwc->eps[0];
370 dwc->ep0_usb_req.dep = dep;
371 dwc->ep0_usb_req.request.length = sizeof(*response_pkt);
372 dwc->ep0_usb_req.request.buf = dwc->setup_buf;
373 dwc->ep0_usb_req.request.complete = dwc3_ep0_status_cmpl;
375 return __dwc3_gadget_ep0_queue(dep, &dwc->ep0_usb_req);
378 static int dwc3_ep0_handle_u1(struct dwc3 *dwc, enum usb_device_state state,
385 if ((dwc->speed != DWC3_DSTS_SUPERSPEED) &&
386 (dwc->speed != DWC3_DSTS_SUPERSPEED_PLUS))
388 if (set && dwc->dis_u1_entry_quirk)
391 reg = dwc3_readl(dwc->regs, DWC3_DCTL);
396 dwc3_writel(dwc->regs, DWC3_DCTL, reg);
401 static int dwc3_ep0_handle_u2(struct dwc3 *dwc, enum usb_device_state state,
409 if ((dwc->speed != DWC3_DSTS_SUPERSPEED) &&
410 (dwc->speed != DWC3_DSTS_SUPERSPEED_PLUS))
412 if (set && dwc->dis_u2_entry_quirk)
415 reg = dwc3_readl(dwc->regs, DWC3_DCTL);
420 dwc3_writel(dwc->regs, DWC3_DCTL, reg);
425 static int dwc3_ep0_handle_test(struct dwc3 *dwc, enum usb_device_state state,
439 dwc->test_mode_nr = wIndex >> 8;
440 dwc->test_mode = true;
449 static int dwc3_ep0_handle_device(struct dwc3 *dwc,
459 state = dwc->gadget->state;
469 ret = dwc3_ep0_handle_u1(dwc, state, set);
472 ret = dwc3_ep0_handle_u2(dwc, state, set);
478 ret = dwc3_ep0_handle_test(dwc, state, wIndex, set);
487 static int dwc3_ep0_handle_intf(struct dwc3 *dwc,
512 static int dwc3_ep0_handle_endpoint(struct dwc3 *dwc,
523 dep = dwc3_wIndex_to_dep(dwc, ctrl->wIndex);
546 static int dwc3_ep0_handle_feature(struct dwc3 *dwc,
556 ret = dwc3_ep0_handle_device(dwc, ctrl, set);
559 ret = dwc3_ep0_handle_intf(dwc, ctrl, set);
562 ret = dwc3_ep0_handle_endpoint(dwc, ctrl, set);
571 static int dwc3_ep0_set_address(struct dwc3 *dwc, struct usb_ctrlrequest *ctrl)
573 enum usb_device_state state = dwc->gadget->state;
579 dev_err(dwc->dev, "invalid device address %d\n", addr);
584 dev_err(dwc->dev, "can't SetAddress() from Configured State\n");
588 reg = dwc3_readl(dwc->regs, DWC3_DCFG);
591 dwc3_writel(dwc->regs, DWC3_DCFG, reg);
594 usb_gadget_set_state(dwc->gadget, USB_STATE_ADDRESS);
596 usb_gadget_set_state(dwc->gadget, USB_STATE_DEFAULT);
601 static int dwc3_ep0_delegate_req(struct dwc3 *dwc, struct usb_ctrlrequest *ctrl)
605 spin_unlock(&dwc->lock);
606 ret = dwc->gadget_driver->setup(dwc->gadget, ctrl);
607 spin_lock(&dwc->lock);
611 static int dwc3_ep0_set_config(struct dwc3 *dwc, struct usb_ctrlrequest *ctrl)
613 enum usb_device_state state = dwc->gadget->state;
625 ret = dwc3_ep0_delegate_req(dwc, ctrl);
636 usb_gadget_set_state(dwc->gadget,
643 reg = dwc3_readl(dwc->regs, DWC3_DCTL);
644 if (!dwc->dis_u1_entry_quirk)
646 if (!dwc->dis_u2_entry_quirk)
648 dwc3_writel(dwc->regs, DWC3_DCTL, reg);
653 ret = dwc3_ep0_delegate_req(dwc, ctrl);
655 usb_gadget_set_state(dwc->gadget,
667 struct dwc3 *dwc = dep->dwc;
683 dwc->u1sel = timing.u1sel;
684 dwc->u1pel = timing.u1pel;
685 dwc->u2sel = le16_to_cpu(timing.u2sel);
686 dwc->u2pel = le16_to_cpu(timing.u2pel);
688 reg = dwc3_readl(dwc->regs, DWC3_DCTL);
690 param = dwc->u2pel;
692 param = dwc->u1pel;
703 ret = dwc3_send_gadget_generic_command(dwc,
708 static int dwc3_ep0_set_sel(struct dwc3 *dwc, struct usb_ctrlrequest *ctrl)
711 enum usb_device_state state = dwc->gadget->state;
720 dev_err(dwc->dev, "Set SEL should be 6 bytes, got %d\n",
733 dep = dwc->eps[0];
734 dwc->ep0_usb_req.dep = dep;
735 dwc->ep0_usb_req.request.length = dep->endpoint.maxpacket;
736 dwc->ep0_usb_req.request.buf = dwc->setup_buf;
737 dwc->ep0_usb_req.request.complete = dwc3_ep0_set_sel_cmpl;
739 return __dwc3_gadget_ep0_queue(dep, &dwc->ep0_usb_req);
742 static int dwc3_ep0_set_isoch_delay(struct dwc3 *dwc, struct usb_ctrlrequest *ctrl)
755 dwc->gadget->isoch_delay = wValue;
760 static int dwc3_ep0_std_request(struct dwc3 *dwc, struct usb_ctrlrequest *ctrl)
766 ret = dwc3_ep0_handle_status(dwc, ctrl);
769 ret = dwc3_ep0_handle_feature(dwc, ctrl, 0);
772 ret = dwc3_ep0_handle_feature(dwc, ctrl, 1);
775 ret = dwc3_ep0_set_address(dwc, ctrl);
778 ret = dwc3_ep0_set_config(dwc, ctrl);
781 ret = dwc3_ep0_set_sel(dwc, ctrl);
784 ret = dwc3_ep0_set_isoch_delay(dwc, ctrl);
787 ret = dwc3_ep0_delegate_req(dwc, ctrl);
794 static void dwc3_ep0_inspect_setup(struct dwc3 *dwc,
797 struct usb_ctrlrequest *ctrl = (void *) dwc->ep0_trb;
801 if (!dwc->gadget_driver)
808 dwc->three_stage_setup = false;
809 dwc->ep0_expect_in = false;
810 dwc->ep0_next_event = DWC3_EP0_NRDY_STATUS;
812 dwc->three_stage_setup = true;
813 dwc->ep0_expect_in = !!(ctrl->bRequestType & USB_DIR_IN);
814 dwc->ep0_next_event = DWC3_EP0_NRDY_DATA;
818 ret = dwc3_ep0_std_request(dwc, ctrl);
820 ret = dwc3_ep0_delegate_req(dwc, ctrl);
823 dwc->delayed_status = true;
827 dwc3_ep0_stall_and_restart(dwc);
830 static void dwc3_ep0_complete_data(struct dwc3 *dwc,
843 ep0 = dwc->eps[0];
845 dwc->ep0_next_event = DWC3_EP0_NRDY_STATUS;
846 trb = dwc->ep0_trb;
855 dwc->setup_packet_pending = true;
869 ur->length && ur->zero) || dwc->ep0_bounced) {
875 dwc->eps[1]->trb_enqueue = 0;
877 dwc->eps[0]->trb_enqueue = 0;
879 dwc->ep0_bounced = false;
883 dwc3_ep0_stall_and_restart(dwc);
888 static void dwc3_ep0_complete_status(struct dwc3 *dwc,
896 dep = dwc->eps[0];
897 trb = dwc->ep0_trb;
907 if (dwc->test_mode) {
910 ret = dwc3_gadget_set_test_mode(dwc, dwc->test_mode_nr);
912 dev_err(dwc->dev, "invalid test #%d\n",
913 dwc->test_mode_nr);
914 dwc3_ep0_stall_and_restart(dwc);
921 dwc->setup_packet_pending = true;
923 dwc->ep0state = EP0_SETUP_PHASE;
924 dwc3_ep0_out_start(dwc);
927 static void dwc3_ep0_xfer_complete(struct dwc3 *dwc,
930 struct dwc3_ep *dep = dwc->eps[event->endpoint_number];
934 dwc->setup_packet_pending = false;
936 switch (dwc->ep0state) {
938 dwc3_ep0_inspect_setup(dwc, event);
942 dwc3_ep0_complete_data(dwc, event);
946 dwc3_ep0_complete_status(dwc, event);
949 WARN(true, "UNKNOWN ep0state %d\n", dwc->ep0state);
953 static void __dwc3_ep0_do_control_data(struct dwc3 *dwc,
965 dwc3_ep0_prepare_one_trb(dep, dwc->bounce_addr, trb_length,
973 ret = usb_gadget_map_request_by_dev(dwc->sysdev,
980 dwc->ep0_bounced = true;
988 req->trb = &dwc->ep0_trb[dep->trb_enqueue - 1];
991 dwc3_ep0_prepare_one_trb(dep, dwc->bounce_addr,
999 ret = usb_gadget_map_request_by_dev(dwc->sysdev,
1010 req->trb = &dwc->ep0_trb[dep->trb_enqueue - 1];
1016 dwc3_ep0_prepare_one_trb(dep, dwc->bounce_addr,
1021 ret = usb_gadget_map_request_by_dev(dwc->sysdev,
1030 req->trb = &dwc->ep0_trb[dep->trb_enqueue];
1040 struct dwc3 *dwc = dep->dwc;
1043 type = dwc->three_stage_setup ? DWC3_TRBCTL_CONTROL_STATUS3
1046 dwc3_ep0_prepare_one_trb(dep, dwc->ep0_trb_addr, 0, type, false);
1050 static void __dwc3_ep0_do_control_status(struct dwc3 *dwc, struct dwc3_ep *dep)
1055 static void dwc3_ep0_do_control_status(struct dwc3 *dwc,
1058 struct dwc3_ep *dep = dwc->eps[event->endpoint_number];
1060 __dwc3_ep0_do_control_status(dwc, dep);
1063 void dwc3_ep0_send_delayed_status(struct dwc3 *dwc)
1065 unsigned int direction = !dwc->ep0_expect_in;
1067 dwc->delayed_status = false;
1069 if (dwc->ep0state != EP0_STATUS_PHASE)
1072 __dwc3_ep0_do_control_status(dwc, dwc->eps[direction]);
1075 static void dwc3_ep0_end_control_data(struct dwc3 *dwc, struct dwc3_ep *dep)
1093 static void dwc3_ep0_xfernotready(struct dwc3 *dwc,
1107 if (dwc->ep0_expect_in != event->endpoint_number) {
1108 struct dwc3_ep *dep = dwc->eps[dwc->ep0_expect_in];
1110 dev_err(dwc->dev, "unexpected direction for Data Phase\n");
1111 dwc3_ep0_end_control_data(dwc, dep);
1112 dwc3_ep0_stall_and_restart(dwc);
1119 if (dwc->ep0_next_event != DWC3_EP0_NRDY_STATUS)
1122 dwc->ep0state = EP0_STATUS_PHASE;
1124 if (dwc->delayed_status) {
1125 struct dwc3_ep *dep = dwc->eps[0];
1134 dwc->delayed_status = false;
1135 usb_gadget_set_state(dwc->gadget,
1137 dwc3_ep0_do_control_status(dwc, event);
1143 dwc3_ep0_do_control_status(dwc, event);
1147 void dwc3_ep0_interrupt(struct dwc3 *dwc,
1150 struct dwc3_ep *dep = dwc->eps[event->endpoint_number];
1155 dwc3_ep0_xfer_complete(dwc, event);
1159 dwc3_ep0_xfernotready(dwc, event);