Merge branch 'for_next' into for_linus
[firefly-linux-kernel-4.4.55.git] / drivers / usb / serial / f81232.c
index 6b880c33d25872a4a90e16a888a92e01888443f6..a172ad5c5ce80c1c00983960a04339ac3c13fb24 100644 (file)
@@ -47,7 +47,6 @@ MODULE_DEVICE_TABLE(usb, id_table);
 
 struct f81232_private {
        spinlock_t lock;
-       wait_queue_head_t delta_msr_wait;
        u8 line_control;
        u8 line_status;
 };
@@ -100,7 +99,6 @@ static void f81232_process_read_urb(struct urb *urb)
 {
        struct usb_serial_port *port = urb->context;
        struct f81232_private *priv = usb_get_serial_port_data(port);
-       struct tty_struct *tty;
        unsigned char *data = urb->transfer_buffer;
        char tty_flag = TTY_NORMAL;
        unsigned long flags;
@@ -112,15 +110,11 @@ static void f81232_process_read_urb(struct urb *urb)
        line_status = priv->line_status;
        priv->line_status &= ~UART_STATE_TRANSIENT_MASK;
        spin_unlock_irqrestore(&priv->lock, flags);
-       wake_up_interruptible(&priv->delta_msr_wait);
+       wake_up_interruptible(&port->delta_msr_wait);
 
        if (!urb->actual_length)
                return;
 
-       tty = tty_port_tty_get(&port->port);
-       if (!tty)
-               return;
-
        /* break takes precedence over parity, */
        /* which takes precedence over framing errors */
        if (line_status & UART_BREAK_ERROR)
@@ -145,8 +139,7 @@ static void f81232_process_read_urb(struct urb *urb)
                                                        urb->actual_length);
        }
 
-       tty_flip_buffer_push(tty);
-       tty_kref_put(tty);
+       tty_flip_buffer_push(&port->port);
 }
 
 static int set_control_lines(struct usb_device *dev, u8 value)
@@ -262,11 +255,14 @@ static int wait_modem_info(struct usb_serial_port *port, unsigned int arg)
        spin_unlock_irqrestore(&priv->lock, flags);
 
        while (1) {
-               interruptible_sleep_on(&priv->delta_msr_wait);
+               interruptible_sleep_on(&port->delta_msr_wait);
                /* see if a signal did it */
                if (signal_pending(current))
                        return -ERESTARTSYS;
 
+               if (port->serial->disconnected)
+                       return -EIO;
+
                spin_lock_irqsave(&priv->lock, flags);
                status = priv->line_status;
                spin_unlock_irqrestore(&priv->lock, flags);
@@ -328,7 +324,6 @@ static int f81232_port_probe(struct usb_serial_port *port)
                return -ENOMEM;
 
        spin_lock_init(&priv->lock);
-       init_waitqueue_head(&priv->delta_msr_wait);
 
        usb_set_serial_port_data(port, priv);