Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commitd5643d2

Browse files
hadessgregkh
authored andcommitted
USB: Fix device driver race
When a new device with a specialised device driver is plugged in, thenew driver will be modprobe()'d but the driver core will attach the"generic" driver to the device.After that, nothing will trigger a reprobe when the modprobe()'d devicedriver has finished initialising, as the device has the "generic"driver attached to it.Trigger a reprobe ourselves when new specialised drivers get registered.Fixes:88b7381 ("USB: Select better matching USB drivers when available")Signed-off-by: Bastien Nocera <hadess@hadess.net>Cc: stable <stable@vger.kernel.org>Acked-by: Alan Stern <stern@rowland.harvard.edu>Link:https://lore.kernel.org/r/20200818110445.509668-3-hadess@hadess.netSigned-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
1 parentadb6e6a commitd5643d2

File tree

1 file changed

+38
-2
lines changed

1 file changed

+38
-2
lines changed

‎drivers/usb/core/driver.c‎

Lines changed: 38 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -905,6 +905,35 @@ static int usb_uevent(struct device *dev, struct kobj_uevent_env *env)
905905
return0;
906906
}
907907

908+
staticboolis_dev_usb_generic_driver(structdevice*dev)
909+
{
910+
structusb_device_driver*udd=dev->driver ?
911+
to_usb_device_driver(dev->driver) :NULL;
912+
913+
returnudd==&usb_generic_driver;
914+
}
915+
916+
staticint__usb_bus_reprobe_drivers(structdevice*dev,void*data)
917+
{
918+
structusb_device_driver*new_udriver=data;
919+
structusb_device*udev;
920+
intret;
921+
922+
if (!is_dev_usb_generic_driver(dev))
923+
return0;
924+
925+
udev=to_usb_device(dev);
926+
if (usb_device_match_id(udev,new_udriver->id_table)==NULL&&
927+
(!new_udriver->match||new_udriver->match(udev)!=0))
928+
return0;
929+
930+
ret=device_reprobe(dev);
931+
if (ret&&ret!=-EPROBE_DEFER)
932+
dev_err(dev,"Failed to reprobe device (error %d)\n",ret);
933+
934+
return0;
935+
}
936+
908937
/**
909938
* usb_register_device_driver - register a USB device (not interface) driver
910939
* @new_udriver: USB operations for the device driver
@@ -934,13 +963,20 @@ int usb_register_device_driver(struct usb_device_driver *new_udriver,
934963

935964
retval=driver_register(&new_udriver->drvwrap.driver);
936965

937-
if (!retval)
966+
if (!retval) {
938967
pr_info("%s: registered new device driver %s\n",
939968
usbcore_name,new_udriver->name);
940-
else
969+
/*
970+
* Check whether any device could be better served with
971+
* this new driver
972+
*/
973+
bus_for_each_dev(&usb_bus_type,NULL,new_udriver,
974+
__usb_bus_reprobe_drivers);
975+
}else {
941976
printk(KERN_ERR"%s: error %d registering device "
942977
"driver %s\n",
943978
usbcore_name,retval,new_udriver->name);
979+
}
944980

945981
returnretval;
946982
}

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp