Skip to content

Commit 77419aa

Browse files
hadessgregkh
authored andcommitted
USB: Fallback to generic driver when specific driver fails
If ->probe fails for a device specific driver, ask the driver core to reprobe us, after having flagged the device for the generic driver to be forced. Signed-off-by: Bastien Nocera <hadess@hadess.net> Acked-by: Alan Stern <stern@rowland.harvard.edu> Link: https://lore.kernel.org/r/20191016093933.693-6-hadess@hadess.net Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
1 parent 88b7381 commit 77419aa

File tree

3 files changed

+8
-1
lines changed

3 files changed

+8
-1
lines changed

drivers/usb/core/driver.c

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -270,7 +270,10 @@ static int usb_probe_device(struct device *dev)
270270
return error;
271271

272272
error = udriver->probe(udev);
273-
/* TODO: fallback to generic driver in case of error */
273+
if (error == -ENODEV && udriver != &usb_generic_driver) {
274+
udev->use_generic_driver = 1;
275+
return -EPROBE_DEFER;
276+
}
274277
return error;
275278
}
276279

drivers/usb/core/generic.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -213,6 +213,9 @@ static int __check_usb_generic(struct device_driver *drv, void *data)
213213

214214
static bool usb_generic_driver_match(struct usb_device *udev)
215215
{
216+
if (udev->use_generic_driver)
217+
return true;
218+
216219
/*
217220
* If any other driver wants the device, leave the device to this other
218221
* driver.

include/linux/usb.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -708,6 +708,7 @@ struct usb_device {
708708
unsigned lpm_disable_count;
709709

710710
u16 hub_delay;
711+
unsigned use_generic_driver:1;
711712
};
712713
#define to_usb_device(d) container_of(d, struct usb_device, dev)
713714

0 commit comments

Comments
 (0)