1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34#include <linux/kernel.h>
35#include <linux/errno.h>
36#include <linux/init.h>
37#include <linux/slab.h>
38#include <linux/tty.h>
39#include <linux/tty_driver.h>
40#include <linux/tty_flip.h>
41#include <linux/module.h>
42#include <linux/spinlock.h>
43#include <linux/mutex.h>
44#include <linux/uaccess.h>
45#include <linux/usb.h>
46#include <linux/serial.h>
47#include <linux/usb/serial.h>
48#include "ftdi_sio.h"
49#include "ftdi_sio_ids.h"
50
51
52
53
54#define DRIVER_VERSION "v1.6.0"
55#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>"
56#define DRIVER_DESC "USB FTDI Serial Converters Driver"
57
58static int debug;
59static __u16 vendor = FTDI_VID;
60static __u16 product;
61
62struct ftdi_private {
63 struct kref kref;
64 enum ftdi_chip_type chip_type;
65
66 int baud_base;
67 int custom_divisor;
68
69
70 __u16 last_set_data_urb_value ;
71
72
73
74 int flags;
75 unsigned long last_dtr_rts;
76 struct async_icount icount;
77 wait_queue_head_t delta_msr_wait;
78 char prev_status, diff_status;
79 char transmit_empty;
80 struct usb_serial_port *port;
81 __u16 interface;
82
83
84 speed_t force_baud;
85
86 int force_rtscts;
87
88
89 unsigned int latency;
90 unsigned short max_packet_size;
91 struct mutex cfg_lock;
92};
93
94
95struct ftdi_sio_quirk {
96 int (*probe)(struct usb_serial *);
97
98 void (*port_probe)(struct ftdi_private *);
99};
100
101static int ftdi_jtag_probe(struct usb_serial *serial);
102static int ftdi_mtxorb_hack_setup(struct usb_serial *serial);
103static int ftdi_NDI_device_setup(struct usb_serial *serial);
104static int ftdi_stmclite_probe(struct usb_serial *serial);
105static int ftdi_8u2232c_probe(struct usb_serial *serial);
106static void ftdi_USB_UIRT_setup(struct ftdi_private *priv);
107static void ftdi_HE_TIRA1_setup(struct ftdi_private *priv);
108
109static struct ftdi_sio_quirk ftdi_jtag_quirk = {
110 .probe = ftdi_jtag_probe,
111};
112
113static struct ftdi_sio_quirk ftdi_mtxorb_hack_quirk = {
114 .probe = ftdi_mtxorb_hack_setup,
115};
116
117static struct ftdi_sio_quirk ftdi_NDI_device_quirk = {
118 .probe = ftdi_NDI_device_setup,
119};
120
121static struct ftdi_sio_quirk ftdi_USB_UIRT_quirk = {
122 .port_probe = ftdi_USB_UIRT_setup,
123};
124
125static struct ftdi_sio_quirk ftdi_HE_TIRA1_quirk = {
126 .port_probe = ftdi_HE_TIRA1_setup,
127};
128
129static struct ftdi_sio_quirk ftdi_stmclite_quirk = {
130 .probe = ftdi_stmclite_probe,
131};
132
133static struct ftdi_sio_quirk ftdi_8u2232c_quirk = {
134 .probe = ftdi_8u2232c_probe,
135};
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159static struct usb_device_id id_table_combined [] = {
160 { USB_DEVICE(FTDI_VID, FTDI_ZEITCONTROL_TAGTRACE_MIFARE_PID) },
161 { USB_DEVICE(FTDI_VID, FTDI_CTI_MINI_PID) },
162 { USB_DEVICE(FTDI_VID, FTDI_CTI_NANO_PID) },
163 { USB_DEVICE(FTDI_VID, FTDI_AMC232_PID) },
164 { USB_DEVICE(FTDI_VID, FTDI_CANUSB_PID) },
165 { USB_DEVICE(FTDI_VID, FTDI_CANDAPTER_PID) },
166 { USB_DEVICE(FTDI_VID, FTDI_NXTCAM_PID) },
167 { USB_DEVICE(FTDI_VID, FTDI_SCS_DEVICE_0_PID) },
168 { USB_DEVICE(FTDI_VID, FTDI_SCS_DEVICE_1_PID) },
169 { USB_DEVICE(FTDI_VID, FTDI_SCS_DEVICE_2_PID) },
170 { USB_DEVICE(FTDI_VID, FTDI_SCS_DEVICE_3_PID) },
171 { USB_DEVICE(FTDI_VID, FTDI_SCS_DEVICE_4_PID) },
172 { USB_DEVICE(FTDI_VID, FTDI_SCS_DEVICE_5_PID) },
173 { USB_DEVICE(FTDI_VID, FTDI_SCS_DEVICE_6_PID) },
174 { USB_DEVICE(FTDI_VID, FTDI_SCS_DEVICE_7_PID) },
175 { USB_DEVICE(FTDI_VID, FTDI_USINT_CAT_PID) },
176 { USB_DEVICE(FTDI_VID, FTDI_USINT_WKEY_PID) },
177 { USB_DEVICE(FTDI_VID, FTDI_USINT_RS232_PID) },
178 { USB_DEVICE(FTDI_VID, FTDI_ACTZWAVE_PID) },
179 { USB_DEVICE(FTDI_VID, FTDI_IRTRANS_PID) },
180 { USB_DEVICE(FTDI_VID, FTDI_IPLUS_PID) },
181 { USB_DEVICE(FTDI_VID, FTDI_IPLUS2_PID) },
182 { USB_DEVICE(FTDI_VID, FTDI_DMX4ALL) },
183 { USB_DEVICE(FTDI_VID, FTDI_SIO_PID) },
184 { USB_DEVICE(FTDI_VID, FTDI_8U232AM_PID) },
185 { USB_DEVICE(FTDI_VID, FTDI_8U232AM_ALT_PID) },
186 { USB_DEVICE(FTDI_VID, FTDI_232RL_PID) },
187 { USB_DEVICE(FTDI_VID, FTDI_8U2232C_PID) ,
188 .driver_info = (kernel_ulong_t)&ftdi_8u2232c_quirk },
189 { USB_DEVICE(FTDI_VID, FTDI_4232H_PID) },
190 { USB_DEVICE(FTDI_VID, FTDI_232H_PID) },
191 { USB_DEVICE(FTDI_VID, FTDI_MICRO_CHAMELEON_PID) },
192 { USB_DEVICE(FTDI_VID, FTDI_RELAIS_PID) },
193 { USB_DEVICE(FTDI_VID, FTDI_OPENDCC_PID) },
194 { USB_DEVICE(FTDI_VID, FTDI_OPENDCC_SNIFFER_PID) },
195 { USB_DEVICE(FTDI_VID, FTDI_OPENDCC_THROTTLE_PID) },
196 { USB_DEVICE(FTDI_VID, FTDI_OPENDCC_GATEWAY_PID) },
197 { USB_DEVICE(FTDI_VID, FTDI_OPENDCC_GBM_PID) },
198 { USB_DEVICE(INTERBIOMETRICS_VID, INTERBIOMETRICS_IOBOARD_PID) },
199 { USB_DEVICE(INTERBIOMETRICS_VID, INTERBIOMETRICS_MINI_IOBOARD_PID) },
200 { USB_DEVICE(FTDI_VID, FTDI_SPROG_II) },
201 { USB_DEVICE(FTDI_VID, FTDI_LENZ_LIUSB_PID) },
202 { USB_DEVICE(FTDI_VID, FTDI_XF_632_PID) },
203 { USB_DEVICE(FTDI_VID, FTDI_XF_634_PID) },
204 { USB_DEVICE(FTDI_VID, FTDI_XF_547_PID) },
205 { USB_DEVICE(FTDI_VID, FTDI_XF_633_PID) },
206 { USB_DEVICE(FTDI_VID, FTDI_XF_631_PID) },
207 { USB_DEVICE(FTDI_VID, FTDI_XF_635_PID) },
208 { USB_DEVICE(FTDI_VID, FTDI_XF_640_PID) },
209 { USB_DEVICE(FTDI_VID, FTDI_XF_642_PID) },
210 { USB_DEVICE(FTDI_VID, FTDI_DSS20_PID) },
211 { USB_DEVICE(FTDI_VID, FTDI_URBAN_0_PID) },
212 { USB_DEVICE(FTDI_VID, FTDI_URBAN_1_PID) },
213 { USB_DEVICE(FTDI_NF_RIC_VID, FTDI_NF_RIC_PID) },
214 { USB_DEVICE(FTDI_VID, FTDI_VNHCPCUSB_D_PID) },
215 { USB_DEVICE(FTDI_VID, FTDI_MTXORB_0_PID) },
216 { USB_DEVICE(FTDI_VID, FTDI_MTXORB_1_PID) },
217 { USB_DEVICE(FTDI_VID, FTDI_MTXORB_2_PID) },
218 { USB_DEVICE(FTDI_VID, FTDI_MTXORB_3_PID) },
219 { USB_DEVICE(FTDI_VID, FTDI_MTXORB_4_PID) },
220 { USB_DEVICE(FTDI_VID, FTDI_MTXORB_5_PID) },
221 { USB_DEVICE(FTDI_VID, FTDI_MTXORB_6_PID) },
222 { USB_DEVICE(FTDI_VID, FTDI_R2000KU_TRUE_RNG) },
223 { USB_DEVICE(FTDI_VID, FTDI_VARDAAN_PID) },
224 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0100_PID) },
225 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0101_PID) },
226 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0102_PID) },
227 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0103_PID) },
228 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0104_PID) },
229 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0105_PID) },
230 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0106_PID) },
231 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0107_PID) },
232 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0108_PID) },
233 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0109_PID) },
234 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_010A_PID) },
235 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_010B_PID) },
236 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_010C_PID) },
237 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_010D_PID) },
238 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_010E_PID) },
239 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_010F_PID) },
240 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0110_PID) },
241 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0111_PID) },
242 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0112_PID) },
243 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0113_PID) },
244 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0114_PID) },
245 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0115_PID) },
246 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0116_PID) },
247 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0117_PID) },
248 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0118_PID) },
249 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0119_PID) },
250 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_011A_PID) },
251 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_011B_PID) },
252 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_011C_PID) },
253 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_011D_PID) },
254 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_011E_PID) },
255 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_011F_PID) },
256 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0120_PID) },
257 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0121_PID) },
258 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0122_PID) },
259 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0123_PID) },
260 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0124_PID) },
261 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0125_PID) },
262 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0126_PID) },
263 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0127_PID),
264 .driver_info = (kernel_ulong_t)&ftdi_mtxorb_hack_quirk },
265 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0128_PID) },
266 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0129_PID) },
267 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_012A_PID) },
268 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_012B_PID) },
269 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_012C_PID),
270 .driver_info = (kernel_ulong_t)&ftdi_mtxorb_hack_quirk },
271 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_012D_PID) },
272 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_012E_PID) },
273 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_012F_PID) },
274 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0130_PID) },
275 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0131_PID) },
276 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0132_PID) },
277 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0133_PID) },
278 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0134_PID) },
279 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0135_PID) },
280 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0136_PID) },
281 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0137_PID) },
282 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0138_PID) },
283 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0139_PID) },
284 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_013A_PID) },
285 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_013B_PID) },
286 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_013C_PID) },
287 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_013D_PID) },
288 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_013E_PID) },
289 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_013F_PID) },
290 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0140_PID) },
291 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0141_PID) },
292 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0142_PID) },
293 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0143_PID) },
294 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0144_PID) },
295 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0145_PID) },
296 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0146_PID) },
297 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0147_PID) },
298 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0148_PID) },
299 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0149_PID) },
300 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_014A_PID) },
301 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_014B_PID) },
302 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_014C_PID) },
303 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_014D_PID) },
304 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_014E_PID) },
305 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_014F_PID) },
306 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0150_PID) },
307 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0151_PID) },
308 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0152_PID) },
309 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0153_PID),
310 .driver_info = (kernel_ulong_t)&ftdi_mtxorb_hack_quirk },
311 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0154_PID),
312 .driver_info = (kernel_ulong_t)&ftdi_mtxorb_hack_quirk },
313 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0155_PID),
314 .driver_info = (kernel_ulong_t)&ftdi_mtxorb_hack_quirk },
315 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0156_PID),
316 .driver_info = (kernel_ulong_t)&ftdi_mtxorb_hack_quirk },
317 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0157_PID),
318 .driver_info = (kernel_ulong_t)&ftdi_mtxorb_hack_quirk },
319 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0158_PID),
320 .driver_info = (kernel_ulong_t)&ftdi_mtxorb_hack_quirk },
321 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0159_PID) },
322 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_015A_PID) },
323 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_015B_PID) },
324 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_015C_PID) },
325 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_015D_PID) },
326 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_015E_PID) },
327 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_015F_PID) },
328 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0160_PID) },
329 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0161_PID) },
330 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0162_PID) },
331 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0163_PID) },
332 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0164_PID) },
333 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0165_PID) },
334 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0166_PID) },
335 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0167_PID) },
336 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0168_PID) },
337 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0169_PID) },
338 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_016A_PID) },
339 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_016B_PID) },
340 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_016C_PID) },
341 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_016D_PID) },
342 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_016E_PID) },
343 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_016F_PID) },
344 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0170_PID) },
345 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0171_PID) },
346 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0172_PID) },
347 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0173_PID) },
348 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0174_PID) },
349 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0175_PID) },
350 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0176_PID) },
351 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0177_PID) },
352 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0178_PID) },
353 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0179_PID) },
354 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_017A_PID) },
355 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_017B_PID) },
356 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_017C_PID) },
357 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_017D_PID) },
358 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_017E_PID) },
359 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_017F_PID) },
360 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0180_PID) },
361 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0181_PID) },
362 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0182_PID) },
363 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0183_PID) },
364 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0184_PID) },
365 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0185_PID) },
366 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0186_PID) },
367 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0187_PID) },
368 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0188_PID) },
369 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0189_PID) },
370 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_018A_PID) },
371 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_018B_PID) },
372 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_018C_PID) },
373 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_018D_PID) },
374 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_018E_PID) },
375 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_018F_PID) },
376 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0190_PID) },
377 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0191_PID) },
378 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0192_PID) },
379 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0193_PID) },
380 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0194_PID) },
381 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0195_PID) },
382 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0196_PID) },
383 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0197_PID) },
384 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0198_PID) },
385 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0199_PID) },
386 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_019A_PID) },
387 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_019B_PID) },
388 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_019C_PID) },
389 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_019D_PID) },
390 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_019E_PID) },
391 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_019F_PID) },
392 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01A0_PID) },
393 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01A1_PID) },
394 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01A2_PID) },
395 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01A3_PID) },
396 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01A4_PID) },
397 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01A5_PID) },
398 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01A6_PID) },
399 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01A7_PID) },
400 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01A8_PID) },
401 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01A9_PID) },
402 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01AA_PID) },
403 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01AB_PID) },
404 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01AC_PID) },
405 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01AD_PID) },
406 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01AE_PID) },
407 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01AF_PID) },
408 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01B0_PID) },
409 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01B1_PID) },
410 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01B2_PID) },
411 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01B3_PID) },
412 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01B4_PID) },
413 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01B5_PID) },
414 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01B6_PID) },
415 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01B7_PID) },
416 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01B8_PID) },
417 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01B9_PID) },
418 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01BA_PID) },
419 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01BB_PID) },
420 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01BC_PID) },
421 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01BD_PID) },
422 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01BE_PID) },
423 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01BF_PID) },
424 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01C0_PID) },
425 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01C1_PID) },
426 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01C2_PID) },
427 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01C3_PID) },
428 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01C4_PID) },
429 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01C5_PID) },
430 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01C6_PID) },
431 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01C7_PID) },
432 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01C8_PID) },
433 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01C9_PID) },
434 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01CA_PID) },
435 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01CB_PID) },
436 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01CC_PID) },
437 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01CD_PID) },
438 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01CE_PID) },
439 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01CF_PID) },
440 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01D0_PID) },
441 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01D1_PID) },
442 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01D2_PID) },
443 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01D3_PID) },
444 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01D4_PID) },
445 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01D5_PID) },
446 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01D6_PID) },
447 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01D7_PID) },
448 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01D8_PID) },
449 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01D9_PID) },
450 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01DA_PID) },
451 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01DB_PID) },
452 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01DC_PID) },
453 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01DD_PID) },
454 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01DE_PID) },
455 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01DF_PID) },
456 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01E0_PID) },
457 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01E1_PID) },
458 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01E2_PID) },
459 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01E3_PID) },
460 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01E4_PID) },
461 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01E5_PID) },
462 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01E6_PID) },
463 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01E7_PID) },
464 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01E8_PID) },
465 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01E9_PID) },
466 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01EA_PID) },
467 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01EB_PID) },
468 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01EC_PID) },
469 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01ED_PID) },
470 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01EE_PID) },
471 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01EF_PID) },
472 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01F0_PID) },
473 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01F1_PID) },
474 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01F2_PID) },
475 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01F3_PID) },
476 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01F4_PID) },
477 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01F5_PID) },
478 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01F6_PID) },
479 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01F7_PID) },
480 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01F8_PID) },
481 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01F9_PID) },
482 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01FA_PID) },
483 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01FB_PID) },
484 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01FC_PID) },
485 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01FD_PID) },
486 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01FE_PID) },
487 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01FF_PID) },
488 { USB_DEVICE(FTDI_VID, FTDI_PERLE_ULTRAPORT_PID) },
489 { USB_DEVICE(FTDI_VID, FTDI_PIEGROUP_PID) },
490 { USB_DEVICE(FTDI_VID, FTDI_TNC_X_PID) },
491 { USB_DEVICE(FTDI_VID, FTDI_USBX_707_PID) },
492 { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2101_PID) },
493 { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2102_PID) },
494 { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2103_PID) },
495 { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2104_PID) },
496 { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2106_PID) },
497 { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2201_1_PID) },
498 { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2201_2_PID) },
499 { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2202_1_PID) },
500 { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2202_2_PID) },
501 { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2203_1_PID) },
502 { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2203_2_PID) },
503 { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2401_1_PID) },
504 { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2401_2_PID) },
505 { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2401_3_PID) },
506 { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2401_4_PID) },
507 { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2402_1_PID) },
508 { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2402_2_PID) },
509 { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2402_3_PID) },
510 { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2402_4_PID) },
511 { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2403_1_PID) },
512 { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2403_2_PID) },
513 { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2403_3_PID) },
514 { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2403_4_PID) },
515 { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2801_1_PID) },
516 { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2801_2_PID) },
517 { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2801_3_PID) },
518 { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2801_4_PID) },
519 { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2801_5_PID) },
520 { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2801_6_PID) },
521 { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2801_7_PID) },
522 { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2801_8_PID) },
523 { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2802_1_PID) },
524 { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2802_2_PID) },
525 { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2802_3_PID) },
526 { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2802_4_PID) },
527 { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2802_5_PID) },
528 { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2802_6_PID) },
529 { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2802_7_PID) },
530 { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2802_8_PID) },
531 { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2803_1_PID) },
532 { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2803_2_PID) },
533 { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2803_3_PID) },
534 { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2803_4_PID) },
535 { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2803_5_PID) },
536 { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2803_6_PID) },
537 { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2803_7_PID) },
538 { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2803_8_PID) },
539 { USB_DEVICE(IDTECH_VID, IDTECH_IDT1221U_PID) },
540 { USB_DEVICE(OCT_VID, OCT_US101_PID) },
541 { USB_DEVICE(OCT_VID, OCT_DK201_PID) },
542 { USB_DEVICE(FTDI_VID, FTDI_HE_TIRA1_PID),
543 .driver_info = (kernel_ulong_t)&ftdi_HE_TIRA1_quirk },
544 { USB_DEVICE(FTDI_VID, FTDI_USB_UIRT_PID),
545 .driver_info = (kernel_ulong_t)&ftdi_USB_UIRT_quirk },
546 { USB_DEVICE(FTDI_VID, PROTEGO_SPECIAL_1) },
547 { USB_DEVICE(FTDI_VID, PROTEGO_R2X0) },
548 { USB_DEVICE(FTDI_VID, PROTEGO_SPECIAL_3) },
549 { USB_DEVICE(FTDI_VID, PROTEGO_SPECIAL_4) },
550 { USB_DEVICE(FTDI_VID, FTDI_GUDEADS_E808_PID) },
551 { USB_DEVICE(FTDI_VID, FTDI_GUDEADS_E809_PID) },
552 { USB_DEVICE(FTDI_VID, FTDI_GUDEADS_E80A_PID) },
553 { USB_DEVICE(FTDI_VID, FTDI_GUDEADS_E80B_PID) },
554 { USB_DEVICE(FTDI_VID, FTDI_GUDEADS_E80C_PID) },
555 { USB_DEVICE(FTDI_VID, FTDI_GUDEADS_E80D_PID) },
556 { USB_DEVICE(FTDI_VID, FTDI_GUDEADS_E80E_PID) },
557 { USB_DEVICE(FTDI_VID, FTDI_GUDEADS_E80F_PID) },
558 { USB_DEVICE(FTDI_VID, FTDI_GUDEADS_E888_PID) },
559 { USB_DEVICE(FTDI_VID, FTDI_GUDEADS_E889_PID) },
560 { USB_DEVICE(FTDI_VID, FTDI_GUDEADS_E88A_PID) },
561 { USB_DEVICE(FTDI_VID, FTDI_GUDEADS_E88B_PID) },
562 { USB_DEVICE(FTDI_VID, FTDI_GUDEADS_E88C_PID) },
563 { USB_DEVICE(FTDI_VID, FTDI_GUDEADS_E88D_PID) },
564 { USB_DEVICE(FTDI_VID, FTDI_GUDEADS_E88E_PID) },
565 { USB_DEVICE(FTDI_VID, FTDI_GUDEADS_E88F_PID) },
566 { USB_DEVICE(FTDI_VID, FTDI_ELV_UO100_PID) },
567 { USB_DEVICE(FTDI_VID, FTDI_ELV_UM100_PID) },
568 { USB_DEVICE(FTDI_VID, FTDI_ELV_UR100_PID) },
569 { USB_DEVICE(FTDI_VID, FTDI_ELV_ALC8500_PID) },
570 { USB_DEVICE(FTDI_VID, FTDI_PYRAMID_PID) },
571 { USB_DEVICE(FTDI_VID, FTDI_ELV_FHZ1000PC_PID) },
572 { USB_DEVICE(FTDI_VID, FTDI_IBS_US485_PID) },
573 { USB_DEVICE(FTDI_VID, FTDI_IBS_PICPRO_PID) },
574 { USB_DEVICE(FTDI_VID, FTDI_IBS_PCMCIA_PID) },
575 { USB_DEVICE(FTDI_VID, FTDI_IBS_PK1_PID) },
576 { USB_DEVICE(FTDI_VID, FTDI_IBS_RS232MON_PID) },
577 { USB_DEVICE(FTDI_VID, FTDI_IBS_APP70_PID) },
578 { USB_DEVICE(FTDI_VID, FTDI_IBS_PEDO_PID) },
579 { USB_DEVICE(FTDI_VID, FTDI_IBS_PROD_PID) },
580 { USB_DEVICE(FTDI_VID, FTDI_TAVIR_STK500_PID) },
581
582
583
584 { USB_DEVICE(FTDI_VID, FTDI_ELV_USR_PID) },
585 { USB_DEVICE(FTDI_VID, FTDI_ELV_MSM1_PID) },
586 { USB_DEVICE(FTDI_VID, FTDI_ELV_KL100_PID) },
587 { USB_DEVICE(FTDI_VID, FTDI_ELV_WS550_PID) },
588 { USB_DEVICE(FTDI_VID, FTDI_ELV_EC3000_PID) },
589 { USB_DEVICE(FTDI_VID, FTDI_ELV_WS888_PID) },
590 { USB_DEVICE(FTDI_VID, FTDI_ELV_TWS550_PID) },
591 { USB_DEVICE(FTDI_VID, FTDI_ELV_FEM_PID) },
592 { USB_DEVICE(FTDI_VID, FTDI_ELV_CLI7000_PID) },
593 { USB_DEVICE(FTDI_VID, FTDI_ELV_PPS7330_PID) },
594 { USB_DEVICE(FTDI_VID, FTDI_ELV_TFM100_PID) },
595 { USB_DEVICE(FTDI_VID, FTDI_ELV_UDF77_PID) },
596 { USB_DEVICE(FTDI_VID, FTDI_ELV_UIO88_PID) },
597 { USB_DEVICE(FTDI_VID, FTDI_ELV_UAD8_PID) },
598 { USB_DEVICE(FTDI_VID, FTDI_ELV_UDA7_PID) },
599 { USB_DEVICE(FTDI_VID, FTDI_ELV_USI2_PID) },
600 { USB_DEVICE(FTDI_VID, FTDI_ELV_T1100_PID) },
601 { USB_DEVICE(FTDI_VID, FTDI_ELV_PCD200_PID) },
602 { USB_DEVICE(FTDI_VID, FTDI_ELV_ULA200_PID) },
603 { USB_DEVICE(FTDI_VID, FTDI_ELV_CSI8_PID) },
604 { USB_DEVICE(FTDI_VID, FTDI_ELV_EM1000DL_PID) },
605 { USB_DEVICE(FTDI_VID, FTDI_ELV_PCK100_PID) },
606 { USB_DEVICE(FTDI_VID, FTDI_ELV_RFP500_PID) },
607 { USB_DEVICE(FTDI_VID, FTDI_ELV_FS20SIG_PID) },
608 { USB_DEVICE(FTDI_VID, FTDI_ELV_UTP8_PID) },
609 { USB_DEVICE(FTDI_VID, FTDI_ELV_WS300PC_PID) },
610 { USB_DEVICE(FTDI_VID, FTDI_ELV_WS444PC_PID) },
611 { USB_DEVICE(FTDI_VID, FTDI_ELV_FHZ1300PC_PID) },
612 { USB_DEVICE(FTDI_VID, FTDI_ELV_EM1010PC_PID) },
613 { USB_DEVICE(FTDI_VID, FTDI_ELV_WS500_PID) },
614 { USB_DEVICE(FTDI_VID, FTDI_ELV_HS485_PID) },
615 { USB_DEVICE(FTDI_VID, FTDI_ELV_UMS100_PID) },
616 { USB_DEVICE(FTDI_VID, FTDI_ELV_TFD128_PID) },
617 { USB_DEVICE(FTDI_VID, FTDI_ELV_FM3RX_PID) },
618 { USB_DEVICE(FTDI_VID, FTDI_ELV_WS777_PID) },
619 { USB_DEVICE(FTDI_VID, LINX_SDMUSBQSS_PID) },
620 { USB_DEVICE(FTDI_VID, LINX_MASTERDEVEL2_PID) },
621 { USB_DEVICE(FTDI_VID, LINX_FUTURE_0_PID) },
622 { USB_DEVICE(FTDI_VID, LINX_FUTURE_1_PID) },
623 { USB_DEVICE(FTDI_VID, LINX_FUTURE_2_PID) },
624 { USB_DEVICE(FTDI_VID, FTDI_CCSICDU20_0_PID) },
625 { USB_DEVICE(FTDI_VID, FTDI_CCSICDU40_1_PID) },
626 { USB_DEVICE(FTDI_VID, FTDI_CCSMACHX_2_PID) },
627 { USB_DEVICE(FTDI_VID, FTDI_CCSLOAD_N_GO_3_PID) },
628 { USB_DEVICE(FTDI_VID, FTDI_CCSICDU64_4_PID) },
629 { USB_DEVICE(FTDI_VID, FTDI_CCSPRIME8_5_PID) },
630 { USB_DEVICE(FTDI_VID, INSIDE_ACCESSO) },
631 { USB_DEVICE(INTREPID_VID, INTREPID_VALUECAN_PID) },
632 { USB_DEVICE(INTREPID_VID, INTREPID_NEOVI_PID) },
633 { USB_DEVICE(FALCOM_VID, FALCOM_TWIST_PID) },
634 { USB_DEVICE(FALCOM_VID, FALCOM_SAMBA_PID) },
635 { USB_DEVICE(FTDI_VID, FTDI_SUUNTO_SPORTS_PID) },
636 { USB_DEVICE(FTDI_VID, FTDI_OCEANIC_PID) },
637 { USB_DEVICE(TTI_VID, TTI_QL355P_PID) },
638 { USB_DEVICE(FTDI_VID, FTDI_RM_CANVIEW_PID) },
639 { USB_DEVICE(ACTON_VID, ACTON_SPECTRAPRO_PID) },
640 { USB_DEVICE(CONTEC_VID, CONTEC_COM1USBH_PID) },
641 { USB_DEVICE(BANDB_VID, BANDB_USOTL4_PID) },
642 { USB_DEVICE(BANDB_VID, BANDB_USTL4_PID) },
643 { USB_DEVICE(BANDB_VID, BANDB_USO9ML2_PID) },
644 { USB_DEVICE(BANDB_VID, BANDB_USOPTL4_PID) },
645 { USB_DEVICE(BANDB_VID, BANDB_USPTL4_PID) },
646 { USB_DEVICE(BANDB_VID, BANDB_USO9ML2DR_2_PID) },
647 { USB_DEVICE(BANDB_VID, BANDB_USO9ML2DR_PID) },
648 { USB_DEVICE(BANDB_VID, BANDB_USOPTL4DR2_PID) },
649 { USB_DEVICE(BANDB_VID, BANDB_USOPTL4DR_PID) },
650 { USB_DEVICE(BANDB_VID, BANDB_485USB9F_2W_PID) },
651 { USB_DEVICE(BANDB_VID, BANDB_485USB9F_4W_PID) },
652 { USB_DEVICE(BANDB_VID, BANDB_232USB9M_PID) },
653 { USB_DEVICE(BANDB_VID, BANDB_485USBTB_2W_PID) },
654 { USB_DEVICE(BANDB_VID, BANDB_485USBTB_4W_PID) },
655 { USB_DEVICE(BANDB_VID, BANDB_TTL5USB9M_PID) },
656 { USB_DEVICE(BANDB_VID, BANDB_TTL3USB9M_PID) },
657 { USB_DEVICE(BANDB_VID, BANDB_ZZ_PROG1_USB_PID) },
658 { USB_DEVICE(FTDI_VID, EVER_ECO_PRO_CDS) },
659 { USB_DEVICE(FTDI_VID, FTDI_4N_GALAXY_DE_1_PID) },
660 { USB_DEVICE(FTDI_VID, FTDI_4N_GALAXY_DE_2_PID) },
661 { USB_DEVICE(FTDI_VID, FTDI_4N_GALAXY_DE_3_PID) },
662 { USB_DEVICE(FTDI_VID, XSENS_CONVERTER_0_PID) },
663 { USB_DEVICE(FTDI_VID, XSENS_CONVERTER_1_PID) },
664 { USB_DEVICE(FTDI_VID, XSENS_CONVERTER_2_PID) },
665 { USB_DEVICE(FTDI_VID, XSENS_CONVERTER_3_PID) },
666 { USB_DEVICE(FTDI_VID, XSENS_CONVERTER_4_PID) },
667 { USB_DEVICE(FTDI_VID, XSENS_CONVERTER_5_PID) },
668 { USB_DEVICE(FTDI_VID, XSENS_CONVERTER_6_PID) },
669 { USB_DEVICE(FTDI_VID, XSENS_CONVERTER_7_PID) },
670 { USB_DEVICE(MOBILITY_VID, MOBILITY_USB_SERIAL_PID) },
671 { USB_DEVICE(FTDI_VID, FTDI_ACTIVE_ROBOTS_PID) },
672 { USB_DEVICE(FTDI_VID, FTDI_MHAM_KW_PID) },
673 { USB_DEVICE(FTDI_VID, FTDI_MHAM_YS_PID) },
674 { USB_DEVICE(FTDI_VID, FTDI_MHAM_Y6_PID) },
675 { USB_DEVICE(FTDI_VID, FTDI_MHAM_Y8_PID) },
676 { USB_DEVICE(FTDI_VID, FTDI_MHAM_IC_PID) },
677 { USB_DEVICE(FTDI_VID, FTDI_MHAM_DB9_PID) },
678 { USB_DEVICE(FTDI_VID, FTDI_MHAM_RS232_PID) },
679 { USB_DEVICE(FTDI_VID, FTDI_MHAM_Y9_PID) },
680 { USB_DEVICE(FTDI_VID, FTDI_TERATRONIK_VCP_PID) },
681 { USB_DEVICE(FTDI_VID, FTDI_TERATRONIK_D2XX_PID) },
682 { USB_DEVICE(EVOLUTION_VID, EVOLUTION_ER1_PID) },
683 { USB_DEVICE(EVOLUTION_VID, EVO_HYBRID_PID) },
684 { USB_DEVICE(EVOLUTION_VID, EVO_RCM4_PID) },
685 { USB_DEVICE(FTDI_VID, FTDI_ARTEMIS_PID) },
686 { USB_DEVICE(FTDI_VID, FTDI_ATIK_ATK16_PID) },
687 { USB_DEVICE(FTDI_VID, FTDI_ATIK_ATK16C_PID) },
688 { USB_DEVICE(FTDI_VID, FTDI_ATIK_ATK16HR_PID) },
689 { USB_DEVICE(FTDI_VID, FTDI_ATIK_ATK16HRC_PID) },
690 { USB_DEVICE(FTDI_VID, FTDI_ATIK_ATK16IC_PID) },
691 { USB_DEVICE(KOBIL_VID, KOBIL_CONV_B1_PID) },
692 { USB_DEVICE(KOBIL_VID, KOBIL_CONV_KAAN_PID) },
693 { USB_DEVICE(POSIFLEX_VID, POSIFLEX_PP7000_PID) },
694 { USB_DEVICE(FTDI_VID, FTDI_TTUSB_PID) },
695 { USB_DEVICE(FTDI_VID, FTDI_ECLO_COM_1WIRE_PID) },
696 { USB_DEVICE(FTDI_VID, FTDI_WESTREX_MODEL_777_PID) },
697 { USB_DEVICE(FTDI_VID, FTDI_WESTREX_MODEL_8900F_PID) },
698 { USB_DEVICE(FTDI_VID, FTDI_PCDJ_DAC2_PID) },
699 { USB_DEVICE(FTDI_VID, FTDI_RRCIRKITS_LOCOBUFFER_PID) },
700 { USB_DEVICE(FTDI_VID, FTDI_ASK_RDR400_PID) },
701 { USB_DEVICE(ICOM_VID, ICOM_ID_1_PID) },
702 { USB_DEVICE(ICOM_VID, ICOM_OPC_U_UC_PID) },
703 { USB_DEVICE(ICOM_VID, ICOM_ID_RP2C1_PID) },
704 { USB_DEVICE(ICOM_VID, ICOM_ID_RP2C2_PID) },
705 { USB_DEVICE(ICOM_VID, ICOM_ID_RP2D_PID) },
706 { USB_DEVICE(ICOM_VID, ICOM_ID_RP2VT_PID) },
707 { USB_DEVICE(ICOM_VID, ICOM_ID_RP2VR_PID) },
708 { USB_DEVICE(ICOM_VID, ICOM_ID_RP4KVT_PID) },
709 { USB_DEVICE(ICOM_VID, ICOM_ID_RP4KVR_PID) },
710 { USB_DEVICE(ICOM_VID, ICOM_ID_RP2KVT_PID) },
711 { USB_DEVICE(ICOM_VID, ICOM_ID_RP2KVR_PID) },
712 { USB_DEVICE(FTDI_VID, FTDI_ACG_HFDUAL_PID) },
713 { USB_DEVICE(FTDI_VID, FTDI_YEI_SERVOCENTER31_PID) },
714 { USB_DEVICE(FTDI_VID, FTDI_THORLABS_PID) },
715 { USB_DEVICE(TESTO_VID, TESTO_USB_INTERFACE_PID) },
716 { USB_DEVICE(FTDI_VID, FTDI_GAMMA_SCOUT_PID) },
717 { USB_DEVICE(FTDI_VID, FTDI_TACTRIX_OPENPORT_13M_PID) },
718 { USB_DEVICE(FTDI_VID, FTDI_TACTRIX_OPENPORT_13S_PID) },
719 { USB_DEVICE(FTDI_VID, FTDI_TACTRIX_OPENPORT_13U_PID) },
720 { USB_DEVICE(ELEKTOR_VID, ELEKTOR_FT323R_PID) },
721 { USB_DEVICE(FTDI_VID, FTDI_NDI_HUC_PID),
722 .driver_info = (kernel_ulong_t)&ftdi_NDI_device_quirk },
723 { USB_DEVICE(FTDI_VID, FTDI_NDI_SPECTRA_SCU_PID),
724 .driver_info = (kernel_ulong_t)&ftdi_NDI_device_quirk },
725 { USB_DEVICE(FTDI_VID, FTDI_NDI_FUTURE_2_PID),
726 .driver_info = (kernel_ulong_t)&ftdi_NDI_device_quirk },
727 { USB_DEVICE(FTDI_VID, FTDI_NDI_FUTURE_3_PID),
728 .driver_info = (kernel_ulong_t)&ftdi_NDI_device_quirk },
729 { USB_DEVICE(FTDI_VID, FTDI_NDI_AURORA_SCU_PID),
730 .driver_info = (kernel_ulong_t)&ftdi_NDI_device_quirk },
731 { USB_DEVICE(TELLDUS_VID, TELLDUS_TELLSTICK_PID) },
732 { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_SERIAL_VX7_PID) },
733 { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_CT29B_PID) },
734 { USB_DEVICE(FTDI_VID, FTDI_MAXSTREAM_PID) },
735 { USB_DEVICE(FTDI_VID, FTDI_PHI_FISCO_PID) },
736 { USB_DEVICE(TML_VID, TML_USB_SERIAL_PID) },
737 { USB_DEVICE(FTDI_VID, FTDI_ELSTER_UNICOM_PID) },
738 { USB_DEVICE(FTDI_VID, FTDI_PROPOX_JTAGCABLEII_PID) },
739 { USB_DEVICE(FTDI_VID, FTDI_PROPOX_ISPCABLEIII_PID) },
740 { USB_DEVICE(OLIMEX_VID, OLIMEX_ARM_USB_OCD_PID),
741 .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
742 { USB_DEVICE(OLIMEX_VID, OLIMEX_ARM_USB_OCD_H_PID),
743 .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
744 { USB_DEVICE(FIC_VID, FIC_NEO1973_DEBUG_PID),
745 .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
746 { USB_DEVICE(FTDI_VID, FTDI_OOCDLINK_PID),
747 .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
748 { USB_DEVICE(FTDI_VID, LMI_LM3S_DEVEL_BOARD_PID),
749 .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
750 { USB_DEVICE(FTDI_VID, LMI_LM3S_EVAL_BOARD_PID),
751 .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
752 { USB_DEVICE(FTDI_VID, LMI_LM3S_ICDI_BOARD_PID),
753 .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
754 { USB_DEVICE(FTDI_VID, FTDI_TURTELIZER_PID),
755 .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
756 { USB_DEVICE(RATOC_VENDOR_ID, RATOC_PRODUCT_ID_USB60F) },
757 { USB_DEVICE(FTDI_VID, FTDI_REU_TINY_PID) },
758
759
760 { USB_DEVICE(PAPOUCH_VID, PAPOUCH_SB485_PID) },
761 { USB_DEVICE(PAPOUCH_VID, PAPOUCH_AP485_PID) },
762 { USB_DEVICE(PAPOUCH_VID, PAPOUCH_SB422_PID) },
763 { USB_DEVICE(PAPOUCH_VID, PAPOUCH_SB485_2_PID) },
764 { USB_DEVICE(PAPOUCH_VID, PAPOUCH_AP485_2_PID) },
765 { USB_DEVICE(PAPOUCH_VID, PAPOUCH_SB422_2_PID) },
766 { USB_DEVICE(PAPOUCH_VID, PAPOUCH_SB485S_PID) },
767 { USB_DEVICE(PAPOUCH_VID, PAPOUCH_SB485C_PID) },
768 { USB_DEVICE(PAPOUCH_VID, PAPOUCH_LEC_PID) },
769 { USB_DEVICE(PAPOUCH_VID, PAPOUCH_SB232_PID) },
770 { USB_DEVICE(PAPOUCH_VID, PAPOUCH_TMU_PID) },
771 { USB_DEVICE(PAPOUCH_VID, PAPOUCH_IRAMP_PID) },
772 { USB_DEVICE(PAPOUCH_VID, PAPOUCH_DRAK5_PID) },
773 { USB_DEVICE(PAPOUCH_VID, PAPOUCH_QUIDO8x8_PID) },
774 { USB_DEVICE(PAPOUCH_VID, PAPOUCH_QUIDO4x4_PID) },
775 { USB_DEVICE(PAPOUCH_VID, PAPOUCH_QUIDO2x2_PID) },
776 { USB_DEVICE(PAPOUCH_VID, PAPOUCH_QUIDO10x1_PID) },
777 { USB_DEVICE(PAPOUCH_VID, PAPOUCH_QUIDO30x3_PID) },
778 { USB_DEVICE(PAPOUCH_VID, PAPOUCH_QUIDO60x3_PID) },
779 { USB_DEVICE(PAPOUCH_VID, PAPOUCH_QUIDO2x16_PID) },
780 { USB_DEVICE(PAPOUCH_VID, PAPOUCH_QUIDO3x32_PID) },
781 { USB_DEVICE(PAPOUCH_VID, PAPOUCH_DRAK6_PID) },
782 { USB_DEVICE(PAPOUCH_VID, PAPOUCH_UPSUSB_PID) },
783 { USB_DEVICE(PAPOUCH_VID, PAPOUCH_MU_PID) },
784 { USB_DEVICE(PAPOUCH_VID, PAPOUCH_SIMUKEY_PID) },
785 { USB_DEVICE(PAPOUCH_VID, PAPOUCH_AD4USB_PID) },
786 { USB_DEVICE(PAPOUCH_VID, PAPOUCH_GMUX_PID) },
787 { USB_DEVICE(PAPOUCH_VID, PAPOUCH_GMSR_PID) },
788
789 { USB_DEVICE(FTDI_VID, FTDI_DOMINTELL_DGQG_PID) },
790 { USB_DEVICE(FTDI_VID, FTDI_DOMINTELL_DUSB_PID) },
791 { USB_DEVICE(ALTI2_VID, ALTI2_N3_PID) },
792 { USB_DEVICE(FTDI_VID, DIEBOLD_BCS_SE923_PID) },
793 { USB_DEVICE(ATMEL_VID, STK541_PID) },
794 { USB_DEVICE(DE_VID, STB_PID) },
795 { USB_DEVICE(DE_VID, WHT_PID) },
796 { USB_DEVICE(ADI_VID, ADI_GNICE_PID),
797 .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
798 { USB_DEVICE(ADI_VID, ADI_GNICEPLUS_PID),
799 .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
800 { USB_DEVICE(HORNBY_VID, HORNBY_ELITE_PID) },
801 { USB_DEVICE(JETI_VID, JETI_SPC1201_PID) },
802 { USB_DEVICE(MARVELL_VID, MARVELL_SHEEVAPLUG_PID),
803 .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
804 { USB_DEVICE(LARSENBRUSGAARD_VID, LB_ALTITRACK_PID) },
805 { USB_DEVICE(GN_OTOMETRICS_VID, AURICAL_USB_PID) },
806 { USB_DEVICE(BAYER_VID, BAYER_CONTOUR_CABLE_PID) },
807 { USB_DEVICE(FTDI_VID, MARVELL_OPENRD_PID),
808 .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
809 { USB_DEVICE(FTDI_VID, TI_XDS100V2_PID),
810 .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
811 { USB_DEVICE(FTDI_VID, HAMEG_HO820_PID) },
812 { USB_DEVICE(FTDI_VID, HAMEG_HO720_PID) },
813 { USB_DEVICE(FTDI_VID, HAMEG_HO730_PID) },
814 { USB_DEVICE(FTDI_VID, HAMEG_HO870_PID) },
815 { USB_DEVICE(FTDI_VID, MJSG_GENERIC_PID) },
816 { USB_DEVICE(FTDI_VID, MJSG_SR_RADIO_PID) },
817 { USB_DEVICE(FTDI_VID, MJSG_HD_RADIO_PID) },
818 { USB_DEVICE(FTDI_VID, MJSG_XM_RADIO_PID) },
819 { USB_DEVICE(FTDI_VID, XVERVE_SIGNALYZER_ST_PID),
820 .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
821 { USB_DEVICE(FTDI_VID, XVERVE_SIGNALYZER_SLITE_PID),
822 .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
823 { USB_DEVICE(FTDI_VID, XVERVE_SIGNALYZER_SH2_PID),
824 .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
825 { USB_DEVICE(FTDI_VID, XVERVE_SIGNALYZER_SH4_PID),
826 .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
827 { USB_DEVICE(FTDI_VID, SEGWAY_RMP200_PID) },
828 { USB_DEVICE(FTDI_VID, ACCESIO_COM4SM_PID) },
829 { USB_DEVICE(IONICS_VID, IONICS_PLUGCOMPUTER_PID),
830 .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
831 { USB_DEVICE(FTDI_VID, FTDI_CHAMSYS_24_MASTER_WING_PID) },
832 { USB_DEVICE(FTDI_VID, FTDI_CHAMSYS_PC_WING_PID) },
833 { USB_DEVICE(FTDI_VID, FTDI_CHAMSYS_USB_DMX_PID) },
834 { USB_DEVICE(FTDI_VID, FTDI_CHAMSYS_MIDI_TIMECODE_PID) },
835 { USB_DEVICE(FTDI_VID, FTDI_CHAMSYS_MINI_WING_PID) },
836 { USB_DEVICE(FTDI_VID, FTDI_CHAMSYS_MAXI_WING_PID) },
837 { USB_DEVICE(FTDI_VID, FTDI_CHAMSYS_MEDIA_WING_PID) },
838 { USB_DEVICE(FTDI_VID, FTDI_CHAMSYS_WING_PID) },
839 { USB_DEVICE(FTDI_VID, FTDI_SCIENCESCOPE_LOGBOOKML_PID) },
840 { USB_DEVICE(FTDI_VID, FTDI_SCIENCESCOPE_LS_LOGBOOK_PID) },
841 { USB_DEVICE(FTDI_VID, FTDI_SCIENCESCOPE_HS_LOGBOOK_PID) },
842 { USB_DEVICE(FTDI_VID, FTDI_CINTERION_MC55I_PID) },
843 { USB_DEVICE(FTDI_VID, FTDI_DOTEC_PID) },
844 { USB_DEVICE(QIHARDWARE_VID, MILKYMISTONE_JTAGSERIAL_PID),
845 .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
846 { USB_DEVICE(ST_VID, ST_STMCLT1030_PID),
847 .driver_info = (kernel_ulong_t)&ftdi_stmclite_quirk },
848 { USB_DEVICE(FTDI_VID, FTDI_RF_R106) },
849 { },
850 { }
851};
852
853MODULE_DEVICE_TABLE(usb, id_table_combined);
854
855static struct usb_driver ftdi_driver = {
856 .name = "ftdi_sio",
857 .probe = usb_serial_probe,
858 .disconnect = usb_serial_disconnect,
859 .id_table = id_table_combined,
860 .no_dynamic_id = 1,
861};
862
863static const char *ftdi_chip_name[] = {
864 [SIO] = "SIO",
865 [FT8U232AM] = "FT8U232AM",
866 [FT232BM] = "FT232BM",
867 [FT2232C] = "FT2232C",
868 [FT232RL] = "FT232RL",
869 [FT2232H] = "FT2232H",
870 [FT4232H] = "FT4232H",
871 [FT232H] = "FT232H"
872};
873
874
875
876#define FTDI_STATUS_B0_MASK (FTDI_RS0_CTS | FTDI_RS0_DSR | FTDI_RS0_RI | FTDI_RS0_RLSD)
877#define FTDI_STATUS_B1_MASK (FTDI_RS_BI)
878
879
880#define FTDI_IMPL_ASYNC_FLAGS = (ASYNC_SPD_HI | ASYNC_SPD_VHI \
881 | ASYNC_SPD_CUST | ASYNC_SPD_SHI | ASYNC_SPD_WARP)
882
883
884static int ftdi_sio_probe(struct usb_serial *serial,
885 const struct usb_device_id *id);
886static int ftdi_sio_port_probe(struct usb_serial_port *port);
887static int ftdi_sio_port_remove(struct usb_serial_port *port);
888static int ftdi_open(struct tty_struct *tty, struct usb_serial_port *port);
889static void ftdi_close(struct usb_serial_port *port);
890static void ftdi_dtr_rts(struct usb_serial_port *port, int on);
891static void ftdi_process_read_urb(struct urb *urb);
892static int ftdi_prepare_write_buffer(struct usb_serial_port *port,
893 void *dest, size_t size);
894static void ftdi_set_termios(struct tty_struct *tty,
895 struct usb_serial_port *port, struct ktermios *old);
896static int ftdi_tiocmget(struct tty_struct *tty);
897static int ftdi_tiocmset(struct tty_struct *tty,
898 unsigned int set, unsigned int clear);
899static int ftdi_get_icount(struct tty_struct *tty,
900 struct serial_icounter_struct *icount);
901static int ftdi_ioctl(struct tty_struct *tty,
902 unsigned int cmd, unsigned long arg);
903static void ftdi_break_ctl(struct tty_struct *tty, int break_state);
904
905static unsigned short int ftdi_232am_baud_base_to_divisor(int baud, int base);
906static unsigned short int ftdi_232am_baud_to_divisor(int baud);
907static __u32 ftdi_232bm_baud_base_to_divisor(int baud, int base);
908static __u32 ftdi_232bm_baud_to_divisor(int baud);
909static __u32 ftdi_2232h_baud_base_to_divisor(int baud, int base);
910static __u32 ftdi_2232h_baud_to_divisor(int baud);
911
912static struct usb_serial_driver ftdi_sio_device = {
913 .driver = {
914 .owner = THIS_MODULE,
915 .name = "ftdi_sio",
916 },
917 .description = "FTDI USB Serial Device",
918 .usb_driver = &ftdi_driver,
919 .id_table = id_table_combined,
920 .num_ports = 1,
921 .bulk_in_size = 512,
922 .bulk_out_size = 256,
923 .probe = ftdi_sio_probe,
924 .port_probe = ftdi_sio_port_probe,
925 .port_remove = ftdi_sio_port_remove,
926 .open = ftdi_open,
927 .close = ftdi_close,
928 .dtr_rts = ftdi_dtr_rts,
929 .throttle = usb_serial_generic_throttle,
930 .unthrottle = usb_serial_generic_unthrottle,
931 .process_read_urb = ftdi_process_read_urb,
932 .prepare_write_buffer = ftdi_prepare_write_buffer,
933 .tiocmget = ftdi_tiocmget,
934 .tiocmset = ftdi_tiocmset,
935 .get_icount = ftdi_get_icount,
936 .ioctl = ftdi_ioctl,
937 .set_termios = ftdi_set_termios,
938 .break_ctl = ftdi_break_ctl,
939};
940
941
942#define WDR_TIMEOUT 5000
943#define WDR_SHORT_TIMEOUT 1000
944
945
946#define HIGH 1
947#define LOW 0
948
949
950
951
952
953
954
955static unsigned short int ftdi_232am_baud_base_to_divisor(int baud, int base)
956{
957 unsigned short int divisor;
958
959 int divisor3 = base / 2 / baud;
960 if ((divisor3 & 0x7) == 7)
961 divisor3++;
962 divisor = divisor3 >> 3;
963 divisor3 &= 0x7;
964 if (divisor3 == 1)
965 divisor |= 0xc000;
966 else if (divisor3 >= 4)
967 divisor |= 0x4000;
968 else if (divisor3 != 0)
969 divisor |= 0x8000;
970 else if (divisor == 1)
971 divisor = 0;
972 return divisor;
973}
974
975static unsigned short int ftdi_232am_baud_to_divisor(int baud)
976{
977 return ftdi_232am_baud_base_to_divisor(baud, 48000000);
978}
979
980static __u32 ftdi_232bm_baud_base_to_divisor(int baud, int base)
981{
982 static const unsigned char divfrac[8] = { 0, 3, 2, 4, 1, 5, 6, 7 };
983 __u32 divisor;
984
985 int divisor3 = base / 2 / baud;
986 divisor = divisor3 >> 3;
987 divisor |= (__u32)divfrac[divisor3 & 0x7] << 14;
988
989 if (divisor == 1)
990 divisor = 0;
991 else if (divisor == 0x4001)
992 divisor = 1;
993 return divisor;
994}
995
996static __u32 ftdi_232bm_baud_to_divisor(int baud)
997{
998 return ftdi_232bm_baud_base_to_divisor(baud, 48000000);
999}
1000
1001static __u32 ftdi_2232h_baud_base_to_divisor(int baud, int base)
1002{
1003 static const unsigned char divfrac[8] = { 0, 3, 2, 4, 1, 5, 6, 7 };
1004 __u32 divisor;
1005 int divisor3;
1006
1007
1008 divisor3 = base * 8 / (baud * 10);
1009
1010 divisor = divisor3 >> 3;
1011 divisor |= (__u32)divfrac[divisor3 & 0x7] << 14;
1012
1013 if (divisor == 1)
1014 divisor = 0;
1015 else if (divisor == 0x4001)
1016 divisor = 1;
1017
1018
1019
1020
1021
1022 divisor |= 0x00020000;
1023 return divisor;
1024}
1025
1026static __u32 ftdi_2232h_baud_to_divisor(int baud)
1027{
1028 return ftdi_2232h_baud_base_to_divisor(baud, 120000000);
1029}
1030
1031#define set_mctrl(port, set) update_mctrl((port), (set), 0)
1032#define clear_mctrl(port, clear) update_mctrl((port), 0, (clear))
1033
1034static int update_mctrl(struct usb_serial_port *port, unsigned int set,
1035 unsigned int clear)
1036{
1037 struct ftdi_private *priv = usb_get_serial_port_data(port);
1038 unsigned urb_value;
1039 int rv;
1040
1041 if (((set | clear) & (TIOCM_DTR | TIOCM_RTS)) == 0) {
1042 dbg("%s - DTR|RTS not being set|cleared", __func__);
1043 return 0;
1044 }
1045
1046 clear &= ~set;
1047 urb_value = 0;
1048 if (clear & TIOCM_DTR)
1049 urb_value |= FTDI_SIO_SET_DTR_LOW;
1050 if (clear & TIOCM_RTS)
1051 urb_value |= FTDI_SIO_SET_RTS_LOW;
1052 if (set & TIOCM_DTR)
1053 urb_value |= FTDI_SIO_SET_DTR_HIGH;
1054 if (set & TIOCM_RTS)
1055 urb_value |= FTDI_SIO_SET_RTS_HIGH;
1056 rv = usb_control_msg(port->serial->dev,
1057 usb_sndctrlpipe(port->serial->dev, 0),
1058 FTDI_SIO_SET_MODEM_CTRL_REQUEST,
1059 FTDI_SIO_SET_MODEM_CTRL_REQUEST_TYPE,
1060 urb_value, priv->interface,
1061 NULL, 0, WDR_TIMEOUT);
1062 if (rv < 0) {
1063 dbg("%s Error from MODEM_CTRL urb: DTR %s, RTS %s",
1064 __func__,
1065 (set & TIOCM_DTR) ? "HIGH" :
1066 (clear & TIOCM_DTR) ? "LOW" : "unchanged",
1067 (set & TIOCM_RTS) ? "HIGH" :
1068 (clear & TIOCM_RTS) ? "LOW" : "unchanged");
1069 } else {
1070 dbg("%s - DTR %s, RTS %s", __func__,
1071 (set & TIOCM_DTR) ? "HIGH" :
1072 (clear & TIOCM_DTR) ? "LOW" : "unchanged",
1073 (set & TIOCM_RTS) ? "HIGH" :
1074 (clear & TIOCM_RTS) ? "LOW" : "unchanged");
1075
1076 priv->last_dtr_rts = (priv->last_dtr_rts & ~clear) | set;
1077 }
1078 return rv;
1079}
1080
1081
1082static __u32 get_ftdi_divisor(struct tty_struct *tty,
1083 struct usb_serial_port *port)
1084{
1085 struct ftdi_private *priv = usb_get_serial_port_data(port);
1086 __u32 div_value = 0;
1087 int div_okay = 1;
1088 int baud;
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120 baud = tty_get_baud_rate(tty);
1121 dbg("%s - tty_get_baud_rate reports speed %d", __func__, baud);
1122
1123
1124
1125
1126 if (baud == 38400 &&
1127 ((priv->flags & ASYNC_SPD_MASK) == ASYNC_SPD_CUST) &&
1128 (priv->custom_divisor)) {
1129 baud = priv->baud_base / priv->custom_divisor;
1130 dbg("%s - custom divisor %d sets baud rate to %d",
1131 __func__, priv->custom_divisor, baud);
1132 }
1133
1134
1135
1136 if (!baud)
1137 baud = 9600;
1138 switch (priv->chip_type) {
1139 case SIO:
1140 switch (baud) {
1141 case 300: div_value = ftdi_sio_b300; break;
1142 case 600: div_value = ftdi_sio_b600; break;
1143 case 1200: div_value = ftdi_sio_b1200; break;
1144 case 2400: div_value = ftdi_sio_b2400; break;
1145 case 4800: div_value = ftdi_sio_b4800; break;
1146 case 9600: div_value = ftdi_sio_b9600; break;
1147 case 19200: div_value = ftdi_sio_b19200; break;
1148 case 38400: div_value = ftdi_sio_b38400; break;
1149 case 57600: div_value = ftdi_sio_b57600; break;
1150 case 115200: div_value = ftdi_sio_b115200; break;
1151 }
1152 if (div_value == 0) {
1153 dbg("%s - Baudrate (%d) requested is not supported",
1154 __func__, baud);
1155 div_value = ftdi_sio_b9600;
1156 baud = 9600;
1157 div_okay = 0;
1158 }
1159 break;
1160 case FT8U232AM:
1161 if (baud <= 3000000) {
1162 div_value = ftdi_232am_baud_to_divisor(baud);
1163 } else {
1164 dbg("%s - Baud rate too high!", __func__);
1165 baud = 9600;
1166 div_value = ftdi_232am_baud_to_divisor(9600);
1167 div_okay = 0;
1168 }
1169 break;
1170 case FT232BM:
1171 case FT2232C:
1172 case FT232RL:
1173 if (baud <= 3000000) {
1174 __u16 product_id = le16_to_cpu(
1175 port->serial->dev->descriptor.idProduct);
1176 if (((FTDI_NDI_HUC_PID == product_id) ||
1177 (FTDI_NDI_SPECTRA_SCU_PID == product_id) ||
1178 (FTDI_NDI_FUTURE_2_PID == product_id) ||
1179 (FTDI_NDI_FUTURE_3_PID == product_id) ||
1180 (FTDI_NDI_AURORA_SCU_PID == product_id)) &&
1181 (baud == 19200)) {
1182 baud = 1200000;
1183 }
1184 div_value = ftdi_232bm_baud_to_divisor(baud);
1185 } else {
1186 dbg("%s - Baud rate too high!", __func__);
1187 div_value = ftdi_232bm_baud_to_divisor(9600);
1188 div_okay = 0;
1189 baud = 9600;
1190 }
1191 break;
1192 case FT2232H:
1193 case FT4232H:
1194 case FT232H:
1195 if ((baud <= 12000000) && (baud >= 1200)) {
1196 div_value = ftdi_2232h_baud_to_divisor(baud);
1197 } else if (baud < 1200) {
1198 div_value = ftdi_232bm_baud_to_divisor(baud);
1199 } else {
1200 dbg("%s - Baud rate too high!", __func__);
1201 div_value = ftdi_232bm_baud_to_divisor(9600);
1202 div_okay = 0;
1203 baud = 9600;
1204 }
1205 break;
1206 }
1207
1208 if (div_okay) {
1209 dbg("%s - Baud rate set to %d (divisor 0x%lX) on chip %s",
1210 __func__, baud, (unsigned long)div_value,
1211 ftdi_chip_name[priv->chip_type]);
1212 }
1213
1214 tty_encode_baud_rate(tty, baud, baud);
1215 return div_value;
1216}
1217
1218static int change_speed(struct tty_struct *tty, struct usb_serial_port *port)
1219{
1220 struct ftdi_private *priv = usb_get_serial_port_data(port);
1221 __u16 urb_value;
1222 __u16 urb_index;
1223 __u32 urb_index_value;
1224 int rv;
1225
1226 urb_index_value = get_ftdi_divisor(tty, port);
1227 urb_value = (__u16)urb_index_value;
1228 urb_index = (__u16)(urb_index_value >> 16);
1229 if ((priv->chip_type == FT2232C) || (priv->chip_type == FT2232H) ||
1230 (priv->chip_type == FT4232H) || (priv->chip_type == FT232H)) {
1231
1232
1233 urb_index = (__u16)((urb_index << 8) | priv->interface);
1234 }
1235
1236 rv = usb_control_msg(port->serial->dev,
1237 usb_sndctrlpipe(port->serial->dev, 0),
1238 FTDI_SIO_SET_BAUDRATE_REQUEST,
1239 FTDI_SIO_SET_BAUDRATE_REQUEST_TYPE,
1240 urb_value, urb_index,
1241 NULL, 0, WDR_SHORT_TIMEOUT);
1242 return rv;
1243}
1244
1245static int write_latency_timer(struct usb_serial_port *port)
1246{
1247 struct ftdi_private *priv = usb_get_serial_port_data(port);
1248 struct usb_device *udev = port->serial->dev;
1249 int rv;
1250 int l = priv->latency;
1251
1252 if (priv->flags & ASYNC_LOW_LATENCY)
1253 l = 1;
1254
1255 dbg("%s: setting latency timer = %i", __func__, l);
1256
1257 rv = usb_control_msg(udev,
1258 usb_sndctrlpipe(udev, 0),
1259 FTDI_SIO_SET_LATENCY_TIMER_REQUEST,
1260 FTDI_SIO_SET_LATENCY_TIMER_REQUEST_TYPE,
1261 l, priv->interface,
1262 NULL, 0, WDR_TIMEOUT);
1263 if (rv < 0)
1264 dev_err(&port->dev, "Unable to write latency timer: %i\n", rv);
1265 return rv;
1266}
1267
1268static int read_latency_timer(struct usb_serial_port *port)
1269{
1270 struct ftdi_private *priv = usb_get_serial_port_data(port);
1271 struct usb_device *udev = port->serial->dev;
1272 unsigned char *buf;
1273 int rv;
1274
1275 dbg("%s", __func__);
1276
1277 buf = kmalloc(1, GFP_KERNEL);
1278 if (!buf)
1279 return -ENOMEM;
1280
1281 rv = usb_control_msg(udev,
1282 usb_rcvctrlpipe(udev, 0),
1283 FTDI_SIO_GET_LATENCY_TIMER_REQUEST,
1284 FTDI_SIO_GET_LATENCY_TIMER_REQUEST_TYPE,
1285 0, priv->interface,
1286 buf, 1, WDR_TIMEOUT);
1287 if (rv < 0)
1288 dev_err(&port->dev, "Unable to read latency timer: %i\n", rv);
1289 else
1290 priv->latency = buf[0];
1291
1292 kfree(buf);
1293
1294 return rv;
1295}
1296
1297static int get_serial_info(struct usb_serial_port *port,
1298 struct serial_struct __user *retinfo)
1299{
1300 struct ftdi_private *priv = usb_get_serial_port_data(port);
1301 struct serial_struct tmp;
1302
1303 if (!retinfo)
1304 return -EFAULT;
1305 memset(&tmp, 0, sizeof(tmp));
1306 tmp.flags = priv->flags;
1307 tmp.baud_base = priv->baud_base;
1308 tmp.custom_divisor = priv->custom_divisor;
1309 if (copy_to_user(retinfo, &tmp, sizeof(*retinfo)))
1310 return -EFAULT;
1311 return 0;
1312}
1313
1314static int set_serial_info(struct tty_struct *tty,
1315 struct usb_serial_port *port, struct serial_struct __user *newinfo)
1316{
1317 struct ftdi_private *priv = usb_get_serial_port_data(port);
1318 struct serial_struct new_serial;
1319 struct ftdi_private old_priv;
1320
1321 if (copy_from_user(&new_serial, newinfo, sizeof(new_serial)))
1322 return -EFAULT;
1323
1324 mutex_lock(&priv->cfg_lock);
1325 old_priv = *priv;
1326
1327
1328
1329 if (!capable(CAP_SYS_ADMIN)) {
1330 if (((new_serial.flags & ~ASYNC_USR_MASK) !=
1331 (priv->flags & ~ASYNC_USR_MASK))) {
1332 mutex_unlock(&priv->cfg_lock);
1333 return -EPERM;
1334 }
1335 priv->flags = ((priv->flags & ~ASYNC_USR_MASK) |
1336 (new_serial.flags & ASYNC_USR_MASK));
1337 priv->custom_divisor = new_serial.custom_divisor;
1338 goto check_and_exit;
1339 }
1340
1341 if (new_serial.baud_base != priv->baud_base) {
1342 mutex_unlock(&priv->cfg_lock);
1343 return -EINVAL;
1344 }
1345
1346
1347
1348 priv->flags = ((priv->flags & ~ASYNC_FLAGS) |
1349 (new_serial.flags & ASYNC_FLAGS));
1350 priv->custom_divisor = new_serial.custom_divisor;
1351
1352 write_latency_timer(port);
1353
1354check_and_exit:
1355 if ((old_priv.flags & ASYNC_SPD_MASK) !=
1356 (priv->flags & ASYNC_SPD_MASK)) {
1357 if ((priv->flags & ASYNC_SPD_MASK) == ASYNC_SPD_HI)
1358 tty->alt_speed = 57600;
1359 else if ((priv->flags & ASYNC_SPD_MASK) == ASYNC_SPD_VHI)
1360 tty->alt_speed = 115200;
1361 else if ((priv->flags & ASYNC_SPD_MASK) == ASYNC_SPD_SHI)
1362 tty->alt_speed = 230400;
1363 else if ((priv->flags & ASYNC_SPD_MASK) == ASYNC_SPD_WARP)
1364 tty->alt_speed = 460800;
1365 else
1366 tty->alt_speed = 0;
1367 }
1368 if (((old_priv.flags & ASYNC_SPD_MASK) !=
1369 (priv->flags & ASYNC_SPD_MASK)) ||
1370 (((priv->flags & ASYNC_SPD_MASK) == ASYNC_SPD_CUST) &&
1371 (old_priv.custom_divisor != priv->custom_divisor))) {
1372 change_speed(tty, port);
1373 mutex_unlock(&priv->cfg_lock);
1374 }
1375 else
1376 mutex_unlock(&priv->cfg_lock);
1377 return 0;
1378}
1379
1380static int get_lsr_info(struct usb_serial_port *port,
1381 struct serial_struct __user *retinfo)
1382{
1383 struct ftdi_private *priv = usb_get_serial_port_data(port);
1384 unsigned int result = 0;
1385
1386 if (!retinfo)
1387 return -EFAULT;
1388
1389 if (priv->transmit_empty)
1390 result = TIOCSER_TEMT;
1391
1392 if (copy_to_user(retinfo, &result, sizeof(unsigned int)))
1393 return -EFAULT;
1394 return 0;
1395}
1396
1397
1398
1399static void ftdi_determine_type(struct usb_serial_port *port)
1400{
1401 struct ftdi_private *priv = usb_get_serial_port_data(port);
1402 struct usb_serial *serial = port->serial;
1403 struct usb_device *udev = serial->dev;
1404 unsigned version;
1405 unsigned interfaces;
1406
1407
1408 priv->baud_base = 48000000 / 2;
1409
1410 version = le16_to_cpu(udev->descriptor.bcdDevice);
1411 interfaces = udev->actconfig->desc.bNumInterfaces;
1412 dbg("%s: bcdDevice = 0x%x, bNumInterfaces = %u", __func__,
1413 version, interfaces);
1414 if (interfaces > 1) {
1415 int inter;
1416
1417
1418 if (version == 0x0800) {
1419 priv->chip_type = FT4232H;
1420
1421 priv->baud_base = 120000000 / 2;
1422 } else if (version == 0x0700) {
1423 priv->chip_type = FT2232H;
1424
1425 priv->baud_base = 120000000 / 2;
1426 } else
1427 priv->chip_type = FT2232C;
1428
1429
1430 inter = serial->interface->altsetting->desc.bInterfaceNumber;
1431 if (inter == 0) {
1432 priv->interface = INTERFACE_A;
1433 } else if (inter == 1) {
1434 priv->interface = INTERFACE_B;
1435 } else if (inter == 2) {
1436 priv->interface = INTERFACE_C;
1437 } else if (inter == 3) {
1438 priv->interface = INTERFACE_D;
1439 }
1440
1441
1442 if (version < 0x500) {
1443 dbg("%s: something fishy - bcdDevice too low for multi-interface device",
1444 __func__);
1445 }
1446 } else if (version < 0x200) {
1447
1448 priv->chip_type = SIO;
1449 priv->baud_base = 12000000 / 16;
1450 } else if (version < 0x400) {
1451
1452
1453
1454 priv->chip_type = FT8U232AM;
1455 } else if (version < 0x600) {
1456
1457 priv->chip_type = FT232BM;
1458 } else if (version < 0x900) {
1459
1460 priv->chip_type = FT232RL;
1461 } else {
1462
1463 priv->chip_type = FT232H;
1464 }
1465 dev_info(&udev->dev, "Detected %s\n", ftdi_chip_name[priv->chip_type]);
1466}
1467
1468
1469
1470
1471
1472static void ftdi_set_max_packet_size(struct usb_serial_port *port)
1473{
1474 struct ftdi_private *priv = usb_get_serial_port_data(port);
1475 struct usb_serial *serial = port->serial;
1476 struct usb_device *udev = serial->dev;
1477
1478 struct usb_interface *interface = serial->interface;
1479 struct usb_endpoint_descriptor *ep_desc = &interface->cur_altsetting->endpoint[1].desc;
1480
1481 unsigned num_endpoints;
1482 int i;
1483
1484 num_endpoints = interface->cur_altsetting->desc.bNumEndpoints;
1485 dev_info(&udev->dev, "Number of endpoints %d\n", num_endpoints);
1486
1487
1488
1489
1490
1491 for (i = 0; i < num_endpoints; i++) {
1492 dev_info(&udev->dev, "Endpoint %d MaxPacketSize %d\n", i+1,
1493 interface->cur_altsetting->endpoint[i].desc.wMaxPacketSize);
1494 ep_desc = &interface->cur_altsetting->endpoint[i].desc;
1495 if (ep_desc->wMaxPacketSize == 0) {
1496 ep_desc->wMaxPacketSize = cpu_to_le16(0x40);
1497 dev_info(&udev->dev, "Overriding wMaxPacketSize on endpoint %d\n", i);
1498 }
1499 }
1500
1501
1502 priv->max_packet_size = usb_endpoint_maxp(ep_desc);
1503
1504 dev_info(&udev->dev, "Setting MaxPacketSize %d\n", priv->max_packet_size);
1505}
1506
1507
1508
1509
1510
1511
1512
1513
1514static ssize_t show_latency_timer(struct device *dev,
1515 struct device_attribute *attr, char *buf)
1516{
1517 struct usb_serial_port *port = to_usb_serial_port(dev);
1518 struct ftdi_private *priv = usb_get_serial_port_data(port);
1519 if (priv->flags & ASYNC_LOW_LATENCY)
1520 return sprintf(buf, "1\n");
1521 else
1522 return sprintf(buf, "%i\n", priv->latency);
1523}
1524
1525
1526
1527static ssize_t store_latency_timer(struct device *dev,
1528 struct device_attribute *attr, const char *valbuf,
1529 size_t count)
1530{
1531 struct usb_serial_port *port = to_usb_serial_port(dev);
1532 struct ftdi_private *priv = usb_get_serial_port_data(port);
1533 int v = simple_strtoul(valbuf, NULL, 10);
1534 int rv;
1535
1536 priv->latency = v;
1537 rv = write_latency_timer(port);
1538 if (rv < 0)
1539 return -EIO;
1540 return count;
1541}
1542
1543
1544
1545static ssize_t store_event_char(struct device *dev,
1546 struct device_attribute *attr, const char *valbuf, size_t count)
1547{
1548 struct usb_serial_port *port = to_usb_serial_port(dev);
1549 struct ftdi_private *priv = usb_get_serial_port_data(port);
1550 struct usb_device *udev = port->serial->dev;
1551 int v = simple_strtoul(valbuf, NULL, 10);
1552 int rv;
1553
1554 dbg("%s: setting event char = %i", __func__, v);
1555
1556 rv = usb_control_msg(udev,
1557 usb_sndctrlpipe(udev, 0),
1558 FTDI_SIO_SET_EVENT_CHAR_REQUEST,
1559 FTDI_SIO_SET_EVENT_CHAR_REQUEST_TYPE,
1560 v, priv->interface,
1561 NULL, 0, WDR_TIMEOUT);
1562 if (rv < 0) {
1563 dbg("Unable to write event character: %i", rv);
1564 return -EIO;
1565 }
1566
1567 return count;
1568}
1569
1570static DEVICE_ATTR(latency_timer, S_IWUSR | S_IRUGO, show_latency_timer,
1571 store_latency_timer);
1572static DEVICE_ATTR(event_char, S_IWUSR, NULL, store_event_char);
1573
1574static int create_sysfs_attrs(struct usb_serial_port *port)
1575{
1576 struct ftdi_private *priv = usb_get_serial_port_data(port);
1577 int retval = 0;
1578
1579 dbg("%s", __func__);
1580
1581
1582
1583 if (priv->chip_type != SIO) {
1584 dbg("sysfs attributes for %s", ftdi_chip_name[priv->chip_type]);
1585 retval = device_create_file(&port->dev, &dev_attr_event_char);
1586 if ((!retval) &&
1587 (priv->chip_type == FT232BM ||
1588 priv->chip_type == FT2232C ||
1589 priv->chip_type == FT232RL ||
1590 priv->chip_type == FT2232H ||
1591 priv->chip_type == FT4232H ||
1592 priv->chip_type == FT232H)) {
1593 retval = device_create_file(&port->dev,
1594 &dev_attr_latency_timer);
1595 }
1596 }
1597 return retval;
1598}
1599
1600static void remove_sysfs_attrs(struct usb_serial_port *port)
1601{
1602 struct ftdi_private *priv = usb_get_serial_port_data(port);
1603
1604 dbg("%s", __func__);
1605
1606
1607 if (priv->chip_type != SIO) {
1608 device_remove_file(&port->dev, &dev_attr_event_char);
1609 if (priv->chip_type == FT232BM ||
1610 priv->chip_type == FT2232C ||
1611 priv->chip_type == FT232RL ||
1612 priv->chip_type == FT2232H ||
1613 priv->chip_type == FT4232H ||
1614 priv->chip_type == FT232H) {
1615 device_remove_file(&port->dev, &dev_attr_latency_timer);
1616 }
1617 }
1618
1619}
1620
1621
1622
1623
1624
1625
1626
1627
1628static int ftdi_sio_probe(struct usb_serial *serial,
1629 const struct usb_device_id *id)
1630{
1631 struct ftdi_sio_quirk *quirk =
1632 (struct ftdi_sio_quirk *)id->driver_info;
1633
1634 if (quirk && quirk->probe) {
1635 int ret = quirk->probe(serial);
1636 if (ret != 0)
1637 return ret;
1638 }
1639
1640 usb_set_serial_data(serial, (void *)id->driver_info);
1641
1642 return 0;
1643}
1644
1645static int ftdi_sio_port_probe(struct usb_serial_port *port)
1646{
1647 struct ftdi_private *priv;
1648 struct ftdi_sio_quirk *quirk = usb_get_serial_data(port->serial);
1649
1650
1651 dbg("%s", __func__);
1652
1653 priv = kzalloc(sizeof(struct ftdi_private), GFP_KERNEL);
1654 if (!priv) {
1655 dev_err(&port->dev, "%s- kmalloc(%Zd) failed.\n", __func__,
1656 sizeof(struct ftdi_private));
1657 return -ENOMEM;
1658 }
1659
1660 kref_init(&priv->kref);
1661 mutex_init(&priv->cfg_lock);
1662 memset(&priv->icount, 0x00, sizeof(priv->icount));
1663 init_waitqueue_head(&priv->delta_msr_wait);
1664
1665 priv->flags = ASYNC_LOW_LATENCY;
1666
1667 if (quirk && quirk->port_probe)
1668 quirk->port_probe(priv);
1669
1670 priv->port = port;
1671 usb_set_serial_port_data(port, priv);
1672
1673 ftdi_determine_type(port);
1674 ftdi_set_max_packet_size(port);
1675 if (read_latency_timer(port) < 0)
1676 priv->latency = 16;
1677 write_latency_timer(port);
1678 create_sysfs_attrs(port);
1679 return 0;
1680}
1681
1682
1683
1684
1685static void ftdi_USB_UIRT_setup(struct ftdi_private *priv)
1686{
1687 dbg("%s", __func__);
1688
1689 priv->flags |= ASYNC_SPD_CUST;
1690 priv->custom_divisor = 77;
1691 priv->force_baud = 38400;
1692}
1693
1694
1695
1696
1697static void ftdi_HE_TIRA1_setup(struct ftdi_private *priv)
1698{
1699 dbg("%s", __func__);
1700
1701 priv->flags |= ASYNC_SPD_CUST;
1702 priv->custom_divisor = 240;
1703 priv->force_baud = 38400;
1704 priv->force_rtscts = 1;
1705}
1706
1707
1708
1709
1710
1711static int ndi_latency_timer = 1;
1712
1713
1714
1715
1716
1717
1718static int ftdi_NDI_device_setup(struct usb_serial *serial)
1719{
1720 struct usb_device *udev = serial->dev;
1721 int latency = ndi_latency_timer;
1722
1723 if (latency == 0)
1724 latency = 1;
1725 if (latency > 99)
1726 latency = 99;
1727
1728 dbg("%s setting NDI device latency to %d", __func__, latency);
1729 dev_info(&udev->dev, "NDI device with a latency value of %d", latency);
1730
1731
1732 usb_control_msg(udev, usb_sndctrlpipe(udev, 0),
1733 FTDI_SIO_SET_LATENCY_TIMER_REQUEST,
1734 FTDI_SIO_SET_LATENCY_TIMER_REQUEST_TYPE,
1735 latency, 0, NULL, 0, WDR_TIMEOUT);
1736 return 0;
1737}
1738
1739
1740
1741
1742
1743
1744static int ftdi_jtag_probe(struct usb_serial *serial)
1745{
1746 struct usb_device *udev = serial->dev;
1747 struct usb_interface *interface = serial->interface;
1748
1749 dbg("%s", __func__);
1750
1751 if (interface == udev->actconfig->interface[0]) {
1752 dev_info(&udev->dev,
1753 "Ignoring serial port reserved for JTAG\n");
1754 return -ENODEV;
1755 }
1756
1757 return 0;
1758}
1759
1760static int ftdi_8u2232c_probe(struct usb_serial *serial)
1761{
1762 struct usb_device *udev = serial->dev;
1763
1764 dbg("%s", __func__);
1765
1766 if (strcmp(udev->manufacturer, "CALAO Systems") == 0)
1767 return ftdi_jtag_probe(serial);
1768
1769 return 0;
1770}
1771
1772
1773
1774
1775
1776static int ftdi_stmclite_probe(struct usb_serial *serial)
1777{
1778 struct usb_device *udev = serial->dev;
1779 struct usb_interface *interface = serial->interface;
1780
1781 dbg("%s", __func__);
1782
1783 if (interface == udev->actconfig->interface[2])
1784 return 0;
1785
1786 dev_info(&udev->dev, "Ignoring serial port reserved for JTAG\n");
1787
1788 return -ENODEV;
1789}
1790
1791
1792
1793
1794
1795static int ftdi_mtxorb_hack_setup(struct usb_serial *serial)
1796{
1797 struct usb_host_endpoint *ep = serial->dev->ep_in[1];
1798 struct usb_endpoint_descriptor *ep_desc = &ep->desc;
1799
1800 if (ep->enabled && ep_desc->wMaxPacketSize == 0) {
1801 ep_desc->wMaxPacketSize = cpu_to_le16(0x40);
1802 dev_info(&serial->dev->dev,
1803 "Fixing invalid wMaxPacketSize on read pipe\n");
1804 }
1805
1806 return 0;
1807}
1808
1809static void ftdi_sio_priv_release(struct kref *k)
1810{
1811 struct ftdi_private *priv = container_of(k, struct ftdi_private, kref);
1812
1813 kfree(priv);
1814}
1815
1816static int ftdi_sio_port_remove(struct usb_serial_port *port)
1817{
1818 struct ftdi_private *priv = usb_get_serial_port_data(port);
1819
1820 dbg("%s", __func__);
1821
1822 remove_sysfs_attrs(port);
1823
1824 kref_put(&priv->kref, ftdi_sio_priv_release);
1825
1826 return 0;
1827}
1828
1829static int ftdi_open(struct tty_struct *tty, struct usb_serial_port *port)
1830{
1831 struct ktermios dummy;
1832 struct usb_device *dev = port->serial->dev;
1833 struct ftdi_private *priv = usb_get_serial_port_data(port);
1834 int result;
1835
1836 dbg("%s", __func__);
1837
1838
1839
1840 usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
1841 FTDI_SIO_RESET_REQUEST, FTDI_SIO_RESET_REQUEST_TYPE,
1842 FTDI_SIO_RESET_SIO,
1843 priv->interface, NULL, 0, WDR_TIMEOUT);
1844
1845
1846
1847
1848
1849
1850 if (tty) {
1851 memset(&dummy, 0, sizeof(dummy));
1852 ftdi_set_termios(tty, port, &dummy);
1853 }
1854
1855
1856 result = usb_serial_generic_open(tty, port);
1857 if (!result)
1858 kref_get(&priv->kref);
1859
1860 return result;
1861}
1862
1863static void ftdi_dtr_rts(struct usb_serial_port *port, int on)
1864{
1865 struct ftdi_private *priv = usb_get_serial_port_data(port);
1866
1867 mutex_lock(&port->serial->disc_mutex);
1868 if (!port->serial->disconnected) {
1869
1870 if (!on && usb_control_msg(port->serial->dev,
1871 usb_sndctrlpipe(port->serial->dev, 0),
1872 FTDI_SIO_SET_FLOW_CTRL_REQUEST,
1873 FTDI_SIO_SET_FLOW_CTRL_REQUEST_TYPE,
1874 0, priv->interface, NULL, 0,
1875 WDR_TIMEOUT) < 0) {
1876 dev_err(&port->dev, "error from flowcontrol urb\n");
1877 }
1878
1879 if (on)
1880 set_mctrl(port, TIOCM_DTR | TIOCM_RTS);
1881 else
1882 clear_mctrl(port, TIOCM_DTR | TIOCM_RTS);
1883 }
1884 mutex_unlock(&port->serial->disc_mutex);
1885}
1886
1887
1888
1889
1890
1891
1892static void ftdi_close(struct usb_serial_port *port)
1893{
1894 struct ftdi_private *priv = usb_get_serial_port_data(port);
1895
1896 dbg("%s", __func__);
1897
1898 usb_serial_generic_close(port);
1899 kref_put(&priv->kref, ftdi_sio_priv_release);
1900}
1901
1902
1903
1904
1905
1906
1907
1908
1909static int ftdi_prepare_write_buffer(struct usb_serial_port *port,
1910 void *dest, size_t size)
1911{
1912 struct ftdi_private *priv;
1913 int count;
1914 unsigned long flags;
1915
1916 priv = usb_get_serial_port_data(port);
1917
1918 if (priv->chip_type == SIO) {
1919 unsigned char *buffer = dest;
1920 int i, len, c;
1921
1922 count = 0;
1923 spin_lock_irqsave(&port->lock, flags);
1924 for (i = 0; i < size - 1; i += priv->max_packet_size) {
1925 len = min_t(int, size - i, priv->max_packet_size) - 1;
1926 c = kfifo_out(&port->write_fifo, &buffer[i + 1], len);
1927 if (!c)
1928 break;
1929 priv->icount.tx += c;
1930 buffer[i] = (c << 2) + 1;
1931 count += c + 1;
1932 }
1933 spin_unlock_irqrestore(&port->lock, flags);
1934 } else {
1935 count = kfifo_out_locked(&port->write_fifo, dest, size,
1936 &port->lock);
1937 priv->icount.tx += count;
1938 }
1939
1940 return count;
1941}
1942
1943#define FTDI_RS_ERR_MASK (FTDI_RS_BI | FTDI_RS_PE | FTDI_RS_FE | FTDI_RS_OE)
1944
1945static int ftdi_process_packet(struct tty_struct *tty,
1946 struct usb_serial_port *port, struct ftdi_private *priv,
1947 char *packet, int len)
1948{
1949 int i;
1950 char status;
1951 char flag;
1952 char *ch;
1953
1954 dbg("%s - port %d", __func__, port->number);
1955
1956 if (len < 2) {
1957 dbg("malformed packet");
1958 return 0;
1959 }
1960
1961
1962
1963
1964 status = packet[0] & FTDI_STATUS_B0_MASK;
1965 if (status & FTDI_RS0_CTS)
1966 priv->icount.cts++;
1967 if (status & FTDI_RS0_DSR)
1968 priv->icount.dsr++;
1969 if (status & FTDI_RS0_RI)
1970 priv->icount.rng++;
1971 if (status & FTDI_RS0_RLSD)
1972 priv->icount.dcd++;
1973 if (status != priv->prev_status) {
1974 priv->diff_status |= status ^ priv->prev_status;
1975 wake_up_interruptible(&priv->delta_msr_wait);
1976 priv->prev_status = status;
1977 }
1978
1979 flag = TTY_NORMAL;
1980 if (packet[1] & FTDI_RS_ERR_MASK) {
1981
1982
1983 if (packet[1] & FTDI_RS_BI) {
1984 flag = TTY_BREAK;
1985 priv->icount.brk++;
1986 usb_serial_handle_break(port);
1987 } else if (packet[1] & FTDI_RS_PE) {
1988 flag = TTY_PARITY;
1989 priv->icount.parity++;
1990 } else if (packet[1] & FTDI_RS_FE) {
1991 flag = TTY_FRAME;
1992 priv->icount.frame++;
1993 }
1994
1995 if (packet[1] & FTDI_RS_OE) {
1996 priv->icount.overrun++;
1997 tty_insert_flip_char(tty, 0, TTY_OVERRUN);
1998 }
1999 }
2000
2001
2002 if (packet[1] & FTDI_RS_TEMT)
2003 priv->transmit_empty = 1;
2004 else
2005 priv->transmit_empty = 0;
2006
2007 len -= 2;
2008 if (!len)
2009 return 0;
2010 priv->icount.rx += len;
2011 ch = packet + 2;
2012
2013 if (port->port.console && port->sysrq) {
2014 for (i = 0; i < len; i++, ch++) {
2015 if (!usb_serial_handle_sysrq_char(port, *ch))
2016 tty_insert_flip_char(tty, *ch, flag);
2017 }
2018 } else {
2019 tty_insert_flip_string_fixed_flag(tty, ch, flag, len);
2020 }
2021
2022 return len;
2023}
2024
2025static void ftdi_process_read_urb(struct urb *urb)
2026{
2027 struct usb_serial_port *port = urb->context;
2028 struct tty_struct *tty;
2029 struct ftdi_private *priv = usb_get_serial_port_data(port);
2030 char *data = (char *)urb->transfer_buffer;
2031 int i;
2032 int len;
2033 int count = 0;
2034
2035 tty = tty_port_tty_get(&port->port);
2036 if (!tty)
2037 return;
2038
2039 for (i = 0; i < urb->actual_length; i += priv->max_packet_size) {
2040 len = min_t(int, urb->actual_length - i, priv->max_packet_size);
2041 count += ftdi_process_packet(tty, port, priv, &data[i], len);
2042 }
2043
2044 if (count)
2045 tty_flip_buffer_push(tty);
2046 tty_kref_put(tty);
2047}
2048
2049static void ftdi_break_ctl(struct tty_struct *tty, int break_state)
2050{
2051 struct usb_serial_port *port = tty->driver_data;
2052 struct ftdi_private *priv = usb_get_serial_port_data(port);
2053 __u16 urb_value;
2054
2055
2056
2057
2058
2059 if (break_state)
2060 urb_value = priv->last_set_data_urb_value | FTDI_SIO_SET_BREAK;
2061 else
2062 urb_value = priv->last_set_data_urb_value;
2063
2064 if (usb_control_msg(port->serial->dev,
2065 usb_sndctrlpipe(port->serial->dev, 0),
2066 FTDI_SIO_SET_DATA_REQUEST,
2067 FTDI_SIO_SET_DATA_REQUEST_TYPE,
2068 urb_value , priv->interface,
2069 NULL, 0, WDR_TIMEOUT) < 0) {
2070 dev_err(&port->dev, "%s FAILED to enable/disable break state "
2071 "(state was %d)\n", __func__, break_state);
2072 }
2073
2074 dbg("%s break state is %d - urb is %d", __func__,
2075 break_state, urb_value);
2076
2077}
2078
2079
2080
2081
2082
2083static void ftdi_set_termios(struct tty_struct *tty,
2084 struct usb_serial_port *port, struct ktermios *old_termios)
2085{
2086 struct usb_device *dev = port->serial->dev;
2087 struct ftdi_private *priv = usb_get_serial_port_data(port);
2088 struct ktermios *termios = tty->termios;
2089 unsigned int cflag = termios->c_cflag;
2090 __u16 urb_value;
2091
2092
2093 unsigned int iflag = termios->c_iflag;
2094 unsigned char vstop;
2095 unsigned char vstart;
2096
2097 dbg("%s", __func__);
2098
2099
2100
2101 if (priv->force_baud && ((termios->c_cflag & CBAUD) != B0)) {
2102 dbg("%s: forcing baud rate for this device", __func__);
2103 tty_encode_baud_rate(tty, priv->force_baud,
2104 priv->force_baud);
2105 }
2106
2107
2108 if (priv->force_rtscts) {
2109 dbg("%s: forcing rtscts for this device", __func__);
2110 termios->c_cflag |= CRTSCTS;
2111 }
2112
2113 cflag = termios->c_cflag;
2114
2115 if (old_termios->c_cflag == termios->c_cflag
2116 && old_termios->c_ispeed == termios->c_ispeed
2117 && old_termios->c_ospeed == termios->c_ospeed)
2118 goto no_c_cflag_changes;
2119
2120
2121
2122
2123
2124 if ((old_termios->c_cflag & (CSIZE|PARODD|PARENB|CMSPAR|CSTOPB)) ==
2125 (termios->c_cflag & (CSIZE|PARODD|PARENB|CMSPAR|CSTOPB)))
2126 goto no_data_parity_stop_changes;
2127
2128
2129
2130 urb_value = 0;
2131 urb_value |= (cflag & CSTOPB ? FTDI_SIO_SET_DATA_STOP_BITS_2 :
2132 FTDI_SIO_SET_DATA_STOP_BITS_1);
2133 if (cflag & PARENB) {
2134 if (cflag & CMSPAR)
2135 urb_value |= cflag & PARODD ?
2136 FTDI_SIO_SET_DATA_PARITY_MARK :
2137 FTDI_SIO_SET_DATA_PARITY_SPACE;
2138 else
2139 urb_value |= cflag & PARODD ?
2140 FTDI_SIO_SET_DATA_PARITY_ODD :
2141 FTDI_SIO_SET_DATA_PARITY_EVEN;
2142 } else {
2143 urb_value |= FTDI_SIO_SET_DATA_PARITY_NONE;
2144 }
2145 if (cflag & CSIZE) {
2146 switch (cflag & CSIZE) {
2147 case CS7: urb_value |= 7; dbg("Setting CS7"); break;
2148 case CS8: urb_value |= 8; dbg("Setting CS8"); break;
2149 default:
2150 dev_err(&port->dev, "CSIZE was set but not CS7-CS8\n");
2151 }
2152 }
2153
2154
2155
2156 priv->last_set_data_urb_value = urb_value;
2157
2158 if (usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
2159 FTDI_SIO_SET_DATA_REQUEST,
2160 FTDI_SIO_SET_DATA_REQUEST_TYPE,
2161 urb_value , priv->interface,
2162 NULL, 0, WDR_SHORT_TIMEOUT) < 0) {
2163 dev_err(&port->dev, "%s FAILED to set "
2164 "databits/stopbits/parity\n", __func__);
2165 }
2166
2167
2168no_data_parity_stop_changes:
2169 if ((cflag & CBAUD) == B0) {
2170
2171 if (usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
2172 FTDI_SIO_SET_FLOW_CTRL_REQUEST,
2173 FTDI_SIO_SET_FLOW_CTRL_REQUEST_TYPE,
2174 0, priv->interface,
2175 NULL, 0, WDR_TIMEOUT) < 0) {
2176 dev_err(&port->dev,
2177 "%s error from disable flowcontrol urb\n",
2178 __func__);
2179 }
2180
2181 clear_mctrl(port, TIOCM_DTR | TIOCM_RTS);
2182 } else {
2183
2184 mutex_lock(&priv->cfg_lock);
2185 if (change_speed(tty, port))
2186 dev_err(&port->dev, "%s urb failed to set baudrate\n",
2187 __func__);
2188 mutex_unlock(&priv->cfg_lock);
2189
2190 if (!old_termios || (old_termios->c_cflag & CBAUD) == B0)
2191 set_mctrl(port, TIOCM_DTR | TIOCM_RTS);
2192 }
2193
2194
2195
2196no_c_cflag_changes:
2197 if (cflag & CRTSCTS) {
2198 dbg("%s Setting to CRTSCTS flow control", __func__);
2199 if (usb_control_msg(dev,
2200 usb_sndctrlpipe(dev, 0),
2201 FTDI_SIO_SET_FLOW_CTRL_REQUEST,
2202 FTDI_SIO_SET_FLOW_CTRL_REQUEST_TYPE,
2203 0 , (FTDI_SIO_RTS_CTS_HS | priv->interface),
2204 NULL, 0, WDR_TIMEOUT) < 0) {
2205 dev_err(&port->dev,
2206 "urb failed to set to rts/cts flow control\n");
2207 }
2208
2209 } else {
2210
2211
2212
2213
2214
2215
2216
2217 if (iflag & IXOFF) {
2218 dbg("%s request to enable xonxoff iflag=%04x",
2219 __func__, iflag);
2220
2221
2222
2223
2224
2225
2226 vstart = termios->c_cc[VSTART];
2227 vstop = termios->c_cc[VSTOP];
2228 urb_value = (vstop << 8) | (vstart);
2229
2230 if (usb_control_msg(dev,
2231 usb_sndctrlpipe(dev, 0),
2232 FTDI_SIO_SET_FLOW_CTRL_REQUEST,
2233 FTDI_SIO_SET_FLOW_CTRL_REQUEST_TYPE,
2234 urb_value , (FTDI_SIO_XON_XOFF_HS
2235 | priv->interface),
2236 NULL, 0, WDR_TIMEOUT) < 0) {
2237 dev_err(&port->dev, "urb failed to set to "
2238 "xon/xoff flow control\n");
2239 }
2240 } else {
2241
2242
2243
2244 dbg("%s Turning off hardware flow control", __func__);
2245 if (usb_control_msg(dev,
2246 usb_sndctrlpipe(dev, 0),
2247 FTDI_SIO_SET_FLOW_CTRL_REQUEST,
2248 FTDI_SIO_SET_FLOW_CTRL_REQUEST_TYPE,
2249 0, priv->interface,
2250 NULL, 0, WDR_TIMEOUT) < 0) {
2251 dev_err(&port->dev,
2252 "urb failed to clear flow control\n");
2253 }
2254 }
2255
2256 }
2257}
2258
2259static int ftdi_tiocmget(struct tty_struct *tty)
2260{
2261 struct usb_serial_port *port = tty->driver_data;
2262 struct ftdi_private *priv = usb_get_serial_port_data(port);
2263 unsigned char *buf;
2264 int len;
2265 int ret;
2266
2267 dbg("%s TIOCMGET", __func__);
2268
2269 buf = kmalloc(2, GFP_KERNEL);
2270 if (!buf)
2271 return -ENOMEM;
2272
2273
2274
2275
2276 switch (priv->chip_type) {
2277 case SIO:
2278 len = 1;
2279 break;
2280 case FT8U232AM:
2281 case FT232BM:
2282 case FT2232C:
2283 case FT232RL:
2284 case FT2232H:
2285 case FT4232H:
2286 case FT232H:
2287 len = 2;
2288 break;
2289 default:
2290 ret = -EFAULT;
2291 goto out;
2292 }
2293
2294 ret = usb_control_msg(port->serial->dev,
2295 usb_rcvctrlpipe(port->serial->dev, 0),
2296 FTDI_SIO_GET_MODEM_STATUS_REQUEST,
2297 FTDI_SIO_GET_MODEM_STATUS_REQUEST_TYPE,
2298 0, priv->interface,
2299 buf, len, WDR_TIMEOUT);
2300 if (ret < 0)
2301 goto out;
2302
2303 ret = (buf[0] & FTDI_SIO_DSR_MASK ? TIOCM_DSR : 0) |
2304 (buf[0] & FTDI_SIO_CTS_MASK ? TIOCM_CTS : 0) |
2305 (buf[0] & FTDI_SIO_RI_MASK ? TIOCM_RI : 0) |
2306 (buf[0] & FTDI_SIO_RLSD_MASK ? TIOCM_CD : 0) |
2307 priv->last_dtr_rts;
2308out:
2309 kfree(buf);
2310 return ret;
2311}
2312
2313static int ftdi_tiocmset(struct tty_struct *tty,
2314 unsigned int set, unsigned int clear)
2315{
2316 struct usb_serial_port *port = tty->driver_data;
2317 dbg("%s TIOCMSET", __func__);
2318 return update_mctrl(port, set, clear);
2319}
2320
2321static int ftdi_get_icount(struct tty_struct *tty,
2322 struct serial_icounter_struct *icount)
2323{
2324 struct usb_serial_port *port = tty->driver_data;
2325 struct ftdi_private *priv = usb_get_serial_port_data(port);
2326 struct async_icount *ic = &priv->icount;
2327
2328 icount->cts = ic->cts;
2329 icount->dsr = ic->dsr;
2330 icount->rng = ic->rng;
2331 icount->dcd = ic->dcd;
2332 icount->tx = ic->tx;
2333 icount->rx = ic->rx;
2334 icount->frame = ic->frame;
2335 icount->parity = ic->parity;
2336 icount->overrun = ic->overrun;
2337 icount->brk = ic->brk;
2338 icount->buf_overrun = ic->buf_overrun;
2339 return 0;
2340}
2341
2342static int ftdi_ioctl(struct tty_struct *tty,
2343 unsigned int cmd, unsigned long arg)
2344{
2345 struct usb_serial_port *port = tty->driver_data;
2346 struct ftdi_private *priv = usb_get_serial_port_data(port);
2347 struct async_icount cnow;
2348 struct async_icount cprev;
2349
2350 dbg("%s cmd 0x%04x", __func__, cmd);
2351
2352
2353 switch (cmd) {
2354
2355 case TIOCGSERIAL:
2356 return get_serial_info(port,
2357 (struct serial_struct __user *) arg);
2358
2359 case TIOCSSERIAL:
2360 return set_serial_info(tty, port,
2361 (struct serial_struct __user *) arg);
2362
2363
2364
2365
2366
2367
2368
2369
2370
2371 case TIOCMIWAIT:
2372 cprev = priv->icount;
2373 while (1) {
2374 interruptible_sleep_on(&priv->delta_msr_wait);
2375
2376 if (signal_pending(current))
2377 return -ERESTARTSYS;
2378 cnow = priv->icount;
2379 if (cnow.rng == cprev.rng && cnow.dsr == cprev.dsr &&
2380 cnow.dcd == cprev.dcd && cnow.cts == cprev.cts)
2381 return -EIO;
2382 if (((arg & TIOCM_RNG) && (cnow.rng != cprev.rng)) ||
2383 ((arg & TIOCM_DSR) && (cnow.dsr != cprev.dsr)) ||
2384 ((arg & TIOCM_CD) && (cnow.dcd != cprev.dcd)) ||
2385 ((arg & TIOCM_CTS) && (cnow.cts != cprev.cts))) {
2386 return 0;
2387 }
2388 cprev = cnow;
2389 }
2390
2391 break;
2392 case TIOCSERGETLSR:
2393 return get_lsr_info(port, (struct serial_struct __user *)arg);
2394 break;
2395 default:
2396 break;
2397 }
2398
2399
2400
2401 dbg("%s arg not supported - it was 0x%04x - check /usr/include/asm/ioctls.h", __func__, cmd);
2402 return -ENOIOCTLCMD;
2403}
2404
2405static int __init ftdi_init(void)
2406{
2407 int retval;
2408
2409 dbg("%s", __func__);
2410 if (vendor > 0 && product > 0) {
2411
2412 int i;
2413 for (i = 0; id_table_combined[i].idVendor; i++)
2414 ;
2415 id_table_combined[i].match_flags = USB_DEVICE_ID_MATCH_DEVICE;
2416 id_table_combined[i].idVendor = vendor;
2417 id_table_combined[i].idProduct = product;
2418 }
2419 retval = usb_serial_register(&ftdi_sio_device);
2420 if (retval)
2421 goto failed_sio_register;
2422 retval = usb_register(&ftdi_driver);
2423 if (retval)
2424 goto failed_usb_register;
2425
2426 printk(KERN_INFO KBUILD_MODNAME ": " DRIVER_VERSION ":"
2427 DRIVER_DESC "\n");
2428 return 0;
2429failed_usb_register:
2430 usb_serial_deregister(&ftdi_sio_device);
2431failed_sio_register:
2432 return retval;
2433}
2434
2435static void __exit ftdi_exit(void)
2436{
2437 dbg("%s", __func__);
2438
2439 usb_deregister(&ftdi_driver);
2440 usb_serial_deregister(&ftdi_sio_device);
2441}
2442
2443
2444module_init(ftdi_init);
2445module_exit(ftdi_exit);
2446
2447MODULE_AUTHOR(DRIVER_AUTHOR);
2448MODULE_DESCRIPTION(DRIVER_DESC);
2449MODULE_LICENSE("GPL");
2450
2451module_param(debug, bool, S_IRUGO | S_IWUSR);
2452MODULE_PARM_DESC(debug, "Debug enabled or not");
2453module_param(vendor, ushort, 0);
2454MODULE_PARM_DESC(vendor, "User specified vendor ID (default="
2455 __MODULE_STRING(FTDI_VID)")");
2456module_param(product, ushort, 0);
2457MODULE_PARM_DESC(product, "User specified product ID");
2458
2459module_param(ndi_latency_timer, int, S_IRUGO | S_IWUSR);
2460MODULE_PARM_DESC(ndi_latency_timer, "NDI device latency timer override");
2461