Hi, On Mon, Apr 10, 2017 at 11:12:39AM -0500, Rob Herring wrote: > On Mon, Apr 10, 2017 at 9:03 AM, Greg Kroah-Hartman > <gregkh@xxxxxxxxxxxxxxxxxxx> wrote: > > On Mon, Apr 10, 2017 at 08:46:57AM -0500, Rob Herring wrote: > >> On Sat, Apr 8, 2017 at 11:57 AM, Greg Kroah-Hartman > >> <gregkh@xxxxxxxxxxxxxxxxxxx> wrote: > >> > On Tue, Mar 28, 2017 at 05:59:31PM +0200, Sebastian Reichel wrote: > >> >> Add method, which waits until the transmission buffer has been sent. > >> >> Note, that the change in ttyport_write_wakeup is related, since > >> >> tty_wait_until_sent will hang without that change. > >> >> > >> >> Acked-by: Rob Herring <robh@xxxxxxxxxx> > >> >> Acked-by: Pavel Machek <pavel@xxxxxx> > >> >> Signed-off-by: Sebastian Reichel <sre@xxxxxxxxxx> > >> >> --- > >> >> Changes since PATCHv2: > >> >> * Avoid goto in ttyport_write_wakeup > >> >> --- > >> >> drivers/tty/serdev/core.c | 11 +++++++++++ > >> >> drivers/tty/serdev/serdev-ttyport.c | 18 ++++++++++++++---- > >> >> include/linux/serdev.h | 3 +++ > >> >> 3 files changed, 28 insertions(+), 4 deletions(-) > >> >> > >> >> diff --git a/drivers/tty/serdev/core.c b/drivers/tty/serdev/core.c > >> >> index f4c6c90add78..a63b74031e22 100644 > >> >> --- a/drivers/tty/serdev/core.c > >> >> +++ b/drivers/tty/serdev/core.c > >> >> @@ -173,6 +173,17 @@ void serdev_device_set_flow_control(struct serdev_device *serdev, bool enable) > >> >> } > >> >> EXPORT_SYMBOL_GPL(serdev_device_set_flow_control); > >> >> > >> >> +void serdev_device_wait_until_sent(struct serdev_device *serdev, long timeout) > >> >> +{ > >> >> + struct serdev_controller *ctrl = serdev->ctrl; > >> >> + > >> >> + if (!ctrl || !ctrl->ops->wait_until_sent) > >> >> + return; > >> >> + > >> >> + ctrl->ops->wait_until_sent(ctrl, timeout); > >> >> +} > >> >> +EXPORT_SYMBOL_GPL(serdev_device_wait_until_sent); > >> > > >> > Is this still needed now that we have serdev_device_write() with an > >> > unlimited timeout available? > >> > >> Yes, because only this waits until the data is on the wire. > > > > What "wire" is that? The serial wire? How do you know this? Many usb > > to serial devices have no way to determine this, given that there is > > another uart hanging off of the end of a USB connection. > > Okay, maybe it's just out of linux s/w buffers for h/w which you don't > know. It is the same semantics as tty_wait_until_sent which is > documented as: "Wait for characters pending in a tty driver to hit the > wire, or for a timeout to occur (eg due to flow control)" For embedded h/w it usually means the serial wire. tty_wait_until_sent() first waits for the tty buffer to be empty and then calls wait_until_sent() in the driver providing the tty. In case of serial-core that is implemented by uart_wait_until_sent(), which waits for the serial driver's tx_empty() operation becoming true (grepping for ".tx_empty" returned 81 hits for me). Also at least some of the usb to serial adapters seem to support this using usb_serial_generic_wait_until_sent() and ".tx_empty": $ git grep "\.tx_empty" cp210x.c: .tx_empty = cp210x_tx_empty, f81534.c: .tx_empty = f81534_tx_empty, ftdi_sio.c: .tx_empty = ftdi_tx_empty, io_ti.c: .tx_empty = edge_tx_empty, io_ti.c: .tx_empty = edge_tx_empty, mxuport.c: .tx_empty = mxuport_tx_empty, ti_usb_3410_5052.c: .tx_empty = ti_tx_empty, ti_usb_3410_5052.c: .tx_empty = ti_tx_empty, The other ones will only wait for empty s/w buffer, but that's already the case for tty_wait_until_sent(), so IMHO a different problem. -- Sebastian
Attachment:
signature.asc
Description: PGP signature