diff options
Diffstat (limited to 'drivers/usb/dwc3/gadget.c')
-rw-r--r-- | drivers/usb/dwc3/gadget.c | 34 |
1 files changed, 30 insertions, 4 deletions
diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c index 524ff91bf39..8d8502373db 100644 --- a/drivers/usb/dwc3/gadget.c +++ b/drivers/usb/dwc3/gadget.c | |||
@@ -264,6 +264,12 @@ static int dwc3_gadget_set_ep_config(struct dwc3 *dwc, struct dwc3_ep *dep, | |||
264 | params.param1.depcfg.xfer_complete_enable = true; | 264 | params.param1.depcfg.xfer_complete_enable = true; |
265 | params.param1.depcfg.xfer_not_ready_enable = true; | 265 | params.param1.depcfg.xfer_not_ready_enable = true; |
266 | 266 | ||
267 | if (usb_endpoint_xfer_bulk(desc) && dep->endpoint.max_streams) { | ||
268 | params.param1.depcfg.stream_capable = true; | ||
269 | params.param1.depcfg.stream_event_enable = true; | ||
270 | dep->stream_capable = true; | ||
271 | } | ||
272 | |||
267 | if (usb_endpoint_xfer_isoc(desc)) | 273 | if (usb_endpoint_xfer_isoc(desc)) |
268 | params.param1.depcfg.xfer_in_progress_enable = true; | 274 | params.param1.depcfg.xfer_in_progress_enable = true; |
269 | 275 | ||
@@ -391,15 +397,16 @@ static int __dwc3_gadget_ep_disable(struct dwc3_ep *dep) | |||
391 | struct dwc3 *dwc = dep->dwc; | 397 | struct dwc3 *dwc = dep->dwc; |
392 | u32 reg; | 398 | u32 reg; |
393 | 399 | ||
394 | dep->flags &= ~DWC3_EP_ENABLED; | ||
395 | dwc3_remove_requests(dwc, dep); | 400 | dwc3_remove_requests(dwc, dep); |
396 | 401 | ||
397 | reg = dwc3_readl(dwc->regs, DWC3_DALEPENA); | 402 | reg = dwc3_readl(dwc->regs, DWC3_DALEPENA); |
398 | reg &= ~DWC3_DALEPENA_EP(dep->number); | 403 | reg &= ~DWC3_DALEPENA_EP(dep->number); |
399 | dwc3_writel(dwc->regs, DWC3_DALEPENA, reg); | 404 | dwc3_writel(dwc->regs, DWC3_DALEPENA, reg); |
400 | 405 | ||
406 | dep->stream_capable = false; | ||
401 | dep->desc = NULL; | 407 | dep->desc = NULL; |
402 | dep->type = 0; | 408 | dep->type = 0; |
409 | dep->flags = 0; | ||
403 | 410 | ||
404 | return 0; | 411 | return 0; |
405 | } | 412 | } |
@@ -633,6 +640,9 @@ static struct dwc3_request *dwc3_prepare_trbs(struct dwc3_ep *dep, | |||
633 | trb.lst = last_one; | 640 | trb.lst = last_one; |
634 | } | 641 | } |
635 | 642 | ||
643 | if (usb_endpoint_xfer_bulk(dep->desc) && dep->stream_capable) | ||
644 | trb.sid_sofn = req->request.stream_id; | ||
645 | |||
636 | switch (usb_endpoint_type(dep->desc)) { | 646 | switch (usb_endpoint_type(dep->desc)) { |
637 | case USB_ENDPOINT_XFER_CONTROL: | 647 | case USB_ENDPOINT_XFER_CONTROL: |
638 | trb.trbctl = DWC3_TRBCTL_CONTROL_SETUP; | 648 | trb.trbctl = DWC3_TRBCTL_CONTROL_SETUP; |
@@ -1505,12 +1515,28 @@ static void dwc3_endpoint_interrupt(struct dwc3 *dwc, | |||
1505 | } | 1515 | } |
1506 | 1516 | ||
1507 | break; | 1517 | break; |
1518 | case DWC3_DEPEVT_STREAMEVT: | ||
1519 | if (!usb_endpoint_xfer_bulk(dep->desc)) { | ||
1520 | dev_err(dwc->dev, "Stream event for non-Bulk %s\n", | ||
1521 | dep->name); | ||
1522 | return; | ||
1523 | } | ||
1524 | |||
1525 | switch (event->status) { | ||
1526 | case DEPEVT_STREAMEVT_FOUND: | ||
1527 | dev_vdbg(dwc->dev, "Stream %d found and started\n", | ||
1528 | event->parameters); | ||
1529 | |||
1530 | break; | ||
1531 | case DEPEVT_STREAMEVT_NOTFOUND: | ||
1532 | /* FALLTHROUGH */ | ||
1533 | default: | ||
1534 | dev_dbg(dwc->dev, "Couldn't find suitable stream\n"); | ||
1535 | } | ||
1536 | break; | ||
1508 | case DWC3_DEPEVT_RXTXFIFOEVT: | 1537 | case DWC3_DEPEVT_RXTXFIFOEVT: |
1509 | dev_dbg(dwc->dev, "%s FIFO Overrun\n", dep->name); | 1538 | dev_dbg(dwc->dev, "%s FIFO Overrun\n", dep->name); |
1510 | break; | 1539 | break; |
1511 | case DWC3_DEPEVT_STREAMEVT: | ||
1512 | dev_dbg(dwc->dev, "%s Stream Event\n", dep->name); | ||
1513 | break; | ||
1514 | case DWC3_DEPEVT_EPCMDCMPLT: | 1540 | case DWC3_DEPEVT_EPCMDCMPLT: |
1515 | dwc3_ep_cmd_compl(dep, event); | 1541 | dwc3_ep_cmd_compl(dep, event); |
1516 | break; | 1542 | break; |