.. | .. |
---|
7 | 7 | * |
---|
8 | 8 | * Original driver for 2.2.x by anonymous |
---|
9 | 9 | * |
---|
10 | | - * See Documentation/usb/usb-serial.txt for more information on using this |
---|
| 10 | + * See Documentation/usb/usb-serial.rst for more information on using this |
---|
11 | 11 | * driver |
---|
12 | 12 | */ |
---|
13 | 13 | |
---|
.. | .. |
---|
47 | 47 | { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_MOTOROLA) }, |
---|
48 | 48 | { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_ZTEK) }, |
---|
49 | 49 | { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_TB) }, |
---|
| 50 | + { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_GC) }, |
---|
| 51 | + { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_GB) }, |
---|
| 52 | + { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_GT) }, |
---|
| 53 | + { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_GL) }, |
---|
| 54 | + { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_GE) }, |
---|
| 55 | + { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_GS) }, |
---|
50 | 56 | { USB_DEVICE(IODATA_VENDOR_ID, IODATA_PRODUCT_ID) }, |
---|
51 | 57 | { USB_DEVICE(IODATA_VENDOR_ID, IODATA_PRODUCT_ID_RSAQ5) }, |
---|
52 | 58 | { USB_DEVICE(ATEN_VENDOR_ID, ATEN_PRODUCT_ID), |
---|
.. | .. |
---|
100 | 106 | { USB_DEVICE(HP_VENDOR_ID, HP_LCM220_PRODUCT_ID) }, |
---|
101 | 107 | { USB_DEVICE(HP_VENDOR_ID, HP_LCM960_PRODUCT_ID) }, |
---|
102 | 108 | { USB_DEVICE(HP_VENDOR_ID, HP_LM920_PRODUCT_ID) }, |
---|
| 109 | + { USB_DEVICE(HP_VENDOR_ID, HP_LM930_PRODUCT_ID) }, |
---|
103 | 110 | { USB_DEVICE(HP_VENDOR_ID, HP_LM940_PRODUCT_ID) }, |
---|
104 | 111 | { USB_DEVICE(HP_VENDOR_ID, HP_TD620_PRODUCT_ID) }, |
---|
105 | 112 | { USB_DEVICE(CRESSI_VENDOR_ID, CRESSI_EDY_PRODUCT_ID) }, |
---|
.. | .. |
---|
110 | 117 | { USB_DEVICE(ADLINK_VENDOR_ID, ADLINK_ND6530GC_PRODUCT_ID) }, |
---|
111 | 118 | { USB_DEVICE(SMART_VENDOR_ID, SMART_PRODUCT_ID) }, |
---|
112 | 119 | { USB_DEVICE(AT_VENDOR_ID, AT_VTKIT3_PRODUCT_ID) }, |
---|
| 120 | + { USB_DEVICE(IBM_VENDOR_ID, IBM_PRODUCT_ID) }, |
---|
113 | 121 | { } /* Terminating entry */ |
---|
114 | 122 | }; |
---|
115 | 123 | |
---|
.. | .. |
---|
133 | 141 | |
---|
134 | 142 | #define VENDOR_WRITE_REQUEST_TYPE 0x40 |
---|
135 | 143 | #define VENDOR_WRITE_REQUEST 0x01 |
---|
| 144 | +#define VENDOR_WRITE_NREQUEST 0x80 |
---|
136 | 145 | |
---|
137 | 146 | #define VENDOR_READ_REQUEST_TYPE 0xc0 |
---|
138 | 147 | #define VENDOR_READ_REQUEST 0x01 |
---|
| 148 | +#define VENDOR_READ_NREQUEST 0x81 |
---|
139 | 149 | |
---|
140 | 150 | #define UART_STATE_INDEX 8 |
---|
141 | 151 | #define UART_STATE_MSR_MASK 0x8b |
---|
.. | .. |
---|
149 | 159 | #define UART_OVERRUN_ERROR 0x40 |
---|
150 | 160 | #define UART_CTS 0x80 |
---|
151 | 161 | |
---|
| 162 | +#define PL2303_FLOWCTRL_MASK 0xf0 |
---|
| 163 | + |
---|
| 164 | +#define PL2303_READ_TYPE_HX_STATUS 0x8080 |
---|
| 165 | + |
---|
| 166 | +#define PL2303_HXN_RESET_REG 0x07 |
---|
| 167 | +#define PL2303_HXN_RESET_UPSTREAM_PIPE 0x02 |
---|
| 168 | +#define PL2303_HXN_RESET_DOWNSTREAM_PIPE 0x01 |
---|
| 169 | + |
---|
| 170 | +#define PL2303_HXN_FLOWCTRL_REG 0x0a |
---|
| 171 | +#define PL2303_HXN_FLOWCTRL_MASK 0x1c |
---|
| 172 | +#define PL2303_HXN_FLOWCTRL_NONE 0x1c |
---|
| 173 | +#define PL2303_HXN_FLOWCTRL_RTS_CTS 0x18 |
---|
| 174 | +#define PL2303_HXN_FLOWCTRL_XON_XOFF 0x0c |
---|
| 175 | + |
---|
152 | 176 | static void pl2303_set_break(struct usb_serial_port *port, bool enable); |
---|
153 | 177 | |
---|
154 | 178 | enum pl2303_type { |
---|
155 | 179 | TYPE_01, /* Type 0 and 1 (difference unknown) */ |
---|
156 | 180 | TYPE_HX, /* HX version of the pl2303 chip */ |
---|
| 181 | + TYPE_HXN, /* HXN version of the pl2303 chip */ |
---|
157 | 182 | TYPE_COUNT |
---|
158 | 183 | }; |
---|
159 | 184 | |
---|
160 | 185 | struct pl2303_type_data { |
---|
161 | 186 | speed_t max_baud_rate; |
---|
162 | 187 | unsigned long quirks; |
---|
| 188 | + unsigned int no_autoxonxoff:1; |
---|
| 189 | + unsigned int no_divisors:1; |
---|
163 | 190 | }; |
---|
164 | 191 | |
---|
165 | 192 | struct pl2303_serial_private { |
---|
.. | .. |
---|
177 | 204 | |
---|
178 | 205 | static const struct pl2303_type_data pl2303_type_data[TYPE_COUNT] = { |
---|
179 | 206 | [TYPE_01] = { |
---|
180 | | - .max_baud_rate = 1228800, |
---|
181 | | - .quirks = PL2303_QUIRK_LEGACY, |
---|
| 207 | + .max_baud_rate = 1228800, |
---|
| 208 | + .quirks = PL2303_QUIRK_LEGACY, |
---|
| 209 | + .no_autoxonxoff = true, |
---|
182 | 210 | }, |
---|
183 | 211 | [TYPE_HX] = { |
---|
184 | | - .max_baud_rate = 12000000, |
---|
| 212 | + .max_baud_rate = 12000000, |
---|
| 213 | + }, |
---|
| 214 | + [TYPE_HXN] = { |
---|
| 215 | + .max_baud_rate = 12000000, |
---|
| 216 | + .no_divisors = true, |
---|
185 | 217 | }, |
---|
186 | 218 | }; |
---|
187 | 219 | |
---|
188 | 220 | static int pl2303_vendor_read(struct usb_serial *serial, u16 value, |
---|
189 | 221 | unsigned char buf[1]) |
---|
190 | 222 | { |
---|
| 223 | + struct pl2303_serial_private *spriv = usb_get_serial_data(serial); |
---|
191 | 224 | struct device *dev = &serial->interface->dev; |
---|
| 225 | + u8 request; |
---|
192 | 226 | int res; |
---|
193 | 227 | |
---|
| 228 | + if (spriv->type == &pl2303_type_data[TYPE_HXN]) |
---|
| 229 | + request = VENDOR_READ_NREQUEST; |
---|
| 230 | + else |
---|
| 231 | + request = VENDOR_READ_REQUEST; |
---|
| 232 | + |
---|
194 | 233 | res = usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev, 0), |
---|
195 | | - VENDOR_READ_REQUEST, VENDOR_READ_REQUEST_TYPE, |
---|
| 234 | + request, VENDOR_READ_REQUEST_TYPE, |
---|
196 | 235 | value, 0, buf, 1, 100); |
---|
197 | 236 | if (res != 1) { |
---|
198 | 237 | dev_err(dev, "%s - failed to read [%04x]: %d\n", __func__, |
---|
.. | .. |
---|
210 | 249 | |
---|
211 | 250 | static int pl2303_vendor_write(struct usb_serial *serial, u16 value, u16 index) |
---|
212 | 251 | { |
---|
| 252 | + struct pl2303_serial_private *spriv = usb_get_serial_data(serial); |
---|
213 | 253 | struct device *dev = &serial->interface->dev; |
---|
| 254 | + u8 request; |
---|
214 | 255 | int res; |
---|
215 | 256 | |
---|
216 | 257 | dev_dbg(dev, "%s - [%04x] = %02x\n", __func__, value, index); |
---|
217 | 258 | |
---|
| 259 | + if (spriv->type == &pl2303_type_data[TYPE_HXN]) |
---|
| 260 | + request = VENDOR_WRITE_NREQUEST; |
---|
| 261 | + else |
---|
| 262 | + request = VENDOR_WRITE_REQUEST; |
---|
| 263 | + |
---|
218 | 264 | res = usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0), |
---|
219 | | - VENDOR_WRITE_REQUEST, VENDOR_WRITE_REQUEST_TYPE, |
---|
| 265 | + request, VENDOR_WRITE_REQUEST_TYPE, |
---|
220 | 266 | value, index, NULL, 0, 100); |
---|
221 | 267 | if (res) { |
---|
222 | 268 | dev_err(dev, "%s - failed to write [%04x]: %d\n", __func__, |
---|
.. | .. |
---|
225 | 271 | } |
---|
226 | 272 | |
---|
227 | 273 | return 0; |
---|
| 274 | +} |
---|
| 275 | + |
---|
| 276 | +static int pl2303_update_reg(struct usb_serial *serial, u8 reg, u8 mask, u8 val) |
---|
| 277 | +{ |
---|
| 278 | + struct pl2303_serial_private *spriv = usb_get_serial_data(serial); |
---|
| 279 | + int ret = 0; |
---|
| 280 | + u8 *buf; |
---|
| 281 | + |
---|
| 282 | + buf = kmalloc(1, GFP_KERNEL); |
---|
| 283 | + if (!buf) |
---|
| 284 | + return -ENOMEM; |
---|
| 285 | + |
---|
| 286 | + if (spriv->type == &pl2303_type_data[TYPE_HXN]) |
---|
| 287 | + ret = pl2303_vendor_read(serial, reg, buf); |
---|
| 288 | + else |
---|
| 289 | + ret = pl2303_vendor_read(serial, reg | 0x80, buf); |
---|
| 290 | + |
---|
| 291 | + if (ret) |
---|
| 292 | + goto out_free; |
---|
| 293 | + |
---|
| 294 | + *buf &= ~mask; |
---|
| 295 | + *buf |= val & mask; |
---|
| 296 | + |
---|
| 297 | + ret = pl2303_vendor_write(serial, reg, *buf); |
---|
| 298 | +out_free: |
---|
| 299 | + kfree(buf); |
---|
| 300 | + |
---|
| 301 | + return ret; |
---|
228 | 302 | } |
---|
229 | 303 | |
---|
230 | 304 | static int pl2303_probe(struct usb_serial *serial, |
---|
.. | .. |
---|
296 | 370 | struct pl2303_serial_private *spriv; |
---|
297 | 371 | enum pl2303_type type = TYPE_01; |
---|
298 | 372 | unsigned char *buf; |
---|
| 373 | + int res; |
---|
299 | 374 | |
---|
300 | 375 | spriv = kzalloc(sizeof(*spriv), GFP_KERNEL); |
---|
301 | 376 | if (!spriv) |
---|
.. | .. |
---|
317 | 392 | type = TYPE_01; /* type 1 */ |
---|
318 | 393 | dev_dbg(&serial->interface->dev, "device type: %d\n", type); |
---|
319 | 394 | |
---|
| 395 | + if (type == TYPE_HX) { |
---|
| 396 | + res = usb_control_msg(serial->dev, |
---|
| 397 | + usb_rcvctrlpipe(serial->dev, 0), |
---|
| 398 | + VENDOR_READ_REQUEST, VENDOR_READ_REQUEST_TYPE, |
---|
| 399 | + PL2303_READ_TYPE_HX_STATUS, 0, buf, 1, 100); |
---|
| 400 | + if (res != 1) |
---|
| 401 | + type = TYPE_HXN; |
---|
| 402 | + } |
---|
| 403 | + |
---|
320 | 404 | spriv->type = &pl2303_type_data[type]; |
---|
321 | 405 | spriv->quirks = (unsigned long)usb_get_serial_data(serial); |
---|
322 | 406 | spriv->quirks |= spriv->type->quirks; |
---|
323 | 407 | |
---|
324 | 408 | usb_set_serial_data(serial, spriv); |
---|
325 | 409 | |
---|
326 | | - pl2303_vendor_read(serial, 0x8484, buf); |
---|
327 | | - pl2303_vendor_write(serial, 0x0404, 0); |
---|
328 | | - pl2303_vendor_read(serial, 0x8484, buf); |
---|
329 | | - pl2303_vendor_read(serial, 0x8383, buf); |
---|
330 | | - pl2303_vendor_read(serial, 0x8484, buf); |
---|
331 | | - pl2303_vendor_write(serial, 0x0404, 1); |
---|
332 | | - pl2303_vendor_read(serial, 0x8484, buf); |
---|
333 | | - pl2303_vendor_read(serial, 0x8383, buf); |
---|
334 | | - pl2303_vendor_write(serial, 0, 1); |
---|
335 | | - pl2303_vendor_write(serial, 1, 0); |
---|
336 | | - if (spriv->quirks & PL2303_QUIRK_LEGACY) |
---|
337 | | - pl2303_vendor_write(serial, 2, 0x24); |
---|
338 | | - else |
---|
339 | | - pl2303_vendor_write(serial, 2, 0x44); |
---|
| 410 | + if (type != TYPE_HXN) { |
---|
| 411 | + pl2303_vendor_read(serial, 0x8484, buf); |
---|
| 412 | + pl2303_vendor_write(serial, 0x0404, 0); |
---|
| 413 | + pl2303_vendor_read(serial, 0x8484, buf); |
---|
| 414 | + pl2303_vendor_read(serial, 0x8383, buf); |
---|
| 415 | + pl2303_vendor_read(serial, 0x8484, buf); |
---|
| 416 | + pl2303_vendor_write(serial, 0x0404, 1); |
---|
| 417 | + pl2303_vendor_read(serial, 0x8484, buf); |
---|
| 418 | + pl2303_vendor_read(serial, 0x8383, buf); |
---|
| 419 | + pl2303_vendor_write(serial, 0, 1); |
---|
| 420 | + pl2303_vendor_write(serial, 1, 0); |
---|
| 421 | + if (spriv->quirks & PL2303_QUIRK_LEGACY) |
---|
| 422 | + pl2303_vendor_write(serial, 2, 0x24); |
---|
| 423 | + else |
---|
| 424 | + pl2303_vendor_write(serial, 2, 0x44); |
---|
| 425 | + } |
---|
340 | 426 | |
---|
341 | 427 | kfree(buf); |
---|
342 | 428 | |
---|
.. | .. |
---|
490 | 576 | baud = min_t(speed_t, baud, spriv->type->max_baud_rate); |
---|
491 | 577 | /* |
---|
492 | 578 | * Use direct method for supported baud rates, otherwise use divisors. |
---|
| 579 | + * Newer chip types do not support divisor encoding. |
---|
493 | 580 | */ |
---|
494 | | - baud_sup = pl2303_get_supported_baud_rate(baud); |
---|
| 581 | + if (spriv->type->no_divisors) |
---|
| 582 | + baud_sup = baud; |
---|
| 583 | + else |
---|
| 584 | + baud_sup = pl2303_get_supported_baud_rate(baud); |
---|
495 | 585 | |
---|
496 | 586 | if (baud == baud_sup) |
---|
497 | 587 | baud = pl2303_encode_baud_rate_direct(buf, baud); |
---|
.. | .. |
---|
554 | 644 | a->c_cc[VSTOP] != b->c_cc[VSTOP]; |
---|
555 | 645 | |
---|
556 | 646 | return tty_termios_hw_change(a, b) || ixon_change; |
---|
| 647 | +} |
---|
| 648 | + |
---|
| 649 | +static bool pl2303_enable_xonxoff(struct tty_struct *tty, const struct pl2303_type_data *type) |
---|
| 650 | +{ |
---|
| 651 | + if (!I_IXON(tty) || I_IXANY(tty)) |
---|
| 652 | + return false; |
---|
| 653 | + |
---|
| 654 | + if (START_CHAR(tty) != 0x11 || STOP_CHAR(tty) != 0x13) |
---|
| 655 | + return false; |
---|
| 656 | + |
---|
| 657 | + if (type->no_autoxonxoff) |
---|
| 658 | + return false; |
---|
| 659 | + |
---|
| 660 | + return true; |
---|
557 | 661 | } |
---|
558 | 662 | |
---|
559 | 663 | static void pl2303_set_termios(struct tty_struct *tty, |
---|
.. | .. |
---|
681 | 785 | } |
---|
682 | 786 | |
---|
683 | 787 | if (C_CRTSCTS(tty)) { |
---|
684 | | - if (spriv->quirks & PL2303_QUIRK_LEGACY) |
---|
685 | | - pl2303_vendor_write(serial, 0x0, 0x41); |
---|
686 | | - else |
---|
687 | | - pl2303_vendor_write(serial, 0x0, 0x61); |
---|
688 | | - } else if (I_IXON(tty) && !I_IXANY(tty) && START_CHAR(tty) == 0x11 && |
---|
689 | | - STOP_CHAR(tty) == 0x13) { |
---|
690 | | - pl2303_vendor_write(serial, 0x0, 0xc0); |
---|
| 788 | + if (spriv->quirks & PL2303_QUIRK_LEGACY) { |
---|
| 789 | + pl2303_update_reg(serial, 0, PL2303_FLOWCTRL_MASK, 0x40); |
---|
| 790 | + } else if (spriv->type == &pl2303_type_data[TYPE_HXN]) { |
---|
| 791 | + pl2303_update_reg(serial, PL2303_HXN_FLOWCTRL_REG, |
---|
| 792 | + PL2303_HXN_FLOWCTRL_MASK, |
---|
| 793 | + PL2303_HXN_FLOWCTRL_RTS_CTS); |
---|
| 794 | + } else { |
---|
| 795 | + pl2303_update_reg(serial, 0, PL2303_FLOWCTRL_MASK, 0x60); |
---|
| 796 | + } |
---|
| 797 | + } else if (pl2303_enable_xonxoff(tty, spriv->type)) { |
---|
| 798 | + if (spriv->type == &pl2303_type_data[TYPE_HXN]) { |
---|
| 799 | + pl2303_update_reg(serial, PL2303_HXN_FLOWCTRL_REG, |
---|
| 800 | + PL2303_HXN_FLOWCTRL_MASK, |
---|
| 801 | + PL2303_HXN_FLOWCTRL_XON_XOFF); |
---|
| 802 | + } else { |
---|
| 803 | + pl2303_update_reg(serial, 0, PL2303_FLOWCTRL_MASK, 0xc0); |
---|
| 804 | + } |
---|
691 | 805 | } else { |
---|
692 | | - pl2303_vendor_write(serial, 0x0, 0x0); |
---|
| 806 | + if (spriv->type == &pl2303_type_data[TYPE_HXN]) { |
---|
| 807 | + pl2303_update_reg(serial, PL2303_HXN_FLOWCTRL_REG, |
---|
| 808 | + PL2303_HXN_FLOWCTRL_MASK, |
---|
| 809 | + PL2303_HXN_FLOWCTRL_NONE); |
---|
| 810 | + } else { |
---|
| 811 | + pl2303_update_reg(serial, 0, PL2303_FLOWCTRL_MASK, 0); |
---|
| 812 | + } |
---|
693 | 813 | } |
---|
694 | 814 | |
---|
695 | 815 | kfree(buf); |
---|
.. | .. |
---|
730 | 850 | usb_clear_halt(serial->dev, port->read_urb->pipe); |
---|
731 | 851 | } else { |
---|
732 | 852 | /* reset upstream data pipes */ |
---|
733 | | - pl2303_vendor_write(serial, 8, 0); |
---|
734 | | - pl2303_vendor_write(serial, 9, 0); |
---|
| 853 | + if (spriv->type == &pl2303_type_data[TYPE_HXN]) { |
---|
| 854 | + pl2303_vendor_write(serial, PL2303_HXN_RESET_REG, |
---|
| 855 | + PL2303_HXN_RESET_UPSTREAM_PIPE | |
---|
| 856 | + PL2303_HXN_RESET_DOWNSTREAM_PIPE); |
---|
| 857 | + } else { |
---|
| 858 | + pl2303_vendor_write(serial, 8, 0); |
---|
| 859 | + pl2303_vendor_write(serial, 9, 0); |
---|
| 860 | + } |
---|
735 | 861 | } |
---|
736 | 862 | |
---|
737 | 863 | /* Setup termios */ |
---|
.. | .. |
---|
818 | 944 | return 0; |
---|
819 | 945 | } |
---|
820 | 946 | |
---|
821 | | -static int pl2303_ioctl(struct tty_struct *tty, |
---|
822 | | - unsigned int cmd, unsigned long arg) |
---|
| 947 | +static int pl2303_get_serial(struct tty_struct *tty, |
---|
| 948 | + struct serial_struct *ss) |
---|
823 | 949 | { |
---|
824 | | - struct serial_struct ser; |
---|
825 | 950 | struct usb_serial_port *port = tty->driver_data; |
---|
826 | 951 | |
---|
827 | | - switch (cmd) { |
---|
828 | | - case TIOCGSERIAL: |
---|
829 | | - memset(&ser, 0, sizeof ser); |
---|
830 | | - ser.type = PORT_16654; |
---|
831 | | - ser.line = port->minor; |
---|
832 | | - ser.port = port->port_number; |
---|
833 | | - ser.baud_base = 460800; |
---|
834 | | - |
---|
835 | | - if (copy_to_user((void __user *)arg, &ser, sizeof ser)) |
---|
836 | | - return -EFAULT; |
---|
837 | | - |
---|
838 | | - return 0; |
---|
839 | | - default: |
---|
840 | | - break; |
---|
841 | | - } |
---|
842 | | - |
---|
843 | | - return -ENOIOCTLCMD; |
---|
| 952 | + ss->type = PORT_16654; |
---|
| 953 | + ss->line = port->minor; |
---|
| 954 | + ss->port = port->port_number; |
---|
| 955 | + ss->baud_base = 460800; |
---|
| 956 | + return 0; |
---|
844 | 957 | } |
---|
845 | 958 | |
---|
846 | 959 | static void pl2303_set_break(struct usb_serial_port *port, bool enable) |
---|
.. | .. |
---|
998 | 1111 | if (line_status & UART_OVERRUN_ERROR) |
---|
999 | 1112 | tty_insert_flip_char(&port->port, 0, TTY_OVERRUN); |
---|
1000 | 1113 | |
---|
1001 | | - if (port->port.console && port->sysrq) { |
---|
| 1114 | + if (port->sysrq) { |
---|
1002 | 1115 | for (i = 0; i < urb->actual_length; ++i) |
---|
1003 | 1116 | if (!usb_serial_handle_sysrq_char(port, data[i])) |
---|
1004 | 1117 | tty_insert_flip_char(&port->port, data[i], |
---|
.. | .. |
---|
1026 | 1139 | .close = pl2303_close, |
---|
1027 | 1140 | .dtr_rts = pl2303_dtr_rts, |
---|
1028 | 1141 | .carrier_raised = pl2303_carrier_raised, |
---|
1029 | | - .ioctl = pl2303_ioctl, |
---|
| 1142 | + .get_serial = pl2303_get_serial, |
---|
1030 | 1143 | .break_ctl = pl2303_break_ctl, |
---|
1031 | 1144 | .set_termios = pl2303_set_termios, |
---|
1032 | 1145 | .tiocmget = pl2303_tiocmget, |
---|