diff options
Diffstat (limited to 'drivers/usb/serial/mos7840.c')
| -rw-r--r-- | drivers/usb/serial/mos7840.c | 16 | 
1 files changed, 10 insertions, 6 deletions
diff --git a/drivers/usb/serial/mos7840.c b/drivers/usb/serial/mos7840.c index 809fb329eca..b8051fa6191 100644 --- a/drivers/usb/serial/mos7840.c +++ b/drivers/usb/serial/mos7840.c @@ -219,7 +219,6 @@ struct moschip_port {  	char open;  	char open_ports;  	wait_queue_head_t wait_chase;	/* for handling sleeping while waiting for chase to finish */ -	wait_queue_head_t delta_msr_wait;	/* for handling sleeping while waiting for msr change to happen */  	int delta_msr_cond;  	struct async_icount icount;  	struct usb_serial_port *port;	/* loop back to the owner of this object */ @@ -423,6 +422,9 @@ static void mos7840_handle_new_msr(struct moschip_port *port, __u8 new_msr)  			icount->rng++;  			smp_wmb();  		} + +		mos7840_port->delta_msr_cond = 1; +		wake_up_interruptible(&port->port->delta_msr_wait);  	}  } @@ -1127,7 +1129,6 @@ static int mos7840_open(struct tty_struct *tty, struct usb_serial_port *port)  	/* initialize our wait queues */  	init_waitqueue_head(&mos7840_port->wait_chase); -	init_waitqueue_head(&mos7840_port->delta_msr_wait);  	/* initialize our icount structure */  	memset(&(mos7840_port->icount), 0x00, sizeof(mos7840_port->icount)); @@ -2017,8 +2018,6 @@ static void mos7840_change_port_settings(struct tty_struct *tty,  			mos7840_port->read_urb_busy = false;  		}  	} -	wake_up(&mos7840_port->delta_msr_wait); -	mos7840_port->delta_msr_cond = 1;  	dev_dbg(&port->dev, "%s - mos7840_port->shadowLCR is End %x\n", __func__,  		mos7840_port->shadowLCR);  } @@ -2219,13 +2218,18 @@ static int mos7840_ioctl(struct tty_struct *tty,  		while (1) {  			/* interruptible_sleep_on(&mos7840_port->delta_msr_wait); */  			mos7840_port->delta_msr_cond = 0; -			wait_event_interruptible(mos7840_port->delta_msr_wait, -						 (mos7840_port-> +			wait_event_interruptible(port->delta_msr_wait, +						 (port->serial->disconnected || +						  mos7840_port->  						  delta_msr_cond == 1));  			/* see if a signal did it */  			if (signal_pending(current))  				return -ERESTARTSYS; + +			if (port->serial->disconnected) +				return -EIO; +  			cnow = mos7840_port->icount;  			smp_rmb();  			if (cnow.rng == cprev.rng && cnow.dsr == cprev.dsr &&  |