|
@@ -87,9 +87,6 @@ struct edgeport_port {
|
|
|
int close_pending;
|
|
|
int lsr_event;
|
|
|
struct async_icount icount;
|
|
|
- wait_queue_head_t delta_msr_wait; /* for handling sleeping while
|
|
|
- waiting for msr change to
|
|
|
- happen */
|
|
|
struct edgeport_serial *edge_serial;
|
|
|
struct usb_serial_port *port;
|
|
|
__u8 bUartMode; /* Port type, 0: RS232, etc. */
|
|
@@ -1459,7 +1456,7 @@ static void handle_new_msr(struct edgeport_port *edge_port, __u8 msr)
|
|
|
icount->dcd++;
|
|
|
if (msr & 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 */
|
|
@@ -1754,7 +1751,6 @@ static int edge_open(struct tty_struct *tty, struct usb_serial_port *port)
|
|
|
dev = port->serial->dev;
|
|
|
|
|
|
memset(&(edge_port->icount), 0x00, sizeof(edge_port->icount));
|
|
|
- init_waitqueue_head(&edge_port->delta_msr_wait);
|
|
|
|
|
|
/* turn off loopback */
|
|
|
status = ti_do_config(edge_port, UMPC_SET_CLR_LOOPBACK, 0);
|
|
@@ -2434,10 +2430,14 @@ static int edge_ioctl(struct tty_struct *tty,
|
|
|
dev_dbg(&port->dev, "%s - TIOCMIWAIT\n", __func__);
|
|
|
cprev = edge_port->icount;
|
|
|
while (1) {
|
|
|
- interruptible_sleep_on(&edge_port->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;
|
|
|
+
|
|
|
cnow = edge_port->icount;
|
|
|
if (cnow.rng == cprev.rng && cnow.dsr == cprev.dsr &&
|
|
|
cnow.dcd == cprev.dcd && cnow.cts == cprev.cts)
|