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