| From 33e8378918fbb59ac2ecf5553d799925bb355b16 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Wed, 21 Sep 2022 00:35:32 +0100 |
| Subject: serial: 8250: Let drivers request full 16550A feature probing |
| |
| From: Maciej W. Rozycki <macro@orcam.me.uk> |
| |
| [ Upstream commit 9906890c89e4dbd900ed87ad3040080339a7f411 ] |
| |
| A SERIAL_8250_16550A_VARIANTS configuration option has been recently |
| defined that lets one request the 8250 driver not to probe for 16550A |
| device features so as to reduce the driver's device startup time in |
| virtual machines. |
| |
| Some actual hardware devices require these features to have been fully |
| determined however for their driver to work correctly, so define a flag |
| to let drivers request full 16550A feature probing on a device-by-device |
| basis if required regardless of the SERIAL_8250_16550A_VARIANTS option |
| setting chosen. |
| |
| Fixes: dc56ecb81a0a ("serial: 8250: Support disabling mdelay-filled probes of 16550A variants") |
| Cc: stable@vger.kernel.org # v5.6+ |
| Reported-by: Anders Blomdell <anders.blomdell@control.lth.se> |
| Signed-off-by: Maciej W. Rozycki <macro@orcam.me.uk> |
| Link: https://lore.kernel.org/r/alpine.DEB.2.21.2209202357520.41633@angie.orcam.me.uk |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/tty/serial/8250/8250_port.c | 3 ++- |
| include/linux/serial_core.h | 3 ++- |
| 2 files changed, 4 insertions(+), 2 deletions(-) |
| |
| diff --git a/drivers/tty/serial/8250/8250_port.c b/drivers/tty/serial/8250/8250_port.c |
| index 8b3756e4bb05..f648fd1d7548 100644 |
| --- a/drivers/tty/serial/8250/8250_port.c |
| +++ b/drivers/tty/serial/8250/8250_port.c |
| @@ -1023,7 +1023,8 @@ static void autoconfig_16550a(struct uart_8250_port *up) |
| up->port.type = PORT_16550A; |
| up->capabilities |= UART_CAP_FIFO; |
| |
| - if (!IS_ENABLED(CONFIG_SERIAL_8250_16550A_VARIANTS)) |
| + if (!IS_ENABLED(CONFIG_SERIAL_8250_16550A_VARIANTS) && |
| + !(up->port.flags & UPF_FULL_PROBE)) |
| return; |
| |
| /* |
| diff --git a/include/linux/serial_core.h b/include/linux/serial_core.h |
| index 59a8caf3230a..6df4c3356ae6 100644 |
| --- a/include/linux/serial_core.h |
| +++ b/include/linux/serial_core.h |
| @@ -100,7 +100,7 @@ struct uart_icount { |
| __u32 buf_overrun; |
| }; |
| |
| -typedef unsigned int __bitwise upf_t; |
| +typedef u64 __bitwise upf_t; |
| typedef unsigned int __bitwise upstat_t; |
| |
| struct uart_port { |
| @@ -207,6 +207,7 @@ struct uart_port { |
| #define UPF_FIXED_PORT ((__force upf_t) (1 << 29)) |
| #define UPF_DEAD ((__force upf_t) (1 << 30)) |
| #define UPF_IOREMAP ((__force upf_t) (1 << 31)) |
| +#define UPF_FULL_PROBE ((__force upf_t) (1ULL << 32)) |
| |
| #define __UPF_CHANGE_MASK 0x17fff |
| #define UPF_CHANGE_MASK ((__force upf_t) __UPF_CHANGE_MASK) |
| -- |
| 2.35.1 |
| |