Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0
0002 /*
0003  * Prolific PL2303 USB to serial adaptor driver
0004  *
0005  * Copyright (C) 2001-2007 Greg Kroah-Hartman (greg@kroah.com)
0006  * Copyright (C) 2003 IBM Corp.
0007  *
0008  * Original driver for 2.2.x by anonymous
0009  *
0010  * See Documentation/usb/usb-serial.rst for more information on using this
0011  * driver
0012  */
0013 
0014 #include <linux/kernel.h>
0015 #include <linux/errno.h>
0016 #include <linux/slab.h>
0017 #include <linux/tty.h>
0018 #include <linux/tty_driver.h>
0019 #include <linux/tty_flip.h>
0020 #include <linux/serial.h>
0021 #include <linux/module.h>
0022 #include <linux/moduleparam.h>
0023 #include <linux/spinlock.h>
0024 #include <linux/uaccess.h>
0025 #include <linux/usb.h>
0026 #include <linux/usb/serial.h>
0027 #include <asm/unaligned.h>
0028 #include "pl2303.h"
0029 
0030 
0031 #define PL2303_QUIRK_UART_STATE_IDX0        BIT(0)
0032 #define PL2303_QUIRK_LEGACY         BIT(1)
0033 #define PL2303_QUIRK_ENDPOINT_HACK      BIT(2)
0034 
0035 static const struct usb_device_id id_table[] = {
0036     { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID),
0037         .driver_info = PL2303_QUIRK_ENDPOINT_HACK },
0038     { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_RSAQ2) },
0039     { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_DCU11) },
0040     { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_RSAQ3) },
0041     { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_CHILITAG) },
0042     { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_PHAROS) },
0043     { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_ALDIGA) },
0044     { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_MMX) },
0045     { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_GPRS) },
0046     { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_HCR331) },
0047     { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_MOTOROLA) },
0048     { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_ZTEK) },
0049     { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_TB) },
0050     { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_GC) },
0051     { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_GB) },
0052     { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_GT) },
0053     { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_GL) },
0054     { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_GE) },
0055     { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_GS) },
0056     { USB_DEVICE(IODATA_VENDOR_ID, IODATA_PRODUCT_ID) },
0057     { USB_DEVICE(IODATA_VENDOR_ID, IODATA_PRODUCT_ID_RSAQ5) },
0058     { USB_DEVICE(ATEN_VENDOR_ID, ATEN_PRODUCT_ID),
0059         .driver_info = PL2303_QUIRK_ENDPOINT_HACK },
0060     { USB_DEVICE(ATEN_VENDOR_ID, ATEN_PRODUCT_UC485),
0061         .driver_info = PL2303_QUIRK_ENDPOINT_HACK },
0062     { USB_DEVICE(ATEN_VENDOR_ID, ATEN_PRODUCT_UC232B),
0063         .driver_info = PL2303_QUIRK_ENDPOINT_HACK },
0064     { USB_DEVICE(ATEN_VENDOR_ID, ATEN_PRODUCT_ID2) },
0065     { USB_DEVICE(ATEN_VENDOR_ID2, ATEN_PRODUCT_ID) },
0066     { USB_DEVICE(ELCOM_VENDOR_ID, ELCOM_PRODUCT_ID) },
0067     { USB_DEVICE(ELCOM_VENDOR_ID, ELCOM_PRODUCT_ID_UCSGT) },
0068     { USB_DEVICE(ITEGNO_VENDOR_ID, ITEGNO_PRODUCT_ID) },
0069     { USB_DEVICE(ITEGNO_VENDOR_ID, ITEGNO_PRODUCT_ID_2080) },
0070     { USB_DEVICE(MA620_VENDOR_ID, MA620_PRODUCT_ID) },
0071     { USB_DEVICE(RATOC_VENDOR_ID, RATOC_PRODUCT_ID) },
0072     { USB_DEVICE(TRIPP_VENDOR_ID, TRIPP_PRODUCT_ID) },
0073     { USB_DEVICE(RADIOSHACK_VENDOR_ID, RADIOSHACK_PRODUCT_ID) },
0074     { USB_DEVICE(DCU10_VENDOR_ID, DCU10_PRODUCT_ID) },
0075     { USB_DEVICE(SITECOM_VENDOR_ID, SITECOM_PRODUCT_ID) },
0076     { USB_DEVICE(ALCATEL_VENDOR_ID, ALCATEL_PRODUCT_ID) },
0077     { USB_DEVICE(SIEMENS_VENDOR_ID, SIEMENS_PRODUCT_ID_SX1),
0078         .driver_info = PL2303_QUIRK_UART_STATE_IDX0 },
0079     { USB_DEVICE(SIEMENS_VENDOR_ID, SIEMENS_PRODUCT_ID_X65),
0080         .driver_info = PL2303_QUIRK_UART_STATE_IDX0 },
0081     { USB_DEVICE(SIEMENS_VENDOR_ID, SIEMENS_PRODUCT_ID_X75),
0082         .driver_info = PL2303_QUIRK_UART_STATE_IDX0 },
0083     { USB_DEVICE(SIEMENS_VENDOR_ID, SIEMENS_PRODUCT_ID_EF81),
0084         .driver_info = PL2303_QUIRK_ENDPOINT_HACK },
0085     { USB_DEVICE(BENQ_VENDOR_ID, BENQ_PRODUCT_ID_S81) }, /* Benq/Siemens S81 */
0086     { USB_DEVICE(SYNTECH_VENDOR_ID, SYNTECH_PRODUCT_ID) },
0087     { USB_DEVICE(NOKIA_CA42_VENDOR_ID, NOKIA_CA42_PRODUCT_ID) },
0088     { USB_DEVICE(CA_42_CA42_VENDOR_ID, CA_42_CA42_PRODUCT_ID) },
0089     { USB_DEVICE(SAGEM_VENDOR_ID, SAGEM_PRODUCT_ID) },
0090     { USB_DEVICE(LEADTEK_VENDOR_ID, LEADTEK_9531_PRODUCT_ID) },
0091     { USB_DEVICE(SPEEDDRAGON_VENDOR_ID, SPEEDDRAGON_PRODUCT_ID) },
0092     { USB_DEVICE(DATAPILOT_U2_VENDOR_ID, DATAPILOT_U2_PRODUCT_ID) },
0093     { USB_DEVICE(BELKIN_VENDOR_ID, BELKIN_PRODUCT_ID) },
0094     { USB_DEVICE(ALCOR_VENDOR_ID, ALCOR_PRODUCT_ID),
0095         .driver_info = PL2303_QUIRK_ENDPOINT_HACK },
0096     { USB_DEVICE(WS002IN_VENDOR_ID, WS002IN_PRODUCT_ID) },
0097     { USB_DEVICE(COREGA_VENDOR_ID, COREGA_PRODUCT_ID) },
0098     { USB_DEVICE(YCCABLE_VENDOR_ID, YCCABLE_PRODUCT_ID) },
0099     { USB_DEVICE(SUPERIAL_VENDOR_ID, SUPERIAL_PRODUCT_ID) },
0100     { USB_DEVICE(HP_VENDOR_ID, HP_LD220_PRODUCT_ID) },
0101     { USB_DEVICE(HP_VENDOR_ID, HP_LD220TA_PRODUCT_ID) },
0102     { USB_DEVICE(HP_VENDOR_ID, HP_LD381_PRODUCT_ID) },
0103     { USB_DEVICE(HP_VENDOR_ID, HP_LD381GC_PRODUCT_ID) },
0104     { USB_DEVICE(HP_VENDOR_ID, HP_LD960_PRODUCT_ID) },
0105     { USB_DEVICE(HP_VENDOR_ID, HP_LD960TA_PRODUCT_ID) },
0106     { USB_DEVICE(HP_VENDOR_ID, HP_LCM220_PRODUCT_ID) },
0107     { USB_DEVICE(HP_VENDOR_ID, HP_LCM960_PRODUCT_ID) },
0108     { USB_DEVICE(HP_VENDOR_ID, HP_LM920_PRODUCT_ID) },
0109     { USB_DEVICE(HP_VENDOR_ID, HP_LM930_PRODUCT_ID) },
0110     { USB_DEVICE(HP_VENDOR_ID, HP_LM940_PRODUCT_ID) },
0111     { USB_DEVICE(HP_VENDOR_ID, HP_TD620_PRODUCT_ID) },
0112     { USB_DEVICE(CRESSI_VENDOR_ID, CRESSI_EDY_PRODUCT_ID) },
0113     { USB_DEVICE(ZEAGLE_VENDOR_ID, ZEAGLE_N2ITION3_PRODUCT_ID) },
0114     { USB_DEVICE(SONY_VENDOR_ID, SONY_QN3USB_PRODUCT_ID) },
0115     { USB_DEVICE(SANWA_VENDOR_ID, SANWA_PRODUCT_ID) },
0116     { USB_DEVICE(ADLINK_VENDOR_ID, ADLINK_ND6530_PRODUCT_ID) },
0117     { USB_DEVICE(ADLINK_VENDOR_ID, ADLINK_ND6530GC_PRODUCT_ID) },
0118     { USB_DEVICE(SMART_VENDOR_ID, SMART_PRODUCT_ID) },
0119     { USB_DEVICE(AT_VENDOR_ID, AT_VTKIT3_PRODUCT_ID) },
0120     { USB_DEVICE(IBM_VENDOR_ID, IBM_PRODUCT_ID) },
0121     { }                 /* Terminating entry */
0122 };
0123 
0124 MODULE_DEVICE_TABLE(usb, id_table);
0125 
0126 #define SET_LINE_REQUEST_TYPE       0x21
0127 #define SET_LINE_REQUEST        0x20
0128 
0129 #define SET_CONTROL_REQUEST_TYPE    0x21
0130 #define SET_CONTROL_REQUEST     0x22
0131 #define CONTROL_DTR         0x01
0132 #define CONTROL_RTS         0x02
0133 
0134 #define BREAK_REQUEST_TYPE      0x21
0135 #define BREAK_REQUEST           0x23
0136 #define BREAK_ON            0xffff
0137 #define BREAK_OFF           0x0000
0138 
0139 #define GET_LINE_REQUEST_TYPE       0xa1
0140 #define GET_LINE_REQUEST        0x21
0141 
0142 #define VENDOR_WRITE_REQUEST_TYPE   0x40
0143 #define VENDOR_WRITE_REQUEST        0x01
0144 #define VENDOR_WRITE_NREQUEST       0x80
0145 
0146 #define VENDOR_READ_REQUEST_TYPE    0xc0
0147 #define VENDOR_READ_REQUEST     0x01
0148 #define VENDOR_READ_NREQUEST        0x81
0149 
0150 #define UART_STATE_INDEX        8
0151 #define UART_STATE_MSR_MASK     0x8b
0152 #define UART_STATE_TRANSIENT_MASK   0x74
0153 #define UART_DCD            0x01
0154 #define UART_DSR            0x02
0155 #define UART_BREAK_ERROR        0x04
0156 #define UART_RING           0x08
0157 #define UART_FRAME_ERROR        0x10
0158 #define UART_PARITY_ERROR       0x20
0159 #define UART_OVERRUN_ERROR      0x40
0160 #define UART_CTS            0x80
0161 
0162 #define PL2303_FLOWCTRL_MASK        0xf0
0163 
0164 #define PL2303_READ_TYPE_HX_STATUS  0x8080
0165 
0166 #define PL2303_HXN_RESET_REG        0x07
0167 #define PL2303_HXN_RESET_UPSTREAM_PIPE  0x02
0168 #define PL2303_HXN_RESET_DOWNSTREAM_PIPE    0x01
0169 
0170 #define PL2303_HXN_FLOWCTRL_REG     0x0a
0171 #define PL2303_HXN_FLOWCTRL_MASK    0x1c
0172 #define PL2303_HXN_FLOWCTRL_NONE    0x1c
0173 #define PL2303_HXN_FLOWCTRL_RTS_CTS 0x18
0174 #define PL2303_HXN_FLOWCTRL_XON_XOFF    0x0c
0175 
0176 static void pl2303_set_break(struct usb_serial_port *port, bool enable);
0177 
0178 enum pl2303_type {
0179     TYPE_H,
0180     TYPE_HX,
0181     TYPE_TA,
0182     TYPE_TB,
0183     TYPE_HXD,
0184     TYPE_HXN,
0185     TYPE_COUNT
0186 };
0187 
0188 struct pl2303_type_data {
0189     const char *name;
0190     speed_t max_baud_rate;
0191     unsigned long quirks;
0192     unsigned int no_autoxonxoff:1;
0193     unsigned int no_divisors:1;
0194     unsigned int alt_divisors:1;
0195 };
0196 
0197 struct pl2303_serial_private {
0198     const struct pl2303_type_data *type;
0199     unsigned long quirks;
0200 };
0201 
0202 struct pl2303_private {
0203     spinlock_t lock;
0204     u8 line_control;
0205     u8 line_status;
0206 
0207     u8 line_settings[7];
0208 };
0209 
0210 static const struct pl2303_type_data pl2303_type_data[TYPE_COUNT] = {
0211     [TYPE_H] = {
0212         .name           = "H",
0213         .max_baud_rate      = 1228800,
0214         .quirks         = PL2303_QUIRK_LEGACY,
0215         .no_autoxonxoff     = true,
0216     },
0217     [TYPE_HX] = {
0218         .name           = "HX",
0219         .max_baud_rate      = 6000000,
0220     },
0221     [TYPE_TA] = {
0222         .name           = "TA",
0223         .max_baud_rate      = 6000000,
0224         .alt_divisors       = true,
0225     },
0226     [TYPE_TB] = {
0227         .name           = "TB",
0228         .max_baud_rate      = 12000000,
0229         .alt_divisors       = true,
0230     },
0231     [TYPE_HXD] = {
0232         .name           = "HXD",
0233         .max_baud_rate      = 12000000,
0234     },
0235     [TYPE_HXN] = {
0236         .name           = "G",
0237         .max_baud_rate      = 12000000,
0238         .no_divisors        = true,
0239     },
0240 };
0241 
0242 static int pl2303_vendor_read(struct usb_serial *serial, u16 value,
0243                             unsigned char buf[1])
0244 {
0245     struct pl2303_serial_private *spriv = usb_get_serial_data(serial);
0246     struct device *dev = &serial->interface->dev;
0247     u8 request;
0248     int res;
0249 
0250     if (spriv->type == &pl2303_type_data[TYPE_HXN])
0251         request = VENDOR_READ_NREQUEST;
0252     else
0253         request = VENDOR_READ_REQUEST;
0254 
0255     res = usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev, 0),
0256             request, VENDOR_READ_REQUEST_TYPE,
0257             value, 0, buf, 1, 100);
0258     if (res != 1) {
0259         dev_err(dev, "%s - failed to read [%04x]: %d\n", __func__,
0260                                 value, res);
0261         if (res >= 0)
0262             res = -EIO;
0263 
0264         return res;
0265     }
0266 
0267     dev_dbg(dev, "%s - [%04x] = %02x\n", __func__, value, buf[0]);
0268 
0269     return 0;
0270 }
0271 
0272 static int pl2303_vendor_write(struct usb_serial *serial, u16 value, u16 index)
0273 {
0274     struct pl2303_serial_private *spriv = usb_get_serial_data(serial);
0275     struct device *dev = &serial->interface->dev;
0276     u8 request;
0277     int res;
0278 
0279     dev_dbg(dev, "%s - [%04x] = %02x\n", __func__, value, index);
0280 
0281     if (spriv->type == &pl2303_type_data[TYPE_HXN])
0282         request = VENDOR_WRITE_NREQUEST;
0283     else
0284         request = VENDOR_WRITE_REQUEST;
0285 
0286     res = usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0),
0287             request, VENDOR_WRITE_REQUEST_TYPE,
0288             value, index, NULL, 0, 100);
0289     if (res) {
0290         dev_err(dev, "%s - failed to write [%04x]: %d\n", __func__,
0291                                 value, res);
0292         return res;
0293     }
0294 
0295     return 0;
0296 }
0297 
0298 static int pl2303_update_reg(struct usb_serial *serial, u8 reg, u8 mask, u8 val)
0299 {
0300     struct pl2303_serial_private *spriv = usb_get_serial_data(serial);
0301     int ret = 0;
0302     u8 *buf;
0303 
0304     buf = kmalloc(1, GFP_KERNEL);
0305     if (!buf)
0306         return -ENOMEM;
0307 
0308     if (spriv->type == &pl2303_type_data[TYPE_HXN])
0309         ret = pl2303_vendor_read(serial, reg, buf);
0310     else
0311         ret = pl2303_vendor_read(serial, reg | 0x80, buf);
0312 
0313     if (ret)
0314         goto out_free;
0315 
0316     *buf &= ~mask;
0317     *buf |= val & mask;
0318 
0319     ret = pl2303_vendor_write(serial, reg, *buf);
0320 out_free:
0321     kfree(buf);
0322 
0323     return ret;
0324 }
0325 
0326 static int pl2303_probe(struct usb_serial *serial,
0327                     const struct usb_device_id *id)
0328 {
0329     usb_set_serial_data(serial, (void *)id->driver_info);
0330 
0331     return 0;
0332 }
0333 
0334 /*
0335  * Use interrupt endpoint from first interface if available.
0336  *
0337  * This is needed due to the looney way its endpoints are set up.
0338  */
0339 static int pl2303_endpoint_hack(struct usb_serial *serial,
0340                     struct usb_serial_endpoints *epds)
0341 {
0342     struct usb_interface *interface = serial->interface;
0343     struct usb_device *dev = serial->dev;
0344     struct device *ddev = &interface->dev;
0345     struct usb_host_interface *iface_desc;
0346     struct usb_endpoint_descriptor *endpoint;
0347     unsigned int i;
0348 
0349     if (interface == dev->actconfig->interface[0])
0350         return 0;
0351 
0352     /* check out the endpoints of the other interface */
0353     iface_desc = dev->actconfig->interface[0]->cur_altsetting;
0354 
0355     for (i = 0; i < iface_desc->desc.bNumEndpoints; ++i) {
0356         endpoint = &iface_desc->endpoint[i].desc;
0357 
0358         if (!usb_endpoint_is_int_in(endpoint))
0359             continue;
0360 
0361         dev_dbg(ddev, "found interrupt in on separate interface\n");
0362         if (epds->num_interrupt_in < ARRAY_SIZE(epds->interrupt_in))
0363             epds->interrupt_in[epds->num_interrupt_in++] = endpoint;
0364     }
0365 
0366     return 0;
0367 }
0368 
0369 static int pl2303_calc_num_ports(struct usb_serial *serial,
0370                     struct usb_serial_endpoints *epds)
0371 {
0372     unsigned long quirks = (unsigned long)usb_get_serial_data(serial);
0373     struct device *dev = &serial->interface->dev;
0374     int ret;
0375 
0376     if (quirks & PL2303_QUIRK_ENDPOINT_HACK) {
0377         ret = pl2303_endpoint_hack(serial, epds);
0378         if (ret)
0379             return ret;
0380     }
0381 
0382     if (epds->num_interrupt_in < 1) {
0383         dev_err(dev, "required interrupt-in endpoint missing\n");
0384         return -ENODEV;
0385     }
0386 
0387     return 1;
0388 }
0389 
0390 static bool pl2303_supports_hx_status(struct usb_serial *serial)
0391 {
0392     int ret;
0393     u8 buf;
0394 
0395     ret = usb_control_msg_recv(serial->dev, 0, VENDOR_READ_REQUEST,
0396             VENDOR_READ_REQUEST_TYPE, PL2303_READ_TYPE_HX_STATUS,
0397             0, &buf, 1, 100, GFP_KERNEL);
0398 
0399     return ret == 0;
0400 }
0401 
0402 static int pl2303_detect_type(struct usb_serial *serial)
0403 {
0404     struct usb_device_descriptor *desc = &serial->dev->descriptor;
0405     u16 bcdDevice, bcdUSB;
0406 
0407     /*
0408      * Legacy PL2303H, variants 0 and 1 (difference unknown).
0409      */
0410     if (desc->bDeviceClass == 0x02)
0411         return TYPE_H;      /* variant 0 */
0412 
0413     if (desc->bMaxPacketSize0 != 0x40) {
0414         if (desc->bDeviceClass == 0x00 || desc->bDeviceClass == 0xff)
0415             return TYPE_H;  /* variant 1 */
0416 
0417         return TYPE_H;      /* variant 0 */
0418     }
0419 
0420     bcdDevice = le16_to_cpu(desc->bcdDevice);
0421     bcdUSB = le16_to_cpu(desc->bcdUSB);
0422 
0423     switch (bcdUSB) {
0424     case 0x101:
0425         /* USB 1.0.1? Let's assume they meant 1.1... */
0426         fallthrough;
0427     case 0x110:
0428         switch (bcdDevice) {
0429         case 0x300:
0430             return TYPE_HX;
0431         case 0x400:
0432             return TYPE_HXD;
0433         default:
0434             return TYPE_HX;
0435         }
0436         break;
0437     case 0x200:
0438         switch (bcdDevice) {
0439         case 0x100: /* GC */
0440         case 0x105:
0441             return TYPE_HXN;
0442         case 0x300: /* GT / TA */
0443             if (pl2303_supports_hx_status(serial))
0444                 return TYPE_TA;
0445             fallthrough;
0446         case 0x305:
0447         case 0x400: /* GL */
0448         case 0x405:
0449             return TYPE_HXN;
0450         case 0x500: /* GE / TB */
0451             if (pl2303_supports_hx_status(serial))
0452                 return TYPE_TB;
0453             fallthrough;
0454         case 0x505:
0455         case 0x600: /* GS */
0456         case 0x605:
0457         case 0x700: /* GR */
0458         case 0x705:
0459             return TYPE_HXN;
0460         }
0461         break;
0462     }
0463 
0464     dev_err(&serial->interface->dev,
0465             "unknown device type, please report to linux-usb@vger.kernel.org\n");
0466     return -ENODEV;
0467 }
0468 
0469 static int pl2303_startup(struct usb_serial *serial)
0470 {
0471     struct pl2303_serial_private *spriv;
0472     enum pl2303_type type;
0473     unsigned char *buf;
0474     int ret;
0475 
0476     ret = pl2303_detect_type(serial);
0477     if (ret < 0)
0478         return ret;
0479 
0480     type = ret;
0481     dev_dbg(&serial->interface->dev, "device type: %s\n", pl2303_type_data[type].name);
0482 
0483     spriv = kzalloc(sizeof(*spriv), GFP_KERNEL);
0484     if (!spriv)
0485         return -ENOMEM;
0486 
0487     spriv->type = &pl2303_type_data[type];
0488     spriv->quirks = (unsigned long)usb_get_serial_data(serial);
0489     spriv->quirks |= spriv->type->quirks;
0490 
0491     usb_set_serial_data(serial, spriv);
0492 
0493     if (type != TYPE_HXN) {
0494         buf = kmalloc(1, GFP_KERNEL);
0495         if (!buf) {
0496             kfree(spriv);
0497             return -ENOMEM;
0498         }
0499 
0500         pl2303_vendor_read(serial, 0x8484, buf);
0501         pl2303_vendor_write(serial, 0x0404, 0);
0502         pl2303_vendor_read(serial, 0x8484, buf);
0503         pl2303_vendor_read(serial, 0x8383, buf);
0504         pl2303_vendor_read(serial, 0x8484, buf);
0505         pl2303_vendor_write(serial, 0x0404, 1);
0506         pl2303_vendor_read(serial, 0x8484, buf);
0507         pl2303_vendor_read(serial, 0x8383, buf);
0508         pl2303_vendor_write(serial, 0, 1);
0509         pl2303_vendor_write(serial, 1, 0);
0510         if (spriv->quirks & PL2303_QUIRK_LEGACY)
0511             pl2303_vendor_write(serial, 2, 0x24);
0512         else
0513             pl2303_vendor_write(serial, 2, 0x44);
0514 
0515         kfree(buf);
0516     }
0517 
0518     return 0;
0519 }
0520 
0521 static void pl2303_release(struct usb_serial *serial)
0522 {
0523     struct pl2303_serial_private *spriv = usb_get_serial_data(serial);
0524 
0525     kfree(spriv);
0526 }
0527 
0528 static int pl2303_port_probe(struct usb_serial_port *port)
0529 {
0530     struct pl2303_private *priv;
0531 
0532     priv = kzalloc(sizeof(*priv), GFP_KERNEL);
0533     if (!priv)
0534         return -ENOMEM;
0535 
0536     spin_lock_init(&priv->lock);
0537 
0538     usb_set_serial_port_data(port, priv);
0539 
0540     port->port.drain_delay = 256;
0541 
0542     return 0;
0543 }
0544 
0545 static void pl2303_port_remove(struct usb_serial_port *port)
0546 {
0547     struct pl2303_private *priv = usb_get_serial_port_data(port);
0548 
0549     kfree(priv);
0550 }
0551 
0552 static int pl2303_set_control_lines(struct usb_serial_port *port, u8 value)
0553 {
0554     struct usb_device *dev = port->serial->dev;
0555     int retval;
0556 
0557     dev_dbg(&port->dev, "%s - %02x\n", __func__, value);
0558 
0559     retval = usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
0560                  SET_CONTROL_REQUEST, SET_CONTROL_REQUEST_TYPE,
0561                  value, 0, NULL, 0, 100);
0562     if (retval)
0563         dev_err(&port->dev, "%s - failed: %d\n", __func__, retval);
0564 
0565     return retval;
0566 }
0567 
0568 /*
0569  * Returns the nearest supported baud rate that can be set directly without
0570  * using divisors.
0571  */
0572 static speed_t pl2303_get_supported_baud_rate(speed_t baud)
0573 {
0574     static const speed_t baud_sup[] = {
0575         75, 150, 300, 600, 1200, 1800, 2400, 3600, 4800, 7200, 9600,
0576         14400, 19200, 28800, 38400, 57600, 115200, 230400, 460800,
0577         614400, 921600, 1228800, 2457600, 3000000, 6000000
0578     };
0579 
0580     unsigned i;
0581 
0582     for (i = 0; i < ARRAY_SIZE(baud_sup); ++i) {
0583         if (baud_sup[i] > baud)
0584             break;
0585     }
0586 
0587     if (i == ARRAY_SIZE(baud_sup))
0588         baud = baud_sup[i - 1];
0589     else if (i > 0 && (baud_sup[i] - baud) > (baud - baud_sup[i - 1]))
0590         baud = baud_sup[i - 1];
0591     else
0592         baud = baud_sup[i];
0593 
0594     return baud;
0595 }
0596 
0597 /*
0598  * NOTE: If unsupported baud rates are set directly, the PL2303 seems to
0599  *       use 9600 baud.
0600  */
0601 static speed_t pl2303_encode_baud_rate_direct(unsigned char buf[4],
0602                                 speed_t baud)
0603 {
0604     put_unaligned_le32(baud, buf);
0605 
0606     return baud;
0607 }
0608 
0609 static speed_t pl2303_encode_baud_rate_divisor(unsigned char buf[4],
0610                                 speed_t baud)
0611 {
0612     unsigned int baseline, mantissa, exponent;
0613 
0614     /*
0615      * Apparently the formula is:
0616      *   baudrate = 12M * 32 / (mantissa * 4^exponent)
0617      * where
0618      *   mantissa = buf[8:0]
0619      *   exponent = buf[11:9]
0620      */
0621     baseline = 12000000 * 32;
0622     mantissa = baseline / baud;
0623     if (mantissa == 0)
0624         mantissa = 1;   /* Avoid dividing by zero if baud > 32*12M. */
0625     exponent = 0;
0626     while (mantissa >= 512) {
0627         if (exponent < 7) {
0628             mantissa >>= 2; /* divide by 4 */
0629             exponent++;
0630         } else {
0631             /* Exponent is maxed. Trim mantissa and leave. */
0632             mantissa = 511;
0633             break;
0634         }
0635     }
0636 
0637     buf[3] = 0x80;
0638     buf[2] = 0;
0639     buf[1] = exponent << 1 | mantissa >> 8;
0640     buf[0] = mantissa & 0xff;
0641 
0642     /* Calculate and return the exact baud rate. */
0643     baud = (baseline / mantissa) >> (exponent << 1);
0644 
0645     return baud;
0646 }
0647 
0648 static speed_t pl2303_encode_baud_rate_divisor_alt(unsigned char buf[4],
0649                                 speed_t baud)
0650 {
0651     unsigned int baseline, mantissa, exponent;
0652 
0653     /*
0654      * Apparently, for the TA version the formula is:
0655      *   baudrate = 12M * 32 / (mantissa * 2^exponent)
0656      * where
0657      *   mantissa = buf[10:0]
0658      *   exponent = buf[15:13 16]
0659      */
0660     baseline = 12000000 * 32;
0661     mantissa = baseline / baud;
0662     if (mantissa == 0)
0663         mantissa = 1;   /* Avoid dividing by zero if baud > 32*12M. */
0664     exponent = 0;
0665     while (mantissa >= 2048) {
0666         if (exponent < 15) {
0667             mantissa >>= 1; /* divide by 2 */
0668             exponent++;
0669         } else {
0670             /* Exponent is maxed. Trim mantissa and leave. */
0671             mantissa = 2047;
0672             break;
0673         }
0674     }
0675 
0676     buf[3] = 0x80;
0677     buf[2] = exponent & 0x01;
0678     buf[1] = (exponent & ~0x01) << 4 | mantissa >> 8;
0679     buf[0] = mantissa & 0xff;
0680 
0681     /* Calculate and return the exact baud rate. */
0682     baud = (baseline / mantissa) >> exponent;
0683 
0684     return baud;
0685 }
0686 
0687 static void pl2303_encode_baud_rate(struct tty_struct *tty,
0688                     struct usb_serial_port *port,
0689                     u8 buf[4])
0690 {
0691     struct usb_serial *serial = port->serial;
0692     struct pl2303_serial_private *spriv = usb_get_serial_data(serial);
0693     speed_t baud_sup;
0694     speed_t baud;
0695 
0696     baud = tty_get_baud_rate(tty);
0697     dev_dbg(&port->dev, "baud requested = %u\n", baud);
0698     if (!baud)
0699         return;
0700 
0701     if (spriv->type->max_baud_rate)
0702         baud = min_t(speed_t, baud, spriv->type->max_baud_rate);
0703     /*
0704      * Use direct method for supported baud rates, otherwise use divisors.
0705      * Newer chip types do not support divisor encoding.
0706      */
0707     if (spriv->type->no_divisors)
0708         baud_sup = baud;
0709     else
0710         baud_sup = pl2303_get_supported_baud_rate(baud);
0711 
0712     if (baud == baud_sup)
0713         baud = pl2303_encode_baud_rate_direct(buf, baud);
0714     else if (spriv->type->alt_divisors)
0715         baud = pl2303_encode_baud_rate_divisor_alt(buf, baud);
0716     else
0717         baud = pl2303_encode_baud_rate_divisor(buf, baud);
0718 
0719     /* Save resulting baud rate */
0720     tty_encode_baud_rate(tty, baud, baud);
0721     dev_dbg(&port->dev, "baud set = %u\n", baud);
0722 }
0723 
0724 static int pl2303_get_line_request(struct usb_serial_port *port,
0725                             unsigned char buf[7])
0726 {
0727     struct usb_device *udev = port->serial->dev;
0728     int ret;
0729 
0730     ret = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0),
0731                 GET_LINE_REQUEST, GET_LINE_REQUEST_TYPE,
0732                 0, 0, buf, 7, 100);
0733     if (ret != 7) {
0734         dev_err(&port->dev, "%s - failed: %d\n", __func__, ret);
0735 
0736         if (ret >= 0)
0737             ret = -EIO;
0738 
0739         return ret;
0740     }
0741 
0742     dev_dbg(&port->dev, "%s - %7ph\n", __func__, buf);
0743 
0744     return 0;
0745 }
0746 
0747 static int pl2303_set_line_request(struct usb_serial_port *port,
0748                             unsigned char buf[7])
0749 {
0750     struct usb_device *udev = port->serial->dev;
0751     int ret;
0752 
0753     ret = usb_control_msg(udev, usb_sndctrlpipe(udev, 0),
0754                 SET_LINE_REQUEST, SET_LINE_REQUEST_TYPE,
0755                 0, 0, buf, 7, 100);
0756     if (ret < 0) {
0757         dev_err(&port->dev, "%s - failed: %d\n", __func__, ret);
0758         return ret;
0759     }
0760 
0761     dev_dbg(&port->dev, "%s - %7ph\n", __func__, buf);
0762 
0763     return 0;
0764 }
0765 
0766 static bool pl2303_termios_change(const struct ktermios *a, const struct ktermios *b)
0767 {
0768     bool ixon_change;
0769 
0770     ixon_change = ((a->c_iflag ^ b->c_iflag) & (IXON | IXANY)) ||
0771             a->c_cc[VSTART] != b->c_cc[VSTART] ||
0772             a->c_cc[VSTOP] != b->c_cc[VSTOP];
0773 
0774     return tty_termios_hw_change(a, b) || ixon_change;
0775 }
0776 
0777 static bool pl2303_enable_xonxoff(struct tty_struct *tty, const struct pl2303_type_data *type)
0778 {
0779     if (!I_IXON(tty) || I_IXANY(tty))
0780         return false;
0781 
0782     if (START_CHAR(tty) != 0x11 || STOP_CHAR(tty) != 0x13)
0783         return false;
0784 
0785     if (type->no_autoxonxoff)
0786         return false;
0787 
0788     return true;
0789 }
0790 
0791 static void pl2303_set_termios(struct tty_struct *tty,
0792         struct usb_serial_port *port, struct ktermios *old_termios)
0793 {
0794     struct usb_serial *serial = port->serial;
0795     struct pl2303_serial_private *spriv = usb_get_serial_data(serial);
0796     struct pl2303_private *priv = usb_get_serial_port_data(port);
0797     unsigned long flags;
0798     unsigned char *buf;
0799     int ret;
0800     u8 control;
0801 
0802     if (old_termios && !pl2303_termios_change(&tty->termios, old_termios))
0803         return;
0804 
0805     buf = kzalloc(7, GFP_KERNEL);
0806     if (!buf) {
0807         /* Report back no change occurred */
0808         if (old_termios)
0809             tty->termios = *old_termios;
0810         return;
0811     }
0812 
0813     pl2303_get_line_request(port, buf);
0814 
0815     buf[6] = tty_get_char_size(tty->termios.c_cflag);
0816     dev_dbg(&port->dev, "data bits = %d\n", buf[6]);
0817 
0818     /* For reference buf[0]:buf[3] baud rate value */
0819     pl2303_encode_baud_rate(tty, port, &buf[0]);
0820 
0821     /* For reference buf[4]=0 is 1 stop bits */
0822     /* For reference buf[4]=1 is 1.5 stop bits */
0823     /* For reference buf[4]=2 is 2 stop bits */
0824     if (C_CSTOPB(tty)) {
0825         /*
0826          * NOTE: Comply with "real" UARTs / RS232:
0827          *       use 1.5 instead of 2 stop bits with 5 data bits
0828          */
0829         if (C_CSIZE(tty) == CS5) {
0830             buf[4] = 1;
0831             dev_dbg(&port->dev, "stop bits = 1.5\n");
0832         } else {
0833             buf[4] = 2;
0834             dev_dbg(&port->dev, "stop bits = 2\n");
0835         }
0836     } else {
0837         buf[4] = 0;
0838         dev_dbg(&port->dev, "stop bits = 1\n");
0839     }
0840 
0841     if (C_PARENB(tty)) {
0842         /* For reference buf[5]=0 is none parity */
0843         /* For reference buf[5]=1 is odd parity */
0844         /* For reference buf[5]=2 is even parity */
0845         /* For reference buf[5]=3 is mark parity */
0846         /* For reference buf[5]=4 is space parity */
0847         if (C_PARODD(tty)) {
0848             if (C_CMSPAR(tty)) {
0849                 buf[5] = 3;
0850                 dev_dbg(&port->dev, "parity = mark\n");
0851             } else {
0852                 buf[5] = 1;
0853                 dev_dbg(&port->dev, "parity = odd\n");
0854             }
0855         } else {
0856             if (C_CMSPAR(tty)) {
0857                 buf[5] = 4;
0858                 dev_dbg(&port->dev, "parity = space\n");
0859             } else {
0860                 buf[5] = 2;
0861                 dev_dbg(&port->dev, "parity = even\n");
0862             }
0863         }
0864     } else {
0865         buf[5] = 0;
0866         dev_dbg(&port->dev, "parity = none\n");
0867     }
0868 
0869     /*
0870      * Some PL2303 are known to lose bytes if you change serial settings
0871      * even to the same values as before. Thus we actually need to filter
0872      * in this specific case.
0873      *
0874      * Note that the tty_termios_hw_change check above is not sufficient
0875      * as a previously requested baud rate may differ from the one
0876      * actually used (and stored in old_termios).
0877      *
0878      * NOTE: No additional locking needed for line_settings as it is
0879      *       only used in set_termios, which is serialised against itself.
0880      */
0881     if (!old_termios || memcmp(buf, priv->line_settings, 7)) {
0882         ret = pl2303_set_line_request(port, buf);
0883         if (!ret)
0884             memcpy(priv->line_settings, buf, 7);
0885     }
0886 
0887     /* change control lines if we are switching to or from B0 */
0888     spin_lock_irqsave(&priv->lock, flags);
0889     control = priv->line_control;
0890     if (C_BAUD(tty) == B0)
0891         priv->line_control &= ~(CONTROL_DTR | CONTROL_RTS);
0892     else if (old_termios && (old_termios->c_cflag & CBAUD) == B0)
0893         priv->line_control |= (CONTROL_DTR | CONTROL_RTS);
0894     if (control != priv->line_control) {
0895         control = priv->line_control;
0896         spin_unlock_irqrestore(&priv->lock, flags);
0897         pl2303_set_control_lines(port, control);
0898     } else {
0899         spin_unlock_irqrestore(&priv->lock, flags);
0900     }
0901 
0902     if (C_CRTSCTS(tty)) {
0903         if (spriv->quirks & PL2303_QUIRK_LEGACY) {
0904             pl2303_update_reg(serial, 0, PL2303_FLOWCTRL_MASK, 0x40);
0905         } else if (spriv->type == &pl2303_type_data[TYPE_HXN]) {
0906             pl2303_update_reg(serial, PL2303_HXN_FLOWCTRL_REG,
0907                     PL2303_HXN_FLOWCTRL_MASK,
0908                     PL2303_HXN_FLOWCTRL_RTS_CTS);
0909         } else {
0910             pl2303_update_reg(serial, 0, PL2303_FLOWCTRL_MASK, 0x60);
0911         }
0912     } else if (pl2303_enable_xonxoff(tty, spriv->type)) {
0913         if (spriv->type == &pl2303_type_data[TYPE_HXN]) {
0914             pl2303_update_reg(serial, PL2303_HXN_FLOWCTRL_REG,
0915                     PL2303_HXN_FLOWCTRL_MASK,
0916                     PL2303_HXN_FLOWCTRL_XON_XOFF);
0917         } else {
0918             pl2303_update_reg(serial, 0, PL2303_FLOWCTRL_MASK, 0xc0);
0919         }
0920     } else {
0921         if (spriv->type == &pl2303_type_data[TYPE_HXN]) {
0922             pl2303_update_reg(serial, PL2303_HXN_FLOWCTRL_REG,
0923                     PL2303_HXN_FLOWCTRL_MASK,
0924                     PL2303_HXN_FLOWCTRL_NONE);
0925         } else {
0926             pl2303_update_reg(serial, 0, PL2303_FLOWCTRL_MASK, 0);
0927         }
0928     }
0929 
0930     kfree(buf);
0931 }
0932 
0933 static void pl2303_dtr_rts(struct usb_serial_port *port, int on)
0934 {
0935     struct pl2303_private *priv = usb_get_serial_port_data(port);
0936     unsigned long flags;
0937     u8 control;
0938 
0939     spin_lock_irqsave(&priv->lock, flags);
0940     if (on)
0941         priv->line_control |= (CONTROL_DTR | CONTROL_RTS);
0942     else
0943         priv->line_control &= ~(CONTROL_DTR | CONTROL_RTS);
0944     control = priv->line_control;
0945     spin_unlock_irqrestore(&priv->lock, flags);
0946 
0947     pl2303_set_control_lines(port, control);
0948 }
0949 
0950 static void pl2303_close(struct usb_serial_port *port)
0951 {
0952     usb_serial_generic_close(port);
0953     usb_kill_urb(port->interrupt_in_urb);
0954     pl2303_set_break(port, false);
0955 }
0956 
0957 static int pl2303_open(struct tty_struct *tty, struct usb_serial_port *port)
0958 {
0959     struct usb_serial *serial = port->serial;
0960     struct pl2303_serial_private *spriv = usb_get_serial_data(serial);
0961     int result;
0962 
0963     if (spriv->quirks & PL2303_QUIRK_LEGACY) {
0964         usb_clear_halt(serial->dev, port->write_urb->pipe);
0965         usb_clear_halt(serial->dev, port->read_urb->pipe);
0966     } else {
0967         /* reset upstream data pipes */
0968         if (spriv->type == &pl2303_type_data[TYPE_HXN]) {
0969             pl2303_vendor_write(serial, PL2303_HXN_RESET_REG,
0970                     PL2303_HXN_RESET_UPSTREAM_PIPE |
0971                     PL2303_HXN_RESET_DOWNSTREAM_PIPE);
0972         } else {
0973             pl2303_vendor_write(serial, 8, 0);
0974             pl2303_vendor_write(serial, 9, 0);
0975         }
0976     }
0977 
0978     /* Setup termios */
0979     if (tty)
0980         pl2303_set_termios(tty, port, NULL);
0981 
0982     result = usb_submit_urb(port->interrupt_in_urb, GFP_KERNEL);
0983     if (result) {
0984         dev_err(&port->dev, "failed to submit interrupt urb: %d\n",
0985             result);
0986         return result;
0987     }
0988 
0989     result = usb_serial_generic_open(tty, port);
0990     if (result) {
0991         usb_kill_urb(port->interrupt_in_urb);
0992         return result;
0993     }
0994 
0995     return 0;
0996 }
0997 
0998 static int pl2303_tiocmset(struct tty_struct *tty,
0999                unsigned int set, unsigned int clear)
1000 {
1001     struct usb_serial_port *port = tty->driver_data;
1002     struct pl2303_private *priv = usb_get_serial_port_data(port);
1003     unsigned long flags;
1004     u8 control;
1005     int ret;
1006 
1007     spin_lock_irqsave(&priv->lock, flags);
1008     if (set & TIOCM_RTS)
1009         priv->line_control |= CONTROL_RTS;
1010     if (set & TIOCM_DTR)
1011         priv->line_control |= CONTROL_DTR;
1012     if (clear & TIOCM_RTS)
1013         priv->line_control &= ~CONTROL_RTS;
1014     if (clear & TIOCM_DTR)
1015         priv->line_control &= ~CONTROL_DTR;
1016     control = priv->line_control;
1017     spin_unlock_irqrestore(&priv->lock, flags);
1018 
1019     ret = pl2303_set_control_lines(port, control);
1020     if (ret)
1021         return usb_translate_errors(ret);
1022 
1023     return 0;
1024 }
1025 
1026 static int pl2303_tiocmget(struct tty_struct *tty)
1027 {
1028     struct usb_serial_port *port = tty->driver_data;
1029     struct pl2303_private *priv = usb_get_serial_port_data(port);
1030     unsigned long flags;
1031     unsigned int mcr;
1032     unsigned int status;
1033     unsigned int result;
1034 
1035     spin_lock_irqsave(&priv->lock, flags);
1036     mcr = priv->line_control;
1037     status = priv->line_status;
1038     spin_unlock_irqrestore(&priv->lock, flags);
1039 
1040     result = ((mcr & CONTROL_DTR)       ? TIOCM_DTR : 0)
1041           | ((mcr & CONTROL_RTS)    ? TIOCM_RTS : 0)
1042           | ((status & UART_CTS)    ? TIOCM_CTS : 0)
1043           | ((status & UART_DSR)    ? TIOCM_DSR : 0)
1044           | ((status & UART_RING)   ? TIOCM_RI  : 0)
1045           | ((status & UART_DCD)    ? TIOCM_CD  : 0);
1046 
1047     dev_dbg(&port->dev, "%s - result = %x\n", __func__, result);
1048 
1049     return result;
1050 }
1051 
1052 static int pl2303_carrier_raised(struct usb_serial_port *port)
1053 {
1054     struct pl2303_private *priv = usb_get_serial_port_data(port);
1055 
1056     if (priv->line_status & UART_DCD)
1057         return 1;
1058 
1059     return 0;
1060 }
1061 
1062 static void pl2303_set_break(struct usb_serial_port *port, bool enable)
1063 {
1064     struct usb_serial *serial = port->serial;
1065     u16 state;
1066     int result;
1067 
1068     if (enable)
1069         state = BREAK_ON;
1070     else
1071         state = BREAK_OFF;
1072 
1073     dev_dbg(&port->dev, "%s - turning break %s\n", __func__,
1074             state == BREAK_OFF ? "off" : "on");
1075 
1076     result = usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0),
1077                  BREAK_REQUEST, BREAK_REQUEST_TYPE, state,
1078                  0, NULL, 0, 100);
1079     if (result)
1080         dev_err(&port->dev, "error sending break = %d\n", result);
1081 }
1082 
1083 static void pl2303_break_ctl(struct tty_struct *tty, int state)
1084 {
1085     struct usb_serial_port *port = tty->driver_data;
1086 
1087     pl2303_set_break(port, state);
1088 }
1089 
1090 static void pl2303_update_line_status(struct usb_serial_port *port,
1091                       unsigned char *data,
1092                       unsigned int actual_length)
1093 {
1094     struct usb_serial *serial = port->serial;
1095     struct pl2303_serial_private *spriv = usb_get_serial_data(serial);
1096     struct pl2303_private *priv = usb_get_serial_port_data(port);
1097     struct tty_struct *tty;
1098     unsigned long flags;
1099     unsigned int status_idx = UART_STATE_INDEX;
1100     u8 status;
1101     u8 delta;
1102 
1103     if (spriv->quirks & PL2303_QUIRK_UART_STATE_IDX0)
1104         status_idx = 0;
1105 
1106     if (actual_length < status_idx + 1)
1107         return;
1108 
1109     status = data[status_idx];
1110 
1111     /* Save off the uart status for others to look at */
1112     spin_lock_irqsave(&priv->lock, flags);
1113     delta = priv->line_status ^ status;
1114     priv->line_status = status;
1115     spin_unlock_irqrestore(&priv->lock, flags);
1116 
1117     if (status & UART_BREAK_ERROR)
1118         usb_serial_handle_break(port);
1119 
1120     if (delta & UART_STATE_MSR_MASK) {
1121         if (delta & UART_CTS)
1122             port->icount.cts++;
1123         if (delta & UART_DSR)
1124             port->icount.dsr++;
1125         if (delta & UART_RING)
1126             port->icount.rng++;
1127         if (delta & UART_DCD) {
1128             port->icount.dcd++;
1129             tty = tty_port_tty_get(&port->port);
1130             if (tty) {
1131                 usb_serial_handle_dcd_change(port, tty,
1132                             status & UART_DCD);
1133                 tty_kref_put(tty);
1134             }
1135         }
1136 
1137         wake_up_interruptible(&port->port.delta_msr_wait);
1138     }
1139 }
1140 
1141 static void pl2303_read_int_callback(struct urb *urb)
1142 {
1143     struct usb_serial_port *port =  urb->context;
1144     unsigned char *data = urb->transfer_buffer;
1145     unsigned int actual_length = urb->actual_length;
1146     int status = urb->status;
1147     int retval;
1148 
1149     switch (status) {
1150     case 0:
1151         /* success */
1152         break;
1153     case -ECONNRESET:
1154     case -ENOENT:
1155     case -ESHUTDOWN:
1156         /* this urb is terminated, clean up */
1157         dev_dbg(&port->dev, "%s - urb shutting down with status: %d\n",
1158             __func__, status);
1159         return;
1160     default:
1161         dev_dbg(&port->dev, "%s - nonzero urb status received: %d\n",
1162             __func__, status);
1163         goto exit;
1164     }
1165 
1166     usb_serial_debug_data(&port->dev, __func__,
1167                   urb->actual_length, urb->transfer_buffer);
1168 
1169     pl2303_update_line_status(port, data, actual_length);
1170 
1171 exit:
1172     retval = usb_submit_urb(urb, GFP_ATOMIC);
1173     if (retval) {
1174         dev_err(&port->dev,
1175             "%s - usb_submit_urb failed with result %d\n",
1176             __func__, retval);
1177     }
1178 }
1179 
1180 static void pl2303_process_read_urb(struct urb *urb)
1181 {
1182     struct usb_serial_port *port = urb->context;
1183     struct pl2303_private *priv = usb_get_serial_port_data(port);
1184     unsigned char *data = urb->transfer_buffer;
1185     char tty_flag = TTY_NORMAL;
1186     unsigned long flags;
1187     u8 line_status;
1188     int i;
1189 
1190     /* update line status */
1191     spin_lock_irqsave(&priv->lock, flags);
1192     line_status = priv->line_status;
1193     priv->line_status &= ~UART_STATE_TRANSIENT_MASK;
1194     spin_unlock_irqrestore(&priv->lock, flags);
1195 
1196     if (!urb->actual_length)
1197         return;
1198 
1199     /*
1200      * Break takes precedence over parity, which takes precedence over
1201      * framing errors.
1202      */
1203     if (line_status & UART_BREAK_ERROR)
1204         tty_flag = TTY_BREAK;
1205     else if (line_status & UART_PARITY_ERROR)
1206         tty_flag = TTY_PARITY;
1207     else if (line_status & UART_FRAME_ERROR)
1208         tty_flag = TTY_FRAME;
1209 
1210     if (tty_flag != TTY_NORMAL)
1211         dev_dbg(&port->dev, "%s - tty_flag = %d\n", __func__,
1212                                 tty_flag);
1213     /* overrun is special, not associated with a char */
1214     if (line_status & UART_OVERRUN_ERROR)
1215         tty_insert_flip_char(&port->port, 0, TTY_OVERRUN);
1216 
1217     if (port->sysrq) {
1218         for (i = 0; i < urb->actual_length; ++i)
1219             if (!usb_serial_handle_sysrq_char(port, data[i]))
1220                 tty_insert_flip_char(&port->port, data[i],
1221                         tty_flag);
1222     } else {
1223         tty_insert_flip_string_fixed_flag(&port->port, data, tty_flag,
1224                             urb->actual_length);
1225     }
1226 
1227     tty_flip_buffer_push(&port->port);
1228 }
1229 
1230 static struct usb_serial_driver pl2303_device = {
1231     .driver = {
1232         .owner =    THIS_MODULE,
1233         .name =     "pl2303",
1234     },
1235     .id_table =     id_table,
1236     .num_bulk_in =      1,
1237     .num_bulk_out =     1,
1238     .num_interrupt_in = 0,  /* see pl2303_calc_num_ports */
1239     .bulk_in_size =     256,
1240     .bulk_out_size =    256,
1241     .open =         pl2303_open,
1242     .close =        pl2303_close,
1243     .dtr_rts =      pl2303_dtr_rts,
1244     .carrier_raised =   pl2303_carrier_raised,
1245     .break_ctl =        pl2303_break_ctl,
1246     .set_termios =      pl2303_set_termios,
1247     .tiocmget =     pl2303_tiocmget,
1248     .tiocmset =     pl2303_tiocmset,
1249     .tiocmiwait =       usb_serial_generic_tiocmiwait,
1250     .process_read_urb = pl2303_process_read_urb,
1251     .read_int_callback =    pl2303_read_int_callback,
1252     .probe =        pl2303_probe,
1253     .calc_num_ports =   pl2303_calc_num_ports,
1254     .attach =       pl2303_startup,
1255     .release =      pl2303_release,
1256     .port_probe =       pl2303_port_probe,
1257     .port_remove =      pl2303_port_remove,
1258 };
1259 
1260 static struct usb_serial_driver * const serial_drivers[] = {
1261     &pl2303_device, NULL
1262 };
1263 
1264 module_usb_serial_driver(serial_drivers, id_table);
1265 
1266 MODULE_DESCRIPTION("Prolific PL2303 USB to serial adaptor driver");
1267 MODULE_LICENSE("GPL v2");