|
@@ -1022,44 +1022,24 @@ void xhci_copy_ep0_dequeue_into_input_ctx(struct xhci_hcd *xhci,
|
|
|
* is attached to (or the roothub port its ancestor hub is attached to). All we
|
|
|
* know is the index of that port under either the USB 2.0 or the USB 3.0
|
|
|
* roothub, but that doesn't give us the real index into the HW port status
|
|
|
- * registers. Scan through the xHCI roothub port array, looking for the Nth
|
|
|
- * entry of the correct port speed. Return the port number of that entry.
|
|
|
+ * registers. Call xhci_find_raw_port_number() to get real index.
|
|
|
*/
|
|
|
static u32 xhci_find_real_port_number(struct xhci_hcd *xhci,
|
|
|
struct usb_device *udev)
|
|
|
{
|
|
|
struct usb_device *top_dev;
|
|
|
- unsigned int num_similar_speed_ports;
|
|
|
- unsigned int faked_port_num;
|
|
|
- int i;
|
|
|
+ struct usb_hcd *hcd;
|
|
|
+
|
|
|
+ if (udev->speed == USB_SPEED_SUPER)
|
|
|
+ hcd = xhci->shared_hcd;
|
|
|
+ else
|
|
|
+ hcd = xhci->main_hcd;
|
|
|
|
|
|
for (top_dev = udev; top_dev->parent && top_dev->parent->parent;
|
|
|
top_dev = top_dev->parent)
|
|
|
/* Found device below root hub */;
|
|
|
- faked_port_num = top_dev->portnum;
|
|
|
- for (i = 0, num_similar_speed_ports = 0;
|
|
|
- i < HCS_MAX_PORTS(xhci->hcs_params1); i++) {
|
|
|
- u8 port_speed = xhci->port_array[i];
|
|
|
-
|
|
|
- /*
|
|
|
- * Skip ports that don't have known speeds, or have duplicate
|
|
|
- * Extended Capabilities port speed entries.
|
|
|
- */
|
|
|
- if (port_speed == 0 || port_speed == DUPLICATE_ENTRY)
|
|
|
- continue;
|
|
|
|
|
|
- /*
|
|
|
- * USB 3.0 ports are always under a USB 3.0 hub. USB 2.0 and
|
|
|
- * 1.1 ports are under the USB 2.0 hub. If the port speed
|
|
|
- * matches the device speed, it's a similar speed port.
|
|
|
- */
|
|
|
- if ((port_speed == 0x03) == (udev->speed == USB_SPEED_SUPER))
|
|
|
- num_similar_speed_ports++;
|
|
|
- if (num_similar_speed_ports == faked_port_num)
|
|
|
- /* Roothub ports are numbered from 1 to N */
|
|
|
- return i+1;
|
|
|
- }
|
|
|
- return 0;
|
|
|
+ return xhci_find_raw_port_number(hcd, top_dev->portnum);
|
|
|
}
|
|
|
|
|
|
/* Setup an xHCI virtual device for a Set Address command */
|