From: Greg Kroah-Hartman Date: Mon, 5 Sep 2016 11:28:18 +0000 (+0200) Subject: 4.4-stable patches X-Git-Tag: v3.14.78~8 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=dbda80922e3a78fae0acb7879f3404e3ff74a86c;p=thirdparty%2Fkernel%2Fstable-queue.git 4.4-stable patches added patches: xhci-make-sure-xhci-handles-usb_speed_super_plus-devices.patch --- diff --git a/queue-4.4/series b/queue-4.4/series index d33e70824af..2da38abe034 100644 --- a/queue-4.4/series +++ b/queue-4.4/series @@ -50,3 +50,4 @@ usb-serial-option-add-d-link-dwm-156-a3.patch usb-serial-option-add-support-for-telit-le920a4.patch usb-serial-ftdi_sio-add-device-id-for-wiced-usb-uart-dev-board.patch usb-serial-ftdi_sio-add-pids-for-ivium-technologies-devices.patch +xhci-make-sure-xhci-handles-usb_speed_super_plus-devices.patch diff --git a/queue-4.4/xhci-make-sure-xhci-handles-usb_speed_super_plus-devices.patch b/queue-4.4/xhci-make-sure-xhci-handles-usb_speed_super_plus-devices.patch new file mode 100644 index 00000000000..c07e162a2ad --- /dev/null +++ b/queue-4.4/xhci-make-sure-xhci-handles-usb_speed_super_plus-devices.patch @@ -0,0 +1,137 @@ +From 0caf6b33452112e5a1186c8c964e90310e49e6bd Mon Sep 17 00:00:00 2001 +From: Mathias Nyman +Date: Mon, 25 Jan 2016 15:30:44 +0200 +Subject: xhci: Make sure xhci handles USB_SPEED_SUPER_PLUS devices. + +From: Mathias Nyman + +commit 0caf6b33452112e5a1186c8c964e90310e49e6bd upstream. + +In most cases the devices with the speed set to USB_SPEED_SUPER_PLUS +are handled like regular SuperSpeed devices. + +Signed-off-by: Mathias Nyman +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/usb/host/xhci-mem.c | 9 ++++++--- + drivers/usb/host/xhci-ring.c | 3 ++- + drivers/usb/host/xhci.c | 7 +++++-- + 3 files changed, 13 insertions(+), 6 deletions(-) + +--- a/drivers/usb/host/xhci-mem.c ++++ b/drivers/usb/host/xhci-mem.c +@@ -1072,7 +1072,7 @@ static u32 xhci_find_real_port_number(st + struct usb_device *top_dev; + struct usb_hcd *hcd; + +- if (udev->speed == USB_SPEED_SUPER) ++ if (udev->speed >= USB_SPEED_SUPER) + hcd = xhci->shared_hcd; + else + hcd = xhci->main_hcd; +@@ -1107,6 +1107,7 @@ int xhci_setup_addressable_virt_dev(stru + /* 3) Only the control endpoint is valid - one endpoint context */ + slot_ctx->dev_info |= cpu_to_le32(LAST_CTX(1) | udev->route); + switch (udev->speed) { ++ case USB_SPEED_SUPER_PLUS: + case USB_SPEED_SUPER: + slot_ctx->dev_info |= cpu_to_le32(SLOT_SPEED_SS); + max_packets = MAX_PACKET(512); +@@ -1294,6 +1295,7 @@ static unsigned int xhci_get_endpoint_in + } + /* Fall through - SS and HS isoc/int have same decoding */ + ++ case USB_SPEED_SUPER_PLUS: + case USB_SPEED_SUPER: + if (usb_endpoint_xfer_int(&ep->desc) || + usb_endpoint_xfer_isoc(&ep->desc)) { +@@ -1334,7 +1336,7 @@ static unsigned int xhci_get_endpoint_in + static u32 xhci_get_endpoint_mult(struct usb_device *udev, + struct usb_host_endpoint *ep) + { +- if (udev->speed != USB_SPEED_SUPER || ++ if (udev->speed < USB_SPEED_SUPER || + !usb_endpoint_xfer_isoc(&ep->desc)) + return 0; + return ep->ss_ep_comp.bmAttributes; +@@ -1384,7 +1386,7 @@ static u32 xhci_get_max_esit_payload(str + usb_endpoint_xfer_bulk(&ep->desc)) + return 0; + +- if (udev->speed == USB_SPEED_SUPER) ++ 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)); +@@ -1455,6 +1457,7 @@ int xhci_endpoint_init(struct xhci_hcd * + max_packet = GET_MAX_PACKET(usb_endpoint_maxp(&ep->desc)); + max_burst = 0; + switch (udev->speed) { ++ case USB_SPEED_SUPER_PLUS: + case USB_SPEED_SUPER: + /* dig out max burst from ep companion desc */ + max_burst = ep->ss_ep_comp.bMaxBurst; +--- a/drivers/usb/host/xhci-ring.c ++++ b/drivers/usb/host/xhci-ring.c +@@ -3576,7 +3576,7 @@ static unsigned int xhci_get_burst_count + { + unsigned int max_burst; + +- if (xhci->hci_version < 0x100 || udev->speed != USB_SPEED_SUPER) ++ if (xhci->hci_version < 0x100 || udev->speed < USB_SPEED_SUPER) + return 0; + + max_burst = urb->ep->ss_ep_comp.bMaxBurst; +@@ -3602,6 +3602,7 @@ static unsigned int xhci_get_last_burst_ + return 0; + + switch (udev->speed) { ++ case USB_SPEED_SUPER_PLUS: + case USB_SPEED_SUPER: + /* bMaxBurst is zero based: 0 means 1 packet per burst */ + max_burst = urb->ep->ss_ep_comp.bMaxBurst; +--- a/drivers/usb/host/xhci.c ++++ b/drivers/usb/host/xhci.c +@@ -2073,6 +2073,7 @@ static unsigned int xhci_get_block_size( + case USB_SPEED_HIGH: + return HS_BLOCK; + case USB_SPEED_SUPER: ++ case USB_SPEED_SUPER_PLUS: + return SS_BLOCK; + case USB_SPEED_UNKNOWN: + case USB_SPEED_WIRELESS: +@@ -2198,7 +2199,7 @@ static int xhci_check_bw_table(struct xh + unsigned int packets_remaining = 0; + unsigned int i; + +- if (virt_dev->udev->speed == USB_SPEED_SUPER) ++ if (virt_dev->udev->speed >= USB_SPEED_SUPER) + return xhci_check_ss_bw(xhci, virt_dev); + + if (virt_dev->udev->speed == USB_SPEED_HIGH) { +@@ -2399,7 +2400,7 @@ void xhci_drop_ep_from_interval_table(st + if (xhci_is_async_ep(ep_bw->type)) + return; + +- if (udev->speed == USB_SPEED_SUPER) { ++ if (udev->speed >= USB_SPEED_SUPER) { + if (xhci_is_sync_in_ep(ep_bw->type)) + xhci->devs[udev->slot_id]->bw_table->ss_bw_in -= + xhci_get_ss_bw_consumed(ep_bw); +@@ -2437,6 +2438,7 @@ void xhci_drop_ep_from_interval_table(st + interval_bw->overhead[HS_OVERHEAD_TYPE] -= 1; + break; + case USB_SPEED_SUPER: ++ case USB_SPEED_SUPER_PLUS: + case USB_SPEED_UNKNOWN: + case USB_SPEED_WIRELESS: + /* Should never happen because only LS/FS/HS endpoints will get +@@ -2496,6 +2498,7 @@ static void xhci_add_ep_to_interval_tabl + interval_bw->overhead[HS_OVERHEAD_TYPE] += 1; + break; + case USB_SPEED_SUPER: ++ case USB_SPEED_SUPER_PLUS: + case USB_SPEED_UNKNOWN: + case USB_SPEED_WIRELESS: + /* Should never happen because only LS/FS/HS endpoints will get