Lines Matching +full:dev +full:- +full:ctrl

1 // SPDX-License-Identifier: GPL-2.0
3 * ep0.c - DesignWare USB3 DRD Controller Endpoint 0 Handling
5 * Copyright (C) 2015 Texas Instruments Incorporated - http://www.ti.com
10 * Taken from Linux Kernel v3.19-rc1 (drivers/usb/dwc3/ep0.c) and ported
13 * commit c00552ebaf : Merge 3.18-rc7 into usb-next
27 #include "linux-compat.h"
58 dep = dwc->eps[epnum]; in dwc3_ep0_start_trans()
59 if (dep->flags & DWC3_EP_BUSY) { in dwc3_ep0_start_trans()
60 dev_vdbg(dwc->dev, "%s still busy", dep->name); in dwc3_ep0_start_trans()
64 trb = &dwc->ep0_trb[dep->free_slot]; in dwc3_ep0_start_trans()
67 dep->free_slot++; in dwc3_ep0_start_trans()
69 trb->bpl = lower_32_bits(buf_dma); in dwc3_ep0_start_trans()
70 trb->bph = upper_32_bits(buf_dma); in dwc3_ep0_start_trans()
71 trb->size = len; in dwc3_ep0_start_trans()
72 trb->ctrl = type; in dwc3_ep0_start_trans()
74 trb->ctrl |= (DWC3_TRB_CTRL_HWO in dwc3_ep0_start_trans()
78 trb->ctrl |= DWC3_TRB_CTRL_CHN; in dwc3_ep0_start_trans()
80 trb->ctrl |= (DWC3_TRB_CTRL_IOC in dwc3_ep0_start_trans()
90 params.param0 = upper_32_bits(dwc->ep0_trb_addr); in dwc3_ep0_start_trans()
91 params.param1 = lower_32_bits(dwc->ep0_trb_addr); in dwc3_ep0_start_trans()
93 ret = dwc3_send_gadget_ep_cmd(dwc, dep->number, in dwc3_ep0_start_trans()
96 dev_dbg(dwc->dev, "%s STARTTRANSFER failed", dep->name); in dwc3_ep0_start_trans()
100 dep->flags |= DWC3_EP_BUSY; in dwc3_ep0_start_trans()
101 dep->resource_index = dwc3_gadget_ep_get_transfer_index(dwc, in dwc3_ep0_start_trans()
102 dep->number); in dwc3_ep0_start_trans()
104 dwc->ep0_next_event = DWC3_EP0_COMPLETE; in dwc3_ep0_start_trans()
112 struct dwc3 *dwc = dep->dwc; in __dwc3_gadget_ep0_queue()
114 req->request.actual = 0; in __dwc3_gadget_ep0_queue()
115 req->request.status = -EINPROGRESS; in __dwc3_gadget_ep0_queue()
116 req->epnum = dep->number; in __dwc3_gadget_ep0_queue()
118 list_add_tail(&req->list, &dep->request_list); in __dwc3_gadget_ep0_queue()
129 if (dep->flags & DWC3_EP_PENDING_REQUEST) { in __dwc3_gadget_ep0_queue()
132 direction = !!(dep->flags & DWC3_EP0_DIR_IN); in __dwc3_gadget_ep0_queue()
134 if (dwc->ep0state != EP0_DATA_PHASE) { in __dwc3_gadget_ep0_queue()
135 dev_WARN(dwc->dev, "Unexpected pending request\n"); in __dwc3_gadget_ep0_queue()
139 __dwc3_ep0_do_control_data(dwc, dwc->eps[direction], req); in __dwc3_gadget_ep0_queue()
141 dep->flags &= ~(DWC3_EP_PENDING_REQUEST | in __dwc3_gadget_ep0_queue()
151 if (dwc->delayed_status) { in __dwc3_gadget_ep0_queue()
154 direction = !dwc->ep0_expect_in; in __dwc3_gadget_ep0_queue()
155 dwc->delayed_status = false; in __dwc3_gadget_ep0_queue()
156 usb_gadget_set_state(&dwc->gadget, USB_STATE_CONFIGURED); in __dwc3_gadget_ep0_queue()
158 if (dwc->ep0state == EP0_STATUS_PHASE) in __dwc3_gadget_ep0_queue()
159 __dwc3_ep0_do_control_status(dwc, dwc->eps[direction]); in __dwc3_gadget_ep0_queue()
161 dev_dbg(dwc->dev, "too early for delayed status"); in __dwc3_gadget_ep0_queue()
175 * The problem surfaces due to the fact that in case of back-to-back in __dwc3_gadget_ep0_queue()
179 * By looking at tables 9-13 and 9-14 of the Databook, we can see that in __dwc3_gadget_ep0_queue()
190 * model of control transfers and support on-demand transfers only for in __dwc3_gadget_ep0_queue()
195 * If we're actually in a 2-stage transfer, we will wait for 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()
206 dep->flags &= ~DWC3_EP0_DIR_IN; in __dwc3_gadget_ep0_queue()
217 struct dwc3 *dwc = dep->dwc; in dwc3_gadget_ep0_queue()
223 spin_lock_irqsave(&dwc->lock, flags); in dwc3_gadget_ep0_queue()
224 if (!dep->endpoint.desc) { in dwc3_gadget_ep0_queue()
225 dev_dbg(dwc->dev, "trying to queue request %p to disabled %s", in dwc3_gadget_ep0_queue()
226 request, dep->name); in dwc3_gadget_ep0_queue()
227 ret = -ESHUTDOWN; in dwc3_gadget_ep0_queue()
232 if (!list_empty(&dep->request_list)) { in dwc3_gadget_ep0_queue()
233 ret = -EBUSY; in dwc3_gadget_ep0_queue()
237 dev_vdbg(dwc->dev, "queueing request %p to %s length %d state '%s'", in dwc3_gadget_ep0_queue()
238 request, dep->name, request->length, in dwc3_gadget_ep0_queue()
239 dwc3_ep0_state_string(dwc->ep0state)); in dwc3_gadget_ep0_queue()
244 spin_unlock_irqrestore(&dwc->lock, flags); in dwc3_gadget_ep0_queue()
254 dep = dwc->eps[1]; in dwc3_ep0_stall_and_restart()
255 dep->flags = DWC3_EP_ENABLED; in dwc3_ep0_stall_and_restart()
258 dep = dwc->eps[0]; in dwc3_ep0_stall_and_restart()
260 dep->flags = DWC3_EP_ENABLED; in dwc3_ep0_stall_and_restart()
261 dwc->delayed_status = false; in dwc3_ep0_stall_and_restart()
263 if (!list_empty(&dep->request_list)) { in dwc3_ep0_stall_and_restart()
266 req = next_request(&dep->request_list); in dwc3_ep0_stall_and_restart()
267 dwc3_gadget_giveback(dep, req, -ECONNRESET); in dwc3_ep0_stall_and_restart()
270 dwc->ep0state = EP0_SETUP_PHASE; in dwc3_ep0_stall_and_restart()
277 struct dwc3 *dwc = dep->dwc; in __dwc3_gadget_ep0_set_halt()
289 spin_lock_irqsave(&dwc->lock, flags); in dwc3_gadget_ep0_set_halt()
291 spin_unlock_irqrestore(&dwc->lock, flags); in dwc3_gadget_ep0_set_halt()
300 ret = dwc3_ep0_start_trans(dwc, 0, dwc->ctrl_req_addr, 8, in dwc3_ep0_out_start()
315 dep = dwc->eps[epnum]; in dwc3_wIndex_to_dep()
316 if (dep->flags & DWC3_EP_ENABLED) in dwc3_wIndex_to_dep()
329 struct usb_ctrlrequest *ctrl) in dwc3_ep0_handle_status() argument
337 recip = ctrl->bRequestType & USB_RECIP_MASK; in dwc3_ep0_handle_status()
343 usb_status |= dwc->is_selfpowered << USB_DEVICE_SELF_POWERED; in dwc3_ep0_handle_status()
345 if (dwc->speed == DWC3_DSTS_SUPERSPEED) { in dwc3_ep0_handle_status()
346 reg = dwc3_readl(dwc->regs, DWC3_DCTL); in dwc3_ep0_handle_status()
363 dep = dwc3_wIndex_to_dep(dwc, ctrl->wIndex); in dwc3_ep0_handle_status()
365 return -EINVAL; in dwc3_ep0_handle_status()
367 if (dep->flags & DWC3_EP_STALL) in dwc3_ep0_handle_status()
371 return -EINVAL; in dwc3_ep0_handle_status()
374 response_pkt = (__le16 *) dwc->setup_buf; in dwc3_ep0_handle_status()
377 dep = dwc->eps[0]; in dwc3_ep0_handle_status()
378 dwc->ep0_usb_req.dep = dep; in dwc3_ep0_handle_status()
379 dwc->ep0_usb_req.request.length = sizeof(*response_pkt); in dwc3_ep0_handle_status()
380 dwc->ep0_usb_req.request.buf = dwc->setup_buf; in dwc3_ep0_handle_status()
381 dwc->ep0_usb_req.request.complete = dwc3_ep0_status_cmpl; in dwc3_ep0_handle_status()
383 return __dwc3_gadget_ep0_queue(dep, &dwc->ep0_usb_req); in dwc3_ep0_handle_status()
387 struct usb_ctrlrequest *ctrl, int set) in dwc3_ep0_handle_feature() argument
397 wValue = le16_to_cpu(ctrl->wValue); in dwc3_ep0_handle_feature()
398 wIndex = le16_to_cpu(ctrl->wIndex); in dwc3_ep0_handle_feature()
399 recip = ctrl->bRequestType & USB_RECIP_MASK; in dwc3_ep0_handle_feature()
400 state = dwc->gadget.state; in dwc3_ep0_handle_feature()
414 return -EINVAL; in dwc3_ep0_handle_feature()
415 if (dwc->speed != DWC3_DSTS_SUPERSPEED) in dwc3_ep0_handle_feature()
416 return -EINVAL; in dwc3_ep0_handle_feature()
418 reg = dwc3_readl(dwc->regs, DWC3_DCTL); in dwc3_ep0_handle_feature()
423 dwc3_writel(dwc->regs, DWC3_DCTL, reg); in dwc3_ep0_handle_feature()
428 return -EINVAL; in dwc3_ep0_handle_feature()
429 if (dwc->speed != DWC3_DSTS_SUPERSPEED) in dwc3_ep0_handle_feature()
430 return -EINVAL; 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()
441 return -EINVAL; in dwc3_ep0_handle_feature()
445 return -EINVAL; in dwc3_ep0_handle_feature()
447 return -EINVAL; in dwc3_ep0_handle_feature()
449 dwc->test_mode_nr = wIndex >> 8; in dwc3_ep0_handle_feature()
450 dwc->test_mode = true; in dwc3_ep0_handle_feature()
453 return -EINVAL; in dwc3_ep0_handle_feature()
468 return -EINVAL; in dwc3_ep0_handle_feature()
477 return -EINVAL; in dwc3_ep0_handle_feature()
478 if (set == 0 && (dep->flags & DWC3_EP_WEDGE)) in dwc3_ep0_handle_feature()
482 return -EINVAL; in dwc3_ep0_handle_feature()
485 return -EINVAL; in dwc3_ep0_handle_feature()
490 return -EINVAL; in dwc3_ep0_handle_feature()
496 static int dwc3_ep0_set_address(struct dwc3 *dwc, struct usb_ctrlrequest *ctrl) in dwc3_ep0_set_address() argument
498 enum usb_device_state state = dwc->gadget.state; in dwc3_ep0_set_address()
502 addr = le16_to_cpu(ctrl->wValue); in dwc3_ep0_set_address()
504 dev_dbg(dwc->dev, "invalid device address %d", addr); in dwc3_ep0_set_address()
505 return -EINVAL; in dwc3_ep0_set_address()
509 dev_dbg(dwc->dev, "trying to set address when configured"); in dwc3_ep0_set_address()
510 return -EINVAL; in dwc3_ep0_set_address()
513 reg = dwc3_readl(dwc->regs, DWC3_DCFG); in dwc3_ep0_set_address()
516 dwc3_writel(dwc->regs, DWC3_DCFG, reg); in dwc3_ep0_set_address()
519 usb_gadget_set_state(&dwc->gadget, USB_STATE_ADDRESS); in dwc3_ep0_set_address()
521 usb_gadget_set_state(&dwc->gadget, USB_STATE_DEFAULT); in dwc3_ep0_set_address()
526 static int dwc3_ep0_delegate_req(struct dwc3 *dwc, struct usb_ctrlrequest *ctrl) in dwc3_ep0_delegate_req() argument
530 spin_unlock(&dwc->lock); in dwc3_ep0_delegate_req()
531 ret = dwc->gadget_driver->setup(&dwc->gadget, ctrl); in dwc3_ep0_delegate_req()
532 spin_lock(&dwc->lock); in dwc3_ep0_delegate_req()
536 static int dwc3_ep0_set_config(struct dwc3 *dwc, struct usb_ctrlrequest *ctrl) in dwc3_ep0_set_config() argument
538 enum usb_device_state state = dwc->gadget.state; in dwc3_ep0_set_config()
543 dwc->start_config_issued = false; in dwc3_ep0_set_config()
544 cfg = le16_to_cpu(ctrl->wValue); in dwc3_ep0_set_config()
548 return -EINVAL; in dwc3_ep0_set_config()
551 ret = dwc3_ep0_delegate_req(dwc, ctrl); in dwc3_ep0_set_config()
562 usb_gadget_set_state(&dwc->gadget, in dwc3_ep0_set_config()
569 reg = dwc3_readl(dwc->regs, DWC3_DCTL); in dwc3_ep0_set_config()
571 dwc3_writel(dwc->regs, DWC3_DCTL, reg); in dwc3_ep0_set_config()
573 dwc->resize_fifos = true; in dwc3_ep0_set_config()
574 dev_dbg(dwc->dev, "resize FIFOs flag SET"); in dwc3_ep0_set_config()
579 ret = dwc3_ep0_delegate_req(dwc, ctrl); in dwc3_ep0_set_config()
581 usb_gadget_set_state(&dwc->gadget, in dwc3_ep0_set_config()
585 ret = -EINVAL; in dwc3_ep0_set_config()
593 struct dwc3 *dwc = dep->dwc; in dwc3_ep0_set_sel_cmpl()
607 memcpy(&timing, req->buf, sizeof(timing)); in dwc3_ep0_set_sel_cmpl()
609 dwc->u1sel = timing.u1sel; in dwc3_ep0_set_sel_cmpl()
610 dwc->u1pel = timing.u1pel; in dwc3_ep0_set_sel_cmpl()
611 dwc->u2sel = le16_to_cpu(timing.u2sel); in dwc3_ep0_set_sel_cmpl()
612 dwc->u2pel = le16_to_cpu(timing.u2pel); in dwc3_ep0_set_sel_cmpl()
614 reg = dwc3_readl(dwc->regs, DWC3_DCTL); in dwc3_ep0_set_sel_cmpl()
616 param = dwc->u2pel; in dwc3_ep0_set_sel_cmpl()
618 param = dwc->u1pel; in dwc3_ep0_set_sel_cmpl()
634 static int dwc3_ep0_set_sel(struct dwc3 *dwc, struct usb_ctrlrequest *ctrl) in dwc3_ep0_set_sel() argument
637 enum usb_device_state state = dwc->gadget.state; in dwc3_ep0_set_sel()
641 return -EINVAL; in dwc3_ep0_set_sel()
643 wLength = le16_to_cpu(ctrl->wLength); in dwc3_ep0_set_sel()
646 dev_err(dwc->dev, "Set SEL should be 6 bytes, got %d\n", in dwc3_ep0_set_sel()
648 return -EINVAL; in dwc3_ep0_set_sel()
655 * Remember, though, this controller can't handle non-wMaxPacketSize in dwc3_ep0_set_sel()
659 dep = dwc->eps[0]; in dwc3_ep0_set_sel()
660 dwc->ep0_usb_req.dep = dep; in dwc3_ep0_set_sel()
661 dwc->ep0_usb_req.request.length = dep->endpoint.maxpacket; in dwc3_ep0_set_sel()
662 dwc->ep0_usb_req.request.buf = dwc->setup_buf; in dwc3_ep0_set_sel()
663 dwc->ep0_usb_req.request.complete = dwc3_ep0_set_sel_cmpl; in dwc3_ep0_set_sel()
665 return __dwc3_gadget_ep0_queue(dep, &dwc->ep0_usb_req); in dwc3_ep0_set_sel()
668 static int dwc3_ep0_set_isoch_delay(struct dwc3 *dwc, struct usb_ctrlrequest *ctrl) in dwc3_ep0_set_isoch_delay() argument
674 wValue = le16_to_cpu(ctrl->wValue); in dwc3_ep0_set_isoch_delay()
675 wLength = le16_to_cpu(ctrl->wLength); in dwc3_ep0_set_isoch_delay()
676 wIndex = le16_to_cpu(ctrl->wIndex); in dwc3_ep0_set_isoch_delay()
679 return -EINVAL; in dwc3_ep0_set_isoch_delay()
685 dwc->isoch_delay = wValue; in dwc3_ep0_set_isoch_delay()
690 static int dwc3_ep0_std_request(struct dwc3 *dwc, struct usb_ctrlrequest *ctrl) in dwc3_ep0_std_request() argument
694 switch (ctrl->bRequest) { in dwc3_ep0_std_request()
696 dev_vdbg(dwc->dev, "USB_REQ_GET_STATUS"); in dwc3_ep0_std_request()
697 ret = dwc3_ep0_handle_status(dwc, ctrl); in dwc3_ep0_std_request()
700 dev_vdbg(dwc->dev, "USB_REQ_CLEAR_FEATURE"); in dwc3_ep0_std_request()
701 ret = dwc3_ep0_handle_feature(dwc, ctrl, 0); in dwc3_ep0_std_request()
704 dev_vdbg(dwc->dev, "USB_REQ_SET_FEATURE"); in dwc3_ep0_std_request()
705 ret = dwc3_ep0_handle_feature(dwc, ctrl, 1); in dwc3_ep0_std_request()
708 dev_vdbg(dwc->dev, "USB_REQ_SET_ADDRESS"); in dwc3_ep0_std_request()
709 ret = dwc3_ep0_set_address(dwc, ctrl); in dwc3_ep0_std_request()
712 dev_vdbg(dwc->dev, "USB_REQ_SET_CONFIGURATION"); in dwc3_ep0_std_request()
713 ret = dwc3_ep0_set_config(dwc, ctrl); in dwc3_ep0_std_request()
716 dev_vdbg(dwc->dev, "USB_REQ_SET_SEL"); in dwc3_ep0_std_request()
717 ret = dwc3_ep0_set_sel(dwc, ctrl); in dwc3_ep0_std_request()
720 dev_vdbg(dwc->dev, "USB_REQ_SET_ISOCH_DELAY"); in dwc3_ep0_std_request()
721 ret = dwc3_ep0_set_isoch_delay(dwc, ctrl); in dwc3_ep0_std_request()
724 dev_vdbg(dwc->dev, "Forwarding to gadget driver"); in dwc3_ep0_std_request()
725 ret = dwc3_ep0_delegate_req(dwc, ctrl); in dwc3_ep0_std_request()
735 struct usb_ctrlrequest *ctrl = dwc->ctrl_req; in dwc3_ep0_inspect_setup() local
736 int ret = -EINVAL; in dwc3_ep0_inspect_setup()
739 if (!dwc->gadget_driver) in dwc3_ep0_inspect_setup()
742 len = le16_to_cpu(ctrl->wLength); in dwc3_ep0_inspect_setup()
744 dwc->three_stage_setup = false; in dwc3_ep0_inspect_setup()
745 dwc->ep0_expect_in = false; in dwc3_ep0_inspect_setup()
746 dwc->ep0_next_event = DWC3_EP0_NRDY_STATUS; in dwc3_ep0_inspect_setup()
748 dwc->three_stage_setup = true; in dwc3_ep0_inspect_setup()
749 dwc->ep0_expect_in = !!(ctrl->bRequestType & USB_DIR_IN); in dwc3_ep0_inspect_setup()
750 dwc->ep0_next_event = DWC3_EP0_NRDY_DATA; in dwc3_ep0_inspect_setup()
753 if ((ctrl->bRequestType & USB_TYPE_MASK) == USB_TYPE_STANDARD) in dwc3_ep0_inspect_setup()
754 ret = dwc3_ep0_std_request(dwc, ctrl); in dwc3_ep0_inspect_setup()
756 ret = dwc3_ep0_delegate_req(dwc, ctrl); in dwc3_ep0_inspect_setup()
759 dwc->delayed_status = true; in dwc3_ep0_inspect_setup()
781 epnum = event->endpoint_number; in dwc3_ep0_complete_data()
782 ep0 = dwc->eps[0]; in dwc3_ep0_complete_data()
784 dwc->ep0_next_event = DWC3_EP0_NRDY_STATUS; in dwc3_ep0_complete_data()
786 trb = dwc->ep0_trb; in dwc3_ep0_complete_data()
788 r = next_request(&ep0->request_list); in dwc3_ep0_complete_data()
794 status = DWC3_TRB_SIZE_TRBSTS(trb->size); in dwc3_ep0_complete_data()
796 dev_dbg(dwc->dev, "Setup Pending received"); in dwc3_ep0_complete_data()
799 dwc3_gadget_giveback(ep0, r, -ECONNRESET); in dwc3_ep0_complete_data()
804 ur = &r->request; in dwc3_ep0_complete_data()
805 buf = ur->buf; in dwc3_ep0_complete_data()
807 length = trb->size & DWC3_TRB_SIZE_MASK; in dwc3_ep0_complete_data()
809 maxp = ep0->endpoint.maxpacket; in dwc3_ep0_complete_data()
811 if (dwc->ep0_bounced) { in dwc3_ep0_complete_data()
816 if (ur->length > DWC3_EP0_BOUNCE_SIZE) { in dwc3_ep0_complete_data()
817 transfer_size = (ur->length / maxp) * maxp; in dwc3_ep0_complete_data()
818 transferred = transfer_size - length; in dwc3_ep0_complete_data()
820 ur->actual += transferred; in dwc3_ep0_complete_data()
824 length = trb->size & DWC3_TRB_SIZE_MASK; in dwc3_ep0_complete_data()
826 ep0->free_slot = 0; in dwc3_ep0_complete_data()
829 transfer_size = roundup((ur->length - transfer_size), in dwc3_ep0_complete_data()
831 transferred = min_t(u32, ur->length - transferred, in dwc3_ep0_complete_data()
832 transfer_size - length); in dwc3_ep0_complete_data()
833 dwc3_flush_cache((uintptr_t)dwc->ep0_bounce, DWC3_EP0_BOUNCE_SIZE); in dwc3_ep0_complete_data()
834 memcpy(buf, dwc->ep0_bounce, transferred); in dwc3_ep0_complete_data()
836 transferred = ur->length - length; in dwc3_ep0_complete_data()
839 ur->actual += transferred; in dwc3_ep0_complete_data()
841 if ((epnum & 1) && ur->actual < ur->length) { in dwc3_ep0_complete_data()
848 if (IS_ALIGNED(ur->length, ep0->endpoint.maxpacket) && in dwc3_ep0_complete_data()
849 ur->length && ur->zero) { in dwc3_ep0_complete_data()
852 dwc->ep0_next_event = DWC3_EP0_COMPLETE; in dwc3_ep0_complete_data()
855 dwc->ctrl_req_addr, 0, in dwc3_ep0_complete_data()
870 dep = dwc->eps[0]; in dwc3_ep0_complete_status()
871 trb = dwc->ep0_trb; in dwc3_ep0_complete_status()
873 if (!list_empty(&dep->request_list)) { in dwc3_ep0_complete_status()
874 r = next_request(&dep->request_list); in dwc3_ep0_complete_status()
879 if (dwc->test_mode) { in dwc3_ep0_complete_status()
882 ret = dwc3_gadget_set_test_mode(dwc, dwc->test_mode_nr); in dwc3_ep0_complete_status()
884 dev_dbg(dwc->dev, "Invalid Test #%d", in dwc3_ep0_complete_status()
885 dwc->test_mode_nr); in dwc3_ep0_complete_status()
891 status = DWC3_TRB_SIZE_TRBSTS(trb->size); in dwc3_ep0_complete_status()
893 dev_dbg(dwc->dev, "Setup Pending received"); in dwc3_ep0_complete_status()
895 dwc->ep0state = EP0_SETUP_PHASE; in dwc3_ep0_complete_status()
902 struct dwc3_ep *dep = dwc->eps[event->endpoint_number]; in dwc3_ep0_xfer_complete()
904 dep->flags &= ~DWC3_EP_BUSY; in dwc3_ep0_xfer_complete()
905 dep->resource_index = 0; in dwc3_ep0_xfer_complete()
906 dwc->setup_packet_pending = false; in dwc3_ep0_xfer_complete()
908 switch (dwc->ep0state) { in dwc3_ep0_xfer_complete()
910 dev_vdbg(dwc->dev, "Setup Phase"); in dwc3_ep0_xfer_complete()
915 dev_vdbg(dwc->dev, "Data Phase"); in dwc3_ep0_xfer_complete()
920 dev_vdbg(dwc->dev, "Status Phase"); in dwc3_ep0_xfer_complete()
924 WARN(true, "UNKNOWN ep0state %d\n", dwc->ep0state); in dwc3_ep0_xfer_complete()
933 req->direction = !!dep->number; in __dwc3_ep0_do_control_data()
935 if (req->request.length == 0) { in __dwc3_ep0_do_control_data()
936 ret = dwc3_ep0_start_trans(dwc, dep->number, in __dwc3_ep0_do_control_data()
937 dwc->ctrl_req_addr, 0, in __dwc3_ep0_do_control_data()
939 } else if (!IS_ALIGNED(req->request.length, dep->endpoint.maxpacket) && in __dwc3_ep0_do_control_data()
940 (dep->number == 0)) { in __dwc3_ep0_do_control_data()
944 ret = usb_gadget_map_request(&dwc->gadget, &req->request, in __dwc3_ep0_do_control_data()
945 dep->number); in __dwc3_ep0_do_control_data()
947 dev_dbg(dwc->dev, "failed to map request\n"); in __dwc3_ep0_do_control_data()
951 maxpacket = dep->endpoint.maxpacket; in __dwc3_ep0_do_control_data()
952 if (req->request.length > DWC3_EP0_BOUNCE_SIZE) { in __dwc3_ep0_do_control_data()
953 transfer_size = (req->request.length / maxpacket) * in __dwc3_ep0_do_control_data()
955 ret = dwc3_ep0_start_trans(dwc, dep->number, in __dwc3_ep0_do_control_data()
956 req->request.dma, in __dwc3_ep0_do_control_data()
961 transfer_size = roundup((req->request.length - transfer_size), in __dwc3_ep0_do_control_data()
964 dwc->ep0_bounced = true; in __dwc3_ep0_do_control_data()
971 ret = dwc3_ep0_start_trans(dwc, dep->number, in __dwc3_ep0_do_control_data()
972 dwc->ep0_bounce_addr, transfer_size, in __dwc3_ep0_do_control_data()
975 ret = usb_gadget_map_request(&dwc->gadget, &req->request, in __dwc3_ep0_do_control_data()
976 dep->number); in __dwc3_ep0_do_control_data()
978 dev_dbg(dwc->dev, "failed to map request\n"); in __dwc3_ep0_do_control_data()
982 ret = dwc3_ep0_start_trans(dwc, dep->number, req->request.dma, in __dwc3_ep0_do_control_data()
983 req->request.length, in __dwc3_ep0_do_control_data()
992 struct dwc3 *dwc = dep->dwc; in dwc3_ep0_start_control_status()
995 type = dwc->three_stage_setup ? DWC3_TRBCTL_CONTROL_STATUS3 in dwc3_ep0_start_control_status()
998 return dwc3_ep0_start_trans(dwc, dep->number, in dwc3_ep0_start_control_status()
999 dwc->ctrl_req_addr, 0, type, 0); in dwc3_ep0_start_control_status()
1004 if (dwc->resize_fifos) { in __dwc3_ep0_do_control_status()
1005 dev_dbg(dwc->dev, "Resizing FIFOs"); in __dwc3_ep0_do_control_status()
1007 dwc->resize_fifos = 0; in __dwc3_ep0_do_control_status()
1016 struct dwc3_ep *dep = dwc->eps[event->endpoint_number]; in dwc3_ep0_do_control_status()
1027 if (!dep->resource_index) in dwc3_ep0_end_control_data()
1032 cmd |= DWC3_DEPCMD_PARAM(dep->resource_index); in dwc3_ep0_end_control_data()
1034 ret = dwc3_send_gadget_ep_cmd(dwc, dep->number, cmd, &params); in dwc3_ep0_end_control_data()
1036 dep->resource_index = 0; in dwc3_ep0_end_control_data()
1042 dwc->setup_packet_pending = true; in dwc3_ep0_xfernotready()
1044 switch (event->status) { in dwc3_ep0_xfernotready()
1046 dev_vdbg(dwc->dev, "Control Data"); in dwc3_ep0_xfernotready()
1057 if (dwc->ep0_expect_in != event->endpoint_number) { in dwc3_ep0_xfernotready()
1058 struct dwc3_ep *dep = dwc->eps[dwc->ep0_expect_in]; in dwc3_ep0_xfernotready()
1060 dev_vdbg(dwc->dev, "Wrong direction for Data phase"); in dwc3_ep0_xfernotready()
1069 if (dwc->ep0_next_event != DWC3_EP0_NRDY_STATUS) in dwc3_ep0_xfernotready()
1072 dev_vdbg(dwc->dev, "Control Status"); in dwc3_ep0_xfernotready()
1074 dwc->ep0state = EP0_STATUS_PHASE; in dwc3_ep0_xfernotready()
1076 if (dwc->delayed_status) { in dwc3_ep0_xfernotready()
1077 WARN_ON_ONCE(event->endpoint_number != 1); in dwc3_ep0_xfernotready()
1078 dev_vdbg(dwc->dev, "Delayed Status"); in dwc3_ep0_xfernotready()
1089 u8 epnum = event->endpoint_number; in dwc3_ep0_interrupt()
1091 dev_dbg(dwc->dev, "%s while ep%d%s in state '%s'", in dwc3_ep0_interrupt()
1092 dwc3_ep_event_string(event->endpoint_event), in dwc3_ep0_interrupt()
1094 dwc3_ep0_state_string(dwc->ep0state)); in dwc3_ep0_interrupt()
1096 switch (event->endpoint_event) { in dwc3_ep0_interrupt()