Re: [RFC PATCH] USB:XHCI:Modify XHCI driver for USB2.0 controller
From: Mathias Nyman <hidden>
Date: 2021-02-26 09:24:40
Also in:
lkml
On 26.2.2021 10.21, Longfang Liu wrote:
Our current XHCI hardware controller has been customized to only support USB 2.0 ports. When using the current xhci driver, an xhci controller device and an ehci controller device will be created automatically. We want the driver to create only one ehci controller. After modifying the driver as follows, an error will occur. Is there any other modification method?
The xhci driver relies on the existence of both a main and a shared hcd. One hcd for handing USB 2 (and slower) and the other for USB 3 devices. As one example xhci_run(hcd) needs to be called for both hcds, first call sets up things, second one calls xhci_start() that makes the controller run. It's probably possible to modify the driver to support xHCI hosts with only USB 2 ports, but requires a lot more work.
quoted hunk ↗ jump to hunk
Signed-off-by: Longfang Liu <liulongfang@huawei.com> --- drivers/usb/host/xhci-pci.c | 15 ++------------- 1 file changed, 2 insertions(+), 13 deletions(-)diff --git a/drivers/usb/host/xhci-pci.c b/drivers/usb/host/xhci-pci.c index ef513c2..7296aad 100644 --- a/drivers/usb/host/xhci-pci.c +++ b/drivers/usb/host/xhci-pci.c@@ -364,26 +364,15 @@ static int xhci_pci_probe(struct pci_dev *dev, const struct pci_device_id *id) /* USB 2.0 roothub is stored in the PCI device now. */ hcd = dev_get_drvdata(&dev->dev); xhci = hcd_to_xhci(hcd); - xhci->shared_hcd = usb_create_shared_hcd(&xhci_pci_hc_driver, &dev->dev, - pci_name(dev), hcd); - if (!xhci->shared_hcd) { - retval = -ENOMEM; - goto dealloc_usb2_hcd; - } - + xhci->shared_hcd = NULL; retval = xhci_ext_cap_init(xhci); if (retval) goto put_usb3_hcd; - retval = usb_add_hcd(xhci->shared_hcd, dev->irq, + retval = usb_add_hcd(xhci->main_hcd, dev->irq, IRQF_SHARED); if (retval) goto put_usb3_hcd; - /* Roothub already marked as USB 3.0 speed */ - - if (!(xhci->quirks & XHCI_BROKEN_STREAMS) && - HCC_MAX_PSA(xhci->hcc_params) >= 4) - xhci->shared_hcd->can_do_streams = 1; /* USB-2 and USB-3 roothubs initialized, allow runtime pm suspend */ pm_runtime_put_noidle(&dev->dev);
Something like the above could of course not be accepted upstream. We can't break existing functionality to support one modified xHCI. Thanks Mathias