[RFC] USB:XHCI:skip hub registration
diff mbox series

Message ID 1618489358-42283-1-git-send-email-liulongfang@huawei.com
State New
Headers show
Series
  • [RFC] USB:XHCI:skip hub registration
Related show

Commit Message

liulongfang April 15, 2021, 12:22 p.m. UTC
When the number of ports on the USB hub is 0, skip the registration
operation of the USB hub.

The current Kunpeng930's XHCI hardware controller is defective. The number
of ports on its USB3.0 bus controller is 0, and the number of ports on
the USB2.0 bus controller is 1.

In order to solve this problem that the USB3.0 controller does not have
a port which causes the registration of the hub to fail, this patch passes
the defect information by adding flags in the quirks of xhci and usb_hcd,
and finally skips the registration process of the hub directly according
to the results of these flags when the hub is initialized.

Signed-off-by: Longfang Liu <liulongfang@huawei.com>
---
 drivers/usb/core/hub.c      | 6 ++++++
 drivers/usb/host/xhci-pci.c | 4 ++++
 drivers/usb/host/xhci.c     | 5 +++++
 drivers/usb/host/xhci.h     | 1 +
 include/linux/usb/hcd.h     | 1 +
 5 files changed, 17 insertions(+)

Comments

Greg KH April 15, 2021, 12:34 p.m. UTC | #1
On Thu, Apr 15, 2021 at 08:22:38PM +0800, Longfang Liu wrote:
> When the number of ports on the USB hub is 0, skip the registration
> operation of the USB hub.

That's crazy.  Why not fix the hardware?  How has this hub passed the
USB certification process?

