Re: [RFC PATCH] USB:XHCI:skip hub registration

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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@xxxxxxxxxx>
> 
> 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
>>
> .
> 



[Index of Archives]     [Linux Media]     [Linux Input]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Old Linux USB Devel Archive]

  Powered by Linux