USB: kl5kusb105 don't flush to logically disconnected devices
authorOliver Neukum <oliver@neukum.org>
Tue, 22 Jan 2008 11:47:15 +0000 (12:47 +0100)
committerGreg Kroah-Hartman <gregkh@suse.de>
Fri, 1 Feb 2008 22:35:05 +0000 (14:35 -0800)
If disconnect() is called for a logical disconnect, no more IO must be
done after disconnect() returns, or the old and new drivers may conflict.
This patch avoids this by using the flag and lock introduced by the earlier
patch for the mos7720 driver.

Signed-off-by: Oliver Neukum <oneukum@suse.de>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
drivers/usb/serial/kl5kusb105.c

index 90e3216abd1f006800f0d2ed018a83c12a9b5cc0..55736df7d2f4ed0232d2c33700d353a47336cafe 100644 (file)
@@ -461,17 +461,21 @@ static void klsi_105_close (struct usb_serial_port *port, struct file *filp)
 
        dbg("%s port %d", __FUNCTION__, port->number);
 
-       /* send READ_OFF */
-       rc = usb_control_msg (port->serial->dev,
-                             usb_sndctrlpipe(port->serial->dev, 0),
-                             KL5KUSB105A_SIO_CONFIGURE,
-                             USB_TYPE_VENDOR | USB_DIR_OUT,
-                             KL5KUSB105A_SIO_CONFIGURE_READ_OFF,
-                             0, /* index */
-                             NULL, 0,
-                             KLSI_TIMEOUT);
-       if (rc < 0)
-                   err("Disabling read failed (error = %d)", rc);
+       mutex_lock(&port->serial->disc_mutex);
+       if (!port->serial->disconnected) {
+               /* send READ_OFF */
+               rc = usb_control_msg (port->serial->dev,
+                                     usb_sndctrlpipe(port->serial->dev, 0),
+                                     KL5KUSB105A_SIO_CONFIGURE,
+                                     USB_TYPE_VENDOR | USB_DIR_OUT,
+                                     KL5KUSB105A_SIO_CONFIGURE_READ_OFF,
+                                     0, /* index */
+                                     NULL, 0,
+                                     KLSI_TIMEOUT);
+               if (rc < 0)
+                       err("Disabling read failed (error = %d)", rc);
+       }
+       mutex_unlock(&port->serial->disc_mutex);
 
        /* shutdown our bulk reads and writes */
        usb_kill_urb(port->write_urb);