| From foo@baz Mon Apr 9 17:09:24 CEST 2018 |
| From: Vignesh R <vigneshr@ti.com> |
| Date: Sat, 22 Apr 2017 18:37:19 +0530 |
| Subject: serial: 8250: omap: Disable DMA for console UART |
| |
| From: Vignesh R <vigneshr@ti.com> |
| |
| |
| [ Upstream commit 84b40e3b57eef1417479c00490dd4c9f6e5ffdbc ] |
| |
| Kernel always writes log messages to console via |
| serial8250_console_write()->serial8250_console_putchar() which directly |
| accesses UART_TX register _without_ using DMA. |
| |
| But, if other processes like systemd using same UART port, then these |
| writes are handled by a different code flow using 8250_omap driver where |
| there is provision to use DMA. |
| |
| It seems that it is possible that both DMA and CPU might simultaneously |
| put data to UART FIFO and lead to potential loss of data due to FIFO |
| overflow and weird data corruption. This happens when both kernel |
| console and userspace tries to write simultaneously to the same UART |
| port. Therefore, disable DMA on kernel console port to avoid potential |
| race between CPU and DMA. |
| |
| Signed-off-by: Vignesh R <vigneshr@ti.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| Signed-off-by: Sasha Levin <alexander.levin@microsoft.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| drivers/tty/serial/8250/8250_omap.c | 4 ++++ |
| 1 file changed, 4 insertions(+) |
| |
| --- a/drivers/tty/serial/8250/8250_omap.c |
| +++ b/drivers/tty/serial/8250/8250_omap.c |
| @@ -613,6 +613,10 @@ static int omap_8250_startup(struct uart |
| up->lsr_saved_flags = 0; |
| up->msr_saved_flags = 0; |
| |
| + /* Disable DMA for console UART */ |
| + if (uart_console(port)) |
| + up->dma = NULL; |
| + |
| if (up->dma) { |
| ret = serial8250_request_dma(up); |
| if (ret) { |