> The current Kunpeng930's XHCI hardware controller is defective. The number
> of ports on its USB3.0 bus controller is 0, and the number of ports on
> the USB2.0 bus controller is 1.
> 
> In order to solve this problem that the USB3.0 controller does not have
> a port which causes the registration of the hub to fail, this patch passes
> the defect information by adding flags in the quirks of xhci and usb_hcd,
> and finally skips the registration process of the hub directly according
> to the results of these flags when the hub is initialized.
> 
> Signed-off-by: Longfang Liu <liulongfang@huawei.com>
> ---
>  drivers/usb/core/hub.c      | 6 ++++++
>  drivers/usb/host/xhci-pci.c | 4 ++++
>  drivers/usb/host/xhci.c     | 5 +++++
>  drivers/usb/host/xhci.h     | 1 +
>  include/linux/usb/hcd.h     | 1 +
>  5 files changed, 17 insertions(+)
> 
> diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c
> index b1e14be..2d6869d 100644
> --- a/drivers/usb/core/hub.c
> +++ b/drivers/usb/core/hub.c
> @@ -1769,9 +1769,15 @@ static int hub_probe(struct usb_interface *intf, const struct usb_device_id *id)
>  	struct usb_host_interface *desc;
>  	struct usb_device *hdev;
>  	struct usb_hub *hub;
> +	struct usb_hcd *hcd;
>  
>  	desc = intf->cur_altsetting;
>  	hdev = interface_to_usbdev(intf);
> +	hcd = bus_to_hcd(hdev->bus);
> +	if (hcd->usb3_no_port) {
> +		dev_warn(&intf->dev, "USB hub has no port\n");
> +		return -ENODEV;
> +	}
>  
>  	/*
>  	 * Set default autosuspend delay as 0 to speedup bus suspend,
> diff --git a/drivers/usb/host/xhci-pci.c b/drivers/usb/host/xhci-pci.c
> index ef513c2..63b89a4 100644
> --- a/drivers/usb/host/xhci-pci.c
> +++ b/drivers/usb/host/xhci-pci.c
> @@ -281,6 +281,10 @@ static void xhci_pci_quirks(struct device *dev, struct xhci_hcd *xhci)
>  	if (xhci->quirks & XHCI_RESET_ON_RESUME)
>  		xhci_dbg_trace(xhci, trace_xhci_dbg_quirks,
>  				"QUIRK: Resetting on resume");
> +
> +	if (pdev->vendor == PCI_VENDOR_ID_HUAWEI &&
> +	    pdev->device == 0xa23c)
> +		xhci->quirks |= XHCI_USB3_NOPORT;

Can't we just detect this normally that there are no ports for this
device?  Why is the device lying about how many ports it has such that
we have to "override" this?

And again, why not fix this broken hardware?

thanks,

greg k-h
Alan Stern April 15, 2021, 2:43 p.m. UTC | #2
On Thu, Apr 15, 2021 at 08:22:38PM +0800, Longfang Liu wrote:
> When the number of ports on the USB hub is 0, skip the registration
> operation of the USB hub.
> 
> The current Kunpeng930's XHCI hardware controller is defective. The number
> of ports on its USB3.0 bus controller is 0, and the number of ports on
> the USB2.0 bus controller is 1.
> 
> In order to solve this problem that the USB3.0 controller does not have
> a port which causes the registration of the hub to fail, this patch passes
> the defect information by adding flags in the quirks of xhci and usb_hcd,
> and finally skips the registration process of the hub directly according
> to the results of these flags when the hub is initialized.
> 
> Signed-off-by: Longfang Liu <liulongfang@huawei.com>

The objections that Greg raised are all good ones.

But even aside from them, this patch doesn't actually do what the 
description says.  The patch doesn't remove the call to usb_add_hcd 
for the USB-3 bus.  If you simply skipped that call (and the 
corresponding call to usb_remove_hcd) when there are no 
ports on the root hub, none of the stuff in this patch would be needed.

Alan Stern

> ---
>  drivers/usb/core/hub.c      | 6 ++++++
>  drivers/usb/host/xhci-pci.c | 4 ++++
>  drivers/usb/host/xhci.c     | 5 +++++
>  drivers/usb/host/xhci.h     | 1 +
>  include/linux/usb/hcd.h     | 1 +
>  5 files changed, 17 insertions(+)
> 
> diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c
> index b1e14be..2d6869d 100644
> --- a/drivers/usb/core/hub.c
> +++ b/drivers/usb/core/hub.c
> @@ -1769,9 +1769,15 @@ static int hub_probe(struct usb_interface *intf, const struct usb_device_id *id)
>  	struct usb_host_interface *desc;
>  	struct usb_device *hdev;
>  	struct usb_hub *hub;
> +	struct usb_hcd *hcd;
>  
>  	desc = intf->cur_altsetting;
>  	hdev = interface_to_usbdev(intf);
> +	hcd = bus_to_hcd(hdev->bus);
> +	if (hcd->usb3_no_port) {
> +		dev_warn(&intf->dev, "USB hub has no port\n");
> +		return -ENODEV;
> +	}
>  
>  	/*
>  	 * Set default autosuspend delay as 0 to speedup bus suspend,
> diff --git a/drivers/usb/host/xhci-pci.c b/drivers/usb/host/xhci-pci.c
> index ef513c2..63b89a4 100644
> --- a/drivers/usb/host/xhci-pci.c
> +++ b/drivers/usb/host/xhci-pci.c
> @@ -281,6 +281,10 @@ static void xhci_pci_quirks(struct device *dev, struct xhci_hcd *xhci)
>  	if (xhci->quirks & XHCI_RESET_ON_RESUME)
>  		xhci_dbg_trace(xhci, trace_xhci_dbg_quirks,
>  				"QUIRK: Resetting on resume");
> +
> +	if (pdev->vendor == PCI_VENDOR_ID_HUAWEI &&
> +	    pdev->device == 0xa23c)
> +		xhci->quirks |= XHCI_USB3_NOPORT;
>  }
>  
>  #ifdef CONFIG_ACPI
> diff --git a/drivers/usb/host/xhci.c b/drivers/usb/host/xhci.c
> index bee5dec..e3e3573 100644
> --- a/drivers/usb/host/xhci.c
> +++ b/drivers/usb/host/xhci.c
> @@ -5184,6 +5184,11 @@ int xhci_gen_setup(struct usb_hcd *hcd, xhci_get_quirks_t get_quirks)
>  		/* xHCI private pointer was set in xhci_pci_probe for the second
>  		 * registered roothub.
>  		 */
> +		if (xhci->quirks & XHCI_USB3_NOPORT) {
> +			xhci_info(xhci, "xHCI host has no port\n");
> +			hcd->usb3_no_port = 1;
> +		}
> +
>  		return 0;
>  	}
>  
> diff --git a/drivers/usb/host/xhci.h b/drivers/usb/host/xhci.h
> index 2c6c4f8..d3c658f 100644
> --- a/drivers/usb/host/xhci.h
> +++ b/drivers/usb/host/xhci.h
> @@ -1874,6 +1874,7 @@ struct xhci_hcd {
>  #define XHCI_RESET_PLL_ON_DISCONNECT	BIT_ULL(34)
>  #define XHCI_SNPS_BROKEN_SUSPEND    BIT_ULL(35)
>  #define XHCI_RENESAS_FW_QUIRK	BIT_ULL(36)
> +#define XHCI_USB3_NOPORT	BIT_ULL(37)
>  
>  	unsigned int		num_active_eps;
>  	unsigned int		limit_active_eps;
> diff --git a/include/linux/usb/hcd.h b/include/linux/usb/hcd.h
> index 3dbb42c..7df23a0f 100644
> --- a/include/linux/usb/hcd.h
> +++ b/include/linux/usb/hcd.h
> @@ -172,6 +172,7 @@ struct usb_hcd {
>  	unsigned		tpl_support:1; /* OTG & EH TPL support */
>  	unsigned		cant_recv_wakeups:1;
>  			/* wakeup requests from downstream aren't received */
> +	unsigned		usb3_no_port:1; /* xHCI main_hcd has no port */
>  
>  	unsigned int		irq;		/* irq allocated */
>  	void __iomem		*regs;		/* device memory/io */
> -- 
> 2.8.1
>
liulongfang April 16, 2021, 2:03 a.m. UTC | #3
On 2021/4/15 22:43, Alan Stern wrote:
> On Thu, Apr 15, 2021 at 08:22:38PM +0800, Longfang Liu wrote:
>> When the number of ports on the USB hub is 0, skip the registration
>> operation of the USB hub.
>>
>> The current Kunpeng930's XHCI hardware controller is defective. The number
>> of ports on its USB3.0 bus controller is 0, and the number of ports on
>> the USB2.0 bus controller is 1.
>>
>> In order to solve this problem that the USB3.0 controller does not have
>> a port which causes the registration of the hub to fail, this patch passes
>> the defect information by adding flags in the quirks of xhci and usb_hcd,
>> and finally skips the registration process of the hub directly according
>> to the results of these flags when the hub is initialized.
>>
>> Signed-off-by: Longfang Liu <liulongfang@huawei.com>
> 
> The objections that Greg raised are all good ones.
> 
> But even aside from them, this patch doesn't actually do what the 
> description says.  The patch doesn't remove the call to usb_add_hcd 
> for the USB-3 bus.  If you simply skipped that call (and the 
> corresponding call to usb_remove_hcd) when there are no 
> ports on the root hub, none of the stuff in this patch would be needed.
> 
> Alan Stern
> 

"[RFC PATCH] USB:XHCI:Adjust the log level of hub"
The current method is an improved method of the above patch.
This patch just make it skip registering USB-3 root hub if that hub has no ports,
after skipping registering, no port will not report error log,the goal of this
patch is reached without error log output.
Thanks.
Longfang.

>> ---
>>  drivers/usb/core/hub.c      | 6 ++++++
>>  drivers/usb/host/xhci-pci.c | 4 ++++
>>  drivers/usb/host/xhci.c     | 5 +++++
>>  drivers/usb/host/xhci.h     | 1 +
>>  include/linux/usb/hcd.h     | 1 +
>>  5 files changed, 17 insertions(+)
>>
>> diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c
>> index b1e14be..2d6869d 100644
>> --- a/drivers/usb/core/hub.c
>> +++ b/drivers/usb/core/hub.c
>> @@ -1769,9 +1769,15 @@ static int hub_probe(struct usb_interface *intf, const struct usb_device_id *id)
>>  	struct usb_host_interface *desc;
>>  	struct usb_device *hdev;
>>  	struct usb_hub *hub;
>> +	struct usb_hcd *hcd;
>>  
>>  	desc = intf->cur_altsetting;
>>  	hdev = interface_to_usbdev(intf);
>> +	hcd = bus_to_hcd(hdev->bus);
>> +	if (hcd->usb3_no_port) {
>> +		dev_warn(&intf->dev, "USB hub has no port\n");
>> +		return -ENODEV;
>> +	}
>>  
>>  	/*
>>  	 * Set default autosuspend delay as 0 to speedup bus suspend,
>> diff --git a/drivers/usb/host/xhci-pci.c b/drivers/usb/host/xhci-pci.c
>> index ef513c2..63b89a4 100644
>> --- a/drivers/usb/host/xhci-pci.c
>> +++ b/drivers/usb/host/xhci-pci.c
>> @@ -281,6 +281,10 @@ static void xhci_pci_quirks(struct device *dev, struct xhci_hcd *xhci)
>>  	if (xhci->quirks & XHCI_RESET_ON_RESUME)
>>  		xhci_dbg_trace(xhci, trace_xhci_dbg_quirks,
>>  				"QUIRK: Resetting on resume");
>> +
>> +	if (pdev->vendor == PCI_VENDOR_ID_HUAWEI &&
>> +	    pdev->device == 0xa23c)
>> +		xhci->quirks |= XHCI_USB3_NOPORT;
>>  }
>>  
>>  #ifdef CONFIG_ACPI
>> diff --git a/drivers/usb/host/xhci.c b/drivers/usb/host/xhci.c
>> index bee5dec..e3e3573 100644
>> --- a/drivers/usb/host/xhci.c
>> +++ b/drivers/usb/host/xhci.c
>> @@ -5184,6 +5184,11 @@ int xhci_gen_setup(struct usb_hcd *hcd, xhci_get_quirks_t get_quirks)
>>  		/* xHCI private pointer was set in xhci_pci_probe for the second
>>  		 * registered roothub.
>>  		 */
>> +		if (xhci->quirks & XHCI_USB3_NOPORT) {
>> +			xhci_info(xhci, "xHCI host has no port\n");
>> +			hcd->usb3_no_port = 1;
>> +		}
>> +
>>  		return 0;
>>  	}
>>  
>> diff --git a/drivers/usb/host/xhci.h b/drivers/usb/host/xhci.h
>> index 2c6c4f8..d3c658f 100644
>> --- a/drivers/usb/host/xhci.h
>> +++ b/drivers/usb/host/xhci.h
>> @@ -1874,6 +1874,7 @@ struct xhci_hcd {
>>  #define XHCI_RESET_PLL_ON_DISCONNECT	BIT_ULL(34)
>>  #define XHCI_SNPS_BROKEN_SUSPEND    BIT_ULL(35)
>>  #define XHCI_RENESAS_FW_QUIRK	BIT_ULL(36)
>> +#define XHCI_USB3_NOPORT	BIT_ULL(37)
>>  
>>  	unsigned int		num_active_eps;
>>  	unsigned int		limit_active_eps;
>> diff --git a/include/linux/usb/hcd.h b/include/linux/usb/hcd.h
>> index 3dbb42c..7df23a0f 100644
>> --- a/include/linux/usb/hcd.h
>> +++ b/include/linux/usb/hcd.h
>> @@ -172,6 +172,7 @@ struct usb_hcd {
>>  	unsigned		tpl_support:1; /* OTG & EH TPL support */
>>  	unsigned		cant_recv_wakeups:1;
>>  			/* wakeup requests from downstream aren't received */
>> +	unsigned		usb3_no_port:1; /* xHCI main_hcd has no port */
>>  
>>  	unsigned int		irq;		/* irq allocated */
>>  	void __iomem		*regs;		/* device memory/io */
>> -- 
>> 2.8.1
>>
> .
>
liulongfang April 16, 2021, 2:43 a.m. UTC | #4
On 2021/4/15 20:34, Greg KH wrote:
> On Thu, Apr 15, 2021 at 08:22:38PM +0800, Longfang Liu wrote:
>> When the number of ports on the USB hub is 0, skip the registration
>> operation of the USB hub.
> 
> That's crazy.  Why not fix the hardware?  How has this hub passed the
> USB certification process?
> 
>> The current Kunpeng930's XHCI hardware controller is defective. The number
>> of ports on its USB3.0 bus controller is 0, and the number of ports on
>> the USB2.0 bus controller is 1.
>>
>> In order to solve this problem that the USB3.0 controller does not have
>> a port which causes the registration of the hub to fail, this patch passes
>> the defect information by adding flags in the quirks of xhci and usb_hcd,
>> and finally skips the registration process of the hub directly according
>> to the results of these flags when the hub is initialized.
>>
>> Signed-off-by: Longfang Liu <liulongfang@huawei.com>
>> ---
>>  drivers/usb/core/hub.c      | 6 ++++++
>>  drivers/usb/host/xhci-pci.c | 4 ++++
>>  drivers/usb/host/xhci.c     | 5 +++++
>>  drivers/usb/host/xhci.h     | 1 +
>>  include/linux/usb/hcd.h     | 1 +
>>  5 files changed, 17 insertions(+)
>>
>> diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c
>> index b1e14be..2d6869d 100644
>> --- a/drivers/usb/core/hub.c
>> +++ b/drivers/usb/core/hub.c
>> @@ -1769,9 +1769,15 @@ static int hub_probe(struct usb_interface *intf, const struct usb_device_id *id)
>>  	struct usb_host_interface *desc;
>>  	struct usb_device *hdev;
>>  	struct usb_hub *hub;
>> +	struct usb_hcd *hcd;
>>  
>>  	desc = intf->cur_altsetting;
>>  	hdev = interface_to_usbdev(intf);
>> +	hcd = bus_to_hcd(hdev->bus);
>> +	if (hcd->usb3_no_port) {
>> +		dev_warn(&intf->dev, "USB hub has no port\n");
>> +		return -ENODEV;
>> +	}
>>  
>>  	/*
>>  	 * Set default autosuspend delay as 0 to speedup bus suspend,
>> diff --git a/drivers/usb/host/xhci-pci.c b/drivers/usb/host/xhci-pci.c
>> index ef513c2..63b89a4 100644
>> --- a/drivers/usb/host/xhci-pci.c
>> +++ b/drivers/usb/host/xhci-pci.c
>> @@ -281,6 +281,10 @@ static void xhci_pci_quirks(struct device *dev, struct xhci_hcd *xhci)
>>  	if (xhci->quirks & XHCI_RESET_ON_RESUME)
>>  		xhci_dbg_trace(xhci, trace_xhci_dbg_quirks,
>>  				"QUIRK: Resetting on resume");
>> +
>> +	if (pdev->vendor == PCI_VENDOR_ID_HUAWEI &&
>> +	    pdev->device == 0xa23c)
>> +		xhci->quirks |= XHCI_USB3_NOPORT;
> 
> Can't we just detect this normally that there are no ports for this
> device?  Why is the device lying about how many ports it has such that
> we have to "override" this?
> 

The hub driver will check the port number in prob(). If there is no port,
the driver will report an error log. But we hope this defective device
does not print error log.

> And again, why not fix this broken hardware?
> 
> thanks,
> 
> greg k-h
> .
> The current generation of hardware can no longer be modified,
this problem will be solved in the next generation of hardware.
Thanks,
Longfang.
Greg KH April 16, 2021, 5:16 a.m. UTC | #5
On Fri, Apr 16, 2021 at 10:43:34AM +0800, liulongfang wrote:
> On 2021/4/15 20:34, Greg KH wrote:
> > On Thu, Apr 15, 2021 at 08:22:38PM +0800, Longfang Liu wrote:
> >> When the number of ports on the USB hub is 0, skip the registration
> >> operation of the USB hub.
> > 
> > That's crazy.  Why not fix the hardware?  How has this hub passed the
> > USB certification process?
> > 
> >> The current Kunpeng930's XHCI hardware controller is defective. The number
> >> of ports on its USB3.0 bus controller is 0, and the number of ports on
> >> the USB2.0 bus controller is 1.
> >>
> >> In order to solve this problem that the USB3.0 controller does not have
> >> a port which causes the registration of the hub to fail, this patch passes
> >> the defect information by adding flags in the quirks of xhci and usb_hcd,
> >> and finally skips the registration process of the hub directly according
> >> to the results of these flags when the hub is initialized.
> >>
> >> Signed-off-by: Longfang Liu <liulongfang@huawei.com>
> >> ---
> >>  drivers/usb/core/hub.c      | 6 ++++++
> >>  drivers/usb/host/xhci-pci.c | 4 ++++
> >>  drivers/usb/host/xhci.c     | 5 +++++
> >>  drivers/usb/host/xhci.h     | 1 +
> >>  include/linux/usb/hcd.h     | 1 +
> >>  5 files changed, 17 insertions(+)
> >>
> >> diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c
> >> index b1e14be..2d6869d 100644
> >> --- a/drivers/usb/core/hub.c
> >> +++ b/drivers/usb/core/hub.c
> >> @@ -1769,9 +1769,15 @@ static int hub_probe(struct usb_interface *intf, const struct usb_device_id *id)
> >>  	struct usb_host_interface *desc;
> >>  	struct usb_device *hdev;
> >>  	struct usb_hub *hub;
> >> +	struct usb_hcd *hcd;
> >>  
> >>  	desc = intf->cur_altsetting;
> >>  	hdev = interface_to_usbdev(intf);
> >> +	hcd = bus_to_hcd(hdev->bus);
> >> +	if (hcd->usb3_no_port) {
> >> +		dev_warn(&intf->dev, "USB hub has no port\n");
> >> +		return -ENODEV;
> >> +	}
> >>  
> >>  	/*
> >>  	 * Set default autosuspend delay as 0 to speedup bus suspend,
> >> diff --git a/drivers/usb/host/xhci-pci.c b/drivers/usb/host/xhci-pci.c
> >> index ef513c2..63b89a4 100644
> >> --- a/drivers/usb/host/xhci-pci.c
> >> +++ b/drivers/usb/host/xhci-pci.c
> >> @@ -281,6 +281,10 @@ static void xhci_pci_quirks(struct device *dev, struct xhci_hcd *xhci)
> >>  	if (xhci->quirks & XHCI_RESET_ON_RESUME)
> >>  		xhci_dbg_trace(xhci, trace_xhci_dbg_quirks,
> >>  				"QUIRK: Resetting on resume");
> >> +
> >> +	if (pdev->vendor == PCI_VENDOR_ID_HUAWEI &&
> >> +	    pdev->device == 0xa23c)
> >> +		xhci->quirks |= XHCI_USB3_NOPORT;
> > 
> > Can't we just detect this normally that there are no ports for this
> > device?  Why is the device lying about how many ports it has such that
> > we have to "override" this?
> > 
> 
> The hub driver will check the port number in prob(). If there is no port,
> the driver will report an error log. But we hope this defective device
> does not print error log.

Defective devices deserve to have errors sent to the error log,
otherwise how will people know to tell the companies to fix them?

Again, this device can not pass USB certification, so there's not much
we should do to work around that, right?

thanks,

greg k-h
Alan Stern April 16, 2021, 3:20 p.m. UTC | #6
On Fri, Apr 16, 2021 at 10:03:21AM +0800, liulongfang wrote:
> On 2021/4/15 22:43, Alan Stern wrote:
> > On Thu, Apr 15, 2021 at 08:22:38PM +0800, Longfang Liu wrote:
> >> When the number of ports on the USB hub is 0, skip the registration
> >> operation of the USB hub.
> >>
> >> The current Kunpeng930's XHCI hardware controller is defective. The number
> >> of ports on its USB3.0 bus controller is 0, and the number of ports on
> >> the USB2.0 bus controller is 1.
> >>
> >> In order to solve this problem that the USB3.0 controller does not have
> >> a port which causes the registration of the hub to fail, this patch passes
> >> the defect information by adding flags in the quirks of xhci and usb_hcd,
> >> and finally skips the registration process of the hub directly according
> >> to the results of these flags when the hub is initialized.
> >>
> >> Signed-off-by: Longfang Liu <liulongfang@huawei.com>
> > 
> > The objections that Greg raised are all good ones.
> > 
> > But even aside from them, this patch doesn't actually do what the 
> > description says.  The patch doesn't remove the call to usb_add_hcd 
> > for the USB-3 bus.  If you simply skipped that call (and the 
> > corresponding call to usb_remove_hcd) when there are no 
> > ports on the root hub, none of the stuff in this patch would be needed.
> > 
> > Alan Stern
> > 
> 
> "[RFC PATCH] USB:XHCI:Adjust the log level of hub"

I don't understand.  What patch is that?  Do you have a URL for it?

> The current method is an improved method of the above patch.
> This patch just make it skip registering USB-3 root hub if that hub has no ports,

No, that isn't what this patch does.

If the root hub wasn't registered, hub_probe wouldn't get called.  But 
with your patch, the system tries to register the root hub, and it does 
call hub_probe, and then that function fails with a warning message.

The way to _really_ akip registering the root hub is to change the 
xhci-hcd code.  Make it skip calling usb_add_hcd.

> after skipping registering, no port will not report error log,the goal of this
> patch is reached without error log output.

Why do you want to get rid of the error log output?  There really _is_ 
an error, because the USB-3 hardware on your controller is defective.  
Since the hardware is buggy, we _should_ print an error message in the 
kernel log.

Alan Stern
liulongfang April 17, 2021, 3:11 a.m. UTC | #7
On 2021/4/16 23:20, Alan Stern wrote:
> On Fri, Apr 16, 2021 at 10:03:21AM +0800, liulongfang wrote:
>> On 2021/4/15 22:43, Alan Stern wrote:
>>> On Thu, Apr 15, 2021 at 08:22:38PM +0800, Longfang Liu wrote:
>>>> When the number of ports on the USB hub is 0, skip the registration
>>>> operation of the USB hub.
>>>>
>>>> The current Kunpeng930's XHCI hardware controller is defective. The number
>>>> of ports on its USB3.0 bus controller is 0, and the number of ports on
>>>> the USB2.0 bus controller is 1.
>>>>
>>>> In order to solve this problem that the USB3.0 controller does not have
>>>> a port which causes the registration of the hub to fail, this patch passes
>>>> the defect information by adding flags in the quirks of xhci and usb_hcd,
>>>> and finally skips the registration process of the hub directly according
>>>> to the results of these flags when the hub is initialized.
>>>>
>>>> Signed-off-by: Longfang Liu <liulongfang@huawei.com>
>>>
>>> The objections that Greg raised are all good ones.
>>>
>>> But even aside from them, this patch doesn't actually do what the 
>>> description says.  The patch doesn't remove the call to usb_add_hcd 
>>> for the USB-3 bus.  If you simply skipped that call (and the 
>>> corresponding call to usb_remove_hcd) when there are no 
>>> ports on the root hub, none of the stuff in this patch would be needed.
>>>
>>> Alan Stern
>>>
>>
>> "[RFC PATCH] USB:XHCI:Adjust the log level of hub"
> 
> I don't understand.  What patch is that?  Do you have a URL for it?
> 
URL: https://patchwork.kernel.org/project/linux-usb/patch/1616666652-37920-1-git-send-email-liulongfang@huawei.com/
Thanks
Longfang.

>> The current method is an improved method of the above patch.
>> This patch just make it skip registering USB-3 root hub if that hub has no ports,
> 
> No, that isn't what this patch does.
> 
> If the root hub wasn't registered, hub_probe wouldn't get called.  But 
> with your patch, the system tries to register the root hub, and it does 
> call hub_probe, and then that function fails with a warning message.
> 
> The way to _really_ akip registering the root hub is to change the 
> xhci-hcd code.  Make it skip calling usb_add_hcd.
> 
>> after skipping registering, no port will not report error log,the goal of this
>> patch is reached without error log output.
> 
> Why do you want to get rid of the error log output?  There really _is_ 
> an error, because the USB-3 hardware on your controller is defective.  
> Since the hardware is buggy, we _should_ print an error message in the 
> kernel log.
> 
> Alan Stern
> .
>
liulongfang April 17, 2021, 6:48 a.m. UTC | #8
On 2021/4/16 23:20, Alan Stern wrote:
> On Fri, Apr 16, 2021 at 10:03:21AM +0800, liulongfang wrote:
>> On 2021/4/15 22:43, Alan Stern wrote:
>>> On Thu, Apr 15, 2021 at 08:22:38PM +0800, Longfang Liu wrote:
>>>> When the number of ports on the USB hub is 0, skip the registration
>>>> operation of the USB hub.
>>>>
>>>> The current Kunpeng930's XHCI hardware controller is defective. The number
>>>> of ports on its USB3.0 bus controller is 0, and the number of ports on
>>>> the USB2.0 bus controller is 1.
>>>>
>>>> In order to solve this problem that the USB3.0 controller does not have
>>>> a port which causes the registration of the hub to fail, this patch passes
>>>> the defect information by adding flags in the quirks of xhci and usb_hcd,
>>>> and finally skips the registration process of the hub directly according
>>>> to the results of these flags when the hub is initialized.
>>>>
>>>> Signed-off-by: Longfang Liu <liulongfang@huawei.com>
>>>
>>> The objections that Greg raised are all good ones.
>>>
>>> But even aside from them, this patch doesn't actually do what the 
>>> description says.  The patch doesn't remove the call to usb_add_hcd 
>>> for the USB-3 bus.  If you simply skipped that call (and the 
>>> corresponding call to usb_remove_hcd) when there are no 
>>> ports on the root hub, none of the stuff in this patch would be needed.
>>>
>>> Alan Stern
>>>
>>
>> "[RFC PATCH] USB:XHCI:Adjust the log level of hub"
> 
> I don't understand.  What patch is that?  Do you have a URL for it?
> 
>> The current method is an improved method of the above patch.
>> This patch just make it skip registering USB-3 root hub if that hub has no ports,
> 
> No, that isn't what this patch does.
> 
> If the root hub wasn't registered, hub_probe wouldn't get called.  But 
> with your patch, the system tries to register the root hub, and it does 
> call hub_probe, and then that function fails with a warning message.
> 
> The way to _really_ akip registering the root hub is to change the 
> xhci-hcd code.  Make it skip calling usb_add_hcd.
> 

If you do not register in the root hub, this will return an error code,
which will make all the XHCI drivers unregister, causing the USB2.0 controllers
on the xhci to be unavailable.
Thanks,
Longfang.

>> after skipping registering, no port will not report error log,the goal of this
>> patch is reached without error log output.
> 
> Why do you want to get rid of the error log output?  There really _is_ 
> an error, because the USB-3 hardware on your controller is defective.  
> Since the hardware is buggy, we _should_ print an error message in the 
> kernel log.
> 
> Alan Stern
> .
>
Alan Stern April 17, 2021, 3:31 p.m. UTC | #9
On Sat, Apr 17, 2021 at 02:48:22PM +0800, liulongfang wrote:
> On 2021/4/16 23:20, Alan Stern wrote:
> > On Fri, Apr 16, 2021 at 10:03:21AM +0800, liulongfang wrote:
> >> The current method is an improved method of the above patch.
> >> This patch just make it skip registering USB-3 root hub if that hub has no ports,
> > 
> > No, that isn't what this patch does.
> > 
> > If the root hub wasn't registered, hub_probe wouldn't get called.  But 
> > with your patch, the system tries to register the root hub, and it does 
> > call hub_probe, and then that function fails with a warning message.
> > 
> > The way to _really_ akip registering the root hub is to change the 
> > xhci-hcd code.  Make it skip calling usb_add_hcd.
> > 
> 
> If you do not register in the root hub, this will return an error code,

What will return an error code?  Are you talking about xhci_pci_probe()?  
You oight to be able to figure out how to make it work.

> which will make all the XHCI drivers unregister, causing the USB2.0 controllers
> on the xhci to be unavailable.

Alan Stern

Patch
diff mbox series

diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c
index b1e14be..2d6869d 100644
--- a/drivers/usb/core/hub.c
+++ b/drivers/usb/core/hub.c
@@ -1769,9 +1769,15 @@  static int hub_probe(struct usb_interface *intf, const struct usb_device_id *id)
 	struct usb_host_interface *desc;
 	struct usb_device *hdev;
 	struct usb_hub *hub;
+	struct usb_hcd *hcd;
 
 	desc = intf->cur_altsetting;
 	hdev = interface_to_usbdev(intf);
+	hcd = bus_to_hcd(hdev->bus);
+	if (hcd->usb3_no_port) {
+		dev_warn(&intf->dev, "USB hub has no port\n");
+		return -ENODEV;
+	}
 
 	/*
 	 * Set default autosuspend delay as 0 to speedup bus suspend,
diff --git a/drivers/usb/host/xhci-pci.c b/drivers/usb/host/xhci-pci.c
index ef513c2..63b89a4 100644
--- a/drivers/usb/host/xhci-pci.c
+++ b/drivers/usb/host/xhci-pci.c
@@ -281,6 +281,10 @@  static void xhci_pci_quirks(struct device *dev, struct xhci_hcd *xhci)
 	if (xhci->quirks & XHCI_RESET_ON_RESUME)
 		xhci_dbg_trace(xhci, trace_xhci_dbg_quirks,
 				"QUIRK: Resetting on resume");
+
+	if (pdev->vendor == PCI_VENDOR_ID_HUAWEI &&
+	    pdev->device == 0xa23c)
+		xhci->quirks |= XHCI_USB3_NOPORT;
 }
 
 #ifdef CONFIG_ACPI
diff --git a/drivers/usb/host/xhci.c b/drivers/usb/host/xhci.c
index bee5dec..e3e3573 100644
--- a/drivers/usb/host/xhci.c
+++ b/drivers/usb/host/xhci.c
@@ -5184,6 +5184,11 @@  int xhci_gen_setup(struct usb_hcd *hcd, xhci_get_quirks_t get_quirks)
 		/* xHCI private pointer was set in xhci_pci_probe for the second
 		 * registered roothub.
 		 */
+		if (xhci->quirks & XHCI_USB3_NOPORT) {
+			xhci_info(xhci, "xHCI host has no port\n");
+			hcd->usb3_no_port = 1;
+		}
+
 		return 0;
 	}
 
diff --git a/drivers/usb/host/xhci.h b/drivers/usb/host/xhci.h
index 2c6c4f8..d3c658f 100644
--- a/drivers/usb/host/xhci.h
+++ b/drivers/usb/host/xhci.h
@@ -1874,6 +1874,7 @@  struct xhci_hcd {
 #define XHCI_RESET_PLL_ON_DISCONNECT	BIT_ULL(34)
 #define XHCI_SNPS_BROKEN_SUSPEND    BIT_ULL(35)
 #define XHCI_RENESAS_FW_QUIRK	BIT_ULL(36)
+#define XHCI_USB3_NOPORT	BIT_ULL(37)
 
 	unsigned int		num_active_eps;
 	unsigned int		limit_active_eps;
diff --git a/include/linux/usb/hcd.h b/include/linux/usb/hcd.h
index 3dbb42c..7df23a0f 100644
--- a/include/linux/usb/hcd.h
+++ b/include/linux/usb/hcd.h
@@ -172,6 +172,7 @@  struct usb_hcd {
 	unsigned		tpl_support:1; /* OTG & EH TPL support */
 	unsigned		cant_recv_wakeups:1;
 			/* wakeup requests from downstream aren't received */
+	unsigned		usb3_no_port:1; /* xHCI main_hcd has no port */
 
 	unsigned int		irq;		/* irq allocated */
 	void __iomem		*regs;		/* device memory/io */