From 3b81c26c92414024a8046eb216782f3d599a5d77 Mon Sep 17 00:00:00 2001 From: Peter Hurley Date: Tue, 24 Feb 2015 14:25:13 -0500 Subject: [PATCH] serial: 8250: Only get RSA resource when required The probe for Remote Supervisor Adapter is limited to port i/o addresses which match one of the probe_rsa[] module parameter addresses. Limit RSA resource acquire to matching i/o ports. The result is a saner probe policy: only perform optional probes when specified rather than by default. NB: It is possible for userspace to set the port type == PORT_RSA with ioctl(TIOCSSERIAL) and then autoconfig with ioctl(TIOCSERCONFIG), which if it fails, may leave the port type set to PORT_RSA. Since this may have previously resulted in a working RSA port, this behavior is preserved. Signed-off-by: Peter Hurley Signed-off-by: Greg Kroah-Hartman --- drivers/tty/serial/8250/8250_core.c | 32 ++++++++++++++++------------- 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/drivers/tty/serial/8250/8250_core.c b/drivers/tty/serial/8250/8250_core.c index dcfe5500303f..257e373bfccd 100644 --- a/drivers/tty/serial/8250/8250_core.c +++ b/drivers/tty/serial/8250/8250_core.c @@ -1228,16 +1228,9 @@ static void autoconfig(struct uart_8250_port *up, unsigned int probeflags) /* * Only probe for RSA ports if we got the region. */ - if (port->type == PORT_16550A && probeflags & PROBE_RSA) { - int i; - - for (i = 0 ; i < probe_rsa_count; ++i) { - if (probe_rsa[i] == port->iobase && __enable_rsa(up)) { - port->type = PORT_RSA; - break; - } - } - } + if (port->type == PORT_16550A && probeflags & PROBE_RSA && + __enable_rsa(up)) + port->type = PORT_RSA; #endif serial_out(up, UART_LCR, save_lcr); @@ -3008,7 +3001,7 @@ static void register_dev_spec_attr_grp(struct uart_8250_port *up) static void serial8250_config_port(struct uart_port *port, int flags) { struct uart_8250_port *up = up_to_u8250p(port); - int probeflags = PROBE_ANY; + int probeflags = 0; int ret; if (port->type == PORT_8250_CIR) @@ -3023,9 +3016,20 @@ static void serial8250_config_port(struct uart_port *port, int flags) return; #ifdef CONFIG_SERIAL_8250_RSA - ret = serial8250_request_rsa_resource(up); - if (ret < 0) - probeflags &= ~PROBE_RSA; + if (port->type == PORT_RSA) { + if (serial8250_request_rsa_resource(up) == 0) + probeflags |= PROBE_RSA; + } else if (flags & UART_CONFIG_TYPE) { + int i; + + for (i = 0 ; i < probe_rsa_count; ++i) { + if (probe_rsa[i] == port->iobase) { + if (serial8250_request_rsa_resource(up) == 0) + probeflags |= PROBE_RSA; + break; + } + } + } #endif if (port->iotype != up->cur_iotype) -- 2.39.2