Re: [PATCH 1/1] usb: core: hub: controller driver name may be NULL

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

 



On Tue, 18 Jul 2017, Peter Chen wrote:

> The controller driver may be NULL if the controller device
> is the middle device between platform device and roothub.
> This middle device may not need a device driver due to all
> hardware control can be at platform device driver, this
> platform device is usually a dual-role USB controller device.
> 
> The benefit of using this middle device is we can keep both
> controller device's private data (known as struct usb_hcd)
> for USB core use, and platform device's private data for
> platform driver use.
> 
> Signed-off-by: Peter Chen <peter.chen@xxxxxxx>
> ---
>  drivers/usb/core/hub.c | 14 ++++++++++++--
>  1 file changed, 12 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c
> index 6d4d36d..96621fe 100644
> --- a/drivers/usb/core/hub.c
> +++ b/drivers/usb/core/hub.c
> @@ -4379,6 +4379,8 @@ hub_port_init(struct usb_hub *hub, struct usb_device *udev, int port1,
>  	enum usb_device_speed	oldspeed = udev->speed;
>  	const char		*speed;
>  	int			devnum = udev->devnum;
> +	struct device_driver    *driver = udev->bus->controller->driver;
> +	struct device_driver    *sysdev_driver = udev->bus->sysdev->driver;

Actually, I was thinking of something more like:

	const char		*driver_name;

Then later on...

>  
>  	/* root hub ports have a slightly longer reset period
>  	 * (from USB 2.0 spec, section 7.1.7.5)
> @@ -4446,11 +4448,19 @@ hub_port_init(struct usb_hub *hub, struct usb_device *udev, int port1,
>  	else
>  		speed = usb_speed_string(udev->speed);
>  
> +	/*
> +	 * The controller driver may be NULL if the controller device
> +	 * is the middle device between platform device and roothub.
> +	 * This middle device may not need a device driver due to
> +	 * all hardware control can be at platform device driver, this
> +	 * platform device is usually a dual-role USB controller device.
> +	 */

	if (udev->bus->controller->driver)
		driver_name = udev->bus->controller->driver->name;
	else
		driver_name = udev->bus->sysdev->driver->name;

>  	if (udev->speed < USB_SPEED_SUPER)
>  		dev_info(&udev->dev,
>  				"%s %s USB device number %d using %s\n",
>  				(udev->config) ? "reset" : "new", speed,
> -				devnum, udev->bus->controller->driver->name);
> +				devnum, driver ? driver->name :
> +				sysdev_driver->name);

Then just use driver_name here and below.

Alan Stern

>  
>  	/* Set up TT records, if needed  */
>  	if (hdev->tt) {
> @@ -4582,7 +4592,7 @@ hub_port_init(struct usb_hub *hub, struct usb_device *udev, int port1,
>  						"%s SuperSpeed%s USB device number %d using %s\n",
>  						(udev->config) ? "reset" : "new",
>  					 (udev->speed == USB_SPEED_SUPER_PLUS) ? "Plus" : "",
> -						devnum, udev->bus->controller->driver->name);
> +					 devnum, driver ? driver->name : sysdev_driver->name);
>  			}
>  
>  			/* cope with hardware quirkiness:
> 

--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



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

  Powered by Linux