Thread (23 messages) 23 messages, 4 authors, 2014-10-13

[PATCH 09/16] tty: serial: 8250_dma: Add a TX trigger workaround for AM33xx

From: Peter Hurley <hidden>
Date: 2014-09-25 11:31:49
Also in: linux-omap, linux-serial, lkml

Possibly related (same subject, not in this thread)

On 09/25/2014 06:42 AM, Sebastian Andrzej Siewior wrote:
* Sebastian Andrzej Siewior | 2014-09-24 09:53:46 [+0200]:
quoted
* Peter Hurley | 2014-09-23 13:03:51 [-0400]:
quoted
But DMA is cheating if the UART driver's tx_empty() method is saying the
transmitter is empty while TX DMA is still running.
This shouldn't be the case. But I will check this once I able to.
I added 

|#define BOTH_EMPTY      (UART_LSR_TEMT | UART_LSR_THRE)
|    trace_printk("delay <%d>\n", (lsr & BOTH_EMPTY) == BOTH_EMPTY ? 1 : 0);

in my set_termios() and the trace shows
|              vi-949   [000] d...    70.477002: omap8250_restore_regs: delay <0>

so no, it does not wait until TX FIFO is empty. It looks like it uses
TCSANOW instead of TCSADRAIN. And since this looks "legal" I will delay
it until TX-DMA is complete because it is known to stall the DMA operation.
I just verified that GNU readline6 uses ioctl(TCSETSW, ...) to do the set_termios
(which is the ioctl that libc should use for tcsetattr(TCSADRAIN)).

Maybe this userspace is using a readline()-alike that has a bug by not using the
correct tcsetattr() action?
Or maybe the glibc-equivalent has the bug, and tcsetattr(TCSADRAIN) is not using
ioctl(TCSETSW)?

Regards,
Peter Hurley
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help