From fec3df9ff380e6d45203fec4cb6f35aac01f10bc Mon Sep 17 00:00:00 2001 From: Russell King Date: Wed, 4 Jan 2006 19:19:06 +0000 Subject: [PATCH] --- yaml --- r: 16733 b: refs/heads/master c: 45e24601921fc1c4ca7932f7f7a475d3ad64ecad h: refs/heads/master i: 16731: a640c5332414bbb28fd56b6e74040f56bbfa81fd v: v3 --- [refs] | 2 +- trunk/drivers/serial/8250.c | 15 ++++++++------- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/[refs] b/[refs] index 98191db4ddd5..06f3d2c2f505 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 50aec3b561de4e435204ad315e5c5ab58ef9feda +refs/heads/master: 45e24601921fc1c4ca7932f7f7a475d3ad64ecad diff --git a/trunk/drivers/serial/8250.c b/trunk/drivers/serial/8250.c index ad20d2dd85d7..56dcfd93bdc4 100644 --- a/trunk/drivers/serial/8250.c +++ b/trunk/drivers/serial/8250.c @@ -1281,7 +1281,11 @@ static unsigned int check_modem_status(struct uart_8250_port *up) static inline void serial8250_handle_port(struct uart_8250_port *up, struct pt_regs *regs) { - unsigned int status = serial_inp(up, UART_LSR); + unsigned int status; + + spin_lock(&up->port.lock); + + status = serial_inp(up, UART_LSR); DEBUG_INTR("status = %x...", status); @@ -1290,6 +1294,8 @@ serial8250_handle_port(struct uart_8250_port *up, struct pt_regs *regs) check_modem_status(up); if (status & UART_LSR_THRE) transmit_chars(up); + + spin_unlock(&up->port.lock); } /* @@ -1325,9 +1331,7 @@ static irqreturn_t serial8250_interrupt(int irq, void *dev_id, struct pt_regs *r iir = serial_in(up, UART_IIR); if (!(iir & UART_IIR_NO_INT)) { - spin_lock(&up->port.lock); serial8250_handle_port(up, regs); - spin_unlock(&up->port.lock); handled = 1; @@ -1426,11 +1430,8 @@ static void serial8250_timeout(unsigned long data) unsigned int iir; iir = serial_in(up, UART_IIR); - if (!(iir & UART_IIR_NO_INT)) { - spin_lock(&up->port.lock); + if (!(iir & UART_IIR_NO_INT)) serial8250_handle_port(up, NULL); - spin_unlock(&up->port.lock); - } timeout = up->port.timeout; timeout = timeout > 6 ? (timeout / 2 - 2) : 1;