[<prev] [next>] [<thread-prev] [day] [month] [year] [list]
Message-ID: <CAHN5xi2qy666O_SBkGb2SadRyPFPaxsk5HFH01bgSZTy05R6Sw@mail.gmail.com>
Date: Sun, 23 Jun 2024 12:39:10 +0800
From: Kuangyi Chiang <ki.chiang65@...il.com>
To: Greg KH <gregkh@...uxfoundation.org>
Cc: mathias.nyman@...el.com, linux-usb@...r.kernel.org,
linux-kernel@...r.kernel.org, stable@...r.kernel.org
Subject: Re: [PATCH v2] xhci: Don't issue Reset Device command to Etron xHCI host
Hi Greg,
Greg KH <gregkh@...uxfoundation.org> 於 2024年6月19日 週三 下午2:15寫道:
>
> On Wed, Jun 19, 2024 at 01:48:08PM +0800, Kuangyi Chiang wrote:
> > Sometimes the hub driver does not recognize the USB device connected
> > to the external USB2.0 hub when the system resumes from S4.
> >
> > This happens when the xHCI driver issue the Reset Device command to
> > inform the Etron xHCI host that the USB device has been reset.
> >
> > Seems that the Etron xHCI host can not perform this command correctly,
> > affecting the USB device.
> >
> > Instead, to avoid this, disabling slot ID and then enabling slot ID
> > is a workable solution to replace the Reset Device command.
> >
> > An easy way to issue these commands in sequence is to call
> > xhci_free_dev() and then xhci_alloc_dev().
> >
> > Applying this patch then the issue is gone.
> >
> > Cc: <stable@...r.kernel.org>
> > Signed-off-by: Kuangyi Chiang <ki.chiang65@...il.com>
>
> What commit id does this fix?
Fixes: 2a8f82c4ceaf ("USB: xhci: Notify the xHC when a device is reset.")
However, this patch is a workaround for Etron xHCI hosts, should I add this
in the commit message?
>
> > ---
> > Changes in v2:
> > - Change commit log
> > - Add a comment for the workaround
> > - Revert "global xhci_free_dev()"
> > - Remove XHCI_ETRON_HOST quirk bit
> >
> > drivers/usb/host/xhci.c | 16 ++++++++++++++++
> > 1 file changed, 16 insertions(+)
> >
> > diff --git a/drivers/usb/host/xhci.c b/drivers/usb/host/xhci.c
> > index 37eb37b0affa..c892750a89c5 100644
> > --- a/drivers/usb/host/xhci.c
> > +++ b/drivers/usb/host/xhci.c
> > @@ -3682,6 +3682,8 @@ void xhci_free_device_endpoint_resources(struct xhci_hcd *xhci,
> > xhci->num_active_eps);
> > }
> >
> > +static void xhci_free_dev(struct usb_hcd *hcd, struct usb_device *udev);
> > +
> > /*
> > * This submits a Reset Device Command, which will set the device state to 0,
> > * set the device address to 0, and disable all the endpoints except the default
> > @@ -3752,6 +3754,20 @@ static int xhci_discover_or_reset_device(struct usb_hcd *hcd,
> > SLOT_STATE_DISABLED)
> > return 0;
> >
> > + if (dev_is_pci(hcd->self.controller) &&
> > + to_pci_dev(hcd->self.controller)->vendor == 0x1b6f) {
>
> Odd indentation :(
Oops, one tab is missing, right? I will modify it.
>
> Also, that's a specific value, shouldn't it be in a #define somewhere?
OK, I will add a #define near xhci_discover_or_reset_device() in the same file.
>
> > + /*
> > + * Disabling and then enabling device slot ID to inform xHCI
> > + * host that the USB device has been reset.
> > + */
> > + xhci_free_dev(hcd, udev);
> > + ret = xhci_alloc_dev(hcd, udev);
>
> You are relying on the behavior of free/alloc here to disable/enable the
> slot id, why not just do that instead? What happens if the free/alloc
> call stops doing that? This feels very fragile to me.
>
These functions are helpers that can be used to enable/disable the slot id
and allocate/free associated data structures, I think they should be
called, right?
Or you would like to call xhci_disable_slot() + xhci_alloc_dev(), as in commit
651aaf36a7d7 ("usb: xhci: Handle USB transaction error on address command").
If so, I will modify it and resend this patch.
> > + if (ret == 1)
> > + return 0;
> > + else
> > + return -EINVAL;
>
> Why -EINVAL? What value was wrong?
I followed commit f0615c45ce5f ("USB: xHCI: change xhci_reset_device()
to allocate new device") to return -EINVAL, I think it means running out of
device slots.
>
> thanks,
>
> greg k-h
Thanks,
Kuangyi Chiang
Powered by blists - more mailing lists