forked from ~ljy/RK356X_SDK_RELEASE

hc
2024-01-04 1543e317f1da31b75942316931e8f491a8920811
kernel/drivers/usb/dwc3/ep0.c
....@@ -2,7 +2,7 @@
22 /*
33 * ep0.c - DesignWare USB3 DRD Controller Endpoint 0 Handling
44 *
5
- * Copyright (C) 2010-2011 Texas Instruments Incorporated - http://www.ti.com
5
+ * Copyright (C) 2010-2011 Texas Instruments Incorporated - https://www.ti.com
66 *
77 * Authors: Felipe Balbi <balbi@ti.com>,
88 * Sebastian Andrzej Siewior <bigeasy@linutronix.de>
....@@ -105,7 +105,7 @@
105105 * IRQ we were waiting for is long gone.
106106 */
107107 if (dep->flags & DWC3_EP_PENDING_REQUEST) {
108
- unsigned direction;
108
+ unsigned int direction;
109109
110110 direction = !!(dep->flags & DWC3_EP0_DIR_IN);
111111
....@@ -127,11 +127,11 @@
127127 * handle it here.
128128 */
129129 if (dwc->delayed_status) {
130
- unsigned direction;
130
+ unsigned int direction;
131131
132132 direction = !dwc->ep0_expect_in;
133133 dwc->delayed_status = false;
134
- usb_gadget_set_state(&dwc->gadget, USB_STATE_CONFIGURED);
134
+ usb_gadget_set_state(dwc->gadget, USB_STATE_CONFIGURED);
135135
136136 if (dwc->ep0state == EP0_STATUS_PHASE)
137137 __dwc3_ep0_do_control_status(dwc, dwc->eps[direction]);
....@@ -172,7 +172,7 @@
172172 * XferNotReady(STATUS).
173173 */
174174 if (dwc->three_stage_setup) {
175
- unsigned direction;
175
+ unsigned int direction;
176176
177177 direction = dwc->ep0_expect_in;
178178 dwc->ep0state = EP0_DATA_PHASE;
....@@ -197,7 +197,7 @@
197197 int ret;
198198
199199 spin_lock_irqsave(&dwc->lock, flags);
200
- if (!dep->endpoint.desc) {
200
+ if (!dep->endpoint.desc || !dwc->pullups_connected || !dwc->connected) {
201201 dev_err(dwc->dev, "%s: can't queue to disabled endpoint\n",
202202 dep->name);
203203 ret = -ESHUTDOWN;
....@@ -218,7 +218,7 @@
218218 return ret;
219219 }
220220
221
-static void dwc3_ep0_stall_and_restart(struct dwc3 *dwc)
221
+void dwc3_ep0_stall_and_restart(struct dwc3 *dwc)
222222 {
223223 struct dwc3_ep *dep;
224224
....@@ -239,6 +239,8 @@
239239 dwc3_gadget_giveback(dep, req, -ECONNRESET);
240240 }
241241
242
+ dwc->eps[0]->trb_enqueue = 0;
243
+ dwc->eps[1]->trb_enqueue = 0;
242244 dwc->ep0state = EP0_SETUP_PHASE;
243245 dwc3_ep0_out_start(dwc);
244246 }
....@@ -271,6 +273,7 @@
271273 {
272274 struct dwc3_ep *dep;
273275 int ret;
276
+ int i;
274277
275278 complete(&dwc->ep0_in_setup);
276279
....@@ -279,37 +282,50 @@
279282 DWC3_TRBCTL_CONTROL_SETUP, false);
280283 ret = dwc3_ep0_start_trans(dep);
281284 WARN_ON(ret < 0);
285
+ for (i = 2; i < DWC3_ENDPOINTS_NUM; i++) {
286
+ struct dwc3_ep *dwc3_ep;
287
+
288
+ dwc3_ep = dwc->eps[i];
289
+ if (!dwc3_ep)
290
+ continue;
291
+
292
+ if (!(dwc3_ep->flags & DWC3_EP_DELAY_STOP))
293
+ continue;
294
+
295
+ dwc3_ep->flags &= ~DWC3_EP_DELAY_STOP;
296
+ if (dwc->connected)
297
+ dwc3_stop_active_transfer(dwc3_ep, true, true);
298
+ else
299
+ dwc3_remove_requests(dwc, dwc3_ep, -ESHUTDOWN);
300
+ }
282301 }
283302
284303 static struct dwc3_ep *dwc3_wIndex_to_dep(struct dwc3 *dwc, __le16 wIndex_le)
285304 {
286
- struct dwc3_ep *dep = NULL;
305
+ struct dwc3_ep *dep;
287306 u32 windex = le16_to_cpu(wIndex_le);
288
- u32 epnum, ep_index;
289
- u8 num, direction;
307
+ u32 ep, epnum;
308
+ u8 num_in_eps, num_out_eps, min_eps;
290309
291
- epnum = windex & USB_ENDPOINT_NUMBER_MASK;
292
- direction = windex & USB_ENDPOINT_DIR_MASK;
293
- ep_index = 0;
310
+ num_in_eps = DWC3_NUM_IN_EPS(&dwc->hwparams);
311
+ num_out_eps = dwc->num_eps - num_in_eps;
312
+ min_eps = min_t(u8, num_in_eps, num_out_eps);
313
+ ep = windex & USB_ENDPOINT_NUMBER_MASK;
294314
295
- for (num = 0; num < dwc->num_eps; num++) {
296
- dep = dwc->eps[num];
297
- if (!dep) {
298
- dev_warn(dwc->dev, "dep is NULL, num %d, windex 0x%08x\n",
299
- num, windex);
300
- return NULL;
301
- }
315
+ if (ep + 1 > min_eps && num_in_eps != num_out_eps) {
316
+ epnum = ep + min_eps;
302317
303
- if ((direction == USB_DIR_IN && dep->direction) ||
304
- (direction == USB_DIR_OUT && !dep->direction))
305
- ep_index++;
306
-
307
- if (ep_index == epnum + 1)
308
- break;
318
+ } else {
319
+ epnum = ep << 1;
320
+ if ((windex & USB_ENDPOINT_DIR_MASK) == USB_DIR_IN)
321
+ epnum |= 1;
309322 }
310323
324
+ dep = dwc->eps[epnum];
325
+ if (dep == NULL)
326
+ return NULL;
311327
312
- if (dep && (dep->flags & DWC3_EP_ENABLED))
328
+ if (dep->flags & DWC3_EP_ENABLED)
313329 return dep;
314330
315331 return NULL;
....@@ -342,7 +358,7 @@
342358 /*
343359 * LTM will be set once we know how to set this in HW.
344360 */
345
- usb_status |= dwc->gadget.is_selfpowered;
361
+ usb_status |= dwc->gadget->is_selfpowered;
346362
347363 if ((dwc->speed == DWC3_DSTS_SUPERSPEED) ||
348364 (dwc->speed == DWC3_DSTS_SUPERSPEED_PLUS)) {
....@@ -396,9 +412,11 @@
396412 if ((dwc->speed != DWC3_DSTS_SUPERSPEED) &&
397413 (dwc->speed != DWC3_DSTS_SUPERSPEED_PLUS))
398414 return -EINVAL;
415
+ if (set && dwc->dis_u1_entry_quirk)
416
+ return -EINVAL;
399417
400418 reg = dwc3_readl(dwc->regs, DWC3_DCTL);
401
- if (set && !dwc->dis_u1u2_quirk)
419
+ if (set)
402420 reg |= DWC3_DCTL_INITU1ENA;
403421 else
404422 reg &= ~DWC3_DCTL_INITU1ENA;
....@@ -418,9 +436,11 @@
418436 if ((dwc->speed != DWC3_DSTS_SUPERSPEED) &&
419437 (dwc->speed != DWC3_DSTS_SUPERSPEED_PLUS))
420438 return -EINVAL;
439
+ if (set && dwc->dis_u2_entry_quirk)
440
+ return -EINVAL;
421441
422442 reg = dwc3_readl(dwc->regs, DWC3_DCTL);
423
- if (set && !dwc->dis_u1u2_quirk)
443
+ if (set)
424444 reg |= DWC3_DCTL_INITU2ENA;
425445 else
426446 reg &= ~DWC3_DCTL_INITU2ENA;
....@@ -438,11 +458,11 @@
438458 return -EINVAL;
439459
440460 switch (wIndex >> 8) {
441
- case TEST_J:
442
- case TEST_K:
443
- case TEST_SE0_NAK:
444
- case TEST_PACKET:
445
- case TEST_FORCE_EN:
461
+ case USB_TEST_J:
462
+ case USB_TEST_K:
463
+ case USB_TEST_SE0_NAK:
464
+ case USB_TEST_PACKET:
465
+ case USB_TEST_FORCE_ENABLE:
446466 dwc->test_mode_nr = wIndex >> 8;
447467 dwc->test_mode = true;
448468 break;
....@@ -463,13 +483,13 @@
463483
464484 wValue = le16_to_cpu(ctrl->wValue);
465485 wIndex = le16_to_cpu(ctrl->wIndex);
466
- state = dwc->gadget.state;
486
+ state = dwc->gadget->state;
467487
468488 switch (wValue) {
469489 case USB_DEVICE_REMOTE_WAKEUP:
470490 break;
471491 /*
472
- * 9.4.1 says only only for SS, in AddressState only for
492
+ * 9.4.1 says only for SS, in AddressState only for
473493 * default control pipe
474494 */
475495 case USB_DEVICE_U1_ENABLE:
....@@ -537,6 +557,11 @@
537557 ret = __dwc3_gadget_ep_set_halt(dep, set, true);
538558 if (ret)
539559 return -EINVAL;
560
+
561
+ /* ClearFeature(Halt) may need delayed status */
562
+ if (!set && (dep->flags & DWC3_EP_END_TRANSFER_PENDING))
563
+ return USB_GADGET_DELAYED_STATUS;
564
+
540565 break;
541566 default:
542567 return -EINVAL;
....@@ -572,7 +597,7 @@
572597
573598 static int dwc3_ep0_set_address(struct dwc3 *dwc, struct usb_ctrlrequest *ctrl)
574599 {
575
- enum usb_device_state state = dwc->gadget.state;
600
+ enum usb_device_state state = dwc->gadget->state;
576601 u32 addr;
577602 u32 reg;
578603
....@@ -593,26 +618,28 @@
593618 dwc3_writel(dwc->regs, DWC3_DCFG, reg);
594619
595620 if (addr)
596
- usb_gadget_set_state(&dwc->gadget, USB_STATE_ADDRESS);
621
+ usb_gadget_set_state(dwc->gadget, USB_STATE_ADDRESS);
597622 else
598
- usb_gadget_set_state(&dwc->gadget, USB_STATE_DEFAULT);
623
+ usb_gadget_set_state(dwc->gadget, USB_STATE_DEFAULT);
599624
600625 return 0;
601626 }
602627
603628 static int dwc3_ep0_delegate_req(struct dwc3 *dwc, struct usb_ctrlrequest *ctrl)
604629 {
605
- int ret;
630
+ int ret = -EINVAL;
606631
607
- spin_unlock(&dwc->lock);
608
- ret = dwc->gadget_driver->setup(&dwc->gadget, ctrl);
609
- spin_lock(&dwc->lock);
632
+ if (dwc->async_callbacks) {
633
+ spin_unlock(&dwc->lock);
634
+ ret = dwc->gadget_driver->setup(dwc->gadget, ctrl);
635
+ spin_lock(&dwc->lock);
636
+ }
610637 return ret;
611638 }
612639
613640 static int dwc3_ep0_set_config(struct dwc3 *dwc, struct usb_ctrlrequest *ctrl)
614641 {
615
- enum usb_device_state state = dwc->gadget.state;
642
+ enum usb_device_state state = dwc->gadget->state;
616643 u32 cfg;
617644 int ret;
618645 u32 reg;
....@@ -624,6 +651,8 @@
624651 return -EINVAL;
625652
626653 case USB_STATE_ADDRESS:
654
+ dwc3_gadget_clear_tx_fifos(dwc);
655
+
627656 ret = dwc3_ep0_delegate_req(dwc, ctrl);
628657 /* if the cfg matches and the cfg is non zero */
629658 if (cfg && (!ret || (ret == USB_GADGET_DELAYED_STATUS))) {
....@@ -635,7 +664,7 @@
635664 * to change the state on the next usb_ep_queue()
636665 */
637666 if (ret == 0)
638
- usb_gadget_set_state(&dwc->gadget,
667
+ usb_gadget_set_state(dwc->gadget,
639668 USB_STATE_CONFIGURED);
640669
641670 /*
....@@ -643,12 +672,10 @@
643672 * nothing is pending from application.
644673 */
645674 reg = dwc3_readl(dwc->regs, DWC3_DCTL);
646
- if (dwc->dis_u1u2_quirk)
647
- reg &= ~(DWC3_DCTL_ACCEPTU1ENA |
648
- DWC3_DCTL_ACCEPTU2ENA);
649
- else
650
- reg |= (DWC3_DCTL_ACCEPTU1ENA |
651
- DWC3_DCTL_ACCEPTU2ENA);
675
+ if (!dwc->dis_u1_entry_quirk)
676
+ reg |= DWC3_DCTL_ACCEPTU1ENA;
677
+ if (!dwc->dis_u2_entry_quirk)
678
+ reg |= DWC3_DCTL_ACCEPTU2ENA;
652679 dwc3_writel(dwc->regs, DWC3_DCTL, reg);
653680 }
654681 break;
....@@ -656,7 +683,7 @@
656683 case USB_STATE_CONFIGURED:
657684 ret = dwc3_ep0_delegate_req(dwc, ctrl);
658685 if (!cfg && !ret)
659
- usb_gadget_set_state(&dwc->gadget,
686
+ usb_gadget_set_state(dwc->gadget,
660687 USB_STATE_ADDRESS);
661688 break;
662689 default:
....@@ -712,7 +739,7 @@
712739 static int dwc3_ep0_set_sel(struct dwc3 *dwc, struct usb_ctrlrequest *ctrl)
713740 {
714741 struct dwc3_ep *dep;
715
- enum usb_device_state state = dwc->gadget.state;
742
+ enum usb_device_state state = dwc->gadget->state;
716743 u16 wLength;
717744
718745 if (state == USB_STATE_DEFAULT)
....@@ -756,7 +783,7 @@
756783 if (wIndex || wLength)
757784 return -EINVAL;
758785
759
- dwc->gadget.isoch_delay = wValue;
786
+ dwc->gadget->isoch_delay = wValue;
760787
761788 return 0;
762789 }
....@@ -801,8 +828,9 @@
801828 struct usb_ctrlrequest *ctrl = (void *) dwc->ep0_trb;
802829 int ret = -EINVAL;
803830 u32 len;
831
+ struct dwc3_vendor *vdwc = container_of(dwc, struct dwc3_vendor, dwc);
804832
805
- if (!dwc->gadget_driver)
833
+ if (!dwc->gadget_driver || !vdwc->softconnect || !dwc->connected)
806834 goto out;
807835
808836 trace_dwc3_ctrl_req(ctrl);
....@@ -1064,13 +1092,32 @@
10641092 __dwc3_ep0_do_control_status(dwc, dep);
10651093 }
10661094
1067
-static void dwc3_ep0_end_control_data(struct dwc3 *dwc, struct dwc3_ep *dep)
1095
+void dwc3_ep0_send_delayed_status(struct dwc3 *dwc)
1096
+{
1097
+ unsigned int direction = !dwc->ep0_expect_in;
1098
+ struct dwc3_vendor *vdwc = container_of(dwc, struct dwc3_vendor, dwc);
1099
+
1100
+ dwc->delayed_status = false;
1101
+ vdwc->clear_stall_protocol = 0;
1102
+
1103
+ if (dwc->ep0state != EP0_STATUS_PHASE)
1104
+ return;
1105
+
1106
+ __dwc3_ep0_do_control_status(dwc, dwc->eps[direction]);
1107
+}
1108
+
1109
+void dwc3_ep0_end_control_data(struct dwc3 *dwc, struct dwc3_ep *dep)
10681110 {
10691111 struct dwc3_gadget_ep_cmd_params params;
10701112 u32 cmd;
10711113 int ret;
10721114
1073
- if (!dep->resource_index)
1115
+ /*
1116
+ * For status/DATA OUT stage, TRB will be queued on ep0 out
1117
+ * endpoint for which resource index is zero. Hence allow
1118
+ * queuing ENDXFER command for ep0 out endpoint.
1119
+ */
1120
+ if (!dep->resource_index && dep->number)
10741121 return;
10751122
10761123 cmd = DWC3_DEPCMD_ENDTRANSFER;
....@@ -1085,8 +1132,12 @@
10851132 static void dwc3_ep0_xfernotready(struct dwc3 *dwc,
10861133 const struct dwc3_event_depevt *event)
10871134 {
1135
+ struct dwc3_vendor *vdwc = container_of(dwc, struct dwc3_vendor, dwc);
1136
+
10881137 switch (event->status) {
10891138 case DEPEVT_STATUS_CONTROL_DATA:
1139
+ if (!vdwc->softconnect || !dwc->connected)
1140
+ return;
10901141 /*
10911142 * We already have a DATA transfer in the controller's cache,
10921143 * if we receive a XferNotReady(DATA) we will ignore it, unless
....@@ -1111,6 +1162,11 @@
11111162 if (dwc->ep0_next_event != DWC3_EP0_NRDY_STATUS)
11121163 return;
11131164
1165
+ if (dwc->setup_packet_pending) {
1166
+ dwc3_ep0_stall_and_restart(dwc);
1167
+ return;
1168
+ }
1169
+
11141170 dwc->ep0state = EP0_STATUS_PHASE;
11151171
11161172 if (dwc->delayed_status) {
....@@ -1124,7 +1180,7 @@
11241180 */
11251181 if (!list_empty(&dep->pending_list)) {
11261182 dwc->delayed_status = false;
1127
- usb_gadget_set_state(&dwc->gadget,
1183
+ usb_gadget_set_state(dwc->gadget,
11281184 USB_STATE_CONFIGURED);
11291185 dwc3_ep0_do_control_status(dwc, event);
11301186 }