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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248#include <linux/kernel.h>
249#include <linux/errno.h>
250#include <linux/init.h>
251#include <linux/slab.h>
252#include <linux/tty.h>
253#include <linux/tty_driver.h>
254#include <linux/tty_flip.h>
255#include <linux/module.h>
256#include <linux/spinlock.h>
257#include <asm/uaccess.h>
258#include <linux/usb.h>
259#include <linux/serial.h>
260#include <linux/usb/serial.h>
261#include "ftdi_sio.h"
262
263
264
265
266#define DRIVER_VERSION "v1.4.3"
267#define DRIVER_AUTHOR "Greg Kroah-Hartman <greg@kroah.com>, Bill Ryder <bryder@sgi.com>, Kuba Ober <kuba@mareimbrium.org>"
268#define DRIVER_DESC "USB FTDI Serial Converters Driver"
269
270static int debug;
271static __u16 vendor = FTDI_VID;
272static __u16 product;
273
274struct ftdi_private {
275 ftdi_chip_type_t chip_type;
276
277 int baud_base;
278 int custom_divisor;
279 __u16 last_set_data_urb_value ;
280
281 int write_offset;
282
283
284 int flags;
285 unsigned long last_dtr_rts;
286 wait_queue_head_t delta_msr_wait;
287 char prev_status, diff_status;
288 __u8 rx_flags;
289 spinlock_t rx_lock;
290 struct delayed_work rx_work;
291 struct usb_serial_port *port;
292 int rx_processed;
293 unsigned long rx_bytes;
294
295 __u16 interface;
296
297 speed_t force_baud;
298 int force_rtscts;
299
300 spinlock_t tx_lock;
301 unsigned long tx_bytes;
302 unsigned long tx_outstanding_bytes;
303 unsigned long tx_outstanding_urbs;
304};
305
306
307struct ftdi_sio_quirk {
308 int (*probe)(struct usb_serial *);
309 void (*port_probe)(struct ftdi_private *);
310};
311
312static int ftdi_olimex_probe (struct usb_serial *serial);
313static void ftdi_USB_UIRT_setup (struct ftdi_private *priv);
314static void ftdi_HE_TIRA1_setup (struct ftdi_private *priv);
315
316static struct ftdi_sio_quirk ftdi_olimex_quirk = {
317 .probe = ftdi_olimex_probe,
318};
319
320static struct ftdi_sio_quirk ftdi_USB_UIRT_quirk = {
321 .port_probe = ftdi_USB_UIRT_setup,
322};
323
324static struct ftdi_sio_quirk ftdi_HE_TIRA1_quirk = {
325 .port_probe = ftdi_HE_TIRA1_setup,
326};
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346static struct usb_device_id id_table_combined [] = {
347 { USB_DEVICE(FTDI_VID, FTDI_AMC232_PID) },
348 { USB_DEVICE(FTDI_VID, FTDI_CANUSB_PID) },
349 { USB_DEVICE(FTDI_VID, FTDI_ACTZWAVE_PID) },
350 { USB_DEVICE(FTDI_VID, FTDI_IRTRANS_PID) },
351 { USB_DEVICE(FTDI_VID, FTDI_IPLUS_PID) },
352 { USB_DEVICE(FTDI_VID, FTDI_IPLUS2_PID) },
353 { USB_DEVICE(FTDI_VID, FTDI_DMX4ALL) },
354 { USB_DEVICE(FTDI_VID, FTDI_SIO_PID) },
355 { USB_DEVICE(FTDI_VID, FTDI_8U232AM_PID) },
356 { USB_DEVICE(FTDI_VID, FTDI_8U232AM_ALT_PID) },
357 { USB_DEVICE(FTDI_VID, FTDI_232RL_PID) },
358 { USB_DEVICE(FTDI_VID, FTDI_8U2232C_PID) },
359 { USB_DEVICE(FTDI_VID, FTDI_MICRO_CHAMELEON_PID) },
360 { USB_DEVICE(FTDI_VID, FTDI_RELAIS_PID) },
361 { USB_DEVICE(FTDI_VID, FTDI_OPENDCC_PID) },
362 { USB_DEVICE(INTERBIOMETRICS_VID, INTERBIOMETRICS_IOBOARD_PID) },
363 { USB_DEVICE(INTERBIOMETRICS_VID, INTERBIOMETRICS_MINI_IOBOARD_PID) },
364 { USB_DEVICE(FTDI_VID, FTDI_XF_632_PID) },
365 { USB_DEVICE(FTDI_VID, FTDI_XF_634_PID) },
366 { USB_DEVICE(FTDI_VID, FTDI_XF_547_PID) },
367 { USB_DEVICE(FTDI_VID, FTDI_XF_633_PID) },
368 { USB_DEVICE(FTDI_VID, FTDI_XF_631_PID) },
369 { USB_DEVICE(FTDI_VID, FTDI_XF_635_PID) },
370 { USB_DEVICE(FTDI_VID, FTDI_XF_640_PID) },
371 { USB_DEVICE(FTDI_VID, FTDI_XF_642_PID) },
372 { USB_DEVICE(FTDI_VID, FTDI_DSS20_PID) },
373 { USB_DEVICE(FTDI_NF_RIC_VID, FTDI_NF_RIC_PID) },
374 { USB_DEVICE(FTDI_VID, FTDI_VNHCPCUSB_D_PID) },
375 { USB_DEVICE(FTDI_VID, FTDI_MTXORB_0_PID) },
376 { USB_DEVICE(FTDI_VID, FTDI_MTXORB_1_PID) },
377 { USB_DEVICE(FTDI_VID, FTDI_MTXORB_2_PID) },
378 { USB_DEVICE(FTDI_VID, FTDI_MTXORB_3_PID) },
379 { USB_DEVICE(FTDI_VID, FTDI_MTXORB_4_PID) },
380 { USB_DEVICE(FTDI_VID, FTDI_MTXORB_5_PID) },
381 { USB_DEVICE(FTDI_VID, FTDI_MTXORB_6_PID) },
382 { USB_DEVICE(FTDI_VID, FTDI_PERLE_ULTRAPORT_PID) },
383 { USB_DEVICE(FTDI_VID, FTDI_PIEGROUP_PID) },
384 { USB_DEVICE(FTDI_VID, FTDI_TNC_X_PID) },
385 { USB_DEVICE(FTDI_VID, FTDI_USBX_707_PID) },
386 { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2101_PID) },
387 { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2102_PID) },
388 { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2103_PID) },
389 { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2104_PID) },
390 { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2106_PID) },
391 { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2201_1_PID) },
392 { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2201_2_PID) },
393 { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2202_1_PID) },
394 { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2202_2_PID) },
395 { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2203_1_PID) },
396 { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2203_2_PID) },
397 { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2401_1_PID) },
398 { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2401_2_PID) },
399 { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2401_3_PID) },
400 { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2401_4_PID) },
401 { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2402_1_PID) },
402 { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2402_2_PID) },
403 { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2402_3_PID) },
404 { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2402_4_PID) },
405 { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2403_1_PID) },
406 { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2403_2_PID) },
407 { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2403_3_PID) },
408 { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2403_4_PID) },
409 { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2801_1_PID) },
410 { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2801_2_PID) },
411 { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2801_3_PID) },
412 { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2801_4_PID) },
413 { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2801_5_PID) },
414 { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2801_6_PID) },
415 { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2801_7_PID) },
416 { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2801_8_PID) },
417 { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2802_1_PID) },
418 { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2802_2_PID) },
419 { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2802_3_PID) },
420 { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2802_4_PID) },
421 { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2802_5_PID) },
422 { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2802_6_PID) },
423 { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2802_7_PID) },
424 { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2802_8_PID) },
425 { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2803_1_PID) },
426 { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2803_2_PID) },
427 { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2803_3_PID) },
428 { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2803_4_PID) },
429 { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2803_5_PID) },
430 { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2803_6_PID) },
431 { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2803_7_PID) },
432 { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2803_8_PID) },
433 { USB_DEVICE(IDTECH_VID, IDTECH_IDT1221U_PID) },
434 { USB_DEVICE(OCT_VID, OCT_US101_PID) },
435 { USB_DEVICE(FTDI_VID, FTDI_HE_TIRA1_PID),
436 .driver_info = (kernel_ulong_t)&ftdi_HE_TIRA1_quirk },
437 { USB_DEVICE(FTDI_VID, FTDI_USB_UIRT_PID),
438 .driver_info = (kernel_ulong_t)&ftdi_USB_UIRT_quirk },
439 { USB_DEVICE(FTDI_VID, PROTEGO_SPECIAL_1) },
440 { USB_DEVICE(FTDI_VID, PROTEGO_R2X0) },
441 { USB_DEVICE(FTDI_VID, PROTEGO_SPECIAL_3) },
442 { USB_DEVICE(FTDI_VID, PROTEGO_SPECIAL_4) },
443 { USB_DEVICE(FTDI_VID, FTDI_GUDEADS_E808_PID) },
444 { USB_DEVICE(FTDI_VID, FTDI_GUDEADS_E809_PID) },
445 { USB_DEVICE(FTDI_VID, FTDI_GUDEADS_E80A_PID) },
446 { USB_DEVICE(FTDI_VID, FTDI_GUDEADS_E80B_PID) },
447 { USB_DEVICE(FTDI_VID, FTDI_GUDEADS_E80C_PID) },
448 { USB_DEVICE(FTDI_VID, FTDI_GUDEADS_E80D_PID) },
449 { USB_DEVICE(FTDI_VID, FTDI_GUDEADS_E80E_PID) },
450 { USB_DEVICE(FTDI_VID, FTDI_GUDEADS_E80F_PID) },
451 { USB_DEVICE(FTDI_VID, FTDI_GUDEADS_E888_PID) },
452 { USB_DEVICE(FTDI_VID, FTDI_GUDEADS_E889_PID) },
453 { USB_DEVICE(FTDI_VID, FTDI_GUDEADS_E88A_PID) },
454 { USB_DEVICE(FTDI_VID, FTDI_GUDEADS_E88B_PID) },
455 { USB_DEVICE(FTDI_VID, FTDI_GUDEADS_E88C_PID) },
456 { USB_DEVICE(FTDI_VID, FTDI_GUDEADS_E88D_PID) },
457 { USB_DEVICE(FTDI_VID, FTDI_GUDEADS_E88E_PID) },
458 { USB_DEVICE(FTDI_VID, FTDI_GUDEADS_E88F_PID) },
459 { USB_DEVICE(FTDI_VID, FTDI_ELV_UO100_PID) },
460 { USB_DEVICE(FTDI_VID, FTDI_ELV_UM100_PID) },
461 { USB_DEVICE(FTDI_VID, FTDI_ELV_UR100_PID) },
462 { USB_DEVICE(FTDI_VID, FTDI_ELV_ALC8500_PID) },
463 { USB_DEVICE(FTDI_VID, FTDI_PYRAMID_PID) },
464 { USB_DEVICE(FTDI_VID, FTDI_ELV_FHZ1000PC_PID) },
465 { USB_DEVICE(FTDI_VID, FTDI_IBS_US485_PID) },
466 { USB_DEVICE(FTDI_VID, FTDI_IBS_PICPRO_PID) },
467 { USB_DEVICE(FTDI_VID, FTDI_IBS_PCMCIA_PID) },
468 { USB_DEVICE(FTDI_VID, FTDI_IBS_PK1_PID) },
469 { USB_DEVICE(FTDI_VID, FTDI_IBS_RS232MON_PID) },
470 { USB_DEVICE(FTDI_VID, FTDI_IBS_APP70_PID) },
471 { USB_DEVICE(FTDI_VID, FTDI_IBS_PEDO_PID) },
472 { USB_DEVICE(FTDI_VID, FTDI_IBS_PROD_PID) },
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498 { USB_DEVICE(FTDI_VID, LINX_SDMUSBQSS_PID) },
499 { USB_DEVICE(FTDI_VID, LINX_MASTERDEVEL2_PID) },
500 { USB_DEVICE(FTDI_VID, LINX_FUTURE_0_PID) },
501 { USB_DEVICE(FTDI_VID, LINX_FUTURE_1_PID) },
502 { USB_DEVICE(FTDI_VID, LINX_FUTURE_2_PID) },
503 { USB_DEVICE(FTDI_VID, FTDI_CCSICDU20_0_PID) },
504 { USB_DEVICE(FTDI_VID, FTDI_CCSICDU40_1_PID) },
505 { USB_DEVICE(FTDI_VID, FTDI_CCSMACHX_2_PID) },
506 { USB_DEVICE(FTDI_VID, INSIDE_ACCESSO) },
507 { USB_DEVICE(INTREPID_VID, INTREPID_VALUECAN_PID) },
508 { USB_DEVICE(INTREPID_VID, INTREPID_NEOVI_PID) },
509 { USB_DEVICE(FALCOM_VID, FALCOM_TWIST_PID) },
510 { USB_DEVICE(FALCOM_VID, FALCOM_SAMBA_PID) },
511 { USB_DEVICE(FTDI_VID, FTDI_SUUNTO_SPORTS_PID) },
512 { USB_DEVICE(TTI_VID, TTI_QL355P_PID) },
513 { USB_DEVICE(FTDI_VID, FTDI_RM_CANVIEW_PID) },
514 { USB_DEVICE(BANDB_VID, BANDB_USOTL4_PID) },
515 { USB_DEVICE(BANDB_VID, BANDB_USTL4_PID) },
516 { USB_DEVICE(BANDB_VID, BANDB_USO9ML2_PID) },
517 { USB_DEVICE(FTDI_VID, EVER_ECO_PRO_CDS) },
518 { USB_DEVICE(FTDI_VID, FTDI_4N_GALAXY_DE_1_PID) },
519 { USB_DEVICE(FTDI_VID, FTDI_4N_GALAXY_DE_2_PID) },
520 { USB_DEVICE(FTDI_VID, XSENS_CONVERTER_0_PID) },
521 { USB_DEVICE(FTDI_VID, XSENS_CONVERTER_1_PID) },
522 { USB_DEVICE(FTDI_VID, XSENS_CONVERTER_2_PID) },
523 { USB_DEVICE(FTDI_VID, XSENS_CONVERTER_3_PID) },
524 { USB_DEVICE(FTDI_VID, XSENS_CONVERTER_4_PID) },
525 { USB_DEVICE(FTDI_VID, XSENS_CONVERTER_5_PID) },
526 { USB_DEVICE(FTDI_VID, XSENS_CONVERTER_6_PID) },
527 { USB_DEVICE(FTDI_VID, XSENS_CONVERTER_7_PID) },
528 { USB_DEVICE(MOBILITY_VID, MOBILITY_USB_SERIAL_PID) },
529 { USB_DEVICE(FTDI_VID, FTDI_ACTIVE_ROBOTS_PID) },
530 { USB_DEVICE(FTDI_VID, FTDI_MHAM_KW_PID) },
531 { USB_DEVICE(FTDI_VID, FTDI_MHAM_YS_PID) },
532 { USB_DEVICE(FTDI_VID, FTDI_MHAM_Y6_PID) },
533 { USB_DEVICE(FTDI_VID, FTDI_MHAM_Y8_PID) },
534 { USB_DEVICE(FTDI_VID, FTDI_MHAM_IC_PID) },
535 { USB_DEVICE(FTDI_VID, FTDI_MHAM_DB9_PID) },
536 { USB_DEVICE(FTDI_VID, FTDI_MHAM_RS232_PID) },
537 { USB_DEVICE(FTDI_VID, FTDI_MHAM_Y9_PID) },
538 { USB_DEVICE(FTDI_VID, FTDI_TERATRONIK_VCP_PID) },
539 { USB_DEVICE(FTDI_VID, FTDI_TERATRONIK_D2XX_PID) },
540 { USB_DEVICE(EVOLUTION_VID, EVOLUTION_ER1_PID) },
541 { USB_DEVICE(EVOLUTION_VID, EVO_HYBRID_PID) },
542 { USB_DEVICE(EVOLUTION_VID, EVO_RCM4_PID) },
543 { USB_DEVICE(FTDI_VID, FTDI_ARTEMIS_PID) },
544 { USB_DEVICE(FTDI_VID, FTDI_ATIK_ATK16_PID) },
545 { USB_DEVICE(FTDI_VID, FTDI_ATIK_ATK16C_PID) },
546 { USB_DEVICE(FTDI_VID, FTDI_ATIK_ATK16HR_PID) },
547 { USB_DEVICE(FTDI_VID, FTDI_ATIK_ATK16HRC_PID) },
548 { USB_DEVICE(KOBIL_VID, KOBIL_CONV_B1_PID) },
549 { USB_DEVICE(KOBIL_VID, KOBIL_CONV_KAAN_PID) },
550 { USB_DEVICE(POSIFLEX_VID, POSIFLEX_PP7000_PID) },
551 { USB_DEVICE(FTDI_VID, FTDI_TTUSB_PID) },
552 { USB_DEVICE(FTDI_VID, FTDI_ECLO_COM_1WIRE_PID) },
553 { USB_DEVICE(FTDI_VID, FTDI_WESTREX_MODEL_777_PID) },
554 { USB_DEVICE(FTDI_VID, FTDI_WESTREX_MODEL_8900F_PID) },
555 { USB_DEVICE(FTDI_VID, FTDI_PCDJ_DAC2_PID) },
556 { USB_DEVICE(FTDI_VID, FTDI_RRCIRKITS_LOCOBUFFER_PID) },
557 { USB_DEVICE(FTDI_VID, FTDI_ASK_RDR400_PID) },
558 { USB_DEVICE(ICOM_ID1_VID, ICOM_ID1_PID) },
559 { USB_DEVICE(PAPOUCH_VID, PAPOUCH_TMU_PID) },
560 { USB_DEVICE(FTDI_VID, FTDI_ACG_HFDUAL_PID) },
561 { USB_DEVICE(FTDI_VID, FTDI_YEI_SERVOCENTER31_PID) },
562 { USB_DEVICE(FTDI_VID, FTDI_THORLABS_PID) },
563 { USB_DEVICE(TESTO_VID, TESTO_USB_INTERFACE_PID) },
564 { USB_DEVICE(FTDI_VID, FTDI_GAMMA_SCOUT_PID) },
565 { USB_DEVICE(FTDI_VID, FTDI_TACTRIX_OPENPORT_13M_PID) },
566 { USB_DEVICE(FTDI_VID, FTDI_TACTRIX_OPENPORT_13S_PID) },
567 { USB_DEVICE(FTDI_VID, FTDI_TACTRIX_OPENPORT_13U_PID) },
568 { USB_DEVICE(ELEKTOR_VID, ELEKTOR_FT323R_PID) },
569 { USB_DEVICE(TELLDUS_VID, TELLDUS_TELLSTICK_PID) },
570 { USB_DEVICE(FTDI_VID, FTDI_MAXSTREAM_PID) },
571 { USB_DEVICE(TML_VID, TML_USB_SERIAL_PID) },
572 { USB_DEVICE(OLIMEX_VID, OLIMEX_ARM_USB_OCD_PID),
573 .driver_info = (kernel_ulong_t)&ftdi_olimex_quirk },
574 { },
575 { }
576};
577
578MODULE_DEVICE_TABLE (usb, id_table_combined);
579
580static struct usb_driver ftdi_driver = {
581 .name = "ftdi_sio",
582 .probe = usb_serial_probe,
583 .disconnect = usb_serial_disconnect,
584 .id_table = id_table_combined,
585 .no_dynamic_id = 1,
586};
587
588static const char *ftdi_chip_name[] = {
589 [SIO] = "SIO",
590 [FT8U232AM] = "FT8U232AM",
591 [FT232BM] = "FT232BM",
592 [FT2232C] = "FT2232C",
593 [FT232RL] = "FT232RL",
594};
595
596
597
598#define BUFSZ 512
599#define PKTSZ 64
600
601
602#define THROTTLED 0x01
603#define ACTUALLY_THROTTLED 0x02
604
605
606#define FTDI_STATUS_B0_MASK (FTDI_RS0_CTS | FTDI_RS0_DSR | FTDI_RS0_RI | FTDI_RS0_RLSD)
607#define FTDI_STATUS_B1_MASK (FTDI_RS_BI)
608
609
610#define FTDI_IMPL_ASYNC_FLAGS = ( ASYNC_SPD_HI | ASYNC_SPD_VHI \
611 ASYNC_SPD_CUST | ASYNC_SPD_SHI | ASYNC_SPD_WARP )
612
613
614static int ftdi_sio_probe (struct usb_serial *serial, const struct usb_device_id *id);
615static void ftdi_shutdown (struct usb_serial *serial);
616static int ftdi_sio_port_probe (struct usb_serial_port *port);
617static int ftdi_sio_port_remove (struct usb_serial_port *port);
618static int ftdi_open (struct usb_serial_port *port, struct file *filp);
619static void ftdi_close (struct usb_serial_port *port, struct file *filp);
620static int ftdi_write (struct usb_serial_port *port, const unsigned char *buf, int count);
621static int ftdi_write_room (struct usb_serial_port *port);
622static int ftdi_chars_in_buffer (struct usb_serial_port *port);
623static void ftdi_write_bulk_callback (struct urb *urb);
624static void ftdi_read_bulk_callback (struct urb *urb);
625static void ftdi_process_read (struct work_struct *work);
626static void ftdi_set_termios (struct usb_serial_port *port, struct ktermios * old);
627static int ftdi_tiocmget (struct usb_serial_port *port, struct file *file);
628static int ftdi_tiocmset (struct usb_serial_port *port, struct file * file, unsigned int set, unsigned int clear);
629static int ftdi_ioctl (struct usb_serial_port *port, struct file * file, unsigned int cmd, unsigned long arg);
630static void ftdi_break_ctl (struct usb_serial_port *port, int break_state );
631static void ftdi_throttle (struct usb_serial_port *port);
632static void ftdi_unthrottle (struct usb_serial_port *port);
633
634static unsigned short int ftdi_232am_baud_base_to_divisor (int baud, int base);
635static unsigned short int ftdi_232am_baud_to_divisor (int baud);
636static __u32 ftdi_232bm_baud_base_to_divisor (int baud, int base);
637static __u32 ftdi_232bm_baud_to_divisor (int baud);
638
639static struct usb_serial_driver ftdi_sio_device = {
640 .driver = {
641 .owner = THIS_MODULE,
642 .name = "ftdi_sio",
643 },
644 .description = "FTDI USB Serial Device",
645 .usb_driver = &ftdi_driver ,
646 .id_table = id_table_combined,
647 .num_interrupt_in = 0,
648 .num_bulk_in = 1,
649 .num_bulk_out = 1,
650 .num_ports = 1,
651 .probe = ftdi_sio_probe,
652 .port_probe = ftdi_sio_port_probe,
653 .port_remove = ftdi_sio_port_remove,
654 .open = ftdi_open,
655 .close = ftdi_close,
656 .throttle = ftdi_throttle,
657 .unthrottle = ftdi_unthrottle,
658 .write = ftdi_write,
659 .write_room = ftdi_write_room,
660 .chars_in_buffer = ftdi_chars_in_buffer,
661 .read_bulk_callback = ftdi_read_bulk_callback,
662 .write_bulk_callback = ftdi_write_bulk_callback,
663 .tiocmget = ftdi_tiocmget,
664 .tiocmset = ftdi_tiocmset,
665 .ioctl = ftdi_ioctl,
666 .set_termios = ftdi_set_termios,
667 .break_ctl = ftdi_break_ctl,
668 .shutdown = ftdi_shutdown,
669};
670
671
672#define WDR_TIMEOUT 5000
673#define WDR_SHORT_TIMEOUT 1000
674
675
676#define HIGH 1
677#define LOW 0
678
679
680#define URB_UPPER_LIMIT 42
681
682
683
684
685
686
687
688static unsigned short int ftdi_232am_baud_base_to_divisor(int baud, int base)
689{
690 unsigned short int divisor;
691 int divisor3 = base / 2 / baud;
692 if ((divisor3 & 0x7) == 7) divisor3 ++;
693 divisor = divisor3 >> 3;
694 divisor3 &= 0x7;
695 if (divisor3 == 1) divisor |= 0xc000; else
696 if (divisor3 >= 4) divisor |= 0x4000; else
697 if (divisor3 != 0) divisor |= 0x8000;
698 if (divisor == 1) divisor = 0;
699 return divisor;
700}
701
702static unsigned short int ftdi_232am_baud_to_divisor(int baud)
703{
704 return(ftdi_232am_baud_base_to_divisor(baud, 48000000));
705}
706
707static __u32 ftdi_232bm_baud_base_to_divisor(int baud, int base)
708{
709 static const unsigned char divfrac[8] = { 0, 3, 2, 4, 1, 5, 6, 7 };
710 __u32 divisor;
711 int divisor3 = base / 2 / baud;
712 divisor = divisor3 >> 3;
713 divisor |= (__u32)divfrac[divisor3 & 0x7] << 14;
714
715 if (divisor == 1) divisor = 0; else
716 if (divisor == 0x4001) divisor = 1;
717 return divisor;
718}
719
720static __u32 ftdi_232bm_baud_to_divisor(int baud)
721{
722 return(ftdi_232bm_baud_base_to_divisor(baud, 48000000));
723}
724
725#define set_mctrl(port, set) update_mctrl((port), (set), 0)
726#define clear_mctrl(port, clear) update_mctrl((port), 0, (clear))
727
728static int update_mctrl(struct usb_serial_port *port, unsigned int set, unsigned int clear)
729{
730 struct ftdi_private *priv = usb_get_serial_port_data(port);
731 char *buf;
732 unsigned urb_value;
733 int rv;
734
735 if (((set | clear) & (TIOCM_DTR | TIOCM_RTS)) == 0) {
736 dbg("%s - DTR|RTS not being set|cleared", __FUNCTION__);
737 return 0;
738 }
739
740 buf = kmalloc(1, GFP_NOIO);
741 if (!buf) {
742 return -ENOMEM;
743 }
744
745 clear &= ~set;
746 urb_value = 0;
747 if (clear & TIOCM_DTR)
748 urb_value |= FTDI_SIO_SET_DTR_LOW;
749 if (clear & TIOCM_RTS)
750 urb_value |= FTDI_SIO_SET_RTS_LOW;
751 if (set & TIOCM_DTR)
752 urb_value |= FTDI_SIO_SET_DTR_HIGH;
753 if (set & TIOCM_RTS)
754 urb_value |= FTDI_SIO_SET_RTS_HIGH;
755 rv = usb_control_msg(port->serial->dev,
756 usb_sndctrlpipe(port->serial->dev, 0),
757 FTDI_SIO_SET_MODEM_CTRL_REQUEST,
758 FTDI_SIO_SET_MODEM_CTRL_REQUEST_TYPE,
759 urb_value, priv->interface,
760 buf, 0, WDR_TIMEOUT);
761
762 kfree(buf);
763 if (rv < 0) {
764 err("%s Error from MODEM_CTRL urb: DTR %s, RTS %s",
765 __FUNCTION__,
766 (set & TIOCM_DTR) ? "HIGH" :
767 (clear & TIOCM_DTR) ? "LOW" : "unchanged",
768 (set & TIOCM_RTS) ? "HIGH" :
769 (clear & TIOCM_RTS) ? "LOW" : "unchanged");
770 } else {
771 dbg("%s - DTR %s, RTS %s", __FUNCTION__,
772 (set & TIOCM_DTR) ? "HIGH" :
773 (clear & TIOCM_DTR) ? "LOW" : "unchanged",
774 (set & TIOCM_RTS) ? "HIGH" :
775 (clear & TIOCM_RTS) ? "LOW" : "unchanged");
776 priv->last_dtr_rts = (priv->last_dtr_rts & ~clear) | set;
777 }
778 return rv;
779}
780
781
782static __u32 get_ftdi_divisor(struct usb_serial_port * port);
783
784
785static int change_speed(struct usb_serial_port *port)
786{
787 struct ftdi_private *priv = usb_get_serial_port_data(port);
788 char *buf;
789 __u16 urb_value;
790 __u16 urb_index;
791 __u32 urb_index_value;
792 int rv;
793
794 buf = kmalloc(1, GFP_NOIO);
795 if (!buf)
796 return -ENOMEM;
797
798 urb_index_value = get_ftdi_divisor(port);
799 urb_value = (__u16)urb_index_value;
800 urb_index = (__u16)(urb_index_value >> 16);
801 if (priv->interface) {
802 urb_index = (__u16)((urb_index << 8) | priv->interface);
803 }
804
805 rv = usb_control_msg(port->serial->dev,
806 usb_sndctrlpipe(port->serial->dev, 0),
807 FTDI_SIO_SET_BAUDRATE_REQUEST,
808 FTDI_SIO_SET_BAUDRATE_REQUEST_TYPE,
809 urb_value, urb_index,
810 buf, 0, WDR_SHORT_TIMEOUT);
811
812 kfree(buf);
813 return rv;
814}
815
816
817static __u32 get_ftdi_divisor(struct usb_serial_port * port)
818{
819 struct ftdi_private *priv = usb_get_serial_port_data(port);
820 __u32 div_value = 0;
821 int div_okay = 1;
822 int baud;
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849 baud = tty_get_baud_rate(port->tty);
850 dbg("%s - tty_get_baud_rate reports speed %d", __FUNCTION__, baud);
851
852
853
854 if (baud == 38400 &&
855 ((priv->flags & ASYNC_SPD_MASK) == ASYNC_SPD_CUST) &&
856 (priv->custom_divisor)) {
857 baud = priv->baud_base / priv->custom_divisor;
858 dbg("%s - custom divisor %d sets baud rate to %d", __FUNCTION__, priv->custom_divisor, baud);
859 }
860
861
862
863 if (!baud) baud = 9600;
864 switch(priv->chip_type) {
865 case SIO:
866 switch(baud) {
867 case 300: div_value = ftdi_sio_b300; break;
868 case 600: div_value = ftdi_sio_b600; break;
869 case 1200: div_value = ftdi_sio_b1200; break;
870 case 2400: div_value = ftdi_sio_b2400; break;
871 case 4800: div_value = ftdi_sio_b4800; break;
872 case 9600: div_value = ftdi_sio_b9600; break;
873 case 19200: div_value = ftdi_sio_b19200; break;
874 case 38400: div_value = ftdi_sio_b38400; break;
875 case 57600: div_value = ftdi_sio_b57600; break;
876 case 115200: div_value = ftdi_sio_b115200; break;
877 }
878 if (div_value == 0) {
879 dbg("%s - Baudrate (%d) requested is not supported", __FUNCTION__, baud);
880 div_value = ftdi_sio_b9600;
881 baud = 9600;
882 div_okay = 0;
883 }
884 break;
885 case FT8U232AM:
886 if (baud <= 3000000) {
887 div_value = ftdi_232am_baud_to_divisor(baud);
888 } else {
889 dbg("%s - Baud rate too high!", __FUNCTION__);
890 baud = 9600;
891 div_value = ftdi_232am_baud_to_divisor(9600);
892 div_okay = 0;
893 }
894 break;
895 case FT232BM:
896 case FT2232C:
897 case FT232RL:
898 if (baud <= 3000000) {
899 div_value = ftdi_232bm_baud_to_divisor(baud);
900 } else {
901 dbg("%s - Baud rate too high!", __FUNCTION__);
902 div_value = ftdi_232bm_baud_to_divisor(9600);
903 div_okay = 0;
904 baud = 9600;
905 }
906 break;
907 }
908
909 if (div_okay) {
910 dbg("%s - Baud rate set to %d (divisor 0x%lX) on chip %s",
911 __FUNCTION__, baud, (unsigned long)div_value,
912 ftdi_chip_name[priv->chip_type]);
913 }
914
915 tty_encode_baud_rate(port->tty, baud, baud);
916 return(div_value);
917}
918
919
920static int get_serial_info(struct usb_serial_port * port, struct serial_struct __user * retinfo)
921{
922 struct ftdi_private *priv = usb_get_serial_port_data(port);
923 struct serial_struct tmp;
924
925 if (!retinfo)
926 return -EFAULT;
927 memset(&tmp, 0, sizeof(tmp));
928 tmp.flags = priv->flags;
929 tmp.baud_base = priv->baud_base;
930 tmp.custom_divisor = priv->custom_divisor;
931 if (copy_to_user(retinfo, &tmp, sizeof(*retinfo)))
932 return -EFAULT;
933 return 0;
934}
935
936
937static int set_serial_info(struct usb_serial_port * port, struct serial_struct __user * newinfo)
938{
939 struct ftdi_private *priv = usb_get_serial_port_data(port);
940 struct serial_struct new_serial;
941 struct ftdi_private old_priv;
942
943 if (copy_from_user(&new_serial, newinfo, sizeof(new_serial)))
944 return -EFAULT;
945 old_priv = * priv;
946
947
948
949 if (!capable(CAP_SYS_ADMIN)) {
950 if (((new_serial.flags & ~ASYNC_USR_MASK) !=
951 (priv->flags & ~ASYNC_USR_MASK)))
952 return -EPERM;
953 priv->flags = ((priv->flags & ~ASYNC_USR_MASK) |
954 (new_serial.flags & ASYNC_USR_MASK));
955 priv->custom_divisor = new_serial.custom_divisor;
956 goto check_and_exit;
957 }
958
959 if ((new_serial.baud_base != priv->baud_base) &&
960 (new_serial.baud_base < 9600))
961 return -EINVAL;
962
963
964
965 priv->flags = ((priv->flags & ~ASYNC_FLAGS) |
966 (new_serial.flags & ASYNC_FLAGS));
967 priv->custom_divisor = new_serial.custom_divisor;
968
969 port->tty->low_latency = (priv->flags & ASYNC_LOW_LATENCY) ? 1 : 0;
970
971check_and_exit:
972 if ((old_priv.flags & ASYNC_SPD_MASK) !=
973 (priv->flags & ASYNC_SPD_MASK)) {
974 if ((priv->flags & ASYNC_SPD_MASK) == ASYNC_SPD_HI)
975 port->tty->alt_speed = 57600;
976 else if ((priv->flags & ASYNC_SPD_MASK) == ASYNC_SPD_VHI)
977 port->tty->alt_speed = 115200;
978 else if ((priv->flags & ASYNC_SPD_MASK) == ASYNC_SPD_SHI)
979 port->tty->alt_speed = 230400;
980 else if ((priv->flags & ASYNC_SPD_MASK) == ASYNC_SPD_WARP)
981 port->tty->alt_speed = 460800;
982 else
983 port->tty->alt_speed = 0;
984 }
985 if (((old_priv.flags & ASYNC_SPD_MASK) !=
986 (priv->flags & ASYNC_SPD_MASK)) ||
987 (((priv->flags & ASYNC_SPD_MASK) == ASYNC_SPD_CUST) &&
988 (old_priv.custom_divisor != priv->custom_divisor))) {
989 change_speed(port);
990 }
991
992 return (0);
993
994}
995
996
997
998static void ftdi_determine_type(struct usb_serial_port *port)
999{
1000 struct ftdi_private *priv = usb_get_serial_port_data(port);
1001 struct usb_serial *serial = port->serial;
1002 struct usb_device *udev = serial->dev;
1003 unsigned version;
1004 unsigned interfaces;
1005
1006
1007 priv->baud_base = 48000000 / 2;
1008 priv->write_offset = 0;
1009
1010 version = le16_to_cpu(udev->descriptor.bcdDevice);
1011 interfaces = udev->actconfig->desc.bNumInterfaces;
1012 dbg("%s: bcdDevice = 0x%x, bNumInterfaces = %u", __FUNCTION__,
1013 version, interfaces);
1014 if (interfaces > 1) {
1015 int inter;
1016
1017
1018 priv->chip_type = FT2232C;
1019
1020 inter = serial->interface->altsetting->desc.bInterfaceNumber;
1021 if (inter == 0) {
1022 priv->interface = PIT_SIOA;
1023 } else {
1024 priv->interface = PIT_SIOB;
1025 }
1026
1027
1028 if (version < 0x500) {
1029 dbg("%s: something fishy - bcdDevice too low for multi-interface device",
1030 __FUNCTION__);
1031 }
1032 } else if (version < 0x200) {
1033
1034 priv->chip_type = SIO;
1035 priv->baud_base = 12000000 / 16;
1036 priv->write_offset = 1;
1037 } else if (version < 0x400) {
1038
1039
1040
1041 priv->chip_type = FT8U232AM;
1042 } else if (version < 0x600) {
1043
1044 priv->chip_type = FT232BM;
1045 } else {
1046
1047 priv->chip_type = FT232RL;
1048 }
1049 info("Detected %s", ftdi_chip_name[priv->chip_type]);
1050}
1051
1052
1053
1054
1055
1056
1057
1058
1059static ssize_t show_latency_timer(struct device *dev, struct device_attribute *attr, char *buf)
1060{
1061 struct usb_serial_port *port = to_usb_serial_port(dev);
1062 struct ftdi_private *priv = usb_get_serial_port_data(port);
1063 struct usb_device *udev = port->serial->dev;
1064 unsigned short latency = 0;
1065 int rv = 0;
1066
1067
1068 dbg("%s",__FUNCTION__);
1069
1070 rv = usb_control_msg(udev,
1071 usb_rcvctrlpipe(udev, 0),
1072 FTDI_SIO_GET_LATENCY_TIMER_REQUEST,
1073 FTDI_SIO_GET_LATENCY_TIMER_REQUEST_TYPE,
1074 0, priv->interface,
1075 (char*) &latency, 1, WDR_TIMEOUT);
1076
1077 if (rv < 0) {
1078 dev_err(dev, "Unable to read latency timer: %i\n", rv);
1079 return -EIO;
1080 }
1081 return sprintf(buf, "%i\n", latency);
1082}
1083
1084
1085static ssize_t store_latency_timer(struct device *dev, struct device_attribute *attr, const char *valbuf,
1086 size_t count)
1087{
1088 struct usb_serial_port *port = to_usb_serial_port(dev);
1089 struct ftdi_private *priv = usb_get_serial_port_data(port);
1090 struct usb_device *udev = port->serial->dev;
1091 char buf[1];
1092 int v = simple_strtoul(valbuf, NULL, 10);
1093 int rv = 0;
1094
1095 dbg("%s: setting latency timer = %i", __FUNCTION__, v);
1096
1097 rv = usb_control_msg(udev,
1098 usb_sndctrlpipe(udev, 0),
1099 FTDI_SIO_SET_LATENCY_TIMER_REQUEST,
1100 FTDI_SIO_SET_LATENCY_TIMER_REQUEST_TYPE,
1101 v, priv->interface,
1102 buf, 0, WDR_TIMEOUT);
1103
1104 if (rv < 0) {
1105 dev_err(dev, "Unable to write latency timer: %i\n", rv);
1106 return -EIO;
1107 }
1108
1109 return count;
1110}
1111
1112
1113
1114static ssize_t store_event_char(struct device *dev, struct device_attribute *attr, const char *valbuf,
1115 size_t count)
1116{
1117 struct usb_serial_port *port = to_usb_serial_port(dev);
1118 struct ftdi_private *priv = usb_get_serial_port_data(port);
1119 struct usb_device *udev = port->serial->dev;
1120 char buf[1];
1121 int v = simple_strtoul(valbuf, NULL, 10);
1122 int rv = 0;
1123
1124 dbg("%s: setting event char = %i", __FUNCTION__, v);
1125
1126 rv = usb_control_msg(udev,
1127 usb_sndctrlpipe(udev, 0),
1128 FTDI_SIO_SET_EVENT_CHAR_REQUEST,
1129 FTDI_SIO_SET_EVENT_CHAR_REQUEST_TYPE,
1130 v, priv->interface,
1131 buf, 0, WDR_TIMEOUT);
1132
1133 if (rv < 0) {
1134 dbg("Unable to write event character: %i", rv);
1135 return -EIO;
1136 }
1137
1138 return count;
1139}
1140
1141static DEVICE_ATTR(latency_timer, S_IWUSR | S_IRUGO, show_latency_timer, store_latency_timer);
1142static DEVICE_ATTR(event_char, S_IWUSR, NULL, store_event_char);
1143
1144static int create_sysfs_attrs(struct usb_serial_port *port)
1145{
1146 struct ftdi_private *priv = usb_get_serial_port_data(port);
1147 int retval = 0;
1148
1149 dbg("%s",__FUNCTION__);
1150
1151
1152
1153 if (priv->chip_type != SIO) {
1154 dbg("sysfs attributes for %s", ftdi_chip_name[priv->chip_type]);
1155 retval = device_create_file(&port->dev, &dev_attr_event_char);
1156 if ((!retval) &&
1157 (priv->chip_type == FT232BM ||
1158 priv->chip_type == FT2232C ||
1159 priv->chip_type == FT232RL)) {
1160 retval = device_create_file(&port->dev,
1161 &dev_attr_latency_timer);
1162 }
1163 }
1164 return retval;
1165}
1166
1167static void remove_sysfs_attrs(struct usb_serial_port *port)
1168{
1169 struct ftdi_private *priv = usb_get_serial_port_data(port);
1170
1171 dbg("%s",__FUNCTION__);
1172
1173
1174 if (priv->chip_type != SIO) {
1175 device_remove_file(&port->dev, &dev_attr_event_char);
1176 if (priv->chip_type == FT232BM ||
1177 priv->chip_type == FT2232C ||
1178 priv->chip_type == FT232RL) {
1179 device_remove_file(&port->dev, &dev_attr_latency_timer);
1180 }
1181 }
1182
1183}
1184
1185
1186
1187
1188
1189
1190
1191
1192static int ftdi_sio_probe (struct usb_serial *serial, const struct usb_device_id *id)
1193{
1194 struct ftdi_sio_quirk *quirk = (struct ftdi_sio_quirk *)id->driver_info;
1195
1196 if (quirk && quirk->probe) {
1197 int ret = quirk->probe(serial);
1198 if (ret != 0)
1199 return ret;
1200 }
1201
1202 usb_set_serial_data(serial, (void *)id->driver_info);
1203
1204 return 0;
1205}
1206
1207static int ftdi_sio_port_probe(struct usb_serial_port *port)
1208{
1209 struct ftdi_private *priv;
1210 struct ftdi_sio_quirk *quirk = usb_get_serial_data(port->serial);
1211
1212
1213 dbg("%s",__FUNCTION__);
1214
1215 priv = kzalloc(sizeof(struct ftdi_private), GFP_KERNEL);
1216 if (!priv){
1217 err("%s- kmalloc(%Zd) failed.", __FUNCTION__, sizeof(struct ftdi_private));
1218 return -ENOMEM;
1219 }
1220
1221 spin_lock_init(&priv->rx_lock);
1222 spin_lock_init(&priv->tx_lock);
1223 init_waitqueue_head(&priv->delta_msr_wait);
1224
1225
1226 priv->flags = ASYNC_LOW_LATENCY;
1227
1228 if (quirk && quirk->port_probe)
1229 quirk->port_probe(priv);
1230
1231
1232 kfree(port->bulk_in_buffer);
1233 port->bulk_in_buffer = kmalloc (BUFSZ, GFP_KERNEL);
1234 if (!port->bulk_in_buffer) {
1235 kfree (priv);
1236 return -ENOMEM;
1237 }
1238 if (port->read_urb) {
1239 port->read_urb->transfer_buffer = port->bulk_in_buffer;
1240 port->read_urb->transfer_buffer_length = BUFSZ;
1241 }
1242
1243 INIT_DELAYED_WORK(&priv->rx_work, ftdi_process_read);
1244 priv->port = port;
1245
1246
1247 if (port->write_urb) {
1248 usb_free_urb (port->write_urb);
1249 port->write_urb = NULL;
1250 }
1251 kfree(port->bulk_out_buffer);
1252 port->bulk_out_buffer = NULL;
1253
1254 usb_set_serial_port_data(port, priv);
1255
1256 ftdi_determine_type (port);
1257 create_sysfs_attrs(port);
1258 return 0;
1259}
1260
1261
1262
1263
1264static void ftdi_USB_UIRT_setup (struct ftdi_private *priv)
1265{
1266 dbg("%s",__FUNCTION__);
1267
1268 priv->flags |= ASYNC_SPD_CUST;
1269 priv->custom_divisor = 77;
1270 priv->force_baud = 38400;
1271}
1272
1273
1274
1275static void ftdi_HE_TIRA1_setup (struct ftdi_private *priv)
1276{
1277 dbg("%s",__FUNCTION__);
1278
1279 priv->flags |= ASYNC_SPD_CUST;
1280 priv->custom_divisor = 240;
1281 priv->force_baud = 38400;
1282 priv->force_rtscts = 1;
1283}
1284
1285
1286
1287
1288
1289static int ftdi_olimex_probe(struct usb_serial *serial)
1290{
1291 struct usb_device *udev = serial->dev;
1292 struct usb_interface *interface = serial->interface;
1293
1294 dbg("%s",__FUNCTION__);
1295
1296 if (interface == udev->actconfig->interface[0]) {
1297 info("Ignoring reserved serial port on Olimex arm-usb-ocd\n");
1298 return -ENODEV;
1299 }
1300
1301 return 0;
1302}
1303
1304
1305
1306
1307
1308
1309
1310
1311static void ftdi_shutdown (struct usb_serial *serial)
1312{
1313 dbg("%s", __FUNCTION__);
1314}
1315
1316static int ftdi_sio_port_remove(struct usb_serial_port *port)
1317{
1318 struct ftdi_private *priv = usb_get_serial_port_data(port);
1319
1320 dbg("%s", __FUNCTION__);
1321
1322 remove_sysfs_attrs(port);
1323
1324
1325
1326
1327
1328 if (priv) {
1329 usb_set_serial_port_data(port, NULL);
1330 kfree(priv);
1331 }
1332
1333 return 0;
1334}
1335
1336static int ftdi_open (struct usb_serial_port *port, struct file *filp)
1337{
1338 struct usb_device *dev = port->serial->dev;
1339 struct ftdi_private *priv = usb_get_serial_port_data(port);
1340 unsigned long flags;
1341
1342 int result = 0;
1343 char buf[1];
1344
1345 dbg("%s", __FUNCTION__);
1346
1347 spin_lock_irqsave(&priv->tx_lock, flags);
1348 priv->tx_bytes = 0;
1349 spin_unlock_irqrestore(&priv->tx_lock, flags);
1350 spin_lock_irqsave(&priv->rx_lock, flags);
1351 priv->rx_bytes = 0;
1352 spin_unlock_irqrestore(&priv->rx_lock, flags);
1353
1354 if (port->tty)
1355 port->tty->low_latency = (priv->flags & ASYNC_LOW_LATENCY) ? 1 : 0;
1356
1357
1358
1359 usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
1360 FTDI_SIO_RESET_REQUEST, FTDI_SIO_RESET_REQUEST_TYPE,
1361 FTDI_SIO_RESET_SIO,
1362 priv->interface, buf, 0, WDR_TIMEOUT);
1363
1364
1365
1366
1367
1368
1369 if (port->tty)
1370 ftdi_set_termios(port, port->tty->termios);
1371
1372
1373
1374
1375 set_mctrl(port, TIOCM_DTR | TIOCM_RTS);
1376
1377
1378 spin_lock_irqsave(&priv->rx_lock, flags);
1379 priv->rx_flags &= ~(THROTTLED | ACTUALLY_THROTTLED);
1380 spin_unlock_irqrestore(&priv->rx_lock, flags);
1381
1382
1383 priv->rx_processed = 0;
1384 usb_fill_bulk_urb(port->read_urb, dev,
1385 usb_rcvbulkpipe(dev, port->bulk_in_endpointAddress),
1386 port->read_urb->transfer_buffer, port->read_urb->transfer_buffer_length,
1387 ftdi_read_bulk_callback, port);
1388 result = usb_submit_urb(port->read_urb, GFP_KERNEL);
1389 if (result)
1390 err("%s - failed submitting read urb, error %d", __FUNCTION__, result);
1391
1392
1393 return result;
1394}
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406static void ftdi_close (struct usb_serial_port *port, struct file *filp)
1407{
1408 unsigned int c_cflag = port->tty->termios->c_cflag;
1409 struct ftdi_private *priv = usb_get_serial_port_data(port);
1410 char buf[1];
1411
1412 dbg("%s", __FUNCTION__);
1413
1414 if (c_cflag & HUPCL){
1415
1416 if (usb_control_msg(port->serial->dev,
1417 usb_sndctrlpipe(port->serial->dev, 0),
1418 FTDI_SIO_SET_FLOW_CTRL_REQUEST,
1419 FTDI_SIO_SET_FLOW_CTRL_REQUEST_TYPE,
1420 0, priv->interface, buf, 0,
1421 WDR_TIMEOUT) < 0) {
1422 err("error from flowcontrol urb");
1423 }
1424
1425
1426 clear_mctrl(port, TIOCM_DTR | TIOCM_RTS);
1427 }
1428
1429
1430 cancel_delayed_work(&priv->rx_work);
1431 flush_scheduled_work();
1432
1433
1434 usb_kill_urb(port->read_urb);
1435}
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446static int ftdi_write (struct usb_serial_port *port,
1447 const unsigned char *buf, int count)
1448{
1449 struct ftdi_private *priv = usb_get_serial_port_data(port);
1450 struct urb *urb;
1451 unsigned char *buffer;
1452 int data_offset ;
1453 int status;
1454 int transfer_size;
1455 unsigned long flags;
1456
1457 dbg("%s port %d, %d bytes", __FUNCTION__, port->number, count);
1458
1459 if (count == 0) {
1460 dbg("write request of 0 bytes");
1461 return 0;
1462 }
1463 spin_lock_irqsave(&priv->tx_lock, flags);
1464 if (priv->tx_outstanding_urbs > URB_UPPER_LIMIT) {
1465 spin_unlock_irqrestore(&priv->tx_lock, flags);
1466 dbg("%s - write limit hit\n", __FUNCTION__);
1467 return 0;
1468 }
1469 priv->tx_outstanding_urbs++;
1470 spin_unlock_irqrestore(&priv->tx_lock, flags);
1471
1472 data_offset = priv->write_offset;
1473 dbg("data_offset set to %d",data_offset);
1474
1475
1476 transfer_size = count;
1477 if (data_offset > 0) {
1478
1479 transfer_size += (data_offset *
1480 ((count + (PKTSZ - 1 - data_offset)) /
1481 (PKTSZ - data_offset)));
1482 }
1483
1484 buffer = kmalloc (transfer_size, GFP_ATOMIC);
1485 if (!buffer) {
1486 err("%s ran out of kernel memory for urb ...", __FUNCTION__);
1487 count = -ENOMEM;
1488 goto error_no_buffer;
1489 }
1490
1491 urb = usb_alloc_urb(0, GFP_ATOMIC);
1492 if (!urb) {
1493 err("%s - no more free urbs", __FUNCTION__);
1494 count = -ENOMEM;
1495 goto error_no_urb;
1496 }
1497
1498
1499 if (data_offset > 0) {
1500
1501 int user_pktsz = PKTSZ - data_offset;
1502 int todo = count;
1503 unsigned char *first_byte = buffer;
1504 const unsigned char *current_position = buf;
1505
1506 while (todo > 0) {
1507 if (user_pktsz > todo) {
1508 user_pktsz = todo;
1509 }
1510
1511 *first_byte = 1 | ((user_pktsz) << 2);
1512
1513 memcpy (first_byte + data_offset,
1514 current_position, user_pktsz);
1515 first_byte += user_pktsz + data_offset;
1516 current_position += user_pktsz;
1517 todo -= user_pktsz;
1518 }
1519 } else {
1520
1521
1522 memcpy (buffer, buf, count);
1523 }
1524
1525 usb_serial_debug_data(debug, &port->dev, __FUNCTION__, transfer_size, buffer);
1526
1527
1528 usb_fill_bulk_urb(urb, port->serial->dev,
1529 usb_sndbulkpipe(port->serial->dev, port->bulk_out_endpointAddress),
1530 buffer, transfer_size,
1531 ftdi_write_bulk_callback, port);
1532
1533 status = usb_submit_urb(urb, GFP_ATOMIC);
1534 if (status) {
1535 err("%s - failed submitting write urb, error %d", __FUNCTION__, status);
1536 count = status;
1537 goto error;
1538 } else {
1539 spin_lock_irqsave(&priv->tx_lock, flags);
1540 priv->tx_outstanding_bytes += count;
1541 priv->tx_bytes += count;
1542 spin_unlock_irqrestore(&priv->tx_lock, flags);
1543 }
1544
1545
1546
1547 usb_free_urb(urb);
1548
1549 dbg("%s write returning: %d", __FUNCTION__, count);
1550 return count;
1551error:
1552 usb_free_urb(urb);
1553error_no_urb:
1554 kfree (buffer);
1555error_no_buffer:
1556 spin_lock_irqsave(&priv->tx_lock, flags);
1557 priv->tx_outstanding_urbs--;
1558 spin_unlock_irqrestore(&priv->tx_lock, flags);
1559 return count;
1560}
1561
1562
1563
1564
1565static void ftdi_write_bulk_callback (struct urb *urb)
1566{
1567 unsigned long flags;
1568 struct usb_serial_port *port = (struct usb_serial_port *)urb->context;
1569 struct ftdi_private *priv;
1570 int data_offset;
1571 unsigned long countback;
1572 int status = urb->status;
1573
1574
1575 kfree (urb->transfer_buffer);
1576
1577 dbg("%s - port %d", __FUNCTION__, port->number);
1578
1579 if (status) {
1580 dbg("nonzero write bulk status received: %d", status);
1581 return;
1582 }
1583
1584 priv = usb_get_serial_port_data(port);
1585 if (!priv) {
1586 dbg("%s - bad port private data pointer - exiting", __FUNCTION__);
1587 return;
1588 }
1589
1590 countback = urb->actual_length;
1591 data_offset = priv->write_offset;
1592 if (data_offset > 0) {
1593
1594 countback -= (data_offset * ((countback + (PKTSZ - 1)) / PKTSZ));
1595 }
1596 spin_lock_irqsave(&priv->tx_lock, flags);
1597 --priv->tx_outstanding_urbs;
1598 priv->tx_outstanding_bytes -= countback;
1599 spin_unlock_irqrestore(&priv->tx_lock, flags);
1600
1601 usb_serial_port_softint(port);
1602}
1603
1604
1605static int ftdi_write_room( struct usb_serial_port *port )
1606{
1607 struct ftdi_private *priv = usb_get_serial_port_data(port);
1608 int room;
1609 unsigned long flags;
1610
1611 dbg("%s - port %d", __FUNCTION__, port->number);
1612
1613 spin_lock_irqsave(&priv->tx_lock, flags);
1614 if (priv->tx_outstanding_urbs < URB_UPPER_LIMIT) {
1615
1616
1617
1618
1619
1620 room = 2048;
1621 } else {
1622 room = 0;
1623 }
1624 spin_unlock_irqrestore(&priv->tx_lock, flags);
1625 return room;
1626}
1627
1628
1629static int ftdi_chars_in_buffer (struct usb_serial_port *port)
1630{
1631 struct ftdi_private *priv = usb_get_serial_port_data(port);
1632 int buffered;
1633 unsigned long flags;
1634
1635 dbg("%s - port %d", __FUNCTION__, port->number);
1636
1637 spin_lock_irqsave(&priv->tx_lock, flags);
1638 buffered = (int)priv->tx_outstanding_bytes;
1639 spin_unlock_irqrestore(&priv->tx_lock, flags);
1640 if (buffered < 0) {
1641 err("%s outstanding tx bytes is negative!", __FUNCTION__);
1642 buffered = 0;
1643 }
1644 return buffered;
1645}
1646
1647
1648
1649static void ftdi_read_bulk_callback (struct urb *urb)
1650{
1651 struct usb_serial_port *port = (struct usb_serial_port *)urb->context;
1652 struct tty_struct *tty;
1653 struct ftdi_private *priv;
1654 unsigned long countread;
1655 unsigned long flags;
1656 int status = urb->status;
1657
1658 if (urb->number_of_packets > 0) {
1659 err("%s transfer_buffer_length %d actual_length %d number of packets %d",__FUNCTION__,
1660 urb->transfer_buffer_length, urb->actual_length, urb->number_of_packets );
1661 err("%s transfer_flags %x ", __FUNCTION__,urb->transfer_flags );
1662 }
1663
1664 dbg("%s - port %d", __FUNCTION__, port->number);
1665
1666 if (port->open_count <= 0)
1667 return;
1668
1669 tty = port->tty;
1670 if (!tty) {
1671 dbg("%s - bad tty pointer - exiting",__FUNCTION__);
1672 return;
1673 }
1674
1675 priv = usb_get_serial_port_data(port);
1676 if (!priv) {
1677 dbg("%s - bad port private data pointer - exiting", __FUNCTION__);
1678 return;
1679 }
1680
1681 if (urb != port->read_urb) {
1682 err("%s - Not my urb!", __FUNCTION__);
1683 }
1684
1685 if (status) {
1686
1687 dbg("(this is ok on close) nonzero read bulk status received: "
1688 "%d", status);
1689 return;
1690 }
1691
1692
1693 countread = urb->actual_length;
1694 countread -= 2 * ((countread + (PKTSZ - 1)) / PKTSZ);
1695 spin_lock_irqsave(&priv->rx_lock, flags);
1696 priv->rx_bytes += countread;
1697 spin_unlock_irqrestore(&priv->rx_lock, flags);
1698
1699 ftdi_process_read(&priv->rx_work.work);
1700
1701}
1702
1703
1704static void ftdi_process_read (struct work_struct *work)
1705{
1706 struct ftdi_private *priv =
1707 container_of(work, struct ftdi_private, rx_work.work);
1708 struct usb_serial_port *port = priv->port;
1709 struct urb *urb;
1710 struct tty_struct *tty;
1711 char error_flag;
1712 unsigned char *data;
1713
1714 int i;
1715 int result;
1716 int need_flip;
1717 int packet_offset;
1718 unsigned long flags;
1719
1720 dbg("%s - port %d", __FUNCTION__, port->number);
1721
1722 if (port->open_count <= 0)
1723 return;
1724
1725 tty = port->tty;
1726 if (!tty) {
1727 dbg("%s - bad tty pointer - exiting",__FUNCTION__);
1728 return;
1729 }
1730
1731 priv = usb_get_serial_port_data(port);
1732 if (!priv) {
1733 dbg("%s - bad port private data pointer - exiting", __FUNCTION__);
1734 return;
1735 }
1736
1737 urb = port->read_urb;
1738 if (!urb) {
1739 dbg("%s - bad read_urb pointer - exiting", __FUNCTION__);
1740 return;
1741 }
1742
1743 data = urb->transfer_buffer;
1744
1745 if (priv->rx_processed) {
1746 dbg("%s - already processed: %d bytes, %d remain", __FUNCTION__,
1747 priv->rx_processed,
1748 urb->actual_length - priv->rx_processed);
1749 } else {
1750
1751 if (urb->actual_length > 2) {
1752 usb_serial_debug_data(debug, &port->dev, __FUNCTION__, urb->actual_length, data);
1753 } else {
1754 dbg("Status only: %03oo %03oo",data[0],data[1]);
1755 }
1756 }
1757
1758
1759
1760
1761
1762
1763
1764 need_flip = 0;
1765 for (packet_offset = priv->rx_processed; packet_offset < urb->actual_length; packet_offset += PKTSZ) {
1766 int length;
1767
1768
1769
1770
1771 if (priv != NULL) {
1772 char new_status = data[packet_offset+0] & FTDI_STATUS_B0_MASK;
1773 if (new_status != priv->prev_status) {
1774 priv->diff_status |= new_status ^ priv->prev_status;
1775 wake_up_interruptible(&priv->delta_msr_wait);
1776 priv->prev_status = new_status;
1777 }
1778 }
1779
1780 length = min(PKTSZ, urb->actual_length-packet_offset)-2;
1781 if (length < 0) {
1782 err("%s - bad packet length: %d", __FUNCTION__, length+2);
1783 length = 0;
1784 }
1785
1786 if (priv->rx_flags & THROTTLED) {
1787 dbg("%s - throttled", __FUNCTION__);
1788 break;
1789 }
1790 if (tty_buffer_request_room(tty, length) < length) {
1791
1792 dbg("%s - receive room low", __FUNCTION__);
1793 break;
1794 }
1795
1796
1797 error_flag = TTY_NORMAL;
1798
1799
1800
1801
1802 if ( data[packet_offset+1] & FTDI_RS_OE ) {
1803 error_flag = TTY_OVERRUN;
1804 dbg("OVERRRUN error");
1805 }
1806 if ( data[packet_offset+1] & FTDI_RS_BI ) {
1807 error_flag = TTY_BREAK;
1808 dbg("BREAK received");
1809 }
1810 if ( data[packet_offset+1] & FTDI_RS_PE ) {
1811 error_flag = TTY_PARITY;
1812 dbg("PARITY error");
1813 }
1814 if ( data[packet_offset+1] & FTDI_RS_FE ) {
1815 error_flag = TTY_FRAME;
1816 dbg("FRAMING error");
1817 }
1818 if (length > 0) {
1819 for (i = 2; i < length+2; i++) {
1820
1821
1822
1823 tty_insert_flip_char(tty, data[packet_offset+i], error_flag);
1824 }
1825 need_flip = 1;
1826 }
1827
1828#ifdef NOT_CORRECT_BUT_KEEPING_IT_FOR_NOW
1829
1830
1831
1832
1833
1834
1835
1836
1837 else {
1838 if (error_flag != TTY_NORMAL){
1839 dbg("error_flag is not normal");
1840
1841 if(tty->flip.count >= TTY_FLIPBUF_SIZE) {
1842 tty_flip_buffer_push(tty);
1843 }
1844 tty_insert_flip_char(tty, 0xff, error_flag);
1845 need_flip = 1;
1846 }
1847 }
1848#endif
1849 }
1850
1851
1852 if (need_flip) {
1853 tty_flip_buffer_push(tty);
1854 }
1855
1856 if (packet_offset < urb->actual_length) {
1857
1858 priv->rx_processed = packet_offset;
1859 dbg("%s - incomplete, %d bytes processed, %d remain",
1860 __FUNCTION__, packet_offset,
1861 urb->actual_length - packet_offset);
1862
1863 spin_lock_irqsave(&priv->rx_lock, flags);
1864 if (priv->rx_flags & THROTTLED) {
1865 priv->rx_flags |= ACTUALLY_THROTTLED;
1866 spin_unlock_irqrestore(&priv->rx_lock, flags);
1867 dbg("%s - deferring remainder until unthrottled",
1868 __FUNCTION__);
1869 return;
1870 }
1871 spin_unlock_irqrestore(&priv->rx_lock, flags);
1872
1873 if (port->open_count > 0){
1874
1875 schedule_delayed_work(&priv->rx_work, 1);
1876 } else {
1877 dbg("%s - port is closed", __FUNCTION__);
1878 }
1879 return;
1880 }
1881
1882
1883 priv->rx_processed = 0;
1884
1885
1886 if (port->open_count > 0){
1887
1888 usb_fill_bulk_urb(port->read_urb, port->serial->dev,
1889 usb_rcvbulkpipe(port->serial->dev, port->bulk_in_endpointAddress),
1890 port->read_urb->transfer_buffer, port->read_urb->transfer_buffer_length,
1891 ftdi_read_bulk_callback, port);
1892
1893 result = usb_submit_urb(port->read_urb, GFP_ATOMIC);
1894 if (result)
1895 err("%s - failed resubmitting read urb, error %d", __FUNCTION__, result);
1896 }
1897
1898 return;
1899}
1900
1901
1902static void ftdi_break_ctl( struct usb_serial_port *port, int break_state )
1903{
1904 struct ftdi_private *priv = usb_get_serial_port_data(port);
1905 __u16 urb_value = 0;
1906 char buf[1];
1907
1908
1909
1910
1911
1912 if (break_state) {
1913 urb_value = priv->last_set_data_urb_value | FTDI_SIO_SET_BREAK;
1914 } else {
1915 urb_value = priv->last_set_data_urb_value;
1916 }
1917
1918
1919 if (usb_control_msg(port->serial->dev, usb_sndctrlpipe(port->serial->dev, 0),
1920 FTDI_SIO_SET_DATA_REQUEST,
1921 FTDI_SIO_SET_DATA_REQUEST_TYPE,
1922 urb_value , priv->interface,
1923 buf, 0, WDR_TIMEOUT) < 0) {
1924 err("%s FAILED to enable/disable break state (state was %d)", __FUNCTION__,break_state);
1925 }
1926
1927 dbg("%s break state is %d - urb is %d", __FUNCTION__,break_state, urb_value);
1928
1929}
1930
1931
1932
1933
1934
1935
1936
1937static void ftdi_set_termios (struct usb_serial_port *port, struct ktermios *old_termios)
1938{
1939 struct usb_device *dev = port->serial->dev;
1940 struct ftdi_private *priv = usb_get_serial_port_data(port);
1941 struct ktermios *termios = port->tty->termios;
1942 unsigned int cflag = termios->c_cflag;
1943 __u16 urb_value;
1944 char buf[1];
1945
1946
1947 unsigned int iflag = termios->c_iflag;
1948 unsigned char vstop;
1949 unsigned char vstart;
1950
1951 dbg("%s", __FUNCTION__);
1952
1953
1954 if (priv->force_baud && ((termios->c_cflag & CBAUD) != B0)) {
1955 dbg("%s: forcing baud rate for this device", __FUNCTION__);
1956 tty_encode_baud_rate(port->tty, priv->force_baud,
1957 priv->force_baud);
1958 }
1959
1960
1961 if (priv->force_rtscts) {
1962 dbg("%s: forcing rtscts for this device", __FUNCTION__);
1963 termios->c_cflag |= CRTSCTS;
1964 }
1965
1966 cflag = termios->c_cflag;
1967
1968
1969
1970
1971
1972
1973
1974
1975
1976
1977 termios->c_cflag &= ~CMSPAR;
1978
1979 urb_value = 0;
1980 urb_value |= (cflag & CSTOPB ? FTDI_SIO_SET_DATA_STOP_BITS_2 :
1981 FTDI_SIO_SET_DATA_STOP_BITS_1);
1982 urb_value |= (cflag & PARENB ?
1983 (cflag & PARODD ? FTDI_SIO_SET_DATA_PARITY_ODD :
1984 FTDI_SIO_SET_DATA_PARITY_EVEN) :
1985 FTDI_SIO_SET_DATA_PARITY_NONE);
1986 if (cflag & CSIZE) {
1987 switch (cflag & CSIZE) {
1988 case CS5: urb_value |= 5; dbg("Setting CS5"); break;
1989 case CS6: urb_value |= 6; dbg("Setting CS6"); break;
1990 case CS7: urb_value |= 7; dbg("Setting CS7"); break;
1991 case CS8: urb_value |= 8; dbg("Setting CS8"); break;
1992 default:
1993 err("CSIZE was set but not CS5-CS8");
1994 }
1995 }
1996
1997
1998
1999 priv->last_set_data_urb_value = urb_value;
2000
2001 if (usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
2002 FTDI_SIO_SET_DATA_REQUEST,
2003 FTDI_SIO_SET_DATA_REQUEST_TYPE,
2004 urb_value , priv->interface,
2005 buf, 0, WDR_SHORT_TIMEOUT) < 0) {
2006 err("%s FAILED to set databits/stopbits/parity", __FUNCTION__);
2007 }
2008
2009
2010 if ((cflag & CBAUD) == B0 ) {
2011
2012 if (usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
2013 FTDI_SIO_SET_FLOW_CTRL_REQUEST,
2014 FTDI_SIO_SET_FLOW_CTRL_REQUEST_TYPE,
2015 0, priv->interface,
2016 buf, 0, WDR_TIMEOUT) < 0) {
2017 err("%s error from disable flowcontrol urb", __FUNCTION__);
2018 }
2019
2020 clear_mctrl(port, TIOCM_DTR | TIOCM_RTS);
2021 } else {
2022
2023 if (change_speed(port)) {
2024 err("%s urb failed to set baudrate", __FUNCTION__);
2025 }
2026
2027 if (!old_termios || (old_termios->c_cflag & CBAUD) == B0) {
2028 set_mctrl(port, TIOCM_DTR | TIOCM_RTS);
2029 }
2030 }
2031
2032
2033
2034 if (cflag & CRTSCTS) {
2035 dbg("%s Setting to CRTSCTS flow control", __FUNCTION__);
2036 if (usb_control_msg(dev,
2037 usb_sndctrlpipe(dev, 0),
2038 FTDI_SIO_SET_FLOW_CTRL_REQUEST,
2039 FTDI_SIO_SET_FLOW_CTRL_REQUEST_TYPE,
2040 0 , (FTDI_SIO_RTS_CTS_HS | priv->interface),
2041 buf, 0, WDR_TIMEOUT) < 0) {
2042 err("urb failed to set to rts/cts flow control");
2043 }
2044
2045 } else {
2046
2047
2048
2049
2050
2051
2052 if (iflag & IXOFF) {
2053 dbg("%s request to enable xonxoff iflag=%04x",__FUNCTION__,iflag);
2054
2055
2056
2057
2058 vstart = termios->c_cc[VSTART];
2059 vstop = termios->c_cc[VSTOP];
2060 urb_value=(vstop << 8) | (vstart);
2061
2062 if (usb_control_msg(dev,
2063 usb_sndctrlpipe(dev, 0),
2064 FTDI_SIO_SET_FLOW_CTRL_REQUEST,
2065 FTDI_SIO_SET_FLOW_CTRL_REQUEST_TYPE,
2066 urb_value , (FTDI_SIO_XON_XOFF_HS
2067 | priv->interface),
2068 buf, 0, WDR_TIMEOUT) < 0) {
2069 err("urb failed to set to xon/xoff flow control");
2070 }
2071 } else {
2072
2073
2074 dbg("%s Turning off hardware flow control", __FUNCTION__);
2075 if (usb_control_msg(dev,
2076 usb_sndctrlpipe(dev, 0),
2077 FTDI_SIO_SET_FLOW_CTRL_REQUEST,
2078 FTDI_SIO_SET_FLOW_CTRL_REQUEST_TYPE,
2079 0, priv->interface,
2080 buf, 0, WDR_TIMEOUT) < 0) {
2081 err("urb failed to clear flow control");
2082 }
2083 }
2084
2085 }
2086 return;
2087}
2088
2089
2090static int ftdi_tiocmget (struct usb_serial_port *port, struct file *file)
2091{
2092 struct ftdi_private *priv = usb_get_serial_port_data(port);
2093 unsigned char buf[2];
2094 int ret;
2095
2096 dbg("%s TIOCMGET", __FUNCTION__);
2097 switch (priv->chip_type) {
2098 case SIO:
2099
2100 if ((ret = usb_control_msg(port->serial->dev,
2101 usb_rcvctrlpipe(port->serial->dev, 0),
2102 FTDI_SIO_GET_MODEM_STATUS_REQUEST,
2103 FTDI_SIO_GET_MODEM_STATUS_REQUEST_TYPE,
2104 0, 0,
2105 buf, 1, WDR_TIMEOUT)) < 0 ) {
2106 err("%s Could not get modem status of device - err: %d", __FUNCTION__,
2107 ret);
2108 return(ret);
2109 }
2110 break;
2111 case FT8U232AM:
2112 case FT232BM:
2113 case FT2232C:
2114 case FT232RL:
2115
2116
2117 if ((ret = usb_control_msg(port->serial->dev,
2118 usb_rcvctrlpipe(port->serial->dev, 0),
2119 FTDI_SIO_GET_MODEM_STATUS_REQUEST,
2120 FTDI_SIO_GET_MODEM_STATUS_REQUEST_TYPE,
2121 0, priv->interface,
2122 buf, 2, WDR_TIMEOUT)) < 0 ) {
2123 err("%s Could not get modem status of device - err: %d", __FUNCTION__,
2124 ret);
2125 return(ret);
2126 }
2127 break;
2128 default:
2129 return -EFAULT;
2130 break;
2131 }
2132
2133 return (buf[0] & FTDI_SIO_DSR_MASK ? TIOCM_DSR : 0) |
2134 (buf[0] & FTDI_SIO_CTS_MASK ? TIOCM_CTS : 0) |
2135 (buf[0] & FTDI_SIO_RI_MASK ? TIOCM_RI : 0) |
2136 (buf[0] & FTDI_SIO_RLSD_MASK ? TIOCM_CD : 0) |
2137 priv->last_dtr_rts;
2138}
2139
2140static int ftdi_tiocmset(struct usb_serial_port *port, struct file * file, unsigned int set, unsigned int clear)
2141{
2142 dbg("%s TIOCMSET", __FUNCTION__);
2143 return update_mctrl(port, set, clear);
2144}
2145
2146
2147static int ftdi_ioctl (struct usb_serial_port *port, struct file * file, unsigned int cmd, unsigned long arg)
2148{
2149 struct ftdi_private *priv = usb_get_serial_port_data(port);
2150
2151 dbg("%s cmd 0x%04x", __FUNCTION__, cmd);
2152
2153
2154 switch (cmd) {
2155
2156 case TIOCGSERIAL:
2157 return get_serial_info(port, (struct serial_struct __user *) arg);
2158
2159 case TIOCSSERIAL:
2160 return set_serial_info(port, (struct serial_struct __user *) arg);
2161
2162
2163
2164
2165
2166
2167
2168
2169
2170 case TIOCMIWAIT:
2171 while (priv != NULL) {
2172 interruptible_sleep_on(&priv->delta_msr_wait);
2173
2174 if (signal_pending(current))
2175 return -ERESTARTSYS;
2176 else {
2177 char diff = priv->diff_status;
2178
2179 if (diff == 0) {
2180 return -EIO;
2181 }
2182
2183
2184 priv->diff_status = 0;
2185
2186
2187 if ( ((arg & TIOCM_RNG) && (diff & FTDI_RS0_RI)) ||
2188 ((arg & TIOCM_DSR) && (diff & FTDI_RS0_DSR)) ||
2189 ((arg & TIOCM_CD) && (diff & FTDI_RS0_RLSD)) ||
2190 ((arg & TIOCM_CTS) && (diff & FTDI_RS0_CTS)) ) {
2191 return 0;
2192 }
2193
2194
2195
2196
2197 }
2198 }
2199 return(0);
2200 break;
2201 default:
2202 break;
2203
2204 }
2205
2206
2207
2208
2209
2210 dbg("%s arg not supported - it was 0x%04x - check /usr/include/asm/ioctls.h", __FUNCTION__, cmd);
2211
2212 return(-ENOIOCTLCMD);
2213}
2214
2215
2216static void ftdi_throttle (struct usb_serial_port *port)
2217{
2218 struct ftdi_private *priv = usb_get_serial_port_data(port);
2219 unsigned long flags;
2220
2221 dbg("%s - port %d", __FUNCTION__, port->number);
2222
2223 spin_lock_irqsave(&priv->rx_lock, flags);
2224 priv->rx_flags |= THROTTLED;
2225 spin_unlock_irqrestore(&priv->rx_lock, flags);
2226}
2227
2228
2229static void ftdi_unthrottle (struct usb_serial_port *port)
2230{
2231 struct ftdi_private *priv = usb_get_serial_port_data(port);
2232 int actually_throttled;
2233 unsigned long flags;
2234
2235 dbg("%s - port %d", __FUNCTION__, port->number);
2236
2237 spin_lock_irqsave(&priv->rx_lock, flags);
2238 actually_throttled = priv->rx_flags & ACTUALLY_THROTTLED;
2239 priv->rx_flags &= ~(THROTTLED | ACTUALLY_THROTTLED);
2240 spin_unlock_irqrestore(&priv->rx_lock, flags);
2241
2242 if (actually_throttled)
2243 schedule_delayed_work(&priv->rx_work, 0);
2244}
2245
2246static int __init ftdi_init (void)
2247{
2248 int retval;
2249
2250 dbg("%s", __FUNCTION__);
2251 if (vendor > 0 && product > 0) {
2252
2253 int i;
2254 for (i = 0; id_table_combined[i].idVendor; i++)
2255 ;
2256 id_table_combined[i].match_flags = USB_DEVICE_ID_MATCH_DEVICE;
2257 id_table_combined[i].idVendor = vendor;
2258 id_table_combined[i].idProduct = product;
2259 }
2260 retval = usb_serial_register(&ftdi_sio_device);
2261 if (retval)
2262 goto failed_sio_register;
2263 retval = usb_register(&ftdi_driver);
2264 if (retval)
2265 goto failed_usb_register;
2266
2267 info(DRIVER_VERSION ":" DRIVER_DESC);
2268 return 0;
2269failed_usb_register:
2270 usb_serial_deregister(&ftdi_sio_device);
2271failed_sio_register:
2272 return retval;
2273}
2274
2275
2276static void __exit ftdi_exit (void)
2277{
2278
2279 dbg("%s", __FUNCTION__);
2280
2281 usb_deregister (&ftdi_driver);
2282 usb_serial_deregister (&ftdi_sio_device);
2283
2284}
2285
2286
2287module_init(ftdi_init);
2288module_exit(ftdi_exit);
2289
2290MODULE_AUTHOR( DRIVER_AUTHOR );
2291MODULE_DESCRIPTION( DRIVER_DESC );
2292MODULE_LICENSE("GPL");
2293
2294module_param(debug, bool, S_IRUGO | S_IWUSR);
2295MODULE_PARM_DESC(debug, "Debug enabled or not");
2296module_param(vendor, ushort, 0);
2297MODULE_PARM_DESC(vendor, "User specified vendor ID (default="
2298 __MODULE_STRING(FTDI_VID)")");
2299module_param(product, ushort, 0);
2300MODULE_PARM_DESC(vendor, "User specified product ID");
2301
2302