Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3f6b3ce0 authored by Peter Hurley's avatar Peter Hurley Committed by Greg Kroah-Hartman
Browse files

serial: 8250: Refactor serial8250_rx_chars() inner loop



Factor the read/process one char inner loop to a separate helper
function serial8250_read_char(). No functional change.

Signed-off-by: default avatarPeter Hurley <peter@hurleysoftware.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 87108bc9
Loading
Loading
Loading
Loading
+62 −58
Original line number Diff line number Diff line
@@ -1412,20 +1412,12 @@ static void serial8250_enable_ms(struct uart_port *port)
	serial8250_rpm_put(up);
}

/*
 * serial8250_rx_chars: processes according to the passed in LSR
 * value, and returns the remaining LSR bits not handled
 * by this Rx routine.
 */
unsigned char
serial8250_rx_chars(struct uart_8250_port *up, unsigned char lsr)
static void serial8250_read_char(struct uart_8250_port *up, unsigned char lsr)
{
	struct uart_port *port = &up->port;
	unsigned char ch;
	int max_count = 256;
	char flag;
	char flag = TTY_NORMAL;

	do {
	if (likely(lsr & UART_LSR_DR))
		ch = serial_in(up, UART_RX);
	else
@@ -1438,7 +1430,6 @@ serial8250_rx_chars(struct uart_8250_port *up, unsigned char lsr)
		 */
		ch = 0;

		flag = TTY_NORMAL;
	port->icount.rx++;

	lsr |= up->lsr_saved_flags;
@@ -1455,7 +1446,7 @@ serial8250_rx_chars(struct uart_8250_port *up, unsigned char lsr)
			 * or read_status_mask.
			 */
			if (uart_handle_break(port))
					goto ignore_char;
				return;
		} else if (lsr & UART_LSR_PE)
			port->icount.parity++;
		else if (lsr & UART_LSR_FE)
@@ -1477,11 +1468,24 @@ serial8250_rx_chars(struct uart_8250_port *up, unsigned char lsr)
			flag = TTY_FRAME;
	}
	if (uart_handle_sysrq_char(port, ch))
			goto ignore_char;
		return;

	uart_insert_char(port, lsr, UART_LSR_OE, ch, flag);
}

ignore_char:
/*
 * serial8250_rx_chars: processes according to the passed in LSR
 * value, and returns the remaining LSR bits not handled
 * by this Rx routine.
 */
unsigned char
serial8250_rx_chars(struct uart_8250_port *up, unsigned char lsr)
{
	struct uart_port *port = &up->port;
	int max_count = 256;

	do {
		serial8250_read_char(up, lsr);
		lsr = serial_in(up, UART_LSR);
	} while ((lsr & (UART_LSR_DR | UART_LSR_BI)) && (--max_count > 0));
	spin_unlock(&port->lock);