diff options
author | Alan Stern <stern@rowland.harvard.edu> | 2009-05-27 11:25:52 -0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2009-05-28 13:54:43 -0700 |
commit | 0a3c8549ea7e94d74a41096d42bc6cdf43d183bf (patch) | |
tree | d3f09b0bbc2ad2b21b7b7458986c10e01aae490b /drivers/usb/serial/usb-serial.c | |
parent | 0afb20e00b5053170c85298fed842b32d20b4ea9 (diff) | |
download | kernel_samsung_aries-0a3c8549ea7e94d74a41096d42bc6cdf43d183bf.zip kernel_samsung_aries-0a3c8549ea7e94d74a41096d42bc6cdf43d183bf.tar.gz kernel_samsung_aries-0a3c8549ea7e94d74a41096d42bc6cdf43d183bf.tar.bz2 |
usb-serial: fix crash when sub-driver updates firmware
This patch (as1244) fixes a crash in usb-serial that occurs when a
sub-driver returns a positive value from its attach method, indicating
that new firmware was loaded and the device will disconnect and
reconnect. The usb-serial core then skips the step of registering the
port devices; when the disconnect occurs, the attempt to unregister
the ports fails dramatically.
This problem shows up with Keyspan devices and it might affect others
as well.
When the attach method returns a positive value, the patch sets
num_ports to 0. This tells usb_serial_disconnect() not to try
unregistering any of the ports; instead they are cleaned up by
destroy_serial().
Signed-off-by: Alan Stern <stern@rowland.harvard.edu>
Tested-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Cc: stable <stable@kernel.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'drivers/usb/serial/usb-serial.c')
-rw-r--r-- | drivers/usb/serial/usb-serial.c | 1 |
1 files changed, 1 insertions, 0 deletions
diff --git a/drivers/usb/serial/usb-serial.c b/drivers/usb/serial/usb-serial.c index 0a566ee..f331e2b 100644 --- a/drivers/usb/serial/usb-serial.c +++ b/drivers/usb/serial/usb-serial.c @@ -974,6 +974,7 @@ int usb_serial_probe(struct usb_interface *interface, if (retval > 0) { /* quietly accept this device, but don't bind to a serial port as it's about to disappear */ + serial->num_ports = 0; goto exit; } } |