diff options
Diffstat (limited to 'drivers/usb/serial/ark3116.c')
| -rw-r--r-- | drivers/usb/serial/ark3116.c | 10 | 
1 files changed, 6 insertions, 4 deletions
| diff --git a/drivers/usb/serial/ark3116.c b/drivers/usb/serial/ark3116.c index cbd904b8fba..4775f8209e5 100644 --- a/drivers/usb/serial/ark3116.c +++ b/drivers/usb/serial/ark3116.c @@ -62,7 +62,6 @@ static int is_irda(struct usb_serial *serial)  }  struct ark3116_private { -	wait_queue_head_t       delta_msr_wait;  	struct async_icount	icount;  	int			irda;	/* 1 for irda device */ @@ -146,7 +145,6 @@ static int ark3116_port_probe(struct usb_serial_port *port)  	if (!priv)  		return -ENOMEM; -	init_waitqueue_head(&priv->delta_msr_wait);  	mutex_init(&priv->hw_lock);  	spin_lock_init(&priv->status_lock); @@ -456,10 +454,14 @@ static int ark3116_ioctl(struct tty_struct *tty,  	case TIOCMIWAIT:  		for (;;) {  			struct async_icount prev = priv->icount; -			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; +  			if ((prev.rng == priv->icount.rng) &&  			    (prev.dsr == priv->icount.dsr) &&  			    (prev.dcd == priv->icount.dcd) && @@ -580,7 +582,7 @@ static void ark3116_update_msr(struct usb_serial_port *port, __u8 msr)  			priv->icount.dcd++;  		if (msr & UART_MSR_TERI)  			priv->icount.rng++; -		wake_up_interruptible(&priv->delta_msr_wait); +		wake_up_interruptible(&port->delta_msr_wait);  	}  } |