forked from mirrors/linux
		
	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>
This commit is contained in:
		
							parent
							
								
									88b7381a93
								
							
						
					
					
						commit
						77419aa403
					
				
					 3 changed files with 8 additions and 1 deletions
				
			
		|  | @ -270,7 +270,10 @@ static int usb_probe_device(struct device *dev) | ||||||
| 		return error; | 		return error; | ||||||
| 
 | 
 | ||||||
| 	error = udriver->probe(udev); | 	error = udriver->probe(udev); | ||||||
| 	/* TODO: fallback to generic driver in case of error */ | 	if (error == -ENODEV && udriver != &usb_generic_driver) { | ||||||
|  | 		udev->use_generic_driver = 1; | ||||||
|  | 		return -EPROBE_DEFER; | ||||||
|  | 	} | ||||||
| 	return error; | 	return error; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -213,6 +213,9 @@ static int __check_usb_generic(struct device_driver *drv, void *data) | ||||||
| 
 | 
 | ||||||
| static bool usb_generic_driver_match(struct usb_device *udev) | static bool usb_generic_driver_match(struct usb_device *udev) | ||||||
| { | { | ||||||
|  | 	if (udev->use_generic_driver) | ||||||
|  | 		return true; | ||||||
|  | 
 | ||||||
| 	/*
 | 	/*
 | ||||||
| 	 * If any other driver wants the device, leave the device to this other | 	 * If any other driver wants the device, leave the device to this other | ||||||
| 	 * driver. | 	 * driver. | ||||||
|  |  | ||||||
|  | @ -708,6 +708,7 @@ struct usb_device { | ||||||
| 	unsigned lpm_disable_count; | 	unsigned lpm_disable_count; | ||||||
| 
 | 
 | ||||||
| 	u16 hub_delay; | 	u16 hub_delay; | ||||||
|  | 	unsigned use_generic_driver:1; | ||||||
| }; | }; | ||||||
| #define	to_usb_device(d) container_of(d, struct usb_device, dev) | #define	to_usb_device(d) container_of(d, struct usb_device, dev) | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue
	
	 Bastien Nocera
						Bastien Nocera