Thread (13 messages) 13 messages, 6 authors, 2015-03-15

Re: [RFC] With 8250 Designware UART, if writes to the LCR failed the kernel will hung up

From: Tim Kryger <hidden>
Date: 2015-03-07 03:02:01
Also in: lkml

You only hit the silicon bug if you bombard the uart with characters
and simultaneously request a baud rate or framing change.

I'm not sure why you would do either to the uart console.  Is it
possible your host machine is doing something weird?

If you have the leverage, remind the SoC vendor to upgrade the serial
block.  Synopsys fixed this a long time ago.

-Tim

On Fri, Mar 6, 2015 at 8:50 AM, Peter Hurley [off-list ref] wrote:
Hi Zhang,

On 03/06/2015 04:11 AM, Zhang Zhen wrote:
quoted
Hi,

      I'm testing 4.0-rc1 kernel on my board with 8250 Designware UART.(ARM Cortex-a15 single core).

      I found if serial is busy and writes to the LCR failed after tried 1000 times.
      The kernel will hung up.

      The system boot success after changed from:

 95 static void dw8250_serial_out(struct uart_port *p, int offset, int value)
 96 {
 97         struct dw8250_data *d = p->private_data;
 98
...
...
112                         writeb(value, p->membase + (UART_LCR << p->regshift));
113                 }
114                 dev_err(p->dev, "Couldn't set LCR to %d\n", value);
115         }
116 }

      to:

 95 static void dw8250_serial_out(struct uart_port *p, int offset, int value)
 96 {
 97         struct dw8250_data *d = p->private_data;
 98
...
...
112                         writeb(value, p->membase + (UART_LCR << p->regshift));
113                 }
114                 dev_info(p->dev, "Couldn't set LCR to %d\n", value);            //changed here
115         }
116 }

      The reason is serial8250_console_write can't get port->lock because serial8250_do_set_termios has
      got port->lock.
      So i think here we should change from dev_err to dev_info ?
That's not really going to help because this will still hang if the
console_loglevel is set to < KERN_INFO.
quoted
      Any suggestions are welcome.
Check that the port is not the uart_console() before logging the error,
like;

        if (!uart_console(p))
                dev_err(p->dev, "Couldn't .....");

Use a global flag to note the error and check it from other contexts.
Plus, find out why you can't write LCR there.

Also, consider re-designing how the 8250_dw driver implements that
"feature".

Regards,
Peter Hurley
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help