Blame view

drivers/usb/serial/ftdi_sio.c 88.6 KB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1
2
3
  /*
   * USB FTDI SIO driver
   *
659597b77   Johan Hovold   USB: serial: upda...
4
   *	Copyright (C) 2009 - 2013
d3901a064   Johan Hovold   USB: ftdi_sio: sw...
5
   *	    Johan Hovold (jhovold@gmail.com)
5c09d144f   David Brownell   USB: ftdi_sio whi...
6
7
   *	Copyright (C) 1999 - 2001
   *	    Greg Kroah-Hartman (greg@kroah.com)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
8
9
10
11
   *          Bill Ryder (bryder@sgi.com)
   *	Copyright (C) 2002
   *	    Kuba Ober (kuba@mareimbrium.org)
   *
5c09d144f   David Brownell   USB: ftdi_sio whi...
12
13
14
15
   *	This program is free software; you can redistribute it and/or modify
   *	it under the terms of the GNU General Public License as published by
   *	the Free Software Foundation; either version 2 of the License, or
   *	(at your option) any later version.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
16
   *
464cbb246   Alan Cox   ftdi_sio: Coding ...
17
18
   * See Documentation/usb/usb-serial.txt for more information on using this
   * driver
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
19
   *
25985edce   Lucas De Marchi   Fix common misspe...
20
   * See http://ftdi-usb-sio.sourceforge.net for up to date testing info
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
21
22
   *	and extra documentation
   *
504b55cc8   Greg Kroah-Hartman   USB: ftdi_sio: re...
23
24
   * Change entries from 2004 and earlier can be found in versions of this
   * file in kernel versions prior to the 2.6.24 release.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
25
26
27
28
29
30
   *
   */
  
  /* Bill Ryder - bryder@sgi.com - wrote the FTDI_SIO implementation */
  /* Thanx to FTDI for so kindly providing details of the protocol required */
  /*   to talk to the device */
464cbb246   Alan Cox   ftdi_sio: Coding ...
31
32
  /* Thanx to gkh and the rest of the usb dev group for all code I have
     assimilated :-) */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
33

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
34
35
  #include <linux/kernel.h>
  #include <linux/errno.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
36
37
38
39
40
41
  #include <linux/slab.h>
  #include <linux/tty.h>
  #include <linux/tty_driver.h>
  #include <linux/tty_flip.h>
  #include <linux/module.h>
  #include <linux/spinlock.h>
bd09a9f53   Alessio Igor Bogani   USB: ftdi_sio: Re...
42
  #include <linux/mutex.h>
464cbb246   Alan Cox   ftdi_sio: Coding ...
43
  #include <linux/uaccess.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
44
45
  #include <linux/usb.h>
  #include <linux/serial.h>
a969888ce   Greg Kroah-Hartman   [PATCH] USB: move...
46
  #include <linux/usb/serial.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
47
  #include "ftdi_sio.h"
31844d558   Andreas Mohr   USB: ftdi_sio: is...
48
  #include "ftdi_sio_ids.h"
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
49

d3901a064   Johan Hovold   USB: ftdi_sio: sw...
50
  #define DRIVER_AUTHOR "Greg Kroah-Hartman <greg@kroah.com>, Bill Ryder <bryder@sgi.com>, Kuba Ober <kuba@mareimbrium.org>, Andreas Mohr, Johan Hovold <jhovold@gmail.com>"
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
51
  #define DRIVER_DESC "USB FTDI Serial Converters Driver"
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
52

0ffbbe25a   Oliver Neukum   USB: ftdi_sio: fi...
53
  struct ftdi_private {
3bb36aa26   Greg Kroah-Hartman   USB: ftdi_sio: ch...
54
  	enum ftdi_chip_type chip_type;
464cbb246   Alan Cox   ftdi_sio: Coding ...
55
  				/* type of device, either SIO or FT8U232AM */
0ffbbe25a   Oliver Neukum   USB: ftdi_sio: fi...
56
  	int baud_base;		/* baud base clock for divisor setting */
464cbb246   Alan Cox   ftdi_sio: Coding ...
57
58
59
  	int custom_divisor;	/* custom_divisor kludge, this is for
  				   baud_base (different from what goes to the
  				   chip!) */
0ffbbe25a   Oliver Neukum   USB: ftdi_sio: fi...
60
  	__u16 last_set_data_urb_value ;
464cbb246   Alan Cox   ftdi_sio: Coding ...
61
62
63
  				/* the last data state set - needed for doing
  				 * a break
  				 */
0ffbbe25a   Oliver Neukum   USB: ftdi_sio: fi...
64
65
  	int flags;		/* some ASYNC_xxxx flags are supported */
  	unsigned long last_dtr_rts;	/* saved modem control outputs */
fca5430d4   Simon Arlott   USB: ftdi_sio: fi...
66
  	char prev_status;        /* Used for TIOCMIWAIT */
c466cd2bb   Greg Kroah-Hartman   USB: serial: ftdi...
67
  	char transmit_empty;	/* If transmitter is empty or not */
094c2e6db   Mark Adamson   USB: serial: FTDI...
68
69
  	__u16 interface;	/* FT2232C, FT2232H or FT4232H port interface
  				   (0 for FT232/245) */
0ffbbe25a   Oliver Neukum   USB: ftdi_sio: fi...
70

464cbb246   Alan Cox   ftdi_sio: Coding ...
71
72
73
74
  	speed_t force_baud;	/* if non-zero, force the baud rate to
  				   this value */
  	int force_rtscts;	/* if non-zero, force RTS-CTS to always
  				   be enabled */
0ffbbe25a   Oliver Neukum   USB: ftdi_sio: fi...
75

557aaa7ff   Alan Cox   ft232: support th...
76
  	unsigned int latency;		/* latency setting in use */
895f28bad   Mark Adamson   USB: ftdi_sio: fi...
77
  	unsigned short max_packet_size;
9c67d28e4   Alessio Igor Bogani   USB: ftdi_sio: Fi...
78
  	struct mutex cfg_lock; /* Avoid mess by parallel calls of config ioctl() and change_speed() */
0ffbbe25a   Oliver Neukum   USB: ftdi_sio: fi...
79
  };
8f977e420   Ian Abbott   [PATCH] USB ftdi_...
80
81
  /* struct ftdi_sio_quirk is used by devices requiring special attention. */
  struct ftdi_sio_quirk {
fa91d43b9   Tony Lindgren   USB: Add support ...
82
  	int (*probe)(struct usb_serial *);
464cbb246   Alan Cox   ftdi_sio: Coding ...
83
84
  	/* Special settings for probed ports. */
  	void (*port_probe)(struct ftdi_private *);
8f977e420   Ian Abbott   [PATCH] USB ftdi_...
85
  };
464cbb246   Alan Cox   ftdi_sio: Coding ...
86
87
  static int   ftdi_jtag_probe(struct usb_serial *serial);
  static int   ftdi_mtxorb_hack_setup(struct usb_serial *serial);
b760dac29   Martin Geleynse   USB: ftdi: suppor...
88
  static int   ftdi_NDI_device_setup(struct usb_serial *serial);
6ec2f46c4   Jean-Christophe PLAGNIOL-VILLARD   USB: ftdi_sio: ad...
89
  static int   ftdi_stmclite_probe(struct usb_serial *serial);
c96fbdd0a   Jean-Christophe PLAGNIOL-VILLARD   USB: ftdi_sio: ad...
90
  static int   ftdi_8u2232c_probe(struct usb_serial *serial);
464cbb246   Alan Cox   ftdi_sio: Coding ...
91
92
  static void  ftdi_USB_UIRT_setup(struct ftdi_private *priv);
  static void  ftdi_HE_TIRA1_setup(struct ftdi_private *priv);
8f977e420   Ian Abbott   [PATCH] USB ftdi_...
93

20734345b   Harald Welte   USB: ftdi_sio: Su...
94
95
  static struct ftdi_sio_quirk ftdi_jtag_quirk = {
  	.probe	= ftdi_jtag_probe,
fa91d43b9   Tony Lindgren   USB: Add support ...
96
  };
546d7eec3   Kevin Vance   USB: ftdi_sio: Wo...
97
98
99
  static struct ftdi_sio_quirk ftdi_mtxorb_hack_quirk = {
  	.probe  = ftdi_mtxorb_hack_setup,
  };
b760dac29   Martin Geleynse   USB: ftdi: suppor...
100
101
102
  static struct ftdi_sio_quirk ftdi_NDI_device_quirk = {
  	.probe	= ftdi_NDI_device_setup,
  };
8f977e420   Ian Abbott   [PATCH] USB ftdi_...
103
  static struct ftdi_sio_quirk ftdi_USB_UIRT_quirk = {
0ffbbe25a   Oliver Neukum   USB: ftdi_sio: fi...
104
  	.port_probe = ftdi_USB_UIRT_setup,
8f977e420   Ian Abbott   [PATCH] USB ftdi_...
105
106
107
  };
  
  static struct ftdi_sio_quirk ftdi_HE_TIRA1_quirk = {
0ffbbe25a   Oliver Neukum   USB: ftdi_sio: fi...
108
  	.port_probe = ftdi_HE_TIRA1_setup,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
109
  };
6ec2f46c4   Jean-Christophe PLAGNIOL-VILLARD   USB: ftdi_sio: ad...
110
111
112
  static struct ftdi_sio_quirk ftdi_stmclite_quirk = {
  	.probe	= ftdi_stmclite_probe,
  };
c96fbdd0a   Jean-Christophe PLAGNIOL-VILLARD   USB: ftdi_sio: ad...
113
114
115
  static struct ftdi_sio_quirk ftdi_8u2232c_quirk = {
  	.probe	= ftdi_8u2232c_probe,
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
116
117
118
119
120
121
122
123
124
125
126
127
  /*
   * The 8U232AM has the same API as the sio except for:
   * - it can support MUCH higher baudrates; up to:
   *   o 921600 for RS232 and 2000000 for RS422/485 at 48MHz
   *   o 230400 at 12MHz
   *   so .. 8U232AM's baudrate setting codes are different
   * - it has a two byte status code.
   * - it returns characters every 16ms (the FTDI does it every 40ms)
   *
   * the bcdDevice value is used to differentiate FT232BM and FT245BM from
   * the earlier FT8U232AM and FT8U232BM.  For now, include all known VID/PID
   * combinations in both tables.
8f977e420   Ian Abbott   [PATCH] USB ftdi_...
128
129
   * FIXME: perhaps bcdDevice can also identify 12MHz FT8U232AM devices,
   * but I don't know if those ever went into mass production. [Ian Abbott]
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
130
   */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
131

65e1ec675   Andreas Mohr   USB: ftdi_sio: ad...
132
  /*
e17c1aa2e   Johan Hovold   USB: ftdi_sio: re...
133
134
   * Device ID not listed? Test it using
   * /sys/bus/usb-serial/drivers/ftdi_sio/new_id and send a patch or report.
65e1ec675   Andreas Mohr   USB: ftdi_sio: ad...
135
   */
5c6b98dd0   Johan Hovold   USB: serial: cons...
136
  static const struct usb_device_id id_table_combined[] = {
ce7e90659   Artur Zimmer   USB: Serial: Add ...
137
  	{ USB_DEVICE(FTDI_VID, FTDI_ZEITCONTROL_TAGTRACE_MIFARE_PID) },
5a9443f08   Christian Simon   USB: ftdi_sio: Ad...
138
139
  	{ USB_DEVICE(FTDI_VID, FTDI_CTI_MINI_PID) },
  	{ USB_DEVICE(FTDI_VID, FTDI_CTI_NANO_PID) },
2011e9249   Jonathan Davies   USB: ftdi_sio dri...
140
141
  	{ USB_DEVICE(FTDI_VID, FTDI_AMC232_PID) },
  	{ USB_DEVICE(FTDI_VID, FTDI_CANUSB_PID) },
01ba0856e   Andrew Ewert   USB: ftdi_sio: Ad...
142
  	{ USB_DEVICE(FTDI_VID, FTDI_CANDAPTER_PID) },
65e1ec675   Andreas Mohr   USB: ftdi_sio: ad...
143
  	{ USB_DEVICE(FTDI_VID, FTDI_NXTCAM_PID) },
67847baee   Bjørn Mork   usb: ftdi_sio: ad...
144
  	{ USB_DEVICE(FTDI_VID, FTDI_EV3CON_PID) },
6e1ab3ed8   Peter Mack   USB: add more FTD...
145
146
147
148
149
150
151
152
  	{ USB_DEVICE(FTDI_VID, FTDI_SCS_DEVICE_0_PID) },
  	{ USB_DEVICE(FTDI_VID, FTDI_SCS_DEVICE_1_PID) },
  	{ USB_DEVICE(FTDI_VID, FTDI_SCS_DEVICE_2_PID) },
  	{ USB_DEVICE(FTDI_VID, FTDI_SCS_DEVICE_3_PID) },
  	{ USB_DEVICE(FTDI_VID, FTDI_SCS_DEVICE_4_PID) },
  	{ USB_DEVICE(FTDI_VID, FTDI_SCS_DEVICE_5_PID) },
  	{ USB_DEVICE(FTDI_VID, FTDI_SCS_DEVICE_6_PID) },
  	{ USB_DEVICE(FTDI_VID, FTDI_SCS_DEVICE_7_PID) },
b6180ef7c   dranch@trinnet.net   USB: ftdi_sio: de...
153
154
155
  	{ USB_DEVICE(FTDI_VID, FTDI_USINT_CAT_PID) },
  	{ USB_DEVICE(FTDI_VID, FTDI_USINT_WKEY_PID) },
  	{ USB_DEVICE(FTDI_VID, FTDI_USINT_RS232_PID) },
72a9f9584   Razvan Gavril   [PATCH] USB: ftdi...
156
  	{ USB_DEVICE(FTDI_VID, FTDI_ACTZWAVE_PID) },
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
157
  	{ USB_DEVICE(FTDI_VID, FTDI_IRTRANS_PID) },
69737dfaa   Luiz Fernando N. Capitulino   [PATCH] USB: ftdi...
158
  	{ USB_DEVICE(FTDI_VID, FTDI_IPLUS_PID) },
d099321bd   Luiz Fernando N. Capitulino   USB: ftdio_sio: N...
159
  	{ USB_DEVICE(FTDI_VID, FTDI_IPLUS2_PID) },
fad14a0da   Frank Sievertsen   USB: ftdi driver ...
160
  	{ USB_DEVICE(FTDI_VID, FTDI_DMX4ALL) },
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
161
162
163
  	{ USB_DEVICE(FTDI_VID, FTDI_SIO_PID) },
  	{ USB_DEVICE(FTDI_VID, FTDI_8U232AM_PID) },
  	{ USB_DEVICE(FTDI_VID, FTDI_8U232AM_ALT_PID) },
d8b216068   Gard Spreemann   USB: Product ID f...
164
  	{ USB_DEVICE(FTDI_VID, FTDI_232RL_PID) },
c96fbdd0a   Jean-Christophe PLAGNIOL-VILLARD   USB: ftdi_sio: ad...
165
166
  	{ USB_DEVICE(FTDI_VID, FTDI_8U2232C_PID) ,
  		.driver_info = (kernel_ulong_t)&ftdi_8u2232c_quirk },
094c2e6db   Mark Adamson   USB: serial: FTDI...
167
  	{ USB_DEVICE(FTDI_VID, FTDI_4232H_PID) },
309427b63   Uwe Bonnes   USB: Add new FT23...
168
  	{ USB_DEVICE(FTDI_VID, FTDI_232H_PID) },
dc0827c12   Jim Paris   USB: ftdi_sio: ad...
169
  	{ USB_DEVICE(FTDI_VID, FTDI_FTX_PID) },
c0f8d5619   Christophe Mariac   [PATCH] USB: new ...
170
  	{ USB_DEVICE(FTDI_VID, FTDI_MICRO_CHAMELEON_PID) },
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
171
  	{ USB_DEVICE(FTDI_VID, FTDI_RELAIS_PID) },
2adb80e9c   Guido Scholz   USB: ftdi_sio: Ad...
172
  	{ USB_DEVICE(FTDI_VID, FTDI_OPENDCC_PID) },
ec3815c3e   mail@rainerkeller.de   USB: add PIDs for...
173
174
175
  	{ USB_DEVICE(FTDI_VID, FTDI_OPENDCC_SNIFFER_PID) },
  	{ USB_DEVICE(FTDI_VID, FTDI_OPENDCC_THROTTLE_PID) },
  	{ USB_DEVICE(FTDI_VID, FTDI_OPENDCC_GATEWAY_PID) },
99c1e4f89   Rainer Keller   USB: add PID for ...
176
  	{ USB_DEVICE(FTDI_VID, FTDI_OPENDCC_GBM_PID) },
58f8b6c4f   Stefani Seibold   USB: add ftdi_sio...
177
  	{ USB_DEVICE(FTDI_VID, FTDI_OPENDCC_GBM_BOOST_PID) },
d7e14b375   Martin Teichmann   USB: ftdi_sio: Ad...
178
  	{ USB_DEVICE(NEWPORT_VID, NEWPORT_AGILIS_PID) },
713814397   Gomella, Andrew (NIH/NHLBI) [F]   USB: ftdi_sio: Ad...
179
180
  	{ USB_DEVICE(NEWPORT_VID, NEWPORT_CONEX_CC_PID) },
  	{ USB_DEVICE(NEWPORT_VID, NEWPORT_CONEX_AGP_PID) },
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
181
182
  	{ USB_DEVICE(INTERBIOMETRICS_VID, INTERBIOMETRICS_IOBOARD_PID) },
  	{ USB_DEVICE(INTERBIOMETRICS_VID, INTERBIOMETRICS_MINI_IOBOARD_PID) },
f2ee69555   Alan Cox   USB: tty: SprogII...
183
  	{ USB_DEVICE(FTDI_VID, FTDI_SPROG_II) },
76f24e3f3   Ulrich Hahn   USB: ftdi_sio: ad...
184
185
  	{ USB_DEVICE(FTDI_VID, FTDI_TAGSYS_LP101_PID) },
  	{ USB_DEVICE(FTDI_VID, FTDI_TAGSYS_P200X_PID) },
ea233f805   Galen Seitz   USB: ftdi_sio: ad...
186
  	{ USB_DEVICE(FTDI_VID, FTDI_LENZ_LIUSB_PID) },
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
187
188
189
190
191
192
193
194
195
  	{ USB_DEVICE(FTDI_VID, FTDI_XF_632_PID) },
  	{ USB_DEVICE(FTDI_VID, FTDI_XF_634_PID) },
  	{ USB_DEVICE(FTDI_VID, FTDI_XF_547_PID) },
  	{ USB_DEVICE(FTDI_VID, FTDI_XF_633_PID) },
  	{ USB_DEVICE(FTDI_VID, FTDI_XF_631_PID) },
  	{ USB_DEVICE(FTDI_VID, FTDI_XF_635_PID) },
  	{ USB_DEVICE(FTDI_VID, FTDI_XF_640_PID) },
  	{ USB_DEVICE(FTDI_VID, FTDI_XF_642_PID) },
  	{ USB_DEVICE(FTDI_VID, FTDI_DSS20_PID) },
74bdf22b5   Hakan Kvist   USB: ftdi_sio: ad...
196
197
  	{ USB_DEVICE(FTDI_VID, FTDI_URBAN_0_PID) },
  	{ USB_DEVICE(FTDI_VID, FTDI_URBAN_1_PID) },
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
198
199
  	{ USB_DEVICE(FTDI_NF_RIC_VID, FTDI_NF_RIC_PID) },
  	{ USB_DEVICE(FTDI_VID, FTDI_VNHCPCUSB_D_PID) },
8f977e420   Ian Abbott   [PATCH] USB ftdi_...
200
201
202
203
204
205
206
  	{ USB_DEVICE(FTDI_VID, FTDI_MTXORB_0_PID) },
  	{ USB_DEVICE(FTDI_VID, FTDI_MTXORB_1_PID) },
  	{ USB_DEVICE(FTDI_VID, FTDI_MTXORB_2_PID) },
  	{ USB_DEVICE(FTDI_VID, FTDI_MTXORB_3_PID) },
  	{ USB_DEVICE(FTDI_VID, FTDI_MTXORB_4_PID) },
  	{ USB_DEVICE(FTDI_VID, FTDI_MTXORB_5_PID) },
  	{ USB_DEVICE(FTDI_VID, FTDI_MTXORB_6_PID) },
b34efeeab   Folkert van Heusden   USB: serial: FTDI...
207
  	{ USB_DEVICE(FTDI_VID, FTDI_R2000KU_TRUE_RNG) },
6fdbad802   Jacques Viviers   USB: serial: ftdi...
208
  	{ USB_DEVICE(FTDI_VID, FTDI_VARDAAN_PID) },
464cbb246   Alan Cox   ftdi_sio: Coding ...
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0100_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0101_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0102_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0103_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0104_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0105_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0106_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0107_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0108_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0109_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_010A_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_010B_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_010C_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_010D_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_010E_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_010F_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0110_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0111_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0112_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0113_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0114_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0115_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0116_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0117_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0118_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0119_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_011A_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_011B_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_011C_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_011D_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_011E_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_011F_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0120_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0121_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0122_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0123_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0124_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0125_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0126_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0127_PID),
546d7eec3   Kevin Vance   USB: ftdi_sio: Wo...
249
  		.driver_info = (kernel_ulong_t)&ftdi_mtxorb_hack_quirk },
464cbb246   Alan Cox   ftdi_sio: Coding ...
250
251
252
253
254
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0128_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0129_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_012A_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_012B_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_012C_PID),
ebb3770c0   Ray Molenkamp   USB: FTDI_SIO : A...
255
  		.driver_info = (kernel_ulong_t)&ftdi_mtxorb_hack_quirk },
464cbb246   Alan Cox   ftdi_sio: Coding ...
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_012D_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_012E_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_012F_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0130_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0131_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0132_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0133_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0134_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0135_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0136_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0137_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0138_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0139_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_013A_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_013B_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_013C_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_013D_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_013E_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_013F_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0140_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0141_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0142_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0143_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0144_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0145_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0146_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0147_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0148_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0149_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_014A_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_014B_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_014C_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_014D_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_014E_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_014F_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0150_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0151_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0152_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0153_PID),
ebb3770c0   Ray Molenkamp   USB: FTDI_SIO : A...
295
  		.driver_info = (kernel_ulong_t)&ftdi_mtxorb_hack_quirk },
464cbb246   Alan Cox   ftdi_sio: Coding ...
296
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0154_PID),
ebb3770c0   Ray Molenkamp   USB: FTDI_SIO : A...
297
  		.driver_info = (kernel_ulong_t)&ftdi_mtxorb_hack_quirk },
464cbb246   Alan Cox   ftdi_sio: Coding ...
298
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0155_PID),
ebb3770c0   Ray Molenkamp   USB: FTDI_SIO : A...
299
  		.driver_info = (kernel_ulong_t)&ftdi_mtxorb_hack_quirk },
