xhci controllers have two virtual ports per (usb3 capable) physical port, one for usb2 and one for usb3 devices. Add a hub portmap callback to map the virtual ports to physical ports. For now assume we simply have the same number of usb2 and usb3 ports.
Signed-off-by: Gerd Hoffmann kraxel@redhat.com --- src/hw/usb-xhci.c | 11 +++++++++++ 1 file changed, 11 insertions(+)
diff --git a/src/hw/usb-xhci.c b/src/hw/usb-xhci.c index 69954b9d8d..803822aece 100644 --- a/src/hw/usb-xhci.c +++ b/src/hw/usb-xhci.c @@ -374,6 +374,16 @@ xhci_hub_reset(struct usbhub_s *hub, u32 port) return rc; }
+static int +xhci_hub_portmap(struct usbhub_s *hub, u32 port) +{ + struct usb_xhci_s *xhci = container_of(hub->cntl, struct usb_xhci_s, usb); + + // we don't parse the extended capabilities, so we take a shortcut + // here and assumes we have the same number of usb2 and usb3 ports + return port % (xhci->ports/2) + 1; +} + static void xhci_hub_disconnect(struct usbhub_s *hub, u32 port) { @@ -383,6 +393,7 @@ xhci_hub_disconnect(struct usbhub_s *hub, u32 port) static struct usbhub_op_s xhci_hub_ops = { .detect = xhci_hub_detect, .reset = xhci_hub_reset, + .portmap = xhci_hub_portmap, .disconnect = xhci_hub_disconnect, };