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