464cbb246   Alan Cox   ftdi_sio: Coding ...
300
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0156_PID),
ebb3770c0   Ray Molenkamp   USB: FTDI_SIO : A...
301
  		.driver_info = (kernel_ulong_t)&ftdi_mtxorb_hack_quirk },
464cbb246   Alan Cox   ftdi_sio: Coding ...
302
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0157_PID),
ebb3770c0   Ray Molenkamp   USB: FTDI_SIO : A...
303
  		.driver_info = (kernel_ulong_t)&ftdi_mtxorb_hack_quirk },
464cbb246   Alan Cox   ftdi_sio: Coding ...
304
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0158_PID),
ebb3770c0   Ray Molenkamp   USB: FTDI_SIO : A...
305
  		.driver_info = (kernel_ulong_t)&ftdi_mtxorb_hack_quirk },
464cbb246   Alan Cox   ftdi_sio: Coding ...
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0159_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_015A_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_015B_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_015C_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_015D_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_015E_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_015F_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0160_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0161_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0162_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0163_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0164_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0165_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0166_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0167_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0168_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0169_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_016A_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_016B_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_016C_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_016D_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_016E_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_016F_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0170_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0171_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0172_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0173_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0174_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0175_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0176_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0177_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0178_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0179_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_017A_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_017B_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_017C_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_017D_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_017E_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_017F_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0180_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0181_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0182_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0183_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0184_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0185_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0186_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0187_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0188_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0189_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_018A_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_018B_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_018C_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_018D_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_018E_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_018F_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0190_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0191_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0192_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0193_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0194_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0195_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0196_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0197_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0198_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0199_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_019A_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_019B_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_019C_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_019D_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_019E_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_019F_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01A0_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01A1_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01A2_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01A3_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01A4_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01A5_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01A6_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01A7_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01A8_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01A9_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01AA_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01AB_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01AC_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01AD_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01AE_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01AF_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01B0_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01B1_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01B2_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01B3_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01B4_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01B5_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01B6_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01B7_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01B8_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01B9_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01BA_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01BB_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01BC_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01BD_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01BE_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01BF_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01C0_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01C1_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01C2_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01C3_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01C4_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01C5_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01C6_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01C7_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01C8_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01C9_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01CA_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01CB_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01CC_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01CD_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01CE_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01CF_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01D0_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01D1_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01D2_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01D3_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01D4_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01D5_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01D6_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01D7_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01D8_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01D9_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01DA_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01DB_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01DC_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01DD_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01DE_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01DF_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01E0_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01E1_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01E2_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01E3_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01E4_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01E5_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01E6_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01E7_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01E8_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01E9_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01EA_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01EB_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01EC_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01ED_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01EE_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01EF_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01F0_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01F1_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01F2_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01F3_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01F4_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01F5_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01F6_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01F7_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01F8_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01F9_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01FA_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01FB_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01FC_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01FD_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01FE_PID) },
  	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01FF_PID) },
8f977e420   Ian Abbott   [PATCH] USB ftdi_...
473
  	{ USB_DEVICE(FTDI_VID, FTDI_PERLE_ULTRAPORT_PID) },
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
474
  	{ USB_DEVICE(FTDI_VID, FTDI_PIEGROUP_PID) },
274a4bbc9   Dave Platt   USB: Additional P...
475
  	{ USB_DEVICE(FTDI_VID, FTDI_TNC_X_PID) },
868e440d2   Jelle Foks   USB: ftdi_sio: Ad...
476
  	{ USB_DEVICE(FTDI_VID, FTDI_USBX_707_PID) },
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
477
478
479
480
  	{ USB_DEVICE(SEALEVEL_VID, SEALEVEL_2101_PID) },
  	{ USB_DEVICE(SEALEVEL_VID, SEALEVEL_2102_PID) },
  	{ USB_DEVICE(SEALEVEL_VID, SEALEVEL_2103_PID) },
  	{ USB_DEVICE(SEALEVEL_VID, SEALEVEL_2104_PID) },
a14848275   Justin Carlson   USB: add SeaLevel...
481
  	{ USB_DEVICE(SEALEVEL_VID, SEALEVEL_2106_PID) },
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
  	{ USB_DEVICE(SEALEVEL_VID, SEALEVEL_2201_1_PID) },
  	{ USB_DEVICE(SEALEVEL_VID, SEALEVEL_2201_2_PID) },
  	{ USB_DEVICE(SEALEVEL_VID, SEALEVEL_2202_1_PID) },
  	{ USB_DEVICE(SEALEVEL_VID, SEALEVEL_2202_2_PID) },
  	{ USB_DEVICE(SEALEVEL_VID, SEALEVEL_2203_1_PID) },
  	{ USB_DEVICE(SEALEVEL_VID, SEALEVEL_2203_2_PID) },
  	{ USB_DEVICE(SEALEVEL_VID, SEALEVEL_2401_1_PID) },
  	{ USB_DEVICE(SEALEVEL_VID, SEALEVEL_2401_2_PID) },
  	{ USB_DEVICE(SEALEVEL_VID, SEALEVEL_2401_3_PID) },
  	{ USB_DEVICE(SEALEVEL_VID, SEALEVEL_2401_4_PID) },
  	{ USB_DEVICE(SEALEVEL_VID, SEALEVEL_2402_1_PID) },
  	{ USB_DEVICE(SEALEVEL_VID, SEALEVEL_2402_2_PID) },
  	{ USB_DEVICE(SEALEVEL_VID, SEALEVEL_2402_3_PID) },
  	{ USB_DEVICE(SEALEVEL_VID, SEALEVEL_2402_4_PID) },
  	{ USB_DEVICE(SEALEVEL_VID, SEALEVEL_2403_1_PID) },
  	{ USB_DEVICE(SEALEVEL_VID, SEALEVEL_2403_2_PID) },
  	{ USB_DEVICE(SEALEVEL_VID, SEALEVEL_2403_3_PID) },
  	{ USB_DEVICE(SEALEVEL_VID, SEALEVEL_2403_4_PID) },
  	{ USB_DEVICE(SEALEVEL_VID, SEALEVEL_2801_1_PID) },
  	{ USB_DEVICE(SEALEVEL_VID, SEALEVEL_2801_2_PID) },
  	{ USB_DEVICE(SEALEVEL_VID, SEALEVEL_2801_3_PID) },
  	{ USB_DEVICE(SEALEVEL_VID, SEALEVEL_2801_4_PID) },
  	{ USB_DEVICE(SEALEVEL_VID, SEALEVEL_2801_5_PID) },
  	{ USB_DEVICE(SEALEVEL_VID, SEALEVEL_2801_6_PID) },
  	{ USB_DEVICE(SEALEVEL_VID, SEALEVEL_2801_7_PID) },
  	{ USB_DEVICE(SEALEVEL_VID, SEALEVEL_2801_8_PID) },
  	{ USB_DEVICE(SEALEVEL_VID, SEALEVEL_2802_1_PID) },
  	{ USB_DEVICE(SEALEVEL_VID, SEALEVEL_2802_2_PID) },
  	{ USB_DEVICE(SEALEVEL_VID, SEALEVEL_2802_3_PID) },
  	{ USB_DEVICE(SEALEVEL_VID, SEALEVEL_2802_4_PID) },
  	{ USB_DEVICE(SEALEVEL_VID, SEALEVEL_2802_5_PID) },
  	{ USB_DEVICE(SEALEVEL_VID, SEALEVEL_2802_6_PID) },
  	{ USB_DEVICE(SEALEVEL_VID, SEALEVEL_2802_7_PID) },
  	{ USB_DEVICE(SEALEVEL_VID, SEALEVEL_2802_8_PID) },
  	{ USB_DEVICE(SEALEVEL_VID, SEALEVEL_2803_1_PID) },
  	{ USB_DEVICE(SEALEVEL_VID, SEALEVEL_2803_2_PID) },
  	{ USB_DEVICE(SEALEVEL_VID, SEALEVEL_2803_3_PID) },
  	{ USB_DEVICE(SEALEVEL_VID, SEALEVEL_2803_4_PID) },
  	{ USB_DEVICE(SEALEVEL_VID, SEALEVEL_2803_5_PID) },
  	{ USB_DEVICE(SEALEVEL_VID, SEALEVEL_2803_6_PID) },
  	{ USB_DEVICE(SEALEVEL_VID, SEALEVEL_2803_7_PID) },
  	{ USB_DEVICE(SEALEVEL_VID, SEALEVEL_2803_8_PID) },
6d161b99f   Scott Dial   usb-serial: Add s...
524
525
526
527
  	{ USB_DEVICE(SEALEVEL_VID, SEALEVEL_2803R_1_PID) },
  	{ USB_DEVICE(SEALEVEL_VID, SEALEVEL_2803R_2_PID) },
  	{ USB_DEVICE(SEALEVEL_VID, SEALEVEL_2803R_3_PID) },
  	{ USB_DEVICE(SEALEVEL_VID, SEALEVEL_2803R_4_PID) },
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
528
529
  	{ USB_DEVICE(IDTECH_VID, IDTECH_IDT1221U_PID) },
  	{ USB_DEVICE(OCT_VID, OCT_US101_PID) },
11a31d841   Johan Hovold   USB: ftdi_sio: ad...
530
  	{ USB_DEVICE(OCT_VID, OCT_DK201_PID) },
8f977e420   Ian Abbott   [PATCH] USB ftdi_...
531
532
533
534
  	{ USB_DEVICE(FTDI_VID, FTDI_HE_TIRA1_PID),
  		.driver_info = (kernel_ulong_t)&ftdi_HE_TIRA1_quirk },
  	{ USB_DEVICE(FTDI_VID, FTDI_USB_UIRT_PID),
  		.driver_info = (kernel_ulong_t)&ftdi_USB_UIRT_quirk },
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
535
536
537
538
  	{ USB_DEVICE(FTDI_VID, PROTEGO_SPECIAL_1) },
  	{ USB_DEVICE(FTDI_VID, PROTEGO_R2X0) },
  	{ USB_DEVICE(FTDI_VID, PROTEGO_SPECIAL_3) },
  	{ USB_DEVICE(FTDI_VID, PROTEGO_SPECIAL_4) },
8f977e420   Ian Abbott   [PATCH] USB ftdi_...
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
  	{ USB_DEVICE(FTDI_VID, FTDI_GUDEADS_E808_PID) },
  	{ USB_DEVICE(FTDI_VID, FTDI_GUDEADS_E809_PID) },
  	{ USB_DEVICE(FTDI_VID, FTDI_GUDEADS_E80A_PID) },
  	{ USB_DEVICE(FTDI_VID, FTDI_GUDEADS_E80B_PID) },
  	{ USB_DEVICE(FTDI_VID, FTDI_GUDEADS_E80C_PID) },
  	{ USB_DEVICE(FTDI_VID, FTDI_GUDEADS_E80D_PID) },
  	{ USB_DEVICE(FTDI_VID, FTDI_GUDEADS_E80E_PID) },
  	{ USB_DEVICE(FTDI_VID, FTDI_GUDEADS_E80F_PID) },
  	{ USB_DEVICE(FTDI_VID, FTDI_GUDEADS_E888_PID) },
  	{ USB_DEVICE(FTDI_VID, FTDI_GUDEADS_E889_PID) },
  	{ USB_DEVICE(FTDI_VID, FTDI_GUDEADS_E88A_PID) },
  	{ USB_DEVICE(FTDI_VID, FTDI_GUDEADS_E88B_PID) },
  	{ USB_DEVICE(FTDI_VID, FTDI_GUDEADS_E88C_PID) },
  	{ USB_DEVICE(FTDI_VID, FTDI_GUDEADS_E88D_PID) },
  	{ USB_DEVICE(FTDI_VID, FTDI_GUDEADS_E88E_PID) },
  	{ USB_DEVICE(FTDI_VID, FTDI_GUDEADS_E88F_PID) },
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
555
  	{ USB_DEVICE(FTDI_VID, FTDI_ELV_UO100_PID) },
47900743a   Ian Abbott   [PATCH] USB: ftdi...
556
  	{ USB_DEVICE(FTDI_VID, FTDI_ELV_UM100_PID) },
e6ac4a40e   Ian Abbott   [PATCH] USB ftdi_...
557
558
  	{ USB_DEVICE(FTDI_VID, FTDI_ELV_UR100_PID) },
  	{ USB_DEVICE(FTDI_VID, FTDI_ELV_ALC8500_PID) },
207c47e1f   Thomas Riewe   [PATCH] drivers/u...
559
  	{ USB_DEVICE(FTDI_VID, FTDI_PYRAMID_PID) },
bde621854   Martin Hagelin   [PATCH] USB: add ...
560
  	{ USB_DEVICE(FTDI_VID, FTDI_ELV_FHZ1000PC_PID) },
4eaf60e01   Thomas Schleusener   USB: add Addition...
561
562
563
564
565
566
567
568
  	{ USB_DEVICE(FTDI_VID, FTDI_IBS_US485_PID) },
  	{ USB_DEVICE(FTDI_VID, FTDI_IBS_PICPRO_PID) },
  	{ USB_DEVICE(FTDI_VID, FTDI_IBS_PCMCIA_PID) },
  	{ USB_DEVICE(FTDI_VID, FTDI_IBS_PK1_PID) },
  	{ USB_DEVICE(FTDI_VID, FTDI_IBS_RS232MON_PID) },
  	{ USB_DEVICE(FTDI_VID, FTDI_IBS_APP70_PID) },
  	{ USB_DEVICE(FTDI_VID, FTDI_IBS_PEDO_PID) },
  	{ USB_DEVICE(FTDI_VID, FTDI_IBS_PROD_PID) },
37909fe58   Benedek László   USB: serial: ftdi...
569
  	{ USB_DEVICE(FTDI_VID, FTDI_TAVIR_STK500_PID) },
