Hi, On Fri, Sep 6, 2024 at 6:15 AM Johan Hovold <johan+linaro@xxxxxxxxxx> wrote: > > The qcom_geni_serial_poll_bit() can be used to wait for events like > command completion and is supposed to wait for the time it takes to > clear a full fifo before timing out. > > As noted by Doug, the current implementation does not account for start, > stop and parity bits when determining the timeout. The helper also does > not currently account for the shift register and the two-word > intermediate transfer register. > > A too short timeout can specifically lead to lost characters when > waiting for a transfer to complete as the transfer is cancelled on > timeout. > > Instead of determining the poll timeout on every call, store the fifo > timeout when updating it in set_termios() and make sure to take the > shift and intermediate registers into account. Note that serial core has > already added a 20 ms margin to the fifo timeout. > > Also note that the current uart_fifo_timeout() interface does > unnecessary calculations on every call and did not exist in earlier > kernels so only store its result once. This facilitates backports too as > earlier kernels can derive the timeout from uport->timeout, which has > since been removed. > > Fixes: c4f528795d1a ("tty: serial: msm_geni_serial: Add serial driver support for GENI based QUP") > Cc: stable@xxxxxxxxxxxxxxx # 4.17 > Reported-by: Douglas Anderson <dianders@xxxxxxxxxxxx> > Tested-by: Nícolas F. R. A. Prado <nfraprado@xxxxxxxxxxxxx> > Signed-off-by: Johan Hovold <johan+linaro@xxxxxxxxxx> > --- > drivers/tty/serial/qcom_geni_serial.c | 31 +++++++++++++++------------ > 1 file changed, 17 insertions(+), 14 deletions(-) Reviewed-by: Douglas Anderson <dianders@xxxxxxxxxxxx>