diff options
| -rw-r--r-- | drivers/usb/chipidea/udc.c | 19 |
1 files changed, 17 insertions, 2 deletions
diff --git a/drivers/usb/chipidea/udc.c b/drivers/usb/chipidea/udc.c index 73a39ef93ec5..80de2f88ed2c 100644 --- a/drivers/usb/chipidea/udc.c +++ b/drivers/usb/chipidea/udc.c | |||
| @@ -393,6 +393,14 @@ static int add_td_to_list(struct ci_hw_ep *hwep, struct ci_hw_req *hwreq, | |||
| 393 | node->ptr->token = cpu_to_le32(length << __ffs(TD_TOTAL_BYTES)); | 393 | node->ptr->token = cpu_to_le32(length << __ffs(TD_TOTAL_BYTES)); |
| 394 | node->ptr->token &= cpu_to_le32(TD_TOTAL_BYTES); | 394 | node->ptr->token &= cpu_to_le32(TD_TOTAL_BYTES); |
| 395 | node->ptr->token |= cpu_to_le32(TD_STATUS_ACTIVE); | 395 | node->ptr->token |= cpu_to_le32(TD_STATUS_ACTIVE); |
| 396 | if (hwep->type == USB_ENDPOINT_XFER_ISOC && hwep->dir == TX) { | ||
| 397 | u32 mul = hwreq->req.length / hwep->ep.maxpacket; | ||
| 398 | |||
| 399 | if (hwreq->req.length == 0 | ||
| 400 | || hwreq->req.length % hwep->ep.maxpacket) | ||
| 401 | mul++; | ||
| 402 | node->ptr->token |= mul << __ffs(TD_MULTO); | ||
| 403 | } | ||
| 396 | 404 | ||
| 397 | temp = (u32) (hwreq->req.dma + hwreq->req.actual); | 405 | temp = (u32) (hwreq->req.dma + hwreq->req.actual); |
| 398 | if (length) { | 406 | if (length) { |
| @@ -515,10 +523,11 @@ static int _hardware_enqueue(struct ci_hw_ep *hwep, struct ci_hw_req *hwreq) | |||
| 515 | hwep->qh.ptr->td.token &= | 523 | hwep->qh.ptr->td.token &= |
| 516 | cpu_to_le32(~(TD_STATUS_HALTED|TD_STATUS_ACTIVE)); | 524 | cpu_to_le32(~(TD_STATUS_HALTED|TD_STATUS_ACTIVE)); |
| 517 | 525 | ||
| 518 | if (hwep->type == USB_ENDPOINT_XFER_ISOC) { | 526 | if (hwep->type == USB_ENDPOINT_XFER_ISOC && hwep->dir == RX) { |
| 519 | u32 mul = hwreq->req.length / hwep->ep.maxpacket; | 527 | u32 mul = hwreq->req.length / hwep->ep.maxpacket; |
| 520 | 528 | ||
| 521 | if (hwreq->req.length % hwep->ep.maxpacket) | 529 | if (hwreq->req.length == 0 |
| 530 | || hwreq->req.length % hwep->ep.maxpacket) | ||
| 522 | mul++; | 531 | mul++; |
| 523 | hwep->qh.ptr->cap |= mul << __ffs(QH_MULT); | 532 | hwep->qh.ptr->cap |= mul << __ffs(QH_MULT); |
| 524 | } | 533 | } |
| @@ -1173,6 +1182,12 @@ static int ep_enable(struct usb_ep *ep, | |||
| 1173 | if (hwep->num) | 1182 | if (hwep->num) |
| 1174 | cap |= QH_ZLT; | 1183 | cap |= QH_ZLT; |
| 1175 | cap |= (hwep->ep.maxpacket << __ffs(QH_MAX_PKT)) & QH_MAX_PKT; | 1184 | cap |= (hwep->ep.maxpacket << __ffs(QH_MAX_PKT)) & QH_MAX_PKT; |
| 1185 | /* | ||
| 1186 | * For ISO-TX, we set mult at QH as the largest value, and use | ||
| 1187 | * MultO at TD as real mult value. | ||
| 1188 | */ | ||
| 1189 | if (hwep->type == USB_ENDPOINT_XFER_ISOC && hwep->dir == TX) | ||
| 1190 | cap |= 3 << __ffs(QH_MULT); | ||
| 1176 | 1191 | ||
| 1177 | hwep->qh.ptr->cap = cpu_to_le32(cap); | 1192 | hwep->qh.ptr->cap = cpu_to_le32(cap); |
| 1178 | 1193 | ||
