diff options
Diffstat (limited to 'drivers/usb/serial/mct_u232.c')
-rw-r--r-- | drivers/usb/serial/mct_u232.c | 37 |
1 files changed, 19 insertions, 18 deletions
diff --git a/drivers/usb/serial/mct_u232.c b/drivers/usb/serial/mct_u232.c index 82930a7d5093..873795548fc0 100644 --- a/drivers/usb/serial/mct_u232.c +++ b/drivers/usb/serial/mct_u232.c | |||
@@ -95,8 +95,8 @@ static int mct_u232_startup(struct usb_serial *serial); | |||
95 | static void mct_u232_shutdown(struct usb_serial *serial); | 95 | static void mct_u232_shutdown(struct usb_serial *serial); |
96 | static int mct_u232_open(struct tty_struct *tty, | 96 | static int mct_u232_open(struct tty_struct *tty, |
97 | struct usb_serial_port *port, struct file *filp); | 97 | struct usb_serial_port *port, struct file *filp); |
98 | static void mct_u232_close(struct tty_struct *tty, | 98 | static void mct_u232_close(struct usb_serial_port *port); |
99 | struct usb_serial_port *port, struct file *filp); | 99 | static void mct_u232_dtr_rts(struct usb_serial_port *port, int on); |
100 | static void mct_u232_read_int_callback(struct urb *urb); | 100 | static void mct_u232_read_int_callback(struct urb *urb); |
101 | static void mct_u232_set_termios(struct tty_struct *tty, | 101 | static void mct_u232_set_termios(struct tty_struct *tty, |
102 | struct usb_serial_port *port, struct ktermios *old); | 102 | struct usb_serial_port *port, struct ktermios *old); |
@@ -140,6 +140,7 @@ static struct usb_serial_driver mct_u232_device = { | |||
140 | .num_ports = 1, | 140 | .num_ports = 1, |
141 | .open = mct_u232_open, | 141 | .open = mct_u232_open, |
142 | .close = mct_u232_close, | 142 | .close = mct_u232_close, |
143 | .dtr_rts = mct_u232_dtr_rts, | ||
143 | .throttle = mct_u232_throttle, | 144 | .throttle = mct_u232_throttle, |
144 | .unthrottle = mct_u232_unthrottle, | 145 | .unthrottle = mct_u232_unthrottle, |
145 | .read_int_callback = mct_u232_read_int_callback, | 146 | .read_int_callback = mct_u232_read_int_callback, |
@@ -496,29 +497,29 @@ error: | |||
496 | return retval; | 497 | return retval; |
497 | } /* mct_u232_open */ | 498 | } /* mct_u232_open */ |
498 | 499 | ||
499 | 500 | static void mct_u232_dtr_rts(struct usb_serial_port *port, int on) | |
500 | static void mct_u232_close(struct tty_struct *tty, | ||
501 | struct usb_serial_port *port, struct file *filp) | ||
502 | { | 501 | { |
503 | unsigned int c_cflag; | ||
504 | unsigned int control_state; | 502 | unsigned int control_state; |
505 | struct mct_u232_private *priv = usb_get_serial_port_data(port); | 503 | struct mct_u232_private *priv = usb_get_serial_port_data(port); |
506 | dbg("%s port %d", __func__, port->number); | ||
507 | 504 | ||
508 | if (tty) { | 505 | mutex_lock(&port->serial->disc_mutex); |
509 | c_cflag = tty->termios->c_cflag; | 506 | if (!port->serial->disconnected) { |
510 | mutex_lock(&port->serial->disc_mutex); | 507 | /* drop DTR and RTS */ |
511 | if (c_cflag & HUPCL && !port->serial->disconnected) { | 508 | spin_lock_irq(&priv->lock); |
512 | /* drop DTR and RTS */ | 509 | if (on) |
513 | spin_lock_irq(&priv->lock); | 510 | priv->control_state |= TIOCM_DTR | TIOCM_RTS; |
511 | else | ||
514 | priv->control_state &= ~(TIOCM_DTR | TIOCM_RTS); | 512 | priv->control_state &= ~(TIOCM_DTR | TIOCM_RTS); |
515 | control_state = priv->control_state; | 513 | control_state = priv->control_state; |
516 | spin_unlock_irq(&priv->lock); | 514 | spin_unlock_irq(&priv->lock); |
517 | mct_u232_set_modem_ctrl(port->serial, control_state); | 515 | mct_u232_set_modem_ctrl(port->serial, control_state); |
518 | } | ||
519 | mutex_unlock(&port->serial->disc_mutex); | ||
520 | } | 516 | } |
517 | mutex_unlock(&port->serial->disc_mutex); | ||
518 | } | ||
521 | 519 | ||
520 | static void mct_u232_close(struct usb_serial_port *port) | ||
521 | { | ||
522 | dbg("%s port %d", __func__, port->number); | ||
522 | 523 | ||
523 | if (port->serial->dev) { | 524 | if (port->serial->dev) { |
524 | /* shutdown our urbs */ | 525 | /* shutdown our urbs */ |