From 1c5233b21481b41c1b0ae0e5ca389e8c3a328d40 Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Thu, 8 Apr 2004 00:37:07 -0700 Subject: [PATCH] USB: fix pl2303 handling of status bits. Patch originally from Kevin Watkins --- drivers/usb/serial/pl2303.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/drivers/usb/serial/pl2303.c b/drivers/usb/serial/pl2303.c index bf226d3cd81f9..b5b04061d5abc 100644 --- a/drivers/usb/serial/pl2303.c +++ b/drivers/usb/serial/pl2303.c @@ -116,6 +116,7 @@ static struct usb_driver pl2303_driver = { #define VENDOR_READ_REQUEST 0x01 #define UART_STATE 0x08 +#define UART_STATE_TRANSIENT_MASK 0x74 #define UART_DCD 0x01 #define UART_DSR 0x02 #define UART_BREAK_ERROR 0x04 @@ -662,6 +663,7 @@ static void pl2303_read_int_callback (struct urb *urb, struct pt_regs *regs) unsigned char *data = urb->transfer_buffer; unsigned long flags; int status; + u8 uart_state; dbg("%s (%d)", __FUNCTION__, port->number); @@ -690,8 +692,10 @@ static void pl2303_read_int_callback (struct urb *urb, struct pt_regs *regs) goto exit; /* Save off the uart status for others to look at */ + uart_state = data[UART_STATE]; spin_lock_irqsave(&priv->lock, flags); - priv->line_status = data[UART_STATE]; + uart_state |= (priv->line_status & UART_STATE_TRANSIENT_MASK); + priv->line_status = uart_state; spin_unlock_irqrestore(&priv->lock, flags); exit: @@ -752,6 +756,7 @@ static void pl2303_read_bulk_callback (struct urb *urb, struct pt_regs *regs) spin_lock_irqsave(&priv->lock, flags); status = priv->line_status; + priv->line_status &= ~UART_STATE_TRANSIENT_MASK; spin_unlock_irqrestore(&priv->lock, flags); wake_up_interruptible (&priv->delta_msr_wait); -- 2.53.0