lkml.org 
[lkml]   [2022]   [Jun]   [13]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.17 066/298] serial: stm32-usart: Correct CSIZE, bits, and parity
    Date
    From: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>

    [ Upstream commit 1deeda8d2877c18bc2b9eeee10dd6d2628852848 ]

    Add CSIZE sanitization for unsupported CSIZE configurations. In
    addition, if parity is asked for but CSx was unsupported, the sensible
    result is CS8+parity which requires setting USART_CR1_M0 like with 9
    bits.

    Incorrect CSIZE results in miscalculation of the frame bits in
    tty_get_char_size() or in its predecessor where the roughly the same
    code is directly within uart_update_timeout().

    Fixes: c8a9d043947b (serial: stm32: fix word length configuration)
    Cc: Erwan Le Ray <erwan.leray@st.com>
    Signed-off-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
    Link: https://lore.kernel.org/r/20220519081808.3776-9-ilpo.jarvinen@linux.intel.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/tty/serial/stm32-usart.c | 15 ++++++++++++---
    1 file changed, 12 insertions(+), 3 deletions(-)

    diff --git a/drivers/tty/serial/stm32-usart.c b/drivers/tty/serial/stm32-usart.c
    index 9570002d07e7..9bc970be59ba 100644
    --- a/drivers/tty/serial/stm32-usart.c
    +++ b/drivers/tty/serial/stm32-usart.c
    @@ -1037,13 +1037,22 @@ static void stm32_usart_set_termios(struct uart_port *port,
    * CS8 or (CS7 + parity), 8 bits word aka [M1:M0] = 0b00
    * M0 and M1 already cleared by cr1 initialization.
    */
    - if (bits == 9)
    + if (bits == 9) {
    cr1 |= USART_CR1_M0;
    - else if ((bits == 7) && cfg->has_7bits_data)
    + } else if ((bits == 7) && cfg->has_7bits_data) {
    cr1 |= USART_CR1_M1;
    - else if (bits != 8)
    + } else if (bits != 8) {
    dev_dbg(port->dev, "Unsupported data bits config: %u bits\n"
    , bits);
    + cflag &= ~CSIZE;
    + cflag |= CS8;
    + termios->c_cflag = cflag;
    + bits = 8;
    + if (cflag & PARENB) {
    + bits++;
    + cr1 |= USART_CR1_M0;
    + }
    + }

    if (ofs->rtor != UNDEF_REG && (stm32_port->rx_ch ||
    (stm32_port->fifoen &&
    --
    2.35.1


    \
     
     \ /
      Last update: 2022-06-13 16:22    [W:3.756 / U:0.324 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site