diff options
Diffstat (limited to 'drivers/usb/serial/io_edgeport.c')
| -rw-r--r-- | drivers/usb/serial/io_edgeport.c | 12 | 
1 files changed, 7 insertions, 5 deletions
| diff --git a/drivers/usb/serial/io_edgeport.c b/drivers/usb/serial/io_edgeport.c index b00e5cbf741..efd8b978128 100644 --- a/drivers/usb/serial/io_edgeport.c +++ b/drivers/usb/serial/io_edgeport.c @@ -110,7 +110,6 @@ struct edgeport_port {  	wait_queue_head_t	wait_chase;		/* for handling sleeping while waiting for chase to finish */  	wait_queue_head_t	wait_open;		/* for handling sleeping while waiting for open to finish */  	wait_queue_head_t	wait_command;		/* for handling sleeping while waiting for command to finish */ -	wait_queue_head_t	delta_msr_wait;		/* for handling sleeping while waiting for msr change to happen */  	struct async_icount	icount;  	struct usb_serial_port	*port;			/* loop back to the owner of this object */ @@ -884,7 +883,6 @@ static int edge_open(struct tty_struct *tty, struct usb_serial_port *port)  	/* initialize our wait queues */  	init_waitqueue_head(&edge_port->wait_open);  	init_waitqueue_head(&edge_port->wait_chase); -	init_waitqueue_head(&edge_port->delta_msr_wait);  	init_waitqueue_head(&edge_port->wait_command);  	/* initialize our icount structure */ @@ -1669,13 +1667,17 @@ static int edge_ioctl(struct tty_struct *tty,  		dev_dbg(&port->dev, "%s (%d) TIOCMIWAIT\n", __func__,  port->number);  		cprev = edge_port->icount;  		while (1) { -			prepare_to_wait(&edge_port->delta_msr_wait, +			prepare_to_wait(&port->delta_msr_wait,  						&wait, TASK_INTERRUPTIBLE);  			schedule(); -			finish_wait(&edge_port->delta_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; +  			cnow = edge_port->icount;  			if (cnow.rng == cprev.rng && cnow.dsr == cprev.dsr &&  			    cnow.dcd == cprev.dcd && cnow.cts == cprev.cts) @@ -2051,7 +2053,7 @@ static void handle_new_msr(struct edgeport_port *edge_port, __u8 newMsr)  			icount->dcd++;  		if (newMsr & EDGEPORT_MSR_DELTA_RI)  			icount->rng++; -		wake_up_interruptible(&edge_port->delta_msr_wait); +		wake_up_interruptible(&edge_port->port->delta_msr_wait);  	}  	/* Save the new modem status */ |