54575b05a   Antonio Ospite   USB: ftdi_sio: ad...
570
571
  	{ USB_DEVICE(FTDI_VID, FTDI_TIAO_UMPA_PID),
  		.driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
d0839d757   George McCollister   USB: ftdi_sio: ad...
572
573
  	{ USB_DEVICE(FTDI_VID, FTDI_NT_ORIONLXM_PID),
  		.driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
e6ac4a40e   Ian Abbott   [PATCH] USB ftdi_...
574
  	/*
65e1ec675   Andreas Mohr   USB: ftdi_sio: ad...
575
  	 * ELV devices:
e6ac4a40e   Ian Abbott   [PATCH] USB ftdi_...
576
  	 */
c249f9114   Sven Killig   USB: ftdi_sio: ad...
577
  	{ USB_DEVICE(FTDI_ELV_VID, FTDI_ELV_WS300_PID) },
65e1ec675   Andreas Mohr   USB: ftdi_sio: ad...
578
579
580
581
582
583
584
585
  	{ USB_DEVICE(FTDI_VID, FTDI_ELV_USR_PID) },
  	{ USB_DEVICE(FTDI_VID, FTDI_ELV_MSM1_PID) },
  	{ USB_DEVICE(FTDI_VID, FTDI_ELV_KL100_PID) },
  	{ USB_DEVICE(FTDI_VID, FTDI_ELV_WS550_PID) },
  	{ USB_DEVICE(FTDI_VID, FTDI_ELV_EC3000_PID) },
  	{ USB_DEVICE(FTDI_VID, FTDI_ELV_WS888_PID) },
  	{ USB_DEVICE(FTDI_VID, FTDI_ELV_TWS550_PID) },
  	{ USB_DEVICE(FTDI_VID, FTDI_ELV_FEM_PID) },
42f8aa945   Peter Stark   USB: ftdi_sio - e...
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
  	{ USB_DEVICE(FTDI_VID, FTDI_ELV_CLI7000_PID) },
  	{ USB_DEVICE(FTDI_VID, FTDI_ELV_PPS7330_PID) },
  	{ USB_DEVICE(FTDI_VID, FTDI_ELV_TFM100_PID) },
  	{ USB_DEVICE(FTDI_VID, FTDI_ELV_UDF77_PID) },
  	{ USB_DEVICE(FTDI_VID, FTDI_ELV_UIO88_PID) },
  	{ USB_DEVICE(FTDI_VID, FTDI_ELV_UAD8_PID) },
  	{ USB_DEVICE(FTDI_VID, FTDI_ELV_UDA7_PID) },
  	{ USB_DEVICE(FTDI_VID, FTDI_ELV_USI2_PID) },
  	{ USB_DEVICE(FTDI_VID, FTDI_ELV_T1100_PID) },
  	{ USB_DEVICE(FTDI_VID, FTDI_ELV_PCD200_PID) },
  	{ USB_DEVICE(FTDI_VID, FTDI_ELV_ULA200_PID) },
  	{ USB_DEVICE(FTDI_VID, FTDI_ELV_CSI8_PID) },
  	{ USB_DEVICE(FTDI_VID, FTDI_ELV_EM1000DL_PID) },
  	{ USB_DEVICE(FTDI_VID, FTDI_ELV_PCK100_PID) },
  	{ USB_DEVICE(FTDI_VID, FTDI_ELV_RFP500_PID) },
  	{ USB_DEVICE(FTDI_VID, FTDI_ELV_FS20SIG_PID) },
65e1ec675   Andreas Mohr   USB: ftdi_sio: ad...
602
  	{ USB_DEVICE(FTDI_VID, FTDI_ELV_UTP8_PID) },
42f8aa945   Peter Stark   USB: ftdi_sio - e...
603
  	{ USB_DEVICE(FTDI_VID, FTDI_ELV_WS300PC_PID) },
65e1ec675   Andreas Mohr   USB: ftdi_sio: ad...
604
  	{ USB_DEVICE(FTDI_VID, FTDI_ELV_WS444PC_PID) },
42f8aa945   Peter Stark   USB: ftdi_sio - e...
605
  	{ USB_DEVICE(FTDI_VID, FTDI_ELV_FHZ1300PC_PID) },
4ae897df8   Sven Andersen   USB: ftdi_sio - r...
606
  	{ USB_DEVICE(FTDI_VID, FTDI_ELV_EM1010PC_PID) },
42f8aa945   Peter Stark   USB: ftdi_sio - e...
607
  	{ USB_DEVICE(FTDI_VID, FTDI_ELV_WS500_PID) },
b5894a500   André Schenk   USB: ftdi_sio: Ad...
608
  	{ USB_DEVICE(FTDI_VID, FTDI_ELV_HS485_PID) },
65e1ec675   Andreas Mohr   USB: ftdi_sio: ad...
609
610
611
612
  	{ USB_DEVICE(FTDI_VID, FTDI_ELV_UMS100_PID) },
  	{ USB_DEVICE(FTDI_VID, FTDI_ELV_TFD128_PID) },
  	{ USB_DEVICE(FTDI_VID, FTDI_ELV_FM3RX_PID) },
  	{ USB_DEVICE(FTDI_VID, FTDI_ELV_WS777_PID) },
5c09d144f   David Brownell   USB: ftdi_sio whi...
613
614
615
616
617
618
619
  	{ USB_DEVICE(FTDI_VID, LINX_SDMUSBQSS_PID) },
  	{ USB_DEVICE(FTDI_VID, LINX_MASTERDEVEL2_PID) },
  	{ USB_DEVICE(FTDI_VID, LINX_FUTURE_0_PID) },
  	{ USB_DEVICE(FTDI_VID, LINX_FUTURE_1_PID) },
  	{ USB_DEVICE(FTDI_VID, LINX_FUTURE_2_PID) },
  	{ USB_DEVICE(FTDI_VID, FTDI_CCSICDU20_0_PID) },
  	{ USB_DEVICE(FTDI_VID, FTDI_CCSICDU40_1_PID) },
ec434e9b4   Jan Capek   USB: ftdi_sio - M...
620
  	{ USB_DEVICE(FTDI_VID, FTDI_CCSMACHX_2_PID) },
9d37ff645   Jan Capek   USB: ftdi_sio - p...
621
622
623
  	{ USB_DEVICE(FTDI_VID, FTDI_CCSLOAD_N_GO_3_PID) },
  	{ USB_DEVICE(FTDI_VID, FTDI_CCSICDU64_4_PID) },
  	{ USB_DEVICE(FTDI_VID, FTDI_CCSPRIME8_5_PID) },
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
624
625
626
627
  	{ USB_DEVICE(FTDI_VID, INSIDE_ACCESSO) },
  	{ USB_DEVICE(INTREPID_VID, INTREPID_VALUECAN_PID) },
  	{ USB_DEVICE(INTREPID_VID, INTREPID_NEOVI_PID) },
  	{ USB_DEVICE(FALCOM_VID, FALCOM_TWIST_PID) },
e6ac4a40e   Ian Abbott   [PATCH] USB ftdi_...
628
  	{ USB_DEVICE(FALCOM_VID, FALCOM_SAMBA_PID) },
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
629
  	{ USB_DEVICE(FTDI_VID, FTDI_SUUNTO_SPORTS_PID) },
c3d36c453   Vladimir Vukicevic   USB: Add Oceanic ...
630
  	{ USB_DEVICE(FTDI_VID, FTDI_OCEANIC_PID) },
ef31fec01   Michael Olberg   USB: add QL355P p...
631
  	{ USB_DEVICE(TTI_VID, TTI_QL355P_PID) },
6f92872cc   Ian Abbott   [PATCH] USB: VID/...
632
  	{ USB_DEVICE(FTDI_VID, FTDI_RM_CANVIEW_PID) },
28fe2eb01   Michael Williamson   USB: ftdi_sio: Ad...
633
  	{ USB_DEVICE(ACTON_VID, ACTON_SPECTRAPRO_PID) },
46b72d78c   Daniel Sangorrin   USB: serial: ftdi...
634
  	{ USB_DEVICE(CONTEC_VID, CONTEC_COM1USBH_PID) },
482b0b5d8   Konstantin Holoborodko   usb: ftdi_sio: Ad...
635
  	{ USB_DEVICE(MITSUBISHI_VID, MITSUBISHI_FXUSB_PID) },
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
636
637
638
  	{ USB_DEVICE(BANDB_VID, BANDB_USOTL4_PID) },
  	{ USB_DEVICE(BANDB_VID, BANDB_USTL4_PID) },
  	{ USB_DEVICE(BANDB_VID, BANDB_USO9ML2_PID) },
a8cbd90a0   Cliff Brake   USB: ftdi_sio: ad...
639
640
641
642
643
644
645
646
647
648
649
650
651
652
  	{ USB_DEVICE(BANDB_VID, BANDB_USOPTL4_PID) },
  	{ USB_DEVICE(BANDB_VID, BANDB_USPTL4_PID) },
  	{ USB_DEVICE(BANDB_VID, BANDB_USO9ML2DR_2_PID) },
  	{ USB_DEVICE(BANDB_VID, BANDB_USO9ML2DR_PID) },
  	{ USB_DEVICE(BANDB_VID, BANDB_USOPTL4DR2_PID) },
  	{ USB_DEVICE(BANDB_VID, BANDB_USOPTL4DR_PID) },
  	{ USB_DEVICE(BANDB_VID, BANDB_485USB9F_2W_PID) },
  	{ USB_DEVICE(BANDB_VID, BANDB_485USB9F_4W_PID) },
  	{ USB_DEVICE(BANDB_VID, BANDB_232USB9M_PID) },
  	{ USB_DEVICE(BANDB_VID, BANDB_485USBTB_2W_PID) },
  	{ USB_DEVICE(BANDB_VID, BANDB_485USBTB_4W_PID) },
  	{ USB_DEVICE(BANDB_VID, BANDB_TTL5USB9M_PID) },
  	{ USB_DEVICE(BANDB_VID, BANDB_TTL3USB9M_PID) },
  	{ USB_DEVICE(BANDB_VID, BANDB_ZZ_PROG1_USB_PID) },
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
653
  	{ USB_DEVICE(FTDI_VID, EVER_ECO_PRO_CDS) },
6f92872cc   Ian Abbott   [PATCH] USB: VID/...
654
655
  	{ USB_DEVICE(FTDI_VID, FTDI_4N_GALAXY_DE_1_PID) },
  	{ USB_DEVICE(FTDI_VID, FTDI_4N_GALAXY_DE_2_PID) },
a26d31cef   Steffen Sledz   USB: serial: add ...
656
  	{ USB_DEVICE(FTDI_VID, FTDI_4N_GALAXY_DE_3_PID) },
e6ac4a40e   Ian Abbott   [PATCH] USB ftdi_...
657
658
659
660
661
662
663
664
  	{ USB_DEVICE(FTDI_VID, XSENS_CONVERTER_0_PID) },
  	{ USB_DEVICE(FTDI_VID, XSENS_CONVERTER_1_PID) },
  	{ USB_DEVICE(FTDI_VID, XSENS_CONVERTER_2_PID) },
  	{ USB_DEVICE(FTDI_VID, XSENS_CONVERTER_3_PID) },
  	{ USB_DEVICE(FTDI_VID, XSENS_CONVERTER_4_PID) },
  	{ USB_DEVICE(FTDI_VID, XSENS_CONVERTER_5_PID) },
  	{ USB_DEVICE(FTDI_VID, XSENS_CONVERTER_6_PID) },
  	{ USB_DEVICE(FTDI_VID, XSENS_CONVERTER_7_PID) },
0ba3b2ccc   Petr Kubánek   USB: ftdi_sio: ad...
665
  	{ USB_DEVICE(FTDI_VID, FTDI_OMNI1509) },
6f92872cc   Ian Abbott   [PATCH] USB: VID/...
666
  	{ USB_DEVICE(MOBILITY_VID, MOBILITY_USB_SERIAL_PID) },
8f977e420   Ian Abbott   [PATCH] USB ftdi_...
667
  	{ USB_DEVICE(FTDI_VID, FTDI_ACTIVE_ROBOTS_PID) },
34d1a8aa8   Ian Abbott   [PATCH] USB: ftdi...
668
669
  	{ USB_DEVICE(FTDI_VID, FTDI_MHAM_KW_PID) },
  	{ USB_DEVICE(FTDI_VID, FTDI_MHAM_YS_PID) },
9b1513d91   Ian Abbott   [PATCH] USB: ftdi...
670
671
  	{ USB_DEVICE(FTDI_VID, FTDI_MHAM_Y6_PID) },
  	{ USB_DEVICE(FTDI_VID, FTDI_MHAM_Y8_PID) },
34d1a8aa8   Ian Abbott   [PATCH] USB: ftdi...
672
673
674
675
  	{ USB_DEVICE(FTDI_VID, FTDI_MHAM_IC_PID) },
  	{ USB_DEVICE(FTDI_VID, FTDI_MHAM_DB9_PID) },
  	{ USB_DEVICE(FTDI_VID, FTDI_MHAM_RS232_PID) },
  	{ USB_DEVICE(FTDI_VID, FTDI_MHAM_Y9_PID) },
740a4282e   Ian Abbott   [PATCH] USB: ftdi...
676
677
  	{ USB_DEVICE(FTDI_VID, FTDI_TERATRONIK_VCP_PID) },
  	{ USB_DEVICE(FTDI_VID, FTDI_TERATRONIK_D2XX_PID) },
9b1513d91   Ian Abbott   [PATCH] USB: ftdi...
678
  	{ USB_DEVICE(EVOLUTION_VID, EVOLUTION_ER1_PID) },
c1f8ea7d3   Søren Hauberg   USB: Support for ...
679
680
  	{ USB_DEVICE(EVOLUTION_VID, EVO_HYBRID_PID) },
  	{ USB_DEVICE(EVOLUTION_VID, EVO_RCM4_PID) },
c9c7746dd   Rui Santos   [PATCH] USB: ftdi...
681
682
  	{ USB_DEVICE(FTDI_VID, FTDI_ARTEMIS_PID) },
  	{ USB_DEVICE(FTDI_VID, FTDI_ATIK_ATK16_PID) },
09c280a24   Rui Santos   [PATCH] USB: ftdi...
683
  	{ USB_DEVICE(FTDI_VID, FTDI_ATIK_ATK16C_PID) },
c9c7746dd   Rui Santos   [PATCH] USB: ftdi...
684
  	{ USB_DEVICE(FTDI_VID, FTDI_ATIK_ATK16HR_PID) },
09c280a24   Rui Santos   [PATCH] USB: ftdi...
685
  	{ USB_DEVICE(FTDI_VID, FTDI_ATIK_ATK16HRC_PID) },
34910434a   Franco Lanza   USB: ftdi-sio: Pa...
686
  	{ USB_DEVICE(FTDI_VID, FTDI_ATIK_ATK16IC_PID) },
b4723ae3c   Ian Abbott   [PATCH] USB: ftdi...
687
688
  	{ USB_DEVICE(KOBIL_VID, KOBIL_CONV_B1_PID) },
  	{ USB_DEVICE(KOBIL_VID, KOBIL_CONV_KAAN_PID) },
effac8be4   Pavel Fedin   [PATCH] USB: Supp...
689
  	{ USB_DEVICE(POSIFLEX_VID, POSIFLEX_PP7000_PID) },
641adaaee   Louis Nyffenegger   [PATCH] USB: new ...
690
  	{ USB_DEVICE(FTDI_VID, FTDI_TTUSB_PID) },
7e1c0b86a   Ian Abbott   [PATCH] USB: ftdi...
691
  	{ USB_DEVICE(FTDI_VID, FTDI_ECLO_COM_1WIRE_PID) },
a94b52ac8   Ian Abbott   [PATCH] USB: ftdi...
692
693
  	{ USB_DEVICE(FTDI_VID, FTDI_WESTREX_MODEL_777_PID) },
  	{ USB_DEVICE(FTDI_VID, FTDI_WESTREX_MODEL_8900F_PID) },
ce40d290c   Wouter Paesen   [PATCH] USB: ftdi...
694
  	{ USB_DEVICE(FTDI_VID, FTDI_PCDJ_DAC2_PID) },
cdd3b1565   Nathan Bronson   [PATCH] USB: ftdi...
695
  	{ USB_DEVICE(FTDI_VID, FTDI_RRCIRKITS_LOCOBUFFER_PID) },
7e0258fd2   Ian Abbott   [PATCH] USB: ftdi...
696
  	{ USB_DEVICE(FTDI_VID, FTDI_ASK_RDR400_PID) },
26a538b9e   Horst Schirmeier   USB: ftdi_sio: PI...
697
  	{ USB_DEVICE(FTDI_VID, FTDI_NZR_SEM_USB_PID) },
a9d61bc49   Pieter Maes   USB: serial: Upda...
698
699
700
701
702
703
704
705
706
707
708
  	{ USB_DEVICE(ICOM_VID, ICOM_ID_1_PID) },
  	{ USB_DEVICE(ICOM_VID, ICOM_OPC_U_UC_PID) },
  	{ USB_DEVICE(ICOM_VID, ICOM_ID_RP2C1_PID) },
  	{ USB_DEVICE(ICOM_VID, ICOM_ID_RP2C2_PID) },
  	{ USB_DEVICE(ICOM_VID, ICOM_ID_RP2D_PID) },
  	{ USB_DEVICE(ICOM_VID, ICOM_ID_RP2VT_PID) },
  	{ USB_DEVICE(ICOM_VID, ICOM_ID_RP2VR_PID) },
  	{ USB_DEVICE(ICOM_VID, ICOM_ID_RP4KVT_PID) },
  	{ USB_DEVICE(ICOM_VID, ICOM_ID_RP4KVR_PID) },
  	{ USB_DEVICE(ICOM_VID, ICOM_ID_RP2KVT_PID) },
  	{ USB_DEVICE(ICOM_VID, ICOM_ID_RP2KVR_PID) },
20a0f47e1   Ian Abbott   [PATCH] USB: ftdi...
709
  	{ USB_DEVICE(FTDI_VID, FTDI_ACG_HFDUAL_PID) },
eb79b4fda   Ian Abbott   [PATCH] USB: ftdi...
710
  	{ USB_DEVICE(FTDI_VID, FTDI_YEI_SERVOCENTER31_PID) },
48437486c   D. Peter Siddons   [PATCH] USB: new ...
711
  	{ USB_DEVICE(FTDI_VID, FTDI_THORLABS_PID) },
e1979fef3   Colin Leroy   [PATCH] USB: Add ...
712
  	{ USB_DEVICE(TESTO_VID, TESTO_USB_INTERFACE_PID) },
eaede2cb7   Ralf Schlatterbeck   USB: New device I...
713
  	{ USB_DEVICE(FTDI_VID, FTDI_GAMMA_SCOUT_PID) },
9978f9e12   Ian Abbott   USB serial ftdi_s...
714
715
716
  	{ USB_DEVICE(FTDI_VID, FTDI_TACTRIX_OPENPORT_13M_PID) },
  	{ USB_DEVICE(FTDI_VID, FTDI_TACTRIX_OPENPORT_13S_PID) },
  	{ USB_DEVICE(FTDI_VID, FTDI_TACTRIX_OPENPORT_13U_PID) },
40c36092f   Kjell Myksvoll   USB: ftdi_sio: ad...
717
  	{ USB_DEVICE(ELEKTOR_VID, ELEKTOR_FT323R_PID) },
b760dac29   Martin Geleynse   USB: ftdi: suppor...
718
719
720
721
722
723
724
725
726
727
  	{ USB_DEVICE(FTDI_VID, FTDI_NDI_HUC_PID),
  		.driver_info = (kernel_ulong_t)&ftdi_NDI_device_quirk },
  	{ USB_DEVICE(FTDI_VID, FTDI_NDI_SPECTRA_SCU_PID),
  		.driver_info = (kernel_ulong_t)&ftdi_NDI_device_quirk },
  	{ USB_DEVICE(FTDI_VID, FTDI_NDI_FUTURE_2_PID),
  		.driver_info = (kernel_ulong_t)&ftdi_NDI_device_quirk },
  	{ USB_DEVICE(FTDI_VID, FTDI_NDI_FUTURE_3_PID),
  		.driver_info = (kernel_ulong_t)&ftdi_NDI_device_quirk },
  	{ USB_DEVICE(FTDI_VID, FTDI_NDI_AURORA_SCU_PID),
  		.driver_info = (kernel_ulong_t)&ftdi_NDI_device_quirk },
822c7ef48   Micke Prag   USB: ftdi_sio: Ad...
728
  	{ USB_DEVICE(TELLDUS_VID, TELLDUS_TELLSTICK_PID) },
fed1f1ed9   Rick Farina (Zero_Chaos)   USB: serial: ftdi...
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
  	{ USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_S03_PID) },
  	{ USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_59_PID) },
  	{ USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_57A_PID) },
  	{ USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_57B_PID) },
  	{ USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_29A_PID) },
  	{ USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_29B_PID) },
  	{ USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_29F_PID) },
  	{ USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_62B_PID) },
  	{ USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_S01_PID) },
  	{ USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_63_PID) },
  	{ USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_29C_PID) },
  	{ USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_81B_PID) },
  	{ USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_82B_PID) },
  	{ USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_K5D_PID) },
  	{ USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_K4Y_PID) },
  	{ USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_K5G_PID) },
  	{ USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_S05_PID) },
  	{ USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_60_PID) },
  	{ USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_61_PID) },
  	{ USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_62_PID) },
  	{ USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_63B_PID) },
  	{ USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_64_PID) },
  	{ USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_65_PID) },
  	{ USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_92_PID) },
  	{ USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_92D_PID) },
  	{ USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_W5R_PID) },
  	{ USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_A5R_PID) },
  	{ USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_PW1_PID) },
762e92fa1   Neil \"Superna\" ARMSTRONG   USB: New device P...
757
  	{ USB_DEVICE(FTDI_VID, FTDI_MAXSTREAM_PID) },
a5f623994   Lex Ross   USB: ftdi_sio: ad...
758
  	{ USB_DEVICE(FTDI_VID, FTDI_PHI_FISCO_PID) },
d7fde2d67   Pierre Castella   USB: ftdi_sio: ad...
759
  	{ USB_DEVICE(TML_VID, TML_USB_SERIAL_PID) },
4bb0ef193   Ed Beroset   USB: ftdi driver ...
760
  	{ USB_DEVICE(FTDI_VID, FTDI_ELSTER_UNICOM_PID) },
11171d1bd   Mirko Bordignon   USB: new ftdi_sio...
761
  	{ USB_DEVICE(FTDI_VID, FTDI_PROPOX_JTAGCABLEII_PID) },
307369b0c   Marcin Kościelnicki   usb: ftdi_sio: ad...
762
  	{ USB_DEVICE(FTDI_VID, FTDI_PROPOX_ISPCABLEIII_PID) },
fa91d43b9   Tony Lindgren   USB: Add support ...
763
  	{ USB_DEVICE(OLIMEX_VID, OLIMEX_ARM_USB_OCD_PID),
20734345b   Harald Welte   USB: ftdi_sio: Su...
764
  		.driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
b88ccf6f9   JF Argentino   USB: serial: ftdi...
765
766
  	{ USB_DEVICE(OLIMEX_VID, OLIMEX_ARM_USB_OCD_H_PID),
  		.driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
20734345b   Harald Welte   USB: ftdi_sio: Su...
767
768
769
770
  	{ USB_DEVICE(FIC_VID, FIC_NEO1973_DEBUG_PID),
  		.driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
  	{ USB_DEVICE(FTDI_VID, FTDI_OOCDLINK_PID),
  		.driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
a00c3cadc   Frederik Kriewitz   USB: ftdi_sio: ad...
771
772
773
774
  	{ USB_DEVICE(FTDI_VID, LMI_LM3S_DEVEL_BOARD_PID),
  		.driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
  	{ USB_DEVICE(FTDI_VID, LMI_LM3S_EVAL_BOARD_PID),
  		.driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
3687f6413   Peter Stuge   USB: ftdi_sio: Su...
775
776
  	{ USB_DEVICE(FTDI_VID, LMI_LM3S_ICDI_BOARD_PID),
  		.driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
145114125   Krzysztof Halasa   USB serial: Add I...
777
778
  	{ USB_DEVICE(FTDI_VID, FTDI_TURTELIZER_PID),
  		.driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
26ab70539   Atsushi Nemoto   usb-serial: Use f...
779
  	{ USB_DEVICE(RATOC_VENDOR_ID, RATOC_PRODUCT_ID_USB60F) },
2542335cc   Jon K Hellan   USB: New device I...
780
  	{ USB_DEVICE(FTDI_VID, FTDI_REU_TINY_PID) },
59c6ccd9f   Daniel Suchy   USB: ftdi_sio: ne...
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
  
  	/* Papouch devices based on FTDI chip */
  	{ USB_DEVICE(PAPOUCH_VID, PAPOUCH_SB485_PID) },
  	{ USB_DEVICE(PAPOUCH_VID, PAPOUCH_AP485_PID) },
  	{ USB_DEVICE(PAPOUCH_VID, PAPOUCH_SB422_PID) },
  	{ USB_DEVICE(PAPOUCH_VID, PAPOUCH_SB485_2_PID) },
  	{ USB_DEVICE(PAPOUCH_VID, PAPOUCH_AP485_2_PID) },
  	{ USB_DEVICE(PAPOUCH_VID, PAPOUCH_SB422_2_PID) },
  	{ USB_DEVICE(PAPOUCH_VID, PAPOUCH_SB485S_PID) },
  	{ USB_DEVICE(PAPOUCH_VID, PAPOUCH_SB485C_PID) },
  	{ USB_DEVICE(PAPOUCH_VID, PAPOUCH_LEC_PID) },
  	{ USB_DEVICE(PAPOUCH_VID, PAPOUCH_SB232_PID) },
  	{ USB_DEVICE(PAPOUCH_VID, PAPOUCH_TMU_PID) },
  	{ USB_DEVICE(PAPOUCH_VID, PAPOUCH_IRAMP_PID) },
  	{ USB_DEVICE(PAPOUCH_VID, PAPOUCH_DRAK5_PID) },
  	{ USB_DEVICE(PAPOUCH_VID, PAPOUCH_QUIDO8x8_PID) },
a18f80b4e   Jaroslav Kysela   USB: ftdi_sio: Ad...
797
  	{ USB_DEVICE(PAPOUCH_VID, PAPOUCH_QUIDO4x4_PID) },
59c6ccd9f   Daniel Suchy   USB: ftdi_sio: ne...
798
799
800
801
802
803
804
805
806
807
  	{ USB_DEVICE(PAPOUCH_VID, PAPOUCH_QUIDO2x2_PID) },
  	{ USB_DEVICE(PAPOUCH_VID, PAPOUCH_QUIDO10x1_PID) },
  	{ USB_DEVICE(PAPOUCH_VID, PAPOUCH_QUIDO30x3_PID) },
  	{ USB_DEVICE(PAPOUCH_VID, PAPOUCH_QUIDO60x3_PID) },
  	{ USB_DEVICE(PAPOUCH_VID, PAPOUCH_QUIDO2x16_PID) },
  	{ USB_DEVICE(PAPOUCH_VID, PAPOUCH_QUIDO3x32_PID) },
  	{ USB_DEVICE(PAPOUCH_VID, PAPOUCH_DRAK6_PID) },
  	{ USB_DEVICE(PAPOUCH_VID, PAPOUCH_UPSUSB_PID) },
  	{ USB_DEVICE(PAPOUCH_VID, PAPOUCH_MU_PID) },
  	{ USB_DEVICE(PAPOUCH_VID, PAPOUCH_SIMUKEY_PID) },
a7787e508   Radek Liboska   USB: ftdi_sio: ne...
808
  	{ USB_DEVICE(PAPOUCH_VID, PAPOUCH_AD4USB_PID) },
59c6ccd9f   Daniel Suchy   USB: ftdi_sio: ne...
809
810
  	{ USB_DEVICE(PAPOUCH_VID, PAPOUCH_GMUX_PID) },
  	{ USB_DEVICE(PAPOUCH_VID, PAPOUCH_GMSR_PID) },
96285cb88   Gaetan Carlier   usb: ftdi_sio: ad...
811
812
  	{ USB_DEVICE(FTDI_VID, FTDI_DOMINTELL_DGQG_PID) },
  	{ USB_DEVICE(FTDI_VID, FTDI_DOMINTELL_DUSB_PID) },
45eeff848   Robie Basak   USB: ftdi_sio: ad...
813
  	{ USB_DEVICE(ALTI2_VID, ALTI2_N3_PID) },
ca80801bf   Mhayk Whandson   USB: ftdi_sio dri...
814
  	{ USB_DEVICE(FTDI_VID, DIEBOLD_BCS_SE923_PID) },
7f82b6dd7   Axel Wachtler   USB: serial: add ...
815
816
817
  	{ USB_DEVICE(ATMEL_VID, STK541_PID) },
  	{ USB_DEVICE(DE_VID, STB_PID) },
  	{ USB_DEVICE(DE_VID, WHT_PID) },
b0d659002   Michael Hennerich   USB: serial: ftdi...
818
819
  	{ USB_DEVICE(ADI_VID, ADI_GNICE_PID),
  		.driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
11eaf1703   Michael Hennerich   USB: serial: ftdi...
820
821
  	{ USB_DEVICE(ADI_VID, ADI_GNICEPLUS_PID),
  		.driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
f08dea734   Bjørn Mork   USB: ftdi_sio: do...
822
823
824
  	{ USB_DEVICE_AND_INTERFACE_INFO(MICROCHIP_VID, MICROCHIP_USB_BOARD_PID,
  					USB_CLASS_VENDOR_SPEC,
  					USB_SUBCLASS_VENDOR_SPEC, 0x00) },
ae27d8435   Peter Korsgaard   USB: ftdi_sio: ad...
825
  	{ USB_DEVICE(JETI_VID, JETI_SPC1201_PID) },
1002bb77c   Nicolas Pitre   USB: ftdi_sio: ad...
826
827
  	{ USB_DEVICE(MARVELL_VID, MARVELL_SHEEVAPLUG_PID),
  		.driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
d46130ab3   Daniel Suchy   USB: FTDI-SIO new...
828
  	{ USB_DEVICE(LARSENBRUSGAARD_VID, LB_ALTITRACK_PID) },
fca4404c5   Ville Sundberg   USB: ftdi_sio: Ad...
829
  	{ USB_DEVICE(GN_OTOMETRICS_VID, AURICAL_USB_PID) },
dafc4f7be   Éric Piel   USB: ftdi-sio: ad...
830
831
832
833
834
835
836
  	{ USB_DEVICE(FTDI_VID, PI_C865_PID) },
  	{ USB_DEVICE(FTDI_VID, PI_C857_PID) },
  	{ USB_DEVICE(PI_VID, PI_C866_PID) },
  	{ USB_DEVICE(PI_VID, PI_C663_PID) },
  	{ USB_DEVICE(PI_VID, PI_C725_PID) },
  	{ USB_DEVICE(PI_VID, PI_E517_PID) },
  	{ USB_DEVICE(PI_VID, PI_C863_PID) },
b69cc6720   Éric Piel   USB: ftdi-sio: ad...
837
  	{ USB_DEVICE(PI_VID, PI_E861_PID) },
dafc4f7be   Éric Piel   USB: ftdi-sio: ad...
838
839
840
841
842
843
844
845
846
847
  	{ USB_DEVICE(PI_VID, PI_C867_PID) },
  	{ USB_DEVICE(PI_VID, PI_E609_PID) },
  	{ USB_DEVICE(PI_VID, PI_E709_PID) },
  	{ USB_DEVICE(PI_VID, PI_100F_PID) },
  	{ USB_DEVICE(PI_VID, PI_1011_PID) },
  	{ USB_DEVICE(PI_VID, PI_1012_PID) },
  	{ USB_DEVICE(PI_VID, PI_1013_PID) },
  	{ USB_DEVICE(PI_VID, PI_1014_PID) },
  	{ USB_DEVICE(PI_VID, PI_1015_PID) },
  	{ USB_DEVICE(PI_VID, PI_1016_PID) },
7724a1edb   Ozan Çağlayan   USB: ftdi_sio: Ad...
848
  	{ USB_DEVICE(KONDO_VID, KONDO_USB_SERIAL_PID) },
c47aacc67   Marko Hänninen   USB: ftdi_sio: ad...
849
  	{ USB_DEVICE(BAYER_VID, BAYER_CONTOUR_CABLE_PID) },
50d0678e2   Dhaval Vasa   USB: ftdi_sio: ad...
850
851
  	{ USB_DEVICE(FTDI_VID, MARVELL_OPENRD_PID),
  		.driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
55f13aeae   Peter Korsgaard   USB: ftdi_sio: ad...
852
853
  	{ USB_DEVICE(FTDI_VID, TI_XDS100V2_PID),
  		.driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
e7d7fcc09   Pawel Ludwikow   USB: serial: ftdi...
854
  	{ USB_DEVICE(FTDI_VID, HAMEG_HO820_PID) },
c53c2fab4   Paul Friedrich   USB: ftdi_sio: ad...
855
856
  	{ USB_DEVICE(FTDI_VID, HAMEG_HO720_PID) },
  	{ USB_DEVICE(FTDI_VID, HAMEG_HO730_PID) },
e7d7fcc09   Pawel Ludwikow   USB: serial: ftdi...
857
  	{ USB_DEVICE(FTDI_VID, HAMEG_HO870_PID) },
9714080d2   Mitchell Solomon   USB: add new ftdi...
858
859
860
861
  	{ USB_DEVICE(FTDI_VID, MJSG_GENERIC_PID) },
  	{ USB_DEVICE(FTDI_VID, MJSG_SR_RADIO_PID) },
  	{ USB_DEVICE(FTDI_VID, MJSG_HD_RADIO_PID) },
  	{ USB_DEVICE(FTDI_VID, MJSG_XM_RADIO_PID) },
77dbd74e1   Colin Leitner   USB: ftdi_sio: su...
862
863
864
865
866
867
868
869
  	{ USB_DEVICE(FTDI_VID, XVERVE_SIGNALYZER_ST_PID),
  		.driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
  	{ USB_DEVICE(FTDI_VID, XVERVE_SIGNALYZER_SLITE_PID),
  		.driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
  	{ USB_DEVICE(FTDI_VID, XVERVE_SIGNALYZER_SH2_PID),
  		.driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
  	{ USB_DEVICE(FTDI_VID, XVERVE_SIGNALYZER_SH4_PID),
  		.driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
afad19648   John G. Rogers   USB: serial: enab...
870
  	{ USB_DEVICE(FTDI_VID, SEGWAY_RMP200_PID) },
3126d8236   Rich Mattes   USB: ftdi_sio: Ad...
871
  	{ USB_DEVICE(FTDI_VID, ACCESIO_COM4SM_PID) },
666cc076d   Martin Michlmayr   USB: ftdi_sio: Ad...
872
873
  	{ USB_DEVICE(IONICS_VID, IONICS_PLUGCOMPUTER_PID),
  		.driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
657373883   Luke Lowrey   USB: ftdi_sio: Ad...
874
875
876
877
878
879
880
881
  	{ USB_DEVICE(FTDI_VID, FTDI_CHAMSYS_24_MASTER_WING_PID) },
  	{ USB_DEVICE(FTDI_VID, FTDI_CHAMSYS_PC_WING_PID) },
  	{ USB_DEVICE(FTDI_VID, FTDI_CHAMSYS_USB_DMX_PID) },
  	{ USB_DEVICE(FTDI_VID, FTDI_CHAMSYS_MIDI_TIMECODE_PID) },
  	{ USB_DEVICE(FTDI_VID, FTDI_CHAMSYS_MINI_WING_PID) },
  	{ USB_DEVICE(FTDI_VID, FTDI_CHAMSYS_MAXI_WING_PID) },
  	{ USB_DEVICE(FTDI_VID, FTDI_CHAMSYS_MEDIA_WING_PID) },
  	{ USB_DEVICE(FTDI_VID, FTDI_CHAMSYS_WING_PID) },
0f266abd7   Greg Kroah-Hartman   USB: ftdi_sio: ad...
882
883
884
  	{ USB_DEVICE(FTDI_VID, FTDI_SCIENCESCOPE_LOGBOOKML_PID) },
  	{ USB_DEVICE(FTDI_VID, FTDI_SCIENCESCOPE_LS_LOGBOOK_PID) },
  	{ USB_DEVICE(FTDI_VID, FTDI_SCIENCESCOPE_HS_LOGBOOK_PID) },
90451e697   Milan Kocian   USB: usbserial: a...
885
  	{ USB_DEVICE(FTDI_VID, FTDI_CINTERION_MC55I_PID) },
5363cdc3c   Florian Faber   USB: ftdi_sio: Ad...
886
  	{ USB_DEVICE(FTDI_VID, FTDI_DOTEC_PID) },
7fea0f714   Sebastien Bourdeauducq   USB: ftdi_sio: ad...
887
888
  	{ USB_DEVICE(QIHARDWARE_VID, MILKYMISTONE_JTAGSERIAL_PID),
  		.driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
9f06d15f8   Adrian Thomasset   USB: ftdi_sio: co...
889
890
891
  	{ USB_DEVICE(ST_VID, ST_STMCLT_2232_PID),
  		.driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
  	{ USB_DEVICE(ST_VID, ST_STMCLT_4232_PID),
6ec2f46c4   Jean-Christophe PLAGNIOL-VILLARD   USB: ftdi_sio: ad...
892
  		.driver_info = (kernel_ulong_t)&ftdi_stmclite_quirk },
fc216ec36   Peter Naulls   USB: serial: ftdi...
893
  	{ USB_DEVICE(FTDI_VID, FTDI_RF_R106) },
47594d552   Michał Wróbel   USB: ftdi_sio: ne...
894
895
  	{ USB_DEVICE(FTDI_VID, FTDI_DISTORTEC_JTAG_LOCK_PICK_PID),
  		.driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
57e596f3a   Michał Wróbel   USB: ftdi_sio: ne...
896
  	{ USB_DEVICE(FTDI_VID, FTDI_LUMEL_PD12_PID) },
8cf65dc38   Tomasz Mloduchowski   usb: ftdi_sio: Cr...
897
898
  	/* Crucible Devices */
  	{ USB_DEVICE(FTDI_VID, FTDI_CT_COMET_PID) },
e1466ad5b   Алексей Крамаренко   USB: serial: ftdi...
899
  	{ USB_DEVICE(FTDI_VID, FTDI_Z3X_PID) },
6dbd46c84   Joerg Dorchain   USB: ftdi_sio: ad...
900
901
  	/* Cressi Devices */
  	{ USB_DEVICE(FTDI_VID, FTDI_CRESSI_PID) },
efe26e16b   Michele Baldessari   USB: serial: ftdi...
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
  	/* Brainboxes Devices */
  	{ USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_VX_001_PID) },
  	{ USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_VX_012_PID) },
  	{ USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_VX_023_PID) },
  	{ USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_VX_034_PID) },
  	{ USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_101_PID) },
  	{ USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_160_1_PID) },
  	{ USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_160_2_PID) },
  	{ USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_160_3_PID) },
  	{ USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_160_4_PID) },
  	{ USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_160_5_PID) },
  	{ USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_160_6_PID) },
  	{ USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_160_7_PID) },
  	{ USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_160_8_PID) },
  	{ USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_257_PID) },
  	{ USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_279_1_PID) },
  	{ USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_279_2_PID) },
  	{ USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_279_3_PID) },
  	{ USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_279_4_PID) },
  	{ USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_313_PID) },
  	{ USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_324_PID) },
  	{ USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_346_1_PID) },
  	{ USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_346_2_PID) },
  	{ USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_357_PID) },
  	{ USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_606_1_PID) },
  	{ USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_606_2_PID) },
  	{ USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_606_3_PID) },
  	{ USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_701_1_PID) },
  	{ USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_701_2_PID) },
  	{ USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_842_1_PID) },
  	{ USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_842_2_PID) },
  	{ USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_842_3_PID) },
  	{ USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_842_4_PID) },
