]> git.karo-electronics.de Git - linux-beck.git/commitdiff
serial: 8250: Only get RSA resource when required
authorPeter Hurley <peter@hurleysoftware.com>
Tue, 24 Feb 2015 19:25:13 +0000 (14:25 -0500)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 26 Mar 2015 17:18:20 +0000 (18:18 +0100)
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>
drivers/tty/serial/8250/8250_core.c

index dcfe5500303f7b759841bed16490021d38726084..257e373bfccdf9f8fca9e7463409a8910005031b 100644 (file)
@@ -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)