|
@@ -993,21 +993,24 @@ static void autoconfig_irq(struct uart_8250_port *up)
|
|
|
up->port.irq = (irq > 0) ? irq : 0;
|
|
|
}
|
|
|
|
|
|
+static inline void __stop_tx(struct uart_8250_port *p)
|
|
|
+{
|
|
|
+ if (p->ier & UART_IER_THRI) {
|
|
|
+ p->ier &= ~UART_IER_THRI;
|
|
|
+ serial_out(p, UART_IER, p->ier);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
static void serial8250_stop_tx(struct uart_port *port, unsigned int tty_stop)
|
|
|
{
|
|
|
struct uart_8250_port *up = (struct uart_8250_port *)port;
|
|
|
|
|
|
- if (up->ier & UART_IER_THRI) {
|
|
|
- up->ier &= ~UART_IER_THRI;
|
|
|
- serial_out(up, UART_IER, up->ier);
|
|
|
- }
|
|
|
+ __stop_tx(up);
|
|
|
|
|
|
/*
|
|
|
- * We only do this from uart_stop - if we run out of
|
|
|
- * characters to send, we don't want to prevent the
|
|
|
- * FIFO from emptying.
|
|
|
+ * We really want to stop the transmitter from sending.
|
|
|
*/
|
|
|
- if (up->port.type == PORT_16C950 && tty_stop) {
|
|
|
+ if (up->port.type == PORT_16C950) {
|
|
|
up->acr |= UART_ACR_TXDIS;
|
|
|
serial_icr_write(up, UART_ACR, up->acr);
|
|
|
}
|
|
@@ -1031,10 +1034,11 @@ static void serial8250_start_tx(struct uart_port *port, unsigned int tty_start)
|
|
|
transmit_chars(up);
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
/*
|
|
|
- * We only do this from uart_start
|
|
|
+ * Re-enable the transmitter if we disabled it.
|
|
|
*/
|
|
|
- if (tty_start && up->port.type == PORT_16C950) {
|
|
|
+ if (up->port.type == PORT_16C950 && up->acr & UART_ACR_TXDIS) {
|
|
|
up->acr &= ~UART_ACR_TXDIS;
|
|
|
serial_icr_write(up, UART_ACR, up->acr);
|
|
|
}
|
|
@@ -1155,7 +1159,7 @@ static _INLINE_ void transmit_chars(struct uart_8250_port *up)
|
|
|
return;
|
|
|
}
|
|
|
if (uart_circ_empty(xmit) || uart_tx_stopped(&up->port)) {
|
|
|
- serial8250_stop_tx(&up->port, 0);
|
|
|
+ __stop_tx(up);
|
|
|
return;
|
|
|
}
|
|
|
|
|
@@ -1174,7 +1178,7 @@ static _INLINE_ void transmit_chars(struct uart_8250_port *up)
|
|
|
DEBUG_INTR("THRE...");
|
|
|
|
|
|
if (uart_circ_empty(xmit))
|
|
|
- serial8250_stop_tx(&up->port, 0);
|
|
|
+ __stop_tx(up);
|
|
|
}
|
|
|
|
|
|
static _INLINE_ void check_modem_status(struct uart_8250_port *up)
|