Skip to content

Commit 4afeced

Browse files
linosanfilippo-kunbusgregkh
authored andcommitted
serial: core: fix sanitizing check for RTS settings
Among other things uart_sanitize_serial_rs485() tests the sanity of the RTS settings in a RS485 configuration that has been passed by userspace. If RTS-on-send and RTS-after-send are both set or unset the configuration is adjusted and RTS-after-send is disabled and RTS-on-send enabled. This however makes only sense if both RTS modes are actually supported by the driver. With commit be2e2cb ("serial: Sanitize rs485_struct") the code does take the driver support into account but only checks if one of both RTS modes are supported. This may lead to the errorneous result of RTS-on-send being set even if only RTS-after-send is supported. Fix this by changing the implemented logic: First clear all unsupported flags in the RS485 configuration, then adjust an invalid RTS setting by taking into account which RTS mode is supported. Cc: <[email protected]> Fixes: be2e2cb ("serial: Sanitize rs485_struct") Reviewed-by: Ilpo Järvinen <[email protected]> Signed-off-by: Lino Sanfilippo <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Greg Kroah-Hartman <[email protected]>
1 parent 1a33e33 commit 4afeced

File tree

1 file changed

+18
-10
lines changed

1 file changed

+18
-10
lines changed

drivers/tty/serial/serial_core.c

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1376,19 +1376,27 @@ static void uart_sanitize_serial_rs485(struct uart_port *port, struct serial_rs4
13761376
return;
13771377
}
13781378

1379+
rs485->flags &= supported_flags;
1380+
13791381
/* Pick sane settings if the user hasn't */
1380-
if ((supported_flags & (SER_RS485_RTS_ON_SEND|SER_RS485_RTS_AFTER_SEND)) &&
1381-
!(rs485->flags & SER_RS485_RTS_ON_SEND) ==
1382+
if (!(rs485->flags & SER_RS485_RTS_ON_SEND) ==
13821383
!(rs485->flags & SER_RS485_RTS_AFTER_SEND)) {
1383-
dev_warn_ratelimited(port->dev,
1384-
"%s (%d): invalid RTS setting, using RTS_ON_SEND instead\n",
1385-
port->name, port->line);
1386-
rs485->flags |= SER_RS485_RTS_ON_SEND;
1387-
rs485->flags &= ~SER_RS485_RTS_AFTER_SEND;
1388-
supported_flags |= SER_RS485_RTS_ON_SEND|SER_RS485_RTS_AFTER_SEND;
1389-
}
1384+
if (supported_flags & SER_RS485_RTS_ON_SEND) {
1385+
rs485->flags |= SER_RS485_RTS_ON_SEND;
1386+
rs485->flags &= ~SER_RS485_RTS_AFTER_SEND;
13901387

1391-
rs485->flags &= supported_flags;
1388+
dev_warn_ratelimited(port->dev,
1389+
"%s (%d): invalid RTS setting, using RTS_ON_SEND instead\n",
1390+
port->name, port->line);
1391+
} else {
1392+
rs485->flags |= SER_RS485_RTS_AFTER_SEND;
1393+
rs485->flags &= ~SER_RS485_RTS_ON_SEND;
1394+
1395+
dev_warn_ratelimited(port->dev,
1396+
"%s (%d): invalid RTS setting, using RTS_AFTER_SEND instead\n",
1397+
port->name, port->line);
1398+
}
1399+
}
13921400

13931401
uart_sanitize_serial_rs485_delays(port, rs485);
13941402

0 commit comments

Comments
 (0)