|
@@ -114,8 +114,6 @@ struct mct_u232_private {
|
|
|
unsigned char last_msr; /* Modem Status Register */
|
|
|
unsigned int rx_flags; /* Throttling flags */
|
|
|
struct async_icount icount;
|
|
|
- wait_queue_head_t msr_wait; /* for handling sleeping while waiting
|
|
|
- for msr change to happen */
|
|
|
};
|
|
|
|
|
|
#define THROTTLED 0x01
|
|
@@ -409,7 +407,6 @@ static int mct_u232_port_probe(struct usb_serial_port *port)
|
|
|
return -ENOMEM;
|
|
|
|
|
|
spin_lock_init(&priv->lock);
|
|
|
- init_waitqueue_head(&priv->msr_wait);
|
|
|
|
|
|
usb_set_serial_port_data(port, priv);
|
|
|
|
|
@@ -601,7 +598,7 @@ static void mct_u232_read_int_callback(struct urb *urb)
|
|
|
tty_kref_put(tty);
|
|
|
}
|
|
|
#endif
|
|
|
- wake_up_interruptible(&priv->msr_wait);
|
|
|
+ wake_up_interruptible(&port->delta_msr_wait);
|
|
|
spin_unlock_irqrestore(&priv->lock, flags);
|
|
|
exit:
|
|
|
retval = usb_submit_urb(urb, GFP_ATOMIC);
|
|
@@ -810,13 +807,17 @@ static int mct_u232_ioctl(struct tty_struct *tty,
|
|
|
cprev = mct_u232_port->icount;
|
|
|
spin_unlock_irqrestore(&mct_u232_port->lock, flags);
|
|
|
for ( ; ; ) {
|
|
|
- prepare_to_wait(&mct_u232_port->msr_wait,
|
|
|
+ prepare_to_wait(&port->delta_msr_wait,
|
|
|
&wait, TASK_INTERRUPTIBLE);
|
|
|
schedule();
|
|
|
- finish_wait(&mct_u232_port->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;
|
|
|
+
|
|
|
spin_lock_irqsave(&mct_u232_port->lock, flags);
|
|
|
cnow = mct_u232_port->icount;
|
|
|
spin_unlock_irqrestore(&mct_u232_port->lock, flags);
|