diff options
Diffstat (limited to 'drivers/usb/serial/mct_u232.c')
| -rw-r--r-- | drivers/usb/serial/mct_u232.c | 13 | 
1 files changed, 7 insertions, 6 deletions
| diff --git a/drivers/usb/serial/mct_u232.c b/drivers/usb/serial/mct_u232.c index a64d420f687..06d5a60be2c 100644 --- a/drivers/usb/serial/mct_u232.c +++ b/drivers/usb/serial/mct_u232.c @@ -114,8 +114,6 @@ struct mct_u232_private {  	unsigned char	     last_msr;      /* Modem Status Register */  	unsigned int	     rx_flags;      /* Throttling flags */  	struct async_icount  icount; -	wait_queue_head_t    msr_wait;	/* for handling sleeping while waiting -						for msr change to happen */  };  #define THROTTLED		0x01 @@ -409,7 +407,6 @@ static int mct_u232_port_probe(struct usb_serial_port *port)  		return -ENOMEM;  	spin_lock_init(&priv->lock); -	init_waitqueue_head(&priv->msr_wait);  	usb_set_serial_port_data(port, priv); @@ -601,7 +598,7 @@ static void mct_u232_read_int_callback(struct urb *urb)  		tty_kref_put(tty);  	}  #endif -	wake_up_interruptible(&priv->msr_wait); +	wake_up_interruptible(&port->delta_msr_wait);  	spin_unlock_irqrestore(&priv->lock, flags);  exit:  	retval = usb_submit_urb(urb, GFP_ATOMIC); @@ -810,13 +807,17 @@ static int  mct_u232_ioctl(struct tty_struct *tty,  		cprev = mct_u232_port->icount;  		spin_unlock_irqrestore(&mct_u232_port->lock, flags);  		for ( ; ; ) { -			prepare_to_wait(&mct_u232_port->msr_wait, +			prepare_to_wait(&port->delta_msr_wait,  					&wait, TASK_INTERRUPTIBLE);  			schedule(); -			finish_wait(&mct_u232_port->msr_wait, &wait); +			finish_wait(&port->delta_msr_wait, &wait);  			/* see if a signal did it */  			if (signal_pending(current))  				return -ERESTARTSYS; + +			if (port->serial->disconnected) +				return -EIO; +  			spin_lock_irqsave(&mct_u232_port->lock, flags);  			cnow = mct_u232_port->icount;  			spin_unlock_irqrestore(&mct_u232_port->lock, flags); |