fdcb0a0f1   Ian Abbott   [PATCH] USB ftdi_...
935
  	{ }					/* Terminating entry */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
936
  };
464cbb246   Alan Cox   ftdi_sio: Coding ...
937
  MODULE_DEVICE_TABLE(usb, id_table_combined);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
938

4c4c9432a   Arjan van de Ven   [PATCH] USB: mark...
939
  static const char *ftdi_chip_name[] = {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
940
941
942
943
  	[SIO] = "SIO",	/* the serial part of FT8U100AX */
  	[FT8U232AM] = "FT8U232AM",
  	[FT232BM] = "FT232BM",
  	[FT2232C] = "FT2232C",
d8b216068   Gard Spreemann   USB: Product ID f...
944
  	[FT232RL] = "FT232RL",
094c2e6db   Mark Adamson   USB: serial: FTDI...
945
  	[FT2232H] = "FT2232H",
309427b63   Uwe Bonnes   USB: Add new FT23...
946
  	[FT4232H] = "FT4232H",
dc0827c12   Jim Paris   USB: ftdi_sio: ad...
947
948
  	[FT232H]  = "FT232H",
  	[FTX]     = "FT-X"
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
949
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
950
951
952
953
  /* Used for TIOCMIWAIT */
  #define FTDI_STATUS_B0_MASK	(FTDI_RS0_CTS | FTDI_RS0_DSR | FTDI_RS0_RI | FTDI_RS0_RLSD)
  #define FTDI_STATUS_B1_MASK	(FTDI_RS_BI)
  /* End TIOCMIWAIT */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
954
  /* function prototypes for a FTDI serial converter */
464cbb246   Alan Cox   ftdi_sio: Coding ...
955
956
  static int  ftdi_sio_probe(struct usb_serial *serial,
  					const struct usb_device_id *id);
464cbb246   Alan Cox   ftdi_sio: Coding ...
957
958
  static int  ftdi_sio_port_probe(struct usb_serial_port *port);
  static int  ftdi_sio_port_remove(struct usb_serial_port *port);
a509a7e47   Alan Cox   tty: USB does not...
959
  static int  ftdi_open(struct tty_struct *tty, struct usb_serial_port *port);
335f8514f   Alan Cox   tty: Bring the us...
960
  static void ftdi_dtr_rts(struct usb_serial_port *port, int on);
1b551015a   Johan Hovold   USB: ftdi_sio: sw...
961
  static void ftdi_process_read_urb(struct urb *urb);
d3901a064   Johan Hovold   USB: ftdi_sio: sw...
962
  static int ftdi_prepare_write_buffer(struct usb_serial_port *port,
c23e5fc1f   Johan Hovold   USB: serial: remo...
963
  						void *dest, size_t size);
464cbb246   Alan Cox   ftdi_sio: Coding ...
964
965
  static void ftdi_set_termios(struct tty_struct *tty,
  			struct usb_serial_port *port, struct ktermios *old);
60b33c133   Alan Cox   tiocmget: kill of...
966
  static int  ftdi_tiocmget(struct tty_struct *tty);
20b9d1771   Alan Cox   tiocmset: kill th...
967
  static int  ftdi_tiocmset(struct tty_struct *tty,
464cbb246   Alan Cox   ftdi_sio: Coding ...
968
  			unsigned int set, unsigned int clear);
00a0d0d65   Alan Cox   tty: remove filp ...
969
  static int  ftdi_ioctl(struct tty_struct *tty,
464cbb246   Alan Cox   ftdi_sio: Coding ...
970
971
  			unsigned int cmd, unsigned long arg);
  static void ftdi_break_ctl(struct tty_struct *tty, int break_state);
a37025b5c   Johan Hovold   USB: ftdi_sio: fi...
972
  static bool ftdi_tx_empty(struct usb_serial_port *port);
c4133648b   Johan Hovold   USB: ftdi_sio: cl...
973
  static int ftdi_get_modem_status(struct usb_serial_port *port,
5fb0432e6   Johan Hovold   USB: ftdi_sio: us...
974
  						unsigned char status[2]);
464cbb246   Alan Cox   ftdi_sio: Coding ...
975
976
977
978
979
  
  static unsigned short int ftdi_232am_baud_base_to_divisor(int baud, int base);
  static unsigned short int ftdi_232am_baud_to_divisor(int baud);
  static __u32 ftdi_232bm_baud_base_to_divisor(int baud, int base);
  static __u32 ftdi_232bm_baud_to_divisor(int baud);
094c2e6db   Mark Adamson   USB: serial: FTDI...
980
981
  static __u32 ftdi_2232h_baud_base_to_divisor(int baud, int base);
  static __u32 ftdi_2232h_baud_to_divisor(int baud);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
982

ea65370d0   Greg Kroah-Hartman   [PATCH] USB Seria...
983
  static struct usb_serial_driver ftdi_sio_device = {
18fcac353   Greg Kroah-Hartman   [PATCH] USB Seria...
984
985
  	.driver = {
  		.owner =	THIS_MODULE,
269bda1c1   Greg Kroah-Hartman   [PATCH] USB Seria...
986
  		.name =		"ftdi_sio",
18fcac353   Greg Kroah-Hartman   [PATCH] USB Seria...
987
  	},
269bda1c1   Greg Kroah-Hartman   [PATCH] USB Seria...
988
  	.description =		"FTDI USB Serial Device",
8f977e420   Ian Abbott   [PATCH] USB ftdi_...
989
  	.id_table =		id_table_combined,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
990
  	.num_ports =		1,
bbcb2b907   Johan Hovold   USB: serial: allo...
991
  	.bulk_in_size =		512,
c23e5fc1f   Johan Hovold   USB: serial: remo...
992
  	.bulk_out_size =	256,
8f977e420   Ian Abbott   [PATCH] USB ftdi_...
993
  	.probe =		ftdi_sio_probe,
12bdbe03c   Jim Radford   USB: ftdi_sio: us...
994
995
  	.port_probe =		ftdi_sio_port_probe,
  	.port_remove =		ftdi_sio_port_remove,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
996
  	.open =			ftdi_open,
335f8514f   Alan Cox   tty: Bring the us...
997
  	.dtr_rts =		ftdi_dtr_rts,
1b551015a   Johan Hovold   USB: ftdi_sio: sw...
998
999
  	.throttle =		usb_serial_generic_throttle,
  	.unthrottle =		usb_serial_generic_unthrottle,
1b551015a   Johan Hovold   USB: ftdi_sio: sw...
1000
  	.process_read_urb =	ftdi_process_read_urb,
d3901a064   Johan Hovold   USB: ftdi_sio: sw...
1001
  	.prepare_write_buffer =	ftdi_prepare_write_buffer,
330e3c4cc   Andreas Mohr   USB: ftdi_sio: co...
1002
1003
  	.tiocmget =		ftdi_tiocmget,
  	.tiocmset =		ftdi_tiocmset,
f307e5cd3   Johan Hovold   USB: ftdi_sio: sw...
1004
  	.tiocmiwait =		usb_serial_generic_tiocmiwait,
6f86fec9f   Johan Hovold   USB: ftdi_sio: sw...
1005
  	.get_icount =           usb_serial_generic_get_icount,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1006
1007
1008
  	.ioctl =		ftdi_ioctl,
  	.set_termios =		ftdi_set_termios,
  	.break_ctl =		ftdi_break_ctl,
a37025b5c   Johan Hovold   USB: ftdi_sio: fi...
1009
  	.tx_empty =		ftdi_tx_empty,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1010
  };
97b6b6d23   Alan Stern   usb-serial: use n...
1011
1012
1013
  static struct usb_serial_driver * const serial_drivers[] = {
  	&ftdi_sio_device, NULL
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1014
1015
  
  #define WDR_TIMEOUT 5000 /* default urb timeout */
279e1545a   Ian Abbott   [PATCH] USB: ftdi...
1016
  #define WDR_SHORT_TIMEOUT 1000	/* shorter urb timeout */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1017

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1018
1019
  /*
   * ***************************************************************************
fa91d43b9   Tony Lindgren   USB: Add support ...
1020
   * Utility functions
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1021
1022
1023
1024
1025
1026
   * ***************************************************************************
   */
  
  static unsigned short int ftdi_232am_baud_base_to_divisor(int baud, int base)
  {
  	unsigned short int divisor;
464cbb246   Alan Cox   ftdi_sio: Coding ...
1027
1028
1029
1030
  	/* divisor shifted 3 bits to the left */
  	int divisor3 = base / 2 / baud;
  	if ((divisor3 & 0x7) == 7)
  		divisor3++; /* round x.7/8 up to x+1 */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1031
1032
  	divisor = divisor3 >> 3;
  	divisor3 &= 0x7;
464cbb246   Alan Cox   ftdi_sio: Coding ...
1033
1034
1035
1036
1037
1038
1039
1040
  	if (divisor3 == 1)
  		divisor |= 0xc000;
  	else if (divisor3 >= 4)
  		divisor |= 0x4000;
  	else if (divisor3 != 0)
  		divisor |= 0x8000;
  	else if (divisor == 1)
  		divisor = 0;	/* special case for maximum baud rate */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1041
1042
1043
1044
1045
  	return divisor;
  }
  
  static unsigned short int ftdi_232am_baud_to_divisor(int baud)
  {
464cbb246   Alan Cox   ftdi_sio: Coding ...
1046
  	 return ftdi_232am_baud_base_to_divisor(baud, 48000000);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1047
1048
1049
1050
1051
1052
  }
  
  static __u32 ftdi_232bm_baud_base_to_divisor(int baud, int base)
  {
  	static const unsigned char divfrac[8] = { 0, 3, 2, 4, 1, 5, 6, 7 };
  	__u32 divisor;
464cbb246   Alan Cox   ftdi_sio: Coding ...
1053
1054
  	/* divisor shifted 3 bits to the left */
  	int divisor3 = base / 2 / baud;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1055
1056
1057
  	divisor = divisor3 >> 3;
  	divisor |= (__u32)divfrac[divisor3 & 0x7] << 14;
  	/* Deal with special cases for highest baud rates. */
464cbb246   Alan Cox   ftdi_sio: Coding ...
1058
1059
1060
1061
  	if (divisor == 1)
  		divisor = 0;
  	else if (divisor == 0x4001)
  		divisor = 1;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1062
1063
1064
1065
1066
  	return divisor;
  }
  
  static __u32 ftdi_232bm_baud_to_divisor(int baud)
  {
464cbb246   Alan Cox   ftdi_sio: Coding ...
1067
  	 return ftdi_232bm_baud_base_to_divisor(baud, 48000000);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1068
  }
094c2e6db   Mark Adamson   USB: serial: FTDI...
1069
1070
1071
1072
1073
1074
1075
  static __u32 ftdi_2232h_baud_base_to_divisor(int baud, int base)
  {
  	static const unsigned char divfrac[8] = { 0, 3, 2, 4, 1, 5, 6, 7 };
  	__u32 divisor;
  	int divisor3;
  
  	/* hi-speed baud rate is 10-bit sampling instead of 16-bit */
f6c259a39   Daniel Glöckner   USB: ftdi_sio: fi...
1076
  	divisor3 = base * 8 / (baud * 10);
094c2e6db   Mark Adamson   USB: serial: FTDI...
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
  
  	divisor = divisor3 >> 3;
  	divisor |= (__u32)divfrac[divisor3 & 0x7] << 14;
  	/* Deal with special cases for highest baud rates. */
  	if (divisor == 1)
  		divisor = 0;
  	else if (divisor == 0x4001)
  		divisor = 1;
  	/*
  	 * Set this bit to turn off a divide by 2.5 on baud rate generator
  	 * This enables baud rates up to 12Mbaud but cannot reach below 1200
  	 * baud with this bit set
  	 */
  	divisor |= 0x00020000;
  	return divisor;
  }
  
  static __u32 ftdi_2232h_baud_to_divisor(int baud)
  {
  	 return ftdi_2232h_baud_base_to_divisor(baud, 120000000);
  }
74ede0ff5   Ian Abbott   [PATCH] USB: ftdi...
1098
1099
  #define set_mctrl(port, set)		update_mctrl((port), (set), 0)
  #define clear_mctrl(port, clear)	update_mctrl((port), 0, (clear))
464cbb246   Alan Cox   ftdi_sio: Coding ...
1100
1101
  static int update_mctrl(struct usb_serial_port *port, unsigned int set,
  							unsigned int clear)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1102
1103
  {
  	struct ftdi_private *priv = usb_get_serial_port_data(port);
bfc51614b   Greg Kroah-Hartman   USB: serial: ftdi...
1104
  	struct device *dev = &port->dev;
74ede0ff5   Ian Abbott   [PATCH] USB: ftdi...
1105
  	unsigned urb_value;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1106
  	int rv;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1107

74ede0ff5   Ian Abbott   [PATCH] USB: ftdi...
1108
  	if (((set | clear) & (TIOCM_DTR | TIOCM_RTS)) == 0) {
bfc51614b   Greg Kroah-Hartman   USB: serial: ftdi...
1109
1110
  		dev_dbg(dev, "%s - DTR|RTS not being set|cleared
  ", __func__);
74ede0ff5   Ian Abbott   [PATCH] USB: ftdi...
1111
1112
  		return 0;	/* no change */
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1113

74ede0ff5   Ian Abbott   [PATCH] USB: ftdi...
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
  	clear &= ~set;	/* 'set' takes precedence over 'clear' */
  	urb_value = 0;
  	if (clear & TIOCM_DTR)
  		urb_value |= FTDI_SIO_SET_DTR_LOW;
  	if (clear & TIOCM_RTS)
  		urb_value |= FTDI_SIO_SET_RTS_LOW;
  	if (set & TIOCM_DTR)
  		urb_value |= FTDI_SIO_SET_DTR_HIGH;
  	if (set & TIOCM_RTS)
  		urb_value |= FTDI_SIO_SET_RTS_HIGH;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1124
1125
  	rv = usb_control_msg(port->serial->dev,
  			       usb_sndctrlpipe(port->serial->dev, 0),
5c09d144f   David Brownell   USB: ftdi_sio whi...
1126
  			       FTDI_SIO_SET_MODEM_CTRL_REQUEST,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1127
  			       FTDI_SIO_SET_MODEM_CTRL_REQUEST_TYPE,
74ede0ff5   Ian Abbott   [PATCH] USB: ftdi...
1128
  			       urb_value, priv->interface,
66e47e600   Johan Hovold   USB: ftdi_sio: fi...
1129
  			       NULL, 0, WDR_TIMEOUT);
74ede0ff5   Ian Abbott   [PATCH] USB: ftdi...
1130
  	if (rv < 0) {
bfc51614b   Greg Kroah-Hartman   USB: serial: ftdi...
1131
1132
1133
1134
1135
  		dev_dbg(dev, "%s Error from MODEM_CTRL urb: DTR %s, RTS %s
  ",
  			__func__,
  			(set & TIOCM_DTR) ? "HIGH" : (clear & TIOCM_DTR) ? "LOW" : "unchanged",
  			(set & TIOCM_RTS) ? "HIGH" : (clear & TIOCM_RTS) ? "LOW" : "unchanged");
2c2ee5450   Johan Hovold   USB: ftdi_sio: fi...
1136
  		rv = usb_translate_errors(rv);
74ede0ff5   Ian Abbott   [PATCH] USB: ftdi...
1137
  	} else {
bfc51614b   Greg Kroah-Hartman   USB: serial: ftdi...
1138
1139
1140
1141
  		dev_dbg(dev, "%s - DTR %s, RTS %s
  ", __func__,
  			(set & TIOCM_DTR) ? "HIGH" : (clear & TIOCM_DTR) ? "LOW" : "unchanged",
  			(set & TIOCM_RTS) ? "HIGH" : (clear & TIOCM_RTS) ? "LOW" : "unchanged");
9b0f2582d   Alan Cox   USB: ftdi_sio: No...
1142
  		/* FIXME: locking on last_dtr_rts */
74ede0ff5   Ian Abbott   [PATCH] USB: ftdi...
1143
1144
  		priv->last_dtr_rts = (priv->last_dtr_rts & ~clear) | set;
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1145
1146
  	return rv;
  }
464cbb246   Alan Cox   ftdi_sio: Coding ...
1147
1148
  static __u32 get_ftdi_divisor(struct tty_struct *tty,
  						struct usb_serial_port *port)
e49bbce13   Johan Hovold   USB: ftdi_sio: fi...
1149
  {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1150
  	struct ftdi_private *priv = usb_get_serial_port_data(port);
bfc51614b   Greg Kroah-Hartman   USB: serial: ftdi...
1151
  	struct device *dev = &port->dev;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1152
1153
1154
1155
1156
  	__u32 div_value = 0;
  	int div_okay = 1;
  	int baud;
  
  	/*
464cbb246   Alan Cox   ftdi_sio: Coding ...
1157
1158
  	 * The logic involved in setting the baudrate can be cleanly split into
  	 * 3 steps.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1159
  	 * 1. Standard baud rates are set in tty->termios->c_cflag
464cbb246   Alan Cox   ftdi_sio: Coding ...
1160
1161
  	 * 2. If these are not enough, you can set any speed using alt_speed as
  	 * follows:
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1162
1163
1164
  	 *    - set tty->termios->c_cflag speed to B38400
  	 *    - set your real speed in tty->alt_speed; it gets ignored when
  	 *      alt_speed==0, (or)
464cbb246   Alan Cox   ftdi_sio: Coding ...
1165
1166
1167
1168
1169
  	 *    - call TIOCSSERIAL ioctl with (struct serial_struct) set as
  	 *	follows:
  	 *      flags & ASYNC_SPD_MASK == ASYNC_SPD_[HI, VHI, SHI, WARP],
  	 *	this just sets alt_speed to (HI: 57600, VHI: 115200,
  	 *	SHI: 230400, WARP: 460800)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1170
1171
1172
  	 * ** Steps 1, 2 are done courtesy of tty_get_baud_rate
  	 * 3. You can also set baud rate by setting custom divisor as follows
  	 *    - set tty->termios->c_cflag speed to B38400
464cbb246   Alan Cox   ftdi_sio: Coding ...
1173
1174
  	 *    - call TIOCSSERIAL ioctl with (struct serial_struct) set as
  	 *	follows:
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1175
1176
  	 *      o flags & ASYNC_SPD_MASK == ASYNC_SPD_CUST
  	 *      o custom_divisor set to baud_base / your_new_baudrate
464cbb246   Alan Cox   ftdi_sio: Coding ...
1177
1178
1179
1180
  	 * ** Step 3 is done courtesy of code borrowed from serial.c
  	 *    I should really spend some time and separate + move this common
  	 *    code to serial.c, it is replicated in nearly every serial driver
  	 *    you see.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1181
  	 */
464cbb246   Alan Cox   ftdi_sio: Coding ...
1182
1183
  	/* 1. Get the baud rate from the tty settings, this observes
  	      alt_speed hack */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1184

95da310e6   Alan Cox   usb_serial: API a...
1185
  	baud = tty_get_baud_rate(tty);
bfc51614b   Greg Kroah-Hartman   USB: serial: ftdi...
1186
1187
  	dev_dbg(dev, "%s - tty_get_baud_rate reports speed %d
  ", __func__, baud);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1188

464cbb246   Alan Cox   ftdi_sio: Coding ...
1189
1190
  	/* 2. Observe async-compatible custom_divisor hack, update baudrate
  	   if needed */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1191
1192
1193
1194
1195
  
  	if (baud == 38400 &&
  	    ((priv->flags & ASYNC_SPD_MASK) == ASYNC_SPD_CUST) &&
  	     (priv->custom_divisor)) {
  		baud = priv->baud_base / priv->custom_divisor;
bfc51614b   Greg Kroah-Hartman   USB: serial: ftdi...
1196
1197
1198
  		dev_dbg(dev, "%s - custom divisor %d sets baud rate to %d
  ",
  			__func__, priv->custom_divisor, baud);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1199
1200
1201
  	}
  
  	/* 3. Convert baudrate to device-specific divisor */
464cbb246   Alan Cox   ftdi_sio: Coding ...
1202
1203
1204
  	if (!baud)
  		baud = 9600;
  	switch (priv->chip_type) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1205
  	case SIO: /* SIO chip */
464cbb246   Alan Cox   ftdi_sio: Coding ...
1206
  		switch (baud) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
  		case 300: div_value = ftdi_sio_b300; break;
  		case 600: div_value = ftdi_sio_b600; break;
  		case 1200: div_value = ftdi_sio_b1200; break;
  		case 2400: div_value = ftdi_sio_b2400; break;
  		case 4800: div_value = ftdi_sio_b4800; break;
  		case 9600: div_value = ftdi_sio_b9600; break;
  		case 19200: div_value = ftdi_sio_b19200; break;
  		case 38400: div_value = ftdi_sio_b38400; break;
  		case 57600: div_value = ftdi_sio_b57600;  break;
  		case 115200: div_value = ftdi_sio_b115200; break;
  		} /* baud */
  		if (div_value == 0) {
bfc51614b   Greg Kroah-Hartman   USB: serial: ftdi...
1219
1220
1221
  			dev_dbg(dev, "%s - Baudrate (%d) requested is not supported
  ",
  				__func__,  baud);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1222
  			div_value = ftdi_sio_b9600;
bd5e47ccb   Andrew Morton   USB: ftd_sio clea...
1223
  			baud = 9600;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1224
1225
1226
1227
1228
1229
1230
  			div_okay = 0;
  		}
  		break;
  	case FT8U232AM: /* 8U232AM chip */
  		if (baud <= 3000000) {
  			div_value = ftdi_232am_baud_to_divisor(baud);
  		} else {
bfc51614b   Greg Kroah-Hartman   USB: serial: ftdi...
1231
1232
  			dev_dbg(dev, "%s - Baud rate too high!
  ", __func__);
bd5e47ccb   Andrew Morton   USB: ftd_sio clea...
1233
  			baud = 9600;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1234
1235
1236
1237
1238
1239
  			div_value = ftdi_232am_baud_to_divisor(9600);
  			div_okay = 0;
  		}
  		break;
  	case FT232BM: /* FT232BM chip */
  	case FT2232C: /* FT2232C chip */
dc0827c12   Jim Paris   USB: ftdi_sio: ad...
1240
1241
  	case FT232RL: /* FT232RL chip */
  	case FTX:     /* FT-X series */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1242
  		if (baud <= 3000000) {
b760dac29   Martin Geleynse   USB: ftdi: suppor...
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
  			__u16 product_id = le16_to_cpu(
  				port->serial->dev->descriptor.idProduct);
  			if (((FTDI_NDI_HUC_PID == product_id) ||
  			     (FTDI_NDI_SPECTRA_SCU_PID == product_id) ||
  			     (FTDI_NDI_FUTURE_2_PID == product_id) ||
  			     (FTDI_NDI_FUTURE_3_PID == product_id) ||
  			     (FTDI_NDI_AURORA_SCU_PID == product_id)) &&
  			    (baud == 19200)) {
  				baud = 1200000;
  			}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1253
1254
  			div_value = ftdi_232bm_baud_to_divisor(baud);
  		} else {
bfc51614b   Greg Kroah-Hartman   USB: serial: ftdi...
1255
1256
  			dev_dbg(dev, "%s - Baud rate too high!
  ", __func__);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1257
1258
  			div_value = ftdi_232bm_baud_to_divisor(9600);
  			div_okay = 0;
669a6db10   Alan Cox   USB: ftd_sio: cle...
1259
  			baud = 9600;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1260
1261
  		}
  		break;
094c2e6db   Mark Adamson   USB: serial: FTDI...
1262
1263
  	case FT2232H: /* FT2232H chip */
  	case FT4232H: /* FT4232H chip */
309427b63   Uwe Bonnes   USB: Add new FT23...
1264
  	case FT232H:  /* FT232H chip */
1862cdd54   Ionut Nicu   USB: ftdi_sio: fi...
1265
  		if ((baud <= 12000000) && (baud >= 1200)) {
094c2e6db   Mark Adamson   USB: serial: FTDI...
1266
1267
1268
1269
  			div_value = ftdi_2232h_baud_to_divisor(baud);
  		} else if (baud < 1200) {
  			div_value = ftdi_232bm_baud_to_divisor(baud);
  		} else {
bfc51614b   Greg Kroah-Hartman   USB: serial: ftdi...
1270
1271
  			dev_dbg(dev, "%s - Baud rate too high!
  ", __func__);
094c2e6db   Mark Adamson   USB: serial: FTDI...
1272
1273
1274
1275
1276
  			div_value = ftdi_232bm_baud_to_divisor(9600);
  			div_okay = 0;
  			baud = 9600;
  		}
  		break;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1277
1278
1279
  	} /* priv->chip_type */
  
  	if (div_okay) {
bfc51614b   Greg Kroah-Hartman   USB: serial: ftdi...
1280
1281
  		dev_dbg(dev, "%s - Baud rate set to %d (divisor 0x%lX) on chip %s
  ",
441b62c1e   Harvey Harrison   USB: replace rema...
1282
  			__func__, baud, (unsigned long)div_value,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1283
1284
  			ftdi_chip_name[priv->chip_type]);
  	}
95da310e6   Alan Cox   usb_serial: API a...
1285
  	tty_encode_baud_rate(tty, baud, baud);
464cbb246   Alan Cox   ftdi_sio: Coding ...
1286
  	return div_value;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1287
  }
95da310e6   Alan Cox   usb_serial: API a...
1288
1289
1290
  static int change_speed(struct tty_struct *tty, struct usb_serial_port *port)
  {
  	struct ftdi_private *priv = usb_get_serial_port_data(port);
464cbb246   Alan Cox   ftdi_sio: Coding ...
1291
  	__u16 urb_value;
95da310e6   Alan Cox   usb_serial: API a...
1292
1293
1294
  	__u16 urb_index;
  	__u32 urb_index_value;
  	int rv;
95da310e6   Alan Cox   usb_serial: API a...
1295
1296
1297
  	urb_index_value = get_ftdi_divisor(tty, port);
  	urb_value = (__u16)urb_index_value;
  	urb_index = (__u16)(urb_index_value >> 16);
0ee404ccf   Uwe Bonnes   usb: serial: ftdi...
1298
1299
1300
1301
  	if ((priv->chip_type == FT2232C) || (priv->chip_type == FT2232H) ||
  		(priv->chip_type == FT4232H) || (priv->chip_type == FT232H)) {
  		/* Probably the BM type needs the MSB of the encoded fractional
  		 * divider also moved like for the chips above. Any infos? */
95da310e6   Alan Cox   usb_serial: API a...
1302
1303
1304
1305
1306
1307
1308
1309
  		urb_index = (__u16)((urb_index << 8) | priv->interface);
  	}
  
  	rv = usb_control_msg(port->serial->dev,
  			    usb_sndctrlpipe(port->serial->dev, 0),
  			    FTDI_SIO_SET_BAUDRATE_REQUEST,
  			    FTDI_SIO_SET_BAUDRATE_REQUEST_TYPE,
  			    urb_value, urb_index,
66e47e600   Johan Hovold   USB: ftdi_sio: fi...
1310
  			    NULL, 0, WDR_SHORT_TIMEOUT);
95da310e6   Alan Cox   usb_serial: API a...
1311
1312
  	return rv;
  }
557aaa7ff   Alan Cox   ft232: support th...
1313
1314
1315
1316
  static int write_latency_timer(struct usb_serial_port *port)
  {
  	struct ftdi_private *priv = usb_get_serial_port_data(port);
  	struct usb_device *udev = port->serial->dev;
c1284d772   Johan Hovold   USB: ftdi_sio: re...
1317
  	int rv;
557aaa7ff   Alan Cox   ft232: support th...
1318
1319
1320
1321
  	int l = priv->latency;
  
  	if (priv->flags & ASYNC_LOW_LATENCY)
  		l = 1;
bfc51614b   Greg Kroah-Hartman   USB: serial: ftdi...
1322
1323
  	dev_dbg(&port->dev, "%s: setting latency timer = %i
  ", __func__, l);
557aaa7ff   Alan Cox   ft232: support th...
1324
1325
1326
1327
1328
1329
  
  	rv = usb_control_msg(udev,
  			     usb_sndctrlpipe(udev, 0),
  			     FTDI_SIO_SET_LATENCY_TIMER_REQUEST,
  			     FTDI_SIO_SET_LATENCY_TIMER_REQUEST_TYPE,
  			     l, priv->interface,
66e47e600   Johan Hovold   USB: ftdi_sio: fi...
1330
  			     NULL, 0, WDR_TIMEOUT);
557aaa7ff   Alan Cox   ft232: support th...
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
  	if (rv < 0)
  		dev_err(&port->dev, "Unable to write latency timer: %i
  ", rv);
  	return rv;
  }
  
  static int read_latency_timer(struct usb_serial_port *port)
  {
  	struct ftdi_private *priv = usb_get_serial_port_data(port);
  	struct usb_device *udev = port->serial->dev;
54f328d0c   Johan Hovold   USB: ftdi_sio: fi...
1341
  	unsigned char *buf;
c1284d772   Johan Hovold   USB: ftdi_sio: re...
1342
  	int rv;
557aaa7ff   Alan Cox   ft232: support th...
1343

54f328d0c   Johan Hovold   USB: ftdi_sio: fi...
1344
1345
1346
  	buf = kmalloc(1, GFP_KERNEL);
  	if (!buf)
  		return -ENOMEM;
557aaa7ff   Alan Cox   ft232: support th...
1347
1348
1349
1350
1351
  	rv = usb_control_msg(udev,
  			     usb_rcvctrlpipe(udev, 0),
  			     FTDI_SIO_GET_LATENCY_TIMER_REQUEST,
  			     FTDI_SIO_GET_LATENCY_TIMER_REQUEST_TYPE,
  			     0, priv->interface,
54f328d0c   Johan Hovold   USB: ftdi_sio: fi...
1352
  			     buf, 1, WDR_TIMEOUT);
4357369d0   Johan Hovold   USB: ftdi_sio: us...
1353
  	if (rv < 0)
557aaa7ff   Alan Cox   ft232: support th...
1354
1355
  		dev_err(&port->dev, "Unable to read latency timer: %i
  ", rv);
4357369d0   Johan Hovold   USB: ftdi_sio: us...
1356
  	else
54f328d0c   Johan Hovold   USB: ftdi_sio: fi...
1357
1358
1359
  		priv->latency = buf[0];
  
  	kfree(buf);
8c4f99cd5   Johan Hovold   USB: ftdi_sio: fi...
1360
  	return rv;
557aaa7ff   Alan Cox   ft232: support th...
1361
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1362

464cbb246   Alan Cox   ftdi_sio: Coding ...
1363
1364
  static int get_serial_info(struct usb_serial_port *port,
  				struct serial_struct __user *retinfo)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
  {
  	struct ftdi_private *priv = usb_get_serial_port_data(port);
  	struct serial_struct tmp;
  
  	if (!retinfo)
  		return -EFAULT;
  	memset(&tmp, 0, sizeof(tmp));
  	tmp.flags = priv->flags;
  	tmp.baud_base = priv->baud_base;
  	tmp.custom_divisor = priv->custom_divisor;
  	if (copy_to_user(retinfo, &tmp, sizeof(*retinfo)))
  		return -EFAULT;
  	return 0;
e49bbce13   Johan Hovold   USB: ftdi_sio: fi...
1378
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1379

95da310e6   Alan Cox   usb_serial: API a...
1380
  static int set_serial_info(struct tty_struct *tty,
464cbb246   Alan Cox   ftdi_sio: Coding ...
1381
  	struct usb_serial_port *port, struct serial_struct __user *newinfo)
e49bbce13   Johan Hovold   USB: ftdi_sio: fi...
1382
  {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1383
1384
1385
1386
1387
1388
  	struct ftdi_private *priv = usb_get_serial_port_data(port);
  	struct serial_struct new_serial;
  	struct ftdi_private old_priv;
  
  	if (copy_from_user(&new_serial, newinfo, sizeof(new_serial)))
  		return -EFAULT;
6b447f04a   Alan Cox   tty: Drop the loc...
1389

bd09a9f53   Alessio Igor Bogani   USB: ftdi_sio: Re...
1390
  	mutex_lock(&priv->cfg_lock);
464cbb246   Alan Cox   ftdi_sio: Coding ...
1391
  	old_priv = *priv;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1392
1393
1394
1395
1396
  
  	/* Do error checking and permission checking */
  
  	if (!capable(CAP_SYS_ADMIN)) {
  		if (((new_serial.flags & ~ASYNC_USR_MASK) !=
64905b480   Dan Carpenter   USB: ftdi_sio: un...
1397
  		     (priv->flags & ~ASYNC_USR_MASK))) {
bd09a9f53   Alessio Igor Bogani   USB: ftdi_sio: Re...
1398
  			mutex_unlock(&priv->cfg_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1399
  			return -EPERM;
64905b480   Dan Carpenter   USB: ftdi_sio: un...
1400
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1401
1402
1403
1404
1405
  		priv->flags = ((priv->flags & ~ASYNC_USR_MASK) |
  			       (new_serial.flags & ASYNC_USR_MASK));
  		priv->custom_divisor = new_serial.custom_divisor;
  		goto check_and_exit;
  	}
eb833a9e0   Johan Hovold   USB: ftdi_sio: fi...
1406
  	if (new_serial.baud_base != priv->baud_base) {
bd09a9f53   Alessio Igor Bogani   USB: ftdi_sio: Re...
1407
  		mutex_unlock(&priv->cfg_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1408
  		return -EINVAL;
6b447f04a   Alan Cox   tty: Drop the loc...
1409
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1410
1411
1412
1413
  
  	/* Make the changes - these are privileged changes! */
  
  	priv->flags = ((priv->flags & ~ASYNC_FLAGS) |
464cbb246   Alan Cox   ftdi_sio: Coding ...
1414
  					(new_serial.flags & ASYNC_FLAGS));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1415
  	priv->custom_divisor = new_serial.custom_divisor;
557aaa7ff   Alan Cox   ft232: support th...
1416
  	write_latency_timer(port);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1417
1418
1419
1420
1421
  
  check_and_exit:
  	if ((old_priv.flags & ASYNC_SPD_MASK) !=
  	     (priv->flags & ASYNC_SPD_MASK)) {
  		if ((priv->flags & ASYNC_SPD_MASK) == ASYNC_SPD_HI)
95da310e6   Alan Cox   usb_serial: API a...
1422
  			tty->alt_speed = 57600;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1423
  		else if ((priv->flags & ASYNC_SPD_MASK) == ASYNC_SPD_VHI)
95da310e6   Alan Cox   usb_serial: API a...
1424
  			tty->alt_speed = 115200;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1425
  		else if ((priv->flags & ASYNC_SPD_MASK) == ASYNC_SPD_SHI)
95da310e6   Alan Cox   usb_serial: API a...
1426
  			tty->alt_speed = 230400;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1427
  		else if ((priv->flags & ASYNC_SPD_MASK) == ASYNC_SPD_WARP)
95da310e6   Alan Cox   usb_serial: API a...
1428
  			tty->alt_speed = 460800;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1429
  		else
95da310e6   Alan Cox   usb_serial: API a...
1430
  			tty->alt_speed = 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1431
1432
1433
1434
1435
  	}
  	if (((old_priv.flags & ASYNC_SPD_MASK) !=
  	     (priv->flags & ASYNC_SPD_MASK)) ||
  	    (((priv->flags & ASYNC_SPD_MASK) == ASYNC_SPD_CUST) &&
  	     (old_priv.custom_divisor != priv->custom_divisor))) {
95da310e6   Alan Cox   usb_serial: API a...
1436
  		change_speed(tty, port);
9c67d28e4   Alessio Igor Bogani   USB: ftdi_sio: Fi...
1437
  		mutex_unlock(&priv->cfg_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1438
  	}
6b447f04a   Alan Cox   tty: Drop the loc...
1439
  	else
bd09a9f53   Alessio Igor Bogani   USB: ftdi_sio: Re...
1440
  		mutex_unlock(&priv->cfg_lock);
95da310e6   Alan Cox   usb_serial: API a...
1441
  	return 0;
e49bbce13   Johan Hovold   USB: ftdi_sio: fi...
1442
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1443

c466cd2bb   Greg Kroah-Hartman   USB: serial: ftdi...
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
  static int get_lsr_info(struct usb_serial_port *port,
  			struct serial_struct __user *retinfo)
  {
  	struct ftdi_private *priv = usb_get_serial_port_data(port);
  	unsigned int result = 0;
  
  	if (!retinfo)
  		return -EFAULT;
  
  	if (priv->transmit_empty)
  		result = TIOCSER_TEMT;
  
  	if (copy_to_user(retinfo, &result, sizeof(unsigned int)))
  		return -EFAULT;
  	return 0;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1460

8f977e420   Ian Abbott   [PATCH] USB ftdi_...
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
  /* Determine type of FTDI chip based on USB config and descriptor. */
  static void ftdi_determine_type(struct usb_serial_port *port)
  {
  	struct ftdi_private *priv = usb_get_serial_port_data(port);
  	struct usb_serial *serial = port->serial;
  	struct usb_device *udev = serial->dev;
  	unsigned version;
  	unsigned interfaces;
  
  	/* Assume it is not the original SIO device for now. */
f5e09b7ca   Ian Abbott   [PATCH] USB: ftdi...
1471
  	priv->baud_base = 48000000 / 2;
8f977e420   Ian Abbott   [PATCH] USB ftdi_...
1472
1473
1474
  
  	version = le16_to_cpu(udev->descriptor.bcdDevice);
  	interfaces = udev->actconfig->desc.bNumInterfaces;
bfc51614b   Greg Kroah-Hartman   USB: serial: ftdi...
1475
1476
1477
  	dev_dbg(&port->dev, "%s: bcdDevice = 0x%x, bNumInterfaces = %u
  ", __func__,
  		version, interfaces);
8f977e420   Ian Abbott   [PATCH] USB ftdi_...
1478
1479
  	if (interfaces > 1) {
  		int inter;
094c2e6db   Mark Adamson   USB: serial: FTDI...
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
  		/* Multiple interfaces.*/
  		if (version == 0x0800) {
  			priv->chip_type = FT4232H;
  			/* Hi-speed - baud clock runs at 120MHz */
  			priv->baud_base = 120000000 / 2;
  		} else if (version == 0x0700) {
  			priv->chip_type = FT2232H;
  			/* Hi-speed - baud clock runs at 120MHz */
  			priv->baud_base = 120000000 / 2;
  		} else
  			priv->chip_type = FT2232C;
8f977e420   Ian Abbott   [PATCH] USB ftdi_...
1491
1492
  		/* Determine interface code. */
  		inter = serial->interface->altsetting->desc.bInterfaceNumber;
094c2e6db   Mark Adamson   USB: serial: FTDI...
1493
1494
1495
1496
1497
1498
1499
1500
1501
  		if (inter == 0) {
  			priv->interface = INTERFACE_A;
  		} else  if (inter == 1) {
  			priv->interface = INTERFACE_B;
  		} else  if (inter == 2) {
  			priv->interface = INTERFACE_C;
  		} else  if (inter == 3) {
  			priv->interface = INTERFACE_D;
  		}
8f977e420   Ian Abbott   [PATCH] USB ftdi_...
1502
1503
1504
  		/* BM-type devices have a bug where bcdDevice gets set
  		 * to 0x200 when iSerialNumber is 0.  */
  		if (version < 0x500) {
bfc51614b   Greg Kroah-Hartman   USB: serial: ftdi...
1505
1506
1507
1508
  			dev_dbg(&port->dev,
  				"%s: something fishy - bcdDevice too low for multi-interface device
  ",
  				__func__);
8f977e420   Ian Abbott   [PATCH] USB ftdi_...
1509
1510
  		}
  	} else if (version < 0x200) {
330e3c4cc   Andreas Mohr   USB: ftdi_sio: co...
1511
  		/* Old device.  Assume it's the original SIO. */
8f977e420   Ian Abbott   [PATCH] USB ftdi_...
1512
1513
  		priv->chip_type = SIO;
  		priv->baud_base = 12000000 / 16;
8f977e420   Ian Abbott   [PATCH] USB ftdi_...
1514
  	} else if (version < 0x400) {
330e3c4cc   Andreas Mohr   USB: ftdi_sio: co...
1515
  		/* Assume it's an FT8U232AM (or FT8U245AM) */
8f977e420   Ian Abbott   [PATCH] USB ftdi_...
1516
1517
1518
  		/* (It might be a BM because of the iSerialNumber bug,
  		 * but it will still work as an AM device.) */
  		priv->chip_type = FT8U232AM;
3b009c637   David Brownell   USB: fix usb-seri...
1519
  	} else if (version < 0x600) {
330e3c4cc   Andreas Mohr   USB: ftdi_sio: co...
1520
  		/* Assume it's an FT232BM (or FT245BM) */
8f977e420   Ian Abbott   [PATCH] USB ftdi_...
1521
  		priv->chip_type = FT232BM;
309427b63   Uwe Bonnes   USB: Add new FT23...
1522
1523
  	} else if (version < 0x900) {
  		/* Assume it's an FT232RL */
3b009c637   David Brownell   USB: fix usb-seri...
1524
  		priv->chip_type = FT232RL;
dc0827c12   Jim Paris   USB: ftdi_sio: ad...
1525
  	} else if (version < 0x1000) {
309427b63   Uwe Bonnes   USB: Add new FT23...
1526
1527
  		/* Assume it's an FT232H */
  		priv->chip_type = FT232H;
dc0827c12   Jim Paris   USB: ftdi_sio: ad...
1528
1529
1530
  	} else {
  		/* Assume it's an FT-X series device */
  		priv->chip_type = FTX;
8f977e420   Ian Abbott   [PATCH] USB ftdi_...
1531
  	}
dc0827c12   Jim Paris   USB: ftdi_sio: ad...
1532

c197a8db5   Greg Kroah-Hartman   USB: remove info(...
1533
1534
  	dev_info(&udev->dev, "Detected %s
  ", ftdi_chip_name[priv->chip_type]);
8f977e420   Ian Abbott   [PATCH] USB ftdi_...
1535
  }
895f28bad   Mark Adamson   USB: ftdi_sio: fi...
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
  /* Determine the maximum packet size for the device.  This depends on the chip
   * type and the USB host capabilities.  The value should be obtained from the
   * device descriptor as the chip will use the appropriate values for the host.*/
  static void ftdi_set_max_packet_size(struct usb_serial_port *port)
  {
  	struct ftdi_private *priv = usb_get_serial_port_data(port);
  	struct usb_serial *serial = port->serial;
  	struct usb_device *udev = serial->dev;
  
  	struct usb_interface *interface = serial->interface;
  	struct usb_endpoint_descriptor *ep_desc = &interface->cur_altsetting->endpoint[1].desc;
  
  	unsigned num_endpoints;
c1284d772   Johan Hovold   USB: ftdi_sio: re...
1549
  	int i;
895f28bad   Mark Adamson   USB: ftdi_sio: fi...
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
  
  	num_endpoints = interface->cur_altsetting->desc.bNumEndpoints;
  	dev_info(&udev->dev, "Number of endpoints %d
  ", num_endpoints);
  
  	/* NOTE: some customers have programmed FT232R/FT245R devices
  	 * with an endpoint size of 0 - not good.  In this case, we
  	 * want to override the endpoint descriptor setting and use a
  	 * value of 64 for wMaxPacketSize */
  	for (i = 0; i < num_endpoints; i++) {
  		dev_info(&udev->dev, "Endpoint %d MaxPacketSize %d
  ", i+1,
  			interface->cur_altsetting->endpoint[i].desc.wMaxPacketSize);
  		ep_desc = &interface->cur_altsetting->endpoint[i].desc;
  		if (ep_desc->wMaxPacketSize == 0) {
  			ep_desc->wMaxPacketSize = cpu_to_le16(0x40);
  			dev_info(&udev->dev, "Overriding wMaxPacketSize on endpoint %d
  ", i);
  		}
  	}
  
  	/* set max packet size based on descriptor */
29cc88979   Kuninori Morimoto   USB: use usb_endp...
1572
  	priv->max_packet_size = usb_endpoint_maxp(ep_desc);
895f28bad   Mark Adamson   USB: ftdi_sio: fi...
1573
1574
1575
1576
  
  	dev_info(&udev->dev, "Setting MaxPacketSize %d
  ", priv->max_packet_size);
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1577
1578
1579
1580
1581
  /*
   * ***************************************************************************
   * Sysfs Attribute
   * ***************************************************************************
   */
154547c4f   Greg Kroah-Hartman   USB: serial: clea...
1582
1583
  static ssize_t latency_timer_show(struct device *dev,
  				  struct device_attribute *attr, char *buf)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1584
1585
1586
  {
  	struct usb_serial_port *port = to_usb_serial_port(dev);
  	struct ftdi_private *priv = usb_get_serial_port_data(port);
557aaa7ff   Alan Cox   ft232: support th...
1587
1588
1589
1590
1591
1592
  	if (priv->flags & ASYNC_LOW_LATENCY)
  		return sprintf(buf, "1
  ");
  	else
  		return sprintf(buf, "%i
  ", priv->latency);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1593
1594
1595
  }
  
  /* Write a new value of the latency timer, in units of milliseconds. */
154547c4f   Greg Kroah-Hartman   USB: serial: clea...
1596
1597
1598
  static ssize_t latency_timer_store(struct device *dev,
  				   struct device_attribute *attr,
  				   const char *valbuf, size_t count)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1599
1600
1601
  {
  	struct usb_serial_port *port = to_usb_serial_port(dev);
  	struct ftdi_private *priv = usb_get_serial_port_data(port);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1602
  	int v = simple_strtoul(valbuf, NULL, 10);
c1284d772   Johan Hovold   USB: ftdi_sio: re...
1603
  	int rv;
5c09d144f   David Brownell   USB: ftdi_sio whi...
1604

557aaa7ff   Alan Cox   ft232: support th...
1605
1606
1607
  	priv->latency = v;
  	rv = write_latency_timer(port);
  	if (rv < 0)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1608
  		return -EIO;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1609
1610
  	return count;
  }
154547c4f   Greg Kroah-Hartman   USB: serial: clea...
1611
  static DEVICE_ATTR_RW(latency_timer);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1612
1613
1614
  
  /* Write an event character directly to the FTDI register.  The ASCII
     value is in the low 8 bits, with the enable bit in the 9th bit. */
464cbb246   Alan Cox   ftdi_sio: Coding ...
1615
1616
  static ssize_t store_event_char(struct device *dev,
  	struct device_attribute *attr, const char *valbuf, size_t count)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1617
1618
1619
  {
  	struct usb_serial_port *port = to_usb_serial_port(dev);
  	struct ftdi_private *priv = usb_get_serial_port_data(port);
12bdbe03c   Jim Radford   USB: ftdi_sio: us...
1620
  	struct usb_device *udev = port->serial->dev;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1621
  	int v = simple_strtoul(valbuf, NULL, 10);
c1284d772   Johan Hovold   USB: ftdi_sio: re...
1622
  	int rv;
5c09d144f   David Brownell   USB: ftdi_sio whi...
1623

bfc51614b   Greg Kroah-Hartman   USB: serial: ftdi...
1624
1625
  	dev_dbg(&port->dev, "%s: setting event char = %i
  ", __func__, v);
5c09d144f   David Brownell   USB: ftdi_sio whi...
1626

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1627
1628
1629
1630
  	rv = usb_control_msg(udev,
  			     usb_sndctrlpipe(udev, 0),
  			     FTDI_SIO_SET_EVENT_CHAR_REQUEST,
  			     FTDI_SIO_SET_EVENT_CHAR_REQUEST_TYPE,
5c09d144f   David Brownell   USB: ftdi_sio whi...
1631
  			     v, priv->interface,
66e47e600   Johan Hovold   USB: ftdi_sio: fi...
1632
  			     NULL, 0, WDR_TIMEOUT);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1633
  	if (rv < 0) {
bfc51614b   Greg Kroah-Hartman   USB: serial: ftdi...
1634
1635
  		dev_dbg(&port->dev, "Unable to write event character: %i
  ", rv);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1636
1637
  		return -EIO;
  	}
5c09d144f   David Brownell   USB: ftdi_sio whi...
1638

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1639
1640
  	return count;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1641
  static DEVICE_ATTR(event_char, S_IWUSR, NULL, store_event_char);
12bdbe03c   Jim Radford   USB: ftdi_sio: us...
1642
  static int create_sysfs_attrs(struct usb_serial_port *port)
13f4db9e1   Greg Kroah-Hartman   USB: fix __must_c...
1643
  {
12bdbe03c   Jim Radford   USB: ftdi_sio: us...
1644
  	struct ftdi_private *priv = usb_get_serial_port_data(port);
13f4db9e1   Greg Kroah-Hartman   USB: fix __must_c...
1645
  	int retval = 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1646

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1647
1648
1649
  	/* XXX I've no idea if the original SIO supports the event_char
  	 * sysfs parameter, so I'm playing it safe.  */
  	if (priv->chip_type != SIO) {
bfc51614b   Greg Kroah-Hartman   USB: serial: ftdi...
1650
1651
  		dev_dbg(&port->dev, "sysfs attributes for %s
  ", ftdi_chip_name[priv->chip_type]);
12bdbe03c   Jim Radford   USB: ftdi_sio: us...
1652
  		retval = device_create_file(&port->dev, &dev_attr_event_char);
13f4db9e1   Greg Kroah-Hartman   USB: fix __must_c...
1653
  		if ((!retval) &&
97cd49ebf   Stepan Moskovchenko   USB: ftdi_sio.c: ...
1654
1655
  		    (priv->chip_type == FT232BM ||
  		     priv->chip_type == FT2232C ||
094c2e6db   Mark Adamson   USB: serial: FTDI...
1656
1657
  		     priv->chip_type == FT232RL ||
  		     priv->chip_type == FT2232H ||
309427b63   Uwe Bonnes   USB: Add new FT23...
1658
  		     priv->chip_type == FT4232H ||
dc0827c12   Jim Paris   USB: ftdi_sio: ad...
1659
1660
  		     priv->chip_type == FT232H ||
  		     priv->chip_type == FTX)) {
12bdbe03c   Jim Radford   USB: ftdi_sio: us...
1661
  			retval = device_create_file(&port->dev,
13f4db9e1   Greg Kroah-Hartman   USB: fix __must_c...
1662
  						    &dev_attr_latency_timer);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1663
1664
  		}
  	}
13f4db9e1   Greg Kroah-Hartman   USB: fix __must_c...
1665
  	return retval;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1666
  }
12bdbe03c   Jim Radford   USB: ftdi_sio: us...
1667
  static void remove_sysfs_attrs(struct usb_serial_port *port)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1668
  {
12bdbe03c   Jim Radford   USB: ftdi_sio: us...
1669
  	struct ftdi_private *priv = usb_get_serial_port_data(port);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1670

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1671
1672
  	/* XXX see create_sysfs_attrs */
  	if (priv->chip_type != SIO) {
12bdbe03c   Jim Radford   USB: ftdi_sio: us...
1673
  		device_remove_file(&port->dev, &dev_attr_event_char);
ed6e52829   Andrew M. Bishop   USB: ftdi_sio: Ha...
1674
1675
  		if (priv->chip_type == FT232BM ||
  		    priv->chip_type == FT2232C ||
094c2e6db   Mark Adamson   USB: serial: FTDI...
1676
1677
  		    priv->chip_type == FT232RL ||
  		    priv->chip_type == FT2232H ||
309427b63   Uwe Bonnes   USB: Add new FT23...
1678
  		    priv->chip_type == FT4232H ||
dc0827c12   Jim Paris   USB: ftdi_sio: ad...
1679
1680
  		    priv->chip_type == FT232H ||
  		    priv->chip_type == FTX) {
12bdbe03c   Jim Radford   USB: ftdi_sio: us...
1681
  			device_remove_file(&port->dev, &dev_attr_latency_timer);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1682
1683
  		}
  	}
5c09d144f   David Brownell   USB: ftdi_sio whi...
1684

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1685
1686
1687
1688
1689
1690
1691
  }
  
  /*
   * ***************************************************************************
   * FTDI driver specific functions
   * ***************************************************************************
   */
8f977e420   Ian Abbott   [PATCH] USB ftdi_...
1692
  /* Probe function to check for special devices */
464cbb246   Alan Cox   ftdi_sio: Coding ...
1693
1694
  static int ftdi_sio_probe(struct usb_serial *serial,
  					const struct usb_device_id *id)
8f977e420   Ian Abbott   [PATCH] USB ftdi_...
1695
  {
464cbb246   Alan Cox   ftdi_sio: Coding ...
1696
1697
  	struct ftdi_sio_quirk *quirk =
  				(struct ftdi_sio_quirk *)id->driver_info;
fa91d43b9   Tony Lindgren   USB: Add support ...
1698
1699
1700
1701
1702
1703
  
  	if (quirk && quirk->probe) {
  		int ret = quirk->probe(serial);
  		if (ret != 0)
  			return ret;
  	}
8f977e420   Ian Abbott   [PATCH] USB ftdi_...
1704
  	usb_set_serial_data(serial, (void *)id->driver_info);
fa91d43b9   Tony Lindgren   USB: Add support ...
1705
  	return 0;
8f977e420   Ian Abbott   [PATCH] USB ftdi_...
1706
  }
12bdbe03c   Jim Radford   USB: ftdi_sio: us...
1707
  static int ftdi_sio_port_probe(struct usb_serial_port *port)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1708
  {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1709
  	struct ftdi_private *priv;
0ffbbe25a   Oliver Neukum   USB: ftdi_sio: fi...
1710
  	struct ftdi_sio_quirk *quirk = usb_get_serial_data(port->serial);
13f4db9e1   Greg Kroah-Hartman   USB: fix __must_c...
1711

80b6ca483   Eric Sesterhenn   [PATCH] USB: kzal...
1712
  	priv = kzalloc(sizeof(struct ftdi_private), GFP_KERNEL);
10c642d07   Johan Hovold   USB: serial: remo...
1713
  	if (!priv)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1714
  		return -ENOMEM;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1715

bd09a9f53   Alessio Igor Bogani   USB: ftdi_sio: Re...
1716
  	mutex_init(&priv->cfg_lock);
0076b4bec   Johan Hovold   USB: ftdi_sio: re...
1717

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1718
  	priv->flags = ASYNC_LOW_LATENCY;
0ffbbe25a   Oliver Neukum   USB: ftdi_sio: fi...
1719
1720
  	if (quirk && quirk->port_probe)
  		quirk->port_probe(priv);
12bdbe03c   Jim Radford   USB: ftdi_sio: us...
1721
  	usb_set_serial_port_data(port, priv);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1722

464cbb246   Alan Cox   ftdi_sio: Coding ...
1723
  	ftdi_determine_type(port);
895f28bad   Mark Adamson   USB: ftdi_sio: fi...
1724
  	ftdi_set_max_packet_size(port);
8c4f99cd5   Johan Hovold   USB: ftdi_sio: fi...
1725
1726
  	if (read_latency_timer(port) < 0)
  		priv->latency = 16;
c19db4c9e   Johan Hovold   USB: ftdi_sio: se...
1727
  	write_latency_timer(port);
12bdbe03c   Jim Radford   USB: ftdi_sio: us...
1728
1729
1730
  	create_sysfs_attrs(port);
  	return 0;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1731

8f977e420   Ian Abbott   [PATCH] USB ftdi_...
1732
1733
  /* Setup for the USB-UIRT device, which requires hardwired
   * baudrate (38400 gets mapped to 312500) */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1734
  /* Called from usbserial:serial_probe */
464cbb246   Alan Cox   ftdi_sio: Coding ...
1735
  static void ftdi_USB_UIRT_setup(struct ftdi_private *priv)
8f977e420   Ian Abbott   [PATCH] USB ftdi_...
1736
  {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1737
1738
  	priv->flags |= ASYNC_SPD_CUST;
  	priv->custom_divisor = 77;
669a6db10   Alan Cox   USB: ftd_sio: cle...
1739
  	priv->force_baud = 38400;
e49bbce13   Johan Hovold   USB: ftdi_sio: fi...
1740
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1741

8f977e420   Ian Abbott   [PATCH] USB ftdi_...
1742
1743
  /* Setup for the HE-TIRA1 device, which requires hardwired
   * baudrate (38400 gets mapped to 100000) and RTS-CTS enabled.  */
464cbb246   Alan Cox   ftdi_sio: Coding ...
1744
1745
  
  static void ftdi_HE_TIRA1_setup(struct ftdi_private *priv)
8f977e420   Ian Abbott   [PATCH] USB ftdi_...
1746
  {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1747
1748
  	priv->flags |= ASYNC_SPD_CUST;
  	priv->custom_divisor = 240;
669a6db10   Alan Cox   USB: ftd_sio: cle...
1749
  	priv->force_baud = 38400;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1750
  	priv->force_rtscts = 1;
e49bbce13   Johan Hovold   USB: ftdi_sio: fi...
1751
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1752

fa91d43b9   Tony Lindgren   USB: Add support ...
1753
  /*
b760dac29   Martin Geleynse   USB: ftdi: suppor...
1754
   * Module parameter to control latency timer for NDI FTDI-based USB devices.
970e24864   Lucas De Marchi   Documentation: re...
1755
1756
   * If this value is not set in /etc/modprobe.d/ its value will be set
   * to 1ms.
b760dac29   Martin Geleynse   USB: ftdi: suppor...
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
   */
  static int ndi_latency_timer = 1;
  
  /* Setup for the NDI FTDI-based USB devices, which requires hardwired
   * baudrate (19200 gets mapped to 1200000).
   *
   * Called from usbserial:serial_probe.
   */
  static int ftdi_NDI_device_setup(struct usb_serial *serial)
  {
  	struct usb_device *udev = serial->dev;
  	int latency = ndi_latency_timer;
b760dac29   Martin Geleynse   USB: ftdi: suppor...
1769
1770
1771
1772
1773
  
  	if (latency == 0)
  		latency = 1;
  	if (latency > 99)
  		latency = 99;
bfc51614b   Greg Kroah-Hartman   USB: serial: ftdi...
1774
1775
1776
1777
  	dev_dbg(&udev->dev, "%s setting NDI device latency to %d
  ", __func__, latency);
  	dev_info(&udev->dev, "NDI device with a latency value of %d
  ", latency);
b760dac29   Martin Geleynse   USB: ftdi: suppor...
1778

c1284d772   Johan Hovold   USB: ftdi_sio: re...
1779
1780
  	/* FIXME: errors are not returned */
  	usb_control_msg(udev, usb_sndctrlpipe(udev, 0),
b760dac29   Martin Geleynse   USB: ftdi: suppor...
1781
1782
  				FTDI_SIO_SET_LATENCY_TIMER_REQUEST,
  				FTDI_SIO_SET_LATENCY_TIMER_REQUEST_TYPE,
66e47e600   Johan Hovold   USB: ftdi_sio: fi...
1783
  				latency, 0, NULL, 0, WDR_TIMEOUT);
b760dac29   Martin Geleynse   USB: ftdi: suppor...
1784
1785
1786
1787
  	return 0;
  }
  
  /*
20734345b   Harald Welte   USB: ftdi_sio: Su...
1788
1789
1790
   * First port on JTAG adaptors such as Olimex arm-usb-ocd or the FIC/OpenMoko
   * Neo1973 Debug Board is reserved for JTAG interface and can be accessed from
   * userspace using openocd.
fa91d43b9   Tony Lindgren   USB: Add support ...
1791
   */
20734345b   Harald Welte   USB: ftdi_sio: Su...
1792
  static int ftdi_jtag_probe(struct usb_serial *serial)
fa91d43b9   Tony Lindgren   USB: Add support ...
1793
1794
1795
  {
  	struct usb_device *udev = serial->dev;
  	struct usb_interface *interface = serial->interface;
fa91d43b9   Tony Lindgren   USB: Add support ...
1796
  	if (interface == udev->actconfig->interface[0]) {
c197a8db5   Greg Kroah-Hartman   USB: remove info(...
1797
1798
1799
  		dev_info(&udev->dev,
  			 "Ignoring serial port reserved for JTAG
  ");
fa91d43b9   Tony Lindgren   USB: Add support ...
1800
1801
1802
1803
1804
  		return -ENODEV;
  	}
  
  	return 0;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1805

c96fbdd0a   Jean-Christophe PLAGNIOL-VILLARD   USB: ftdi_sio: ad...
1806
1807
1808
  static int ftdi_8u2232c_probe(struct usb_serial *serial)
  {
  	struct usb_device *udev = serial->dev;
444aa7fa9   Peter Korsgaard   USB: ftdi_sio: ad...
1809
  	if ((udev->manufacturer && !strcmp(udev->manufacturer, "CALAO Systems")) ||
1a88d5eee   Peter Korsgaard   usb: ftdi_sio: fi...
1810
  	    (udev->product && !strcmp(udev->product, "BeagleBone/XDS100V2")))
c96fbdd0a   Jean-Christophe PLAGNIOL-VILLARD   USB: ftdi_sio: ad...
1811
1812
1813
1814
  		return ftdi_jtag_probe(serial);
  
  	return 0;
  }
546d7eec3   Kevin Vance   USB: ftdi_sio: Wo...
1815
  /*
71d9a2b95   Adrian Thomasset   USB: ftdi_sio: en...
1816
1817
1818
1819
1820
   * First two ports on JTAG adaptors using an FT4232 such as STMicroelectronics's
   * ST Micro Connect Lite are reserved for JTAG or other non-UART interfaces and
   * can be accessed from userspace.
   * The next two ports are enabled as UARTs by default, where port 2 is
   * a conventional RS-232 UART.
6ec2f46c4   Jean-Christophe PLAGNIOL-VILLARD   USB: ftdi_sio: ad...
1821
1822
1823
1824
1825
   */
  static int ftdi_stmclite_probe(struct usb_serial *serial)
  {
  	struct usb_device *udev = serial->dev;
  	struct usb_interface *interface = serial->interface;
71d9a2b95   Adrian Thomasset   USB: ftdi_sio: en...
1826
1827
1828
1829
1830
1831
  	if (interface == udev->actconfig->interface[0] ||
  	    interface == udev->actconfig->interface[1]) {
  		dev_info(&udev->dev, "Ignoring serial port reserved for JTAG
  ");
  		return -ENODEV;
  	}
6ec2f46c4   Jean-Christophe PLAGNIOL-VILLARD   USB: ftdi_sio: ad...
1832

71d9a2b95   Adrian Thomasset   USB: ftdi_sio: en...
1833
  	return 0;
6ec2f46c4   Jean-Christophe PLAGNIOL-VILLARD   USB: ftdi_sio: ad...
1834
1835
1836
  }
  
  /*
546d7eec3   Kevin Vance   USB: ftdi_sio: Wo...
1837
1838
1839
1840
1841
1842
1843
1844
1845
   * The Matrix Orbital VK204-25-USB has an invalid IN endpoint.
   * We have to correct it if we want to read from it.
   */
  static int ftdi_mtxorb_hack_setup(struct usb_serial *serial)
  {
  	struct usb_host_endpoint *ep = serial->dev->ep_in[1];
  	struct usb_endpoint_descriptor *ep_desc = &ep->desc;
  
  	if (ep->enabled && ep_desc->wMaxPacketSize == 0) {
fd05e7200   Al Viro   drivers/usb annot...
1846
  		ep_desc->wMaxPacketSize = cpu_to_le16(0x40);
c197a8db5   Greg Kroah-Hartman   USB: remove info(...
1847
1848
1849
  		dev_info(&serial->dev->dev,
  			 "Fixing invalid wMaxPacketSize on read pipe
  ");
546d7eec3   Kevin Vance   USB: ftdi_sio: Wo...
1850
1851
1852
1853
  	}
  
  	return 0;
  }
12bdbe03c   Jim Radford   USB: ftdi_sio: us...
1854
1855
  static int ftdi_sio_port_remove(struct usb_serial_port *port)
  {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1856
  	struct ftdi_private *priv = usb_get_serial_port_data(port);
12bdbe03c   Jim Radford   USB: ftdi_sio: us...
1857
  	remove_sysfs_attrs(port);
5c09d144f   David Brownell   USB: ftdi_sio whi...
1858

4cba98ff8   Johan Hovold   USB: ftdi_sio: re...
1859
  	kfree(priv);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1860

12bdbe03c   Jim Radford   USB: ftdi_sio: us...
1861
1862
  	return 0;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1863

a509a7e47   Alan Cox   tty: USB does not...
1864
  static int ftdi_open(struct tty_struct *tty, struct usb_serial_port *port)
e49bbce13   Johan Hovold   USB: ftdi_sio: fi...
1865
  {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1866
1867
  	struct usb_device *dev = port->serial->dev;
  	struct ftdi_private *priv = usb_get_serial_port_data(port);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1868

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1869
1870
1871
  	/* No error checking for this (will get errors later anyway) */
  	/* See ftdi_sio.h for description of what is reset */
  	usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
5c09d144f   David Brownell   USB: ftdi_sio whi...
1872
1873
  			FTDI_SIO_RESET_REQUEST, FTDI_SIO_RESET_REQUEST_TYPE,
  			FTDI_SIO_RESET_SIO,
66e47e600   Johan Hovold   USB: ftdi_sio: fi...
1874
  			priv->interface, NULL, 0, WDR_TIMEOUT);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1875
1876
  
  	/* Termios defaults are set by usb_serial_init. We don't change
c4f012405   Nick Andrew   Fix incorrect use...
1877
  	   port->tty->termios - this would lose speed settings, etc.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1878
1879
1880
  	   This is same behaviour as serial.c/rs_open() - Kuba */
  
  	/* ftdi_set_termios  will send usb control messages */
be0278ccf   Johan Hovold   USB: ftdi_sio: cl...
1881
1882
  	if (tty)
  		ftdi_set_termios(tty, port, NULL);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1883

4cba98ff8   Johan Hovold   USB: ftdi_sio: re...
1884
  	return usb_serial_generic_open(tty, port);
e49bbce13   Johan Hovold   USB: ftdi_sio: fi...
1885
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1886

335f8514f   Alan Cox   tty: Bring the us...
1887
1888
1889
  static void ftdi_dtr_rts(struct usb_serial_port *port, int on)
  {
  	struct ftdi_private *priv = usb_get_serial_port_data(port);
335f8514f   Alan Cox   tty: Bring the us...
1890

b2ca69907   Johan Hovold   USB: serial: fix ...
1891
1892
1893
  	/* Disable flow control */
  	if (!on) {
  		if (usb_control_msg(port->serial->dev,
335f8514f   Alan Cox   tty: Bring the us...
1894
1895
1896
  			    usb_sndctrlpipe(port->serial->dev, 0),
  			    FTDI_SIO_SET_FLOW_CTRL_REQUEST,
  			    FTDI_SIO_SET_FLOW_CTRL_REQUEST_TYPE,
66e47e600   Johan Hovold   USB: ftdi_sio: fi...
1897
  			    0, priv->interface, NULL, 0,
335f8514f   Alan Cox   tty: Bring the us...
1898
  			    WDR_TIMEOUT) < 0) {
b2ca69907   Johan Hovold   USB: serial: fix ...
1899
1900
  			dev_err(&port->dev, "error from flowcontrol urb
  ");
335f8514f   Alan Cox   tty: Bring the us...
1901
  		}
335f8514f   Alan Cox   tty: Bring the us...
1902
  	}
b2ca69907   Johan Hovold   USB: serial: fix ...
1903
1904
1905
1906
1907
  	/* drop RTS and DTR */
  	if (on)
  		set_mctrl(port, TIOCM_DTR | TIOCM_RTS);
  	else
  		clear_mctrl(port, TIOCM_DTR | TIOCM_RTS);
335f8514f   Alan Cox   tty: Bring the us...
1908
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1909

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1910
1911
1912
1913
1914
1915
1916
  /* The SIO requires the first byte to have:
   *  B0 1
   *  B1 0
   *  B2..7 length of message excluding byte 0
   *
   * The new devices do not require this byte
   */
d3901a064   Johan Hovold   USB: ftdi_sio: sw...
1917
  static int ftdi_prepare_write_buffer(struct usb_serial_port *port,
c23e5fc1f   Johan Hovold   USB: serial: remo...
1918
  						void *dest, size_t size)
e49bbce13   Johan Hovold   USB: ftdi_sio: fi...
1919
  {
d3901a064   Johan Hovold   USB: ftdi_sio: sw...
1920
  	struct ftdi_private *priv;
c23e5fc1f   Johan Hovold   USB: serial: remo...
1921
1922
  	int count;
  	unsigned long flags;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1923

d3901a064   Johan Hovold   USB: ftdi_sio: sw...
1924
  	priv = usb_get_serial_port_data(port);
5c09d144f   David Brownell   USB: ftdi_sio whi...
1925

e87704841   Johan Hovold   USB: ftdi_sio: cl...
1926
  	if (priv->chip_type == SIO) {
c23e5fc1f   Johan Hovold   USB: serial: remo...
1927
1928
1929
1930
1931
1932
1933
  		unsigned char *buffer = dest;
  		int i, len, c;
  
  		count = 0;
  		spin_lock_irqsave(&port->lock, flags);
  		for (i = 0; i < size - 1; i += priv->max_packet_size) {
  			len = min_t(int, size - i, priv->max_packet_size) - 1;
c23e5fc1f   Johan Hovold   USB: serial: remo...
1934
1935
1936
  			c = kfifo_out(&port->write_fifo, &buffer[i + 1], len);
  			if (!c)
  				break;
cb1676a61   Johan Hovold   USB: ftdi_sio: us...
1937
  			port->icount.tx += c;
c1aa075ac   Johan Hovold   USB: ftdi_sio: fi...
1938
  			buffer[i] = (c << 2) + 1;
c23e5fc1f   Johan Hovold   USB: serial: remo...
1939
  			count += c + 1;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1940
  		}
c23e5fc1f   Johan Hovold   USB: serial: remo...
1941
  		spin_unlock_irqrestore(&port->lock, flags);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1942
  	} else {
c23e5fc1f   Johan Hovold   USB: serial: remo...
1943
1944
  		count = kfifo_out_locked(&port->write_fifo, dest, size,
  								&port->lock);
cb1676a61   Johan Hovold   USB: ftdi_sio: us...
1945
  		port->icount.tx += count;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1946
  	}
62127a585   Oliver Neukum   USB: fix race in ...
1947
  	return count;
e49bbce13   Johan Hovold   USB: ftdi_sio: fi...
1948
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1949

166ceb690   Johan Hovold   USB: ftdi_sio: cl...
1950
  #define FTDI_RS_ERR_MASK (FTDI_RS_BI | FTDI_RS_PE | FTDI_RS_FE | FTDI_RS_OE)
92a19f9ce   Jiri Slaby   TTY: switch tty_i...
1951
1952
  static int ftdi_process_packet(struct usb_serial_port *port,
  		struct ftdi_private *priv, char *packet, int len)
95da310e6   Alan Cox   usb_serial: API a...
1953
  {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1954
  	int i;
cc01f17d5   Johan Hovold   USB: ftdi_sio: re...
1955
1956
1957
  	char status;
  	char flag;
  	char *ch;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1958

cc01f17d5   Johan Hovold   USB: ftdi_sio: re...
1959
  	if (len < 2) {
bfc51614b   Greg Kroah-Hartman   USB: serial: ftdi...
1960
1961
  		dev_dbg(&port->dev, "malformed packet
  ");
cc01f17d5   Johan Hovold   USB: ftdi_sio: re...
1962
  		return 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1963
  	}
cc01f17d5   Johan Hovold   USB: ftdi_sio: re...
1964
1965
1966
1967
1968
  	/* Compare new line status to the old one, signal if different/
  	   N.B. packet may be processed more than once, but differences
  	   are only processed once.  */
  	status = packet[0] & FTDI_STATUS_B0_MASK;
  	if (status != priv->prev_status) {
fca5430d4   Simon Arlott   USB: ftdi_sio: fi...
1969
1970
1971
  		char diff_status = status ^ priv->prev_status;
  
  		if (diff_status & FTDI_RS0_CTS)
cb1676a61   Johan Hovold   USB: ftdi_sio: us...
1972
  			port->icount.cts++;
fca5430d4   Simon Arlott   USB: ftdi_sio: fi...
1973
  		if (diff_status & FTDI_RS0_DSR)
cb1676a61   Johan Hovold   USB: ftdi_sio: us...
1974
  			port->icount.dsr++;
fca5430d4   Simon Arlott   USB: ftdi_sio: fi...
1975
  		if (diff_status & FTDI_RS0_RI)
cb1676a61   Johan Hovold   USB: ftdi_sio: us...
1976
  			port->icount.rng++;
d14654dff   Paul Chavent   USB: serial: call...
1977
1978
  		if (diff_status & FTDI_RS0_RLSD) {
  			struct tty_struct *tty;
cb1676a61   Johan Hovold   USB: ftdi_sio: us...
1979
  			port->icount.dcd++;
d14654dff   Paul Chavent   USB: serial: call...
1980
1981
1982
1983
1984
1985
  			tty = tty_port_tty_get(&port->port);
  			if (tty)
  				usb_serial_handle_dcd_change(port, tty,
  						status & FTDI_RS0_RLSD);
  			tty_kref_put(tty);
  		}
fca5430d4   Simon Arlott   USB: ftdi_sio: fi...
1986

f307e5cd3   Johan Hovold   USB: ftdi_sio: sw...
1987
  		wake_up_interruptible(&port->port.delta_msr_wait);
cc01f17d5   Johan Hovold   USB: ftdi_sio: re...
1988
  		priv->prev_status = status;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1989
  	}
cc01f17d5   Johan Hovold   USB: ftdi_sio: re...
1990
  	flag = TTY_NORMAL;
166ceb690   Johan Hovold   USB: ftdi_sio: cl...
1991
1992
1993
1994
1995
  	if (packet[1] & FTDI_RS_ERR_MASK) {
  		/* Break takes precedence over parity, which takes precedence
  		 * over framing errors */
  		if (packet[1] & FTDI_RS_BI) {
  			flag = TTY_BREAK;
cb1676a61   Johan Hovold   USB: ftdi_sio: us...
1996
  			port->icount.brk++;
166ceb690   Johan Hovold   USB: ftdi_sio: cl...
1997
1998
1999
  			usb_serial_handle_break(port);
  		} else if (packet[1] & FTDI_RS_PE) {
  			flag = TTY_PARITY;
cb1676a61   Johan Hovold   USB: ftdi_sio: us...
2000
  			port->icount.parity++;
166ceb690   Johan Hovold   USB: ftdi_sio: cl...
2001
2002
  		} else if (packet[1] & FTDI_RS_FE) {
  			flag = TTY_FRAME;
cb1676a61   Johan Hovold   USB: ftdi_sio: us...
2003
  			port->icount.frame++;
166ceb690   Johan Hovold   USB: ftdi_sio: cl...
2004
2005
  		}
  		/* Overrun is special, not associated with a char */
005b3cded   Uwe Bonnes   USB: ftdi_sio.c:F...
2006
  		if (packet[1] & FTDI_RS_OE) {
cb1676a61   Johan Hovold   USB: ftdi_sio: us...
2007
  			port->icount.overrun++;
92a19f9ce   Jiri Slaby   TTY: switch tty_i...
2008
  			tty_insert_flip_char(&port->port, 0, TTY_OVERRUN);
005b3cded   Uwe Bonnes   USB: ftdi_sio.c:F...
2009
  		}
76854ceac   Ian Abbott   [PATCH] USB: ftdi...
2010
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2011

c466cd2bb   Greg Kroah-Hartman   USB: serial: ftdi...
2012
2013
2014
2015
2016
  	/* save if the transmitter is empty or not */
  	if (packet[1] & FTDI_RS_TEMT)
  		priv->transmit_empty = 1;
  	else
  		priv->transmit_empty = 0;
cc01f17d5   Johan Hovold   USB: ftdi_sio: re...
2017
2018
2019
  	len -= 2;
  	if (!len)
  		return 0;	/* status only */
cb1676a61   Johan Hovold   USB: ftdi_sio: us...
2020
  	port->icount.rx += len;
cc01f17d5   Johan Hovold   USB: ftdi_sio: re...
2021
  	ch = packet + 2;
49b2597a8   Johan Hovold   USB: ftdi_sio: us...
2022
  	if (port->port.console && port->sysrq) {
cc01f17d5   Johan Hovold   USB: ftdi_sio: re...
2023
  		for (i = 0; i < len; i++, ch++) {
6ee9f4b4a   Dmitry Torokhov   USB: drop tty arg...
2024
  			if (!usb_serial_handle_sysrq_char(port, *ch))
92a19f9ce   Jiri Slaby   TTY: switch tty_i...
2025
  				tty_insert_flip_char(&port->port, *ch, flag);
76854ceac   Ian Abbott   [PATCH] USB: ftdi...
2026
  		}
49b2597a8   Johan Hovold   USB: ftdi_sio: us...
2027
  	} else {
2f6933571   Jiri Slaby   TTY: convert more...
2028
  		tty_insert_flip_string_fixed_flag(&port->port, ch, flag, len);
cc01f17d5   Johan Hovold   USB: ftdi_sio: re...
2029
  	}
49b2597a8   Johan Hovold   USB: ftdi_sio: us...
2030

cc01f17d5   Johan Hovold   USB: ftdi_sio: re...
2031
2032
  	return len;
  }
76854ceac   Ian Abbott   [PATCH] USB: ftdi...
2033

1b551015a   Johan Hovold   USB: ftdi_sio: sw...
2034
  static void ftdi_process_read_urb(struct urb *urb)
cc01f17d5   Johan Hovold   USB: ftdi_sio: re...
2035
  {
1b551015a   Johan Hovold   USB: ftdi_sio: sw...
2036
  	struct usb_serial_port *port = urb->context;
cc01f17d5   Johan Hovold   USB: ftdi_sio: re...
2037
2038
2039
2040
2041
  	struct ftdi_private *priv = usb_get_serial_port_data(port);
  	char *data = (char *)urb->transfer_buffer;
  	int i;
  	int len;
  	int count = 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2042

cc01f17d5   Johan Hovold   USB: ftdi_sio: re...
2043
2044
  	for (i = 0; i < urb->actual_length; i += priv->max_packet_size) {
  		len = min_t(int, urb->actual_length - i, priv->max_packet_size);
92a19f9ce   Jiri Slaby   TTY: switch tty_i...
2045
  		count += ftdi_process_packet(port, priv, &data[i], len);
cc01f17d5   Johan Hovold   USB: ftdi_sio: re...
2046
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2047

cc01f17d5   Johan Hovold   USB: ftdi_sio: re...
2048
  	if (count)
2e124b4a3   Jiri Slaby   TTY: switch tty_f...
2049
  		tty_flip_buffer_push(&port->port);
cc01f17d5   Johan Hovold   USB: ftdi_sio: re...
2050
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2051

95da310e6   Alan Cox   usb_serial: API a...
2052
  static void ftdi_break_ctl(struct tty_struct *tty, int break_state)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2053
  {
95da310e6   Alan Cox   usb_serial: API a...
2054
  	struct usb_serial_port *port = tty->driver_data;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2055
  	struct ftdi_private *priv = usb_get_serial_port_data(port);
c1284d772   Johan Hovold   USB: ftdi_sio: re...
2056
  	__u16 urb_value;
5c09d144f   David Brownell   USB: ftdi_sio whi...
2057

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2058
2059
2060
  	/* break_state = -1 to turn on break, and 0 to turn off break */
  	/* see drivers/char/tty_io.c to see it used */
  	/* last_set_data_urb_value NEVER has the break bit set in it */
464cbb246   Alan Cox   ftdi_sio: Coding ...
2061
  	if (break_state)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2062
  		urb_value = priv->last_set_data_urb_value | FTDI_SIO_SET_BREAK;
464cbb246   Alan Cox   ftdi_sio: Coding ...
2063
  	else
5c09d144f   David Brownell   USB: ftdi_sio whi...
2064
  		urb_value = priv->last_set_data_urb_value;
5c09d144f   David Brownell   USB: ftdi_sio whi...
2065

464cbb246   Alan Cox   ftdi_sio: Coding ...
2066
2067
2068
2069
2070
  	if (usb_control_msg(port->serial->dev,
  			usb_sndctrlpipe(port->serial->dev, 0),
  			FTDI_SIO_SET_DATA_REQUEST,
  			FTDI_SIO_SET_DATA_REQUEST_TYPE,
  			urb_value , priv->interface,
66e47e600   Johan Hovold   USB: ftdi_sio: fi...
2071
  			NULL, 0, WDR_TIMEOUT) < 0) {
bfc51614b   Greg Kroah-Hartman   USB: serial: ftdi...
2072
2073
2074
  		dev_err(&port->dev, "%s FAILED to enable/disable break state (state was %d)
  ",
  			__func__, break_state);
5c09d144f   David Brownell   USB: ftdi_sio whi...
2075
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2076

bfc51614b   Greg Kroah-Hartman   USB: serial: ftdi...
2077
2078
2079
  	dev_dbg(&port->dev, "%s break state is %d - urb is %d
  ", __func__,
  		break_state, urb_value);
5c09d144f   David Brownell   USB: ftdi_sio whi...
2080

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2081
  }
a37025b5c   Johan Hovold   USB: ftdi_sio: fi...
2082
  static bool ftdi_tx_empty(struct usb_serial_port *port)
6f602912c   Jarkko Huijts   usb: serial: ftdi...
2083
  {
5fb0432e6   Johan Hovold   USB: ftdi_sio: us...
2084
  	unsigned char buf[2];
6f602912c   Jarkko Huijts   usb: serial: ftdi...
2085
  	int ret;
c4133648b   Johan Hovold   USB: ftdi_sio: cl...
2086
  	ret = ftdi_get_modem_status(port, buf);
5fb0432e6   Johan Hovold   USB: ftdi_sio: us...
2087
2088
  	if (ret == 2) {
  		if (!(buf[1] & FTDI_RS_TEMT))
a37025b5c   Johan Hovold   USB: ftdi_sio: fi...
2089
  			return false;
6f602912c   Jarkko Huijts   usb: serial: ftdi...
2090
  	}
a37025b5c   Johan Hovold   USB: ftdi_sio: fi...
2091
  	return true;
6f602912c   Jarkko Huijts   usb: serial: ftdi...
2092
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2093
2094
2095
2096
  /* old_termios contains the original termios settings and tty->termios contains
   * the new setting to be used
   * WARNING: set_termios calls this with old_termios in kernel space
   */
95da310e6   Alan Cox   usb_serial: API a...
2097
2098
  static void ftdi_set_termios(struct tty_struct *tty,
  		struct usb_serial_port *port, struct ktermios *old_termios)
e49bbce13   Johan Hovold   USB: ftdi_sio: fi...
2099
  {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2100
  	struct usb_device *dev = port->serial->dev;
bfc51614b   Greg Kroah-Hartman   USB: serial: ftdi...
2101
  	struct device *ddev = &port->dev;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2102
  	struct ftdi_private *priv = usb_get_serial_port_data(port);
adc8d746c   Alan Cox   tty: move the ter...
2103
  	struct ktermios *termios = &tty->termios;
669a6db10   Alan Cox   USB: ftd_sio: cle...
2104
  	unsigned int cflag = termios->c_cflag;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2105
  	__u16 urb_value; /* will hold the new flags */
5c09d144f   David Brownell   USB: ftdi_sio whi...
2106

464cbb246   Alan Cox   ftdi_sio: Coding ...
2107
  	/* Added for xon/xoff support */
669a6db10   Alan Cox   USB: ftd_sio: cle...
2108
  	unsigned int iflag = termios->c_iflag;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2109
2110
  	unsigned char vstop;
  	unsigned char vstart;
5c09d144f   David Brownell   USB: ftdi_sio whi...
2111

464cbb246   Alan Cox   ftdi_sio: Coding ...
2112
2113
  	/* Force baud rate if this device requires it, unless it is set to
  	   B0. */
669a6db10   Alan Cox   USB: ftd_sio: cle...
2114
  	if (priv->force_baud && ((termios->c_cflag & CBAUD) != B0)) {
bfc51614b   Greg Kroah-Hartman   USB: serial: ftdi...
2115
2116
  		dev_dbg(ddev, "%s: forcing baud rate for this device
  ", __func__);
95da310e6   Alan Cox   usb_serial: API a...
2117
  		tty_encode_baud_rate(tty, priv->force_baud,
bd5e47ccb   Andrew Morton   USB: ftd_sio clea...
2118
  					priv->force_baud);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2119
2120
2121
2122
  	}
  
  	/* Force RTS-CTS if this device requires it. */
  	if (priv->force_rtscts) {
bfc51614b   Greg Kroah-Hartman   USB: serial: ftdi...
2123
2124
  		dev_dbg(ddev, "%s: forcing rtscts for this device
  ", __func__);
669a6db10   Alan Cox   USB: ftd_sio: cle...
2125
  		termios->c_cflag |= CRTSCTS;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2126
  	}
8704211f6   Colin Leitner   USB: ftdi_sio: fi...
2127
  	/*
c1f15196a   Colin Leitner   USB: ftdi_sio: ad...
2128
  	 * All FTDI UART chips are limited to CS7/8. We shouldn't pretend to
8704211f6   Colin Leitner   USB: ftdi_sio: fi...
2129
  	 * support CS5/6 and revert the CSIZE setting instead.
c1f15196a   Colin Leitner   USB: ftdi_sio: ad...
2130
2131
2132
2133
2134
2135
2136
2137
2138
2139
  	 *
  	 * CS5 however is used to control some smartcard readers which abuse
  	 * this limitation to switch modes. Original FTDI chips fall back to
  	 * eight data bits.
  	 *
  	 * TODO: Implement a quirk to only allow this with mentioned
  	 *       readers. One I know of (Argolis Smartreader V1)
  	 *       returns "USB smartcard server" as iInterface string.
  	 *       The vendor didn't bother with a custom VID/PID of
  	 *       course.
8704211f6   Colin Leitner   USB: ftdi_sio: fi...
2140
  	 */
c1f15196a   Colin Leitner   USB: ftdi_sio: ad...
2141
  	if (C_CSIZE(tty) == CS6) {
8704211f6   Colin Leitner   USB: ftdi_sio: fi...
2142
2143
2144
2145
2146
2147
2148
2149
2150
  		dev_warn(ddev, "requested CSIZE setting not supported
  ");
  
  		termios->c_cflag &= ~CSIZE;
  		if (old_termios)
  			termios->c_cflag |= old_termios->c_cflag & CSIZE;
  		else
  			termios->c_cflag |= CS8;
  	}
669a6db10   Alan Cox   USB: ftd_sio: cle...
2151
  	cflag = termios->c_cflag;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2152

a816e3113   Ying Xue   USB: ftdi_sio: Qu...
2153
  	if (!old_termios)
c515598e0   Andrew Worsley   USB: serial: ftdi...
2154
  		goto no_skip;
b1ffb4c85   Andrew Worsley   USB: Fix Corrupti...
2155
2156
2157
2158
  	if (old_termios->c_cflag == termios->c_cflag
  	    && old_termios->c_ispeed == termios->c_ispeed
  	    && old_termios->c_ospeed == termios->c_ospeed)
  		goto no_c_cflag_changes;
5c09d144f   David Brownell   USB: ftdi_sio whi...
2159
  	/* NOTE These routines can get interrupted by
464cbb246   Alan Cox   ftdi_sio: Coding ...
2160
2161
  	   ftdi_sio_read_bulk_callback  - need to examine what this means -
  	   don't see any problems yet */
5c09d144f   David Brownell   USB: ftdi_sio whi...
2162

b1ffb4c85   Andrew Worsley   USB: Fix Corrupti...
2163
2164
2165
  	if ((old_termios->c_cflag & (CSIZE|PARODD|PARENB|CMSPAR|CSTOPB)) ==
  	    (termios->c_cflag & (CSIZE|PARODD|PARENB|CMSPAR|CSTOPB)))
  		goto no_data_parity_stop_changes;
c515598e0   Andrew Worsley   USB: serial: ftdi...
2166
  no_skip:
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2167
  	/* Set number of data bits, parity, stop bits */
5c09d144f   David Brownell   USB: ftdi_sio whi...
2168

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2169
2170
2171
  	urb_value = 0;
  	urb_value |= (cflag & CSTOPB ? FTDI_SIO_SET_DATA_STOP_BITS_2 :
  		      FTDI_SIO_SET_DATA_STOP_BITS_1);
38fcb8309   Roland Koebler   USB: serial: ftdi...
2172
2173
2174
2175
2176
2177
2178
2179
2180
2181
2182
2183
  	if (cflag & PARENB) {
  		if (cflag & CMSPAR)
  			urb_value |= cflag & PARODD ?
  				     FTDI_SIO_SET_DATA_PARITY_MARK :
  				     FTDI_SIO_SET_DATA_PARITY_SPACE;
  		else
  			urb_value |= cflag & PARODD ?
  				     FTDI_SIO_SET_DATA_PARITY_ODD :
  				     FTDI_SIO_SET_DATA_PARITY_EVEN;
  	} else {
  		urb_value |= FTDI_SIO_SET_DATA_PARITY_NONE;
  	}
8704211f6   Colin Leitner   USB: ftdi_sio: fi...
2184
  	switch (cflag & CSIZE) {
c1f15196a   Colin Leitner   USB: ftdi_sio: ad...
2185
2186
2187
2188
  	case CS5:
  		dev_dbg(ddev, "Setting CS5 quirk
  ");
  		break;
8704211f6   Colin Leitner   USB: ftdi_sio: fi...
2189
2190
2191
2192
2193
2194
2195
2196
2197
2198
2199
  	case CS7:
  		urb_value |= 7;
  		dev_dbg(ddev, "Setting CS7
  ");
  		break;
  	default:
  	case CS8:
  		urb_value |= 8;
  		dev_dbg(ddev, "Setting CS8
  ");
  		break;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2200
  	}
464cbb246   Alan Cox   ftdi_sio: Coding ...
2201
2202
  	/* This is needed by the break command since it uses the same command
  	   - but is or'ed with this value  */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2203
  	priv->last_set_data_urb_value = urb_value;
5c09d144f   David Brownell   USB: ftdi_sio whi...
2204

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2205
  	if (usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
5c09d144f   David Brownell   USB: ftdi_sio whi...
2206
  			    FTDI_SIO_SET_DATA_REQUEST,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2207
2208
  			    FTDI_SIO_SET_DATA_REQUEST_TYPE,
  			    urb_value , priv->interface,
66e47e600   Johan Hovold   USB: ftdi_sio: fi...
2209
  			    NULL, 0, WDR_SHORT_TIMEOUT) < 0) {
bfc51614b   Greg Kroah-Hartman   USB: serial: ftdi...
2210
2211
2212
  		dev_err(ddev, "%s FAILED to set databits/stopbits/parity
  ",
  			__func__);
5c09d144f   David Brownell   USB: ftdi_sio whi...
2213
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2214
2215
  
  	/* Now do the baudrate */
b1ffb4c85   Andrew Worsley   USB: Fix Corrupti...
2216
  no_data_parity_stop_changes:
464cbb246   Alan Cox   ftdi_sio: Coding ...
2217
  	if ((cflag & CBAUD) == B0) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2218
2219
  		/* Disable flow control */
  		if (usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
5c09d144f   David Brownell   USB: ftdi_sio whi...
2220
  				    FTDI_SIO_SET_FLOW_CTRL_REQUEST,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2221
  				    FTDI_SIO_SET_FLOW_CTRL_REQUEST_TYPE,
5c09d144f   David Brownell   USB: ftdi_sio whi...
2222
  				    0, priv->interface,
66e47e600   Johan Hovold   USB: ftdi_sio: fi...
2223
  				    NULL, 0, WDR_TIMEOUT) < 0) {
bfc51614b   Greg Kroah-Hartman   USB: serial: ftdi...
2224
2225
  			dev_err(ddev, "%s error from disable flowcontrol urb
  ",
194343d93   Greg Kroah-Hartman   USB: remove use o...
2226
  				__func__);
5c09d144f   David Brownell   USB: ftdi_sio whi...
2227
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2228
  		/* Drop RTS and DTR */
74ede0ff5   Ian Abbott   [PATCH] USB: ftdi...
2229
  		clear_mctrl(port, TIOCM_DTR | TIOCM_RTS);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2230
2231
  	} else {
  		/* set the baudrate determined before */
9c67d28e4   Alessio Igor Bogani   USB: ftdi_sio: Fi...
2232
  		mutex_lock(&priv->cfg_lock);
464cbb246   Alan Cox   ftdi_sio: Coding ...
2233
  		if (change_speed(tty, port))
bfc51614b   Greg Kroah-Hartman   USB: serial: ftdi...
2234
2235
  			dev_err(ddev, "%s urb failed to set baudrate
  ", __func__);
9c67d28e4   Alessio Igor Bogani   USB: ftdi_sio: Fi...
2236
  		mutex_unlock(&priv->cfg_lock);
72a755fce   Peter Favrholdt   [PATCH] USB: ftdi...
2237
  		/* Ensure RTS and DTR are raised when baudrate changed from 0 */
3177130fd   Johan Hovold   USB: ftdi_sio: re...
2238
  		if (old_termios && (old_termios->c_cflag & CBAUD) == B0)
72a755fce   Peter Favrholdt   [PATCH] USB: ftdi...
2239
  			set_mctrl(port, TIOCM_DTR | TIOCM_RTS);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2240
2241
2242
2243
  	}
  
  	/* Set flow control */
  	/* Note device also supports DTR/CD (ugh) and Xon/Xoff in hardware */
b1ffb4c85   Andrew Worsley   USB: Fix Corrupti...
2244
  no_c_cflag_changes:
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2245
  	if (cflag & CRTSCTS) {
bfc51614b   Greg Kroah-Hartman   USB: serial: ftdi...
2246
2247
  		dev_dbg(ddev, "%s Setting to CRTSCTS flow control
  ", __func__);
5c09d144f   David Brownell   USB: ftdi_sio whi...
2248
  		if (usb_control_msg(dev,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2249
  				    usb_sndctrlpipe(dev, 0),
5c09d144f   David Brownell   USB: ftdi_sio whi...
2250
  				    FTDI_SIO_SET_FLOW_CTRL_REQUEST,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2251
2252
  				    FTDI_SIO_SET_FLOW_CTRL_REQUEST_TYPE,
  				    0 , (FTDI_SIO_RTS_CTS_HS | priv->interface),
66e47e600   Johan Hovold   USB: ftdi_sio: fi...
2253
  				    NULL, 0, WDR_TIMEOUT) < 0) {
bfc51614b   Greg Kroah-Hartman   USB: serial: ftdi...
2254
2255
  			dev_err(ddev, "urb failed to set to rts/cts flow control
  ");
5c09d144f   David Brownell   USB: ftdi_sio whi...
2256
  		}
5c09d144f   David Brownell   USB: ftdi_sio whi...
2257
  	} else {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2258
2259
2260
  		/*
  		 * Xon/Xoff code
  		 *
464cbb246   Alan Cox   ftdi_sio: Coding ...
2261
2262
2263
2264
  		 * Check the IXOFF status in the iflag component of the
  		 * termios structure. If IXOFF is not set, the pre-xon/xoff
  		 * code is executed.
  		 */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2265
  		if (iflag & IXOFF) {
bfc51614b   Greg Kroah-Hartman   USB: serial: ftdi...
2266
2267
2268
  			dev_dbg(ddev, "%s  request to enable xonxoff iflag=%04x
  ",
  				__func__, iflag);
464cbb246   Alan Cox   ftdi_sio: Coding ...
2269
2270
2271
2272
2273
2274
  			/* Try to enable the XON/XOFF on the ftdi_sio
  			 * Set the vstart and vstop -- could have been done up
  			 * above where a lot of other dereferencing is done but
  			 * that would be very inefficient as vstart and vstop
  			 * are not always needed.
  			 */
669a6db10   Alan Cox   USB: ftd_sio: cle...
2275
2276
  			vstart = termios->c_cc[VSTART];
  			vstop = termios->c_cc[VSTOP];
464cbb246   Alan Cox   ftdi_sio: Coding ...
2277
  			urb_value = (vstop << 8) | (vstart);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2278
2279
2280
2281
2282
2283
2284
  
  			if (usb_control_msg(dev,
  					    usb_sndctrlpipe(dev, 0),
  					    FTDI_SIO_SET_FLOW_CTRL_REQUEST,
  					    FTDI_SIO_SET_FLOW_CTRL_REQUEST_TYPE,
  					    urb_value , (FTDI_SIO_XON_XOFF_HS
  							 | priv->interface),
66e47e600   Johan Hovold   USB: ftdi_sio: fi...
2285
  					    NULL, 0, WDR_TIMEOUT) < 0) {
194343d93   Greg Kroah-Hartman   USB: remove use o...
2286
2287
2288
  				dev_err(&port->dev, "urb failed to set to "
  					"xon/xoff flow control
  ");
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2289
2290
  			}
  		} else {
464cbb246   Alan Cox   ftdi_sio: Coding ...
2291
2292
2293
  			/* else clause to only run if cflag ! CRTSCTS and iflag
  			 * ! XOFF. CHECKME Assuming XON/XOFF handled by tty
  			 * stack - not by device */
bfc51614b   Greg Kroah-Hartman   USB: serial: ftdi...
2294
2295
  			dev_dbg(ddev, "%s Turning off hardware flow control
  ", __func__);
5c09d144f   David Brownell   USB: ftdi_sio whi...
2296
  			if (usb_control_msg(dev,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2297
  					    usb_sndctrlpipe(dev, 0),
5c09d144f   David Brownell   USB: ftdi_sio whi...
2298
  					    FTDI_SIO_SET_FLOW_CTRL_REQUEST,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2299
  					    FTDI_SIO_SET_FLOW_CTRL_REQUEST_TYPE,
5c09d144f   David Brownell   USB: ftdi_sio whi...
2300
  					    0, priv->interface,
66e47e600   Johan Hovold   USB: ftdi_sio: fi...
2301
  					    NULL, 0, WDR_TIMEOUT) < 0) {
bfc51614b   Greg Kroah-Hartman   USB: serial: ftdi...
2302
2303
  				dev_err(ddev, "urb failed to clear flow control
  ");
5c09d144f   David Brownell   USB: ftdi_sio whi...
2304
  			}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2305
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2306
  	}
95da310e6   Alan Cox   usb_serial: API a...
2307
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2308

a4afff6b3   Johan Hovold   USB: ftdi_sio: re...
2309
2310
2311
2312
2313
2314
  /*
   * Get modem-control status.
   *
   * Returns the number of status bytes retrieved (device dependant), or
   * negative error code.
   */
c4133648b   Johan Hovold   USB: ftdi_sio: cl...
2315
  static int ftdi_get_modem_status(struct usb_serial_port *port,
a4afff6b3   Johan Hovold   USB: ftdi_sio: re...
2316
  						unsigned char status[2])
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2317
2318
  {
  	struct ftdi_private *priv = usb_get_serial_port_data(port);
66e47e600   Johan Hovold   USB: ftdi_sio: fi...
2319
  	unsigned char *buf;
a3f8168b7   Johan Hovold   USB: ftdi_sio: cl...
2320
  	int len;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2321
  	int ret;
66e47e600   Johan Hovold   USB: ftdi_sio: fi...
2322
2323
2324
  	buf = kmalloc(2, GFP_KERNEL);
  	if (!buf)
  		return -ENOMEM;
a3f8168b7   Johan Hovold   USB: ftdi_sio: cl...
2325
2326
2327
2328
  	/*
  	 * The 8U232AM returns a two byte value (the SIO a 1 byte value) in
  	 * the same format as the data returned from the in point.
  	 */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2329
2330
  	switch (priv->chip_type) {
  	case SIO:
a3f8168b7   Johan Hovold   USB: ftdi_sio: cl...
2331
  		len = 1;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2332
2333
2334
2335
  		break;
  	case FT8U232AM:
  	case FT232BM:
  	case FT2232C:
ed6e52829   Andrew M. Bishop   USB: ftdi_sio: Ha...
2336
  	case FT232RL:
094c2e6db   Mark Adamson   USB: serial: FTDI...
2337
2338
  	case FT2232H:
  	case FT4232H:
309427b63   Uwe Bonnes   USB: Add new FT23...
2339
  	case FT232H:
dc0827c12   Jim Paris   USB: ftdi_sio: ad...
2340
  	case FTX:
a3f8168b7   Johan Hovold   USB: ftdi_sio: cl...
2341
  		len = 2;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2342
2343
  		break;
  	default:
66e47e600   Johan Hovold   USB: ftdi_sio: fi...
2344
2345
  		ret = -EFAULT;
  		goto out;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2346
  	}
5c09d144f   David Brownell   USB: ftdi_sio whi...
2347

a3f8168b7   Johan Hovold   USB: ftdi_sio: cl...
2348
2349
2350
2351
2352
2353
  	ret = usb_control_msg(port->serial->dev,
  			usb_rcvctrlpipe(port->serial->dev, 0),
  			FTDI_SIO_GET_MODEM_STATUS_REQUEST,
  			FTDI_SIO_GET_MODEM_STATUS_REQUEST_TYPE,
  			0, priv->interface,
  			buf, len, WDR_TIMEOUT);
2c2ee5450   Johan Hovold   USB: ftdi_sio: fi...
2354
  	if (ret < 0) {
a4afff6b3   Johan Hovold   USB: ftdi_sio: re...
2355
2356
  		dev_err(&port->dev, "failed to get modem status: %d
  ", ret);
2c2ee5450   Johan Hovold   USB: ftdi_sio: fi...
2357
  		ret = usb_translate_errors(ret);
a3f8168b7   Johan Hovold   USB: ftdi_sio: cl...
2358
  		goto out;
2c2ee5450   Johan Hovold   USB: ftdi_sio: fi...
2359
  	}
a3f8168b7   Johan Hovold   USB: ftdi_sio: cl...
2360

a4afff6b3   Johan Hovold   USB: ftdi_sio: re...
2361
2362
2363
2364
2365
2366
2367
2368
2369
2370
2371
2372
2373
2374
2375
2376
2377
2378
2379
2380
2381
  	status[0] = buf[0];
  	if (ret > 1)
  		status[1] = buf[1];
  	else
  		status[1] = 0;
  
  	dev_dbg(&port->dev, "%s - 0x%02x%02x
  ", __func__, status[0],
  								status[1]);
  out:
  	kfree(buf);
  
  	return ret;
  }
  
  static int ftdi_tiocmget(struct tty_struct *tty)
  {
  	struct usb_serial_port *port = tty->driver_data;
  	struct ftdi_private *priv = usb_get_serial_port_data(port);
  	unsigned char buf[2];
  	int ret;
c4133648b   Johan Hovold   USB: ftdi_sio: cl...
2382
  	ret = ftdi_get_modem_status(port, buf);
a4afff6b3   Johan Hovold   USB: ftdi_sio: re...
2383
2384
  	if (ret < 0)
  		return ret;
fef0b828a   Johan Hovold   USB: ftdi_sio: fi...
2385
2386
2387
2388
  	ret =	(buf[0] & FTDI_SIO_DSR_MASK  ? TIOCM_DSR : 0) |
  		(buf[0] & FTDI_SIO_CTS_MASK  ? TIOCM_CTS : 0) |
  		(buf[0] & FTDI_SIO_RI_MASK   ? TIOCM_RI  : 0) |
  		(buf[0] & FTDI_SIO_RLSD_MASK ? TIOCM_CD  : 0) |
5c09d144f   David Brownell   USB: ftdi_sio whi...
2389
  		priv->last_dtr_rts;
a4afff6b3   Johan Hovold   USB: ftdi_sio: re...
2390

66e47e600   Johan Hovold   USB: ftdi_sio: fi...
2391
  	return ret;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2392
  }
20b9d1771   Alan Cox   tiocmset: kill th...
2393
  static int ftdi_tiocmset(struct tty_struct *tty,
95da310e6   Alan Cox   usb_serial: API a...
2394
  			unsigned int set, unsigned int clear)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2395
  {
95da310e6   Alan Cox   usb_serial: API a...
2396
  	struct usb_serial_port *port = tty->driver_data;
a09aa7dda   Greg Kroah-Hartman   USB: ftdi_sio.c: ...
2397

74ede0ff5   Ian Abbott   [PATCH] USB: ftdi...
2398
  	return update_mctrl(port, set, clear);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2399
  }
00a0d0d65   Alan Cox   tty: remove filp ...
2400
  static int ftdi_ioctl(struct tty_struct *tty,
464cbb246   Alan Cox   ftdi_sio: Coding ...
2401
  					unsigned int cmd, unsigned long arg)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2402
  {
95da310e6   Alan Cox   usb_serial: API a...
2403
  	struct usb_serial_port *port = tty->driver_data;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2404

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2405
2406
  	/* Based on code from acm.c and others */
  	switch (cmd) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2407
  	case TIOCGSERIAL: /* gets serial port data */
464cbb246   Alan Cox   ftdi_sio: Coding ...
2408
2409
  		return get_serial_info(port,
  					(struct serial_struct __user *) arg);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2410
2411
  
  	case TIOCSSERIAL: /* sets serial port data */
464cbb246   Alan Cox   ftdi_sio: Coding ...
2412
2413
  		return set_serial_info(tty, port,
  					(struct serial_struct __user *) arg);
c466cd2bb   Greg Kroah-Hartman   USB: serial: ftdi...
2414
2415
2416
  	case TIOCSERGETLSR:
  		return get_lsr_info(port, (struct serial_struct __user *)arg);
  		break;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2417
2418
  	default:
  		break;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2419
  	}
4d5147ec9   Johan Hovold   USB: serial: clea...
2420

95da310e6   Alan Cox   usb_serial: API a...
2421
2422
  	return -ENOIOCTLCMD;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2423

e17c1aa2e   Johan Hovold   USB: ftdi_sio: re...
2424
  module_usb_serial_driver(serial_drivers, id_table_combined);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2425

464cbb246   Alan Cox   ftdi_sio: Coding ...
2426
2427
  MODULE_AUTHOR(DRIVER_AUTHOR);
  MODULE_DESCRIPTION(DRIVER_DESC);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2428
  MODULE_LICENSE("GPL");
b760dac29   Martin Geleynse   USB: ftdi: suppor...
2429
2430
  module_param(ndi_latency_timer, int, S_IRUGO | S_IWUSR);
  MODULE_PARM_DESC(ndi_latency_timer, "NDI device latency timer override");