Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 46679
b: refs/heads/master
c: 4b10f0f
h: refs/heads/master
i:
  46677: 1f859f1
  46675: 673ccdc
  46671: e8a1635
v: v3
  • Loading branch information
Oliver Neukum authored and Greg Kroah-Hartman committed Feb 7, 2007
1 parent 483431d commit 416bdaa
Show file tree
Hide file tree
Showing 2 changed files with 13 additions and 3 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 34ef50e5b1f96c2d8c0f3d28b7d407743806256c
refs/heads/master: 4b10f0f3a0d4caa8b615cd1f770a70912967a3cd
14 changes: 12 additions & 2 deletions trunk/drivers/usb/serial/usb-serial.c
Original file line number Diff line number Diff line change
Expand Up @@ -685,14 +685,17 @@ int usb_serial_probe(struct usb_interface *interface,
int num_ports = 0;
int max_endpoints;

lock_kernel(); /* guard against unloading a serial driver module */
type = search_serial_device(interface);
if (!type) {
unlock_kernel();
dbg("none matched");
return -ENODEV;
}

serial = create_serial (dev, interface, type);
if (!serial) {
unlock_kernel();
dev_err(&interface->dev, "%s - out of memory\n", __FUNCTION__);
return -ENOMEM;
}
Expand All @@ -702,6 +705,7 @@ int usb_serial_probe(struct usb_interface *interface,
const struct usb_device_id *id;

if (!try_module_get(type->driver.owner)) {
unlock_kernel();
dev_err(&interface->dev, "module get failed, exiting\n");
kfree (serial);
return -EIO;
Expand All @@ -712,6 +716,7 @@ int usb_serial_probe(struct usb_interface *interface,
module_put(type->driver.owner);

if (retval) {
unlock_kernel();
dbg ("sub driver rejected device");
kfree (serial);
return retval;
Expand Down Expand Up @@ -781,6 +786,7 @@ int usb_serial_probe(struct usb_interface *interface,
* properly during a later invocation of usb_serial_probe
*/
if (num_bulk_in == 0 || num_bulk_out == 0) {
unlock_kernel();
dev_info(&interface->dev, "PL-2303 hack: descriptors matched but endpoints did not\n");
kfree (serial);
return -ENODEV;
Expand All @@ -796,6 +802,7 @@ int usb_serial_probe(struct usb_interface *interface,
if (type == &usb_serial_generic_device) {
num_ports = num_bulk_out;
if (num_ports == 0) {
unlock_kernel();
dev_err(&interface->dev, "Generic device with no bulk out, not allowed.\n");
kfree (serial);
return -EIO;
Expand All @@ -806,6 +813,7 @@ int usb_serial_probe(struct usb_interface *interface,
/* if this device type has a calc_num_ports function, call it */
if (type->calc_num_ports) {
if (!try_module_get(type->driver.owner)) {
unlock_kernel();
dev_err(&interface->dev, "module get failed, exiting\n");
kfree (serial);
return -EIO;
Expand All @@ -831,6 +839,8 @@ int usb_serial_probe(struct usb_interface *interface,
max_endpoints = max(max_endpoints, num_interrupt_out);
max_endpoints = max(max_endpoints, (int)serial->num_ports);
serial->num_port_pointers = max_endpoints;
unlock_kernel();

dbg("%s - setting up %d port structures for this device", __FUNCTION__, max_endpoints);
for (i = 0; i < max_endpoints; ++i) {
port = kzalloc(sizeof(struct usb_serial_port), GFP_KERNEL);
Expand Down Expand Up @@ -1187,7 +1197,7 @@ static void fixup_generic(struct usb_serial_driver *device)
set_to_generic_if_null(device, shutdown);
}

int usb_serial_register(struct usb_serial_driver *driver)
int usb_serial_register(struct usb_serial_driver *driver) /* must be called with BKL held */
{
int retval;

Expand All @@ -1211,7 +1221,7 @@ int usb_serial_register(struct usb_serial_driver *driver)
}


void usb_serial_deregister(struct usb_serial_driver *device)
void usb_serial_deregister(struct usb_serial_driver *device) /* must be called with BKL held */
{
info("USB Serial deregistering driver %s", device->description);
list_del(&device->driver_list);
Expand Down

0 comments on commit 416bdaa

Please sign in to comment.