When rs485 enabled and RTS_AFTER_SEND set on startup, need to preserve
mctrl status, because later functions will call set_mctrl passing
port->mctrl=0 overriding rts status, resulting in rts pin in
transmission when idle.

Make mctrl reflect rts pin state.

Signed-off-by: Giulio Benetti <giulio.bene...@micronovasrl.com>
---
 drivers/tty/serial/8250/8250_port.c | 7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)

diff --git a/drivers/tty/serial/8250/8250_port.c 
b/drivers/tty/serial/8250/8250_port.c
index 95833cbc4338..c8c10b5ec6d6 100644
--- a/drivers/tty/serial/8250/8250_port.c
+++ b/drivers/tty/serial/8250/8250_port.c
@@ -562,10 +562,13 @@ static inline void serial8250_em485_rts_after_send(struct 
uart_8250_port *p)
 {
        unsigned char mcr = serial8250_in_MCR(p);
 
-       if (p->port.rs485.flags & SER_RS485_RTS_AFTER_SEND)
+       if (p->port.rs485.flags & SER_RS485_RTS_AFTER_SEND) {
                mcr |= UART_MCR_RTS;
-       else
+               p->port.mctrl |= TIOCM_RTS;
+       } else {
                mcr &= ~UART_MCR_RTS;
+               p->port.mctrl &= ~TIOCM_RTS;
+       }
        serial8250_out_MCR(p, mcr);
 }
 
-- 
2.17.1

Reply via email to