lkml.org 
[lkml]   [2014]   [Jul]   [7]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 3.15 113/122] serial: Fix IGNBRK handling
    Date
    3.15-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Peter Hurley <peter@hurleysoftware.com>

    commit ef8b9ddcb45fa3b1e11acd72be2398001e807d14 upstream.

    If IGNBRK is set without either BRKINT or PARMRK set, some uart
    drivers send a 0x00 byte for BREAK without the TTYBREAK flag to the
    line discipline, when it should send either nothing or the TTYBREAK flag
    set. This happens because the read_status_mask masks out the BI
    condition, which uart_insert_char() then interprets as a normal 0x00 byte.

    SUS v3 is clear regarding the meaning of IGNBRK; Section 11.2.2, General
    Terminal Interface - Input Modes, states:
    "If IGNBRK is set, a break condition detected on input shall be ignored;
    that is, not put on the input queue and therefore not read by any
    process."

    Fix read_status_mask to include the BI bit if IGNBRK is set; the
    lsr status retains the BI bit if a BREAK is recv'd, which is
    subsequently ignored in uart_insert_char() when masked with the
    ignore_status_mask.

    Affected drivers:
    8250 - all
    serial_txx9
    mfd
    amba-pl010
    amba-pl011
    atmel_serial
    bfin_uart
    dz
    ip22zilog
    max310x
    mxs-auart
    netx-serial
    pnx8xxx_uart
    pxa
    sb1250-duart
    sccnxp
    serial_ks8695
    sirfsoc_uart
    st-asc
    vr41xx_siu
    zs
    sunzilog
    fsl_lpuart
    sunsab
    ucc_uart
    bcm63xx_uart
    sunsu
    efm32-uart
    pmac_zilog
    mpsc
    msm_serial
    m32r_sio

    Unaffected drivers:
    omap-serial
    rp2
    sa1100
    imx
    icom

    Annotated for fixes:
    altera_uart
    mcf

    Drivers without break detection:
    21285
    xilinx-uartps
    altera_jtaguart
    apbuart
    arc-uart
    clps711x
    max3100
    uartlite
    msm_serial_hs
    nwpserial
    lantiq
    vt8500_serial

    Unknown:
    samsung
    mpc52xx_uart
    bfin_sport_uart
    cpm_uart/core

    Fixes: Bugzilla #71651, '8250_core.c incorrectly handles IGNBRK flag'
    Reported-by: Ivan <athlon_@mail.ru>
    Signed-off-by: Peter Hurley <peter@hurleysoftware.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    drivers/tty/serial/8250/8250_core.c | 2 +-
    drivers/tty/serial/altera_uart.c | 6 ++++++
    drivers/tty/serial/amba-pl010.c | 2 +-
    drivers/tty/serial/amba-pl011.c | 2 +-
    drivers/tty/serial/atmel_serial.c | 2 +-
    drivers/tty/serial/bcm63xx_uart.c | 2 +-
    drivers/tty/serial/bfin_uart.c | 2 +-
    drivers/tty/serial/dz.c | 2 +-
    drivers/tty/serial/efm32-uart.c | 2 +-
    drivers/tty/serial/fsl_lpuart.c | 2 +-
    drivers/tty/serial/ip22zilog.c | 2 +-
    drivers/tty/serial/m32r_sio.c | 2 +-
    drivers/tty/serial/max310x.c | 2 +-
    drivers/tty/serial/mcf.c | 6 ++++++
    drivers/tty/serial/mfd.c | 2 +-
    drivers/tty/serial/mpsc.c | 2 +-
    drivers/tty/serial/msm_serial.c | 2 +-
    drivers/tty/serial/mxs-auart.c | 2 +-
    drivers/tty/serial/netx-serial.c | 2 +-
    drivers/tty/serial/pmac_zilog.c | 2 +-
    drivers/tty/serial/pnx8xxx_uart.c | 2 +-
    drivers/tty/serial/pxa.c | 2 +-
    drivers/tty/serial/sb1250-duart.c | 2 +-
    drivers/tty/serial/sccnxp.c | 2 +-
    drivers/tty/serial/serial_ks8695.c | 2 +-
    drivers/tty/serial/serial_txx9.c | 2 +-
    drivers/tty/serial/sirfsoc_uart.c | 2 +-
    drivers/tty/serial/st-asc.c | 2 +-
    drivers/tty/serial/sunsab.c | 2 +-
    drivers/tty/serial/sunsu.c | 2 +-
    drivers/tty/serial/sunzilog.c | 2 +-
    drivers/tty/serial/ucc_uart.c | 2 +-
    drivers/tty/serial/vr41xx_siu.c | 2 +-
    drivers/tty/serial/zs.c | 2 +-
    34 files changed, 44 insertions(+), 32 deletions(-)

    --- a/drivers/tty/serial/8250/8250_core.c
    +++ b/drivers/tty/serial/8250/8250_core.c
    @@ -2360,7 +2360,7 @@ serial8250_do_set_termios(struct uart_po
    port->read_status_mask = UART_LSR_OE | UART_LSR_THRE | UART_LSR_DR;
    if (termios->c_iflag & INPCK)
    port->read_status_mask |= UART_LSR_FE | UART_LSR_PE;
    - if (termios->c_iflag & (BRKINT | PARMRK))
    + if (termios->c_iflag & (IGNBRK | BRKINT | PARMRK))
    port->read_status_mask |= UART_LSR_BI;

    /*
    --- a/drivers/tty/serial/altera_uart.c
    +++ b/drivers/tty/serial/altera_uart.c
    @@ -185,6 +185,12 @@ static void altera_uart_set_termios(stru
    uart_update_timeout(port, termios->c_cflag, baud);
    altera_uart_writel(port, baudclk, ALTERA_UART_DIVISOR_REG);
    spin_unlock_irqrestore(&port->lock, flags);
    +
    + /*
    + * FIXME: port->read_status_mask and port->ignore_status_mask
    + * need to be initialized based on termios settings for
    + * INPCK, IGNBRK, IGNPAR, PARMRK, BRKINT
    + */
    }

    static void altera_uart_rx_chars(struct altera_uart *pp)
    --- a/drivers/tty/serial/amba-pl010.c
    +++ b/drivers/tty/serial/amba-pl010.c
    @@ -420,7 +420,7 @@ pl010_set_termios(struct uart_port *port
    uap->port.read_status_mask = UART01x_RSR_OE;
    if (termios->c_iflag & INPCK)
    uap->port.read_status_mask |= UART01x_RSR_FE | UART01x_RSR_PE;
    - if (termios->c_iflag & (BRKINT | PARMRK))
    + if (termios->c_iflag & (IGNBRK | BRKINT | PARMRK))
    uap->port.read_status_mask |= UART01x_RSR_BE;

    /*
    --- a/drivers/tty/serial/amba-pl011.c
    +++ b/drivers/tty/serial/amba-pl011.c
    @@ -1744,7 +1744,7 @@ pl011_set_termios(struct uart_port *port
    port->read_status_mask = UART011_DR_OE | 255;
    if (termios->c_iflag & INPCK)
    port->read_status_mask |= UART011_DR_FE | UART011_DR_PE;
    - if (termios->c_iflag & (BRKINT | PARMRK))
    + if (termios->c_iflag & (IGNBRK | BRKINT | PARMRK))
    port->read_status_mask |= UART011_DR_BE;

    /*
    --- a/drivers/tty/serial/atmel_serial.c
    +++ b/drivers/tty/serial/atmel_serial.c
    @@ -1784,7 +1784,7 @@ static void atmel_set_termios(struct uar
    port->read_status_mask = ATMEL_US_OVRE;
    if (termios->c_iflag & INPCK)
    port->read_status_mask |= (ATMEL_US_FRAME | ATMEL_US_PARE);
    - if (termios->c_iflag & (BRKINT | PARMRK))
    + if (termios->c_iflag & (IGNBRK | BRKINT | PARMRK))
    port->read_status_mask |= ATMEL_US_RXBRK;

    if (atmel_use_pdc_rx(port))
    --- a/drivers/tty/serial/bcm63xx_uart.c
    +++ b/drivers/tty/serial/bcm63xx_uart.c
    @@ -567,7 +567,7 @@ static void bcm_uart_set_termios(struct
    port->read_status_mask |= UART_FIFO_FRAMEERR_MASK;
    port->read_status_mask |= UART_FIFO_PARERR_MASK;
    }
    - if (new->c_iflag & (BRKINT))
    + if (new->c_iflag & (IGNBRK | BRKINT))
    port->read_status_mask |= UART_FIFO_BRKDET_MASK;

    port->ignore_status_mask = 0;
    --- a/drivers/tty/serial/bfin_uart.c
    +++ b/drivers/tty/serial/bfin_uart.c
    @@ -833,7 +833,7 @@ bfin_serial_set_termios(struct uart_port
    port->read_status_mask = OE;
    if (termios->c_iflag & INPCK)
    port->read_status_mask |= (FE | PE);
    - if (termios->c_iflag & (BRKINT | PARMRK))
    + if (termios->c_iflag & (IGNBRK | BRKINT | PARMRK))
    port->read_status_mask |= BI;

    /*
    --- a/drivers/tty/serial/dz.c
    +++ b/drivers/tty/serial/dz.c
    @@ -625,7 +625,7 @@ static void dz_set_termios(struct uart_p
    dport->port.read_status_mask = DZ_OERR;
    if (termios->c_iflag & INPCK)
    dport->port.read_status_mask |= DZ_FERR | DZ_PERR;
    - if (termios->c_iflag & (BRKINT | PARMRK))
    + if (termios->c_iflag & (IGNBRK | BRKINT | PARMRK))
    dport->port.read_status_mask |= DZ_BREAK;

    /* characters to ignore */
    --- a/drivers/tty/serial/efm32-uart.c
    +++ b/drivers/tty/serial/efm32-uart.c
    @@ -407,7 +407,7 @@ static void efm32_uart_set_termios(struc
    if (new->c_iflag & INPCK)
    port->read_status_mask |=
    UARTn_RXDATAX_FERR | UARTn_RXDATAX_PERR;
    - if (new->c_iflag & (BRKINT | PARMRK))
    + if (new->c_iflag & (IGNBRK | BRKINT | PARMRK))
    port->read_status_mask |= SW_UARTn_RXDATAX_BERR;

    port->ignore_status_mask = 0;
    --- a/drivers/tty/serial/fsl_lpuart.c
    +++ b/drivers/tty/serial/fsl_lpuart.c
    @@ -902,7 +902,7 @@ lpuart_set_termios(struct uart_port *por
    sport->port.read_status_mask = 0;
    if (termios->c_iflag & INPCK)
    sport->port.read_status_mask |= (UARTSR1_FE | UARTSR1_PE);
    - if (termios->c_iflag & (BRKINT | PARMRK))
    + if (termios->c_iflag & (IGNBRK | BRKINT | PARMRK))
    sport->port.read_status_mask |= UARTSR1_FE;

    /* characters to ignore */
    --- a/drivers/tty/serial/ip22zilog.c
    +++ b/drivers/tty/serial/ip22zilog.c
    @@ -850,7 +850,7 @@ ip22zilog_convert_to_zs(struct uart_ip22
    up->port.read_status_mask = Rx_OVR;
    if (iflag & INPCK)
    up->port.read_status_mask |= CRC_ERR | PAR_ERR;
    - if (iflag & (BRKINT | PARMRK))
    + if (iflag & (IGNBRK | BRKINT | PARMRK))
    up->port.read_status_mask |= BRK_ABRT;

    up->port.ignore_status_mask = 0;
    --- a/drivers/tty/serial/m32r_sio.c
    +++ b/drivers/tty/serial/m32r_sio.c
    @@ -737,7 +737,7 @@ static void m32r_sio_set_termios(struct
    up->port.read_status_mask = UART_LSR_OE | UART_LSR_THRE | UART_LSR_DR;
    if (termios->c_iflag & INPCK)
    up->port.read_status_mask |= UART_LSR_FE | UART_LSR_PE;
    - if (termios->c_iflag & (BRKINT | PARMRK))
    + if (termios->c_iflag & (IGNBRK | BRKINT | PARMRK))
    up->port.read_status_mask |= UART_LSR_BI;

    /*
    --- a/drivers/tty/serial/max310x.c
    +++ b/drivers/tty/serial/max310x.c
    @@ -835,7 +835,7 @@ static void max310x_set_termios(struct u
    if (termios->c_iflag & INPCK)
    port->read_status_mask |= MAX310X_LSR_RXPAR_BIT |
    MAX310X_LSR_FRERR_BIT;
    - if (termios->c_iflag & (BRKINT | PARMRK))
    + if (termios->c_iflag & (IGNBRK | BRKINT | PARMRK))
    port->read_status_mask |= MAX310X_LSR_RXBRK_BIT;

    /* Set status ignore mask */
    --- a/drivers/tty/serial/mcf.c
    +++ b/drivers/tty/serial/mcf.c
    @@ -248,6 +248,12 @@ static void mcf_set_termios(struct uart_
    mr1 |= MCFUART_MR1_PARITYNONE;
    }

    + /*
    + * FIXME: port->read_status_mask and port->ignore_status_mask
    + * need to be initialized based on termios settings for
    + * INPCK, IGNBRK, IGNPAR, PARMRK, BRKINT
    + */
    +
    if (termios->c_cflag & CSTOPB)
    mr2 |= MCFUART_MR2_STOP2;
    else
    --- a/drivers/tty/serial/mfd.c
    +++ b/drivers/tty/serial/mfd.c
    @@ -977,7 +977,7 @@ serial_hsu_set_termios(struct uart_port
    up->port.read_status_mask = UART_LSR_OE | UART_LSR_THRE | UART_LSR_DR;
    if (termios->c_iflag & INPCK)
    up->port.read_status_mask |= UART_LSR_FE | UART_LSR_PE;
    - if (termios->c_iflag & (BRKINT | PARMRK))
    + if (termios->c_iflag & (IGNBRK | BRKINT | PARMRK))
    up->port.read_status_mask |= UART_LSR_BI;

    /* Characters to ignore */
    --- a/drivers/tty/serial/mpsc.c
    +++ b/drivers/tty/serial/mpsc.c
    @@ -1458,7 +1458,7 @@ static void mpsc_set_termios(struct uart
    pi->port.read_status_mask |= SDMA_DESC_CMDSTAT_PE
    | SDMA_DESC_CMDSTAT_FR;

    - if (termios->c_iflag & (BRKINT | PARMRK))
    + if (termios->c_iflag & (IGNBRK | BRKINT | PARMRK))
    pi->port.read_status_mask |= SDMA_DESC_CMDSTAT_BR;

    /* Characters/events to ignore */
    --- a/drivers/tty/serial/msm_serial.c
    +++ b/drivers/tty/serial/msm_serial.c
    @@ -583,7 +583,7 @@ static void msm_set_termios(struct uart_
    port->read_status_mask = 0;
    if (termios->c_iflag & INPCK)
    port->read_status_mask |= UART_SR_PAR_FRAME_ERR;
    - if (termios->c_iflag & (BRKINT | PARMRK))
    + if (termios->c_iflag & (IGNBRK | BRKINT | PARMRK))
    port->read_status_mask |= UART_SR_RX_BREAK;

    uart_update_timeout(port, termios->c_cflag, baud);
    --- a/drivers/tty/serial/mxs-auart.c
    +++ b/drivers/tty/serial/mxs-auart.c
    @@ -604,7 +604,7 @@ static void mxs_auart_settermios(struct

    if (termios->c_iflag & INPCK)
    u->read_status_mask |= AUART_STAT_PERR;
    - if (termios->c_iflag & (BRKINT | PARMRK))
    + if (termios->c_iflag & (IGNBRK | BRKINT | PARMRK))
    u->read_status_mask |= AUART_STAT_BERR;

    /*
    --- a/drivers/tty/serial/netx-serial.c
    +++ b/drivers/tty/serial/netx-serial.c
    @@ -419,7 +419,7 @@ netx_set_termios(struct uart_port *port,
    }

    port->read_status_mask = 0;
    - if (termios->c_iflag & (BRKINT | PARMRK))
    + if (termios->c_iflag & (IGNBRK | BRKINT | PARMRK))
    port->read_status_mask |= SR_BE;
    if (termios->c_iflag & INPCK)
    port->read_status_mask |= SR_PE | SR_FE;
    --- a/drivers/tty/serial/pmac_zilog.c
    +++ b/drivers/tty/serial/pmac_zilog.c
    @@ -1092,7 +1092,7 @@ static void pmz_convert_to_zs(struct uar
    uap->port.read_status_mask = Rx_OVR;
    if (iflag & INPCK)
    uap->port.read_status_mask |= CRC_ERR | PAR_ERR;
    - if (iflag & (BRKINT | PARMRK))
    + if (iflag & (IGNBRK | BRKINT | PARMRK))
    uap->port.read_status_mask |= BRK_ABRT;

    uap->port.ignore_status_mask = 0;
    --- a/drivers/tty/serial/pnx8xxx_uart.c
    +++ b/drivers/tty/serial/pnx8xxx_uart.c
    @@ -477,7 +477,7 @@ pnx8xxx_set_termios(struct uart_port *po
    sport->port.read_status_mask |=
    FIFO_TO_SM(PNX8XXX_UART_FIFO_RXFE) |
    FIFO_TO_SM(PNX8XXX_UART_FIFO_RXPAR);
    - if (termios->c_iflag & (BRKINT | PARMRK))
    + if (termios->c_iflag & (IGNBRK | BRKINT | PARMRK))
    sport->port.read_status_mask |=
    ISTAT_TO_SM(PNX8XXX_UART_INT_BREAK);

    --- a/drivers/tty/serial/pxa.c
    +++ b/drivers/tty/serial/pxa.c
    @@ -492,7 +492,7 @@ serial_pxa_set_termios(struct uart_port
    up->port.read_status_mask = UART_LSR_OE | UART_LSR_THRE | UART_LSR_DR;
    if (termios->c_iflag & INPCK)
    up->port.read_status_mask |= UART_LSR_FE | UART_LSR_PE;
    - if (termios->c_iflag & (BRKINT | PARMRK))
    + if (termios->c_iflag & (IGNBRK | BRKINT | PARMRK))
    up->port.read_status_mask |= UART_LSR_BI;

    /*
    --- a/drivers/tty/serial/sb1250-duart.c
    +++ b/drivers/tty/serial/sb1250-duart.c
    @@ -596,7 +596,7 @@ static void sbd_set_termios(struct uart_
    if (termios->c_iflag & INPCK)
    uport->read_status_mask |= M_DUART_FRM_ERR |
    M_DUART_PARITY_ERR;
    - if (termios->c_iflag & (BRKINT | PARMRK))
    + if (termios->c_iflag & (IGNBRK | BRKINT | PARMRK))
    uport->read_status_mask |= M_DUART_RCVD_BRK;

    uport->ignore_status_mask = 0;
    --- a/drivers/tty/serial/sccnxp.c
    +++ b/drivers/tty/serial/sccnxp.c
    @@ -667,7 +667,7 @@ static void sccnxp_set_termios(struct ua
    port->read_status_mask = SR_OVR;
    if (termios->c_iflag & INPCK)
    port->read_status_mask |= SR_PE | SR_FE;
    - if (termios->c_iflag & (BRKINT | PARMRK))
    + if (termios->c_iflag & (IGNBRK | BRKINT | PARMRK))
    port->read_status_mask |= SR_BRK;

    /* Set status ignore mask */
    --- a/drivers/tty/serial/serial_ks8695.c
    +++ b/drivers/tty/serial/serial_ks8695.c
    @@ -437,7 +437,7 @@ static void ks8695uart_set_termios(struc
    port->read_status_mask = URLS_URROE;
    if (termios->c_iflag & INPCK)
    port->read_status_mask |= (URLS_URFE | URLS_URPE);
    - if (termios->c_iflag & (BRKINT | PARMRK))
    + if (termios->c_iflag & (IGNBRK | BRKINT | PARMRK))
    port->read_status_mask |= URLS_URBI;

    /*
    --- a/drivers/tty/serial/serial_txx9.c
    +++ b/drivers/tty/serial/serial_txx9.c
    @@ -702,7 +702,7 @@ serial_txx9_set_termios(struct uart_port
    TXX9_SIDISR_TDIS | TXX9_SIDISR_RDIS;
    if (termios->c_iflag & INPCK)
    up->port.read_status_mask |= TXX9_SIDISR_UFER | TXX9_SIDISR_UPER;
    - if (termios->c_iflag & (BRKINT | PARMRK))
    + if (termios->c_iflag & (IGNBRK | BRKINT | PARMRK))
    up->port.read_status_mask |= TXX9_SIDISR_UBRK;

    /*
    --- a/drivers/tty/serial/sirfsoc_uart.c
    +++ b/drivers/tty/serial/sirfsoc_uart.c
    @@ -907,7 +907,7 @@ static void sirfsoc_uart_set_termios(str
    if (termios->c_iflag & INPCK)
    port->read_status_mask |= uint_en->sirfsoc_frm_err_en;
    }
    - if (termios->c_iflag & (BRKINT | PARMRK))
    + if (termios->c_iflag & (IGNBRK | BRKINT | PARMRK))
    port->read_status_mask |= uint_en->sirfsoc_rxd_brk_en;
    if (sirfport->uart_reg->uart_type == SIRF_REAL_UART) {
    if (termios->c_iflag & IGNPAR)
    --- a/drivers/tty/serial/st-asc.c
    +++ b/drivers/tty/serial/st-asc.c
    @@ -547,7 +547,7 @@ static void asc_set_termios(struct uart_
    ascport->port.read_status_mask = ASC_RXBUF_DUMMY_OE;
    if (termios->c_iflag & INPCK)
    ascport->port.read_status_mask |= ASC_RXBUF_FE | ASC_RXBUF_PE;
    - if (termios->c_iflag & (BRKINT | PARMRK))
    + if (termios->c_iflag & (IGNBRK | BRKINT | PARMRK))
    ascport->port.read_status_mask |= ASC_RXBUF_DUMMY_BE;

    /*
    --- a/drivers/tty/serial/sunsab.c
    +++ b/drivers/tty/serial/sunsab.c
    @@ -719,7 +719,7 @@ static void sunsab_convert_to_sab(struct
    if (iflag & INPCK)
    up->port.read_status_mask |= (SAB82532_ISR0_PERR |
    SAB82532_ISR0_FERR);
    - if (iflag & (BRKINT | PARMRK))
    + if (iflag & (IGNBRK | BRKINT | PARMRK))
    up->port.read_status_mask |= (SAB82532_ISR1_BRK << 8);

    /*
    --- a/drivers/tty/serial/sunsu.c
    +++ b/drivers/tty/serial/sunsu.c
    @@ -834,7 +834,7 @@ sunsu_change_speed(struct uart_port *por
    up->port.read_status_mask = UART_LSR_OE | UART_LSR_THRE | UART_LSR_DR;
    if (iflag & INPCK)
    up->port.read_status_mask |= UART_LSR_FE | UART_LSR_PE;
    - if (iflag & (BRKINT | PARMRK))
    + if (iflag & (IGNBRK | BRKINT | PARMRK))
    up->port.read_status_mask |= UART_LSR_BI;

    /*
    --- a/drivers/tty/serial/sunzilog.c
    +++ b/drivers/tty/serial/sunzilog.c
    @@ -915,7 +915,7 @@ sunzilog_convert_to_zs(struct uart_sunzi
    up->port.read_status_mask = Rx_OVR;
    if (iflag & INPCK)
    up->port.read_status_mask |= CRC_ERR | PAR_ERR;
    - if (iflag & (BRKINT | PARMRK))
    + if (iflag & (IGNBRK | BRKINT | PARMRK))
    up->port.read_status_mask |= BRK_ABRT;

    up->port.ignore_status_mask = 0;
    --- a/drivers/tty/serial/ucc_uart.c
    +++ b/drivers/tty/serial/ucc_uart.c
    @@ -936,7 +936,7 @@ static void qe_uart_set_termios(struct u
    port->read_status_mask = BD_SC_EMPTY | BD_SC_OV;
    if (termios->c_iflag & INPCK)
    port->read_status_mask |= BD_SC_FR | BD_SC_PR;
    - if (termios->c_iflag & (BRKINT | PARMRK))
    + if (termios->c_iflag & (IGNBRK | BRKINT | PARMRK))
    port->read_status_mask |= BD_SC_BR;

    /*
    --- a/drivers/tty/serial/vr41xx_siu.c
    +++ b/drivers/tty/serial/vr41xx_siu.c
    @@ -559,7 +559,7 @@ static void siu_set_termios(struct uart_
    port->read_status_mask = UART_LSR_THRE | UART_LSR_OE | UART_LSR_DR;
    if (c_iflag & INPCK)
    port->read_status_mask |= UART_LSR_FE | UART_LSR_PE;
    - if (c_iflag & (BRKINT | PARMRK))
    + if (c_iflag & (IGNBRK | BRKINT | PARMRK))
    port->read_status_mask |= UART_LSR_BI;

    port->ignore_status_mask = 0;
    --- a/drivers/tty/serial/zs.c
    +++ b/drivers/tty/serial/zs.c
    @@ -923,7 +923,7 @@ static void zs_set_termios(struct uart_p
    uport->read_status_mask = Rx_OVR;
    if (termios->c_iflag & INPCK)
    uport->read_status_mask |= FRM_ERR | PAR_ERR;
    - if (termios->c_iflag & (BRKINT | PARMRK))
    + if (termios->c_iflag & (IGNBRK | BRKINT | PARMRK))
    uport->read_status_mask |= Rx_BRK;

    uport->ignore_status_mask = 0;



    \
     
     \ /
      Last update: 2014-07-08 03:41    [W:4.409 / U:0.012 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site