From: "Ilpo Järvinen" <ilpo.jarvinen@linux.intel.com>
To: linux-serial@vger.kernel.org,
Greg KH <gregkh@linuxfoundation.org>,
Jiri Slaby <jirislaby@kernel.org>,
Jonathan Corbet <corbet@lwn.net>,
linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org
Cc: "Ilpo Järvinen" <ilpo.jarvinen@linux.intel.com>
Subject: [PATCH 22/36] serial: Sanitize rs485_struct
Date: Mon, 6 Jun 2022 13:04:19 +0300 [thread overview]
Message-ID: <20220606100433.13793-23-ilpo.jarvinen@linux.intel.com> (raw)
In-Reply-To: <20220606100433.13793-1-ilpo.jarvinen@linux.intel.com>
Sanitize serial_rs485 struct before calling into rs485_setup. The
drivers provide supported_rs485 to help sanitization of the fields.
If neither of SER_RS485_RTS_ON_SEND or SER_RS485_RTS_AFTER_SEND
supported, don't pretend they can be set to sane settings but clear
them both instead. If only one of them is supported it may look
tempting to use the one driver supports to set the other, however, the
userspace does not have that information readily available so it
wouldn't be helpful.
While adjusting the documentation, remove also the claim that
TIOCGRS485 would call driver specific code. In reality, it does nothing
else than copies the stored serial_rs485 structure from uart_port to
userspace.
Signed-off-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
---
.../driver-api/serial/serial-rs485.rst | 12 ++++---
drivers/tty/serial/serial_core.c | 33 ++++++++++++++++---
2 files changed, 37 insertions(+), 8 deletions(-)
diff --git a/Documentation/driver-api/serial/serial-rs485.rst b/Documentation/driver-api/serial/serial-rs485.rst
index 6bc824f948f9..00b5d333acba 100644
--- a/Documentation/driver-api/serial/serial-rs485.rst
+++ b/Documentation/driver-api/serial/serial-rs485.rst
@@ -38,10 +38,14 @@ RS485 Serial Communications
the values given by the device tree.
Any driver for devices capable of working both as RS232 and RS485 should
- implement the rs485_config callback in the uart_port structure. The
- serial_core calls rs485_config to do the device specific part in response
- to TIOCSRS485 and TIOCGRS485 ioctls (see below). The rs485_config callback
- receives a pointer to struct serial_rs485.
+ implement the rs485_config callback and provide rs485_supported in the
+ uart_port structure. The serial core calls rs485_config to do the device
+ specific part in response to TIOCSRS485 ioctl (see below). The rs485_config
+ callback receives a pointer to a sanitizated serial_rs485 structure. The
+ serial_rs485 userspace provides is sanitized before calling rs485_config
+ using rs485_supported that indicates what RS485 features the driver supports
+ for the uart_port. TIOCGRS485 ioctl can be used to read back the
+ serial_rs485 structure matching to the current configuration.
4. Usage from user-level
========================
diff --git a/drivers/tty/serial/serial_core.c b/drivers/tty/serial/serial_core.c
index 44a50158552d..f0d7b3d20731 100644
--- a/drivers/tty/serial/serial_core.c
+++ b/drivers/tty/serial/serial_core.c
@@ -1278,36 +1278,61 @@ static int uart_get_icount(struct tty_struct *tty,
static void uart_sanitize_serial_rs485(struct uart_port *port, struct serial_rs485 *rs485)
{
+ u32 supported_flags = port->rs485_supported->flags;
+
/* pick sane settings if the user hasn't */
- if (!(rs485->flags & SER_RS485_RTS_ON_SEND) ==
+ if ((supported_flags & (SER_RS485_RTS_ON_SEND|SER_RS485_RTS_AFTER_SEND)) &&
+ !(rs485->flags & SER_RS485_RTS_ON_SEND) ==
!(rs485->flags & SER_RS485_RTS_AFTER_SEND)) {
dev_warn_ratelimited(port->dev,
"%s (%d): invalid RTS setting, using RTS_ON_SEND instead\n",
port->name, port->line);
rs485->flags |= SER_RS485_RTS_ON_SEND;
rs485->flags &= ~SER_RS485_RTS_AFTER_SEND;
+ supported_flags |= SER_RS485_RTS_ON_SEND|SER_RS485_RTS_AFTER_SEND;
}
- if (rs485->delay_rts_before_send > RS485_MAX_RTS_DELAY) {
+ if (!port->rs485_supported->delay_rts_before_send) {
+ if (rs485->delay_rts_before_send) {
+ dev_warn_ratelimited(port->dev,
+ "%s (%d): RTS delay before sending not supported\n",
+ port->name, port->line);
+ }
+ rs485->delay_rts_before_send = 0;
+ } else if (rs485->delay_rts_before_send > RS485_MAX_RTS_DELAY) {
rs485->delay_rts_before_send = RS485_MAX_RTS_DELAY;
dev_warn_ratelimited(port->dev,
"%s (%d): RTS delay before sending clamped to %u ms\n",
port->name, port->line, rs485->delay_rts_before_send);
}
- if (rs485->delay_rts_after_send > RS485_MAX_RTS_DELAY) {
+ if (!port->rs485_supported->delay_rts_after_send) {
+ if (rs485->delay_rts_after_send) {
+ dev_warn_ratelimited(port->dev,
+ "%s (%d): RTS delay after sending not supported\n",
+ port->name, port->line);
+ }
+ rs485->delay_rts_after_send = 0;
+ } else if (rs485->delay_rts_after_send > RS485_MAX_RTS_DELAY) {
rs485->delay_rts_after_send = RS485_MAX_RTS_DELAY;
dev_warn_ratelimited(port->dev,
"%s (%d): RTS delay after sending clamped to %u ms\n",
port->name, port->line, rs485->delay_rts_after_send);
}
+
+ rs485->flags &= supported_flags;
+
/* Return clean padding area to userspace */
memset(rs485->padding, 0, sizeof(rs485->padding));
}
int uart_rs485_config(struct uart_port *port)
{
- return port->rs485_config(port, &port->rs485);
+ struct serial_rs485 *rs485 = &port->rs485;
+
+ uart_sanitize_serial_rs485(port, rs485);
+
+ return port->rs485_config(port, rs485);
}
EXPORT_SYMBOL_GPL(uart_rs485_config);
--
2.30.2
next prev parent reply other threads:[~2022-06-06 10:08 UTC|newest]
Thread overview: 41+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-06-06 10:03 [PATCH 00/36] RS485 serial_rs485 sanitization Ilpo Järvinen
2022-06-06 10:03 ` [PATCH 01/36] serial: Add uart_rs485_config() Ilpo Järvinen
2022-06-25 20:19 ` Lukas Wunner
2022-06-26 12:36 ` Lino Sanfilippo
2022-06-06 10:03 ` [PATCH 02/36] serial: Move serial_rs485 sanitization into separate function Ilpo Järvinen
2022-06-06 10:04 ` [PATCH 03/36] serial: Add rs485_supported to uart_port Ilpo Järvinen
2022-06-06 10:04 ` [PATCH 04/36] serial: 8250: Create serial8250_em485_supported for em485 users Ilpo Järvinen
2022-06-06 10:04 ` [PATCH 05/36] serial: 8250_bcm2835aux: Use serial8250_em485_supported Ilpo Järvinen
2022-06-06 10:04 ` [PATCH 06/36] serial: 8250_dwlib: Fill in rs485_supported Ilpo Järvinen
2022-06-06 10:04 ` [PATCH 07/36] serial: 8250_exar: " Ilpo Järvinen
2022-06-06 10:04 ` [PATCH 08/36] serial: 8250_fintek: " Ilpo Järvinen
2022-06-06 10:04 ` [PATCH 09/36] serial: 8250_lpc18cc: " Ilpo Järvinen
2022-06-06 10:04 ` [PATCH 10/36] serial: 8250_of: Use serial8250_em485_supported Ilpo Järvinen
2022-06-06 10:04 ` [PATCH 11/36] serial: 8250_pci: Fill in rs485_supported for pci_fintek Ilpo Järvinen
2022-06-06 10:04 ` [PATCH 12/36] serial: pl011: Fill in rs485_supported Ilpo Järvinen
2022-06-06 10:04 ` [PATCH 13/36] serial: ar933x: " Ilpo Järvinen
2022-06-06 10:04 ` [PATCH 14/36] serial: atmel: " Ilpo Järvinen
2022-06-06 10:04 ` [PATCH 15/36] serial: fsl_lpuart: " Ilpo Järvinen
2022-06-06 10:04 ` [PATCH 16/36] serial: imx: " Ilpo Järvinen
2022-06-06 10:04 ` [PATCH 17/36] serial: max310x: " Ilpo Järvinen
2022-06-06 10:04 ` [PATCH 18/36] serial: mcf: " Ilpo Järvinen
2022-06-06 10:04 ` [PATCH 19/36] serial: omap: " Ilpo Järvinen
2022-06-06 10:04 ` [PATCH 20/36] serial: sc16is7xx: " Ilpo Järvinen
2022-06-06 10:04 ` [PATCH 21/36] serial: stm32: " Ilpo Järvinen
2022-06-06 10:04 ` Ilpo Järvinen [this message]
2022-06-25 20:12 ` [PATCH 22/36] serial: Sanitize rs485_struct Lukas Wunner
2022-06-26 12:39 ` Lino Sanfilippo
2022-06-06 10:04 ` [PATCH 23/36] serial: Clear rs485 struct when non-RS485 mode is set Ilpo Järvinen
2022-06-06 10:04 ` [PATCH 24/36] serial: return -EINVAL for non-legacy RS485 flags Ilpo Järvinen
2022-06-06 10:04 ` [PATCH 25/36] serial: 8250_dwlib: Remove serial_rs485 sanitization Ilpo Järvinen
2022-06-06 10:04 ` [PATCH 26/36] serial: 8250_fintek: " Ilpo Järvinen
2022-06-06 10:04 ` [PATCH 27/36] serial: 8250: lpc18xx: " Ilpo Järvinen
2022-06-06 10:04 ` [PATCH 28/36] serial: 8250_pci: " Ilpo Järvinen
2022-06-06 10:04 ` [PATCH 29/36] serial: pl011: " Ilpo Järvinen
2022-06-06 10:04 ` [PATCH 30/36] serial: fsl_lpuart: Call core's sanitization and remove custom one Ilpo Järvinen
2022-06-06 10:04 ` [PATCH 31/36] serial: imx: Remove serial_rs485 sanitization Ilpo Järvinen
2022-06-06 10:04 ` [PATCH 32/36] serial: max310x: " Ilpo Järvinen
2022-06-06 10:04 ` [PATCH 33/36] serial: 8250_exar: Remove serial_rs485 assignment Ilpo Järvinen
2022-06-06 10:04 ` [PATCH 34/36] serial: mcf: " Ilpo Järvinen
2022-06-06 10:04 ` [PATCH 35/36] serial: sc16is7xx: " Ilpo Järvinen
2022-06-06 10:04 ` [PATCH 36/36] serial: 8250: Remove serial_rs485 sanitization from em485 Ilpo Järvinen
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20220606100433.13793-23-ilpo.jarvinen@linux.intel.com \
--to=ilpo.jarvinen@linux.intel.com \
--cc=corbet@lwn.net \
--cc=gregkh@linuxfoundation.org \
--cc=jirislaby@kernel.org \
--cc=linux-doc@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-serial@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®