diff options
author | Peter Hurley <peter@hurleysoftware.com> | 2015-02-24 14:25:13 -0500 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2015-03-26 18:18:20 +0100 |
commit | 3b81c26c92414024a8046eb216782f3d599a5d77 (patch) | |
tree | 637c59f576604aea344a76a98a09741e82d40b73 /drivers/tty | |
parent | cd52b7599c1a1150719b2f6d20bce6b4f30dc8df (diff) | |
download | linux-3b81c26c92414024a8046eb216782f3d599a5d77.tar.bz2 |
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 <peter@hurleysoftware.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/tty')
-rw-r--r-- | drivers/tty/serial/8250/8250_core.c | 32 |
1 files 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) |