diff options
Diffstat (limited to 'drivers/usb/dwc3/ep0.c')
| -rw-r--r-- | drivers/usb/dwc3/ep0.c | 12 |
1 files changed, 10 insertions, 2 deletions
diff --git a/drivers/usb/dwc3/ep0.c b/drivers/usb/dwc3/ep0.c index 25910e251c04..3584a169886f 100644 --- a/drivers/usb/dwc3/ep0.c +++ b/drivers/usb/dwc3/ep0.c | |||
| @@ -353,6 +353,9 @@ static int dwc3_ep0_handle_feature(struct dwc3 *dwc, | |||
| 353 | 353 | ||
| 354 | dwc->test_mode_nr = wIndex >> 8; | 354 | dwc->test_mode_nr = wIndex >> 8; |
| 355 | dwc->test_mode = true; | 355 | dwc->test_mode = true; |
| 356 | break; | ||
| 357 | default: | ||
| 358 | return -EINVAL; | ||
| 356 | } | 359 | } |
| 357 | break; | 360 | break; |
| 358 | 361 | ||
| @@ -559,15 +562,20 @@ static void dwc3_ep0_complete_data(struct dwc3 *dwc, | |||
| 559 | length = trb->size & DWC3_TRB_SIZE_MASK; | 562 | length = trb->size & DWC3_TRB_SIZE_MASK; |
| 560 | 563 | ||
| 561 | if (dwc->ep0_bounced) { | 564 | if (dwc->ep0_bounced) { |
| 565 | unsigned transfer_size = ur->length; | ||
| 566 | unsigned maxp = ep0->endpoint.maxpacket; | ||
| 567 | |||
| 568 | transfer_size += (maxp - (transfer_size % maxp)); | ||
| 562 | transferred = min_t(u32, ur->length, | 569 | transferred = min_t(u32, ur->length, |
| 563 | ep0->endpoint.maxpacket - length); | 570 | transfer_size - length); |
| 564 | memcpy(ur->buf, dwc->ep0_bounce, transferred); | 571 | memcpy(ur->buf, dwc->ep0_bounce, transferred); |
| 565 | dwc->ep0_bounced = false; | 572 | dwc->ep0_bounced = false; |
| 566 | } else { | 573 | } else { |
| 567 | transferred = ur->length - length; | 574 | transferred = ur->length - length; |
| 568 | ur->actual += transferred; | ||
| 569 | } | 575 | } |
| 570 | 576 | ||
| 577 | ur->actual += transferred; | ||
| 578 | |||
| 571 | if ((epnum & 1) && ur->actual < ur->length) { | 579 | if ((epnum & 1) && ur->actual < ur->length) { |
| 572 | /* for some reason we did not get everything out */ | 580 | /* for some reason we did not get everything out */ |
| 573 | 581 | ||
