ChangeSet 1.1260, 2003/06/18 17:03:51-07:00, [EMAIL PROTECTED]
[PATCH] USB: add error reporting functionality to the pl2303 driver.
drivers/usb/serial/pl2303.c | 54 +++++++++++++++++++++++++++++++++++++-------
1 files changed, 46 insertions(+), 8 deletions(-)
diff -Nru a/drivers/usb/serial/pl2303.c b/drivers/usb/serial/pl2303.c
--- a/drivers/usb/serial/pl2303.c Wed Jun 18 17:34:47 2003
+++ b/drivers/usb/serial/pl2303.c Wed Jun 18 17:34:47 2003
@@ -1,7 +1,8 @@
/*
* Prolific PL2303 USB to serial adaptor driver
*
- * Copyright (C) 2001-2002 Greg Kroah-Hartman ([EMAIL PROTECTED])
+ * Copyright (C) 2001-2003 Greg Kroah-Hartman ([EMAIL PROTECTED])
+ * Copyright (C) 2003 IBM Corp.
*
* Original driver for 2.2.x by anonymous
*
@@ -11,6 +12,8 @@
* (at your option) any later version.
*
* See Documentation/usb/usb-serial.txt for more information on using this driver
+ * 2003_Apr_24 gkh
+ * Added line error reporting support. Hopefully it is correct...
*
* 2001_Oct_06 gkh
* Added RTS and DTR line control. Thanks to [EMAIL PROTECTED] for parts of it.
@@ -101,6 +104,16 @@
#define VENDOR_READ_REQUEST_TYPE 0xc0
#define VENDOR_READ_REQUEST 0x01
+#define UART_STATE 0x08
+#define UART_DCD 0x01
+#define UART_DSR 0x02
+#define UART_BREAK_ERROR 0x04
+#define UART_RING 0x08
+#define UART_FRAME_ERROR 0x10
+#define UART_PARITY_ERROR 0x20
+#define UART_OVERRUN_ERROR 0x40
+#define UART_CTS 0x80
+
/* function prototypes for a PL2303 serial converter */
static int pl2303_open (struct usb_serial_port *port, struct file *filp);
static void pl2303_close (struct usb_serial_port *port, struct file *filp);
@@ -142,6 +155,7 @@
struct pl2303_private {
u8 line_control;
+ u8 line_status;
u8 termios_initialized;
};
@@ -585,10 +599,10 @@
{
struct usb_serial_port *port = (struct usb_serial_port *) urb->context;
struct usb_serial *serial = get_usb_serial (port, __FUNCTION__);
- //unsigned char *data = urb->transfer_buffer;
- //int i;
+ struct pl2303_private *priv = port->private;
+ unsigned char *data = urb->transfer_buffer;
-//ints auto restart...
+ /* ints auto restart... */
if (!serial) {
return;
@@ -600,9 +614,12 @@
}
usb_serial_debug_data (__FILE__, __FUNCTION__, urb->actual_length,
urb->transfer_buffer);
-#if 0
-//FIXME need to update state of terminal lines variable
-#endif
+
+ if (urb->actual_length > UART_STATE)
+ return;
+
+ /* Save off the uart status for others to look at */
+ priv->line_status = data[UART_STATE];
return;
}
@@ -612,10 +629,13 @@
{
struct usb_serial_port *port = (struct usb_serial_port *) urb->context;
struct usb_serial *serial = get_usb_serial (port, __FUNCTION__);
+ struct pl2303_private *priv = port->private;
struct tty_struct *tty;
unsigned char *data = urb->transfer_buffer;
int i;
int result;
+ u8 status;
+ char tty_flag;
if (port_paranoia_check (port, __FUNCTION__))
return;
@@ -649,13 +669,31 @@
usb_serial_debug_data (__FILE__, __FUNCTION__, urb->actual_length, data);
+ /* get tty_flag from status */
+ tty_flag = TTY_NORMAL;
+ status = priv->line_status;
+
+ /* break takes precedence over parity, */
+ /* which takes precedence over framing errors */
+ if (status & UART_BREAK_ERROR )
+ tty_flag = TTY_BREAK;
+ else if (status & UART_PARITY_ERROR)
+ tty_flag = TTY_PARITY;
+ else if (status & UART_FRAME_ERROR)
+ tty_flag = TTY_FRAME;
+ dbg("%s - tty_flag = %d", __FUNCTION__, tty_flag);
+
tty = port->tty;
if (tty && urb->actual_length) {
+ /* overrun is special, not associated with a char */
+ if (status & UART_OVERRUN_ERROR)
+ tty_insert_flip_char(tty, 0, TTY_OVERRUN);
+
for (i = 0; i < urb->actual_length; ++i) {
if (tty->flip.count >= TTY_FLIPBUF_SIZE) {
tty_flip_buffer_push(tty);
}
- tty_insert_flip_char (tty, data[i], 0);
+ tty_insert_flip_char (tty, data[i], tty_flag);
}
tty_flip_buffer_push (tty);
}
-------------------------------------------------------
This SF.Net email is sponsored by: INetU
Attention Web Developers & Consultants: Become An INetU Hosting Partner.
Refer Dedicated Servers. We Manage Them. You Get 10% Monthly Commission!
INetU Dedicated Managed Hosting http://www.inetu.net/partner/index.php
_______________________________________________
[EMAIL PROTECTED]
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel