| From 955d6b2ede1041858602dacb15c624bf8aa325f8 Mon Sep 17 00:00:00 2001 |
| From: Paul Gortmaker <paul.gortmaker@windriver.com> |
| Date: Sun, 4 Dec 2011 18:42:19 -0500 |
| Subject: serial: clean up parameter passing for 8250 Rx IRQ handling |
| |
| The receive_chars() was taking a pointer to a passed in LSR value |
| in status and knocking off bits as it processed them. But since |
| receive_chars isn't returning a value, we can instead pass in |
| a normal non-pointer value for LSR, and simply return the |
| residual (unprocessed) LSR once it is done. |
| |
| The value in this cleanup, is that it clarifies the API of the |
| receive_chars prior to exporting it to other 8250-like drivers |
| for shared usage. |
| |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| Acked-by: Alan Cox <alan@linux.intel.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| (cherry picked from commit 0690f41fddd285c3473e4af2a42d15bce7ff3e68) |
| |
| Signed-off-by: Simon Horman <horms@verge.net.au> |
| --- |
| drivers/tty/serial/8250.c | 17 +++++++++++------ |
| 1 file changed, 11 insertions(+), 6 deletions(-) |
| |
| diff --git a/drivers/tty/serial/8250.c b/drivers/tty/serial/8250.c |
| index 4a60d74..fbcd8a5 100644 |
| --- a/drivers/tty/serial/8250.c |
| +++ b/drivers/tty/serial/8250.c |
| @@ -1375,11 +1375,16 @@ static void clear_rx_fifo(struct uart_8250_port *up) |
| } while (1); |
| } |
| |
| -static void |
| -receive_chars(struct uart_8250_port *up, unsigned int *status) |
| +/* |
| + * receive_chars: processes according to the passed in LSR |
| + * value, and returns the remaining LSR bits not handled |
| + * by this Rx routine. |
| + */ |
| +static unsigned char |
| +receive_chars(struct uart_8250_port *up, unsigned char lsr) |
| { |
| struct tty_struct *tty = up->port.state->port.tty; |
| - unsigned char ch, lsr = *status; |
| + unsigned char ch; |
| int max_count = 256; |
| char flag; |
| |
| @@ -1455,7 +1460,7 @@ ignore_char: |
| spin_unlock(&up->port.lock); |
| tty_flip_buffer_push(tty); |
| spin_lock(&up->port.lock); |
| - *status = lsr; |
| + return lsr; |
| } |
| |
| static void transmit_chars(struct uart_8250_port *up) |
| @@ -1524,7 +1529,7 @@ static unsigned int check_modem_status(struct uart_8250_port *up) |
| */ |
| static void serial8250_handle_port(struct uart_8250_port *up) |
| { |
| - unsigned int status; |
| + unsigned char status; |
| unsigned long flags; |
| |
| spin_lock_irqsave(&up->port.lock, flags); |
| @@ -1534,7 +1539,7 @@ static void serial8250_handle_port(struct uart_8250_port *up) |
| DEBUG_INTR("status = %x...", status); |
| |
| if (status & (UART_LSR_DR | UART_LSR_BI)) |
| - receive_chars(up, &status); |
| + status = receive_chars(up, status); |
| check_modem_status(up); |
| if (status & UART_LSR_THRE) |
| transmit_chars(up); |
| -- |
| 1.7.10.1.362.g242cab3 |
| |