Re: [PATCH 4/5] USB: Select better matching USB drivers when available

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

 



On Wed, 9 Oct 2019, Bastien Nocera wrote:

> Now that USB device drivers can reuse code from the generic USB device
> driver, we need to make sure that they get selected rather than the
> generic driver. Add an id_table and match vfunc to the usb_device_driver
> struct, which will get used to select a better matching driver at
> ->probe time.
> 
> This is a similar mechanism to that used in the HID drivers, with the
> generic driver being selected unless there's a better matching one found
> in the registered drivers (see hid_generic_match() in
> drivers/hid/hid-generic.c).
> 
> Signed-off-by: Bastien Nocera <hadess@xxxxxxxxxx>
> ---
>  drivers/usb/core/driver.c  | 15 +++++++++++++--
>  drivers/usb/core/generic.c | 29 +++++++++++++++++++++++++++++
>  include/linux/usb.h        |  2 ++
>  3 files changed, 44 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/usb/core/driver.c b/drivers/usb/core/driver.c
> index 50f92da8afcf..27ce63ed902d 100644
> --- a/drivers/usb/core/driver.c
> +++ b/drivers/usb/core/driver.c
> @@ -819,13 +819,24 @@ static int usb_device_match(struct device *dev, struct device_driver *drv)
>  {
>  	/* devices and interfaces are handled separately */
>  	if (is_usb_device(dev)) {
> +		struct usb_device *udev;
> +		struct usb_device_driver *udrv;
>  
>  		/* interface drivers never match devices */
>  		if (!is_usb_device_driver(drv))
>  			return 0;
>  
> -		/* TODO: Add real matching code */
> -		return 1;
> +		udev = to_usb_device(dev);
> +		udrv = to_usb_device_driver(drv);
> +
> +		if (udrv->id_table &&
> +		    usb_device_match_id(udev, udrv->id_table) != NULL) {
> +			return 1;
> +		}
> +
> +		if (udrv->match)
> +			return udrv->match(udev);
> +		return 0;

What happens if the subclass driver's probe routine returns an error?  
Don't you still want the device to be bound to the generic driver?

Alan Stern




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

  Powered by Linux