On Mon, 7 Mar 2011, Sarah Sharp wrote: > This patch changes the xHCI driver to allocate two roothubs. This touches > the driver initialization and shutdown paths, roothub emulation code, and > port status change event handlers. This is a rather large patch, but it > can't be broken up, or it would break git-bisect. > > Make the xHCI driver register its own PCI probe function. This will call > the USB core to create the USB 2.0 roothub, and then create the USB 3.0 > roothub. This gets the code for registering a shared roothub out of the > USB core, and allows other HCDs later to decide if and how many shared > roothubs they want to allocate. > > Make sure the USB core marks the xHCI host controller's primary roothub as > the USB 2.0 roothub. This ensures that the high speed bus will be > processed first when the PCI device is resumed, and any USB 3.0 devices > that have migrated over to high speed will migrate back after being reset. > This ensures that USB persist works with these odd devices. > > Mark the xHCI USB2 roothub as having an integrated TT. Like EHCI host > controllers with a "rate matching hub" the xHCI USB 2.0 roothub doesn't > have an OHCI or UHCI companion controller. It doesn't really have a TT, > but we'll lie and say it has an integrated TT. We need to do this > because the USB core will reject LS/FS devices under a HS hub without a > TT. We probably should rename the variable from has_tt to something like handles_fs_ls, since the concept it describes is more general than having an integrated TT. ... > diff --git a/drivers/usb/core/hcd-pci.c b/drivers/usb/core/hcd-pci.c > index 2707971..20612ca 100644 > --- a/drivers/usb/core/hcd-pci.c > +++ b/drivers/usb/core/hcd-pci.c > @@ -200,6 +200,18 @@ int usb_hcd_pci_probe(struct pci_dev *dev, const struct pci_device_id *id) > retval = -ENOMEM; > goto disable_pci; > } > + if ((driver->flags & HCD_MASK) == HCD_USB3) { > + /* Mark the first roothub as being USB 2.0. > + * The xHCI driver will register the USB 3.0 roothub. > + */ > + hcd->speed = HCD_USB2; > + /* > + * USB 2.0 roothub under xHCI has an integrated TT, > + * (rate matching hub) as opposed to having an OHCI/UHCI > + * companion controller. > + */ > + hcd->has_tt = 1; > + } The hcd->has_tt part can be moved into xhci-hcd. It would be nice to move the hcd->speed part as well (this strong coupling between hcd-pci and xhci-hcd is undesirable), but that would cause the root hub to be registered while it is still marked with the wrong speed. > diff --git a/drivers/usb/host/xhci-hub.c b/drivers/usb/host/xhci-hub.c > index 3ec5ae2..32afad5 100644 > --- a/drivers/usb/host/xhci-hub.c > +++ b/drivers/usb/host/xhci-hub.c > @@ -28,13 +28,20 @@ > #define PORT_RWC_BITS (PORT_CSC | PORT_PEC | PORT_WRC | PORT_OCC | \ > PORT_RC | PORT_PLC | PORT_PE) > > -static void xhci_hub_descriptor(struct xhci_hcd *xhci, > +static void xhci_hub_descriptor(struct usb_hcd *hcd, struct xhci_hcd *xhci, > struct usb_hub_descriptor *desc) > { > int ports; > u16 temp; > > - ports = HCS_MAX_PORTS(xhci->hcs_params1); > + if (hcd->bcdUSB == HCD_USB3) Isn't this supposed to be hcd->speed now? Alan Stern -- To unsubscribe from this list: send the line "unsubscribe linux-usb" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html