|
@@ -75,7 +75,7 @@ struct ftdi_private {
|
|
|
unsigned long last_dtr_rts; /* saved modem control outputs */
|
|
|
struct async_icount icount;
|
|
|
wait_queue_head_t delta_msr_wait; /* Used for TIOCMIWAIT */
|
|
|
- char prev_status, diff_status; /* Used for TIOCMIWAIT */
|
|
|
+ char prev_status; /* Used for TIOCMIWAIT */
|
|
|
char transmit_empty; /* If transmitter is empty or not */
|
|
|
struct usb_serial_port *port;
|
|
|
__u16 interface; /* FT2232C, FT2232H or FT4232H port interface
|
|
@@ -1982,17 +1982,19 @@ static int ftdi_process_packet(struct tty_struct *tty,
|
|
|
N.B. packet may be processed more than once, but differences
|
|
|
are only processed once. */
|
|
|
status = packet[0] & FTDI_STATUS_B0_MASK;
|
|
|
- if (status & FTDI_RS0_CTS)
|
|
|
- priv->icount.cts++;
|
|
|
- if (status & FTDI_RS0_DSR)
|
|
|
- priv->icount.dsr++;
|
|
|
- if (status & FTDI_RS0_RI)
|
|
|
- priv->icount.rng++;
|
|
|
- if (status & FTDI_RS0_RLSD)
|
|
|
- priv->icount.dcd++;
|
|
|
if (status != priv->prev_status) {
|
|
|
- priv->diff_status |= status ^ priv->prev_status;
|
|
|
- wake_up_interruptible(&priv->delta_msr_wait);
|
|
|
+ char diff_status = status ^ priv->prev_status;
|
|
|
+
|
|
|
+ if (diff_status & FTDI_RS0_CTS)
|
|
|
+ priv->icount.cts++;
|
|
|
+ if (diff_status & FTDI_RS0_DSR)
|
|
|
+ priv->icount.dsr++;
|
|
|
+ if (diff_status & FTDI_RS0_RI)
|
|
|
+ priv->icount.rng++;
|
|
|
+ if (diff_status & FTDI_RS0_RLSD)
|
|
|
+ priv->icount.dcd++;
|
|
|
+
|
|
|
+ wake_up_interruptible_all(&priv->delta_msr_wait);
|
|
|
priv->prev_status = status;
|
|
|
}
|
|
|
|