diff options
Diffstat (limited to 'drivers/usb/dwc3/ep0.c')
| -rw-r--r-- | drivers/usb/dwc3/ep0.c | 43 |
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 | ||
| 1028 | static void __dwc3_ep0_do_control_status(struct dwc3 *dwc, struct dwc3_ep *dep) | 1035 | static 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 | ||
