[PATCH] USB: allow usb drivers to disable dynamic ids
This lets drivers, like the usb-serial ones, disable the ability to add ids from sysfs. The usb-serial drivers are "odd" in that they are really usb-serial bus drivers, not usb bus drivers, so the dynamic id logic will have to go into the usb-serial bus core for those drivers to get that ability. Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
This commit is contained in:
parent
733260ff9c
commit
ba9dc657af
@ -112,12 +112,26 @@ static int usb_create_newid_file(struct usb_driver *usb_drv)
|
||||
{
|
||||
int error = 0;
|
||||
|
||||
if (usb_drv->no_dynamic_id)
|
||||
goto exit;
|
||||
|
||||
if (usb_drv->probe != NULL)
|
||||
error = sysfs_create_file(&usb_drv->driver.kobj,
|
||||
&driver_attr_new_id.attr);
|
||||
exit:
|
||||
return error;
|
||||
}
|
||||
|
||||
static void usb_remove_newid_file(struct usb_driver *usb_drv)
|
||||
{
|
||||
if (usb_drv->no_dynamic_id)
|
||||
return;
|
||||
|
||||
if (usb_drv->probe != NULL)
|
||||
sysfs_remove_file(&usb_drv->driver.kobj,
|
||||
&driver_attr_new_id.attr);
|
||||
}
|
||||
|
||||
static void usb_free_dynids(struct usb_driver *usb_drv)
|
||||
{
|
||||
struct usb_dynid *dynid, *n;
|
||||
@ -135,6 +149,10 @@ static inline int usb_create_newid_file(struct usb_driver *usb_drv)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void usb_remove_newid_file(struct usb_driver *usb_drv)
|
||||
{
|
||||
}
|
||||
|
||||
static inline void usb_free_dynids(struct usb_driver *usb_drv)
|
||||
{
|
||||
}
|
||||
@ -447,6 +465,7 @@ void usb_deregister(struct usb_driver *driver)
|
||||
pr_info("%s: deregistering driver %s\n", usbcore_name, driver->name);
|
||||
|
||||
usb_lock_all_devices();
|
||||
usb_remove_newid_file(driver);
|
||||
usb_free_dynids(driver);
|
||||
driver_unregister(&driver->driver);
|
||||
usb_unlock_all_devices();
|
||||
|
@ -28,6 +28,7 @@ static struct usb_driver airprime_driver = {
|
||||
.probe = usb_serial_probe,
|
||||
.disconnect = usb_serial_disconnect,
|
||||
.id_table = id_table,
|
||||
.no_dynamic_id = 1,
|
||||
};
|
||||
|
||||
static struct usb_serial_driver airprime_device = {
|
||||
|
@ -32,6 +32,7 @@ static struct usb_driver anydata_driver = {
|
||||
.probe = usb_serial_probe,
|
||||
.disconnect = usb_serial_disconnect,
|
||||
.id_table = id_table,
|
||||
.no_dynamic_id = 1,
|
||||
};
|
||||
|
||||
static int anydata_open(struct usb_serial_port *port, struct file *filp)
|
||||
|
@ -118,6 +118,7 @@ static struct usb_driver belkin_driver = {
|
||||
.probe = usb_serial_probe,
|
||||
.disconnect = usb_serial_disconnect,
|
||||
.id_table = id_table_combined,
|
||||
.no_dynamic_id = 1,
|
||||
};
|
||||
|
||||
/* All of the device info needed for the serial converters */
|
||||
|
@ -72,6 +72,7 @@ static struct usb_driver cp2101_driver = {
|
||||
.probe = usb_serial_probe,
|
||||
.disconnect = usb_serial_disconnect,
|
||||
.id_table = id_table,
|
||||
.no_dynamic_id = 1,
|
||||
};
|
||||
|
||||
static struct usb_serial_driver cp2101_device = {
|
||||
|
@ -81,6 +81,7 @@ static struct usb_driver cyberjack_driver = {
|
||||
.probe = usb_serial_probe,
|
||||
.disconnect = usb_serial_disconnect,
|
||||
.id_table = id_table,
|
||||
.no_dynamic_id = 1,
|
||||
};
|
||||
|
||||
static struct usb_serial_driver cyberjack_device = {
|
||||
|
@ -112,6 +112,7 @@ static struct usb_driver cypress_driver = {
|
||||
.probe = usb_serial_probe,
|
||||
.disconnect = usb_serial_disconnect,
|
||||
.id_table = id_table_combined,
|
||||
.no_dynamic_id = 1,
|
||||
};
|
||||
|
||||
struct cypress_private {
|
||||
|
@ -498,6 +498,7 @@ static struct usb_driver digi_driver = {
|
||||
.probe = usb_serial_probe,
|
||||
.disconnect = usb_serial_disconnect,
|
||||
.id_table = id_table_combined,
|
||||
.no_dynamic_id = 1,
|
||||
};
|
||||
|
||||
|
||||
|
@ -110,6 +110,7 @@ static struct usb_driver empeg_driver = {
|
||||
.probe = usb_serial_probe,
|
||||
.disconnect = usb_serial_disconnect,
|
||||
.id_table = id_table,
|
||||
.no_dynamic_id = 1,
|
||||
};
|
||||
|
||||
static struct usb_serial_driver empeg_device = {
|
||||
|
@ -488,6 +488,7 @@ static struct usb_driver ftdi_driver = {
|
||||
.probe = usb_serial_probe,
|
||||
.disconnect = usb_serial_disconnect,
|
||||
.id_table = id_table_combined,
|
||||
.no_dynamic_id = 1,
|
||||
};
|
||||
|
||||
static char *ftdi_chip_name[] = {
|
||||
|
@ -227,6 +227,7 @@ static struct usb_driver garmin_driver = {
|
||||
.probe = usb_serial_probe,
|
||||
.disconnect = usb_serial_disconnect,
|
||||
.id_table = id_table,
|
||||
.no_dynamic_id = 1,
|
||||
};
|
||||
|
||||
|
||||
|
@ -73,6 +73,7 @@ static struct usb_driver generic_driver = {
|
||||
.probe = generic_probe,
|
||||
.disconnect = usb_serial_disconnect,
|
||||
.id_table = generic_serial_ids,
|
||||
.no_dynamic_id = 1,
|
||||
};
|
||||
#endif
|
||||
|
||||
|
@ -42,6 +42,7 @@ static struct usb_driver hp49gp_driver = {
|
||||
.probe = usb_serial_probe,
|
||||
.disconnect = usb_serial_disconnect,
|
||||
.id_table = id_table,
|
||||
.no_dynamic_id = 1,
|
||||
};
|
||||
|
||||
static struct usb_serial_driver hp49gp_device = {
|
||||
|
@ -247,6 +247,7 @@ static struct usb_driver io_driver = {
|
||||
.probe = usb_serial_probe,
|
||||
.disconnect = usb_serial_disconnect,
|
||||
.id_table = id_table_combined,
|
||||
.no_dynamic_id = 1,
|
||||
};
|
||||
|
||||
/* function prototypes for all of our local functions */
|
||||
|
@ -221,6 +221,7 @@ static struct usb_driver io_driver = {
|
||||
.probe = usb_serial_probe,
|
||||
.disconnect = usb_serial_disconnect,
|
||||
.id_table = id_table_combined,
|
||||
.no_dynamic_id = 1,
|
||||
};
|
||||
|
||||
|
||||
|
@ -547,6 +547,7 @@ static struct usb_driver ipaq_driver = {
|
||||
.probe = usb_serial_probe,
|
||||
.disconnect = usb_serial_disconnect,
|
||||
.id_table = ipaq_id_table,
|
||||
.no_dynamic_id = 1,
|
||||
};
|
||||
|
||||
|
||||
|
@ -157,6 +157,7 @@ static struct usb_driver usb_ipw_driver = {
|
||||
.probe = usb_serial_probe,
|
||||
.disconnect = usb_serial_disconnect,
|
||||
.id_table = usb_ipw_ids,
|
||||
.no_dynamic_id = 1,
|
||||
};
|
||||
|
||||
static int debug;
|
||||
|
@ -130,6 +130,7 @@ static struct usb_driver ir_driver = {
|
||||
.probe = usb_serial_probe,
|
||||
.disconnect = usb_serial_disconnect,
|
||||
.id_table = id_table,
|
||||
.no_dynamic_id = 1,
|
||||
};
|
||||
|
||||
|
||||
|
@ -525,6 +525,7 @@ static struct usb_driver keyspan_driver = {
|
||||
.probe = usb_serial_probe,
|
||||
.disconnect = usb_serial_disconnect,
|
||||
.id_table = keyspan_ids_combined,
|
||||
.no_dynamic_id = 1,
|
||||
};
|
||||
|
||||
/* usb_device_id table for the pre-firmware download keyspan devices */
|
||||
|
@ -155,6 +155,7 @@ static struct usb_driver keyspan_pda_driver = {
|
||||
.probe = usb_serial_probe,
|
||||
.disconnect = usb_serial_disconnect,
|
||||
.id_table = id_table_combined,
|
||||
.no_dynamic_id = 1,
|
||||
};
|
||||
|
||||
static struct usb_device_id id_table_std [] = {
|
||||
|
@ -121,6 +121,7 @@ static struct usb_driver kl5kusb105d_driver = {
|
||||
.probe = usb_serial_probe,
|
||||
.disconnect = usb_serial_disconnect,
|
||||
.id_table = id_table,
|
||||
.no_dynamic_id = 1,
|
||||
};
|
||||
|
||||
static struct usb_serial_driver kl5kusb105d_device = {
|
||||
|
@ -102,6 +102,7 @@ static struct usb_driver kobil_driver = {
|
||||
.probe = usb_serial_probe,
|
||||
.disconnect = usb_serial_disconnect,
|
||||
.id_table = id_table,
|
||||
.no_dynamic_id = 1,
|
||||
};
|
||||
|
||||
|
||||
|
@ -130,6 +130,7 @@ static struct usb_driver mct_u232_driver = {
|
||||
.probe = usb_serial_probe,
|
||||
.disconnect = usb_serial_disconnect,
|
||||
.id_table = id_table_combined,
|
||||
.no_dynamic_id = 1,
|
||||
};
|
||||
|
||||
static struct usb_serial_driver mct_u232_device = {
|
||||
|
@ -85,6 +85,7 @@ static struct usb_driver omninet_driver = {
|
||||
.probe = usb_serial_probe,
|
||||
.disconnect = usb_serial_disconnect,
|
||||
.id_table = id_table,
|
||||
.no_dynamic_id = 1,
|
||||
};
|
||||
|
||||
|
||||
|
@ -100,6 +100,7 @@ static struct usb_driver option_driver = {
|
||||
.probe = usb_serial_probe,
|
||||
.disconnect = usb_serial_disconnect,
|
||||
.id_table = option_ids,
|
||||
.no_dynamic_id = 1,
|
||||
};
|
||||
|
||||
/* The card has three separate interfaces, wich the serial driver
|
||||
|
@ -87,6 +87,7 @@ static struct usb_driver pl2303_driver = {
|
||||
.probe = usb_serial_probe,
|
||||
.disconnect = usb_serial_disconnect,
|
||||
.id_table = id_table,
|
||||
.no_dynamic_id = 1,
|
||||
};
|
||||
|
||||
#define SET_LINE_REQUEST_TYPE 0x21
|
||||
|
@ -165,6 +165,7 @@ static struct usb_driver safe_driver = {
|
||||
.probe = usb_serial_probe,
|
||||
.disconnect = usb_serial_disconnect,
|
||||
.id_table = id_table,
|
||||
.no_dynamic_id = 1,
|
||||
};
|
||||
|
||||
static __u16 crc10_table[256] = {
|
||||
|
@ -253,6 +253,7 @@ static struct usb_driver ti_usb_driver = {
|
||||
.probe = usb_serial_probe,
|
||||
.disconnect = usb_serial_disconnect,
|
||||
.id_table = ti_id_table_combined,
|
||||
.no_dynamic_id = 1,
|
||||
};
|
||||
|
||||
static struct usb_serial_driver ti_1port_device = {
|
||||
|
@ -46,6 +46,7 @@ static struct usb_driver usb_serial_driver = {
|
||||
.name = "usbserial",
|
||||
.probe = usb_serial_probe,
|
||||
.disconnect = usb_serial_disconnect,
|
||||
.no_dynamic_id = 1,
|
||||
};
|
||||
|
||||
/* There is no MODULE_DEVICE_TABLE for usbserial.c. Instead
|
||||
|
@ -178,6 +178,7 @@ static struct usb_driver visor_driver = {
|
||||
.probe = usb_serial_probe,
|
||||
.disconnect = usb_serial_disconnect,
|
||||
.id_table = id_table_combined,
|
||||
.no_dynamic_id = 1,
|
||||
};
|
||||
|
||||
/* All of the device info needed for the Handspring Visor, and Palm 4.0 devices */
|
||||
|
@ -132,6 +132,7 @@ static struct usb_driver whiteheat_driver = {
|
||||
.probe = usb_serial_probe,
|
||||
.disconnect = usb_serial_disconnect,
|
||||
.id_table = id_table_combined,
|
||||
.no_dynamic_id = 1,
|
||||
};
|
||||
|
||||
/* function prototypes for the Connect Tech WhiteHEAT prerenumeration device */
|
||||
|
@ -561,6 +561,8 @@ struct usb_dynids {
|
||||
* @dynids: used internally to hold the list of dynamically added device
|
||||
* ids for this driver.
|
||||
* @driver: the driver model core driver structure.
|
||||
* @no_dynamic_id: if set to 1, the USB core will not allow dynamic ids to be
|
||||
* added to this driver by preventing the sysfs file from being created.
|
||||
*
|
||||
* USB drivers must provide a name, probe() and disconnect() methods,
|
||||
* and an id_table. Other driver fields are optional.
|
||||
@ -597,6 +599,7 @@ struct usb_driver {
|
||||
|
||||
struct usb_dynids dynids;
|
||||
struct device_driver driver;
|
||||
unsigned int no_dynamic_id:1;
|
||||
};
|
||||
#define to_usb_driver(d) container_of(d, struct usb_driver, driver)
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user