|
@@ -128,7 +128,6 @@ struct qt2_port_private {
|
|
|
u8 shadowLSR;
|
|
|
u8 shadowMSR;
|
|
|
|
|
|
- wait_queue_head_t delta_msr_wait; /* Used for TIOCMIWAIT */
|
|
|
struct async_icount icount;
|
|
|
|
|
|
struct usb_serial_port *port;
|
|
@@ -506,8 +505,9 @@ static int wait_modem_info(struct usb_serial_port *port, unsigned int arg)
|
|
|
spin_unlock_irqrestore(&priv->lock, flags);
|
|
|
|
|
|
while (1) {
|
|
|
- wait_event_interruptible(priv->delta_msr_wait,
|
|
|
- ((priv->icount.rng != prev.rng) ||
|
|
|
+ wait_event_interruptible(port->delta_msr_wait,
|
|
|
+ (port->serial->disconnected ||
|
|
|
+ (priv->icount.rng != prev.rng) ||
|
|
|
(priv->icount.dsr != prev.dsr) ||
|
|
|
(priv->icount.dcd != prev.dcd) ||
|
|
|
(priv->icount.cts != prev.cts)));
|
|
@@ -515,6 +515,9 @@ static int wait_modem_info(struct usb_serial_port *port, unsigned int arg)
|
|
|
if (signal_pending(current))
|
|
|
return -ERESTARTSYS;
|
|
|
|
|
|
+ if (port->serial->disconnected)
|
|
|
+ return -EIO;
|
|
|
+
|
|
|
spin_lock_irqsave(&priv->lock, flags);
|
|
|
cur = priv->icount;
|
|
|
spin_unlock_irqrestore(&priv->lock, flags);
|
|
@@ -827,7 +830,6 @@ static int qt2_port_probe(struct usb_serial_port *port)
|
|
|
|
|
|
spin_lock_init(&port_priv->lock);
|
|
|
spin_lock_init(&port_priv->urb_lock);
|
|
|
- init_waitqueue_head(&port_priv->delta_msr_wait);
|
|
|
port_priv->port = port;
|
|
|
|
|
|
port_priv->write_urb = usb_alloc_urb(0, GFP_KERNEL);
|
|
@@ -970,7 +972,7 @@ static void qt2_update_msr(struct usb_serial_port *port, unsigned char *ch)
|
|
|
if (newMSR & UART_MSR_TERI)
|
|
|
port_priv->icount.rng++;
|
|
|
|
|
|
- wake_up_interruptible(&port_priv->delta_msr_wait);
|
|
|
+ wake_up_interruptible(&port->delta_msr_wait);
|
|
|
}
|
|
|
}
|
|
|
|