Re: [PATCH 1/2] usb: xhci: Make it possible to not have a secondary HCD (3.0)

From: Nicolas Boichat
Date: Tue May 07 2019 - 21:19:27 EST


On Mon, May 6, 2019 at 10:19 PM Mathias Nyman
<mathias.nyman@xxxxxxxxxxxxxxx> wrote:
>
> On 2.5.2019 7.56, Nicolas Boichat wrote:
> > Some XHCI controllers may not have any USB 3.0 port, in this case, it
> > is not useful to create add hcd->shared_hcd, which has 2 main
> > downsides:
> > - A useless USB 3.0 root hub is created.
> > - A warning is thrown on boot:
> > hub 2-0:1.0: config failed, hub doesn't have any ports! (err -19)
> >
> > The change is mostly about checking if hcd->shared_hcd is NULL before
> > accessing it. The one special case is in xhci_run, where we need to
> > call xhci_run_finished immediately, if there is no secondary hcd.
>
> To me it looks like this creates an controller starting issue for
> xHC hardware that have both usb2 and usb3 ports.
>
> When we have usb3 ports xhci->shared_hcd is not set yet when xhci_run is called
> the first time. We will end up starting the xHC before properly setting up the secondary hcd.
>
> See further down for details

Thanks Mathias and Chunfeng, I need to test this on platforms that
actually support USB 3.0 (both PCI and MTK), as you both highlighted,
there might be issues.

I'll do that a spin a v2. It might take a while though (this is not a
very critical issue).


> >
> > Signed-off-by: Nicolas Boichat <drinkcat@xxxxxxxxxxxx>
> > ---
> >
> > This is a respin of https://lore.kernel.org/patchwork/patch/863993/,
> > hopefully addressing the comments there. Note that I dropped the change
> > in xhci-plat.c, as I do not have a device to test it, but made a
> > similar change in xhci-mtk.c, in the next patch.
> >
> > (the @apm.com addresses seem to bounce, so I added some
> > @amperecomputing.com instead, if somebody there can track back the
> > original issue, I'm happy to provide a patch for xhci-plat.c as well)
> >
> > drivers/usb/host/xhci-hub.c | 7 ++++--
> > drivers/usb/host/xhci.c | 45 +++++++++++++++++++++++++++----------
> > 2 files changed, 38 insertions(+), 14 deletions(-)
> >
>
> ...
>
> > @@ -698,6 +703,10 @@ int xhci_run(struct usb_hcd *hcd)
> >
> > xhci_debugfs_init(xhci);
> >
> > + /* There is no secondary HCD, start the host controller immediately. */
> > + if (!xhci->shared_hcd)
> > + return xhci_run_finished(xhci);
> > +
>
> PCI xHC controllers with both usb2 and usb3 ports will be started before usb3 parts are properly set up.
>
> xhci_pci_probe()
> usb_hcd_pci_probe()
> usb_add_hcd()
> hcd->driver->start(hcd) // .start = xhci_run
> xhci_run()
> if (!xhci->shared_hcd) // TRUE as xhci->shared_hcd is not yet set,
> return xhci_run_finished(xhci) // starting controller too early here
> xhci->shared_hcd = usb_create_shared_hcd() // now xhci->shared_hcd is set.
>
> -Mathias