Thread (16 messages) 16 messages, 4 authors, 2013-12-10

[PATCH v2] serial: 8250_dw: Improve unwritable LCR workaround

From: Tim Kryger <hidden>
Date: 2013-12-10 00:42:28
Also in: linux-serial, lkml

On Fri, Dec 6, 2013 at 4:59 PM, James Hogan [off-list ref] wrote:
It appears to work with ~0x20 too, and the workaround isn't getting hit (only
tested boot and logging in - nothing fancy). I think having the printks in
this code with the console directed at the serial must have caused
resursion/busy problems somehow.
James,

I tested tested the code you proposed (cleaned up to avoid magic
numbers) on my hardware and it works fine.
diff --git a/drivers/tty/serial/8250/8250_dw.c
b/drivers/tty/serial/8250/8250_dw.c
index 4658e3e..5f096c7 100644
--- a/drivers/tty/serial/8250/8250_dw.c
+++ b/drivers/tty/serial/8250/8250_dw.c
@@ -96,7 +96,8 @@ static void dw8250_serial_out(struct uart_port *p,
int offset, int value)
        if (offset == UART_LCR) {
                int tries = 1000;
                while (tries--) {
-                       if (value == p->serial_in(p, UART_LCR))
+                       unsigned int lcr = p->serial_in(p, UART_LCR);
+                       if ((value & ~UART_LCR_SPAR) == (lcr & ~UART_LCR_SPAR))
                                return;
                        dw8250_force_idle(p);
                        writeb(value, p->membase + (UART_LCR << p->regshift));
@@ -132,7 +133,8 @@ static void dw8250_serial_out32(struct uart_port
*p, int offset, int value)
        if (offset == UART_LCR) {
                int tries = 1000;
                while (tries--) {
-                       if (value == p->serial_in(p, UART_LCR))
+                       unsigned int lcr = p->serial_in(p, UART_LCR);
+                       if ((value & ~UART_LCR_SPAR) == (lcr & ~UART_LCR_SPAR))
                                return;
                        dw8250_force_idle(p);
                        writel(value, p->membase + (UART_LCR << p->regshift));


Would you mind posting this for proper review so we can get the fix in?

Thanks,
Tim Kryger
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help