1
2
3
4
5
6
7
8
9
10
11#include <linux/kernel.h>
12#include <linux/delay.h>
13#include <linux/slab.h>
14#include <linux/spinlock.h>
15#include <linux/platform_device.h>
16#include <linux/pm_runtime.h>
17#include <linux/interrupt.h>
18#include <linux/io.h>
19#include <linux/list.h>
20#include <linux/dma-mapping.h>
21
22#include <linux/usb/ch9.h>
23#include <linux/usb/gadget.h>
24
25#include "debug.h"
26#include "core.h"
27#include "gadget.h"
28#include "io.h"
29
30#define DWC3_ALIGN_FRAME(d, n) (((d)->frame_number + ((d)->interval * (n))) \
31 & ~((d)->interval - 1))
32
33
34
35
36
37
38
39
40
41int dwc3_gadget_set_test_mode(struct dwc3 *dwc, int mode)
42{
43 u32 reg;
44
45 reg = dwc3_readl(dwc->regs, DWC3_DCTL);
46 reg &= ~DWC3_DCTL_TSTCTRL_MASK;
47
48 switch (mode) {
49 case USB_TEST_J:
50 case USB_TEST_K:
51 case USB_TEST_SE0_NAK:
52 case USB_TEST_PACKET:
53 case USB_TEST_FORCE_ENABLE:
54 reg |= mode << 1;
55 break;
56 default:
57 return -EINVAL;
58 }
59
60 dwc3_gadget_dctl_write_safe(dwc, reg);
61
62 return 0;
63}
64
65
66
67
68
69
70
71
72int dwc3_gadget_get_link_state(struct dwc3 *dwc)
73{
74 u32 reg;
75
76 reg = dwc3_readl(dwc->regs, DWC3_DSTS);
77
78 return DWC3_DSTS_USBLNKST(reg);
79}
80
81
82
83
84
85
86
87
88
89int dwc3_gadget_set_link_state(struct dwc3 *dwc, enum dwc3_link_state state)
90{
91 int retries = 10000;
92 u32 reg;
93
94
95
96
97
98 if (!DWC3_VER_IS_PRIOR(DWC3, 194A)) {
99 while (--retries) {
100 reg = dwc3_readl(dwc->regs, DWC3_DSTS);
101 if (reg & DWC3_DSTS_DCNRD)
102 udelay(5);
103 else
104 break;
105 }
106
107 if (retries <= 0)
108 return -ETIMEDOUT;
109 }
110
111 reg = dwc3_readl(dwc->regs, DWC3_DCTL);
112 reg &= ~DWC3_DCTL_ULSTCHNGREQ_MASK;
113
114
115 dwc3_writel(dwc->regs, DWC3_DCTL, reg);
116
117
118 reg |= DWC3_DCTL_ULSTCHNGREQ(state);
119 dwc3_writel(dwc->regs, DWC3_DCTL, reg);
120
121
122
123
124
125 if (!DWC3_VER_IS_PRIOR(DWC3, 194A))
126 return 0;
127
128
129 retries = 10000;
130 while (--retries) {
131 reg = dwc3_readl(dwc->regs, DWC3_DSTS);
132
133 if (DWC3_DSTS_USBLNKST(reg) == state)
134 return 0;
135
136 udelay(5);
137 }
138
139 return -ETIMEDOUT;
140}
141
142
143
144
145
146
147
148
149
150static void dwc3_ep_inc_trb(u8 *index)
151{
152 (*index)++;
153 if (*index == (DWC3_TRB_NUM - 1))
154 *index = 0;
155}
156
157
158
159
160
161static void dwc3_ep_inc_enq(struct dwc3_ep *dep)
162{
163 dwc3_ep_inc_trb(&dep->trb_enqueue);
164}
165
166
167
168
169
170static void dwc3_ep_inc_deq(struct dwc3_ep *dep)
171{
172 dwc3_ep_inc_trb(&dep->trb_dequeue);
173}
174
175static void dwc3_gadget_del_and_unmap_request(struct dwc3_ep *dep,
176 struct dwc3_request *req, int status)
177{
178 struct dwc3 *dwc = dep->dwc;
179
180 list_del(&req->list);
181 req->remaining = 0;
182 req->needs_extra_trb = false;
183
184 if (req->request.status == -EINPROGRESS)
185 req->request.status = status;
186
187 if (req->trb)
188 usb_gadget_unmap_request_by_dev(dwc->sysdev,
189 &req->request, req->direction);
190
191 req->trb = NULL;
192 trace_dwc3_gadget_giveback(req);
193
194 if (dep->number > 1)
195 pm_runtime_put(dwc->dev);
196}
197
198
199
200
201
202
203
204
205
206
207
208void dwc3_gadget_giveback(struct dwc3_ep *dep, struct dwc3_request *req,
209 int status)
210{
211 struct dwc3 *dwc = dep->dwc;
212
213 dwc3_gadget_del_and_unmap_request(dep, req, status);
214 req->status = DWC3_REQUEST_STATUS_COMPLETED;
215
216 spin_unlock(&dwc->lock);
217 usb_gadget_giveback_request(&dep->endpoint, &req->request);
218 spin_lock(&dwc->lock);
219}
220
221
222
223
224
225
226
227
228
229
230int dwc3_send_gadget_generic_command(struct dwc3 *dwc, unsigned int cmd,
231 u32 param)
232{
233 u32 timeout = 500;
234 int status = 0;
235 int ret = 0;
236 u32 reg;
237
238 dwc3_writel(dwc->regs, DWC3_DGCMDPAR, param);
239 dwc3_writel(dwc->regs, DWC3_DGCMD, cmd | DWC3_DGCMD_CMDACT);
240
241 do {
242 reg = dwc3_readl(dwc->regs, DWC3_DGCMD);
243 if (!(reg & DWC3_DGCMD_CMDACT)) {
244 status = DWC3_DGCMD_STATUS(reg);
245 if (status)
246 ret = -EINVAL;
247 break;
248 }
249 } while (--timeout);
250
251 if (!timeout) {
252 ret = -ETIMEDOUT;
253 status = -ETIMEDOUT;
254 }
255
256 trace_dwc3_gadget_generic_cmd(cmd, param, status);
257
258 return ret;
259}
260
261static int __dwc3_gadget_wakeup(struct dwc3 *dwc);
262
263
264
265
266
267
268
269
270
271
272int dwc3_send_gadget_ep_cmd(struct dwc3_ep *dep, unsigned int cmd,
273 struct dwc3_gadget_ep_cmd_params *params)
274{
275 const struct usb_endpoint_descriptor *desc = dep->endpoint.desc;
276 struct dwc3 *dwc = dep->dwc;
277 u32 timeout = 5000;
278 u32 saved_config = 0;
279 u32 reg;
280
281 int cmd_status = 0;
282 int ret = -EINVAL;
283
284
285
286
287
288
289
290
291
292
293
294 if (dwc->gadget->speed <= USB_SPEED_HIGH) {
295 reg = dwc3_readl(dwc->regs, DWC3_GUSB2PHYCFG(0));
296 if (unlikely(reg & DWC3_GUSB2PHYCFG_SUSPHY)) {
297 saved_config |= DWC3_GUSB2PHYCFG_SUSPHY;
298 reg &= ~DWC3_GUSB2PHYCFG_SUSPHY;
299 }
300
301 if (reg & DWC3_GUSB2PHYCFG_ENBLSLPM) {
302 saved_config |= DWC3_GUSB2PHYCFG_ENBLSLPM;
303 reg &= ~DWC3_GUSB2PHYCFG_ENBLSLPM;
304 }
305
306 if (saved_config)
307 dwc3_writel(dwc->regs, DWC3_GUSB2PHYCFG(0), reg);
308 }
309
310 if (DWC3_DEPCMD_CMD(cmd) == DWC3_DEPCMD_STARTTRANSFER) {
311 int link_state;
312
313 link_state = dwc3_gadget_get_link_state(dwc);
314 if (link_state == DWC3_LINK_STATE_U1 ||
315 link_state == DWC3_LINK_STATE_U2 ||
316 link_state == DWC3_LINK_STATE_U3) {
317 ret = __dwc3_gadget_wakeup(dwc);
318 dev_WARN_ONCE(dwc->dev, ret, "wakeup failed --> %d\n",
319 ret);
320 }
321 }
322
323 dwc3_writel(dep->regs, DWC3_DEPCMDPAR0, params->param0);
324 dwc3_writel(dep->regs, DWC3_DEPCMDPAR1, params->param1);
325 dwc3_writel(dep->regs, DWC3_DEPCMDPAR2, params->param2);
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342 if (DWC3_DEPCMD_CMD(cmd) == DWC3_DEPCMD_UPDATETRANSFER &&
343 !usb_endpoint_xfer_isoc(desc))
344 cmd &= ~(DWC3_DEPCMD_CMDIOC | DWC3_DEPCMD_CMDACT);
345 else
346 cmd |= DWC3_DEPCMD_CMDACT;
347
348 dwc3_writel(dep->regs, DWC3_DEPCMD, cmd);
349 do {
350 reg = dwc3_readl(dep->regs, DWC3_DEPCMD);
351 if (!(reg & DWC3_DEPCMD_CMDACT)) {
352 cmd_status = DWC3_DEPCMD_STATUS(reg);
353
354 switch (cmd_status) {
355 case 0:
356 ret = 0;
357 break;
358 case DEPEVT_TRANSFER_NO_RESOURCE:
359 dev_WARN(dwc->dev, "No resource for %s\n",
360 dep->name);
361 ret = -EINVAL;
362 break;
363 case DEPEVT_TRANSFER_BUS_EXPIRY:
364
365
366
367
368
369
370
371
372
373
374
375 ret = -EAGAIN;
376 break;
377 default:
378 dev_WARN(dwc->dev, "UNKNOWN cmd status\n");
379 }
380
381 break;
382 }
383 } while (--timeout);
384
385 if (timeout == 0) {
386 ret = -ETIMEDOUT;
387 cmd_status = -ETIMEDOUT;
388 }
389
390 trace_dwc3_gadget_ep_cmd(dep, cmd, params, cmd_status);
391
392 if (DWC3_DEPCMD_CMD(cmd) == DWC3_DEPCMD_STARTTRANSFER) {
393 if (ret == 0)
394 dep->flags |= DWC3_EP_TRANSFER_STARTED;
395
396 if (ret != -ETIMEDOUT)
397 dwc3_gadget_ep_get_transfer_index(dep);
398 }
399
400 if (saved_config) {
401 reg = dwc3_readl(dwc->regs, DWC3_GUSB2PHYCFG(0));
402 reg |= saved_config;
403 dwc3_writel(dwc->regs, DWC3_GUSB2PHYCFG(0), reg);
404 }
405
406 return ret;
407}
408
409static int dwc3_send_clear_stall_ep_cmd(struct dwc3_ep *dep)
410{
411 struct dwc3 *dwc = dep->dwc;
412 struct dwc3_gadget_ep_cmd_params params;
413 u32 cmd = DWC3_DEPCMD_CLEARSTALL;
414
415
416
417
418
419
420
421
422
423 if (dep->direction &&
424 !DWC3_VER_IS_PRIOR(DWC3, 260A) &&
425 (dwc->gadget->speed >= USB_SPEED_SUPER))
426 cmd |= DWC3_DEPCMD_CLEARPENDIN;
427
428 memset(¶ms, 0, sizeof(params));
429
430 return dwc3_send_gadget_ep_cmd(dep, cmd, ¶ms);
431}
432
433static dma_addr_t dwc3_trb_dma_offset(struct dwc3_ep *dep,
434 struct dwc3_trb *trb)
435{
436 u32 offset = (char *) trb - (char *) dep->trb_pool;
437
438 return dep->trb_pool_dma + offset;
439}
440
441static int dwc3_alloc_trb_pool(struct dwc3_ep *dep)
442{
443 struct dwc3 *dwc = dep->dwc;
444
445 if (dep->trb_pool)
446 return 0;
447
448 dep->trb_pool = dma_alloc_coherent(dwc->sysdev,
449 sizeof(struct dwc3_trb) * DWC3_TRB_NUM,
450 &dep->trb_pool_dma, GFP_KERNEL);
451 if (!dep->trb_pool) {
452 dev_err(dep->dwc->dev, "failed to allocate trb pool for %s\n",
453 dep->name);
454 return -ENOMEM;
455 }
456
457 return 0;
458}
459
460static void dwc3_free_trb_pool(struct dwc3_ep *dep)
461{
462 struct dwc3 *dwc = dep->dwc;
463
464 dma_free_coherent(dwc->sysdev, sizeof(struct dwc3_trb) * DWC3_TRB_NUM,
465 dep->trb_pool, dep->trb_pool_dma);
466
467 dep->trb_pool = NULL;
468 dep->trb_pool_dma = 0;
469}
470
471static int dwc3_gadget_set_xfer_resource(struct dwc3_ep *dep)
472{
473 struct dwc3_gadget_ep_cmd_params params;
474
475 memset(¶ms, 0x00, sizeof(params));
476
477 params.param0 = DWC3_DEPXFERCFG_NUM_XFER_RES(1);
478
479 return dwc3_send_gadget_ep_cmd(dep, DWC3_DEPCMD_SETTRANSFRESOURCE,
480 ¶ms);
481}
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516static int dwc3_gadget_start_config(struct dwc3_ep *dep)
517{
518 struct dwc3_gadget_ep_cmd_params params;
519 struct dwc3 *dwc;
520 u32 cmd;
521 int i;
522 int ret;
523
524 if (dep->number)
525 return 0;
526
527 memset(¶ms, 0x00, sizeof(params));
528 cmd = DWC3_DEPCMD_DEPSTARTCFG;
529 dwc = dep->dwc;
530
531 ret = dwc3_send_gadget_ep_cmd(dep, cmd, ¶ms);
532 if (ret)
533 return ret;
534
535 for (i = 0; i < DWC3_ENDPOINTS_NUM; i++) {
536 struct dwc3_ep *dep = dwc->eps[i];
537
538 if (!dep)
539 continue;
540
541 ret = dwc3_gadget_set_xfer_resource(dep);
542 if (ret)
543 return ret;
544 }
545
546 return 0;
547}
548
549static int dwc3_gadget_set_ep_config(struct dwc3_ep *dep, unsigned int action)
550{
551 const struct usb_ss_ep_comp_descriptor *comp_desc;
552 const struct usb_endpoint_descriptor *desc;
553 struct dwc3_gadget_ep_cmd_params params;
554 struct dwc3 *dwc = dep->dwc;
555
556 comp_desc = dep->endpoint.comp_desc;
557 desc = dep->endpoint.desc;
558
559 memset(¶ms, 0x00, sizeof(params));
560
561 params.param0 = DWC3_DEPCFG_EP_TYPE(usb_endpoint_type(desc))
562 | DWC3_DEPCFG_MAX_PACKET_SIZE(usb_endpoint_maxp(desc));
563
564
565 if (dwc->gadget->speed >= USB_SPEED_SUPER) {
566 u32 burst = dep->endpoint.maxburst;
567
568 params.param0 |= DWC3_DEPCFG_BURST_SIZE(burst - 1);
569 }
570
571 params.param0 |= action;
572 if (action == DWC3_DEPCFG_ACTION_RESTORE)
573 params.param2 |= dep->saved_state;
574
575 if (usb_endpoint_xfer_control(desc))
576 params.param1 = DWC3_DEPCFG_XFER_COMPLETE_EN;
577
578 if (dep->number <= 1 || usb_endpoint_xfer_isoc(desc))
579 params.param1 |= DWC3_DEPCFG_XFER_NOT_READY_EN;
580
581 if (usb_ss_max_streams(comp_desc) && usb_endpoint_xfer_bulk(desc)) {
582 params.param1 |= DWC3_DEPCFG_STREAM_CAPABLE
583 | DWC3_DEPCFG_XFER_COMPLETE_EN
584 | DWC3_DEPCFG_STREAM_EVENT_EN;
585 dep->stream_capable = true;
586 }
587
588 if (!usb_endpoint_xfer_control(desc))
589 params.param1 |= DWC3_DEPCFG_XFER_IN_PROGRESS_EN;
590
591
592
593
594
595
596
597 params.param1 |= DWC3_DEPCFG_EP_NUMBER(dep->number);
598
599
600
601
602
603 if (dep->direction)
604 params.param0 |= DWC3_DEPCFG_FIFO_NUMBER(dep->number >> 1);
605
606 if (desc->bInterval) {
607 u8 bInterval_m1;
608
609
610
611
612
613
614
615
616
617 bInterval_m1 = min_t(u8, desc->bInterval - 1, 13);
618
619 if (usb_endpoint_type(desc) == USB_ENDPOINT_XFER_INT &&
620 dwc->gadget->speed == USB_SPEED_FULL)
621 dep->interval = desc->bInterval;
622 else
623 dep->interval = 1 << (desc->bInterval - 1);
624
625 params.param1 |= DWC3_DEPCFG_BINTERVAL_M1(bInterval_m1);
626 }
627
628 return dwc3_send_gadget_ep_cmd(dep, DWC3_DEPCMD_SETEPCONFIG, ¶ms);
629}
630
631static void dwc3_stop_active_transfer(struct dwc3_ep *dep, bool force,
632 bool interrupt);
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651static int dwc3_gadget_calc_tx_fifo_size(struct dwc3 *dwc, int mult)
652{
653 int max_packet = 1024;
654 int fifo_size;
655 int mdwidth;
656
657 mdwidth = dwc3_mdwidth(dwc);
658
659
660 mdwidth >>= 3;
661
662 if (DWC3_VER_IS_PRIOR(DWC3, 290A))
663 fifo_size = mult * (max_packet / mdwidth) + 1;
664 else
665 fifo_size = mult * ((max_packet + mdwidth) / mdwidth) + 1;
666 return fifo_size;
667}
668
669
670
671
672
673
674
675
676void dwc3_gadget_clear_tx_fifos(struct dwc3 *dwc)
677{
678 struct dwc3_ep *dep;
679 int fifo_depth;
680 int size;
681 int num;
682
683 if (!dwc->do_fifo_resize)
684 return;
685
686
687 dep = dwc->eps[1];
688 size = dwc3_readl(dwc->regs, DWC3_GTXFIFOSIZ(0));
689 if (DWC3_IP_IS(DWC3))
690 fifo_depth = DWC3_GTXFIFOSIZ_TXFDEP(size);
691 else
692 fifo_depth = DWC31_GTXFIFOSIZ_TXFDEP(size);
693
694 dwc->last_fifo_depth = fifo_depth;
695
696 for (num = 3; num < min_t(int, dwc->num_eps, DWC3_ENDPOINTS_NUM);
697 num += 2) {
698 dep = dwc->eps[num];
699
700 size = DWC3_IP_IS(DWC3) ? 0 :
701 dwc3_readl(dwc->regs, DWC3_GTXFIFOSIZ(num >> 1)) &
702 DWC31_GTXFIFOSIZ_TXFRAMNUM;
703
704 dwc3_writel(dwc->regs, DWC3_GTXFIFOSIZ(num >> 1), size);
705 }
706 dwc->num_ep_resized = 0;
707}
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730static int dwc3_gadget_resize_tx_fifos(struct dwc3_ep *dep)
731{
732 struct dwc3 *dwc = dep->dwc;
733 int fifo_0_start;
734 int ram1_depth;
735 int fifo_size;
736 int min_depth;
737 int num_in_ep;
738 int remaining;
739 int num_fifos = 1;
740 int fifo;
741 int tmp;
742
743 if (!dwc->do_fifo_resize)
744 return 0;
745
746
747 if (!usb_endpoint_dir_in(dep->endpoint.desc) || dep->number <= 1)
748 return 0;
749
750 ram1_depth = DWC3_RAM1_DEPTH(dwc->hwparams.hwparams7);
751
752 if ((dep->endpoint.maxburst > 1 &&
753 usb_endpoint_xfer_bulk(dep->endpoint.desc)) ||
754 usb_endpoint_xfer_isoc(dep->endpoint.desc))
755 num_fifos = 3;
756
757 if (dep->endpoint.maxburst > 6 &&
758 usb_endpoint_xfer_bulk(dep->endpoint.desc) && DWC3_IP_IS(DWC31))
759 num_fifos = dwc->tx_fifo_resize_max_num;
760
761
762 fifo = dwc3_gadget_calc_tx_fifo_size(dwc, 1);
763
764
765 num_in_ep = dwc->max_cfg_eps;
766 num_in_ep -= dwc->num_ep_resized;
767
768
769 min_depth = num_in_ep * (fifo + 1);
770 remaining = ram1_depth - min_depth - dwc->last_fifo_depth;
771 remaining = max_t(int, 0, remaining);
772
773
774
775
776
777 fifo_size = (num_fifos - 1) * fifo;
778 if (remaining < fifo_size)
779 fifo_size = remaining;
780
781 fifo_size += fifo;
782
783 fifo_size++;
784
785
786 tmp = dwc3_readl(dwc->regs, DWC3_GTXFIFOSIZ(0));
787 fifo_0_start = DWC3_GTXFIFOSIZ_TXFSTADDR(tmp);
788
789 fifo_size |= (fifo_0_start + (dwc->last_fifo_depth << 16));
790 if (DWC3_IP_IS(DWC3))
791 dwc->last_fifo_depth += DWC3_GTXFIFOSIZ_TXFDEP(fifo_size);
792 else
793 dwc->last_fifo_depth += DWC31_GTXFIFOSIZ_TXFDEP(fifo_size);
794
795
796 if (dwc->last_fifo_depth >= ram1_depth) {
797 dev_err(dwc->dev, "Fifosize(%d) > RAM size(%d) %s depth:%d\n",
798 dwc->last_fifo_depth, ram1_depth,
799 dep->endpoint.name, fifo_size);
800 if (DWC3_IP_IS(DWC3))
801 fifo_size = DWC3_GTXFIFOSIZ_TXFDEP(fifo_size);
802 else
803 fifo_size = DWC31_GTXFIFOSIZ_TXFDEP(fifo_size);
804
805 dwc->last_fifo_depth -= fifo_size;
806 return -ENOMEM;
807 }
808
809 dwc3_writel(dwc->regs, DWC3_GTXFIFOSIZ(dep->number >> 1), fifo_size);
810 dwc->num_ep_resized++;
811
812 return 0;
813}
814
815
816
817
818
819
820
821
822
823static int __dwc3_gadget_ep_enable(struct dwc3_ep *dep, unsigned int action)
824{
825 const struct usb_endpoint_descriptor *desc = dep->endpoint.desc;
826 struct dwc3 *dwc = dep->dwc;
827
828 u32 reg;
829 int ret;
830
831 if (!(dep->flags & DWC3_EP_ENABLED)) {
832 ret = dwc3_gadget_resize_tx_fifos(dep);
833 if (ret)
834 return ret;
835
836 ret = dwc3_gadget_start_config(dep);
837 if (ret)
838 return ret;
839 }
840
841 ret = dwc3_gadget_set_ep_config(dep, action);
842 if (ret)
843 return ret;
844
845 if (!(dep->flags & DWC3_EP_ENABLED)) {
846 struct dwc3_trb *trb_st_hw;
847 struct dwc3_trb *trb_link;
848
849 dep->type = usb_endpoint_type(desc);
850 dep->flags |= DWC3_EP_ENABLED;
851
852 reg = dwc3_readl(dwc->regs, DWC3_DALEPENA);
853 reg |= DWC3_DALEPENA_EP(dep->number);
854 dwc3_writel(dwc->regs, DWC3_DALEPENA, reg);
855
856 if (usb_endpoint_xfer_control(desc))
857 goto out;
858
859
860 dep->trb_dequeue = 0;
861 dep->trb_enqueue = 0;
862 memset(dep->trb_pool, 0,
863 sizeof(struct dwc3_trb) * DWC3_TRB_NUM);
864
865
866 trb_st_hw = &dep->trb_pool[0];
867
868 trb_link = &dep->trb_pool[DWC3_TRB_NUM - 1];
869 trb_link->bpl = lower_32_bits(dwc3_trb_dma_offset(dep, trb_st_hw));
870 trb_link->bph = upper_32_bits(dwc3_trb_dma_offset(dep, trb_st_hw));
871 trb_link->ctrl |= DWC3_TRBCTL_LINK_TRB;
872 trb_link->ctrl |= DWC3_TRB_CTRL_HWO;
873 }
874
875
876
877
878
879 if (usb_endpoint_xfer_bulk(desc) ||
880 usb_endpoint_xfer_int(desc)) {
881 struct dwc3_gadget_ep_cmd_params params;
882 struct dwc3_trb *trb;
883 dma_addr_t trb_dma;
884 u32 cmd;
885
886 memset(¶ms, 0, sizeof(params));
887 trb = &dep->trb_pool[0];
888 trb_dma = dwc3_trb_dma_offset(dep, trb);
889
890 params.param0 = upper_32_bits(trb_dma);
891 params.param1 = lower_32_bits(trb_dma);
892
893 cmd = DWC3_DEPCMD_STARTTRANSFER;
894
895 ret = dwc3_send_gadget_ep_cmd(dep, cmd, ¶ms);
896 if (ret < 0)
897 return ret;
898
899 if (dep->stream_capable) {
900
901
902
903
904
905
906
907
908
909
910
911
912 dwc3_stop_active_transfer(dep, true, true);
913
914
915
916
917
918
919
920
921
922
923
924 if (!dep->direction ||
925 !(dwc->hwparams.hwparams9 &
926 DWC3_GHWPARAMS9_DEV_TXF_FLUSH_BYPASS))
927 dep->flags |= DWC3_EP_FORCE_RESTART_STREAM;
928 }
929 }
930
931out:
932 trace_dwc3_gadget_ep_enable(dep);
933
934 return 0;
935}
936
937static void dwc3_remove_requests(struct dwc3 *dwc, struct dwc3_ep *dep)
938{
939 struct dwc3_request *req;
940
941 dwc3_stop_active_transfer(dep, true, false);
942
943
944 while (!list_empty(&dep->started_list)) {
945 req = next_request(&dep->started_list);
946
947 dwc3_gadget_giveback(dep, req, -ESHUTDOWN);
948 }
949
950 while (!list_empty(&dep->pending_list)) {
951 req = next_request(&dep->pending_list);
952
953 dwc3_gadget_giveback(dep, req, -ESHUTDOWN);
954 }
955
956 while (!list_empty(&dep->cancelled_list)) {
957 req = next_request(&dep->cancelled_list);
958
959 dwc3_gadget_giveback(dep, req, -ESHUTDOWN);
960 }
961}
962
963
964
965
966
967
968
969
970
971
972
973static int __dwc3_gadget_ep_disable(struct dwc3_ep *dep)
974{
975 struct dwc3 *dwc = dep->dwc;
976 u32 reg;
977
978 trace_dwc3_gadget_ep_disable(dep);
979
980
981 if (dep->flags & DWC3_EP_STALL)
982 __dwc3_gadget_ep_set_halt(dep, 0, false);
983
984 reg = dwc3_readl(dwc->regs, DWC3_DALEPENA);
985 reg &= ~DWC3_DALEPENA_EP(dep->number);
986 dwc3_writel(dwc->regs, DWC3_DALEPENA, reg);
987
988
989 if (dep->number > 1) {
990 dep->endpoint.comp_desc = NULL;
991 dep->endpoint.desc = NULL;
992 }
993
994 dwc3_remove_requests(dwc, dep);
995
996 dep->stream_capable = false;
997 dep->type = 0;
998 dep->flags = 0;
999
1000 return 0;
1001}
1002
1003
1004
1005static int dwc3_gadget_ep0_enable(struct usb_ep *ep,
1006 const struct usb_endpoint_descriptor *desc)
1007{
1008 return -EINVAL;
1009}
1010
1011static int dwc3_gadget_ep0_disable(struct usb_ep *ep)
1012{
1013 return -EINVAL;
1014}
1015
1016
1017
1018static int dwc3_gadget_ep_enable(struct usb_ep *ep,
1019 const struct usb_endpoint_descriptor *desc)
1020{
1021 struct dwc3_ep *dep;
1022 struct dwc3 *dwc;
1023 unsigned long flags;
1024 int ret;
1025
1026 if (!ep || !desc || desc->bDescriptorType != USB_DT_ENDPOINT) {
1027 pr_debug("dwc3: invalid parameters\n");
1028 return -EINVAL;
1029 }
1030
1031 if (!desc->wMaxPacketSize) {
1032 pr_debug("dwc3: missing wMaxPacketSize\n");
1033 return -EINVAL;
1034 }
1035
1036 dep = to_dwc3_ep(ep);
1037 dwc = dep->dwc;
1038
1039 if (dev_WARN_ONCE(dwc->dev, dep->flags & DWC3_EP_ENABLED,
1040 "%s is already enabled\n",
1041 dep->name))
1042 return 0;
1043
1044 spin_lock_irqsave(&dwc->lock, flags);
1045 ret = __dwc3_gadget_ep_enable(dep, DWC3_DEPCFG_ACTION_INIT);
1046 spin_unlock_irqrestore(&dwc->lock, flags);
1047
1048 return ret;
1049}
1050
1051static int dwc3_gadget_ep_disable(struct usb_ep *ep)
1052{
1053 struct dwc3_ep *dep;
1054 struct dwc3 *dwc;
1055 unsigned long flags;
1056 int ret;
1057
1058 if (!ep) {
1059 pr_debug("dwc3: invalid parameters\n");
1060 return -EINVAL;
1061 }
1062
1063 dep = to_dwc3_ep(ep);
1064 dwc = dep->dwc;
1065
1066 if (dev_WARN_ONCE(dwc->dev, !(dep->flags & DWC3_EP_ENABLED),
1067 "%s is already disabled\n",
1068 dep->name))
1069 return 0;
1070
1071 spin_lock_irqsave(&dwc->lock, flags);
1072 ret = __dwc3_gadget_ep_disable(dep);
1073 spin_unlock_irqrestore(&dwc->lock, flags);
1074
1075 return ret;
1076}
1077
1078static struct usb_request *dwc3_gadget_ep_alloc_request(struct usb_ep *ep,
1079 gfp_t gfp_flags)
1080{
1081 struct dwc3_request *req;
1082 struct dwc3_ep *dep = to_dwc3_ep(ep);
1083
1084 req = kzalloc(sizeof(*req), gfp_flags);
1085 if (!req)
1086 return NULL;
1087
1088 req->direction = dep->direction;
1089 req->epnum = dep->number;
1090 req->dep = dep;
1091 req->status = DWC3_REQUEST_STATUS_UNKNOWN;
1092
1093 trace_dwc3_alloc_request(req);
1094
1095 return &req->request;
1096}
1097
1098static void dwc3_gadget_ep_free_request(struct usb_ep *ep,
1099 struct usb_request *request)
1100{
1101 struct dwc3_request *req = to_dwc3_request(request);
1102
1103 trace_dwc3_free_request(req);
1104 kfree(req);
1105}
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116static struct dwc3_trb *dwc3_ep_prev_trb(struct dwc3_ep *dep, u8 index)
1117{
1118 u8 tmp = index;
1119
1120 if (!tmp)
1121 tmp = DWC3_TRB_NUM - 1;
1122
1123 return &dep->trb_pool[tmp - 1];
1124}
1125
1126static u32 dwc3_calc_trbs_left(struct dwc3_ep *dep)
1127{
1128 u8 trbs_left;
1129
1130
1131
1132
1133
1134
1135 if (dep->trb_enqueue == dep->trb_dequeue) {
1136
1137
1138
1139
1140 if (!list_empty(&dep->started_list))
1141 return 0;
1142
1143 return DWC3_TRB_NUM - 1;
1144 }
1145
1146 trbs_left = dep->trb_dequeue - dep->trb_enqueue;
1147 trbs_left &= (DWC3_TRB_NUM - 1);
1148
1149 if (dep->trb_dequeue < dep->trb_enqueue)
1150 trbs_left--;
1151
1152 return trbs_left;
1153}
1154
1155static void __dwc3_prepare_one_trb(struct dwc3_ep *dep, struct dwc3_trb *trb,
1156 dma_addr_t dma, unsigned int length, unsigned int chain,
1157 unsigned int node, unsigned int stream_id,
1158 unsigned int short_not_ok, unsigned int no_interrupt,
1159 unsigned int is_last, bool must_interrupt)
1160{
1161 struct dwc3 *dwc = dep->dwc;
1162 struct usb_gadget *gadget = dwc->gadget;
1163 enum usb_device_speed speed = gadget->speed;
1164
1165 trb->size = DWC3_TRB_SIZE_LENGTH(length);
1166 trb->bpl = lower_32_bits(dma);
1167 trb->bph = upper_32_bits(dma);
1168
1169 switch (usb_endpoint_type(dep->endpoint.desc)) {
1170 case USB_ENDPOINT_XFER_CONTROL:
1171 trb->ctrl = DWC3_TRBCTL_CONTROL_SETUP;
1172 break;
1173
1174 case USB_ENDPOINT_XFER_ISOC:
1175 if (!node) {
1176 trb->ctrl = DWC3_TRBCTL_ISOCHRONOUS_FIRST;
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200 if (speed == USB_SPEED_HIGH) {
1201 struct usb_ep *ep = &dep->endpoint;
1202 unsigned int mult = 2;
1203 unsigned int maxp = usb_endpoint_maxp(ep->desc);
1204
1205 if (length <= (2 * maxp))
1206 mult--;
1207
1208 if (length <= maxp)
1209 mult--;
1210
1211 trb->size |= DWC3_TRB_SIZE_PCM1(mult);
1212 }
1213 } else {
1214 trb->ctrl = DWC3_TRBCTL_ISOCHRONOUS;
1215 }
1216
1217
1218 trb->ctrl |= DWC3_TRB_CTRL_ISP_IMI;
1219 break;
1220
1221 case USB_ENDPOINT_XFER_BULK:
1222 case USB_ENDPOINT_XFER_INT:
1223 trb->ctrl = DWC3_TRBCTL_NORMAL;
1224 break;
1225 default:
1226
1227
1228
1229
1230 dev_WARN(dwc->dev, "Unknown endpoint type %d\n",
1231 usb_endpoint_type(dep->endpoint.desc));
1232 }
1233
1234
1235
1236
1237
1238 if (usb_endpoint_dir_out(dep->endpoint.desc)) {
1239 if (!dep->stream_capable)
1240 trb->ctrl |= DWC3_TRB_CTRL_CSP;
1241
1242 if (short_not_ok)
1243 trb->ctrl |= DWC3_TRB_CTRL_ISP_IMI;
1244 }
1245
1246 if ((!no_interrupt && !chain) || must_interrupt)
1247 trb->ctrl |= DWC3_TRB_CTRL_IOC;
1248
1249 if (chain)
1250 trb->ctrl |= DWC3_TRB_CTRL_CHN;
1251 else if (dep->stream_capable && is_last)
1252 trb->ctrl |= DWC3_TRB_CTRL_LST;
1253
1254 if (usb_endpoint_xfer_bulk(dep->endpoint.desc) && dep->stream_capable)
1255 trb->ctrl |= DWC3_TRB_CTRL_SID_SOFN(stream_id);
1256
1257 trb->ctrl |= DWC3_TRB_CTRL_HWO;
1258
1259 dwc3_ep_inc_enq(dep);
1260
1261 trace_dwc3_prepare_trb(dep, trb);
1262}
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274static void dwc3_prepare_one_trb(struct dwc3_ep *dep,
1275 struct dwc3_request *req, unsigned int trb_length,
1276 unsigned int chain, unsigned int node, bool use_bounce_buffer,
1277 bool must_interrupt)
1278{
1279 struct dwc3_trb *trb;
1280 dma_addr_t dma;
1281 unsigned int stream_id = req->request.stream_id;
1282 unsigned int short_not_ok = req->request.short_not_ok;
1283 unsigned int no_interrupt = req->request.no_interrupt;
1284 unsigned int is_last = req->request.is_last;
1285
1286 if (use_bounce_buffer)
1287 dma = dep->dwc->bounce_addr;
1288 else if (req->request.num_sgs > 0)
1289 dma = sg_dma_address(req->start_sg);
1290 else
1291 dma = req->request.dma;
1292
1293 trb = &dep->trb_pool[dep->trb_enqueue];
1294
1295 if (!req->trb) {
1296 dwc3_gadget_move_started_request(req);
1297 req->trb = trb;
1298 req->trb_dma = dwc3_trb_dma_offset(dep, trb);
1299 }
1300
1301 req->num_trbs++;
1302
1303 __dwc3_prepare_one_trb(dep, trb, dma, trb_length, chain, node,
1304 stream_id, short_not_ok, no_interrupt, is_last,
1305 must_interrupt);
1306}
1307
1308static bool dwc3_needs_extra_trb(struct dwc3_ep *dep, struct dwc3_request *req)
1309{
1310 unsigned int maxp = usb_endpoint_maxp(dep->endpoint.desc);
1311 unsigned int rem = req->request.length % maxp;
1312
1313 if ((req->request.length && req->request.zero && !rem &&
1314 !usb_endpoint_xfer_isoc(dep->endpoint.desc)) ||
1315 (!req->direction && rem))
1316 return true;
1317
1318 return false;
1319}
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330static int dwc3_prepare_last_sg(struct dwc3_ep *dep,
1331 struct dwc3_request *req, unsigned int entry_length,
1332 unsigned int node)
1333{
1334 unsigned int maxp = usb_endpoint_maxp(dep->endpoint.desc);
1335 unsigned int rem = req->request.length % maxp;
1336 unsigned int num_trbs = 1;
1337
1338 if (dwc3_needs_extra_trb(dep, req))
1339 num_trbs++;
1340
1341 if (dwc3_calc_trbs_left(dep) < num_trbs)
1342 return 0;
1343
1344 req->needs_extra_trb = num_trbs > 1;
1345
1346
1347 if (req->direction || req->request.length)
1348 dwc3_prepare_one_trb(dep, req, entry_length,
1349 req->needs_extra_trb, node, false, false);
1350
1351
1352 if ((!req->direction && !req->request.length) || req->needs_extra_trb)
1353 dwc3_prepare_one_trb(dep, req,
1354 req->direction ? 0 : maxp - rem,
1355 false, 1, true, false);
1356
1357 return num_trbs;
1358}
1359
1360static int dwc3_prepare_trbs_sg(struct dwc3_ep *dep,
1361 struct dwc3_request *req)
1362{
1363 struct scatterlist *sg = req->start_sg;
1364 struct scatterlist *s;
1365 int i;
1366 unsigned int length = req->request.length;
1367 unsigned int remaining = req->request.num_mapped_sgs
1368 - req->num_queued_sgs;
1369 unsigned int num_trbs = req->num_trbs;
1370 bool needs_extra_trb = dwc3_needs_extra_trb(dep, req);
1371
1372
1373
1374
1375
1376 for_each_sg(req->request.sg, s, req->num_queued_sgs, i)
1377 length -= sg_dma_len(s);
1378
1379 for_each_sg(sg, s, remaining, i) {
1380 unsigned int num_trbs_left = dwc3_calc_trbs_left(dep);
1381 unsigned int trb_length;
1382 bool must_interrupt = false;
1383 bool last_sg = false;
1384
1385 trb_length = min_t(unsigned int, length, sg_dma_len(s));
1386
1387 length -= trb_length;
1388
1389
1390
1391
1392
1393
1394
1395
1396 if ((i == remaining - 1) || !length)
1397 last_sg = true;
1398
1399 if (!num_trbs_left)
1400 break;
1401
1402 if (last_sg) {
1403 if (!dwc3_prepare_last_sg(dep, req, trb_length, i))
1404 break;
1405 } else {
1406
1407
1408
1409
1410
1411
1412 if (num_trbs_left == 1 || (needs_extra_trb &&
1413 num_trbs_left <= 2 &&
1414 sg_dma_len(sg_next(s)) >= length))
1415 must_interrupt = true;
1416
1417 dwc3_prepare_one_trb(dep, req, trb_length, 1, i, false,
1418 must_interrupt);
1419 }
1420
1421
1422
1423
1424
1425
1426
1427
1428 if (!last_sg)
1429 req->start_sg = sg_next(s);
1430
1431 req->num_queued_sgs++;
1432 req->num_pending_sgs--;
1433
1434
1435
1436
1437
1438
1439 if (length == 0) {
1440 req->num_pending_sgs = 0;
1441 break;
1442 }
1443
1444 if (must_interrupt)
1445 break;
1446 }
1447
1448 return req->num_trbs - num_trbs;
1449}
1450
1451static int dwc3_prepare_trbs_linear(struct dwc3_ep *dep,
1452 struct dwc3_request *req)
1453{
1454 return dwc3_prepare_last_sg(dep, req, req->request.length, 0);
1455}
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467static int dwc3_prepare_trbs(struct dwc3_ep *dep)
1468{
1469 struct dwc3_request *req, *n;
1470 int ret = 0;
1471
1472 BUILD_BUG_ON_NOT_POWER_OF_2(DWC3_TRB_NUM);
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484 list_for_each_entry(req, &dep->started_list, list) {
1485 if (req->num_pending_sgs > 0) {
1486 ret = dwc3_prepare_trbs_sg(dep, req);
1487 if (!ret || req->num_pending_sgs)
1488 return ret;
1489 }
1490
1491 if (!dwc3_calc_trbs_left(dep))
1492 return ret;
1493
1494
1495
1496
1497
1498
1499 if (dep->stream_capable && req->request.is_last)
1500 return ret;
1501 }
1502
1503 list_for_each_entry_safe(req, n, &dep->pending_list, list) {
1504 struct dwc3 *dwc = dep->dwc;
1505
1506 ret = usb_gadget_map_request_by_dev(dwc->sysdev, &req->request,
1507 dep->direction);
1508 if (ret)
1509 return ret;
1510
1511 req->sg = req->request.sg;
1512 req->start_sg = req->sg;
1513 req->num_queued_sgs = 0;
1514 req->num_pending_sgs = req->request.num_mapped_sgs;
1515
1516 if (req->num_pending_sgs > 0) {
1517 ret = dwc3_prepare_trbs_sg(dep, req);
1518 if (req->num_pending_sgs)
1519 return ret;
1520 } else {
1521 ret = dwc3_prepare_trbs_linear(dep, req);
1522 }
1523
1524 if (!ret || !dwc3_calc_trbs_left(dep))
1525 return ret;
1526
1527
1528
1529
1530
1531
1532 if (dep->stream_capable && req->request.is_last)
1533 return ret;
1534 }
1535
1536 return ret;
1537}
1538
1539static void dwc3_gadget_ep_cleanup_cancelled_requests(struct dwc3_ep *dep);
1540
1541static int __dwc3_gadget_kick_transfer(struct dwc3_ep *dep)
1542{
1543 struct dwc3_gadget_ep_cmd_params params;
1544 struct dwc3_request *req;
1545 int starting;
1546 int ret;
1547 u32 cmd;
1548
1549
1550
1551
1552
1553
1554 ret = dwc3_prepare_trbs(dep);
1555 if (ret < 0)
1556 return ret;
1557
1558 starting = !(dep->flags & DWC3_EP_TRANSFER_STARTED);
1559
1560
1561
1562
1563
1564 if (!ret && !starting)
1565 return ret;
1566
1567 req = next_request(&dep->started_list);
1568 if (!req) {
1569 dep->flags |= DWC3_EP_PENDING_REQUEST;
1570 return 0;
1571 }
1572
1573 memset(¶ms, 0, sizeof(params));
1574
1575 if (starting) {
1576 params.param0 = upper_32_bits(req->trb_dma);
1577 params.param1 = lower_32_bits(req->trb_dma);
1578 cmd = DWC3_DEPCMD_STARTTRANSFER;
1579
1580 if (dep->stream_capable)
1581 cmd |= DWC3_DEPCMD_PARAM(req->request.stream_id);
1582
1583 if (usb_endpoint_xfer_isoc(dep->endpoint.desc))
1584 cmd |= DWC3_DEPCMD_PARAM(dep->frame_number);
1585 } else {
1586 cmd = DWC3_DEPCMD_UPDATETRANSFER |
1587 DWC3_DEPCMD_PARAM(dep->resource_index);
1588 }
1589
1590 ret = dwc3_send_gadget_ep_cmd(dep, cmd, ¶ms);
1591 if (ret < 0) {
1592 struct dwc3_request *tmp;
1593
1594 if (ret == -EAGAIN)
1595 return ret;
1596
1597 dwc3_stop_active_transfer(dep, true, true);
1598
1599 list_for_each_entry_safe(req, tmp, &dep->started_list, list)
1600 dwc3_gadget_move_cancelled_request(req, DWC3_REQUEST_STATUS_DEQUEUED);
1601
1602
1603 if (!(dep->flags & DWC3_EP_END_TRANSFER_PENDING))
1604 dwc3_gadget_ep_cleanup_cancelled_requests(dep);
1605
1606 return ret;
1607 }
1608
1609 if (dep->stream_capable && req->request.is_last)
1610 dep->flags |= DWC3_EP_WAIT_TRANSFER_COMPLETE;
1611
1612 return 0;
1613}
1614
1615static int __dwc3_gadget_get_frame(struct dwc3 *dwc)
1616{
1617 u32 reg;
1618
1619 reg = dwc3_readl(dwc->regs, DWC3_DSTS);
1620 return DWC3_DSTS_SOFFN(reg);
1621}
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665static int dwc3_gadget_start_isoc_quirk(struct dwc3_ep *dep)
1666{
1667 int cmd_status = 0;
1668 bool test0;
1669 bool test1;
1670
1671 while (dep->combo_num < 2) {
1672 struct dwc3_gadget_ep_cmd_params params;
1673 u32 test_frame_number;
1674 u32 cmd;
1675
1676
1677
1678
1679
1680 test_frame_number = dep->frame_number & DWC3_FRNUMBER_MASK;
1681 test_frame_number |= dep->combo_num << 14;
1682 test_frame_number += max_t(u32, 4, dep->interval);
1683
1684 params.param0 = upper_32_bits(dep->dwc->bounce_addr);
1685 params.param1 = lower_32_bits(dep->dwc->bounce_addr);
1686
1687 cmd = DWC3_DEPCMD_STARTTRANSFER;
1688 cmd |= DWC3_DEPCMD_PARAM(test_frame_number);
1689 cmd_status = dwc3_send_gadget_ep_cmd(dep, cmd, ¶ms);
1690
1691
1692 if (cmd_status && cmd_status != -EAGAIN) {
1693 dep->start_cmd_status = 0;
1694 dep->combo_num = 0;
1695 return 0;
1696 }
1697
1698
1699 if (dep->combo_num == 0)
1700 dep->start_cmd_status = cmd_status;
1701
1702 dep->combo_num++;
1703
1704
1705
1706
1707
1708 if (cmd_status == 0) {
1709 dwc3_stop_active_transfer(dep, true, true);
1710 return 0;
1711 }
1712 }
1713
1714
1715 test0 = (dep->start_cmd_status == 0);
1716 test1 = (cmd_status == 0);
1717
1718 if (!test0 && test1)
1719 dep->combo_num = 1;
1720 else if (!test0 && !test1)
1721 dep->combo_num = 2;
1722 else if (test0 && !test1)
1723 dep->combo_num = 3;
1724 else if (test0 && test1)
1725 dep->combo_num = 0;
1726
1727 dep->frame_number &= DWC3_FRNUMBER_MASK;
1728 dep->frame_number |= dep->combo_num << 14;
1729 dep->frame_number += max_t(u32, 4, dep->interval);
1730
1731
1732 dep->start_cmd_status = 0;
1733 dep->combo_num = 0;
1734
1735 return __dwc3_gadget_kick_transfer(dep);
1736}
1737
1738static int __dwc3_gadget_start_isoc(struct dwc3_ep *dep)
1739{
1740 const struct usb_endpoint_descriptor *desc = dep->endpoint.desc;
1741 struct dwc3 *dwc = dep->dwc;
1742 int ret;
1743 int i;
1744
1745 if (list_empty(&dep->pending_list) &&
1746 list_empty(&dep->started_list)) {
1747 dep->flags |= DWC3_EP_PENDING_REQUEST;
1748 return -EAGAIN;
1749 }
1750
1751 if (!dwc->dis_start_transfer_quirk &&
1752 (DWC3_VER_IS_PRIOR(DWC31, 170A) ||
1753 DWC3_VER_TYPE_IS_WITHIN(DWC31, 170A, EA01, EA06))) {
1754 if (dwc->gadget->speed <= USB_SPEED_HIGH && dep->direction)
1755 return dwc3_gadget_start_isoc_quirk(dep);
1756 }
1757
1758 if (desc->bInterval <= 14 &&
1759 dwc->gadget->speed >= USB_SPEED_HIGH) {
1760 u32 frame = __dwc3_gadget_get_frame(dwc);
1761 bool rollover = frame <
1762 (dep->frame_number & DWC3_FRNUMBER_MASK);
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773 dep->frame_number = (dep->frame_number & ~DWC3_FRNUMBER_MASK) |
1774 frame;
1775 if (rollover)
1776 dep->frame_number += BIT(14);
1777 }
1778
1779 for (i = 0; i < DWC3_ISOC_MAX_RETRIES; i++) {
1780 dep->frame_number = DWC3_ALIGN_FRAME(dep, i + 1);
1781
1782 ret = __dwc3_gadget_kick_transfer(dep);
1783 if (ret != -EAGAIN)
1784 break;
1785 }
1786
1787
1788
1789
1790
1791
1792 if (ret == -EAGAIN) {
1793 struct dwc3_gadget_ep_cmd_params params;
1794 u32 cmd;
1795
1796 cmd = DWC3_DEPCMD_ENDTRANSFER |
1797 DWC3_DEPCMD_CMDIOC |
1798 DWC3_DEPCMD_PARAM(dep->resource_index);
1799
1800 dep->resource_index = 0;
1801 memset(¶ms, 0, sizeof(params));
1802
1803 ret = dwc3_send_gadget_ep_cmd(dep, cmd, ¶ms);
1804 if (!ret)
1805 dep->flags |= DWC3_EP_END_TRANSFER_PENDING;
1806 }
1807
1808 return ret;
1809}
1810
1811static int __dwc3_gadget_ep_queue(struct dwc3_ep *dep, struct dwc3_request *req)
1812{
1813 struct dwc3 *dwc = dep->dwc;
1814
1815 if (!dep->endpoint.desc || !dwc->pullups_connected || !dwc->connected) {
1816 dev_err(dwc->dev, "%s: can't queue to disabled endpoint\n",
1817 dep->name);
1818 return -ESHUTDOWN;
1819 }
1820
1821 if (WARN(req->dep != dep, "request %pK belongs to '%s'\n",
1822 &req->request, req->dep->name))
1823 return -EINVAL;
1824
1825 if (WARN(req->status < DWC3_REQUEST_STATUS_COMPLETED,
1826 "%s: request %pK already in flight\n",
1827 dep->name, &req->request))
1828 return -EINVAL;
1829
1830 pm_runtime_get(dwc->dev);
1831
1832 req->request.actual = 0;
1833 req->request.status = -EINPROGRESS;
1834
1835 trace_dwc3_ep_queue(req);
1836
1837 list_add_tail(&req->list, &dep->pending_list);
1838 req->status = DWC3_REQUEST_STATUS_QUEUED;
1839
1840 if (dep->flags & DWC3_EP_WAIT_TRANSFER_COMPLETE)
1841 return 0;
1842
1843
1844
1845
1846
1847 if ((dep->flags & DWC3_EP_END_TRANSFER_PENDING) ||
1848 (dep->flags & DWC3_EP_WEDGE) ||
1849 (dep->flags & DWC3_EP_STALL)) {
1850 dep->flags |= DWC3_EP_DELAY_START;
1851 return 0;
1852 }
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862 if (usb_endpoint_xfer_isoc(dep->endpoint.desc)) {
1863 if (!(dep->flags & DWC3_EP_PENDING_REQUEST) &&
1864 !(dep->flags & DWC3_EP_TRANSFER_STARTED))
1865 return 0;
1866
1867 if ((dep->flags & DWC3_EP_PENDING_REQUEST)) {
1868 if (!(dep->flags & DWC3_EP_TRANSFER_STARTED))
1869 return __dwc3_gadget_start_isoc(dep);
1870 }
1871 }
1872
1873 __dwc3_gadget_kick_transfer(dep);
1874
1875 return 0;
1876}
1877
1878static int dwc3_gadget_ep_queue(struct usb_ep *ep, struct usb_request *request,
1879 gfp_t gfp_flags)
1880{
1881 struct dwc3_request *req = to_dwc3_request(request);
1882 struct dwc3_ep *dep = to_dwc3_ep(ep);
1883 struct dwc3 *dwc = dep->dwc;
1884
1885 unsigned long flags;
1886
1887 int ret;
1888
1889 spin_lock_irqsave(&dwc->lock, flags);
1890 ret = __dwc3_gadget_ep_queue(dep, req);
1891 spin_unlock_irqrestore(&dwc->lock, flags);
1892
1893 return ret;
1894}
1895
1896static void dwc3_gadget_ep_skip_trbs(struct dwc3_ep *dep, struct dwc3_request *req)
1897{
1898 int i;
1899
1900
1901 if (!req->trb)
1902 return;
1903
1904
1905
1906
1907
1908
1909
1910
1911
1912
1913
1914 for (i = 0; i < req->num_trbs; i++) {
1915 struct dwc3_trb *trb;
1916
1917 trb = &dep->trb_pool[dep->trb_dequeue];
1918 trb->ctrl &= ~DWC3_TRB_CTRL_HWO;
1919 dwc3_ep_inc_deq(dep);
1920 }
1921
1922 req->num_trbs = 0;
1923}
1924
1925static void dwc3_gadget_ep_cleanup_cancelled_requests(struct dwc3_ep *dep)
1926{
1927 struct dwc3_request *req;
1928 struct dwc3_request *tmp;
1929 struct dwc3 *dwc = dep->dwc;
1930
1931 list_for_each_entry_safe(req, tmp, &dep->cancelled_list, list) {
1932 dwc3_gadget_ep_skip_trbs(dep, req);
1933 switch (req->status) {
1934 case DWC3_REQUEST_STATUS_DISCONNECTED:
1935 dwc3_gadget_giveback(dep, req, -ESHUTDOWN);
1936 break;
1937 case DWC3_REQUEST_STATUS_DEQUEUED:
1938 dwc3_gadget_giveback(dep, req, -ECONNRESET);
1939 break;
1940 case DWC3_REQUEST_STATUS_STALLED:
1941 dwc3_gadget_giveback(dep, req, -EPIPE);
1942 break;
1943 default:
1944 dev_err(dwc->dev, "request cancelled with wrong reason:%d\n", req->status);
1945 dwc3_gadget_giveback(dep, req, -ECONNRESET);
1946 break;
1947 }
1948 }
1949}
1950
1951static int dwc3_gadget_ep_dequeue(struct usb_ep *ep,
1952 struct usb_request *request)
1953{
1954 struct dwc3_request *req = to_dwc3_request(request);
1955 struct dwc3_request *r = NULL;
1956
1957 struct dwc3_ep *dep = to_dwc3_ep(ep);
1958 struct dwc3 *dwc = dep->dwc;
1959
1960 unsigned long flags;
1961 int ret = 0;
1962
1963 trace_dwc3_ep_dequeue(req);
1964
1965 spin_lock_irqsave(&dwc->lock, flags);
1966
1967 list_for_each_entry(r, &dep->cancelled_list, list) {
1968 if (r == req)
1969 goto out;
1970 }
1971
1972 list_for_each_entry(r, &dep->pending_list, list) {
1973 if (r == req) {
1974 dwc3_gadget_giveback(dep, req, -ECONNRESET);
1975 goto out;
1976 }
1977 }
1978
1979 list_for_each_entry(r, &dep->started_list, list) {
1980 if (r == req) {
1981 struct dwc3_request *t;
1982
1983
1984 dwc3_stop_active_transfer(dep, true, true);
1985
1986
1987
1988
1989
1990 list_for_each_entry_safe(r, t, &dep->started_list, list)
1991 dwc3_gadget_move_cancelled_request(r,
1992 DWC3_REQUEST_STATUS_DEQUEUED);
1993
1994 dep->flags &= ~DWC3_EP_WAIT_TRANSFER_COMPLETE;
1995
1996 goto out;
1997 }
1998 }
1999
2000 dev_err(dwc->dev, "request %pK was not queued to %s\n",
2001 request, ep->name);
2002 ret = -EINVAL;
2003out:
2004 spin_unlock_irqrestore(&dwc->lock, flags);
2005
2006 return ret;
2007}
2008
2009int __dwc3_gadget_ep_set_halt(struct dwc3_ep *dep, int value, int protocol)
2010{
2011 struct dwc3_gadget_ep_cmd_params params;
2012 struct dwc3 *dwc = dep->dwc;
2013 struct dwc3_request *req;
2014 struct dwc3_request *tmp;
2015 int ret;
2016
2017 if (usb_endpoint_xfer_isoc(dep->endpoint.desc)) {
2018 dev_err(dwc->dev, "%s is of Isochronous type\n", dep->name);
2019 return -EINVAL;
2020 }
2021
2022 memset(¶ms, 0x00, sizeof(params));
2023
2024 if (value) {
2025 struct dwc3_trb *trb;
2026
2027 unsigned int transfer_in_flight;
2028 unsigned int started;
2029
2030 if (dep->number > 1)
2031 trb = dwc3_ep_prev_trb(dep, dep->trb_enqueue);
2032 else
2033 trb = &dwc->ep0_trb[dep->trb_enqueue];
2034
2035 transfer_in_flight = trb->ctrl & DWC3_TRB_CTRL_HWO;
2036 started = !list_empty(&dep->started_list);
2037
2038 if (!protocol && ((dep->direction && transfer_in_flight) ||
2039 (!dep->direction && started))) {
2040 return -EAGAIN;
2041 }
2042
2043 ret = dwc3_send_gadget_ep_cmd(dep, DWC3_DEPCMD_SETSTALL,
2044 ¶ms);
2045 if (ret)
2046 dev_err(dwc->dev, "failed to set STALL on %s\n",
2047 dep->name);
2048 else
2049 dep->flags |= DWC3_EP_STALL;
2050 } else {
2051
2052
2053
2054
2055
2056 if (dep->number <= 1) {
2057 dep->flags &= ~(DWC3_EP_STALL | DWC3_EP_WEDGE);
2058 return 0;
2059 }
2060
2061 dwc3_stop_active_transfer(dep, true, true);
2062
2063 list_for_each_entry_safe(req, tmp, &dep->started_list, list)
2064 dwc3_gadget_move_cancelled_request(req, DWC3_REQUEST_STATUS_STALLED);
2065
2066 if (dep->flags & DWC3_EP_END_TRANSFER_PENDING) {
2067 dep->flags |= DWC3_EP_PENDING_CLEAR_STALL;
2068 return 0;
2069 }
2070
2071 dwc3_gadget_ep_cleanup_cancelled_requests(dep);
2072
2073 ret = dwc3_send_clear_stall_ep_cmd(dep);
2074 if (ret) {
2075 dev_err(dwc->dev, "failed to clear STALL on %s\n",
2076 dep->name);
2077 return ret;
2078 }
2079
2080 dep->flags &= ~(DWC3_EP_STALL | DWC3_EP_WEDGE);
2081
2082 if ((dep->flags & DWC3_EP_DELAY_START) &&
2083 !usb_endpoint_xfer_isoc(dep->endpoint.desc))
2084 __dwc3_gadget_kick_transfer(dep);
2085
2086 dep->flags &= ~DWC3_EP_DELAY_START;
2087 }
2088
2089 return ret;
2090}
2091
2092static int dwc3_gadget_ep_set_halt(struct usb_ep *ep, int value)
2093{
2094 struct dwc3_ep *dep = to_dwc3_ep(ep);
2095 struct dwc3 *dwc = dep->dwc;
2096
2097 unsigned long flags;
2098
2099 int ret;
2100
2101 spin_lock_irqsave(&dwc->lock, flags);
2102 ret = __dwc3_gadget_ep_set_halt(dep, value, false);
2103 spin_unlock_irqrestore(&dwc->lock, flags);
2104
2105 return ret;
2106}
2107
2108static int dwc3_gadget_ep_set_wedge(struct usb_ep *ep)
2109{
2110 struct dwc3_ep *dep = to_dwc3_ep(ep);
2111 struct dwc3 *dwc = dep->dwc;
2112 unsigned long flags;
2113 int ret;
2114
2115 spin_lock_irqsave(&dwc->lock, flags);
2116 dep->flags |= DWC3_EP_WEDGE;
2117
2118 if (dep->number == 0 || dep->number == 1)
2119 ret = __dwc3_gadget_ep0_set_halt(ep, 1);
2120 else
2121 ret = __dwc3_gadget_ep_set_halt(dep, 1, false);
2122 spin_unlock_irqrestore(&dwc->lock, flags);
2123
2124 return ret;
2125}
2126
2127
2128
2129static struct usb_endpoint_descriptor dwc3_gadget_ep0_desc = {
2130 .bLength = USB_DT_ENDPOINT_SIZE,
2131 .bDescriptorType = USB_DT_ENDPOINT,
2132 .bmAttributes = USB_ENDPOINT_XFER_CONTROL,
2133};
2134
2135static const struct usb_ep_ops dwc3_gadget_ep0_ops = {
2136 .enable = dwc3_gadget_ep0_enable,
2137 .disable = dwc3_gadget_ep0_disable,
2138 .alloc_request = dwc3_gadget_ep_alloc_request,
2139 .free_request = dwc3_gadget_ep_free_request,
2140 .queue = dwc3_gadget_ep0_queue,
2141 .dequeue = dwc3_gadget_ep_dequeue,
2142 .set_halt = dwc3_gadget_ep0_set_halt,
2143 .set_wedge = dwc3_gadget_ep_set_wedge,
2144};
2145
2146static const struct usb_ep_ops dwc3_gadget_ep_ops = {
2147 .enable = dwc3_gadget_ep_enable,
2148 .disable = dwc3_gadget_ep_disable,
2149 .alloc_request = dwc3_gadget_ep_alloc_request,
2150 .free_request = dwc3_gadget_ep_free_request,
2151 .queue = dwc3_gadget_ep_queue,
2152 .dequeue = dwc3_gadget_ep_dequeue,
2153 .set_halt = dwc3_gadget_ep_set_halt,
2154 .set_wedge = dwc3_gadget_ep_set_wedge,
2155};
2156
2157
2158
2159static int dwc3_gadget_get_frame(struct usb_gadget *g)
2160{
2161 struct dwc3 *dwc = gadget_to_dwc(g);
2162
2163 return __dwc3_gadget_get_frame(dwc);
2164}
2165
2166static int __dwc3_gadget_wakeup(struct dwc3 *dwc)
2167{
2168 int retries;
2169
2170 int ret;
2171 u32 reg;
2172
2173 u8 link_state;
2174
2175
2176
2177
2178
2179
2180
2181 reg = dwc3_readl(dwc->regs, DWC3_DSTS);
2182
2183 link_state = DWC3_DSTS_USBLNKST(reg);
2184
2185 switch (link_state) {
2186 case DWC3_LINK_STATE_RESET:
2187 case DWC3_LINK_STATE_RX_DET:
2188 case DWC3_LINK_STATE_U3:
2189 case DWC3_LINK_STATE_U2:
2190 case DWC3_LINK_STATE_U1:
2191 case DWC3_LINK_STATE_RESUME:
2192 break;
2193 default:
2194 return -EINVAL;
2195 }
2196
2197 ret = dwc3_gadget_set_link_state(dwc, DWC3_LINK_STATE_RECOV);
2198 if (ret < 0) {
2199 dev_err(dwc->dev, "failed to put link in Recovery\n");
2200 return ret;
2201 }
2202
2203
2204 if (DWC3_VER_IS_PRIOR(DWC3, 194A)) {
2205
2206 reg = dwc3_readl(dwc->regs, DWC3_DCTL);
2207 reg &= ~DWC3_DCTL_ULSTCHNGREQ_MASK;
2208 dwc3_writel(dwc->regs, DWC3_DCTL, reg);
2209 }
2210
2211
2212 retries = 20000;
2213
2214 while (retries--) {
2215 reg = dwc3_readl(dwc->regs, DWC3_DSTS);
2216
2217
2218 if (DWC3_DSTS_USBLNKST(reg) == DWC3_LINK_STATE_U0)
2219 break;
2220 }
2221
2222 if (DWC3_DSTS_USBLNKST(reg) != DWC3_LINK_STATE_U0) {
2223 dev_err(dwc->dev, "failed to send remote wakeup\n");
2224 return -EINVAL;
2225 }
2226
2227 return 0;
2228}
2229
2230static int dwc3_gadget_wakeup(struct usb_gadget *g)
2231{
2232 struct dwc3 *dwc = gadget_to_dwc(g);
2233 unsigned long flags;
2234 int ret;
2235
2236 spin_lock_irqsave(&dwc->lock, flags);
2237 ret = __dwc3_gadget_wakeup(dwc);
2238 spin_unlock_irqrestore(&dwc->lock, flags);
2239
2240 return ret;
2241}
2242
2243static int dwc3_gadget_set_selfpowered(struct usb_gadget *g,
2244 int is_selfpowered)
2245{
2246 struct dwc3 *dwc = gadget_to_dwc(g);
2247 unsigned long flags;
2248
2249 spin_lock_irqsave(&dwc->lock, flags);
2250 g->is_selfpowered = !!is_selfpowered;
2251 spin_unlock_irqrestore(&dwc->lock, flags);
2252
2253 return 0;
2254}
2255
2256static void dwc3_stop_active_transfers(struct dwc3 *dwc)
2257{
2258 u32 epnum;
2259
2260 for (epnum = 2; epnum < dwc->num_eps; epnum++) {
2261 struct dwc3_ep *dep;
2262
2263 dep = dwc->eps[epnum];
2264 if (!dep)
2265 continue;
2266
2267 dwc3_remove_requests(dwc, dep);
2268 }
2269}
2270
2271static void __dwc3_gadget_set_ssp_rate(struct dwc3 *dwc)
2272{
2273 enum usb_ssp_rate ssp_rate = dwc->gadget_ssp_rate;
2274 u32 reg;
2275
2276 if (ssp_rate == USB_SSP_GEN_UNKNOWN)
2277 ssp_rate = dwc->max_ssp_rate;
2278
2279 reg = dwc3_readl(dwc->regs, DWC3_DCFG);
2280 reg &= ~DWC3_DCFG_SPEED_MASK;
2281 reg &= ~DWC3_DCFG_NUMLANES(~0);
2282
2283 if (ssp_rate == USB_SSP_GEN_1x2)
2284 reg |= DWC3_DCFG_SUPERSPEED;
2285 else if (dwc->max_ssp_rate != USB_SSP_GEN_1x2)
2286 reg |= DWC3_DCFG_SUPERSPEED_PLUS;
2287
2288 if (ssp_rate != USB_SSP_GEN_2x1 &&
2289 dwc->max_ssp_rate != USB_SSP_GEN_2x1)
2290 reg |= DWC3_DCFG_NUMLANES(1);
2291
2292 dwc3_writel(dwc->regs, DWC3_DCFG, reg);
2293}
2294
2295static void __dwc3_gadget_set_speed(struct dwc3 *dwc)
2296{
2297 enum usb_device_speed speed;
2298 u32 reg;
2299
2300 speed = dwc->gadget_max_speed;
2301 if (speed == USB_SPEED_UNKNOWN || speed > dwc->maximum_speed)
2302 speed = dwc->maximum_speed;
2303
2304 if (speed == USB_SPEED_SUPER_PLUS &&
2305 DWC3_IP_IS(DWC32)) {
2306 __dwc3_gadget_set_ssp_rate(dwc);
2307 return;
2308 }
2309
2310 reg = dwc3_readl(dwc->regs, DWC3_DCFG);
2311 reg &= ~(DWC3_DCFG_SPEED_MASK);
2312
2313
2314
2315
2316
2317
2318
2319
2320
2321
2322
2323
2324
2325
2326 if (DWC3_VER_IS_PRIOR(DWC3, 220A) &&
2327 !dwc->dis_metastability_quirk) {
2328 reg |= DWC3_DCFG_SUPERSPEED;
2329 } else {
2330 switch (speed) {
2331 case USB_SPEED_FULL:
2332 reg |= DWC3_DCFG_FULLSPEED;
2333 break;
2334 case USB_SPEED_HIGH:
2335 reg |= DWC3_DCFG_HIGHSPEED;
2336 break;
2337 case USB_SPEED_SUPER:
2338 reg |= DWC3_DCFG_SUPERSPEED;
2339 break;
2340 case USB_SPEED_SUPER_PLUS:
2341 if (DWC3_IP_IS(DWC3))
2342 reg |= DWC3_DCFG_SUPERSPEED;
2343 else
2344 reg |= DWC3_DCFG_SUPERSPEED_PLUS;
2345 break;
2346 default:
2347 dev_err(dwc->dev, "invalid speed (%d)\n", speed);
2348
2349 if (DWC3_IP_IS(DWC3))
2350 reg |= DWC3_DCFG_SUPERSPEED;
2351 else
2352 reg |= DWC3_DCFG_SUPERSPEED_PLUS;
2353 }
2354 }
2355
2356 if (DWC3_IP_IS(DWC32) &&
2357 speed > USB_SPEED_UNKNOWN &&
2358 speed < USB_SPEED_SUPER_PLUS)
2359 reg &= ~DWC3_DCFG_NUMLANES(~0);
2360
2361 dwc3_writel(dwc->regs, DWC3_DCFG, reg);
2362}
2363
2364static int dwc3_gadget_run_stop(struct dwc3 *dwc, int is_on, int suspend)
2365{
2366 u32 reg;
2367 u32 timeout = 500;
2368
2369 if (pm_runtime_suspended(dwc->dev))
2370 return 0;
2371
2372 reg = dwc3_readl(dwc->regs, DWC3_DCTL);
2373 if (is_on) {
2374 if (DWC3_VER_IS_WITHIN(DWC3, ANY, 187A)) {
2375 reg &= ~DWC3_DCTL_TRGTULST_MASK;
2376 reg |= DWC3_DCTL_TRGTULST_RX_DET;
2377 }
2378
2379 if (!DWC3_VER_IS_PRIOR(DWC3, 194A))
2380 reg &= ~DWC3_DCTL_KEEP_CONNECT;
2381 reg |= DWC3_DCTL_RUN_STOP;
2382
2383 if (dwc->has_hibernation)
2384 reg |= DWC3_DCTL_KEEP_CONNECT;
2385
2386 __dwc3_gadget_set_speed(dwc);
2387 dwc->pullups_connected = true;
2388 } else {
2389 reg &= ~DWC3_DCTL_RUN_STOP;
2390
2391 if (dwc->has_hibernation && !suspend)
2392 reg &= ~DWC3_DCTL_KEEP_CONNECT;
2393
2394 dwc->pullups_connected = false;
2395 }
2396
2397 dwc3_gadget_dctl_write_safe(dwc, reg);
2398
2399 do {
2400 reg = dwc3_readl(dwc->regs, DWC3_DSTS);
2401 reg &= DWC3_DSTS_DEVCTRLHLT;
2402 } while (--timeout && !(!is_on ^ !reg));
2403
2404 if (!timeout)
2405 return -ETIMEDOUT;
2406
2407 return 0;
2408}
2409
2410static void dwc3_gadget_disable_irq(struct dwc3 *dwc);
2411static void __dwc3_gadget_stop(struct dwc3 *dwc);
2412static int __dwc3_gadget_start(struct dwc3 *dwc);
2413
2414static int dwc3_gadget_pullup(struct usb_gadget *g, int is_on)
2415{
2416 struct dwc3 *dwc = gadget_to_dwc(g);
2417 unsigned long flags;
2418 int ret;
2419
2420 is_on = !!is_on;
2421
2422
2423
2424
2425
2426 if (!is_on && dwc->ep0state != EP0_SETUP_PHASE) {
2427 reinit_completion(&dwc->ep0_in_setup);
2428
2429 ret = wait_for_completion_timeout(&dwc->ep0_in_setup,
2430 msecs_to_jiffies(DWC3_PULL_UP_TIMEOUT));
2431 if (ret == 0)
2432 dev_warn(dwc->dev, "timed out waiting for SETUP phase\n");
2433 }
2434
2435
2436
2437
2438
2439
2440 if (!is_on) {
2441 pm_runtime_barrier(dwc->dev);
2442 if (pm_runtime_suspended(dwc->dev))
2443 return 0;
2444 }
2445
2446
2447
2448
2449
2450
2451 ret = pm_runtime_get_sync(dwc->dev);
2452 if (!ret || ret < 0) {
2453 pm_runtime_put(dwc->dev);
2454 return 0;
2455 }
2456
2457
2458
2459
2460
2461 disable_irq(dwc->irq_gadget);
2462
2463 spin_lock_irqsave(&dwc->lock, flags);
2464
2465 if (!is_on) {
2466 u32 count;
2467
2468 dwc->connected = false;
2469
2470
2471
2472
2473
2474
2475
2476 dwc3_stop_active_transfers(dwc);
2477 __dwc3_gadget_stop(dwc);
2478
2479
2480
2481
2482
2483
2484
2485
2486 count = dwc3_readl(dwc->regs, DWC3_GEVNTCOUNT(0));
2487 count &= DWC3_GEVNTCOUNT_MASK;
2488 if (count > 0) {
2489 dwc3_writel(dwc->regs, DWC3_GEVNTCOUNT(0), count);
2490 dwc->ev_buf->lpos = (dwc->ev_buf->lpos + count) %
2491 dwc->ev_buf->length;
2492 }
2493 } else {
2494 __dwc3_gadget_start(dwc);
2495 }
2496
2497 ret = dwc3_gadget_run_stop(dwc, is_on, false);
2498 spin_unlock_irqrestore(&dwc->lock, flags);
2499 enable_irq(dwc->irq_gadget);
2500
2501 pm_runtime_put(dwc->dev);
2502
2503 return ret;
2504}
2505
2506static void dwc3_gadget_enable_irq(struct dwc3 *dwc)
2507{
2508 u32 reg;
2509
2510
2511 reg = (DWC3_DEVTEN_EVNTOVERFLOWEN |
2512 DWC3_DEVTEN_CMDCMPLTEN |
2513 DWC3_DEVTEN_ERRTICERREN |
2514 DWC3_DEVTEN_WKUPEVTEN |
2515 DWC3_DEVTEN_CONNECTDONEEN |
2516 DWC3_DEVTEN_USBRSTEN |
2517 DWC3_DEVTEN_DISCONNEVTEN);
2518
2519 if (DWC3_VER_IS_PRIOR(DWC3, 250A))
2520 reg |= DWC3_DEVTEN_ULSTCNGEN;
2521
2522
2523 if (!DWC3_VER_IS_PRIOR(DWC3, 230A))
2524 reg |= DWC3_DEVTEN_U3L2L1SUSPEN;
2525
2526 dwc3_writel(dwc->regs, DWC3_DEVTEN, reg);
2527}
2528
2529static void dwc3_gadget_disable_irq(struct dwc3 *dwc)
2530{
2531
2532 dwc3_writel(dwc->regs, DWC3_DEVTEN, 0x00);
2533}
2534
2535static irqreturn_t dwc3_interrupt(int irq, void *_dwc);
2536static irqreturn_t dwc3_thread_interrupt(int irq, void *_dwc);
2537
2538
2539
2540
2541
2542
2543
2544
2545
2546
2547
2548
2549
2550
2551
2552
2553
2554
2555
2556
2557
2558
2559static void dwc3_gadget_setup_nump(struct dwc3 *dwc)
2560{
2561 u32 ram2_depth;
2562 u32 mdwidth;
2563 u32 nump;
2564 u32 reg;
2565
2566 ram2_depth = DWC3_GHWPARAMS7_RAM2_DEPTH(dwc->hwparams.hwparams7);
2567 mdwidth = dwc3_mdwidth(dwc);
2568
2569 nump = ((ram2_depth * mdwidth / 8) - 24 - 16) / 1024;
2570 nump = min_t(u32, nump, 16);
2571
2572
2573 reg = dwc3_readl(dwc->regs, DWC3_DCFG);
2574 reg &= ~DWC3_DCFG_NUMP_MASK;
2575 reg |= nump << DWC3_DCFG_NUMP_SHIFT;
2576 dwc3_writel(dwc->regs, DWC3_DCFG, reg);
2577}
2578
2579static int __dwc3_gadget_start(struct dwc3 *dwc)
2580{
2581 struct dwc3_ep *dep;
2582 int ret = 0;
2583 u32 reg;
2584
2585
2586
2587
2588
2589 if (dwc->imod_interval) {
2590 dwc3_writel(dwc->regs, DWC3_DEV_IMOD(0), dwc->imod_interval);
2591 dwc3_writel(dwc->regs, DWC3_GEVNTCOUNT(0), DWC3_GEVNTCOUNT_EHB);
2592 } else if (dwc3_has_imod(dwc)) {
2593 dwc3_writel(dwc->regs, DWC3_DEV_IMOD(0), 0);
2594 }
2595
2596
2597
2598
2599
2600
2601
2602
2603 reg = dwc3_readl(dwc->regs, DWC3_GRXTHRCFG);
2604 if (DWC3_IP_IS(DWC3))
2605 reg &= ~DWC3_GRXTHRCFG_PKTCNTSEL;
2606 else
2607 reg &= ~DWC31_GRXTHRCFG_PKTCNTSEL;
2608
2609 dwc3_writel(dwc->regs, DWC3_GRXTHRCFG, reg);
2610
2611 dwc3_gadget_setup_nump(dwc);
2612
2613
2614
2615
2616
2617
2618
2619
2620 reg = dwc3_readl(dwc->regs, DWC3_DCFG);
2621 reg |= DWC3_DCFG_IGNSTRMPP;
2622 dwc3_writel(dwc->regs, DWC3_DCFG, reg);
2623
2624
2625 dwc3_gadget_ep0_desc.wMaxPacketSize = cpu_to_le16(512);
2626
2627 dep = dwc->eps[0];
2628 ret = __dwc3_gadget_ep_enable(dep, DWC3_DEPCFG_ACTION_INIT);
2629 if (ret) {
2630 dev_err(dwc->dev, "failed to enable %s\n", dep->name);
2631 goto err0;
2632 }
2633
2634 dep = dwc->eps[1];
2635 ret = __dwc3_gadget_ep_enable(dep, DWC3_DEPCFG_ACTION_INIT);
2636 if (ret) {
2637 dev_err(dwc->dev, "failed to enable %s\n", dep->name);
2638 goto err1;
2639 }
2640
2641
2642 dwc->ep0state = EP0_SETUP_PHASE;
2643 dwc->link_state = DWC3_LINK_STATE_SS_DIS;
2644 dwc->delayed_status = false;
2645 dwc3_ep0_out_start(dwc);
2646
2647 dwc3_gadget_enable_irq(dwc);
2648
2649 return 0;
2650
2651err1:
2652 __dwc3_gadget_ep_disable(dwc->eps[0]);
2653
2654err0:
2655 return ret;
2656}
2657
2658static int dwc3_gadget_start(struct usb_gadget *g,
2659 struct usb_gadget_driver *driver)
2660{
2661 struct dwc3 *dwc = gadget_to_dwc(g);
2662 unsigned long flags;
2663 int ret;
2664 int irq;
2665
2666 irq = dwc->irq_gadget;
2667 ret = request_threaded_irq(irq, dwc3_interrupt, dwc3_thread_interrupt,
2668 IRQF_SHARED, "dwc3", dwc->ev_buf);
2669 if (ret) {
2670 dev_err(dwc->dev, "failed to request irq #%d --> %d\n",
2671 irq, ret);
2672 return ret;
2673 }
2674
2675 spin_lock_irqsave(&dwc->lock, flags);
2676 dwc->gadget_driver = driver;
2677 spin_unlock_irqrestore(&dwc->lock, flags);
2678
2679 return 0;
2680}
2681
2682static void __dwc3_gadget_stop(struct dwc3 *dwc)
2683{
2684 dwc3_gadget_disable_irq(dwc);
2685 __dwc3_gadget_ep_disable(dwc->eps[0]);
2686 __dwc3_gadget_ep_disable(dwc->eps[1]);
2687}
2688
2689static int dwc3_gadget_stop(struct usb_gadget *g)
2690{
2691 struct dwc3 *dwc = gadget_to_dwc(g);
2692 unsigned long flags;
2693
2694 spin_lock_irqsave(&dwc->lock, flags);
2695 dwc->gadget_driver = NULL;
2696 dwc->max_cfg_eps = 0;
2697 spin_unlock_irqrestore(&dwc->lock, flags);
2698
2699 free_irq(dwc->irq_gadget, dwc->ev_buf);
2700
2701 return 0;
2702}
2703
2704static void dwc3_gadget_config_params(struct usb_gadget *g,
2705 struct usb_dcd_config_params *params)
2706{
2707 struct dwc3 *dwc = gadget_to_dwc(g);
2708
2709 params->besl_baseline = USB_DEFAULT_BESL_UNSPECIFIED;
2710 params->besl_deep = USB_DEFAULT_BESL_UNSPECIFIED;
2711
2712
2713 if (!dwc->dis_enblslpm_quirk) {
2714
2715
2716
2717
2718
2719
2720
2721
2722
2723 params->besl_baseline = 1;
2724 if (dwc->is_utmi_l1_suspend)
2725 params->besl_deep =
2726 clamp_t(u8, dwc->hird_threshold, 2, 15);
2727 }
2728
2729
2730 if (dwc->dis_u1_entry_quirk)
2731 params->bU1devExitLat = 0;
2732 else
2733 params->bU1devExitLat = DWC3_DEFAULT_U1_DEV_EXIT_LAT;
2734
2735
2736 if (dwc->dis_u2_entry_quirk)
2737 params->bU2DevExitLat = 0;
2738 else
2739 params->bU2DevExitLat =
2740 cpu_to_le16(DWC3_DEFAULT_U2_DEV_EXIT_LAT);
2741}
2742
2743static void dwc3_gadget_set_speed(struct usb_gadget *g,
2744 enum usb_device_speed speed)
2745{
2746 struct dwc3 *dwc = gadget_to_dwc(g);
2747 unsigned long flags;
2748
2749 spin_lock_irqsave(&dwc->lock, flags);
2750 dwc->gadget_max_speed = speed;
2751 spin_unlock_irqrestore(&dwc->lock, flags);
2752}
2753
2754static void dwc3_gadget_set_ssp_rate(struct usb_gadget *g,
2755 enum usb_ssp_rate rate)
2756{
2757 struct dwc3 *dwc = gadget_to_dwc(g);
2758 unsigned long flags;
2759
2760 spin_lock_irqsave(&dwc->lock, flags);
2761 dwc->gadget_max_speed = USB_SPEED_SUPER_PLUS;
2762 dwc->gadget_ssp_rate = rate;
2763 spin_unlock_irqrestore(&dwc->lock, flags);
2764}
2765
2766static int dwc3_gadget_vbus_draw(struct usb_gadget *g, unsigned int mA)
2767{
2768 struct dwc3 *dwc = gadget_to_dwc(g);
2769 union power_supply_propval val = {0};
2770 int ret;
2771
2772 if (dwc->usb2_phy)
2773 return usb_phy_set_power(dwc->usb2_phy, mA);
2774
2775 if (!dwc->usb_psy)
2776 return -EOPNOTSUPP;
2777
2778 val.intval = 1000 * mA;
2779 ret = power_supply_set_property(dwc->usb_psy, POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT, &val);
2780
2781 return ret;
2782}
2783
2784
2785
2786
2787
2788
2789
2790
2791
2792
2793
2794static int dwc3_gadget_check_config(struct usb_gadget *g)
2795{
2796 struct dwc3 *dwc = gadget_to_dwc(g);
2797 struct usb_ep *ep;
2798 int fifo_size = 0;
2799 int ram1_depth;
2800 int ep_num = 0;
2801
2802 if (!dwc->do_fifo_resize)
2803 return 0;
2804
2805 list_for_each_entry(ep, &g->ep_list, ep_list) {
2806
2807 if (ep->claimed && (ep->address & USB_DIR_IN))
2808 ep_num++;
2809 }
2810
2811 if (ep_num <= dwc->max_cfg_eps)
2812 return 0;
2813
2814
2815 dwc->max_cfg_eps = ep_num;
2816
2817 fifo_size = dwc3_gadget_calc_tx_fifo_size(dwc, dwc->max_cfg_eps);
2818
2819 fifo_size += dwc->max_cfg_eps;
2820
2821
2822 ram1_depth = DWC3_RAM1_DEPTH(dwc->hwparams.hwparams7);
2823 if (fifo_size > ram1_depth)
2824 return -ENOMEM;
2825
2826 return 0;
2827}
2828
2829static void dwc3_gadget_async_callbacks(struct usb_gadget *g, bool enable)
2830{
2831 struct dwc3 *dwc = gadget_to_dwc(g);
2832 unsigned long flags;
2833
2834 spin_lock_irqsave(&dwc->lock, flags);
2835 dwc->async_callbacks = enable;
2836 spin_unlock_irqrestore(&dwc->lock, flags);
2837}
2838
2839static const struct usb_gadget_ops dwc3_gadget_ops = {
2840 .get_frame = dwc3_gadget_get_frame,
2841 .wakeup = dwc3_gadget_wakeup,
2842 .set_selfpowered = dwc3_gadget_set_selfpowered,
2843 .pullup = dwc3_gadget_pullup,
2844 .udc_start = dwc3_gadget_start,
2845 .udc_stop = dwc3_gadget_stop,
2846 .udc_set_speed = dwc3_gadget_set_speed,
2847 .udc_set_ssp_rate = dwc3_gadget_set_ssp_rate,
2848 .get_config_params = dwc3_gadget_config_params,
2849 .vbus_draw = dwc3_gadget_vbus_draw,
2850 .check_config = dwc3_gadget_check_config,
2851 .udc_async_callbacks = dwc3_gadget_async_callbacks,
2852};
2853
2854
2855
2856static int dwc3_gadget_init_control_endpoint(struct dwc3_ep *dep)
2857{
2858 struct dwc3 *dwc = dep->dwc;
2859
2860 usb_ep_set_maxpacket_limit(&dep->endpoint, 512);
2861 dep->endpoint.maxburst = 1;
2862 dep->endpoint.ops = &dwc3_gadget_ep0_ops;
2863 if (!dep->direction)
2864 dwc->gadget->ep0 = &dep->endpoint;
2865
2866 dep->endpoint.caps.type_control = true;
2867
2868 return 0;
2869}
2870
2871static int dwc3_gadget_init_in_endpoint(struct dwc3_ep *dep)
2872{
2873 struct dwc3 *dwc = dep->dwc;
2874 u32 mdwidth;
2875 int size;
2876
2877 mdwidth = dwc3_mdwidth(dwc);
2878
2879
2880 mdwidth /= 8;
2881
2882 size = dwc3_readl(dwc->regs, DWC3_GTXFIFOSIZ(dep->number >> 1));
2883 if (DWC3_IP_IS(DWC3))
2884 size = DWC3_GTXFIFOSIZ_TXFDEP(size);
2885 else
2886 size = DWC31_GTXFIFOSIZ_TXFDEP(size);
2887
2888
2889 size *= mdwidth;
2890
2891
2892
2893
2894
2895
2896
2897
2898 if (dwc->maximum_speed >= USB_SPEED_SUPER)
2899 size /= 3;
2900 else
2901 size /= 2;
2902
2903 usb_ep_set_maxpacket_limit(&dep->endpoint, size);
2904
2905 dep->endpoint.max_streams = 16;
2906 dep->endpoint.ops = &dwc3_gadget_ep_ops;
2907 list_add_tail(&dep->endpoint.ep_list,
2908 &dwc->gadget->ep_list);
2909 dep->endpoint.caps.type_iso = true;
2910 dep->endpoint.caps.type_bulk = true;
2911 dep->endpoint.caps.type_int = true;
2912
2913 return dwc3_alloc_trb_pool(dep);
2914}
2915
2916static int dwc3_gadget_init_out_endpoint(struct dwc3_ep *dep)
2917{
2918 struct dwc3 *dwc = dep->dwc;
2919 u32 mdwidth;
2920 int size;
2921
2922 mdwidth = dwc3_mdwidth(dwc);
2923
2924
2925 mdwidth /= 8;
2926
2927
2928 size = dwc3_readl(dwc->regs, DWC3_GRXFIFOSIZ(0));
2929 if (DWC3_IP_IS(DWC3))
2930 size = DWC3_GRXFIFOSIZ_RXFDEP(size);
2931 else
2932 size = DWC31_GRXFIFOSIZ_RXFDEP(size);
2933
2934
2935 size *= mdwidth;
2936
2937
2938
2939
2940
2941
2942
2943
2944
2945 size -= (3 * 8) + 16;
2946 if (size < 0)
2947 size = 0;
2948 else
2949 size /= 3;
2950
2951 usb_ep_set_maxpacket_limit(&dep->endpoint, size);
2952 dep->endpoint.max_streams = 16;
2953 dep->endpoint.ops = &dwc3_gadget_ep_ops;
2954 list_add_tail(&dep->endpoint.ep_list,
2955 &dwc->gadget->ep_list);
2956 dep->endpoint.caps.type_iso = true;
2957 dep->endpoint.caps.type_bulk = true;
2958 dep->endpoint.caps.type_int = true;
2959
2960 return dwc3_alloc_trb_pool(dep);
2961}
2962
2963static int dwc3_gadget_init_endpoint(struct dwc3 *dwc, u8 epnum)
2964{
2965 struct dwc3_ep *dep;
2966 bool direction = epnum & 1;
2967 int ret;
2968 u8 num = epnum >> 1;
2969
2970 dep = kzalloc(sizeof(*dep), GFP_KERNEL);
2971 if (!dep)
2972 return -ENOMEM;
2973
2974 dep->dwc = dwc;
2975 dep->number = epnum;
2976 dep->direction = direction;
2977 dep->regs = dwc->regs + DWC3_DEP_BASE(epnum);
2978 dwc->eps[epnum] = dep;
2979 dep->combo_num = 0;
2980 dep->start_cmd_status = 0;
2981
2982 snprintf(dep->name, sizeof(dep->name), "ep%u%s", num,
2983 direction ? "in" : "out");
2984
2985 dep->endpoint.name = dep->name;
2986
2987 if (!(dep->number > 1)) {
2988 dep->endpoint.desc = &dwc3_gadget_ep0_desc;
2989 dep->endpoint.comp_desc = NULL;
2990 }
2991
2992 if (num == 0)
2993 ret = dwc3_gadget_init_control_endpoint(dep);
2994 else if (direction)
2995 ret = dwc3_gadget_init_in_endpoint(dep);
2996 else
2997 ret = dwc3_gadget_init_out_endpoint(dep);
2998
2999 if (ret)
3000 return ret;
3001
3002 dep->endpoint.caps.dir_in = direction;
3003 dep->endpoint.caps.dir_out = !direction;
3004
3005 INIT_LIST_HEAD(&dep->pending_list);
3006 INIT_LIST_HEAD(&dep->started_list);
3007 INIT_LIST_HEAD(&dep->cancelled_list);
3008
3009 dwc3_debugfs_create_endpoint_dir(dep);
3010
3011 return 0;
3012}
3013
3014static int dwc3_gadget_init_endpoints(struct dwc3 *dwc, u8 total)
3015{
3016 u8 epnum;
3017
3018 INIT_LIST_HEAD(&dwc->gadget->ep_list);
3019
3020 for (epnum = 0; epnum < total; epnum++) {
3021 int ret;
3022
3023 ret = dwc3_gadget_init_endpoint(dwc, epnum);
3024 if (ret)
3025 return ret;
3026 }
3027
3028 return 0;
3029}
3030
3031static void dwc3_gadget_free_endpoints(struct dwc3 *dwc)
3032{
3033 struct dwc3_ep *dep;
3034 u8 epnum;
3035
3036 for (epnum = 0; epnum < DWC3_ENDPOINTS_NUM; epnum++) {
3037 dep = dwc->eps[epnum];
3038 if (!dep)
3039 continue;
3040
3041
3042
3043
3044
3045
3046
3047
3048
3049 if (epnum != 0 && epnum != 1) {
3050 dwc3_free_trb_pool(dep);
3051 list_del(&dep->endpoint.ep_list);
3052 }
3053
3054 debugfs_remove_recursive(debugfs_lookup(dep->name,
3055 debugfs_lookup(dev_name(dep->dwc->dev),
3056 usb_debug_root)));
3057 kfree(dep);
3058 }
3059}
3060
3061
3062
3063static int dwc3_gadget_ep_reclaim_completed_trb(struct dwc3_ep *dep,
3064 struct dwc3_request *req, struct dwc3_trb *trb,
3065 const struct dwc3_event_depevt *event, int status, int chain)
3066{
3067 unsigned int count;
3068
3069 dwc3_ep_inc_deq(dep);
3070
3071 trace_dwc3_complete_trb(dep, trb);
3072 req->num_trbs--;
3073
3074
3075
3076
3077
3078
3079
3080
3081
3082
3083
3084 if (chain && (trb->ctrl & DWC3_TRB_CTRL_HWO))
3085 trb->ctrl &= ~DWC3_TRB_CTRL_HWO;
3086
3087
3088
3089
3090
3091 if (usb_endpoint_xfer_isoc(dep->endpoint.desc) &&
3092 (trb->ctrl & DWC3_TRBCTL_ISOCHRONOUS_FIRST)) {
3093 unsigned int frame_number;
3094
3095 frame_number = DWC3_TRB_CTRL_GET_SID_SOFN(trb->ctrl);
3096 frame_number &= ~(dep->interval - 1);
3097 req->request.frame_number = frame_number;
3098 }
3099
3100
3101
3102
3103
3104
3105 if (trb->bpl == lower_32_bits(dep->dwc->bounce_addr) &&
3106 trb->bph == upper_32_bits(dep->dwc->bounce_addr)) {
3107 trb->ctrl &= ~DWC3_TRB_CTRL_HWO;
3108 return 1;
3109 }
3110
3111 count = trb->size & DWC3_TRB_SIZE_MASK;
3112 req->remaining += count;
3113
3114 if ((trb->ctrl & DWC3_TRB_CTRL_HWO) && status != -ESHUTDOWN)
3115 return 1;
3116
3117 if (event->status & DEPEVT_STATUS_SHORT && !chain)
3118 return 1;
3119
3120 if ((trb->ctrl & DWC3_TRB_CTRL_IOC) ||
3121 (trb->ctrl & DWC3_TRB_CTRL_LST))
3122 return 1;
3123
3124 return 0;
3125}
3126
3127static int dwc3_gadget_ep_reclaim_trb_sg(struct dwc3_ep *dep,
3128 struct dwc3_request *req, const struct dwc3_event_depevt *event,
3129 int status)
3130{
3131 struct dwc3_trb *trb = &dep->trb_pool[dep->trb_dequeue];
3132 struct scatterlist *sg = req->sg;
3133 struct scatterlist *s;
3134 unsigned int num_queued = req->num_queued_sgs;
3135 unsigned int i;
3136 int ret = 0;
3137
3138 for_each_sg(sg, s, num_queued, i) {
3139 trb = &dep->trb_pool[dep->trb_dequeue];
3140
3141 req->sg = sg_next(s);
3142 req->num_queued_sgs--;
3143
3144 ret = dwc3_gadget_ep_reclaim_completed_trb(dep, req,
3145 trb, event, status, true);
3146 if (ret)
3147 break;
3148 }
3149
3150 return ret;
3151}
3152
3153static int dwc3_gadget_ep_reclaim_trb_linear(struct dwc3_ep *dep,
3154 struct dwc3_request *req, const struct dwc3_event_depevt *event,
3155 int status)
3156{
3157 struct dwc3_trb *trb = &dep->trb_pool[dep->trb_dequeue];
3158
3159 return dwc3_gadget_ep_reclaim_completed_trb(dep, req, trb,
3160 event, status, false);
3161}
3162
3163static bool dwc3_gadget_ep_request_completed(struct dwc3_request *req)
3164{
3165 return req->num_pending_sgs == 0 && req->num_queued_sgs == 0;
3166}
3167
3168static int dwc3_gadget_ep_cleanup_completed_request(struct dwc3_ep *dep,
3169 const struct dwc3_event_depevt *event,
3170 struct dwc3_request *req, int status)
3171{
3172 int ret;
3173
3174 if (req->request.num_mapped_sgs)
3175 ret = dwc3_gadget_ep_reclaim_trb_sg(dep, req, event,
3176 status);
3177 else
3178 ret = dwc3_gadget_ep_reclaim_trb_linear(dep, req, event,
3179 status);
3180
3181 req->request.actual = req->request.length - req->remaining;
3182
3183 if (!dwc3_gadget_ep_request_completed(req))
3184 goto out;
3185
3186 if (req->needs_extra_trb) {
3187 ret = dwc3_gadget_ep_reclaim_trb_linear(dep, req, event,
3188 status);
3189 req->needs_extra_trb = false;
3190 }
3191
3192 dwc3_gadget_giveback(dep, req, status);
3193
3194out:
3195 return ret;
3196}
3197
3198static void dwc3_gadget_ep_cleanup_completed_requests(struct dwc3_ep *dep,
3199 const struct dwc3_event_depevt *event, int status)
3200{
3201 struct dwc3_request *req;
3202 struct dwc3_request *tmp;
3203
3204 list_for_each_entry_safe(req, tmp, &dep->started_list, list) {
3205 int ret;
3206
3207 ret = dwc3_gadget_ep_cleanup_completed_request(dep, event,
3208 req, status);
3209 if (ret)
3210 break;
3211 }
3212}
3213
3214static bool dwc3_gadget_ep_should_continue(struct dwc3_ep *dep)
3215{
3216 struct dwc3_request *req;
3217 struct dwc3 *dwc = dep->dwc;
3218
3219 if (!dep->endpoint.desc || !dwc->pullups_connected ||
3220 !dwc->connected)
3221 return false;
3222
3223 if (!list_empty(&dep->pending_list))
3224 return true;
3225
3226
3227
3228
3229
3230 req = next_request(&dep->started_list);
3231 if (!req)
3232 return false;
3233
3234 return !dwc3_gadget_ep_request_completed(req);
3235}
3236
3237static void dwc3_gadget_endpoint_frame_from_event(struct dwc3_ep *dep,
3238 const struct dwc3_event_depevt *event)
3239{
3240 dep->frame_number = event->parameters;
3241}
3242
3243static bool dwc3_gadget_endpoint_trbs_complete(struct dwc3_ep *dep,
3244 const struct dwc3_event_depevt *event, int status)
3245{
3246 struct dwc3 *dwc = dep->dwc;
3247 bool no_started_trb = true;
3248
3249 dwc3_gadget_ep_cleanup_completed_requests(dep, event, status);
3250
3251 if (dep->flags & DWC3_EP_END_TRANSFER_PENDING)
3252 goto out;
3253
3254 if (usb_endpoint_xfer_isoc(dep->endpoint.desc) &&
3255 list_empty(&dep->started_list) &&
3256 (list_empty(&dep->pending_list) || status == -EXDEV))
3257 dwc3_stop_active_transfer(dep, true, true);
3258 else if (dwc3_gadget_ep_should_continue(dep))
3259 if (__dwc3_gadget_kick_transfer(dep) == 0)
3260 no_started_trb = false;
3261
3262out:
3263
3264
3265
3266
3267 if (DWC3_VER_IS_PRIOR(DWC3, 183A)) {
3268 u32 reg;
3269 int i;
3270
3271 for (i = 0; i < DWC3_ENDPOINTS_NUM; i++) {
3272 dep = dwc->eps[i];
3273
3274 if (!(dep->flags & DWC3_EP_ENABLED))
3275 continue;
3276
3277 if (!list_empty(&dep->started_list))
3278 return no_started_trb;
3279 }
3280
3281 reg = dwc3_readl(dwc->regs, DWC3_DCTL);
3282 reg |= dwc->u1u2;
3283 dwc3_writel(dwc->regs, DWC3_DCTL, reg);
3284
3285 dwc->u1u2 = 0;
3286 }
3287
3288 return no_started_trb;
3289}
3290
3291static void dwc3_gadget_endpoint_transfer_in_progress(struct dwc3_ep *dep,
3292 const struct dwc3_event_depevt *event)
3293{
3294 int status = 0;
3295
3296 if (usb_endpoint_xfer_isoc(dep->endpoint.desc))
3297 dwc3_gadget_endpoint_frame_from_event(dep, event);
3298
3299 if (event->status & DEPEVT_STATUS_BUSERR)
3300 status = -ECONNRESET;
3301
3302 if (event->status & DEPEVT_STATUS_MISSED_ISOC)
3303 status = -EXDEV;
3304
3305 dwc3_gadget_endpoint_trbs_complete(dep, event, status);
3306}
3307
3308static void dwc3_gadget_endpoint_transfer_complete(struct dwc3_ep *dep,
3309 const struct dwc3_event_depevt *event)
3310{
3311 int status = 0;
3312
3313 dep->flags &= ~DWC3_EP_TRANSFER_STARTED;
3314
3315 if (event->status & DEPEVT_STATUS_BUSERR)
3316 status = -ECONNRESET;
3317
3318 if (dwc3_gadget_endpoint_trbs_complete(dep, event, status))
3319 dep->flags &= ~DWC3_EP_WAIT_TRANSFER_COMPLETE;
3320}
3321
3322static void dwc3_gadget_endpoint_transfer_not_ready(struct dwc3_ep *dep,
3323 const struct dwc3_event_depevt *event)
3324{
3325 dwc3_gadget_endpoint_frame_from_event(dep, event);
3326
3327
3328
3329
3330
3331
3332
3333
3334
3335 if (dep->flags & DWC3_EP_END_TRANSFER_PENDING)
3336 return;
3337
3338 (void) __dwc3_gadget_start_isoc(dep);
3339}
3340
3341static void dwc3_gadget_endpoint_command_complete(struct dwc3_ep *dep,
3342 const struct dwc3_event_depevt *event)
3343{
3344 u8 cmd = DEPEVT_PARAMETER_CMD(event->parameters);
3345
3346 if (cmd != DWC3_DEPCMD_ENDTRANSFER)
3347 return;
3348
3349 dep->flags &= ~DWC3_EP_END_TRANSFER_PENDING;
3350 dep->flags &= ~DWC3_EP_TRANSFER_STARTED;
3351 dwc3_gadget_ep_cleanup_cancelled_requests(dep);
3352
3353 if (dep->flags & DWC3_EP_PENDING_CLEAR_STALL) {
3354 struct dwc3 *dwc = dep->dwc;
3355
3356 dep->flags &= ~DWC3_EP_PENDING_CLEAR_STALL;
3357 if (dwc3_send_clear_stall_ep_cmd(dep)) {
3358 struct usb_ep *ep0 = &dwc->eps[0]->endpoint;
3359
3360 dev_err(dwc->dev, "failed to clear STALL on %s\n", dep->name);
3361 if (dwc->delayed_status)
3362 __dwc3_gadget_ep0_set_halt(ep0, 1);
3363 return;
3364 }
3365
3366 dep->flags &= ~(DWC3_EP_STALL | DWC3_EP_WEDGE);
3367 if (dwc->delayed_status)
3368 dwc3_ep0_send_delayed_status(dwc);
3369 }
3370
3371 if ((dep->flags & DWC3_EP_DELAY_START) &&
3372 !usb_endpoint_xfer_isoc(dep->endpoint.desc))
3373 __dwc3_gadget_kick_transfer(dep);
3374
3375 dep->flags &= ~DWC3_EP_DELAY_START;
3376}
3377
3378static void dwc3_gadget_endpoint_stream_event(struct dwc3_ep *dep,
3379 const struct dwc3_event_depevt *event)
3380{
3381 struct dwc3 *dwc = dep->dwc;
3382
3383 if (event->status == DEPEVT_STREAMEVT_FOUND) {
3384 dep->flags |= DWC3_EP_FIRST_STREAM_PRIMED;
3385 goto out;
3386 }
3387
3388
3389 switch (event->parameters) {
3390 case DEPEVT_STREAM_PRIME:
3391
3392
3393
3394
3395
3396
3397
3398 if (dep->flags & DWC3_EP_FORCE_RESTART_STREAM) {
3399 if (dep->flags & DWC3_EP_FIRST_STREAM_PRIMED)
3400 dep->flags &= ~DWC3_EP_FORCE_RESTART_STREAM;
3401 else
3402 dep->flags |= DWC3_EP_FIRST_STREAM_PRIMED;
3403 }
3404
3405 break;
3406 case DEPEVT_STREAM_NOSTREAM:
3407 if ((dep->flags & DWC3_EP_IGNORE_NEXT_NOSTREAM) ||
3408 !(dep->flags & DWC3_EP_FORCE_RESTART_STREAM) ||
3409 !(dep->flags & DWC3_EP_WAIT_TRANSFER_COMPLETE))
3410 break;
3411
3412
3413
3414
3415
3416
3417
3418
3419
3420
3421
3422
3423
3424
3425
3426 if (DWC3_VER_IS_WITHIN(DWC32, 100A, ANY)) {
3427 unsigned int cmd = DWC3_DGCMD_SET_ENDPOINT_PRIME;
3428
3429 dwc3_send_gadget_generic_command(dwc, cmd, dep->number);
3430 } else {
3431 dep->flags |= DWC3_EP_DELAY_START;
3432 dwc3_stop_active_transfer(dep, true, true);
3433 return;
3434 }
3435 break;
3436 }
3437
3438out:
3439 dep->flags &= ~DWC3_EP_IGNORE_NEXT_NOSTREAM;
3440}
3441
3442static void dwc3_endpoint_interrupt(struct dwc3 *dwc,
3443 const struct dwc3_event_depevt *event)
3444{
3445 struct dwc3_ep *dep;
3446 u8 epnum = event->endpoint_number;
3447
3448 dep = dwc->eps[epnum];
3449
3450 if (!(dep->flags & DWC3_EP_ENABLED)) {
3451 if (!(dep->flags & DWC3_EP_TRANSFER_STARTED))
3452 return;
3453
3454
3455 if (event->endpoint_event != DWC3_DEPEVT_EPCMDCMPLT)
3456 return;
3457 }
3458
3459 if (epnum == 0 || epnum == 1) {
3460 dwc3_ep0_interrupt(dwc, event);
3461 return;
3462 }
3463
3464 switch (event->endpoint_event) {
3465 case DWC3_DEPEVT_XFERINPROGRESS:
3466 dwc3_gadget_endpoint_transfer_in_progress(dep, event);
3467 break;
3468 case DWC3_DEPEVT_XFERNOTREADY:
3469 dwc3_gadget_endpoint_transfer_not_ready(dep, event);
3470 break;
3471 case DWC3_DEPEVT_EPCMDCMPLT:
3472 dwc3_gadget_endpoint_command_complete(dep, event);
3473 break;
3474 case DWC3_DEPEVT_XFERCOMPLETE:
3475 dwc3_gadget_endpoint_transfer_complete(dep, event);
3476 break;
3477 case DWC3_DEPEVT_STREAMEVT:
3478 dwc3_gadget_endpoint_stream_event(dep, event);
3479 break;
3480 case DWC3_DEPEVT_RXTXFIFOEVT:
3481 break;
3482 }
3483}
3484
3485static void dwc3_disconnect_gadget(struct dwc3 *dwc)
3486{
3487 if (dwc->async_callbacks && dwc->gadget_driver->disconnect) {
3488 spin_unlock(&dwc->lock);
3489 dwc->gadget_driver->disconnect(dwc->gadget);
3490 spin_lock(&dwc->lock);
3491 }
3492}
3493
3494static void dwc3_suspend_gadget(struct dwc3 *dwc)
3495{
3496 if (dwc->async_callbacks && dwc->gadget_driver->suspend) {
3497 spin_unlock(&dwc->lock);
3498 dwc->gadget_driver->suspend(dwc->gadget);
3499 spin_lock(&dwc->lock);
3500 }
3501}
3502
3503static void dwc3_resume_gadget(struct dwc3 *dwc)
3504{
3505 if (dwc->async_callbacks && dwc->gadget_driver->resume) {
3506 spin_unlock(&dwc->lock);
3507 dwc->gadget_driver->resume(dwc->gadget);
3508 spin_lock(&dwc->lock);
3509 }
3510}
3511
3512static void dwc3_reset_gadget(struct dwc3 *dwc)
3513{
3514 if (!dwc->gadget_driver)
3515 return;
3516
3517 if (dwc->async_callbacks && dwc->gadget->speed != USB_SPEED_UNKNOWN) {
3518 spin_unlock(&dwc->lock);
3519 usb_gadget_udc_reset(dwc->gadget, dwc->gadget_driver);
3520 spin_lock(&dwc->lock);
3521 }
3522}
3523
3524static void dwc3_stop_active_transfer(struct dwc3_ep *dep, bool force,
3525 bool interrupt)
3526{
3527 struct dwc3_gadget_ep_cmd_params params;
3528 u32 cmd;
3529 int ret;
3530
3531 if (!(dep->flags & DWC3_EP_TRANSFER_STARTED) ||
3532 (dep->flags & DWC3_EP_END_TRANSFER_PENDING))
3533 return;
3534
3535
3536
3537
3538
3539
3540
3541
3542
3543
3544
3545
3546
3547
3548
3549
3550
3551
3552
3553
3554
3555
3556
3557
3558
3559
3560
3561
3562 cmd = DWC3_DEPCMD_ENDTRANSFER;
3563 cmd |= force ? DWC3_DEPCMD_HIPRI_FORCERM : 0;
3564 cmd |= interrupt ? DWC3_DEPCMD_CMDIOC : 0;
3565 cmd |= DWC3_DEPCMD_PARAM(dep->resource_index);
3566 memset(¶ms, 0, sizeof(params));
3567 ret = dwc3_send_gadget_ep_cmd(dep, cmd, ¶ms);
3568 WARN_ON_ONCE(ret);
3569 dep->resource_index = 0;
3570
3571
3572
3573
3574
3575
3576 if (dep->stream_capable)
3577 dep->flags |= DWC3_EP_IGNORE_NEXT_NOSTREAM;
3578
3579 if (!interrupt)
3580 dep->flags &= ~DWC3_EP_TRANSFER_STARTED;
3581 else
3582 dep->flags |= DWC3_EP_END_TRANSFER_PENDING;
3583}
3584
3585static void dwc3_clear_stall_all_ep(struct dwc3 *dwc)
3586{
3587 u32 epnum;
3588
3589 for (epnum = 1; epnum < DWC3_ENDPOINTS_NUM; epnum++) {
3590 struct dwc3_ep *dep;
3591 int ret;
3592
3593 dep = dwc->eps[epnum];
3594 if (!dep)
3595 continue;
3596
3597 if (!(dep->flags & DWC3_EP_STALL))
3598 continue;
3599
3600 dep->flags &= ~DWC3_EP_STALL;
3601
3602 ret = dwc3_send_clear_stall_ep_cmd(dep);
3603 WARN_ON_ONCE(ret);
3604 }
3605}
3606
3607static void dwc3_gadget_disconnect_interrupt(struct dwc3 *dwc)
3608{
3609 int reg;
3610
3611 dwc3_gadget_set_link_state(dwc, DWC3_LINK_STATE_RX_DET);
3612
3613 reg = dwc3_readl(dwc->regs, DWC3_DCTL);
3614 reg &= ~DWC3_DCTL_INITU1ENA;
3615 reg &= ~DWC3_DCTL_INITU2ENA;
3616 dwc3_gadget_dctl_write_safe(dwc, reg);
3617
3618 dwc3_disconnect_gadget(dwc);
3619
3620 dwc->gadget->speed = USB_SPEED_UNKNOWN;
3621 dwc->setup_packet_pending = false;
3622 usb_gadget_set_state(dwc->gadget, USB_STATE_NOTATTACHED);
3623
3624 dwc->connected = false;
3625}
3626
3627static void dwc3_gadget_reset_interrupt(struct dwc3 *dwc)
3628{
3629 u32 reg;
3630
3631
3632
3633
3634
3635
3636
3637
3638 dwc->connected = false;
3639
3640
3641
3642
3643
3644
3645
3646
3647
3648
3649
3650
3651
3652
3653
3654
3655
3656
3657
3658
3659
3660
3661
3662
3663
3664
3665
3666 if (DWC3_VER_IS_PRIOR(DWC3, 188A)) {
3667 if (dwc->setup_packet_pending)
3668 dwc3_gadget_disconnect_interrupt(dwc);
3669 }
3670
3671 dwc3_reset_gadget(dwc);
3672
3673
3674
3675
3676
3677
3678 dwc3_stop_active_transfers(dwc);
3679 dwc->connected = true;
3680
3681 reg = dwc3_readl(dwc->regs, DWC3_DCTL);
3682 reg &= ~DWC3_DCTL_TSTCTRL_MASK;
3683 dwc3_gadget_dctl_write_safe(dwc, reg);
3684 dwc->test_mode = false;
3685 dwc3_clear_stall_all_ep(dwc);
3686
3687
3688 reg = dwc3_readl(dwc->regs, DWC3_DCFG);
3689 reg &= ~(DWC3_DCFG_DEVADDR_MASK);
3690 dwc3_writel(dwc->regs, DWC3_DCFG, reg);
3691}
3692
3693static void dwc3_gadget_conndone_interrupt(struct dwc3 *dwc)
3694{
3695 struct dwc3_ep *dep;
3696 int ret;
3697 u32 reg;
3698 u8 lanes = 1;
3699 u8 speed;
3700
3701 reg = dwc3_readl(dwc->regs, DWC3_DSTS);
3702 speed = reg & DWC3_DSTS_CONNECTSPD;
3703 dwc->speed = speed;
3704
3705 if (DWC3_IP_IS(DWC32))
3706 lanes = DWC3_DSTS_CONNLANES(reg) + 1;
3707
3708 dwc->gadget->ssp_rate = USB_SSP_GEN_UNKNOWN;
3709
3710
3711
3712
3713
3714
3715
3716
3717
3718
3719 switch (speed) {
3720 case DWC3_DSTS_SUPERSPEED_PLUS:
3721 dwc3_gadget_ep0_desc.wMaxPacketSize = cpu_to_le16(512);
3722 dwc->gadget->ep0->maxpacket = 512;
3723 dwc->gadget->speed = USB_SPEED_SUPER_PLUS;
3724
3725 if (lanes > 1)
3726 dwc->gadget->ssp_rate = USB_SSP_GEN_2x2;
3727 else
3728 dwc->gadget->ssp_rate = USB_SSP_GEN_2x1;
3729 break;
3730 case DWC3_DSTS_SUPERSPEED:
3731
3732
3733
3734
3735
3736
3737
3738
3739
3740
3741
3742
3743
3744 if (DWC3_VER_IS_PRIOR(DWC3, 190A))
3745 dwc3_gadget_reset_interrupt(dwc);
3746
3747 dwc3_gadget_ep0_desc.wMaxPacketSize = cpu_to_le16(512);
3748 dwc->gadget->ep0->maxpacket = 512;
3749 dwc->gadget->speed = USB_SPEED_SUPER;
3750
3751 if (lanes > 1) {
3752 dwc->gadget->speed = USB_SPEED_SUPER_PLUS;
3753 dwc->gadget->ssp_rate = USB_SSP_GEN_1x2;
3754 }
3755 break;
3756 case DWC3_DSTS_HIGHSPEED:
3757 dwc3_gadget_ep0_desc.wMaxPacketSize = cpu_to_le16(64);
3758 dwc->gadget->ep0->maxpacket = 64;
3759 dwc->gadget->speed = USB_SPEED_HIGH;
3760 break;
3761 case DWC3_DSTS_FULLSPEED:
3762 dwc3_gadget_ep0_desc.wMaxPacketSize = cpu_to_le16(64);
3763 dwc->gadget->ep0->maxpacket = 64;
3764 dwc->gadget->speed = USB_SPEED_FULL;
3765 break;
3766 }
3767
3768 dwc->eps[1]->endpoint.maxpacket = dwc->gadget->ep0->maxpacket;
3769
3770
3771
3772 if (!DWC3_VER_IS_WITHIN(DWC3, ANY, 194A) &&
3773 !dwc->usb2_gadget_lpm_disable &&
3774 (speed != DWC3_DSTS_SUPERSPEED) &&
3775 (speed != DWC3_DSTS_SUPERSPEED_PLUS)) {
3776 reg = dwc3_readl(dwc->regs, DWC3_DCFG);
3777 reg |= DWC3_DCFG_LPM_CAP;
3778 dwc3_writel(dwc->regs, DWC3_DCFG, reg);
3779
3780 reg = dwc3_readl(dwc->regs, DWC3_DCTL);
3781 reg &= ~(DWC3_DCTL_HIRD_THRES_MASK | DWC3_DCTL_L1_HIBER_EN);
3782
3783 reg |= DWC3_DCTL_HIRD_THRES(dwc->hird_threshold |
3784 (dwc->is_utmi_l1_suspend << 4));
3785
3786
3787
3788
3789
3790
3791
3792 WARN_ONCE(DWC3_VER_IS_PRIOR(DWC3, 240A) && dwc->has_lpm_erratum,
3793 "LPM Erratum not available on dwc3 revisions < 2.40a\n");
3794
3795 if (dwc->has_lpm_erratum && !DWC3_VER_IS_PRIOR(DWC3, 240A))
3796 reg |= DWC3_DCTL_NYET_THRES(dwc->lpm_nyet_threshold);
3797
3798 dwc3_gadget_dctl_write_safe(dwc, reg);
3799 } else {
3800 if (dwc->usb2_gadget_lpm_disable) {
3801 reg = dwc3_readl(dwc->regs, DWC3_DCFG);
3802 reg &= ~DWC3_DCFG_LPM_CAP;
3803 dwc3_writel(dwc->regs, DWC3_DCFG, reg);
3804 }
3805
3806 reg = dwc3_readl(dwc->regs, DWC3_DCTL);
3807 reg &= ~DWC3_DCTL_HIRD_THRES_MASK;
3808 dwc3_gadget_dctl_write_safe(dwc, reg);
3809 }
3810
3811 dep = dwc->eps[0];
3812 ret = __dwc3_gadget_ep_enable(dep, DWC3_DEPCFG_ACTION_MODIFY);
3813 if (ret) {
3814 dev_err(dwc->dev, "failed to enable %s\n", dep->name);
3815 return;
3816 }
3817
3818 dep = dwc->eps[1];
3819 ret = __dwc3_gadget_ep_enable(dep, DWC3_DEPCFG_ACTION_MODIFY);
3820 if (ret) {
3821 dev_err(dwc->dev, "failed to enable %s\n", dep->name);
3822 return;
3823 }
3824
3825
3826
3827
3828
3829
3830
3831
3832}
3833
3834static void dwc3_gadget_wakeup_interrupt(struct dwc3 *dwc)
3835{
3836
3837
3838
3839
3840
3841 if (dwc->async_callbacks && dwc->gadget_driver->resume) {
3842 spin_unlock(&dwc->lock);
3843 dwc->gadget_driver->resume(dwc->gadget);
3844 spin_lock(&dwc->lock);
3845 }
3846}
3847
3848static void dwc3_gadget_linksts_change_interrupt(struct dwc3 *dwc,
3849 unsigned int evtinfo)
3850{
3851 enum dwc3_link_state next = evtinfo & DWC3_LINK_STATE_MASK;
3852 unsigned int pwropt;
3853
3854
3855
3856
3857
3858
3859
3860
3861
3862
3863
3864
3865
3866
3867
3868
3869
3870
3871 pwropt = DWC3_GHWPARAMS1_EN_PWROPT(dwc->hwparams.hwparams1);
3872 if (DWC3_VER_IS_PRIOR(DWC3, 250A) &&
3873 (pwropt != DWC3_GHWPARAMS1_EN_PWROPT_HIB)) {
3874 if ((dwc->link_state == DWC3_LINK_STATE_U3) &&
3875 (next == DWC3_LINK_STATE_RESUME)) {
3876 return;
3877 }
3878 }
3879
3880
3881
3882
3883
3884
3885
3886
3887
3888
3889
3890
3891
3892
3893
3894
3895
3896
3897
3898 if (DWC3_VER_IS_PRIOR(DWC3, 183A)) {
3899 if (next == DWC3_LINK_STATE_U0) {
3900 u32 u1u2;
3901 u32 reg;
3902
3903 switch (dwc->link_state) {
3904 case DWC3_LINK_STATE_U1:
3905 case DWC3_LINK_STATE_U2:
3906 reg = dwc3_readl(dwc->regs, DWC3_DCTL);
3907 u1u2 = reg & (DWC3_DCTL_INITU2ENA
3908 | DWC3_DCTL_ACCEPTU2ENA
3909 | DWC3_DCTL_INITU1ENA
3910 | DWC3_DCTL_ACCEPTU1ENA);
3911
3912 if (!dwc->u1u2)
3913 dwc->u1u2 = reg & u1u2;
3914
3915 reg &= ~u1u2;
3916
3917 dwc3_gadget_dctl_write_safe(dwc, reg);
3918 break;
3919 default:
3920
3921 break;
3922 }
3923 }
3924 }
3925
3926 switch (next) {
3927 case DWC3_LINK_STATE_U1:
3928 if (dwc->speed == USB_SPEED_SUPER)
3929 dwc3_suspend_gadget(dwc);
3930 break;
3931 case DWC3_LINK_STATE_U2:
3932 case DWC3_LINK_STATE_U3:
3933 dwc3_suspend_gadget(dwc);
3934 break;
3935 case DWC3_LINK_STATE_RESUME:
3936 dwc3_resume_gadget(dwc);
3937 break;
3938 default:
3939
3940 break;
3941 }
3942
3943 dwc->link_state = next;
3944}
3945
3946static void dwc3_gadget_suspend_interrupt(struct dwc3 *dwc,
3947 unsigned int evtinfo)
3948{
3949 enum dwc3_link_state next = evtinfo & DWC3_LINK_STATE_MASK;
3950
3951 if (dwc->link_state != next && next == DWC3_LINK_STATE_U3)
3952 dwc3_suspend_gadget(dwc);
3953
3954 dwc->link_state = next;
3955}
3956
3957static void dwc3_gadget_hibernation_interrupt(struct dwc3 *dwc,
3958 unsigned int evtinfo)
3959{
3960 unsigned int is_ss = evtinfo & BIT(4);
3961
3962
3963
3964
3965
3966
3967
3968
3969
3970
3971
3972
3973
3974
3975 if (is_ss ^ (dwc->speed == USB_SPEED_SUPER))
3976 return;
3977
3978
3979}
3980
3981static void dwc3_gadget_interrupt(struct dwc3 *dwc,
3982 const struct dwc3_event_devt *event)
3983{
3984 switch (event->type) {
3985 case DWC3_DEVICE_EVENT_DISCONNECT:
3986 dwc3_gadget_disconnect_interrupt(dwc);
3987 break;
3988 case DWC3_DEVICE_EVENT_RESET:
3989 dwc3_gadget_reset_interrupt(dwc);
3990 break;
3991 case DWC3_DEVICE_EVENT_CONNECT_DONE:
3992 dwc3_gadget_conndone_interrupt(dwc);
3993 break;
3994 case DWC3_DEVICE_EVENT_WAKEUP:
3995 dwc3_gadget_wakeup_interrupt(dwc);
3996 break;
3997 case DWC3_DEVICE_EVENT_HIBER_REQ:
3998 if (dev_WARN_ONCE(dwc->dev, !dwc->has_hibernation,
3999 "unexpected hibernation event\n"))
4000 break;
4001
4002 dwc3_gadget_hibernation_interrupt(dwc, event->event_info);
4003 break;
4004 case DWC3_DEVICE_EVENT_LINK_STATUS_CHANGE:
4005 dwc3_gadget_linksts_change_interrupt(dwc, event->event_info);
4006 break;
4007 case DWC3_DEVICE_EVENT_SUSPEND:
4008
4009 if (!DWC3_VER_IS_PRIOR(DWC3, 230A)) {
4010
4011
4012
4013
4014 if (dwc->gadget->state >= USB_STATE_CONFIGURED)
4015 dwc3_gadget_suspend_interrupt(dwc,
4016 event->event_info);
4017 }
4018 break;
4019 case DWC3_DEVICE_EVENT_SOF:
4020 case DWC3_DEVICE_EVENT_ERRATIC_ERROR:
4021 case DWC3_DEVICE_EVENT_CMD_CMPL:
4022 case DWC3_DEVICE_EVENT_OVERFLOW:
4023 break;
4024 default:
4025 dev_WARN(dwc->dev, "UNKNOWN IRQ %d\n", event->type);
4026 }
4027}
4028
4029static void dwc3_process_event_entry(struct dwc3 *dwc,
4030 const union dwc3_event *event)
4031{
4032 trace_dwc3_event(event->raw, dwc);
4033
4034 if (!event->type.is_devspec)
4035 dwc3_endpoint_interrupt(dwc, &event->depevt);
4036 else if (event->type.type == DWC3_EVENT_TYPE_DEV)
4037 dwc3_gadget_interrupt(dwc, &event->devt);
4038 else
4039 dev_err(dwc->dev, "UNKNOWN IRQ type %d\n", event->raw);
4040}
4041
4042static irqreturn_t dwc3_process_event_buf(struct dwc3_event_buffer *evt)
4043{
4044 struct dwc3 *dwc = evt->dwc;
4045 irqreturn_t ret = IRQ_NONE;
4046 int left;
4047 u32 reg;
4048
4049 left = evt->count;
4050
4051 if (!(evt->flags & DWC3_EVENT_PENDING))
4052 return IRQ_NONE;
4053
4054 while (left > 0) {
4055 union dwc3_event event;
4056
4057 event.raw = *(u32 *) (evt->cache + evt->lpos);
4058
4059 dwc3_process_event_entry(dwc, &event);
4060
4061
4062
4063
4064
4065
4066
4067
4068
4069
4070 evt->lpos = (evt->lpos + 4) % evt->length;
4071 left -= 4;
4072 }
4073
4074 evt->count = 0;
4075 evt->flags &= ~DWC3_EVENT_PENDING;
4076 ret = IRQ_HANDLED;
4077
4078
4079 reg = dwc3_readl(dwc->regs, DWC3_GEVNTSIZ(0));
4080 reg &= ~DWC3_GEVNTSIZ_INTMASK;
4081 dwc3_writel(dwc->regs, DWC3_GEVNTSIZ(0), reg);
4082
4083 if (dwc->imod_interval) {
4084 dwc3_writel(dwc->regs, DWC3_GEVNTCOUNT(0), DWC3_GEVNTCOUNT_EHB);
4085 dwc3_writel(dwc->regs, DWC3_DEV_IMOD(0), dwc->imod_interval);
4086 }
4087
4088 return ret;
4089}
4090
4091static irqreturn_t dwc3_thread_interrupt(int irq, void *_evt)
4092{
4093 struct dwc3_event_buffer *evt = _evt;
4094 struct dwc3 *dwc = evt->dwc;
4095 unsigned long flags;
4096 irqreturn_t ret = IRQ_NONE;
4097
4098 spin_lock_irqsave(&dwc->lock, flags);
4099 ret = dwc3_process_event_buf(evt);
4100 spin_unlock_irqrestore(&dwc->lock, flags);
4101
4102 return ret;
4103}
4104
4105static irqreturn_t dwc3_check_event_buf(struct dwc3_event_buffer *evt)
4106{
4107 struct dwc3 *dwc = evt->dwc;
4108 u32 amount;
4109 u32 count;
4110 u32 reg;
4111
4112 if (pm_runtime_suspended(dwc->dev)) {
4113 pm_runtime_get(dwc->dev);
4114 disable_irq_nosync(dwc->irq_gadget);
4115 dwc->pending_events = true;
4116 return IRQ_HANDLED;
4117 }
4118
4119
4120
4121
4122
4123
4124
4125 if (evt->flags & DWC3_EVENT_PENDING)
4126 return IRQ_HANDLED;
4127
4128 count = dwc3_readl(dwc->regs, DWC3_GEVNTCOUNT(0));
4129 count &= DWC3_GEVNTCOUNT_MASK;
4130 if (!count)
4131 return IRQ_NONE;
4132
4133 evt->count = count;
4134 evt->flags |= DWC3_EVENT_PENDING;
4135
4136
4137 reg = dwc3_readl(dwc->regs, DWC3_GEVNTSIZ(0));
4138 reg |= DWC3_GEVNTSIZ_INTMASK;
4139 dwc3_writel(dwc->regs, DWC3_GEVNTSIZ(0), reg);
4140
4141 amount = min(count, evt->length - evt->lpos);
4142 memcpy(evt->cache + evt->lpos, evt->buf + evt->lpos, amount);
4143
4144 if (amount < count)
4145 memcpy(evt->cache, evt->buf, count - amount);
4146
4147 dwc3_writel(dwc->regs, DWC3_GEVNTCOUNT(0), count);
4148
4149 return IRQ_WAKE_THREAD;
4150}
4151
4152static irqreturn_t dwc3_interrupt(int irq, void *_evt)
4153{
4154 struct dwc3_event_buffer *evt = _evt;
4155
4156 return dwc3_check_event_buf(evt);
4157}
4158
4159static int dwc3_gadget_get_irq(struct dwc3 *dwc)
4160{
4161 struct platform_device *dwc3_pdev = to_platform_device(dwc->dev);
4162 int irq;
4163
4164 irq = platform_get_irq_byname_optional(dwc3_pdev, "peripheral");
4165 if (irq > 0)
4166 goto out;
4167
4168 if (irq == -EPROBE_DEFER)
4169 goto out;
4170
4171 irq = platform_get_irq_byname_optional(dwc3_pdev, "dwc_usb3");
4172 if (irq > 0)
4173 goto out;
4174
4175 if (irq == -EPROBE_DEFER)
4176 goto out;
4177
4178 irq = platform_get_irq(dwc3_pdev, 0);
4179 if (irq > 0)
4180 goto out;
4181
4182 if (!irq)
4183 irq = -EINVAL;
4184
4185out:
4186 return irq;
4187}
4188
4189static void dwc_gadget_release(struct device *dev)
4190{
4191 struct usb_gadget *gadget = container_of(dev, struct usb_gadget, dev);
4192
4193 kfree(gadget);
4194}
4195
4196
4197
4198
4199
4200
4201
4202int dwc3_gadget_init(struct dwc3 *dwc)
4203{
4204 int ret;
4205 int irq;
4206 struct device *dev;
4207
4208 irq = dwc3_gadget_get_irq(dwc);
4209 if (irq < 0) {
4210 ret = irq;
4211 goto err0;
4212 }
4213
4214 dwc->irq_gadget = irq;
4215
4216 dwc->ep0_trb = dma_alloc_coherent(dwc->sysdev,
4217 sizeof(*dwc->ep0_trb) * 2,
4218 &dwc->ep0_trb_addr, GFP_KERNEL);
4219 if (!dwc->ep0_trb) {
4220 dev_err(dwc->dev, "failed to allocate ep0 trb\n");
4221 ret = -ENOMEM;
4222 goto err0;
4223 }
4224
4225 dwc->setup_buf = kzalloc(DWC3_EP0_SETUP_SIZE, GFP_KERNEL);
4226 if (!dwc->setup_buf) {
4227 ret = -ENOMEM;
4228 goto err1;
4229 }
4230
4231 dwc->bounce = dma_alloc_coherent(dwc->sysdev, DWC3_BOUNCE_SIZE,
4232 &dwc->bounce_addr, GFP_KERNEL);
4233 if (!dwc->bounce) {
4234 ret = -ENOMEM;
4235 goto err2;
4236 }
4237
4238 init_completion(&dwc->ep0_in_setup);
4239 dwc->gadget = kzalloc(sizeof(struct usb_gadget), GFP_KERNEL);
4240 if (!dwc->gadget) {
4241 ret = -ENOMEM;
4242 goto err3;
4243 }
4244
4245
4246 usb_initialize_gadget(dwc->dev, dwc->gadget, dwc_gadget_release);
4247 dev = &dwc->gadget->dev;
4248 dev->platform_data = dwc;
4249 dwc->gadget->ops = &dwc3_gadget_ops;
4250 dwc->gadget->speed = USB_SPEED_UNKNOWN;
4251 dwc->gadget->ssp_rate = USB_SSP_GEN_UNKNOWN;
4252 dwc->gadget->sg_supported = true;
4253 dwc->gadget->name = "dwc3-gadget";
4254 dwc->gadget->lpm_capable = !dwc->usb2_gadget_lpm_disable;
4255
4256
4257
4258
4259
4260
4261
4262
4263
4264
4265
4266
4267
4268
4269
4270
4271
4272 if (DWC3_VER_IS_PRIOR(DWC3, 220A) &&
4273 !dwc->dis_metastability_quirk)
4274 dev_info(dwc->dev, "changing max_speed on rev %08x\n",
4275 dwc->revision);
4276
4277 dwc->gadget->max_speed = dwc->maximum_speed;
4278 dwc->gadget->max_ssp_rate = dwc->max_ssp_rate;
4279
4280
4281
4282
4283
4284
4285 ret = dwc3_gadget_init_endpoints(dwc, dwc->num_eps);
4286 if (ret)
4287 goto err4;
4288
4289 ret = usb_add_gadget(dwc->gadget);
4290 if (ret) {
4291 dev_err(dwc->dev, "failed to add gadget\n");
4292 goto err5;
4293 }
4294
4295 if (DWC3_IP_IS(DWC32) && dwc->maximum_speed == USB_SPEED_SUPER_PLUS)
4296 dwc3_gadget_set_ssp_rate(dwc->gadget, dwc->max_ssp_rate);
4297 else
4298 dwc3_gadget_set_speed(dwc->gadget, dwc->maximum_speed);
4299
4300 return 0;
4301
4302err5:
4303 dwc3_gadget_free_endpoints(dwc);
4304err4:
4305 usb_put_gadget(dwc->gadget);
4306 dwc->gadget = NULL;
4307err3:
4308 dma_free_coherent(dwc->sysdev, DWC3_BOUNCE_SIZE, dwc->bounce,
4309 dwc->bounce_addr);
4310
4311err2:
4312 kfree(dwc->setup_buf);
4313
4314err1:
4315 dma_free_coherent(dwc->sysdev, sizeof(*dwc->ep0_trb) * 2,
4316 dwc->ep0_trb, dwc->ep0_trb_addr);
4317
4318err0:
4319 return ret;
4320}
4321
4322
4323
4324void dwc3_gadget_exit(struct dwc3 *dwc)
4325{
4326 if (!dwc->gadget)
4327 return;
4328
4329 usb_del_gadget(dwc->gadget);
4330 dwc3_gadget_free_endpoints(dwc);
4331 usb_put_gadget(dwc->gadget);
4332 dma_free_coherent(dwc->sysdev, DWC3_BOUNCE_SIZE, dwc->bounce,
4333 dwc->bounce_addr);
4334 kfree(dwc->setup_buf);
4335 dma_free_coherent(dwc->sysdev, sizeof(*dwc->ep0_trb) * 2,
4336 dwc->ep0_trb, dwc->ep0_trb_addr);
4337}
4338
4339int dwc3_gadget_suspend(struct dwc3 *dwc)
4340{
4341 if (!dwc->gadget_driver)
4342 return 0;
4343
4344 dwc3_gadget_run_stop(dwc, false, false);
4345 dwc3_disconnect_gadget(dwc);
4346 __dwc3_gadget_stop(dwc);
4347
4348 return 0;
4349}
4350
4351int dwc3_gadget_resume(struct dwc3 *dwc)
4352{
4353 int ret;
4354
4355 if (!dwc->gadget_driver)
4356 return 0;
4357
4358 ret = __dwc3_gadget_start(dwc);
4359 if (ret < 0)
4360 goto err0;
4361
4362 ret = dwc3_gadget_run_stop(dwc, true, false);
4363 if (ret < 0)
4364 goto err1;
4365
4366 return 0;
4367
4368err1:
4369 __dwc3_gadget_stop(dwc);
4370
4371err0:
4372 return ret;
4373}
4374
4375void dwc3_gadget_process_pending_events(struct dwc3 *dwc)
4376{
4377 if (dwc->pending_events) {
4378 dwc3_interrupt(dwc->irq_gadget, dwc->ev_buf);
4379 dwc->pending_events = false;
4380 enable_irq(dwc->irq_gadget);
4381 }
4382}
4383