diff options
Diffstat (limited to 'drivers/usb/serial/spcp8x5.c')
| -rw-r--r-- | drivers/usb/serial/spcp8x5.c | 9 | 
1 files changed, 5 insertions, 4 deletions
| diff --git a/drivers/usb/serial/spcp8x5.c b/drivers/usb/serial/spcp8x5.c index 91ff8e3bddb..549ef68ff5f 100644 --- a/drivers/usb/serial/spcp8x5.c +++ b/drivers/usb/serial/spcp8x5.c @@ -149,7 +149,6 @@ enum spcp8x5_type {  struct spcp8x5_private {  	spinlock_t 	lock;  	enum spcp8x5_type	type; -	wait_queue_head_t	delta_msr_wait;  	u8 			line_control;  	u8 			line_status;  }; @@ -179,7 +178,6 @@ static int spcp8x5_port_probe(struct usb_serial_port *port)  		return -ENOMEM;  	spin_lock_init(&priv->lock); -	init_waitqueue_head(&priv->delta_msr_wait);  	priv->type = type;  	usb_set_serial_port_data(port , priv); @@ -475,7 +473,7 @@ static void spcp8x5_process_read_urb(struct urb *urb)  	priv->line_status &= ~UART_STATE_TRANSIENT_MASK;  	spin_unlock_irqrestore(&priv->lock, flags);  	/* wake up the wait for termios */ -	wake_up_interruptible(&priv->delta_msr_wait); +	wake_up_interruptible(&port->delta_msr_wait);  	if (!urb->actual_length)  		return; @@ -526,12 +524,15 @@ static int spcp8x5_wait_modem_info(struct usb_serial_port *port,  	while (1) {  		/* wake up in bulk read */ -		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); |