Patch "xhci: Make sure xhci handles USB_SPEED_SUPER_PLUS devices." has been added to the 4.4-stable tree
Subsystems (3)
This is a note to let you know that I've just added the patch titled
xhci: Make sure xhci handles USB_SPEED_SUPER_PLUS devices.
to the 4.4-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
xhci-make-sure-xhci-handles-usb_speed_super_plus-devices.patch
and it can be found in the queue-4.4 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
0caf6b33452112e5a1186c8c964e90310e49e6bdMon Sep 17 00:00:00 2001
From: Mathias Nyman <[email protected]>
Date: Mon, 25 Jan 2016 15:30:44 +0200
Subject: xhci: Make sure xhci handles USB_SPEED_SUPER_PLUS devices.
From: Mathias Nyman <[email protected]>
commit 0caf6b33452112e5a1186c8c964e90310e49e6bd upstream.
In most cases the devices with the speed set to USB_SPEED_SUPER_PLUS are handled like regular SuperSpeed devices.
--- 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(-)
drivers/usb/host/xhci-mem.c +6 -3
@@ -1072,7 +1072,7 @@ static u32 xhci_find_real_port_number(ststruct 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_instatic 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;
drivers/usb/host/xhci-ring.c +2 -1
@@ -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;
drivers/usb/host/xhci.c +5 -2
@@ -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 xhunsigned 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(stif (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
Patches currently in stable-queue which might be from [email protected] are
queue-4.4/xhci-make-sure-xhci-handles-usb_speed_super_plus-devices.patch queue-4.4/xhci-don-t-dereference-a-xhci-member-after-removing-xhci.patch queue-4.4/usb-xhci-fix-panic-if-disconnect.patch queue-4.4/usb-define-usb_speed_super_plus-speed-for-superspeedplus-usb3.1-devices.patch queue-4.4/xhci-always-handle-command-ring-stopped-events.patch