Hi, On 14.02.22 at 06:41, Jiri Slaby wrote: > On 13. 02. 22, 23:27, Lino Sanfilippo wrote: >> Several drivers that support setting the RS485 configuration via userspace >> implement on or more of the following tasks: >> >> - in case of an invalid RTS configuration (both RTS after send and RTS on >> send set or both unset) fall back to enable RTS on send and disable RTS >> after send >> >> - nullify the padding field of the returned serial_rs485 struct >> >> - copy the configuration into the uart port struct >> >> - limit RTS delays to 100 ms >> >> Move these tasks into the serial core to make them generic and to provide >> a consistent beheviour among all drivers. >> >> Signed-off-by: Lino Sanfilippo <LinoSanfilippo@xxxxxx> >> --- >> drivers/tty/serial/serial_core.c | 13 +++++++++++++ >> 1 file changed, 13 insertions(+) >> >> diff --git a/drivers/tty/serial/serial_core.c b/drivers/tty/serial/serial_core.c >> index 846192a7b4bf..3fab4070359c 100644 >> --- a/drivers/tty/serial/serial_core.c >> +++ b/drivers/tty/serial/serial_core.c >> @@ -1282,8 +1282,21 @@ static int uart_set_rs485_config(struct uart_port *port, >> if (copy_from_user(&rs485, rs485_user, sizeof(*rs485_user))) >> return -EFAULT; >> + /* pick sane settings if the user hasn't */ >> + if (!(rs485.flags & SER_RS485_RTS_ON_SEND) == >> + !(rs485.flags & SER_RS485_RTS_AFTER_SEND)) { >> + rs485.flags |= SER_RS485_RTS_ON_SEND; >> + rs485.flags &= ~SER_RS485_RTS_AFTER_SEND; >> + } >> + /* clamp the delays to [0, 100ms] */ >> + rs485.delay_rts_before_send = min(rs485.delay_rts_before_send, 100U); >> + rs485.delay_rts_after_send = min(rs485.delay_rts_after_send, 100U); > > Why is this magic 100? The only drivers that seem to care about a max value for the RTS delays use 100 ms (omap-serial, amba pl011, 8250) so I chose this to stay compatible with the current driver implementations. 100 ms also seems large enough to be used as a general max value. > Can we have that number somehow documented? You should define a macro for that anyway. Ok, I will do so. > >> + memset(rs485.padding, 0, sizeof(rs485.padding)); > > What is this memset good for? Drivers like max310x, amba-pl011, 8250_pci, 8250_fintek, 8250_lpc18xx seem to care about returning a serial_rs485 struct with cleared padding field to userspace. So they all clear that field on their own. Although not really necessary, to me this seems to be a good default behavior, so I added it to the serial core. > >> spin_lock_irqsave(&port->lock, flags); >> ret = port->rs485_config(port, &rs485); >> + if (!ret) >> + port->rs485 = rs485; >> spin_unlock_irqrestore(&port->lock, flags); >> if (ret) >> return ret; > > thanks, Thanks for the review! Regards, Lino