|
@@ -1868,6 +1868,7 @@ static int serial8250_startup(struct uart_port *port)
|
|
|
}
|
|
|
|
|
|
if (is_real_interrupt(up->port.irq)) {
|
|
|
+ unsigned char iir1;
|
|
|
/*
|
|
|
* Test for UARTs that do not reassert THRE when the
|
|
|
* transmitter is idle and the interrupt has already
|
|
@@ -1881,7 +1882,7 @@ static int serial8250_startup(struct uart_port *port)
|
|
|
wait_for_xmitr(up, UART_LSR_THRE);
|
|
|
serial_out_sync(up, UART_IER, UART_IER_THRI);
|
|
|
udelay(1); /* allow THRE to set */
|
|
|
- serial_in(up, UART_IIR);
|
|
|
+ iir1 = serial_in(up, UART_IIR);
|
|
|
serial_out(up, UART_IER, 0);
|
|
|
serial_out_sync(up, UART_IER, UART_IER_THRI);
|
|
|
udelay(1); /* allow a working UART time to re-assert THRE */
|
|
@@ -1894,7 +1895,7 @@ static int serial8250_startup(struct uart_port *port)
|
|
|
* If the interrupt is not reasserted, setup a timer to
|
|
|
* kick the UART on a regular basis.
|
|
|
*/
|
|
|
- if (iir & UART_IIR_NO_INT) {
|
|
|
+ if (!(iir1 & UART_IIR_NO_INT) && (iir & UART_IIR_NO_INT)) {
|
|
|
pr_debug("ttyS%d - using backup timer\n", port->line);
|
|
|
up->timer.function = serial8250_backup_timeout;
|
|
|
up->timer.data = (unsigned long)up;
|