1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19#include <linux/kernel.h>
20#include <linux/slab.h>
21#include <linux/spinlock.h>
22#include <linux/platform_device.h>
23#include <linux/pm_runtime.h>
24#include <linux/interrupt.h>
25#include <linux/io.h>
26#include <linux/list.h>
27#include <linux/dma-mapping.h>
28
29#include <linux/usb/ch9.h>
30#include <linux/usb/gadget.h>
31#include <linux/usb/composite.h>
32
33#include "core.h"
34#include "debug.h"
35#include "gadget.h"
36#include "io.h"
37
38static void __dwc3_ep0_do_control_status(struct dwc3 *dwc, struct dwc3_ep *dep);
39static void __dwc3_ep0_do_control_data(struct dwc3 *dwc,
40 struct dwc3_ep *dep, struct dwc3_request *req);
41
42static const char *dwc3_ep0_state_string(enum dwc3_ep0_state state)
43{
44 switch (state) {
45 case EP0_UNCONNECTED:
46 return "Unconnected";
47 case EP0_SETUP_PHASE:
48 return "Setup Phase";
49 case EP0_DATA_PHASE:
50 return "Data Phase";
51 case EP0_STATUS_PHASE:
52 return "Status Phase";
53 default:
54 return "UNKNOWN";
55 }
56}
57
58static int dwc3_ep0_start_trans(struct dwc3 *dwc, u8 epnum, dma_addr_t buf_dma,
59 u32 len, u32 type, bool chain)
60{
61 struct dwc3_gadget_ep_cmd_params params;
62 struct dwc3_trb *trb;
63 struct dwc3_ep *dep;
64
65 int ret;
66
67 dep = dwc->eps[epnum];
68 if (dep->flags & DWC3_EP_BUSY) {
69 dwc3_trace(trace_dwc3_ep0, "%s still busy", dep->name);
70 return 0;
71 }
72
73 trb = &dwc->ep0_trb[dep->trb_enqueue];
74
75 if (chain)
76 dep->trb_enqueue++;
77
78 trb->bpl = lower_32_bits(buf_dma);
79 trb->bph = upper_32_bits(buf_dma);
80 trb->size = len;
81 trb->ctrl = type;
82
83 trb->ctrl |= (DWC3_TRB_CTRL_HWO
84 | DWC3_TRB_CTRL_ISP_IMI);
85
86 if (chain)
87 trb->ctrl |= DWC3_TRB_CTRL_CHN;
88 else
89 trb->ctrl |= (DWC3_TRB_CTRL_IOC
90 | DWC3_TRB_CTRL_LST);
91
92 if (chain)
93 return 0;
94
95 memset(¶ms, 0, sizeof(params));
96 params.param0 = upper_32_bits(dwc->ep0_trb_addr);
97 params.param1 = lower_32_bits(dwc->ep0_trb_addr);
98
99 trace_dwc3_prepare_trb(dep, trb);
100
101 ret = dwc3_send_gadget_ep_cmd(dep, DWC3_DEPCMD_STARTTRANSFER, ¶ms);
102 if (ret < 0) {
103 dwc3_trace(trace_dwc3_ep0, "%s STARTTRANSFER failed",
104 dep->name);
105 return ret;
106 }
107
108 dep->flags |= DWC3_EP_BUSY;
109 dep->resource_index = dwc3_gadget_ep_get_transfer_index(dep);
110 dwc->ep0_next_event = DWC3_EP0_COMPLETE;
111
112 return 0;
113}
114
115static int __dwc3_gadget_ep0_queue(struct dwc3_ep *dep,
116 struct dwc3_request *req)
117{
118 struct dwc3 *dwc = dep->dwc;
119
120 req->request.actual = 0;
121 req->request.status = -EINPROGRESS;
122 req->epnum = dep->number;
123
124 list_add_tail(&req->list, &dep->pending_list);
125
126
127
128
129
130
131
132
133
134
135 if (dep->flags & DWC3_EP_PENDING_REQUEST) {
136 unsigned direction;
137
138 direction = !!(dep->flags & DWC3_EP0_DIR_IN);
139
140 if (dwc->ep0state != EP0_DATA_PHASE) {
141 dev_WARN(dwc->dev, "Unexpected pending request\n");
142 return 0;
143 }
144
145 __dwc3_ep0_do_control_data(dwc, dwc->eps[direction], req);
146
147 dep->flags &= ~(DWC3_EP_PENDING_REQUEST |
148 DWC3_EP0_DIR_IN);
149
150 return 0;
151 }
152
153
154
155
156
157 if (dwc->delayed_status) {
158 unsigned direction;
159
160 direction = !dwc->ep0_expect_in;
161 dwc->delayed_status = false;
162 usb_gadget_set_state(&dwc->gadget, USB_STATE_CONFIGURED);
163
164 if (dwc->ep0state == EP0_STATUS_PHASE)
165 __dwc3_ep0_do_control_status(dwc, dwc->eps[direction]);
166 else
167 dwc3_trace(trace_dwc3_ep0,
168 "too early for delayed status");
169
170 return 0;
171 }
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205 if (dwc->three_stage_setup) {
206 unsigned direction;
207
208 direction = dwc->ep0_expect_in;
209 dwc->ep0state = EP0_DATA_PHASE;
210
211 __dwc3_ep0_do_control_data(dwc, dwc->eps[direction], req);
212
213 dep->flags &= ~DWC3_EP0_DIR_IN;
214 }
215
216 return 0;
217}
218
219int dwc3_gadget_ep0_queue(struct usb_ep *ep, struct usb_request *request,
220 gfp_t gfp_flags)
221{
222 struct dwc3_request *req = to_dwc3_request(request);
223 struct dwc3_ep *dep = to_dwc3_ep(ep);
224 struct dwc3 *dwc = dep->dwc;
225
226 unsigned long flags;
227
228 int ret;
229
230 spin_lock_irqsave(&dwc->lock, flags);
231 if (!dep->endpoint.desc) {
232 dwc3_trace(trace_dwc3_ep0,
233 "trying to queue request %p to disabled %s",
234 request, dep->name);
235 ret = -ESHUTDOWN;
236 goto out;
237 }
238
239
240 if (!list_empty(&dep->pending_list)) {
241 ret = -EBUSY;
242 goto out;
243 }
244
245 dwc3_trace(trace_dwc3_ep0,
246 "queueing request %p to %s length %d state '%s'",
247 request, dep->name, request->length,
248 dwc3_ep0_state_string(dwc->ep0state));
249
250 ret = __dwc3_gadget_ep0_queue(dep, req);
251
252out:
253 spin_unlock_irqrestore(&dwc->lock, flags);
254
255 return ret;
256}
257
258static void dwc3_ep0_stall_and_restart(struct dwc3 *dwc)
259{
260 struct dwc3_ep *dep;
261
262
263 dep = dwc->eps[1];
264 dep->flags = DWC3_EP_ENABLED;
265
266
267 dep = dwc->eps[0];
268 __dwc3_gadget_ep_set_halt(dep, 1, false);
269 dep->flags = DWC3_EP_ENABLED;
270 dwc->delayed_status = false;
271
272 if (!list_empty(&dep->pending_list)) {
273 struct dwc3_request *req;
274
275 req = next_request(&dep->pending_list);
276 dwc3_gadget_giveback(dep, req, -ECONNRESET);
277 }
278
279 dwc->ep0state = EP0_SETUP_PHASE;
280 dwc3_ep0_out_start(dwc);
281}
282
283int __dwc3_gadget_ep0_set_halt(struct usb_ep *ep, int value)
284{
285 struct dwc3_ep *dep = to_dwc3_ep(ep);
286 struct dwc3 *dwc = dep->dwc;
287
288 dwc3_ep0_stall_and_restart(dwc);
289
290 return 0;
291}
292
293int dwc3_gadget_ep0_set_halt(struct usb_ep *ep, int value)
294{
295 struct dwc3_ep *dep = to_dwc3_ep(ep);
296 struct dwc3 *dwc = dep->dwc;
297 unsigned long flags;
298 int ret;
299
300 spin_lock_irqsave(&dwc->lock, flags);
301 ret = __dwc3_gadget_ep0_set_halt(ep, value);
302 spin_unlock_irqrestore(&dwc->lock, flags);
303
304 return ret;
305}
306
307void dwc3_ep0_out_start(struct dwc3 *dwc)
308{
309 int ret;
310
311 ret = dwc3_ep0_start_trans(dwc, 0, dwc->ctrl_req_addr, 8,
312 DWC3_TRBCTL_CONTROL_SETUP, false);
313 WARN_ON(ret < 0);
314}
315
316static struct dwc3_ep *dwc3_wIndex_to_dep(struct dwc3 *dwc, __le16 wIndex_le)
317{
318 struct dwc3_ep *dep;
319 u32 windex = le16_to_cpu(wIndex_le);
320 u32 epnum;
321
322 epnum = (windex & USB_ENDPOINT_NUMBER_MASK) << 1;
323 if ((windex & USB_ENDPOINT_DIR_MASK) == USB_DIR_IN)
324 epnum |= 1;
325
326 dep = dwc->eps[epnum];
327 if (dep->flags & DWC3_EP_ENABLED)
328 return dep;
329
330 return NULL;
331}
332
333static void dwc3_ep0_status_cmpl(struct usb_ep *ep, struct usb_request *req)
334{
335}
336
337
338
339static int dwc3_ep0_handle_status(struct dwc3 *dwc,
340 struct usb_ctrlrequest *ctrl)
341{
342 struct dwc3_ep *dep;
343 u32 recip;
344 u32 reg;
345 u16 usb_status = 0;
346 __le16 *response_pkt;
347
348 recip = ctrl->bRequestType & USB_RECIP_MASK;
349 switch (recip) {
350 case USB_RECIP_DEVICE:
351
352
353
354 usb_status |= dwc->gadget.is_selfpowered;
355
356 if ((dwc->speed == DWC3_DSTS_SUPERSPEED) ||
357 (dwc->speed == DWC3_DSTS_SUPERSPEED_PLUS)) {
358 reg = dwc3_readl(dwc->regs, DWC3_DCTL);
359 if (reg & DWC3_DCTL_INITU1ENA)
360 usb_status |= 1 << USB_DEV_STAT_U1_ENABLED;
361 if (reg & DWC3_DCTL_INITU2ENA)
362 usb_status |= 1 << USB_DEV_STAT_U2_ENABLED;
363 }
364
365 break;
366
367 case USB_RECIP_INTERFACE:
368
369
370
371
372 break;
373
374 case USB_RECIP_ENDPOINT:
375 dep = dwc3_wIndex_to_dep(dwc, ctrl->wIndex);
376 if (!dep)
377 return -EINVAL;
378
379 if (dep->flags & DWC3_EP_STALL)
380 usb_status = 1 << USB_ENDPOINT_HALT;
381 break;
382 default:
383 return -EINVAL;
384 }
385
386 response_pkt = (__le16 *) dwc->setup_buf;
387 *response_pkt = cpu_to_le16(usb_status);
388
389 dep = dwc->eps[0];
390 dwc->ep0_usb_req.dep = dep;
391 dwc->ep0_usb_req.request.length = sizeof(*response_pkt);
392 dwc->ep0_usb_req.request.buf = dwc->setup_buf;
393 dwc->ep0_usb_req.request.complete = dwc3_ep0_status_cmpl;
394
395 return __dwc3_gadget_ep0_queue(dep, &dwc->ep0_usb_req);
396}
397
398static int dwc3_ep0_handle_feature(struct dwc3 *dwc,
399 struct usb_ctrlrequest *ctrl, int set)
400{
401 struct dwc3_ep *dep;
402 u32 recip;
403 u32 wValue;
404 u32 wIndex;
405 u32 reg;
406 int ret;
407 enum usb_device_state state;
408
409 wValue = le16_to_cpu(ctrl->wValue);
410 wIndex = le16_to_cpu(ctrl->wIndex);
411 recip = ctrl->bRequestType & USB_RECIP_MASK;
412 state = dwc->gadget.state;
413
414 switch (recip) {
415 case USB_RECIP_DEVICE:
416
417 switch (wValue) {
418 case USB_DEVICE_REMOTE_WAKEUP:
419 break;
420
421
422
423
424 case USB_DEVICE_U1_ENABLE:
425 if (state != USB_STATE_CONFIGURED)
426 return -EINVAL;
427 if ((dwc->speed != DWC3_DSTS_SUPERSPEED) &&
428 (dwc->speed != DWC3_DSTS_SUPERSPEED_PLUS))
429 return -EINVAL;
430
431 reg = dwc3_readl(dwc->regs, DWC3_DCTL);
432 if (set)
433 reg |= DWC3_DCTL_INITU1ENA;
434 else
435 reg &= ~DWC3_DCTL_INITU1ENA;
436 dwc3_writel(dwc->regs, DWC3_DCTL, reg);
437 break;
438
439 case USB_DEVICE_U2_ENABLE:
440 if (state != USB_STATE_CONFIGURED)
441 return -EINVAL;
442 if ((dwc->speed != DWC3_DSTS_SUPERSPEED) &&
443 (dwc->speed != DWC3_DSTS_SUPERSPEED_PLUS))
444 return -EINVAL;
445
446 reg = dwc3_readl(dwc->regs, DWC3_DCTL);
447 if (set)
448 reg |= DWC3_DCTL_INITU2ENA;
449 else
450 reg &= ~DWC3_DCTL_INITU2ENA;
451 dwc3_writel(dwc->regs, DWC3_DCTL, reg);
452 break;
453
454 case USB_DEVICE_LTM_ENABLE:
455 return -EINVAL;
456
457 case USB_DEVICE_TEST_MODE:
458 if ((wIndex & 0xff) != 0)
459 return -EINVAL;
460 if (!set)
461 return -EINVAL;
462
463 switch (wIndex >> 8) {
464 case TEST_J:
465 case TEST_K:
466 case TEST_SE0_NAK:
467 case TEST_PACKET:
468 case TEST_FORCE_EN:
469 dwc->test_mode_nr = wIndex >> 8;
470 dwc->test_mode = true;
471 break;
472 default:
473 return -EINVAL;
474 }
475 break;
476 default:
477 return -EINVAL;
478 }
479 break;
480
481 case USB_RECIP_INTERFACE:
482 switch (wValue) {
483 case USB_INTRF_FUNC_SUSPEND:
484 if (wIndex & USB_INTRF_FUNC_SUSPEND_LP)
485
486 ;
487 if (wIndex & USB_INTRF_FUNC_SUSPEND_RW)
488
489 ;
490 break;
491 default:
492 return -EINVAL;
493 }
494 break;
495
496 case USB_RECIP_ENDPOINT:
497 switch (wValue) {
498 case USB_ENDPOINT_HALT:
499 dep = dwc3_wIndex_to_dep(dwc, ctrl->wIndex);
500 if (!dep)
501 return -EINVAL;
502 if (set == 0 && (dep->flags & DWC3_EP_WEDGE))
503 break;
504 ret = __dwc3_gadget_ep_set_halt(dep, set, true);
505 if (ret)
506 return -EINVAL;
507 break;
508 default:
509 return -EINVAL;
510 }
511 break;
512
513 default:
514 return -EINVAL;
515 }
516
517 return 0;
518}
519
520static int dwc3_ep0_set_address(struct dwc3 *dwc, struct usb_ctrlrequest *ctrl)
521{
522 enum usb_device_state state = dwc->gadget.state;
523 u32 addr;
524 u32 reg;
525
526 addr = le16_to_cpu(ctrl->wValue);
527 if (addr > 127) {
528 dwc3_trace(trace_dwc3_ep0, "invalid device address %d", addr);
529 return -EINVAL;
530 }
531
532 if (state == USB_STATE_CONFIGURED) {
533 dwc3_trace(trace_dwc3_ep0,
534 "trying to set address when configured");
535 return -EINVAL;
536 }
537
538 reg = dwc3_readl(dwc->regs, DWC3_DCFG);
539 reg &= ~(DWC3_DCFG_DEVADDR_MASK);
540 reg |= DWC3_DCFG_DEVADDR(addr);
541 dwc3_writel(dwc->regs, DWC3_DCFG, reg);
542
543 if (addr)
544 usb_gadget_set_state(&dwc->gadget, USB_STATE_ADDRESS);
545 else
546 usb_gadget_set_state(&dwc->gadget, USB_STATE_DEFAULT);
547
548 return 0;
549}
550
551static int dwc3_ep0_delegate_req(struct dwc3 *dwc, struct usb_ctrlrequest *ctrl)
552{
553 int ret;
554
555 spin_unlock(&dwc->lock);
556 ret = dwc->gadget_driver->setup(&dwc->gadget, ctrl);
557 spin_lock(&dwc->lock);
558 return ret;
559}
560
561static int dwc3_ep0_set_config(struct dwc3 *dwc, struct usb_ctrlrequest *ctrl)
562{
563 enum usb_device_state state = dwc->gadget.state;
564 u32 cfg;
565 int ret;
566 u32 reg;
567
568 cfg = le16_to_cpu(ctrl->wValue);
569
570 switch (state) {
571 case USB_STATE_DEFAULT:
572 return -EINVAL;
573
574 case USB_STATE_ADDRESS:
575 ret = dwc3_ep0_delegate_req(dwc, ctrl);
576
577 if (cfg && (!ret || (ret == USB_GADGET_DELAYED_STATUS))) {
578
579
580
581
582
583
584
585 if (ret == 0)
586 usb_gadget_set_state(&dwc->gadget,
587 USB_STATE_CONFIGURED);
588
589
590
591
592
593 reg = dwc3_readl(dwc->regs, DWC3_DCTL);
594 reg |= (DWC3_DCTL_ACCEPTU1ENA | DWC3_DCTL_ACCEPTU2ENA);
595 dwc3_writel(dwc->regs, DWC3_DCTL, reg);
596 }
597 break;
598
599 case USB_STATE_CONFIGURED:
600 ret = dwc3_ep0_delegate_req(dwc, ctrl);
601 if (!cfg && !ret)
602 usb_gadget_set_state(&dwc->gadget,
603 USB_STATE_ADDRESS);
604 break;
605 default:
606 ret = -EINVAL;
607 }
608 return ret;
609}
610
611static void dwc3_ep0_set_sel_cmpl(struct usb_ep *ep, struct usb_request *req)
612{
613 struct dwc3_ep *dep = to_dwc3_ep(ep);
614 struct dwc3 *dwc = dep->dwc;
615
616 u32 param = 0;
617 u32 reg;
618
619 struct timing {
620 u8 u1sel;
621 u8 u1pel;
622 __le16 u2sel;
623 __le16 u2pel;
624 } __packed timing;
625
626 int ret;
627
628 memcpy(&timing, req->buf, sizeof(timing));
629
630 dwc->u1sel = timing.u1sel;
631 dwc->u1pel = timing.u1pel;
632 dwc->u2sel = le16_to_cpu(timing.u2sel);
633 dwc->u2pel = le16_to_cpu(timing.u2pel);
634
635 reg = dwc3_readl(dwc->regs, DWC3_DCTL);
636 if (reg & DWC3_DCTL_INITU2ENA)
637 param = dwc->u2pel;
638 if (reg & DWC3_DCTL_INITU1ENA)
639 param = dwc->u1pel;
640
641
642
643
644
645
646 if (param > 125)
647 param = 0;
648
649
650 ret = dwc3_send_gadget_generic_command(dwc,
651 DWC3_DGCMD_SET_PERIODIC_PAR, param);
652 WARN_ON(ret < 0);
653}
654
655static int dwc3_ep0_set_sel(struct dwc3 *dwc, struct usb_ctrlrequest *ctrl)
656{
657 struct dwc3_ep *dep;
658 enum usb_device_state state = dwc->gadget.state;
659 u16 wLength;
660 u16 wValue;
661
662 if (state == USB_STATE_DEFAULT)
663 return -EINVAL;
664
665 wValue = le16_to_cpu(ctrl->wValue);
666 wLength = le16_to_cpu(ctrl->wLength);
667
668 if (wLength != 6) {
669 dev_err(dwc->dev, "Set SEL should be 6 bytes, got %d\n",
670 wLength);
671 return -EINVAL;
672 }
673
674
675
676
677
678
679
680
681
682 dep = dwc->eps[0];
683 dwc->ep0_usb_req.dep = dep;
684 dwc->ep0_usb_req.request.length = dep->endpoint.maxpacket;
685 dwc->ep0_usb_req.request.buf = dwc->setup_buf;
686 dwc->ep0_usb_req.request.complete = dwc3_ep0_set_sel_cmpl;
687
688 return __dwc3_gadget_ep0_queue(dep, &dwc->ep0_usb_req);
689}
690
691static int dwc3_ep0_set_isoch_delay(struct dwc3 *dwc, struct usb_ctrlrequest *ctrl)
692{
693 u16 wLength;
694 u16 wValue;
695 u16 wIndex;
696
697 wValue = le16_to_cpu(ctrl->wValue);
698 wLength = le16_to_cpu(ctrl->wLength);
699 wIndex = le16_to_cpu(ctrl->wIndex);
700
701 if (wIndex || wLength)
702 return -EINVAL;
703
704
705
706
707
708 dwc->isoch_delay = wValue;
709
710 return 0;
711}
712
713static int dwc3_ep0_std_request(struct dwc3 *dwc, struct usb_ctrlrequest *ctrl)
714{
715 int ret;
716
717 switch (ctrl->bRequest) {
718 case USB_REQ_GET_STATUS:
719 dwc3_trace(trace_dwc3_ep0, "USB_REQ_GET_STATUS");
720 ret = dwc3_ep0_handle_status(dwc, ctrl);
721 break;
722 case USB_REQ_CLEAR_FEATURE:
723 dwc3_trace(trace_dwc3_ep0, "USB_REQ_CLEAR_FEATURE");
724 ret = dwc3_ep0_handle_feature(dwc, ctrl, 0);
725 break;
726 case USB_REQ_SET_FEATURE:
727 dwc3_trace(trace_dwc3_ep0, "USB_REQ_SET_FEATURE");
728 ret = dwc3_ep0_handle_feature(dwc, ctrl, 1);
729 break;
730 case USB_REQ_SET_ADDRESS:
731 dwc3_trace(trace_dwc3_ep0, "USB_REQ_SET_ADDRESS");
732 ret = dwc3_ep0_set_address(dwc, ctrl);
733 break;
734 case USB_REQ_SET_CONFIGURATION:
735 dwc3_trace(trace_dwc3_ep0, "USB_REQ_SET_CONFIGURATION");
736 ret = dwc3_ep0_set_config(dwc, ctrl);
737 break;
738 case USB_REQ_SET_SEL:
739 dwc3_trace(trace_dwc3_ep0, "USB_REQ_SET_SEL");
740 ret = dwc3_ep0_set_sel(dwc, ctrl);
741 break;
742 case USB_REQ_SET_ISOCH_DELAY:
743 dwc3_trace(trace_dwc3_ep0, "USB_REQ_SET_ISOCH_DELAY");
744 ret = dwc3_ep0_set_isoch_delay(dwc, ctrl);
745 break;
746 default:
747 dwc3_trace(trace_dwc3_ep0, "Forwarding to gadget driver");
748 ret = dwc3_ep0_delegate_req(dwc, ctrl);
749 break;
750 }
751
752 return ret;
753}
754
755static void dwc3_ep0_inspect_setup(struct dwc3 *dwc,
756 const struct dwc3_event_depevt *event)
757{
758 struct usb_ctrlrequest *ctrl = dwc->ctrl_req;
759 int ret = -EINVAL;
760 u32 len;
761
762 if (!dwc->gadget_driver)
763 goto out;
764
765 trace_dwc3_ctrl_req(ctrl);
766
767 len = le16_to_cpu(ctrl->wLength);
768 if (!len) {
769 dwc->three_stage_setup = false;
770 dwc->ep0_expect_in = false;
771 dwc->ep0_next_event = DWC3_EP0_NRDY_STATUS;
772 } else {
773 dwc->three_stage_setup = true;
774 dwc->ep0_expect_in = !!(ctrl->bRequestType & USB_DIR_IN);
775 dwc->ep0_next_event = DWC3_EP0_NRDY_DATA;
776 }
777
778 if ((ctrl->bRequestType & USB_TYPE_MASK) == USB_TYPE_STANDARD)
779 ret = dwc3_ep0_std_request(dwc, ctrl);
780 else
781 ret = dwc3_ep0_delegate_req(dwc, ctrl);
782
783 if (ret == USB_GADGET_DELAYED_STATUS)
784 dwc->delayed_status = true;
785
786out:
787 if (ret < 0)
788 dwc3_ep0_stall_and_restart(dwc);
789}
790
791static void dwc3_ep0_complete_data(struct dwc3 *dwc,
792 const struct dwc3_event_depevt *event)
793{
794 struct dwc3_request *r = NULL;
795 struct usb_request *ur;
796 struct dwc3_trb *trb;
797 struct dwc3_ep *ep0;
798 unsigned transfer_size = 0;
799 unsigned maxp;
800 unsigned remaining_ur_length;
801 void *buf;
802 u32 transferred = 0;
803 u32 status;
804 u32 length;
805 u8 epnum;
806
807 epnum = event->endpoint_number;
808 ep0 = dwc->eps[0];
809
810 dwc->ep0_next_event = DWC3_EP0_NRDY_STATUS;
811
812 trb = dwc->ep0_trb;
813
814 trace_dwc3_complete_trb(ep0, trb);
815
816 r = next_request(&ep0->pending_list);
817 if (!r)
818 return;
819
820 status = DWC3_TRB_SIZE_TRBSTS(trb->size);
821 if (status == DWC3_TRBSTS_SETUP_PENDING) {
822 dwc->setup_packet_pending = true;
823
824 dwc3_trace(trace_dwc3_ep0, "Setup Pending received");
825
826 if (r)
827 dwc3_gadget_giveback(ep0, r, -ECONNRESET);
828
829 return;
830 }
831
832 ur = &r->request;
833 buf = ur->buf;
834 remaining_ur_length = ur->length;
835
836 length = trb->size & DWC3_TRB_SIZE_MASK;
837
838 maxp = ep0->endpoint.maxpacket;
839
840 if (dwc->ep0_bounced) {
841
842
843
844
845 if (ur->length > DWC3_EP0_BOUNCE_SIZE) {
846 transfer_size = ALIGN(ur->length - maxp, maxp);
847 transferred = transfer_size - length;
848 buf = (u8 *)buf + transferred;
849 ur->actual += transferred;
850 remaining_ur_length -= transferred;
851
852 trb++;
853 length = trb->size & DWC3_TRB_SIZE_MASK;
854
855 ep0->trb_enqueue = 0;
856 }
857
858 transfer_size = roundup((ur->length - transfer_size),
859 maxp);
860
861 transferred = min_t(u32, remaining_ur_length,
862 transfer_size - length);
863 memcpy(buf, dwc->ep0_bounce, transferred);
864 } else {
865 transferred = ur->length - length;
866 }
867
868 ur->actual += transferred;
869
870 if ((epnum & 1) && ur->actual < ur->length) {
871
872
873 dwc3_ep0_stall_and_restart(dwc);
874 } else {
875 dwc3_gadget_giveback(ep0, r, 0);
876
877 if (IS_ALIGNED(ur->length, ep0->endpoint.maxpacket) &&
878 ur->length && ur->zero) {
879 int ret;
880
881 dwc->ep0_next_event = DWC3_EP0_COMPLETE;
882
883 ret = dwc3_ep0_start_trans(dwc, epnum,
884 dwc->ctrl_req_addr, 0,
885 DWC3_TRBCTL_CONTROL_DATA, false);
886 WARN_ON(ret < 0);
887 }
888 }
889}
890
891static void dwc3_ep0_complete_status(struct dwc3 *dwc,
892 const struct dwc3_event_depevt *event)
893{
894 struct dwc3_request *r;
895 struct dwc3_ep *dep;
896 struct dwc3_trb *trb;
897 u32 status;
898
899 dep = dwc->eps[0];
900 trb = dwc->ep0_trb;
901
902 trace_dwc3_complete_trb(dep, trb);
903
904 if (!list_empty(&dep->pending_list)) {
905 r = next_request(&dep->pending_list);
906
907 dwc3_gadget_giveback(dep, r, 0);
908 }
909
910 if (dwc->test_mode) {
911 int ret;
912
913 ret = dwc3_gadget_set_test_mode(dwc, dwc->test_mode_nr);
914 if (ret < 0) {
915 dwc3_trace(trace_dwc3_ep0, "Invalid Test #%d",
916 dwc->test_mode_nr);
917 dwc3_ep0_stall_and_restart(dwc);
918 return;
919 }
920 }
921
922 status = DWC3_TRB_SIZE_TRBSTS(trb->size);
923 if (status == DWC3_TRBSTS_SETUP_PENDING) {
924 dwc->setup_packet_pending = true;
925 dwc3_trace(trace_dwc3_ep0, "Setup Pending received");
926 }
927
928 dwc->ep0state = EP0_SETUP_PHASE;
929 dwc3_ep0_out_start(dwc);
930}
931
932static void dwc3_ep0_xfer_complete(struct dwc3 *dwc,
933 const struct dwc3_event_depevt *event)
934{
935 struct dwc3_ep *dep = dwc->eps[event->endpoint_number];
936
937 dep->flags &= ~DWC3_EP_BUSY;
938 dep->resource_index = 0;
939 dwc->setup_packet_pending = false;
940
941 switch (dwc->ep0state) {
942 case EP0_SETUP_PHASE:
943 dwc3_trace(trace_dwc3_ep0, "Setup Phase");
944 dwc3_ep0_inspect_setup(dwc, event);
945 break;
946
947 case EP0_DATA_PHASE:
948 dwc3_trace(trace_dwc3_ep0, "Data Phase");
949 dwc3_ep0_complete_data(dwc, event);
950 break;
951
952 case EP0_STATUS_PHASE:
953 dwc3_trace(trace_dwc3_ep0, "Status Phase");
954 dwc3_ep0_complete_status(dwc, event);
955 break;
956 default:
957 WARN(true, "UNKNOWN ep0state %d\n", dwc->ep0state);
958 }
959}
960
961static void __dwc3_ep0_do_control_data(struct dwc3 *dwc,
962 struct dwc3_ep *dep, struct dwc3_request *req)
963{
964 int ret;
965
966 req->direction = !!dep->number;
967
968 if (req->request.length == 0) {
969 ret = dwc3_ep0_start_trans(dwc, dep->number,
970 dwc->ctrl_req_addr, 0,
971 DWC3_TRBCTL_CONTROL_DATA, false);
972 } else if (!IS_ALIGNED(req->request.length, dep->endpoint.maxpacket)
973 && (dep->number == 0)) {
974 u32 transfer_size = 0;
975 u32 maxpacket;
976
977 ret = usb_gadget_map_request(&dwc->gadget, &req->request,
978 dep->number);
979 if (ret) {
980 dwc3_trace(trace_dwc3_ep0, "failed to map request");
981 return;
982 }
983
984 maxpacket = dep->endpoint.maxpacket;
985
986 if (req->request.length > DWC3_EP0_BOUNCE_SIZE) {
987 transfer_size = ALIGN(req->request.length - maxpacket,
988 maxpacket);
989 ret = dwc3_ep0_start_trans(dwc, dep->number,
990 req->request.dma,
991 transfer_size,
992 DWC3_TRBCTL_CONTROL_DATA,
993 true);
994 }
995
996 transfer_size = roundup((req->request.length - transfer_size),
997 maxpacket);
998
999 dwc->ep0_bounced = true;
1000
1001 ret = dwc3_ep0_start_trans(dwc, dep->number,
1002 dwc->ep0_bounce_addr, transfer_size,
1003 DWC3_TRBCTL_CONTROL_DATA, false);
1004 } else {
1005 ret = usb_gadget_map_request(&dwc->gadget, &req->request,
1006 dep->number);
1007 if (ret) {
1008 dwc3_trace(trace_dwc3_ep0, "failed to map request");
1009 return;
1010 }
1011
1012 ret = dwc3_ep0_start_trans(dwc, dep->number, req->request.dma,
1013 req->request.length, DWC3_TRBCTL_CONTROL_DATA,
1014 false);
1015 }
1016
1017 WARN_ON(ret < 0);
1018}
1019
1020static int dwc3_ep0_start_control_status(struct dwc3_ep *dep)
1021{
1022 struct dwc3 *dwc = dep->dwc;
1023 u32 type;
1024
1025 type = dwc->three_stage_setup ? DWC3_TRBCTL_CONTROL_STATUS3
1026 : DWC3_TRBCTL_CONTROL_STATUS2;
1027
1028 return dwc3_ep0_start_trans(dwc, dep->number,
1029 dwc->ctrl_req_addr, 0, type, false);
1030}
1031
1032static void __dwc3_ep0_do_control_status(struct dwc3 *dwc, struct dwc3_ep *dep)
1033{
1034 WARN_ON(dwc3_ep0_start_control_status(dep));
1035}
1036
1037static void dwc3_ep0_do_control_status(struct dwc3 *dwc,
1038 const struct dwc3_event_depevt *event)
1039{
1040 struct dwc3_ep *dep = dwc->eps[event->endpoint_number];
1041
1042 __dwc3_ep0_do_control_status(dwc, dep);
1043}
1044
1045static void dwc3_ep0_end_control_data(struct dwc3 *dwc, struct dwc3_ep *dep)
1046{
1047 struct dwc3_gadget_ep_cmd_params params;
1048 u32 cmd;
1049 int ret;
1050
1051 if (!dep->resource_index)
1052 return;
1053
1054 cmd = DWC3_DEPCMD_ENDTRANSFER;
1055 cmd |= DWC3_DEPCMD_CMDIOC;
1056 cmd |= DWC3_DEPCMD_PARAM(dep->resource_index);
1057 memset(¶ms, 0, sizeof(params));
1058 ret = dwc3_send_gadget_ep_cmd(dep, cmd, ¶ms);
1059 WARN_ON_ONCE(ret);
1060 dep->resource_index = 0;
1061}
1062
1063static void dwc3_ep0_xfernotready(struct dwc3 *dwc,
1064 const struct dwc3_event_depevt *event)
1065{
1066 switch (event->status) {
1067 case DEPEVT_STATUS_CONTROL_DATA:
1068 dwc3_trace(trace_dwc3_ep0, "Control Data");
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079 if (dwc->ep0_expect_in != event->endpoint_number) {
1080 struct dwc3_ep *dep = dwc->eps[dwc->ep0_expect_in];
1081
1082 dwc3_trace(trace_dwc3_ep0,
1083 "Wrong direction for Data phase");
1084 dwc3_ep0_end_control_data(dwc, dep);
1085 dwc3_ep0_stall_and_restart(dwc);
1086 return;
1087 }
1088
1089 break;
1090
1091 case DEPEVT_STATUS_CONTROL_STATUS:
1092 if (dwc->ep0_next_event != DWC3_EP0_NRDY_STATUS)
1093 return;
1094
1095 dwc3_trace(trace_dwc3_ep0, "Control Status");
1096
1097 dwc->ep0state = EP0_STATUS_PHASE;
1098
1099 if (dwc->delayed_status) {
1100 WARN_ON_ONCE(event->endpoint_number != 1);
1101 dwc3_trace(trace_dwc3_ep0, "Delayed Status");
1102 return;
1103 }
1104
1105 dwc3_ep0_do_control_status(dwc, event);
1106 }
1107}
1108
1109void dwc3_ep0_interrupt(struct dwc3 *dwc,
1110 const struct dwc3_event_depevt *event)
1111{
1112 dwc3_trace(trace_dwc3_ep0, "%s: state '%s'",
1113 dwc3_ep_event_string(event),
1114 dwc3_ep0_state_string(dwc->ep0state));
1115
1116 switch (event->endpoint_event) {
1117 case DWC3_DEPEVT_XFERCOMPLETE:
1118 dwc3_ep0_xfer_complete(dwc, event);
1119 break;
1120
1121 case DWC3_DEPEVT_XFERNOTREADY:
1122 dwc3_ep0_xfernotready(dwc, event);
1123 break;
1124
1125 case DWC3_DEPEVT_XFERINPROGRESS:
1126 case DWC3_DEPEVT_RXTXFIFOEVT:
1127 case DWC3_DEPEVT_STREAMEVT:
1128 case DWC3_DEPEVT_EPCMDCMPLT:
1129 break;
1130 }
1131}
1132