diff options
author | Ian Jackson <ian.jackson@eu.citrix.com> | 2009-11-18 05:08:11 -0500 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2009-12-11 18:18:05 -0500 |
commit | 68cb4f8e246bbbc649980be0628cae9265870a91 (patch) | |
tree | ac21578ae76e640af2584726a80c20673f25ef1a /drivers/serial | |
parent | 7e11a0fb3b7ab83871b7a56c7a67c603283ec4b9 (diff) |
Serial: Do not read IIR in serial8250_start_tx when UART_BUG_TXEN
Do not read IIR in serial8250_start_tx when UART_BUG_TXEN
Reading the IIR clears some oustanding interrupts so it is not safe.
Instead, simply transmit immediately if the buffer is empty without
regard to IIR.
Signed-off-by: Ian Jackson <ian.jackson@eu.citrix.com>
Reviewed-by: Markus Armbruster <armbru@redhat.com>
Reviewed-by: Jiri Kosina <jkosina@suse.cz>
Cc: Alan Cox <alan@linux.intel.com>
Cc: stable <stable@kernel.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'drivers/serial')
-rw-r--r-- | drivers/serial/8250.c | 8 |
1 files changed, 3 insertions, 5 deletions
diff --git a/drivers/serial/8250.c b/drivers/serial/8250.c index b75e63e9d1ee..c3e37c8e7e26 100644 --- a/drivers/serial/8250.c +++ b/drivers/serial/8250.c | |||
@@ -1339,14 +1339,12 @@ static void serial8250_start_tx(struct uart_port *port) | |||
1339 | serial_out(up, UART_IER, up->ier); | 1339 | serial_out(up, UART_IER, up->ier); |
1340 | 1340 | ||
1341 | if (up->bugs & UART_BUG_TXEN) { | 1341 | if (up->bugs & UART_BUG_TXEN) { |
1342 | unsigned char lsr, iir; | 1342 | unsigned char lsr; |
1343 | lsr = serial_in(up, UART_LSR); | 1343 | lsr = serial_in(up, UART_LSR); |
1344 | up->lsr_saved_flags |= lsr & LSR_SAVE_FLAGS; | 1344 | up->lsr_saved_flags |= lsr & LSR_SAVE_FLAGS; |
1345 | iir = serial_in(up, UART_IIR) & 0x0f; | ||
1346 | if ((up->port.type == PORT_RM9000) ? | 1345 | if ((up->port.type == PORT_RM9000) ? |
1347 | (lsr & UART_LSR_THRE && | 1346 | (lsr & UART_LSR_THRE) : |
1348 | (iir == UART_IIR_NO_INT || iir == UART_IIR_THRI)) : | 1347 | (lsr & UART_LSR_TEMT)) |
1349 | (lsr & UART_LSR_TEMT && iir & UART_IIR_NO_INT)) | ||
1350 | transmit_chars(up); | 1348 | transmit_chars(up); |
1351 | } | 1349 | } |
1352 | } | 1350 | } |