diff mbox series

[2/2] usb: xhci: add check_init_status hook support

Message ID 20220816083854.1491886-3-raychi@google.com (mailing list archive)
State New, archived
Headers show
Series Provide a hook to check port init status | expand

Commit Message

Ray Chi Aug. 16, 2022, 8:38 a.m. UTC
In general, xHCI didn't do anything for port initialization. However,
there are some requirement or limitation on various platforms, so
vendors need to do some error handlings if the device connected to a
broken USB accessory.

This patch also add the hook to xhci_driver_overrides so that vendors
can add their specific protection easily if needed.

Signed-off-by: Ray Chi <raychi@google.com>
---
 drivers/usb/host/xhci.c | 17 +++++++++++++++++
 drivers/usb/host/xhci.h |  1 +
 2 files changed, 18 insertions(+)

Comments

Ray Chi Aug. 22, 2022, 3:42 p.m. UTC | #1
On Tue, Aug 16, 2022 at 4:57 PM Greg KH <gregkh@linuxfoundation.org> wrote:
>
> On Tue, Aug 16, 2022 at 04:38:54PM +0800, Ray Chi wrote:
> > In general, xHCI didn't do anything for port initialization. However,
> > there are some requirement or limitation on various platforms, so
> > vendors need to do some error handlings if the device connected to a
> > broken USB accessory.
> >
> > This patch also add the hook to xhci_driver_overrides so that vendors
> > can add their specific protection easily if needed.
> >
> > Signed-off-by: Ray Chi <raychi@google.com>
> > ---
> >  drivers/usb/host/xhci.c | 17 +++++++++++++++++
> >  drivers/usb/host/xhci.h |  1 +
> >  2 files changed, 18 insertions(+)
> >
> > diff --git a/drivers/usb/host/xhci.c b/drivers/usb/host/xhci.c
> > index 65858f607437..f237af9d6e2e 100644
> > --- a/drivers/usb/host/xhci.c
> > +++ b/drivers/usb/host/xhci.c
> > @@ -4358,6 +4358,20 @@ static int xhci_enable_device(struct usb_hcd *hcd, struct usb_device *udev)
> >       return xhci_setup_device(hcd, udev, SETUP_CONTEXT_ONLY);
> >  }
> >
> > +/*
> > + * The function could get the status of port initialization.
> > + */
> > +static int xhci_check_init_status(struct usb_hcd *hcd, struct usb_device *udev, int r)
> > +{
> > +     /*
> > +      * In general, this function is not necessory. Some platforms may
> > +      * need doing error handling when the port initialization takes a
> > +      * long time to do. The device can use the override callback to
> > +      * do specific handlings.
> > +      */
> > +     return 0;
> > +}
>
> For obvious technical and legal reasons, we are not allowed to add
> "hooks" to the kernel where there are no in-kernel users.  Nor would you
> want us to do so.
>

Agree on this. I am trying another way to achieve the same goal.

> So I really do not understand this patch series at all.
>
> What driver wants to do odd things here?  What needs to happen that the
> in-tree drivers are not doing properly?  Why not get the needed fixes in
> the in-kernel drivers instead of trying to add random hooks that some
> out-of-tree code would use instead.
>
> confused,
>
> greg k-h

I will prepare a new commit to do it.

Thanks,
Ray
diff mbox series

Patch

diff --git a/drivers/usb/host/xhci.c b/drivers/usb/host/xhci.c
index 65858f607437..f237af9d6e2e 100644
--- a/drivers/usb/host/xhci.c
+++ b/drivers/usb/host/xhci.c
@@ -4358,6 +4358,20 @@  static int xhci_enable_device(struct usb_hcd *hcd, struct usb_device *udev)
 	return xhci_setup_device(hcd, udev, SETUP_CONTEXT_ONLY);
 }
 
+/*
+ * The function could get the status of port initialization.
+ */
+static int xhci_check_init_status(struct usb_hcd *hcd, struct usb_device *udev, int r)
+{
+	/*
+	 * In general, this function is not necessory. Some platforms may
+	 * need doing error handling when the port initialization takes a
+	 * long time to do. The device can use the override callback to
+	 * do specific handlings.
+	 */
+	return 0;
+}
+
 /*
  * Transfer the port index into real index in the HW port status
  * registers. Caculate offset between the port's PORTSC register
@@ -5455,6 +5469,7 @@  static const struct hc_driver xhci_hc_driver = {
 	.enable_device =	xhci_enable_device,
 	.update_hub_device =	xhci_update_hub_device,
 	.reset_device =		xhci_discover_or_reset_device,
+	.check_init_status =	xhci_check_init_status,
 
 	/*
 	 * scheduling support
@@ -5503,6 +5518,8 @@  void xhci_init_driver(struct hc_driver *drv,
 			drv->check_bandwidth = over->check_bandwidth;
 		if (over->reset_bandwidth)
 			drv->reset_bandwidth = over->reset_bandwidth;
+		if (over->check_init_status)
+			drv->check_init_status = over->check_init_status;
 	}
 }
 EXPORT_SYMBOL_GPL(xhci_init_driver);
diff --git a/drivers/usb/host/xhci.h b/drivers/usb/host/xhci.h
index 1960b47acfb2..33ce873236e9 100644
--- a/drivers/usb/host/xhci.h
+++ b/drivers/usb/host/xhci.h
@@ -1944,6 +1944,7 @@  struct xhci_driver_overrides {
 			     struct usb_host_endpoint *ep);
 	int (*check_bandwidth)(struct usb_hcd *, struct usb_device *);
 	void (*reset_bandwidth)(struct usb_hcd *, struct usb_device *);
+	int (*check_init_status)(struct usb_hcd *hcd, struct usb_device *udev, int r);
 };
 
 #define	XHCI_CFC_DELAY		10