From 90ede220f4d5e99c2353c0de42f19aa92c3ef53a Mon Sep 17 00:00:00 2001 From: Mark Salter Date: Wed, 12 Dec 2012 15:36:39 +0000 Subject: [PATCH] --- yaml --- r: 340370 b: refs/heads/master c: 0369c360e5825e34ff58c140aa7fbb9855ad1e4a h: refs/heads/master v: v3 --- [refs] | 2 +- trunk/arch/mn10300/kernel/mn10300-serial.c | 35 ++++++++++++++-------- 2 files changed, 24 insertions(+), 13 deletions(-) diff --git a/[refs] b/[refs] index 335b87d356f2..1d72bdfd2593 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 97a70b14395be0ca61b9fa56f8ff5f6313c26423 +refs/heads/master: 0369c360e5825e34ff58c140aa7fbb9855ad1e4a diff --git a/trunk/arch/mn10300/kernel/mn10300-serial.c b/trunk/arch/mn10300/kernel/mn10300-serial.c index b7b5a4c270f5..81d5cb9b6569 100644 --- a/trunk/arch/mn10300/kernel/mn10300-serial.c +++ b/trunk/arch/mn10300/kernel/mn10300-serial.c @@ -1374,7 +1374,8 @@ static void mn10300_serial_change_speed(struct mn10300_serial_port *port, if ((new->c_cflag & CREAD) == 0) port->uart.ignore_status_mask |= (1 << TTY_NORMAL); - scxctr |= *port->_control & (SC01CTR_TXE | SC01CTR_RXE | SC01CTR_BKE); + scxctr |= SC01CTR_TXE | SC01CTR_RXE; + scxctr |= *port->_control & SC01CTR_BKE; *port->_control = scxctr; spin_unlock_irqrestore(&port->uart.lock, flags); @@ -1720,19 +1721,29 @@ static int mn10300_serial_poll_get_char(struct uart_port *_port) _enter("%s", port->name); - do { - /* pull chars out of the hat */ - ix = ACCESS_ONCE(port->rx_outp); - if (CIRC_CNT(port->rx_inp, ix, MNSC_BUFFER_SIZE) == 0) - return NO_POLL_CHAR; + if (mn10300_serial_int_tbl[port->rx_irq].port != NULL) { + do { + /* pull chars out of the hat */ + ix = ACCESS_ONCE(port->rx_outp); + if (CIRC_CNT(port->rx_inp, ix, MNSC_BUFFER_SIZE) == 0) + return NO_POLL_CHAR; - smp_read_barrier_depends(); - ch = port->rx_buffer[ix++]; - st = port->rx_buffer[ix++]; - smp_mb(); - port->rx_outp = ix & (MNSC_BUFFER_SIZE - 1); + smp_read_barrier_depends(); + ch = port->rx_buffer[ix++]; + st = port->rx_buffer[ix++]; + smp_mb(); + port->rx_outp = ix & (MNSC_BUFFER_SIZE - 1); - } while (st & (SC01STR_FEF | SC01STR_PEF | SC01STR_OEF)); + } while (st & (SC01STR_FEF | SC01STR_PEF | SC01STR_OEF)); + } else { + do { + st = *port->_status; + if (st & (SC01STR_FEF | SC01STR_PEF | SC01STR_OEF)) + continue; + } while (!(st & SC01STR_RBF)); + + ch = *port->_rxb; + } return ch; }