aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/usb/serial/mct_u232.c
diff options
context:
space:
mode:
authorOliver Neukum <oliver@neukum.org>2008-01-21 11:44:10 -0500
committerGreg Kroah-Hartman <gregkh@suse.de>2008-02-01 17:35:04 -0500
commite33fe4d86f91127f6f7d931ff59ed6cbda06e72b (patch)
tree7af352e8fc696220a06c6e2a9b9006a0ea5ee075 /drivers/usb/serial/mct_u232.c
parent004b4f2d4448cff7f13871c05d744b00a7c74d4a (diff)
USB: make sure usb serial drivers don't flush to logically disconnected devices
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>
Diffstat (limited to 'drivers/usb/serial/mct_u232.c')
-rw-r--r--drivers/usb/serial/mct_u232.c17
1 files changed, 9 insertions, 8 deletions
diff --git a/drivers/usb/serial/mct_u232.c b/drivers/usb/serial/mct_u232.c
index 88b2074867c5..fc1cea4aba13 100644
--- a/drivers/usb/serial/mct_u232.c
+++ b/drivers/usb/serial/mct_u232.c
@@ -487,21 +487,22 @@ error:
487static void mct_u232_close (struct usb_serial_port *port, struct file *filp) 487static void mct_u232_close (struct usb_serial_port *port, struct file *filp)
488{ 488{
489 unsigned int c_cflag; 489 unsigned int c_cflag;
490 unsigned long flags;
491 unsigned int control_state; 490 unsigned int control_state;
492 struct mct_u232_private *priv = usb_get_serial_port_data(port); 491 struct mct_u232_private *priv = usb_get_serial_port_data(port);
493 dbg("%s port %d", __FUNCTION__, port->number); 492 dbg("%s port %d", __FUNCTION__, port->number);
494 493
495 if (port->tty) { 494 if (port->tty) {
496 c_cflag = port->tty->termios->c_cflag; 495 c_cflag = port->tty->termios->c_cflag;
497 if (c_cflag & HUPCL) { 496 mutex_lock(&port->serial->disc_mutex);
498 /* drop DTR and RTS */ 497 if (c_cflag & HUPCL && !port->serial->disconnected) {
499 spin_lock_irqsave(&priv->lock, flags); 498 /* drop DTR and RTS */
500 priv->control_state &= ~(TIOCM_DTR | TIOCM_RTS); 499 spin_lock_irq(&priv->lock);
501 control_state = priv->control_state; 500 priv->control_state &= ~(TIOCM_DTR | TIOCM_RTS);
502 spin_unlock_irqrestore(&priv->lock, flags); 501 control_state = priv->control_state;
503 mct_u232_set_modem_ctrl(port->serial, control_state); 502 spin_unlock_irq(&priv->lock);
503 mct_u232_set_modem_ctrl(port->serial, control_state);
504 } 504 }
505 mutex_unlock(&port->serial->disc_mutex);
505 } 506 }
506 507
507 508