USB: usb-serial: call port_probe and port_remove at the right times
This patch (as1253) prevents the usb-serial core from calling a driver's port_probe and port_remove methods more than once per port. It also removes some unnecessary try_module_get() calls and adds a missing port_remove method call in a failure path. Signed-off-by: Alan Stern <stern@rowland.harvard.edu> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
c6994e6f06
commit
c706ebdfc8
@ -1046,10 +1046,15 @@ int usb_serial_probe(struct usb_interface *interface,
|
||||
|
||||
dev_set_name(&port->dev, "ttyUSB%d", port->number);
|
||||
dbg ("%s - registering %s", __func__, dev_name(&port->dev));
|
||||
port->dev_state = PORT_REGISTERING;
|
||||
retval = device_register(&port->dev);
|
||||
if (retval)
|
||||
if (retval) {
|
||||
dev_err(&port->dev, "Error registering port device, "
|
||||
"continuing\n");
|
||||
port->dev_state = PORT_UNREGISTERED;
|
||||
} else {
|
||||
port->dev_state = PORT_REGISTERED;
|
||||
}
|
||||
}
|
||||
|
||||
usb_serial_console_init(debug, minor);
|
||||
@ -1130,7 +1135,22 @@ void usb_serial_disconnect(struct usb_interface *interface)
|
||||
}
|
||||
kill_traffic(port);
|
||||
cancel_work_sync(&port->work);
|
||||
device_del(&port->dev);
|
||||
if (port->dev_state == PORT_REGISTERED) {
|
||||
|
||||
/* Make sure the port is bound so that the
|
||||
* driver's port_remove method is called.
|
||||
*/
|
||||
if (!port->dev.driver) {
|
||||
int rc;
|
||||
|
||||
port->dev.driver =
|
||||
&serial->type->driver;
|
||||
rc = device_bind_driver(&port->dev);
|
||||
}
|
||||
port->dev_state = PORT_UNREGISTERING;
|
||||
device_del(&port->dev);
|
||||
port->dev_state = PORT_UNREGISTERED;
|
||||
}
|
||||
}
|
||||
}
|
||||
serial->type->shutdown(serial);
|
||||
|
Reference in New Issue
Block a user