|
@@ -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 */
|
|
@@ -425,7 +424,7 @@ static void mos7840_handle_new_msr(struct moschip_port *port, __u8 new_msr)
|
|
|
}
|
|
|
|
|
|
mos7840_port->delta_msr_cond = 1;
|
|
|
- wake_up_interruptible(&mos7840_port->delta_msr_wait);
|
|
|
+ wake_up_interruptible(&port->port->delta_msr_wait);
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -1130,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));
|
|
@@ -2220,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 &&
|