aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/usb/dwc3/ep0.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/usb/dwc3/ep0.c')
-rw-r--r--drivers/usb/dwc3/ep0.c43
1 files changed, 22 insertions, 21 deletions
diff --git a/drivers/usb/dwc3/ep0.c b/drivers/usb/dwc3/ep0.c
index eca2e6d8e041..51b52a79dfec 100644
--- a/drivers/usb/dwc3/ep0.c
+++ b/drivers/usb/dwc3/ep0.c
@@ -70,10 +70,10 @@ static int dwc3_ep0_start_trans(struct dwc3 *dwc, u8 epnum, dma_addr_t buf_dma,
70 return 0; 70 return 0;
71 } 71 }
72 72
73 trb = &dwc->ep0_trb[dep->free_slot]; 73 trb = &dwc->ep0_trb[dep->trb_enqueue];
74 74
75 if (chain) 75 if (chain)
76 dep->free_slot++; 76 dep->trb_enqueue++;
77 77
78 trb->bpl = lower_32_bits(buf_dma); 78 trb->bpl = lower_32_bits(buf_dma);
79 trb->bph = upper_32_bits(buf_dma); 79 trb->bph = upper_32_bits(buf_dma);
@@ -124,7 +124,7 @@ static int __dwc3_gadget_ep0_queue(struct dwc3_ep *dep,
124 req->request.status = -EINPROGRESS; 124 req->request.status = -EINPROGRESS;
125 req->epnum = dep->number; 125 req->epnum = dep->number;
126 126
127 list_add_tail(&req->list, &dep->request_list); 127 list_add_tail(&req->list, &dep->pending_list);
128 128
129 /* 129 /*
130 * Gadget driver might not be quick enough to queue a request 130 * Gadget driver might not be quick enough to queue a request
@@ -240,7 +240,7 @@ int dwc3_gadget_ep0_queue(struct usb_ep *ep, struct usb_request *request,
240 } 240 }
241 241
242 /* we share one TRB for ep0/1 */ 242 /* we share one TRB for ep0/1 */
243 if (!list_empty(&dep->request_list)) { 243 if (!list_empty(&dep->pending_list)) {
244 ret = -EBUSY; 244 ret = -EBUSY;
245 goto out; 245 goto out;
246 } 246 }
@@ -272,10 +272,10 @@ static void dwc3_ep0_stall_and_restart(struct dwc3 *dwc)
272 dep->flags = DWC3_EP_ENABLED; 272 dep->flags = DWC3_EP_ENABLED;
273 dwc->delayed_status = false; 273 dwc->delayed_status = false;
274 274
275 if (!list_empty(&dep->request_list)) { 275 if (!list_empty(&dep->pending_list)) {
276 struct dwc3_request *req; 276 struct dwc3_request *req;
277 277
278 req = next_request(&dep->request_list); 278 req = next_request(&dep->pending_list);
279 dwc3_gadget_giveback(dep, req, -ECONNRESET); 279 dwc3_gadget_giveback(dep, req, -ECONNRESET);
280 } 280 }
281 281
@@ -463,8 +463,18 @@ static int dwc3_ep0_handle_feature(struct dwc3 *dwc,
463 if (!set) 463 if (!set)
464 return -EINVAL; 464 return -EINVAL;
465 465
466 dwc->test_mode_nr = wIndex >> 8; 466 switch (wIndex >> 8) {
467 dwc->test_mode = true; 467 case TEST_J:
468 case TEST_K:
469 case TEST_SE0_NAK:
470 case TEST_PACKET:
471 case TEST_FORCE_EN:
472 dwc->test_mode_nr = wIndex >> 8;
473 dwc->test_mode = true;
474 break;
475 default:
476 return -EINVAL;
477 }
468 break; 478 break;
469 default: 479 default:
470 return -EINVAL; 480 return -EINVAL;
@@ -586,9 +596,6 @@ static int dwc3_ep0_set_config(struct dwc3 *dwc, struct usb_ctrlrequest *ctrl)
586 reg = dwc3_readl(dwc->regs, DWC3_DCTL); 596 reg = dwc3_readl(dwc->regs, DWC3_DCTL);
587 reg |= (DWC3_DCTL_ACCEPTU1ENA | DWC3_DCTL_ACCEPTU2ENA); 597 reg |= (DWC3_DCTL_ACCEPTU1ENA | DWC3_DCTL_ACCEPTU2ENA);
588 dwc3_writel(dwc->regs, DWC3_DCTL, reg); 598 dwc3_writel(dwc->regs, DWC3_DCTL, reg);
589
590 dwc->resize_fifos = true;
591 dwc3_trace(trace_dwc3_ep0, "resize FIFOs flag SET");
592 } 599 }
593 break; 600 break;
594 601
@@ -809,7 +816,7 @@ static void dwc3_ep0_complete_data(struct dwc3 *dwc,
809 816
810 trace_dwc3_complete_trb(ep0, trb); 817 trace_dwc3_complete_trb(ep0, trb);
811 818
812 r = next_request(&ep0->request_list); 819 r = next_request(&ep0->pending_list);
813 if (!r) 820 if (!r)
814 return; 821 return;
815 822
@@ -848,7 +855,7 @@ static void dwc3_ep0_complete_data(struct dwc3 *dwc,
848 trb++; 855 trb++;
849 length = trb->size & DWC3_TRB_SIZE_MASK; 856 length = trb->size & DWC3_TRB_SIZE_MASK;
850 857
851 ep0->free_slot = 0; 858 ep0->trb_enqueue = 0;
852 } 859 }
853 860
854 transfer_size = roundup((ur->length - transfer_size), 861 transfer_size = roundup((ur->length - transfer_size),
@@ -897,8 +904,8 @@ static void dwc3_ep0_complete_status(struct dwc3 *dwc,
897 904
898 trace_dwc3_complete_trb(dep, trb); 905 trace_dwc3_complete_trb(dep, trb);
899 906
900 if (!list_empty(&dep->request_list)) { 907 if (!list_empty(&dep->pending_list)) {
901 r = next_request(&dep->request_list); 908 r = next_request(&dep->pending_list);
902 909
903 dwc3_gadget_giveback(dep, r, 0); 910 dwc3_gadget_giveback(dep, r, 0);
904 } 911 }
@@ -1027,12 +1034,6 @@ static int dwc3_ep0_start_control_status(struct dwc3_ep *dep)
1027 1034
1028static void __dwc3_ep0_do_control_status(struct dwc3 *dwc, struct dwc3_ep *dep) 1035static void __dwc3_ep0_do_control_status(struct dwc3 *dwc, struct dwc3_ep *dep)
1029{ 1036{
1030 if (dwc->resize_fifos) {
1031 dwc3_trace(trace_dwc3_ep0, "Resizing FIFOs");
1032 dwc3_gadget_resize_tx_fifos(dwc);
1033 dwc->resize_fifos = 0;
1034 }
1035
1036 WARN_ON(dwc3_ep0_start_control_status(dep)); 1037 WARN_ON(dwc3_ep0_start_control_status(dep));
1037} 1038}
1038 1039