| From e44aabd649c80e8be16ede3ed3cbff6fb2561ca9 Mon Sep 17 00:00:00 2001 |
| From: Marcus Folkesson <marcus.folkesson@gmail.com> |
| Date: Tue, 30 Aug 2011 13:53:10 +0200 |
| Subject: serial: pxa: work around for errata #20 |
| |
| From: Marcus Folkesson <marcus.folkesson@gmail.com> |
| |
| commit e44aabd649c80e8be16ede3ed3cbff6fb2561ca9 upstream. |
| |
| Errata E20: UART: Character Timeout interrupt remains set under certain |
| software conditions. |
| |
| Implication: The software servicing the UART can be trapped in an infinite loop. |
| |
| Signed-off-by: Marcus Folkesson <marcus.folkesson@gmail.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| --- |
| drivers/tty/serial/pxa.c | 20 ++++++++++++++++++++ |
| 1 file changed, 20 insertions(+) |
| |
| --- a/drivers/tty/serial/pxa.c |
| +++ b/drivers/tty/serial/pxa.c |
| @@ -100,6 +100,16 @@ static inline void receive_chars(struct |
| int max_count = 256; |
| |
| do { |
| + /* work around Errata #20 according to |
| + * Intel(R) PXA27x Processor Family |
| + * Specification Update (May 2005) |
| + * |
| + * Step 2 |
| + * Disable the Reciever Time Out Interrupt via IER[RTOEI] |
| + */ |
| + up->ier &= ~UART_IER_RTOIE; |
| + serial_out(up, UART_IER, up->ier); |
| + |
| ch = serial_in(up, UART_RX); |
| flag = TTY_NORMAL; |
| up->port.icount.rx++; |
| @@ -156,6 +166,16 @@ static inline void receive_chars(struct |
| *status = serial_in(up, UART_LSR); |
| } while ((*status & UART_LSR_DR) && (max_count-- > 0)); |
| tty_flip_buffer_push(tty); |
| + |
| + /* work around Errata #20 according to |
| + * Intel(R) PXA27x Processor Family |
| + * Specification Update (May 2005) |
| + * |
| + * Step 6: |
| + * No more data in FIFO: Re-enable RTO interrupt via IER[RTOIE] |
| + */ |
| + up->ier |= UART_IER_RTOIE; |
| + serial_out(up, UART_IER, up->ier); |
| } |
| |
| static void transmit_chars(struct uart_pxa_port *up) |