diff options
Diffstat (limited to 'drivers/usb/serial/quatech2.c')
| -rw-r--r-- | drivers/usb/serial/quatech2.c | 19 | 
1 files changed, 12 insertions, 7 deletions
| diff --git a/drivers/usb/serial/quatech2.c b/drivers/usb/serial/quatech2.c index 00e6c9bac8a..75f125ddb0c 100644 --- a/drivers/usb/serial/quatech2.c +++ b/drivers/usb/serial/quatech2.c @@ -128,7 +128,6 @@ struct qt2_port_private {  	u8          shadowLSR;  	u8          shadowMSR; -	wait_queue_head_t   delta_msr_wait; /* Used for TIOCMIWAIT */  	struct async_icount icount;  	struct usb_serial_port *port; @@ -506,8 +505,9 @@ static int wait_modem_info(struct usb_serial_port *port, unsigned int arg)  	spin_unlock_irqrestore(&priv->lock, flags);  	while (1) { -		wait_event_interruptible(priv->delta_msr_wait, -					 ((priv->icount.rng != prev.rng) || +		wait_event_interruptible(port->delta_msr_wait, +					 (port->serial->disconnected || +					  (priv->icount.rng != prev.rng) ||  					  (priv->icount.dsr != prev.dsr) ||  					  (priv->icount.dcd != prev.dcd) ||  					  (priv->icount.cts != prev.cts))); @@ -515,6 +515,9 @@ static int wait_modem_info(struct usb_serial_port *port, unsigned int arg)  		if (signal_pending(current))  			return -ERESTARTSYS; +		if (port->serial->disconnected) +			return -EIO; +  		spin_lock_irqsave(&priv->lock, flags);  		cur = priv->icount;  		spin_unlock_irqrestore(&priv->lock, flags); @@ -661,7 +664,9 @@ void qt2_process_read_urb(struct urb *urb)  						 __func__);  					break;  				} -				tty_flip_buffer_push(&port->port); + +				if (port_priv->is_open) +					tty_flip_buffer_push(&port->port);  				newport = *(ch + 3); @@ -704,7 +709,8 @@ void qt2_process_read_urb(struct urb *urb)  		tty_insert_flip_string(&port->port, ch, 1);  	} -	tty_flip_buffer_push(&port->port); +	if (port_priv->is_open) +		tty_flip_buffer_push(&port->port);  }  static void qt2_write_bulk_callback(struct urb *urb) @@ -824,7 +830,6 @@ static int qt2_port_probe(struct usb_serial_port *port)  	spin_lock_init(&port_priv->lock);  	spin_lock_init(&port_priv->urb_lock); -	init_waitqueue_head(&port_priv->delta_msr_wait);  	port_priv->port = port;  	port_priv->write_urb = usb_alloc_urb(0, GFP_KERNEL); @@ -967,7 +972,7 @@ static void qt2_update_msr(struct usb_serial_port *port, unsigned char *ch)  		if (newMSR & UART_MSR_TERI)  			port_priv->icount.rng++; -		wake_up_interruptible(&port_priv->delta_msr_wait); +		wake_up_interruptible(&port->delta_msr_wait);  	}  } |