This avoids mangling with registers when reading the RS485 status via IOCTL. Also, features can check their configuration at runtime which will be needed for a later patch. Signed-off-by: Wolfram Sang <w.sang@xxxxxxxxxxxxxx> --- drivers/tty/serial/8250.c | 16 +++++----------- 1 files changed, 5 insertions(+), 11 deletions(-) diff --git a/drivers/tty/serial/8250.c b/drivers/tty/serial/8250.c index 920b4df..b5d3248 100644 --- a/drivers/tty/serial/8250.c +++ b/drivers/tty/serial/8250.c @@ -154,6 +154,7 @@ struct uart_8250_port { unsigned char lsr_saved_flags; #define MSR_SAVE_FLAGS UART_MSR_ANY_DELTA unsigned char msr_saved_flags; + __u32 rs485_flags; /* copied from IOCTL */ }; struct irq_info { @@ -2729,28 +2730,21 @@ static int serial8250_ioctl_port(struct uart_port *port, serial_outp(up, UART_FCTR, fctr); serial_outp(up, UART_LCR, lcr); spin_unlock_irqrestore(&up->port.lock, flags); + + up->rs485_flags = rs485ctrl.flags; + return 0; } case TIOCGRS485: { struct serial_rs485 rs485ctrl; - unsigned char lcr; if (port->type != PORT_16850) return -ENOTTY; memset(&rs485ctrl, 0, sizeof(rs485ctrl)); - - spin_lock_irqsave(&up->port.lock, flags); - lcr = serial_inp(up, UART_LCR); - serial_outp(up, UART_LCR, UART_LCR_CONF_MODE_B); - if (serial_inp(up, UART_FCTR) & UART_FCTR_RS485) - rs485ctrl.flags = SER_RS485_ENABLED; - else - rs485ctrl.flags = 0; - serial_outp(up, UART_LCR, lcr); - spin_unlock_irqrestore(&up->port.lock, flags); + rs485ctrl.flags = up->rs485_flags; if (copy_to_user((struct serial_rs485 *)arg, &rs485ctrl, sizeof(rs485ctrl))) -- 1.7.7.1 -- To unsubscribe from this list: send the line "unsubscribe linux-serial" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html