]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
pmac_zilog,kdb: Fix console poll hook to return instead of loop
authorJason Wessel <jason.wessel@windriver.com>
Sun, 12 Aug 2012 12:16:43 +0000 (07:16 -0500)
committerBen Hutchings <ben@decadent.org.uk>
Wed, 12 Sep 2012 02:37:34 +0000 (03:37 +0100)
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.

Cc: Alan Cox <alan@linux.intel.com>
Signed-off-by: Jason Wessel <jason.wessel@windriver.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
drivers/tty/serial/pmac_zilog.c

index 5acd24a27d087fd510e84b514c19c35c6de40ab1..086f7fe63f94ba3dde8c80d5e20d1c2d123e5ada 100644 (file)
@@ -1407,10 +1407,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)