|
@@ -1390,7 +1390,12 @@ static u32 xhci_get_max_esit_payload(struct usb_device *udev,
|
|
|
usb_endpoint_xfer_bulk(&ep->desc))
|
|
|
return 0;
|
|
|
|
|
|
- if (udev->speed >= USB_SPEED_SUPER)
|
|
|
+ /* SuperSpeedPlus Isoc ep sending over 48k per esit */
|
|
|
+ if ((udev->speed >= USB_SPEED_SUPER_PLUS) &&
|
|
|
+ USB_SS_SSP_ISOC_COMP(ep->ss_ep_comp.bmAttributes))
|
|
|
+ return le32_to_cpu(ep->ssp_isoc_ep_comp.dwBytesPerInterval);
|
|
|
+ /* SuperSpeed or SuperSpeedPlus Isoc ep with less than 48k per esit */
|
|
|
+ else if (udev->speed >= USB_SPEED_SUPER)
|
|
|
return le16_to_cpu(ep->ss_ep_comp.wBytesPerInterval);
|
|
|
|
|
|
max_packet = GET_MAX_PACKET(usb_endpoint_maxp(&ep->desc));
|
|
@@ -1470,9 +1475,13 @@ int xhci_endpoint_init(struct xhci_hcd *xhci,
|
|
|
/* xHCI 1.0 and 1.1 indicates that ctrl ep avg TRB Length should be 8 */
|
|
|
if (usb_endpoint_xfer_control(&ep->desc) && xhci->hci_version >= 0x100)
|
|
|
avg_trb_len = 8;
|
|
|
+ /* xhci 1.1 with LEC support doesn't use mult field, use RsvdZ */
|
|
|
+ if ((xhci->hci_version > 0x100) && HCC2_LEC(xhci->hcc_params2))
|
|
|
+ mult = 0;
|
|
|
|
|
|
/* Fill the endpoint context */
|
|
|
- ep_ctx->ep_info = cpu_to_le32(EP_INTERVAL(interval) |
|
|
|
+ ep_ctx->ep_info = cpu_to_le32(EP_MAX_ESIT_PAYLOAD_HI(max_esit_payload) |
|
|
|
+ EP_INTERVAL(interval) |
|
|
|
EP_MULT(mult));
|
|
|
ep_ctx->ep_info2 = cpu_to_le32(EP_TYPE(endpoint_type) |
|
|
|
MAX_PACKET(max_packet) |
|