diff options
author | Jason Wessel <jason.wessel@windriver.com> | 2012-08-12 07:16:43 -0500 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2012-08-26 15:00:43 -0700 |
commit | a8e480349f91581d93eff8728fc41cbcd1c3eca1 (patch) | |
tree | 90dce029675ff127769cdfb0c0fa580aa4b92e9c | |
parent | 952227d5c4d522502b7b815b16be6e991bbaeaed (diff) | |
download | lwn-a8e480349f91581d93eff8728fc41cbcd1c3eca1.tar.gz lwn-a8e480349f91581d93eff8728fc41cbcd1c3eca1.zip |
pmac_zilog,kdb: Fix console poll hook to return instead of loop
commit 38f8eefccf3a23c4058a570fa2938a4f553cf8e0 upstream.
kdb <-> kgdb transitioning does not work properly with this UART
driver because the get character routine loops indefinitely as opposed
to returning NO_POLL_CHAR per the expectation of the KDB I/O driver
API.
The symptom is a kernel hang when trying to switch debug modes.
Signed-off-by: Jason Wessel <jason.wessel@windriver.com>
Cc: Alan Cox <alan@linux.intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-rw-r--r-- | drivers/tty/serial/pmac_zilog.c | 12 |
1 files changed, 9 insertions, 3 deletions
diff --git a/drivers/tty/serial/pmac_zilog.c b/drivers/tty/serial/pmac_zilog.c index 654755a990df..333c8d012b0e 100644 --- a/drivers/tty/serial/pmac_zilog.c +++ b/drivers/tty/serial/pmac_zilog.c @@ -1348,10 +1348,16 @@ static int pmz_verify_port(struct uart_port *port, struct serial_struct *ser) static int pmz_poll_get_char(struct uart_port *port) { struct uart_pmac_port *uap = (struct uart_pmac_port *)port; + int tries = 2; - while ((read_zsreg(uap, R0) & Rx_CH_AV) == 0) - udelay(5); - return read_zsdata(uap); + while (tries) { + if ((read_zsreg(uap, R0) & Rx_CH_AV) != 0) + return read_zsdata(uap); + if (tries--) + udelay(5); + } + + return NO_POLL_CHAR; } static void pmz_poll_put_char(struct uart_port *port, unsigned char c) |