• Johan Hovold's avatar
    serial: qcom-geni: fix fifo polling timeout · c80ee36a
    Johan Hovold authored
    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: c4f52879 ("tty: serial: msm_geni_serial: Add serial driver support for GENI based QUP")
    Cc: stable@vger.kernel.org	# 4.17
    Reported-by: default avatarDouglas Anderson <dianders@chromium.org>
    Tested-by: default avatarNícolas F. R. A. Prado <nfraprado@collabora.com>
    Signed-off-by: default avatarJohan Hovold <johan+linaro@kernel.org>
    Link: https://lore.kernel.org/r/20240906131336.23625-2-johan+linaro@kernel.orgSigned-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    c80ee36a
qcom_geni_serial.c 49.8 KB