--- drivers/usb/serial/pl2303.c.orig	2004-12-10 18:11:33.000000000 +0200
+++ drivers/usb/serial/pl2303.c	2005-01-08 19:10:42.292795960 +0200
@@ -176,6 +176,7 @@ struct pl2303_private {
 	u8 line_control;
 	u8 line_status;
 	u8 termios_initialized;
+	u8 driverType;
 };
 
 
@@ -393,10 +394,21 @@ static void pl2303_set_termios (struct u
 	     buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], buf[6]);
 
 	if (cflag & CRTSCTS) {
-		i = usb_control_msg (serial->dev, usb_sndctrlpipe (serial->dev, 0),
-				     VENDOR_WRITE_REQUEST, VENDOR_WRITE_REQUEST_TYPE,
-				     0x0, 0x41, NULL, 0, 100);
-		dbg ("0x40:0x1:0x0:0x41  %d", i);
+		if (priv->driverType == 2) {
+			i = usb_control_msg (serial->dev,
+					     usb_sndctrlpipe (serial->dev, 0),
+					     VENDOR_WRITE_REQUEST, 
+					     VENDOR_WRITE_REQUEST_TYPE,
+					     0x0, 0x61, NULL, 0, 100);
+			dbg ("0x40:0x1:0x0:0x61  %d", i);
+		} else {
+			i = usb_control_msg (serial->dev, 
+					     usb_sndctrlpipe (serial->dev, 0),
+					     VENDOR_WRITE_REQUEST, 
+					     VENDOR_WRITE_REQUEST_TYPE,
+					     0x0, 0x41, NULL, 0, 100);
+			dbg ("0x40:0x1:0x0:0x41  %d", i);
+		}
 	}
 
 	kfree (buf);
@@ -409,12 +421,28 @@ static int pl2303_open (struct usb_seria
 	struct usb_serial *serial = port->serial;
 	unsigned char *buf;
 	int result;
+	struct pl2303_private *priv = usb_get_serial_port_data(port);;
 
 	if (port_paranoia_check (port, __FUNCTION__))
 		return -ENODEV;
 		
 	dbg("%s -  port %d", __FUNCTION__, port->number);
 
+	if (serial->dev->descriptor.bDeviceClass == 0x02)
+		priv->driverType = 0;
+	else if (serial->dev->descriptor.bMaxPacketSize0 == 0x40)
+		priv->driverType = 2;
+	else if (serial->dev->descriptor.bDeviceClass == 0x00)
+		priv->driverType = 1;
+	else if (serial->dev->descriptor.bDeviceClass == 0xFF)
+		priv->driverType = 1;
+
+	printk("PL-2303 driver type: ");
+	if (priv->driverType != 2)
+	     printk("old (PL-2303).\n");
+	else
+	     printk("new (PL-2303X).\n");
+
 	usb_clear_halt(serial->dev, port->write_urb->pipe);
 	usb_clear_halt(serial->dev, port->read_urb->pipe);
 
@@ -440,6 +468,15 @@ static int pl2303_open (struct usb_seria
 	SOUP (VENDOR_WRITE_REQUEST_TYPE, VENDOR_WRITE_REQUEST, 0x0404, 1);
 	FISH (VENDOR_READ_REQUEST_TYPE, VENDOR_READ_REQUEST, 0x8484, 0);
 	FISH (VENDOR_READ_REQUEST_TYPE, VENDOR_READ_REQUEST, 0x8383, 0);
+	SOUP (VENDOR_WRITE_REQUEST_TYPE, VENDOR_WRITE_REQUEST, 0, 1);
+	SOUP (VENDOR_WRITE_REQUEST_TYPE, VENDOR_WRITE_REQUEST, 1, 0);
+	if (priv->driverType == 2) {
+		SOUP (VENDOR_WRITE_REQUEST_TYPE, VENDOR_WRITE_REQUEST, 
+		      2, 0x44);
+	} else {
+		SOUP (VENDOR_WRITE_REQUEST_TYPE, VENDOR_WRITE_REQUEST,
+		      2, 0x24);
+	}
 
 	kfree(buf);
 

