diff options
Diffstat (limited to 'drivers/usb/serial/mct_u232.c')
-rw-r--r-- | drivers/usb/serial/mct_u232.c | 50 |
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 | */ |
94 | static int mct_u232_startup(struct usb_serial *serial); | 94 | static int mct_u232_startup(struct usb_serial *serial); |
95 | static void mct_u232_shutdown(struct usb_serial *serial); | 95 | static void mct_u232_release(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, |
@@ -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 | ||
409 | static void mct_u232_shutdown(struct usb_serial *serial) | 410 | static 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 | ||
426 | static int mct_u232_open(struct tty_struct *tty, | 424 | static 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 | 497 | 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 | { | 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 | ||
517 | static 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 */ |