aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/char
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/char')
-rw-r--r--drivers/char/mxser.c45
1 files changed, 23 insertions, 22 deletions
diff --git a/drivers/char/mxser.c b/drivers/char/mxser.c
index dbf8d52f31d0..30544ca5e956 100644
--- a/drivers/char/mxser.c
+++ b/drivers/char/mxser.c
@@ -1073,34 +1073,17 @@ static void mxser_flush_buffer(struct tty_struct *tty)
1073} 1073}
1074 1074
1075 1075
1076/* 1076static void mxser_close_port(struct tty_struct *tty, struct tty_port *port)
1077 * This routine is called when the serial port gets closed. First, we
1078 * wait for the last remaining data to be sent. Then, we unlink its
1079 * async structure from the interrupt chain if necessary, and we free
1080 * that IRQ if nothing is left in the chain.
1081 */
1082static void mxser_close(struct tty_struct *tty, struct file *filp)
1083{ 1077{
1084 struct mxser_port *info = tty->driver_data; 1078 struct mxser_port *info = container_of(port, struct mxser_port, port);
1085 struct tty_port *port = &info->port;
1086
1087 unsigned long timeout; 1079 unsigned long timeout;
1088
1089 if (tty->index == MXSER_PORTS)
1090 return;
1091 if (!info)
1092 return;
1093
1094 if (tty_port_close_start(port, tty, filp) == 0)
1095 return;
1096
1097 /* 1080 /*
1098 * Save the termios structure, since this port may have 1081 * Save the termios structure, since this port may have
1099 * separate termios for callout and dialin. 1082 * separate termios for callout and dialin.
1100 * 1083 *
1101 * FIXME: Can this go ? 1084 * FIXME: Can this go ?
1102 */ 1085 */
1103 if (info->port.flags & ASYNC_NORMAL_ACTIVE) 1086 if (port->flags & ASYNC_NORMAL_ACTIVE)
1104 info->normal_termios = *tty->termios; 1087 info->normal_termios = *tty->termios;
1105 /* 1088 /*
1106 * At this point we stop accepting input. To do this, we 1089 * At this point we stop accepting input. To do this, we
@@ -1112,7 +1095,7 @@ static void mxser_close(struct tty_struct *tty, struct file *filp)
1112 if (info->board->chip_flag) 1095 if (info->board->chip_flag)
1113 info->IER &= ~MOXA_MUST_RECV_ISR; 1096 info->IER &= ~MOXA_MUST_RECV_ISR;
1114 1097
1115 if (info->port.flags & ASYNC_INITIALIZED) { 1098 if (port->flags & ASYNC_INITIALIZED) {
1116 outb(info->IER, info->ioaddr + UART_IER); 1099 outb(info->IER, info->ioaddr + UART_IER);
1117 /* 1100 /*
1118 * Before we drop DTR, make sure the UART transmitter 1101 * Before we drop DTR, make sure the UART transmitter
@@ -1127,8 +1110,26 @@ static void mxser_close(struct tty_struct *tty, struct file *filp)
1127 } 1110 }
1128 } 1111 }
1129 mxser_shutdown(tty); 1112 mxser_shutdown(tty);
1130 mxser_flush_buffer(tty);
1131 1113
1114}
1115
1116/*
1117 * This routine is called when the serial port gets closed. First, we
1118 * wait for the last remaining data to be sent. Then, we unlink its
1119 * async structure from the interrupt chain if necessary, and we free
1120 * that IRQ if nothing is left in the chain.
1121 */
1122static void mxser_close(struct tty_struct *tty, struct file *filp)
1123{
1124 struct mxser_port *info = tty->driver_data;
1125 struct tty_port *port = &info->port;
1126
1127 if (tty->index == MXSER_PORTS)
1128 return;
1129 if (tty_port_close_start(port, tty, filp) == 0)
1130 return;
1131 mxser_close_port(tty, port);
1132 mxser_flush_buffer(tty);
1132 /* Right now the tty_port set is done outside of the close_end helper 1133 /* Right now the tty_port set is done outside of the close_end helper
1133 as we don't yet have everyone using refcounts */ 1134 as we don't yet have everyone using refcounts */
1134 tty_port_close_end(port, tty); 1135 tty_port_close_end(port, tty);