serial: core: Remove unsafe x_char optimization
[firefly-linux-kernel-4.4.55.git] / drivers / tty / serial / serial_core.c
index 29a7be47389a9339fe2c049f7d3ee2cfd6160397..bdc543caf069a6f4a4d1dfa18f7309d44f15e02b 100644 (file)
@@ -175,12 +175,8 @@ static int uart_port_startup(struct tty_struct *tty, struct uart_state *state,
                        if (tty->termios.c_cflag & CBAUD)
                                uart_set_mctrl(uport, TIOCM_RTS | TIOCM_DTR);
                }
-               /*
-                * if hw support flow control without software intervention,
-                * then skip the below check
-                */
-               if (tty_port_cts_enabled(port) &&
-                   !(uport->flags & UPF_HARD_FLOW)) {
+
+               if (tty_port_cts_enabled(port)) {
                        spin_lock_irq(&uport->lock);
                        if (!(uport->ops->get_mctrl(uport) & TIOCM_CTS))
                                tty->hw_stopped = 1;
@@ -604,12 +600,11 @@ static void uart_send_xchar(struct tty_struct *tty, char ch)
        if (port->ops->send_xchar)
                port->ops->send_xchar(port, ch);
        else {
+               spin_lock_irqsave(&port->lock, flags);
                port->x_char = ch;
-               if (ch) {
-                       spin_lock_irqsave(&port->lock, flags);
+               if (ch)
                        port->ops->start_tx(port);
-                       spin_unlock_irqrestore(&port->lock, flags);
-               }
+               spin_unlock_irqrestore(&port->lock, flags);
        }
 }
 
@@ -652,12 +647,8 @@ static void uart_unthrottle(struct tty_struct *tty)
                mask &= ~port->flags;
        }
 
-       if (mask & UPF_SOFT_FLOW) {
-               if (port->x_char)
-                       port->x_char = 0;
-               else
-                       uart_send_xchar(tty, START_CHAR(tty));
-       }
+       if (mask & UPF_SOFT_FLOW)
+               uart_send_xchar(tty, START_CHAR(tty));
 
        if (mask & UPF_HARD_FLOW)
                uart_set_mctrl(port, TIOCM_RTS);
@@ -892,10 +883,11 @@ static int uart_set_info(struct tty_struct *tty, struct tty_port *port,
                         */
                        if (uport->flags & UPF_SPD_MASK) {
                                char buf[64];
-                               printk(KERN_NOTICE
-                                      "%s sets custom speed on %s. This "
-                                      "is deprecated.\n", current->comm,
-                                      tty_name(port->tty, buf));
+
+                               dev_notice(uport->dev,
+                                      "%s sets custom speed on %s. This is deprecated.\n",
+                                     current->comm,
+                                     tty_name(port->tty, buf));
                        }
                        uart_change_speed(tty, state, NULL);
                }
@@ -1291,8 +1283,7 @@ static void uart_set_termios(struct tty_struct *tty,
        /* Handle transition away from B0 status */
        else if (!(old_termios->c_cflag & CBAUD) && (cflag & CBAUD)) {
                unsigned int mask = TIOCM_DTR;
-               if (!(cflag & CRTSCTS) ||
-                   !test_bit(TTY_THROTTLED, &tty->flags))
+               if (!(cflag & CRTSCTS) || !test_bit(TTY_THROTTLED, &tty->flags))
                        mask |= TIOCM_RTS;
                uart_set_mctrl(uport, mask);
        }
@@ -1975,12 +1966,9 @@ int uart_suspend_port(struct uart_driver *drv, struct uart_port *uport)
                for (tries = 3; !ops->tx_empty(uport) && tries; tries--)
                        msleep(10);
                if (!tries)
-                       printk(KERN_ERR "%s%s%s%d: Unable to drain "
-                                       "transmitter\n",
-                              uport->dev ? dev_name(uport->dev) : "",
-                              uport->dev ? ": " : "",
-                              drv->dev_name,
-                              drv->tty_driver->name_base + uport->line);
+                       dev_err(uport->dev, "%s%d: Unable to drain transmitter\n",
+                               drv->dev_name,
+                               drv->tty_driver->name_base + uport->line);
 
                if (console_suspend_enabled || !uart_console(uport))
                        ops->shutdown(uport);
@@ -2109,9 +2097,7 @@ uart_report_port(struct uart_driver *drv, struct uart_port *port)
                break;
        }
 
-       printk(KERN_INFO "%s%s%s%d at %s (irq = %d, base_baud = %d) is a %s\n",
-              port->dev ? dev_name(port->dev) : "",
-              port->dev ? ": " : "",
+       dev_info(port->dev, "%s%d at %s (irq = %d, base_baud = %d) is a %s\n",
               drv->dev_name,
               drv->tty_driver->name_base + port->line,
               address, port->irq, port->uartclk / 16, uart_type(port));
@@ -2640,7 +2626,7 @@ int uart_add_one_port(struct uart_driver *drv, struct uart_port *uport)
        if (likely(!IS_ERR(tty_dev))) {
                device_set_wakeup_capable(tty_dev, 1);
        } else {
-               printk(KERN_ERR "Cannot register tty device on line %d\n",
+               dev_err(uport->dev, "Cannot register tty device on line %d\n",
                       uport->line);
        }
 
@@ -2675,7 +2661,7 @@ int uart_remove_one_port(struct uart_driver *drv, struct uart_port *uport)
        BUG_ON(in_interrupt());
 
        if (state->uart_port != uport)
-               printk(KERN_ALERT "Removing wrong port: %p != %p\n",
+               dev_alert(uport->dev, "Removing wrong port: %p != %p\n",
                        state->uart_port, uport);
 
        mutex_lock(&port_mutex);
@@ -2793,9 +2779,7 @@ void uart_handle_cts_change(struct uart_port *uport, unsigned int status)
 
        uport->icount.cts++;
 
-       /* skip below code if the hw flow control is supported */
-       if (tty_port_cts_enabled(port) &&
-           !(uport->flags & UPF_HARD_FLOW)) {
+       if (tty_port_cts_enabled(port)) {
                if (tty->hw_stopped) {
                        if (status) {
                                tty->hw_stopped = 0;