aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/usb/serial/mct_u232.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/usb/serial/mct_u232.c')
-rw-r--r--drivers/usb/serial/mct_u232.c50
1 files changed, 24 insertions, 26 deletions
diff --git a/drivers/usb/serial/mct_u232.c b/drivers/usb/serial/mct_u232.c
index 82930a7d5093..d8825e159aa5 100644
--- a/drivers/usb/serial/mct_u232.c
+++ b/drivers/usb/serial/mct_u232.c
@@ -92,11 +92,11 @@ static int debug;
92 * Function prototypes 92 * Function prototypes
93 */ 93 */
94static int mct_u232_startup(struct usb_serial *serial); 94static int mct_u232_startup(struct usb_serial *serial);
95static void mct_u232_shutdown(struct usb_serial *serial); 95static void mct_u232_release(struct usb_serial *serial);
96static int mct_u232_open(struct tty_struct *tty, 96static 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);
98static void mct_u232_close(struct tty_struct *tty, 98static void mct_u232_close(struct usb_serial_port *port);
99 struct usb_serial_port *port, struct file *filp); 99static void mct_u232_dtr_rts(struct usb_serial_port *port, int on);
100static void mct_u232_read_int_callback(struct urb *urb); 100static void mct_u232_read_int_callback(struct urb *urb);
101static void mct_u232_set_termios(struct tty_struct *tty, 101static 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,
@@ -148,7 +149,7 @@ static struct usb_serial_driver mct_u232_device = {
148 .tiocmget = mct_u232_tiocmget, 149 .tiocmget = mct_u232_tiocmget,
149 .tiocmset = mct_u232_tiocmset, 150 .tiocmset = mct_u232_tiocmset,
150 .attach = mct_u232_startup, 151 .attach = mct_u232_startup,
151 .shutdown = mct_u232_shutdown, 152 .release = mct_u232_release,
152}; 153};
153 154
154 155
@@ -406,7 +407,7 @@ static int mct_u232_startup(struct usb_serial *serial)
406} /* mct_u232_startup */ 407} /* mct_u232_startup */
407 408
408 409
409static void mct_u232_shutdown(struct usb_serial *serial) 410static void mct_u232_release(struct usb_serial *serial)
410{ 411{
411 struct mct_u232_private *priv; 412 struct mct_u232_private *priv;
412 int i; 413 int i;
@@ -416,12 +417,9 @@ static void mct_u232_shutdown(struct usb_serial *serial)
416 for (i = 0; i < serial->num_ports; ++i) { 417 for (i = 0; i < serial->num_ports; ++i) {
417 /* My special items, the standard routines free my urbs */ 418 /* My special items, the standard routines free my urbs */
418 priv = usb_get_serial_port_data(serial->port[i]); 419 priv = usb_get_serial_port_data(serial->port[i]);
419 if (priv) { 420 kfree(priv);
420 usb_set_serial_port_data(serial->port[i], NULL);
421 kfree(priv);
422 }
423 } 421 }
424} /* mct_u232_shutdown */ 422} /* mct_u232_release */
425 423
426static int mct_u232_open(struct tty_struct *tty, 424static int mct_u232_open(struct tty_struct *tty,
427 struct usb_serial_port *port, struct file *filp) 425 struct usb_serial_port *port, struct file *filp)
@@ -496,29 +494,29 @@ error:
496 return retval; 494 return retval;
497} /* mct_u232_open */ 495} /* mct_u232_open */
498 496
499 497static void mct_u232_dtr_rts(struct usb_serial_port *port, int on)
500static void mct_u232_close(struct tty_struct *tty,
501 struct usb_serial_port *port, struct file *filp)
502{ 498{
503 unsigned int c_cflag;
504 unsigned int control_state; 499 unsigned int control_state;
505 struct mct_u232_private *priv = usb_get_serial_port_data(port); 500 struct mct_u232_private *priv = usb_get_serial_port_data(port);
506 dbg("%s port %d", __func__, port->number);
507 501
508 if (tty) { 502 mutex_lock(&port->serial->disc_mutex);
509 c_cflag = tty->termios->c_cflag; 503 if (!port->serial->disconnected) {
510 mutex_lock(&port->serial->disc_mutex); 504 /* drop DTR and RTS */
511 if (c_cflag & HUPCL && !port->serial->disconnected) { 505 spin_lock_irq(&priv->lock);
512 /* drop DTR and RTS */ 506 if (on)
513 spin_lock_irq(&priv->lock); 507 priv->control_state |= TIOCM_DTR | TIOCM_RTS;
508 else
514 priv->control_state &= ~(TIOCM_DTR | TIOCM_RTS); 509 priv->control_state &= ~(TIOCM_DTR | TIOCM_RTS);
515 control_state = priv->control_state; 510 control_state = priv->control_state;
516 spin_unlock_irq(&priv->lock); 511 spin_unlock_irq(&priv->lock);
517 mct_u232_set_modem_ctrl(port->serial, control_state); 512 mct_u232_set_modem_ctrl(port->serial, control_state);
518 }
519 mutex_unlock(&port->serial->disc_mutex);
520 } 513 }
514 mutex_unlock(&port->serial->disc_mutex);
515}
521 516
517static void mct_u232_close(struct usb_serial_port *port)
518{
519 dbg("%s port %d", __func__, port->number);
522 520
523 if (port->serial->dev) { 521 if (port->serial->dev) {
524 /* shutdown our urbs */ 522 /* shutdown our urbs */