| From 38f8eefccf3a23c4058a570fa2938a4f553cf8e0 Mon Sep 17 00:00:00 2001 |
| From: Jason Wessel <jason.wessel@windriver.com> |
| Date: Sun, 12 Aug 2012 07:16:43 -0500 |
| Subject: pmac_zilog,kdb: Fix console poll hook to return instead of loop |
| |
| From: Jason Wessel <jason.wessel@windriver.com> |
| |
| 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> |
| |
| --- |
| drivers/tty/serial/pmac_zilog.c | 12 +++++++++--- |
| 1 file changed, 9 insertions(+), 3 deletions(-) |
| |
| --- 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_p |
| 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) |