aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/usb/serial/ftdi_sio.c
diff options
context:
space:
mode:
authorAlan Stern <stern@rowland.harvard.edu>2009-06-02 11:53:55 -0400
committerGreg Kroah-Hartman <gregkh@suse.de>2009-06-16 00:44:47 -0400
commitf9c99bb8b3a1ec81af68d484a551307326c2e933 (patch)
tree9031ebe390ecd558d54ad484dde5ba66dcf823b7 /drivers/usb/serial/ftdi_sio.c
parentc706ebdfc8955b850e477255a8c0f93f9f14712d (diff)
USB: usb-serial: replace shutdown with disconnect, release
This patch (as1254) splits up the shutdown method of usb_serial_driver into a disconnect and a release method. The problem is that the usb-serial core was calling shutdown during disconnect handling, but drivers didn't expect it to be called until after all the open file references had been closed. The result was an oops when the close method tried to use memory that had been deallocated by shutdown. Signed-off-by: Alan Stern <stern@rowland.harvard.edu> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'drivers/usb/serial/ftdi_sio.c')
-rw-r--r--drivers/usb/serial/ftdi_sio.c14
1 files changed, 0 insertions, 14 deletions
diff --git a/drivers/usb/serial/ftdi_sio.c b/drivers/usb/serial/ftdi_sio.c
index fc423583eede..3dc3768ca71c 100644
--- a/drivers/usb/serial/ftdi_sio.c
+++ b/drivers/usb/serial/ftdi_sio.c
@@ -720,7 +720,6 @@ static const char *ftdi_chip_name[] = {
720/* function prototypes for a FTDI serial converter */ 720/* function prototypes for a FTDI serial converter */
721static int ftdi_sio_probe(struct usb_serial *serial, 721static int ftdi_sio_probe(struct usb_serial *serial,
722 const struct usb_device_id *id); 722 const struct usb_device_id *id);
723static void ftdi_shutdown(struct usb_serial *serial);
724static int ftdi_sio_port_probe(struct usb_serial_port *port); 723static int ftdi_sio_port_probe(struct usb_serial_port *port);
725static int ftdi_sio_port_remove(struct usb_serial_port *port); 724static int ftdi_sio_port_remove(struct usb_serial_port *port);
726static int ftdi_open(struct tty_struct *tty, 725static int ftdi_open(struct tty_struct *tty,
@@ -779,7 +778,6 @@ static struct usb_serial_driver ftdi_sio_device = {
779 .ioctl = ftdi_ioctl, 778 .ioctl = ftdi_ioctl,
780 .set_termios = ftdi_set_termios, 779 .set_termios = ftdi_set_termios,
781 .break_ctl = ftdi_break_ctl, 780 .break_ctl = ftdi_break_ctl,
782 .shutdown = ftdi_shutdown,
783}; 781};
784 782
785 783
@@ -1594,18 +1592,6 @@ static int ftdi_mtxorb_hack_setup(struct usb_serial *serial)
1594 return 0; 1592 return 0;
1595} 1593}
1596 1594
1597/* ftdi_shutdown is called from usbserial:usb_serial_disconnect
1598 * it is called when the usb device is disconnected
1599 *
1600 * usbserial:usb_serial_disconnect
1601 * calls __serial_close for each open of the port
1602 * shutdown is called then (ie ftdi_shutdown)
1603 */
1604static void ftdi_shutdown(struct usb_serial *serial)
1605{
1606 dbg("%s", __func__);
1607}
1608
1609static void ftdi_sio_priv_release(struct kref *k) 1595static void ftdi_sio_priv_release(struct kref *k)
1610{ 1596{
1611 struct ftdi_private *priv = container_of(k, struct ftdi_private, kref); 1597 struct ftdi_private *priv = container_of(k, struct ftdi_private, kref);