ftdi_sio.c 78.2 KB
Newer Older
L
Linus Torvalds 已提交
1 2 3
/*
 * USB FTDI SIO driver
 *
4 5
 *	Copyright (C) 2009 - 2010
 *	    Johan Hovold (jhovold@gmail.com)
D
David Brownell 已提交
6 7
 *	Copyright (C) 1999 - 2001
 *	    Greg Kroah-Hartman (greg@kroah.com)
L
Linus Torvalds 已提交
8 9 10 11
 *          Bill Ryder (bryder@sgi.com)
 *	Copyright (C) 2002
 *	    Kuba Ober (kuba@mareimbrium.org)
 *
D
David Brownell 已提交
12 13 14 15
 *	This program is free software; you can redistribute it and/or modify
 *	it under the terms of the GNU General Public License as published by
 *	the Free Software Foundation; either version 2 of the License, or
 *	(at your option) any later version.
L
Linus Torvalds 已提交
16
 *
A
Alan Cox 已提交
17 18
 * See Documentation/usb/usb-serial.txt for more information on using this
 * driver
L
Linus Torvalds 已提交
19 20 21 22
 *
 * See http://ftdi-usb-sio.sourceforge.net for upto date testing info
 *	and extra documentation
 *
23 24
 * Change entries from 2004 and earlier can be found in versions of this
 * file in kernel versions prior to the 2.6.24 release.
L
Linus Torvalds 已提交
25 26 27 28 29 30
 *
 */

/* Bill Ryder - bryder@sgi.com - wrote the FTDI_SIO implementation */
/* Thanx to FTDI for so kindly providing details of the protocol required */
/*   to talk to the device */
A
Alan Cox 已提交
31 32
/* Thanx to gkh and the rest of the usb dev group for all code I have
   assimilated :-) */
L
Linus Torvalds 已提交
33 34 35 36 37 38 39 40 41 42

#include <linux/kernel.h>
#include <linux/errno.h>
#include <linux/init.h>
#include <linux/slab.h>
#include <linux/tty.h>
#include <linux/tty_driver.h>
#include <linux/tty_flip.h>
#include <linux/module.h>
#include <linux/spinlock.h>
43
#include <linux/mutex.h>
A
Alan Cox 已提交
44
#include <linux/uaccess.h>
L
Linus Torvalds 已提交
45 46
#include <linux/usb.h>
#include <linux/serial.h>
47
#include <linux/usb/serial.h>
L
Linus Torvalds 已提交
48
#include "ftdi_sio.h"
49
#include "ftdi_sio_ids.h"
L
Linus Torvalds 已提交
50 51 52 53

/*
 * Version Information
 */
54 55
#define DRIVER_VERSION "v1.6.0"
#define DRIVER_AUTHOR "Greg Kroah-Hartman <greg@kroah.com>, Bill Ryder <bryder@sgi.com>, Kuba Ober <kuba@mareimbrium.org>, Andreas Mohr, Johan Hovold <jhovold@gmail.com>"
L
Linus Torvalds 已提交
56 57 58
#define DRIVER_DESC "USB FTDI Serial Converters Driver"

static int debug;
59 60
static __u16 vendor = FTDI_VID;
static __u16 product;
L
Linus Torvalds 已提交
61

62
struct ftdi_private {
63
	struct kref kref;
64
	enum ftdi_chip_type chip_type;
A
Alan Cox 已提交
65
				/* type of device, either SIO or FT8U232AM */
66
	int baud_base;		/* baud base clock for divisor setting */
A
Alan Cox 已提交
67 68 69
	int custom_divisor;	/* custom_divisor kludge, this is for
				   baud_base (different from what goes to the
				   chip!) */
70
	__u16 last_set_data_urb_value ;
A
Alan Cox 已提交
71 72 73
				/* the last data state set - needed for doing
				 * a break
				 */
74 75
	int flags;		/* some ASYNC_xxxx flags are supported */
	unsigned long last_dtr_rts;	/* saved modem control outputs */
A
Alan Cox 已提交
76
	wait_queue_head_t delta_msr_wait; /* Used for TIOCMIWAIT */
77 78
	char prev_status, diff_status;        /* Used for TIOCMIWAIT */
	struct usb_serial_port *port;
79 80
	__u16 interface;	/* FT2232C, FT2232H or FT4232H port interface
				   (0 for FT232/245) */
81

A
Alan Cox 已提交
82 83 84 85
	speed_t force_baud;	/* if non-zero, force the baud rate to
				   this value */
	int force_rtscts;	/* if non-zero, force RTS-CTS to always
				   be enabled */
86

87
	unsigned int latency;		/* latency setting in use */
88
	unsigned short max_packet_size;
89
	struct mutex cfg_lock; /* Avoid mess by parallel calls of config ioctl() and change_speed() */
90 91
};

92 93
/* struct ftdi_sio_quirk is used by devices requiring special attention. */
struct ftdi_sio_quirk {
94
	int (*probe)(struct usb_serial *);
A
Alan Cox 已提交
95 96
	/* Special settings for probed ports. */
	void (*port_probe)(struct ftdi_private *);
97 98
};

A
Alan Cox 已提交
99 100
static int   ftdi_jtag_probe(struct usb_serial *serial);
static int   ftdi_mtxorb_hack_setup(struct usb_serial *serial);
M
Martin Geleynse 已提交
101
static int   ftdi_NDI_device_setup(struct usb_serial *serial);
A
Alan Cox 已提交
102 103
static void  ftdi_USB_UIRT_setup(struct ftdi_private *priv);
static void  ftdi_HE_TIRA1_setup(struct ftdi_private *priv);
104

105 106
static struct ftdi_sio_quirk ftdi_jtag_quirk = {
	.probe	= ftdi_jtag_probe,
107 108
};

109 110 111 112
static struct ftdi_sio_quirk ftdi_mtxorb_hack_quirk = {
	.probe  = ftdi_mtxorb_hack_setup,
};

M
Martin Geleynse 已提交
113 114 115 116
static struct ftdi_sio_quirk ftdi_NDI_device_quirk = {
	.probe	= ftdi_NDI_device_setup,
};

117
static struct ftdi_sio_quirk ftdi_USB_UIRT_quirk = {
118
	.port_probe = ftdi_USB_UIRT_setup,
119 120 121
};

static struct ftdi_sio_quirk ftdi_HE_TIRA1_quirk = {
122
	.port_probe = ftdi_HE_TIRA1_setup,
L
Linus Torvalds 已提交
123 124 125 126 127 128 129 130 131 132 133 134 135 136
};

/*
 * The 8U232AM has the same API as the sio except for:
 * - it can support MUCH higher baudrates; up to:
 *   o 921600 for RS232 and 2000000 for RS422/485 at 48MHz
 *   o 230400 at 12MHz
 *   so .. 8U232AM's baudrate setting codes are different
 * - it has a two byte status code.
 * - it returns characters every 16ms (the FTDI does it every 40ms)
 *
 * the bcdDevice value is used to differentiate FT232BM and FT245BM from
 * the earlier FT8U232AM and FT8U232BM.  For now, include all known VID/PID
 * combinations in both tables.
137 138
 * FIXME: perhaps bcdDevice can also identify 12MHz FT8U232AM devices,
 * but I don't know if those ever went into mass production. [Ian Abbott]
L
Linus Torvalds 已提交
139 140 141 142
 */



143 144 145 146
/*
 * Device ID not listed? Test via module params product/vendor or
 * /sys/bus/usb/ftdi_sio/new_id, then send patch/report!
 */
L
Linus Torvalds 已提交
147
static struct usb_device_id id_table_combined [] = {
148 149
	{ USB_DEVICE(FTDI_VID, FTDI_AMC232_PID) },
	{ USB_DEVICE(FTDI_VID, FTDI_CANUSB_PID) },
150
	{ USB_DEVICE(FTDI_VID, FTDI_CANDAPTER_PID) },
151
	{ USB_DEVICE(FTDI_VID, FTDI_NXTCAM_PID) },
P
Peter Mack 已提交
152 153 154 155 156 157 158 159
	{ USB_DEVICE(FTDI_VID, FTDI_SCS_DEVICE_0_PID) },
	{ USB_DEVICE(FTDI_VID, FTDI_SCS_DEVICE_1_PID) },
	{ USB_DEVICE(FTDI_VID, FTDI_SCS_DEVICE_2_PID) },
	{ USB_DEVICE(FTDI_VID, FTDI_SCS_DEVICE_3_PID) },
	{ USB_DEVICE(FTDI_VID, FTDI_SCS_DEVICE_4_PID) },
	{ USB_DEVICE(FTDI_VID, FTDI_SCS_DEVICE_5_PID) },
	{ USB_DEVICE(FTDI_VID, FTDI_SCS_DEVICE_6_PID) },
	{ USB_DEVICE(FTDI_VID, FTDI_SCS_DEVICE_7_PID) },
160
	{ USB_DEVICE(FTDI_VID, FTDI_ACTZWAVE_PID) },
L
Linus Torvalds 已提交
161
	{ USB_DEVICE(FTDI_VID, FTDI_IRTRANS_PID) },
162
	{ USB_DEVICE(FTDI_VID, FTDI_IPLUS_PID) },
163
	{ USB_DEVICE(FTDI_VID, FTDI_IPLUS2_PID) },
164
	{ USB_DEVICE(FTDI_VID, FTDI_DMX4ALL) },
L
Linus Torvalds 已提交
165 166 167
	{ USB_DEVICE(FTDI_VID, FTDI_SIO_PID) },
	{ USB_DEVICE(FTDI_VID, FTDI_8U232AM_PID) },
	{ USB_DEVICE(FTDI_VID, FTDI_8U232AM_ALT_PID) },
168
	{ USB_DEVICE(FTDI_VID, FTDI_232RL_PID) },
L
Linus Torvalds 已提交
169
	{ USB_DEVICE(FTDI_VID, FTDI_8U2232C_PID) },
170
	{ USB_DEVICE(FTDI_VID, FTDI_4232H_PID) },
171
	{ USB_DEVICE(FTDI_VID, FTDI_MICRO_CHAMELEON_PID) },
L
Linus Torvalds 已提交
172
	{ USB_DEVICE(FTDI_VID, FTDI_RELAIS_PID) },
173
	{ USB_DEVICE(FTDI_VID, FTDI_OPENDCC_PID) },
174 175 176
	{ USB_DEVICE(FTDI_VID, FTDI_OPENDCC_SNIFFER_PID) },
	{ USB_DEVICE(FTDI_VID, FTDI_OPENDCC_THROTTLE_PID) },
	{ USB_DEVICE(FTDI_VID, FTDI_OPENDCC_GATEWAY_PID) },
L
Linus Torvalds 已提交
177 178
	{ USB_DEVICE(INTERBIOMETRICS_VID, INTERBIOMETRICS_IOBOARD_PID) },
	{ USB_DEVICE(INTERBIOMETRICS_VID, INTERBIOMETRICS_MINI_IOBOARD_PID) },
179
	{ USB_DEVICE(FTDI_VID, FTDI_SPROG_II) },
L
Linus Torvalds 已提交
180 181 182 183 184 185 186 187 188 189 190
	{ USB_DEVICE(FTDI_VID, FTDI_XF_632_PID) },
	{ USB_DEVICE(FTDI_VID, FTDI_XF_634_PID) },
	{ USB_DEVICE(FTDI_VID, FTDI_XF_547_PID) },
	{ USB_DEVICE(FTDI_VID, FTDI_XF_633_PID) },
	{ USB_DEVICE(FTDI_VID, FTDI_XF_631_PID) },
	{ USB_DEVICE(FTDI_VID, FTDI_XF_635_PID) },
	{ USB_DEVICE(FTDI_VID, FTDI_XF_640_PID) },
	{ USB_DEVICE(FTDI_VID, FTDI_XF_642_PID) },
	{ USB_DEVICE(FTDI_VID, FTDI_DSS20_PID) },
	{ USB_DEVICE(FTDI_NF_RIC_VID, FTDI_NF_RIC_PID) },
	{ USB_DEVICE(FTDI_VID, FTDI_VNHCPCUSB_D_PID) },
191 192 193 194 195 196 197
	{ USB_DEVICE(FTDI_VID, FTDI_MTXORB_0_PID) },
	{ USB_DEVICE(FTDI_VID, FTDI_MTXORB_1_PID) },
	{ USB_DEVICE(FTDI_VID, FTDI_MTXORB_2_PID) },
	{ USB_DEVICE(FTDI_VID, FTDI_MTXORB_3_PID) },
	{ USB_DEVICE(FTDI_VID, FTDI_MTXORB_4_PID) },
	{ USB_DEVICE(FTDI_VID, FTDI_MTXORB_5_PID) },
	{ USB_DEVICE(FTDI_VID, FTDI_MTXORB_6_PID) },
198
	{ USB_DEVICE(FTDI_VID, FTDI_R2000KU_TRUE_RNG) },
A
Alan Cox 已提交
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
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0100_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0101_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0102_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0103_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0104_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0105_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0106_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0107_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0108_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0109_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_010A_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_010B_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_010C_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_010D_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_010E_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_010F_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0110_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0111_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0112_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0113_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0114_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0115_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0116_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0117_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0118_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0119_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_011A_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_011B_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_011C_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_011D_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_011E_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_011F_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0120_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0121_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0122_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0123_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0124_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0125_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0126_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0127_PID),
239
		.driver_info = (kernel_ulong_t)&ftdi_mtxorb_hack_quirk },
A
Alan Cox 已提交
240 241 242 243 244
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0128_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0129_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_012A_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_012B_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_012C_PID),
245
		.driver_info = (kernel_ulong_t)&ftdi_mtxorb_hack_quirk },
A
Alan Cox 已提交
246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_012D_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_012E_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_012F_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0130_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0131_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0132_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0133_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0134_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0135_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0136_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0137_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0138_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0139_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_013A_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_013B_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_013C_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_013D_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_013E_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_013F_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0140_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0141_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0142_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0143_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0144_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0145_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0146_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0147_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0148_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0149_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_014A_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_014B_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_014C_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_014D_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_014E_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_014F_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0150_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0151_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0152_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0153_PID),
285
		.driver_info = (kernel_ulong_t)&ftdi_mtxorb_hack_quirk },
A
Alan Cox 已提交
286
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0154_PID),
287
		.driver_info = (kernel_ulong_t)&ftdi_mtxorb_hack_quirk },
A
Alan Cox 已提交
288
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0155_PID),
289
		.driver_info = (kernel_ulong_t)&ftdi_mtxorb_hack_quirk },
A
Alan Cox 已提交
290
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0156_PID),
291
		.driver_info = (kernel_ulong_t)&ftdi_mtxorb_hack_quirk },
A
Alan Cox 已提交
292
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0157_PID),
293
		.driver_info = (kernel_ulong_t)&ftdi_mtxorb_hack_quirk },
A
Alan Cox 已提交
294
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0158_PID),
295
		.driver_info = (kernel_ulong_t)&ftdi_mtxorb_hack_quirk },
A
Alan Cox 已提交
296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0159_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_015A_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_015B_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_015C_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_015D_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_015E_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_015F_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0160_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0161_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0162_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0163_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0164_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0165_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0166_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0167_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0168_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0169_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_016A_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_016B_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_016C_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_016D_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_016E_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_016F_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0170_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0171_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0172_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0173_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0174_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0175_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0176_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0177_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0178_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0179_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_017A_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_017B_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_017C_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_017D_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_017E_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_017F_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0180_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0181_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0182_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0183_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0184_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0185_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0186_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0187_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0188_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0189_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_018A_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_018B_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_018C_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_018D_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_018E_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_018F_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0190_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0191_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0192_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0193_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0194_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0195_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0196_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0197_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0198_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0199_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_019A_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_019B_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_019C_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_019D_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_019E_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_019F_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01A0_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01A1_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01A2_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01A3_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01A4_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01A5_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01A6_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01A7_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01A8_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01A9_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01AA_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01AB_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01AC_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01AD_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01AE_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01AF_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01B0_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01B1_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01B2_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01B3_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01B4_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01B5_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01B6_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01B7_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01B8_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01B9_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01BA_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01BB_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01BC_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01BD_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01BE_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01BF_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01C0_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01C1_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01C2_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01C3_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01C4_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01C5_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01C6_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01C7_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01C8_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01C9_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01CA_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01CB_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01CC_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01CD_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01CE_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01CF_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01D0_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01D1_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01D2_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01D3_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01D4_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01D5_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01D6_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01D7_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01D8_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01D9_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01DA_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01DB_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01DC_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01DD_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01DE_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01DF_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01E0_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01E1_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01E2_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01E3_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01E4_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01E5_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01E6_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01E7_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01E8_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01E9_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01EA_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01EB_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01EC_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01ED_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01EE_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01EF_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01F0_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01F1_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01F2_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01F3_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01F4_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01F5_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01F6_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01F7_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01F8_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01F9_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01FA_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01FB_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01FC_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01FD_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01FE_PID) },
	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01FF_PID) },
463
	{ USB_DEVICE(FTDI_VID, FTDI_PERLE_ULTRAPORT_PID) },
L
Linus Torvalds 已提交
464
	{ USB_DEVICE(FTDI_VID, FTDI_PIEGROUP_PID) },
465
	{ USB_DEVICE(FTDI_VID, FTDI_TNC_X_PID) },
466
	{ USB_DEVICE(FTDI_VID, FTDI_USBX_707_PID) },
L
Linus Torvalds 已提交
467 468 469 470
	{ USB_DEVICE(SEALEVEL_VID, SEALEVEL_2101_PID) },
	{ USB_DEVICE(SEALEVEL_VID, SEALEVEL_2102_PID) },
	{ USB_DEVICE(SEALEVEL_VID, SEALEVEL_2103_PID) },
	{ USB_DEVICE(SEALEVEL_VID, SEALEVEL_2104_PID) },
471
	{ USB_DEVICE(SEALEVEL_VID, SEALEVEL_2106_PID) },
L
Linus Torvalds 已提交
472 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 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515
	{ USB_DEVICE(SEALEVEL_VID, SEALEVEL_2201_1_PID) },
	{ USB_DEVICE(SEALEVEL_VID, SEALEVEL_2201_2_PID) },
	{ USB_DEVICE(SEALEVEL_VID, SEALEVEL_2202_1_PID) },
	{ USB_DEVICE(SEALEVEL_VID, SEALEVEL_2202_2_PID) },
	{ USB_DEVICE(SEALEVEL_VID, SEALEVEL_2203_1_PID) },
	{ USB_DEVICE(SEALEVEL_VID, SEALEVEL_2203_2_PID) },
	{ USB_DEVICE(SEALEVEL_VID, SEALEVEL_2401_1_PID) },
	{ USB_DEVICE(SEALEVEL_VID, SEALEVEL_2401_2_PID) },
	{ USB_DEVICE(SEALEVEL_VID, SEALEVEL_2401_3_PID) },
	{ USB_DEVICE(SEALEVEL_VID, SEALEVEL_2401_4_PID) },
	{ USB_DEVICE(SEALEVEL_VID, SEALEVEL_2402_1_PID) },
	{ USB_DEVICE(SEALEVEL_VID, SEALEVEL_2402_2_PID) },
	{ USB_DEVICE(SEALEVEL_VID, SEALEVEL_2402_3_PID) },
	{ USB_DEVICE(SEALEVEL_VID, SEALEVEL_2402_4_PID) },
	{ USB_DEVICE(SEALEVEL_VID, SEALEVEL_2403_1_PID) },
	{ USB_DEVICE(SEALEVEL_VID, SEALEVEL_2403_2_PID) },
	{ USB_DEVICE(SEALEVEL_VID, SEALEVEL_2403_3_PID) },
	{ USB_DEVICE(SEALEVEL_VID, SEALEVEL_2403_4_PID) },
	{ USB_DEVICE(SEALEVEL_VID, SEALEVEL_2801_1_PID) },
	{ USB_DEVICE(SEALEVEL_VID, SEALEVEL_2801_2_PID) },
	{ USB_DEVICE(SEALEVEL_VID, SEALEVEL_2801_3_PID) },
	{ USB_DEVICE(SEALEVEL_VID, SEALEVEL_2801_4_PID) },
	{ USB_DEVICE(SEALEVEL_VID, SEALEVEL_2801_5_PID) },
	{ USB_DEVICE(SEALEVEL_VID, SEALEVEL_2801_6_PID) },
	{ USB_DEVICE(SEALEVEL_VID, SEALEVEL_2801_7_PID) },
	{ USB_DEVICE(SEALEVEL_VID, SEALEVEL_2801_8_PID) },
	{ USB_DEVICE(SEALEVEL_VID, SEALEVEL_2802_1_PID) },
	{ USB_DEVICE(SEALEVEL_VID, SEALEVEL_2802_2_PID) },
	{ USB_DEVICE(SEALEVEL_VID, SEALEVEL_2802_3_PID) },
	{ USB_DEVICE(SEALEVEL_VID, SEALEVEL_2802_4_PID) },
	{ USB_DEVICE(SEALEVEL_VID, SEALEVEL_2802_5_PID) },
	{ USB_DEVICE(SEALEVEL_VID, SEALEVEL_2802_6_PID) },
	{ USB_DEVICE(SEALEVEL_VID, SEALEVEL_2802_7_PID) },
	{ USB_DEVICE(SEALEVEL_VID, SEALEVEL_2802_8_PID) },
	{ USB_DEVICE(SEALEVEL_VID, SEALEVEL_2803_1_PID) },
	{ USB_DEVICE(SEALEVEL_VID, SEALEVEL_2803_2_PID) },
	{ USB_DEVICE(SEALEVEL_VID, SEALEVEL_2803_3_PID) },
	{ USB_DEVICE(SEALEVEL_VID, SEALEVEL_2803_4_PID) },
	{ USB_DEVICE(SEALEVEL_VID, SEALEVEL_2803_5_PID) },
	{ USB_DEVICE(SEALEVEL_VID, SEALEVEL_2803_6_PID) },
	{ USB_DEVICE(SEALEVEL_VID, SEALEVEL_2803_7_PID) },
	{ USB_DEVICE(SEALEVEL_VID, SEALEVEL_2803_8_PID) },
	{ USB_DEVICE(IDTECH_VID, IDTECH_IDT1221U_PID) },
	{ USB_DEVICE(OCT_VID, OCT_US101_PID) },
516 517 518 519
	{ USB_DEVICE(FTDI_VID, FTDI_HE_TIRA1_PID),
		.driver_info = (kernel_ulong_t)&ftdi_HE_TIRA1_quirk },
	{ USB_DEVICE(FTDI_VID, FTDI_USB_UIRT_PID),
		.driver_info = (kernel_ulong_t)&ftdi_USB_UIRT_quirk },
L
Linus Torvalds 已提交
520 521 522 523
	{ USB_DEVICE(FTDI_VID, PROTEGO_SPECIAL_1) },
	{ USB_DEVICE(FTDI_VID, PROTEGO_R2X0) },
	{ USB_DEVICE(FTDI_VID, PROTEGO_SPECIAL_3) },
	{ USB_DEVICE(FTDI_VID, PROTEGO_SPECIAL_4) },
524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539
	{ USB_DEVICE(FTDI_VID, FTDI_GUDEADS_E808_PID) },
	{ USB_DEVICE(FTDI_VID, FTDI_GUDEADS_E809_PID) },
	{ USB_DEVICE(FTDI_VID, FTDI_GUDEADS_E80A_PID) },
	{ USB_DEVICE(FTDI_VID, FTDI_GUDEADS_E80B_PID) },
	{ USB_DEVICE(FTDI_VID, FTDI_GUDEADS_E80C_PID) },
	{ USB_DEVICE(FTDI_VID, FTDI_GUDEADS_E80D_PID) },
	{ USB_DEVICE(FTDI_VID, FTDI_GUDEADS_E80E_PID) },
	{ USB_DEVICE(FTDI_VID, FTDI_GUDEADS_E80F_PID) },
	{ USB_DEVICE(FTDI_VID, FTDI_GUDEADS_E888_PID) },
	{ USB_DEVICE(FTDI_VID, FTDI_GUDEADS_E889_PID) },
	{ USB_DEVICE(FTDI_VID, FTDI_GUDEADS_E88A_PID) },
	{ USB_DEVICE(FTDI_VID, FTDI_GUDEADS_E88B_PID) },
	{ USB_DEVICE(FTDI_VID, FTDI_GUDEADS_E88C_PID) },
	{ USB_DEVICE(FTDI_VID, FTDI_GUDEADS_E88D_PID) },
	{ USB_DEVICE(FTDI_VID, FTDI_GUDEADS_E88E_PID) },
	{ USB_DEVICE(FTDI_VID, FTDI_GUDEADS_E88F_PID) },
L
Linus Torvalds 已提交
540
	{ USB_DEVICE(FTDI_VID, FTDI_ELV_UO100_PID) },
541
	{ USB_DEVICE(FTDI_VID, FTDI_ELV_UM100_PID) },
542 543
	{ USB_DEVICE(FTDI_VID, FTDI_ELV_UR100_PID) },
	{ USB_DEVICE(FTDI_VID, FTDI_ELV_ALC8500_PID) },
544
	{ USB_DEVICE(FTDI_VID, FTDI_PYRAMID_PID) },
545
	{ USB_DEVICE(FTDI_VID, FTDI_ELV_FHZ1000PC_PID) },
546 547 548 549 550 551 552 553
	{ USB_DEVICE(FTDI_VID, FTDI_IBS_US485_PID) },
	{ USB_DEVICE(FTDI_VID, FTDI_IBS_PICPRO_PID) },
	{ USB_DEVICE(FTDI_VID, FTDI_IBS_PCMCIA_PID) },
	{ USB_DEVICE(FTDI_VID, FTDI_IBS_PK1_PID) },
	{ USB_DEVICE(FTDI_VID, FTDI_IBS_RS232MON_PID) },
	{ USB_DEVICE(FTDI_VID, FTDI_IBS_APP70_PID) },
	{ USB_DEVICE(FTDI_VID, FTDI_IBS_PEDO_PID) },
	{ USB_DEVICE(FTDI_VID, FTDI_IBS_PROD_PID) },
554
	/*
555
	 * ELV devices:
556
	 */
557 558 559 560 561 562 563 564
	{ USB_DEVICE(FTDI_VID, FTDI_ELV_USR_PID) },
	{ USB_DEVICE(FTDI_VID, FTDI_ELV_MSM1_PID) },
	{ USB_DEVICE(FTDI_VID, FTDI_ELV_KL100_PID) },
	{ USB_DEVICE(FTDI_VID, FTDI_ELV_WS550_PID) },
	{ USB_DEVICE(FTDI_VID, FTDI_ELV_EC3000_PID) },
	{ USB_DEVICE(FTDI_VID, FTDI_ELV_WS888_PID) },
	{ USB_DEVICE(FTDI_VID, FTDI_ELV_TWS550_PID) },
	{ USB_DEVICE(FTDI_VID, FTDI_ELV_FEM_PID) },
565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580
	{ USB_DEVICE(FTDI_VID, FTDI_ELV_CLI7000_PID) },
	{ USB_DEVICE(FTDI_VID, FTDI_ELV_PPS7330_PID) },
	{ USB_DEVICE(FTDI_VID, FTDI_ELV_TFM100_PID) },
	{ USB_DEVICE(FTDI_VID, FTDI_ELV_UDF77_PID) },
	{ USB_DEVICE(FTDI_VID, FTDI_ELV_UIO88_PID) },
	{ USB_DEVICE(FTDI_VID, FTDI_ELV_UAD8_PID) },
	{ USB_DEVICE(FTDI_VID, FTDI_ELV_UDA7_PID) },
	{ USB_DEVICE(FTDI_VID, FTDI_ELV_USI2_PID) },
	{ USB_DEVICE(FTDI_VID, FTDI_ELV_T1100_PID) },
	{ USB_DEVICE(FTDI_VID, FTDI_ELV_PCD200_PID) },
	{ USB_DEVICE(FTDI_VID, FTDI_ELV_ULA200_PID) },
	{ USB_DEVICE(FTDI_VID, FTDI_ELV_CSI8_PID) },
	{ USB_DEVICE(FTDI_VID, FTDI_ELV_EM1000DL_PID) },
	{ USB_DEVICE(FTDI_VID, FTDI_ELV_PCK100_PID) },
	{ USB_DEVICE(FTDI_VID, FTDI_ELV_RFP500_PID) },
	{ USB_DEVICE(FTDI_VID, FTDI_ELV_FS20SIG_PID) },
581
	{ USB_DEVICE(FTDI_VID, FTDI_ELV_UTP8_PID) },
582
	{ USB_DEVICE(FTDI_VID, FTDI_ELV_WS300PC_PID) },
583
	{ USB_DEVICE(FTDI_VID, FTDI_ELV_WS444PC_PID) },
584
	{ USB_DEVICE(FTDI_VID, FTDI_ELV_FHZ1300PC_PID) },
585
	{ USB_DEVICE(FTDI_VID, FTDI_ELV_EM1010PC_PID) },
586
	{ USB_DEVICE(FTDI_VID, FTDI_ELV_WS500_PID) },
587
	{ USB_DEVICE(FTDI_VID, FTDI_ELV_HS485_PID) },
588 589 590 591
	{ USB_DEVICE(FTDI_VID, FTDI_ELV_UMS100_PID) },
	{ USB_DEVICE(FTDI_VID, FTDI_ELV_TFD128_PID) },
	{ USB_DEVICE(FTDI_VID, FTDI_ELV_FM3RX_PID) },
	{ USB_DEVICE(FTDI_VID, FTDI_ELV_WS777_PID) },
D
David Brownell 已提交
592 593 594 595 596 597 598
	{ USB_DEVICE(FTDI_VID, LINX_SDMUSBQSS_PID) },
	{ USB_DEVICE(FTDI_VID, LINX_MASTERDEVEL2_PID) },
	{ USB_DEVICE(FTDI_VID, LINX_FUTURE_0_PID) },
	{ USB_DEVICE(FTDI_VID, LINX_FUTURE_1_PID) },
	{ USB_DEVICE(FTDI_VID, LINX_FUTURE_2_PID) },
	{ USB_DEVICE(FTDI_VID, FTDI_CCSICDU20_0_PID) },
	{ USB_DEVICE(FTDI_VID, FTDI_CCSICDU40_1_PID) },
J
Jan Capek 已提交
599
	{ USB_DEVICE(FTDI_VID, FTDI_CCSMACHX_2_PID) },
600 601 602
	{ USB_DEVICE(FTDI_VID, FTDI_CCSLOAD_N_GO_3_PID) },
	{ USB_DEVICE(FTDI_VID, FTDI_CCSICDU64_4_PID) },
	{ USB_DEVICE(FTDI_VID, FTDI_CCSPRIME8_5_PID) },
L
Linus Torvalds 已提交
603 604 605 606
	{ USB_DEVICE(FTDI_VID, INSIDE_ACCESSO) },
	{ USB_DEVICE(INTREPID_VID, INTREPID_VALUECAN_PID) },
	{ USB_DEVICE(INTREPID_VID, INTREPID_NEOVI_PID) },
	{ USB_DEVICE(FALCOM_VID, FALCOM_TWIST_PID) },
607
	{ USB_DEVICE(FALCOM_VID, FALCOM_SAMBA_PID) },
L
Linus Torvalds 已提交
608
	{ USB_DEVICE(FTDI_VID, FTDI_SUUNTO_SPORTS_PID) },
609
	{ USB_DEVICE(FTDI_VID, FTDI_OCEANIC_PID) },
610
	{ USB_DEVICE(TTI_VID, TTI_QL355P_PID) },
611
	{ USB_DEVICE(FTDI_VID, FTDI_RM_CANVIEW_PID) },
612
	{ USB_DEVICE(CONTEC_VID, CONTEC_COM1USBH_PID) },
L
Linus Torvalds 已提交
613 614 615
	{ USB_DEVICE(BANDB_VID, BANDB_USOTL4_PID) },
	{ USB_DEVICE(BANDB_VID, BANDB_USTL4_PID) },
	{ USB_DEVICE(BANDB_VID, BANDB_USO9ML2_PID) },
616 617 618 619 620 621 622 623 624 625 626 627 628 629
	{ USB_DEVICE(BANDB_VID, BANDB_USOPTL4_PID) },
	{ USB_DEVICE(BANDB_VID, BANDB_USPTL4_PID) },
	{ USB_DEVICE(BANDB_VID, BANDB_USO9ML2DR_2_PID) },
	{ USB_DEVICE(BANDB_VID, BANDB_USO9ML2DR_PID) },
	{ USB_DEVICE(BANDB_VID, BANDB_USOPTL4DR2_PID) },
	{ USB_DEVICE(BANDB_VID, BANDB_USOPTL4DR_PID) },
	{ USB_DEVICE(BANDB_VID, BANDB_485USB9F_2W_PID) },
	{ USB_DEVICE(BANDB_VID, BANDB_485USB9F_4W_PID) },
	{ USB_DEVICE(BANDB_VID, BANDB_232USB9M_PID) },
	{ USB_DEVICE(BANDB_VID, BANDB_485USBTB_2W_PID) },
	{ USB_DEVICE(BANDB_VID, BANDB_485USBTB_4W_PID) },
	{ USB_DEVICE(BANDB_VID, BANDB_TTL5USB9M_PID) },
	{ USB_DEVICE(BANDB_VID, BANDB_TTL3USB9M_PID) },
	{ USB_DEVICE(BANDB_VID, BANDB_ZZ_PROG1_USB_PID) },
L
Linus Torvalds 已提交
630
	{ USB_DEVICE(FTDI_VID, EVER_ECO_PRO_CDS) },
631 632
	{ USB_DEVICE(FTDI_VID, FTDI_4N_GALAXY_DE_1_PID) },
	{ USB_DEVICE(FTDI_VID, FTDI_4N_GALAXY_DE_2_PID) },
633 634 635 636 637 638 639 640
	{ USB_DEVICE(FTDI_VID, XSENS_CONVERTER_0_PID) },
	{ USB_DEVICE(FTDI_VID, XSENS_CONVERTER_1_PID) },
	{ USB_DEVICE(FTDI_VID, XSENS_CONVERTER_2_PID) },
	{ USB_DEVICE(FTDI_VID, XSENS_CONVERTER_3_PID) },
	{ USB_DEVICE(FTDI_VID, XSENS_CONVERTER_4_PID) },
	{ USB_DEVICE(FTDI_VID, XSENS_CONVERTER_5_PID) },
	{ USB_DEVICE(FTDI_VID, XSENS_CONVERTER_6_PID) },
	{ USB_DEVICE(FTDI_VID, XSENS_CONVERTER_7_PID) },
641
	{ USB_DEVICE(MOBILITY_VID, MOBILITY_USB_SERIAL_PID) },
642
	{ USB_DEVICE(FTDI_VID, FTDI_ACTIVE_ROBOTS_PID) },
643 644
	{ USB_DEVICE(FTDI_VID, FTDI_MHAM_KW_PID) },
	{ USB_DEVICE(FTDI_VID, FTDI_MHAM_YS_PID) },
645 646
	{ USB_DEVICE(FTDI_VID, FTDI_MHAM_Y6_PID) },
	{ USB_DEVICE(FTDI_VID, FTDI_MHAM_Y8_PID) },
647 648 649 650
	{ USB_DEVICE(FTDI_VID, FTDI_MHAM_IC_PID) },
	{ USB_DEVICE(FTDI_VID, FTDI_MHAM_DB9_PID) },
	{ USB_DEVICE(FTDI_VID, FTDI_MHAM_RS232_PID) },
	{ USB_DEVICE(FTDI_VID, FTDI_MHAM_Y9_PID) },
651 652
	{ USB_DEVICE(FTDI_VID, FTDI_TERATRONIK_VCP_PID) },
	{ USB_DEVICE(FTDI_VID, FTDI_TERATRONIK_D2XX_PID) },
653
	{ USB_DEVICE(EVOLUTION_VID, EVOLUTION_ER1_PID) },
654 655
	{ USB_DEVICE(EVOLUTION_VID, EVO_HYBRID_PID) },
	{ USB_DEVICE(EVOLUTION_VID, EVO_RCM4_PID) },
656 657
	{ USB_DEVICE(FTDI_VID, FTDI_ARTEMIS_PID) },
	{ USB_DEVICE(FTDI_VID, FTDI_ATIK_ATK16_PID) },
658
	{ USB_DEVICE(FTDI_VID, FTDI_ATIK_ATK16C_PID) },
659
	{ USB_DEVICE(FTDI_VID, FTDI_ATIK_ATK16HR_PID) },
660
	{ USB_DEVICE(FTDI_VID, FTDI_ATIK_ATK16HRC_PID) },
661
	{ USB_DEVICE(FTDI_VID, FTDI_ATIK_ATK16IC_PID) },
662 663
	{ USB_DEVICE(KOBIL_VID, KOBIL_CONV_B1_PID) },
	{ USB_DEVICE(KOBIL_VID, KOBIL_CONV_KAAN_PID) },
664
	{ USB_DEVICE(POSIFLEX_VID, POSIFLEX_PP7000_PID) },
665
	{ USB_DEVICE(FTDI_VID, FTDI_TTUSB_PID) },
666
	{ USB_DEVICE(FTDI_VID, FTDI_ECLO_COM_1WIRE_PID) },
667 668
	{ USB_DEVICE(FTDI_VID, FTDI_WESTREX_MODEL_777_PID) },
	{ USB_DEVICE(FTDI_VID, FTDI_WESTREX_MODEL_8900F_PID) },
669
	{ USB_DEVICE(FTDI_VID, FTDI_PCDJ_DAC2_PID) },
670
	{ USB_DEVICE(FTDI_VID, FTDI_RRCIRKITS_LOCOBUFFER_PID) },
671
	{ USB_DEVICE(FTDI_VID, FTDI_ASK_RDR400_PID) },
672
	{ USB_DEVICE(ICOM_ID1_VID, ICOM_ID1_PID) },
673
	{ USB_DEVICE(PAPOUCH_VID, PAPOUCH_TMU_PID) },
674
	{ USB_DEVICE(FTDI_VID, FTDI_ACG_HFDUAL_PID) },
675
	{ USB_DEVICE(FTDI_VID, FTDI_YEI_SERVOCENTER31_PID) },
676
	{ USB_DEVICE(FTDI_VID, FTDI_THORLABS_PID) },
677
	{ USB_DEVICE(TESTO_VID, TESTO_USB_INTERFACE_PID) },
678
	{ USB_DEVICE(FTDI_VID, FTDI_GAMMA_SCOUT_PID) },
679 680 681
	{ USB_DEVICE(FTDI_VID, FTDI_TACTRIX_OPENPORT_13M_PID) },
	{ USB_DEVICE(FTDI_VID, FTDI_TACTRIX_OPENPORT_13S_PID) },
	{ USB_DEVICE(FTDI_VID, FTDI_TACTRIX_OPENPORT_13U_PID) },
682
	{ USB_DEVICE(ELEKTOR_VID, ELEKTOR_FT323R_PID) },
M
Martin Geleynse 已提交
683 684 685 686 687 688 689 690 691 692
	{ USB_DEVICE(FTDI_VID, FTDI_NDI_HUC_PID),
		.driver_info = (kernel_ulong_t)&ftdi_NDI_device_quirk },
	{ USB_DEVICE(FTDI_VID, FTDI_NDI_SPECTRA_SCU_PID),
		.driver_info = (kernel_ulong_t)&ftdi_NDI_device_quirk },
	{ USB_DEVICE(FTDI_VID, FTDI_NDI_FUTURE_2_PID),
		.driver_info = (kernel_ulong_t)&ftdi_NDI_device_quirk },
	{ USB_DEVICE(FTDI_VID, FTDI_NDI_FUTURE_3_PID),
		.driver_info = (kernel_ulong_t)&ftdi_NDI_device_quirk },
	{ USB_DEVICE(FTDI_VID, FTDI_NDI_AURORA_SCU_PID),
		.driver_info = (kernel_ulong_t)&ftdi_NDI_device_quirk },
693
	{ USB_DEVICE(TELLDUS_VID, TELLDUS_TELLSTICK_PID) },
694
	{ USB_DEVICE(FTDI_VID, FTDI_MAXSTREAM_PID) },
695
	{ USB_DEVICE(FTDI_VID, FTDI_PHI_FISCO_PID) },
696
	{ USB_DEVICE(TML_VID, TML_USB_SERIAL_PID) },
697
	{ USB_DEVICE(FTDI_VID, FTDI_ELSTER_UNICOM_PID) },
M
Mirko Bordignon 已提交
698
	{ USB_DEVICE(FTDI_VID, FTDI_PROPOX_JTAGCABLEII_PID) },
699
	{ USB_DEVICE(OLIMEX_VID, OLIMEX_ARM_USB_OCD_PID),
700 701 702 703 704
		.driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
	{ USB_DEVICE(FIC_VID, FIC_NEO1973_DEBUG_PID),
		.driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
	{ USB_DEVICE(FTDI_VID, FTDI_OOCDLINK_PID),
		.driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
705 706 707 708
	{ USB_DEVICE(FTDI_VID, LMI_LM3S_DEVEL_BOARD_PID),
		.driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
	{ USB_DEVICE(FTDI_VID, LMI_LM3S_EVAL_BOARD_PID),
		.driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
709 710
	{ USB_DEVICE(FTDI_VID, FTDI_TURTELIZER_PID),
		.driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
711
	{ USB_DEVICE(RATOC_VENDOR_ID, RATOC_PRODUCT_ID_USB60F) },
712
	{ USB_DEVICE(FTDI_VID, FTDI_REU_TINY_PID) },
713
	{ USB_DEVICE(PAPOUCH_VID, PAPOUCH_QUIDO4x4_PID) },
714
	{ USB_DEVICE(PAPOUCH_VID, PAPOUCH_AD4USB_PID) },
715 716
	{ USB_DEVICE(FTDI_VID, FTDI_DOMINTELL_DGQG_PID) },
	{ USB_DEVICE(FTDI_VID, FTDI_DOMINTELL_DUSB_PID) },
717
	{ USB_DEVICE(ALTI2_VID, ALTI2_N3_PID) },
718
	{ USB_DEVICE(FTDI_VID, DIEBOLD_BCS_SE923_PID) },
719 720 721
	{ USB_DEVICE(ATMEL_VID, STK541_PID) },
	{ USB_DEVICE(DE_VID, STB_PID) },
	{ USB_DEVICE(DE_VID, WHT_PID) },
722 723
	{ USB_DEVICE(ADI_VID, ADI_GNICE_PID),
		.driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
724 725
	{ USB_DEVICE(ADI_VID, ADI_GNICEPLUS_PID),
		.driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
726
	{ USB_DEVICE(JETI_VID, JETI_SPC1201_PID) },
727 728
	{ USB_DEVICE(MARVELL_VID, MARVELL_SHEEVAPLUG_PID),
		.driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
D
Daniel Suchy 已提交
729
	{ USB_DEVICE(LARSENBRUSGAARD_VID, LB_ALTITRACK_PID) },
730
	{ USB_DEVICE(GN_OTOMETRICS_VID, AURICAL_USB_PID) },
731
	{ USB_DEVICE(BAYER_VID, BAYER_CONTOUR_CABLE_PID) },
732 733
	{ USB_DEVICE(FTDI_VID, MARVELL_OPENRD_PID),
		.driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
734 735
	{ USB_DEVICE(FTDI_VID, HAMEG_HO820_PID) },
	{ USB_DEVICE(FTDI_VID, HAMEG_HO870_PID) },
736 737 738 739
	{ USB_DEVICE(FTDI_VID, MJSG_GENERIC_PID) },
	{ USB_DEVICE(FTDI_VID, MJSG_SR_RADIO_PID) },
	{ USB_DEVICE(FTDI_VID, MJSG_HD_RADIO_PID) },
	{ USB_DEVICE(FTDI_VID, MJSG_XM_RADIO_PID) },
740 741 742 743 744 745 746 747
	{ USB_DEVICE(FTDI_VID, XVERVE_SIGNALYZER_ST_PID),
		.driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
	{ USB_DEVICE(FTDI_VID, XVERVE_SIGNALYZER_SLITE_PID),
		.driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
	{ USB_DEVICE(FTDI_VID, XVERVE_SIGNALYZER_SH2_PID),
		.driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
	{ USB_DEVICE(FTDI_VID, XVERVE_SIGNALYZER_SH4_PID),
		.driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
748 749
	{ },					/* Optional parameter entry */
	{ }					/* Terminating entry */
L
Linus Torvalds 已提交
750 751
};

A
Alan Cox 已提交
752
MODULE_DEVICE_TABLE(usb, id_table_combined);
L
Linus Torvalds 已提交
753 754 755 756 757 758

static struct usb_driver ftdi_driver = {
	.name =		"ftdi_sio",
	.probe =	usb_serial_probe,
	.disconnect =	usb_serial_disconnect,
	.id_table =	id_table_combined,
D
David Brownell 已提交
759
	.no_dynamic_id =	1,
L
Linus Torvalds 已提交
760 761
};

762
static const char *ftdi_chip_name[] = {
L
Linus Torvalds 已提交
763 764 765 766
	[SIO] = "SIO",	/* the serial part of FT8U100AX */
	[FT8U232AM] = "FT8U232AM",
	[FT232BM] = "FT232BM",
	[FT2232C] = "FT2232C",
767
	[FT232RL] = "FT232RL",
768 769
	[FT2232H] = "FT2232H",
	[FT4232H] = "FT4232H"
L
Linus Torvalds 已提交
770 771 772 773 774 775 776 777
};


/* Used for TIOCMIWAIT */
#define FTDI_STATUS_B0_MASK	(FTDI_RS0_CTS | FTDI_RS0_DSR | FTDI_RS0_RI | FTDI_RS0_RLSD)
#define FTDI_STATUS_B1_MASK	(FTDI_RS_BI)
/* End TIOCMIWAIT */

R
Roel Kluin 已提交
778 779
#define FTDI_IMPL_ASYNC_FLAGS = (ASYNC_SPD_HI | ASYNC_SPD_VHI \
 | ASYNC_SPD_CUST | ASYNC_SPD_SHI | ASYNC_SPD_WARP)
L
Linus Torvalds 已提交
780 781

/* function prototypes for a FTDI serial converter */
A
Alan Cox 已提交
782 783 784 785
static int  ftdi_sio_probe(struct usb_serial *serial,
					const struct usb_device_id *id);
static int  ftdi_sio_port_probe(struct usb_serial_port *port);
static int  ftdi_sio_port_remove(struct usb_serial_port *port);
786
static int  ftdi_open(struct tty_struct *tty, struct usb_serial_port *port);
787 788
static void ftdi_close(struct usb_serial_port *port);
static void ftdi_dtr_rts(struct usb_serial_port *port, int on);
789
static void ftdi_process_read_urb(struct urb *urb);
790
static int ftdi_prepare_write_buffer(struct usb_serial_port *port,
791
						void *dest, size_t size);
A
Alan Cox 已提交
792 793 794 795 796 797 798 799 800 801 802 803 804
static void ftdi_set_termios(struct tty_struct *tty,
			struct usb_serial_port *port, struct ktermios *old);
static int  ftdi_tiocmget(struct tty_struct *tty, struct file *file);
static int  ftdi_tiocmset(struct tty_struct *tty, struct file *file,
			unsigned int set, unsigned int clear);
static int  ftdi_ioctl(struct tty_struct *tty, struct file *file,
			unsigned int cmd, unsigned long arg);
static void ftdi_break_ctl(struct tty_struct *tty, int break_state);

static unsigned short int ftdi_232am_baud_base_to_divisor(int baud, int base);
static unsigned short int ftdi_232am_baud_to_divisor(int baud);
static __u32 ftdi_232bm_baud_base_to_divisor(int baud, int base);
static __u32 ftdi_232bm_baud_to_divisor(int baud);
805 806
static __u32 ftdi_2232h_baud_base_to_divisor(int baud, int base);
static __u32 ftdi_2232h_baud_to_divisor(int baud);
L
Linus Torvalds 已提交
807

808
static struct usb_serial_driver ftdi_sio_device = {
809 810
	.driver = {
		.owner =	THIS_MODULE,
811
		.name =		"ftdi_sio",
812
	},
813
	.description =		"FTDI USB Serial Device",
814
	.usb_driver = 		&ftdi_driver,
815
	.id_table =		id_table_combined,
L
Linus Torvalds 已提交
816
	.num_ports =		1,
817
	.bulk_in_size =		512,
818
	.bulk_out_size =	256,
819
	.probe =		ftdi_sio_probe,
820 821
	.port_probe =		ftdi_sio_port_probe,
	.port_remove =		ftdi_sio_port_remove,
L
Linus Torvalds 已提交
822 823
	.open =			ftdi_open,
	.close =		ftdi_close,
824
	.dtr_rts =		ftdi_dtr_rts,
825 826 827
	.throttle =		usb_serial_generic_throttle,
	.unthrottle =		usb_serial_generic_unthrottle,
	.process_read_urb =	ftdi_process_read_urb,
828
	.prepare_write_buffer =	ftdi_prepare_write_buffer,
829 830
	.tiocmget =		ftdi_tiocmget,
	.tiocmset =		ftdi_tiocmset,
L
Linus Torvalds 已提交
831 832 833 834 835 836 837
	.ioctl =		ftdi_ioctl,
	.set_termios =		ftdi_set_termios,
	.break_ctl =		ftdi_break_ctl,
};


#define WDR_TIMEOUT 5000 /* default urb timeout */
838
#define WDR_SHORT_TIMEOUT 1000	/* shorter urb timeout */
L
Linus Torvalds 已提交
839 840 841 842 843 844 845

/* High and low are for DTR, RTS etc etc */
#define HIGH 1
#define LOW 0

/*
 * ***************************************************************************
846
 * Utility functions
L
Linus Torvalds 已提交
847 848 849 850 851 852
 * ***************************************************************************
 */

static unsigned short int ftdi_232am_baud_base_to_divisor(int baud, int base)
{
	unsigned short int divisor;
A
Alan Cox 已提交
853 854 855 856
	/* divisor shifted 3 bits to the left */
	int divisor3 = base / 2 / baud;
	if ((divisor3 & 0x7) == 7)
		divisor3++; /* round x.7/8 up to x+1 */
L
Linus Torvalds 已提交
857 858
	divisor = divisor3 >> 3;
	divisor3 &= 0x7;
A
Alan Cox 已提交
859 860 861 862 863 864 865 866
	if (divisor3 == 1)
		divisor |= 0xc000;
	else if (divisor3 >= 4)
		divisor |= 0x4000;
	else if (divisor3 != 0)
		divisor |= 0x8000;
	else if (divisor == 1)
		divisor = 0;	/* special case for maximum baud rate */
L
Linus Torvalds 已提交
867 868 869 870 871
	return divisor;
}

static unsigned short int ftdi_232am_baud_to_divisor(int baud)
{
A
Alan Cox 已提交
872
	 return ftdi_232am_baud_base_to_divisor(baud, 48000000);
L
Linus Torvalds 已提交
873 874 875 876 877 878
}

static __u32 ftdi_232bm_baud_base_to_divisor(int baud, int base)
{
	static const unsigned char divfrac[8] = { 0, 3, 2, 4, 1, 5, 6, 7 };
	__u32 divisor;
A
Alan Cox 已提交
879 880
	/* divisor shifted 3 bits to the left */
	int divisor3 = base / 2 / baud;
L
Linus Torvalds 已提交
881 882 883
	divisor = divisor3 >> 3;
	divisor |= (__u32)divfrac[divisor3 & 0x7] << 14;
	/* Deal with special cases for highest baud rates. */
A
Alan Cox 已提交
884 885 886 887
	if (divisor == 1)
		divisor = 0;
	else if (divisor == 0x4001)
		divisor = 1;
L
Linus Torvalds 已提交
888 889 890 891 892
	return divisor;
}

static __u32 ftdi_232bm_baud_to_divisor(int baud)
{
A
Alan Cox 已提交
893
	 return ftdi_232bm_baud_base_to_divisor(baud, 48000000);
L
Linus Torvalds 已提交
894 895
}

896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925
static __u32 ftdi_2232h_baud_base_to_divisor(int baud, int base)
{
	static const unsigned char divfrac[8] = { 0, 3, 2, 4, 1, 5, 6, 7 };
	__u32 divisor;
	int divisor3;

	/* hi-speed baud rate is 10-bit sampling instead of 16-bit */
	divisor3 = (base / 10 / baud) * 8;

	divisor = divisor3 >> 3;
	divisor |= (__u32)divfrac[divisor3 & 0x7] << 14;
	/* Deal with special cases for highest baud rates. */
	if (divisor == 1)
		divisor = 0;
	else if (divisor == 0x4001)
		divisor = 1;
	/*
	 * Set this bit to turn off a divide by 2.5 on baud rate generator
	 * This enables baud rates up to 12Mbaud but cannot reach below 1200
	 * baud with this bit set
	 */
	divisor |= 0x00020000;
	return divisor;
}

static __u32 ftdi_2232h_baud_to_divisor(int baud)
{
	 return ftdi_2232h_baud_base_to_divisor(baud, 120000000);
}

926 927 928
#define set_mctrl(port, set)		update_mctrl((port), (set), 0)
#define clear_mctrl(port, clear)	update_mctrl((port), 0, (clear))

A
Alan Cox 已提交
929 930
static int update_mctrl(struct usb_serial_port *port, unsigned int set,
							unsigned int clear)
L
Linus Torvalds 已提交
931 932
{
	struct ftdi_private *priv = usb_get_serial_port_data(port);
933
	unsigned urb_value;
L
Linus Torvalds 已提交
934 935
	int rv;

936
	if (((set | clear) & (TIOCM_DTR | TIOCM_RTS)) == 0) {
937
		dbg("%s - DTR|RTS not being set|cleared", __func__);
938 939
		return 0;	/* no change */
	}
L
Linus Torvalds 已提交
940

941 942 943 944 945 946 947 948 949 950
	clear &= ~set;	/* 'set' takes precedence over 'clear' */
	urb_value = 0;
	if (clear & TIOCM_DTR)
		urb_value |= FTDI_SIO_SET_DTR_LOW;
	if (clear & TIOCM_RTS)
		urb_value |= FTDI_SIO_SET_RTS_LOW;
	if (set & TIOCM_DTR)
		urb_value |= FTDI_SIO_SET_DTR_HIGH;
	if (set & TIOCM_RTS)
		urb_value |= FTDI_SIO_SET_RTS_HIGH;
L
Linus Torvalds 已提交
951 952
	rv = usb_control_msg(port->serial->dev,
			       usb_sndctrlpipe(port->serial->dev, 0),
D
David Brownell 已提交
953
			       FTDI_SIO_SET_MODEM_CTRL_REQUEST,
L
Linus Torvalds 已提交
954
			       FTDI_SIO_SET_MODEM_CTRL_REQUEST_TYPE,
955
			       urb_value, priv->interface,
956
			       NULL, 0, WDR_TIMEOUT);
957
	if (rv < 0) {
958
		dbg("%s Error from MODEM_CTRL urb: DTR %s, RTS %s",
959
				__func__,
960 961 962 963 964
				(set & TIOCM_DTR) ? "HIGH" :
				(clear & TIOCM_DTR) ? "LOW" : "unchanged",
				(set & TIOCM_RTS) ? "HIGH" :
				(clear & TIOCM_RTS) ? "LOW" : "unchanged");
	} else {
965
		dbg("%s - DTR %s, RTS %s", __func__,
966 967 968 969
				(set & TIOCM_DTR) ? "HIGH" :
				(clear & TIOCM_DTR) ? "LOW" : "unchanged",
				(set & TIOCM_RTS) ? "HIGH" :
				(clear & TIOCM_RTS) ? "LOW" : "unchanged");
A
Alan Cox 已提交
970
		/* FIXME: locking on last_dtr_rts */
971 972
		priv->last_dtr_rts = (priv->last_dtr_rts & ~clear) | set;
	}
L
Linus Torvalds 已提交
973 974 975 976
	return rv;
}


A
Alan Cox 已提交
977 978
static __u32 get_ftdi_divisor(struct tty_struct *tty,
						struct usb_serial_port *port)
979
{
L
Linus Torvalds 已提交
980 981 982 983 984 985
	struct ftdi_private *priv = usb_get_serial_port_data(port);
	__u32 div_value = 0;
	int div_okay = 1;
	int baud;

	/*
A
Alan Cox 已提交
986 987
	 * The logic involved in setting the baudrate can be cleanly split into
	 * 3 steps.
L
Linus Torvalds 已提交
988
	 * 1. Standard baud rates are set in tty->termios->c_cflag
A
Alan Cox 已提交
989 990
	 * 2. If these are not enough, you can set any speed using alt_speed as
	 * follows:
L
Linus Torvalds 已提交
991 992 993
	 *    - set tty->termios->c_cflag speed to B38400
	 *    - set your real speed in tty->alt_speed; it gets ignored when
	 *      alt_speed==0, (or)
A
Alan Cox 已提交
994 995 996 997 998
	 *    - call TIOCSSERIAL ioctl with (struct serial_struct) set as
	 *	follows:
	 *      flags & ASYNC_SPD_MASK == ASYNC_SPD_[HI, VHI, SHI, WARP],
	 *	this just sets alt_speed to (HI: 57600, VHI: 115200,
	 *	SHI: 230400, WARP: 460800)
L
Linus Torvalds 已提交
999 1000 1001
	 * ** Steps 1, 2 are done courtesy of tty_get_baud_rate
	 * 3. You can also set baud rate by setting custom divisor as follows
	 *    - set tty->termios->c_cflag speed to B38400
A
Alan Cox 已提交
1002 1003
	 *    - call TIOCSSERIAL ioctl with (struct serial_struct) set as
	 *	follows:
L
Linus Torvalds 已提交
1004 1005
	 *      o flags & ASYNC_SPD_MASK == ASYNC_SPD_CUST
	 *      o custom_divisor set to baud_base / your_new_baudrate
A
Alan Cox 已提交
1006 1007 1008 1009
	 * ** Step 3 is done courtesy of code borrowed from serial.c
	 *    I should really spend some time and separate + move this common
	 *    code to serial.c, it is replicated in nearly every serial driver
	 *    you see.
L
Linus Torvalds 已提交
1010 1011
	 */

A
Alan Cox 已提交
1012 1013
	/* 1. Get the baud rate from the tty settings, this observes
	      alt_speed hack */
L
Linus Torvalds 已提交
1014

A
Alan Cox 已提交
1015
	baud = tty_get_baud_rate(tty);
1016
	dbg("%s - tty_get_baud_rate reports speed %d", __func__, baud);
L
Linus Torvalds 已提交
1017

A
Alan Cox 已提交
1018 1019
	/* 2. Observe async-compatible custom_divisor hack, update baudrate
	   if needed */
L
Linus Torvalds 已提交
1020 1021 1022 1023 1024

	if (baud == 38400 &&
	    ((priv->flags & ASYNC_SPD_MASK) == ASYNC_SPD_CUST) &&
	     (priv->custom_divisor)) {
		baud = priv->baud_base / priv->custom_divisor;
A
Alan Cox 已提交
1025 1026
		dbg("%s - custom divisor %d sets baud rate to %d",
				__func__, priv->custom_divisor, baud);
L
Linus Torvalds 已提交
1027 1028 1029 1030
	}

	/* 3. Convert baudrate to device-specific divisor */

A
Alan Cox 已提交
1031 1032 1033
	if (!baud)
		baud = 9600;
	switch (priv->chip_type) {
L
Linus Torvalds 已提交
1034
	case SIO: /* SIO chip */
A
Alan Cox 已提交
1035
		switch (baud) {
L
Linus Torvalds 已提交
1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047
		case 300: div_value = ftdi_sio_b300; break;
		case 600: div_value = ftdi_sio_b600; break;
		case 1200: div_value = ftdi_sio_b1200; break;
		case 2400: div_value = ftdi_sio_b2400; break;
		case 4800: div_value = ftdi_sio_b4800; break;
		case 9600: div_value = ftdi_sio_b9600; break;
		case 19200: div_value = ftdi_sio_b19200; break;
		case 38400: div_value = ftdi_sio_b38400; break;
		case 57600: div_value = ftdi_sio_b57600;  break;
		case 115200: div_value = ftdi_sio_b115200; break;
		} /* baud */
		if (div_value == 0) {
A
Alan Cox 已提交
1048 1049
			dbg("%s - Baudrate (%d) requested is not supported",
							__func__,  baud);
L
Linus Torvalds 已提交
1050
			div_value = ftdi_sio_b9600;
1051
			baud = 9600;
L
Linus Torvalds 已提交
1052 1053 1054 1055 1056 1057 1058
			div_okay = 0;
		}
		break;
	case FT8U232AM: /* 8U232AM chip */
		if (baud <= 3000000) {
			div_value = ftdi_232am_baud_to_divisor(baud);
		} else {
A
Alan Cox 已提交
1059
			dbg("%s - Baud rate too high!", __func__);
1060
			baud = 9600;
L
Linus Torvalds 已提交
1061 1062 1063 1064 1065 1066
			div_value = ftdi_232am_baud_to_divisor(9600);
			div_okay = 0;
		}
		break;
	case FT232BM: /* FT232BM chip */
	case FT2232C: /* FT2232C chip */
1067
	case FT232RL:
L
Linus Torvalds 已提交
1068
		if (baud <= 3000000) {
M
Martin Geleynse 已提交
1069 1070 1071 1072 1073 1074 1075 1076 1077 1078
			__u16 product_id = le16_to_cpu(
				port->serial->dev->descriptor.idProduct);
			if (((FTDI_NDI_HUC_PID == product_id) ||
			     (FTDI_NDI_SPECTRA_SCU_PID == product_id) ||
			     (FTDI_NDI_FUTURE_2_PID == product_id) ||
			     (FTDI_NDI_FUTURE_3_PID == product_id) ||
			     (FTDI_NDI_AURORA_SCU_PID == product_id)) &&
			    (baud == 19200)) {
				baud = 1200000;
			}
L
Linus Torvalds 已提交
1079 1080
			div_value = ftdi_232bm_baud_to_divisor(baud);
		} else {
A
Alan Cox 已提交
1081
			dbg("%s - Baud rate too high!", __func__);
L
Linus Torvalds 已提交
1082 1083
			div_value = ftdi_232bm_baud_to_divisor(9600);
			div_okay = 0;
1084
			baud = 9600;
L
Linus Torvalds 已提交
1085 1086
		}
		break;
1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099
	case FT2232H: /* FT2232H chip */
	case FT4232H: /* FT4232H chip */
		if ((baud <= 12000000) & (baud >= 1200)) {
			div_value = ftdi_2232h_baud_to_divisor(baud);
		} else if (baud < 1200) {
			div_value = ftdi_232bm_baud_to_divisor(baud);
		} else {
			dbg("%s - Baud rate too high!", __func__);
			div_value = ftdi_232bm_baud_to_divisor(9600);
			div_okay = 0;
			baud = 9600;
		}
		break;
L
Linus Torvalds 已提交
1100 1101 1102 1103
	} /* priv->chip_type */

	if (div_okay) {
		dbg("%s - Baud rate set to %d (divisor 0x%lX) on chip %s",
1104
			__func__, baud, (unsigned long)div_value,
L
Linus Torvalds 已提交
1105 1106 1107
			ftdi_chip_name[priv->chip_type]);
	}

A
Alan Cox 已提交
1108
	tty_encode_baud_rate(tty, baud, baud);
A
Alan Cox 已提交
1109
	return div_value;
L
Linus Torvalds 已提交
1110 1111
}

A
Alan Cox 已提交
1112 1113 1114
static int change_speed(struct tty_struct *tty, struct usb_serial_port *port)
{
	struct ftdi_private *priv = usb_get_serial_port_data(port);
A
Alan Cox 已提交
1115
	__u16 urb_value;
A
Alan Cox 已提交
1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131
	__u16 urb_index;
	__u32 urb_index_value;
	int rv;

	urb_index_value = get_ftdi_divisor(tty, port);
	urb_value = (__u16)urb_index_value;
	urb_index = (__u16)(urb_index_value >> 16);
	if (priv->interface) {	/* FT2232C */
		urb_index = (__u16)((urb_index << 8) | priv->interface);
	}

	rv = usb_control_msg(port->serial->dev,
			    usb_sndctrlpipe(port->serial->dev, 0),
			    FTDI_SIO_SET_BAUDRATE_REQUEST,
			    FTDI_SIO_SET_BAUDRATE_REQUEST_TYPE,
			    urb_value, urb_index,
1132
			    NULL, 0, WDR_SHORT_TIMEOUT);
A
Alan Cox 已提交
1133 1134 1135
	return rv;
}

1136 1137 1138 1139
static int write_latency_timer(struct usb_serial_port *port)
{
	struct ftdi_private *priv = usb_get_serial_port_data(port);
	struct usb_device *udev = port->serial->dev;
1140
	int rv;
1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152
	int l = priv->latency;

	if (priv->flags & ASYNC_LOW_LATENCY)
		l = 1;

	dbg("%s: setting latency timer = %i", __func__, l);

	rv = usb_control_msg(udev,
			     usb_sndctrlpipe(udev, 0),
			     FTDI_SIO_SET_LATENCY_TIMER_REQUEST,
			     FTDI_SIO_SET_LATENCY_TIMER_REQUEST_TYPE,
			     l, priv->interface,
1153
			     NULL, 0, WDR_TIMEOUT);
1154 1155 1156 1157 1158 1159 1160 1161 1162
	if (rv < 0)
		dev_err(&port->dev, "Unable to write latency timer: %i\n", rv);
	return rv;
}

static int read_latency_timer(struct usb_serial_port *port)
{
	struct ftdi_private *priv = usb_get_serial_port_data(port);
	struct usb_device *udev = port->serial->dev;
1163
	unsigned char *buf;
1164
	int rv;
1165 1166 1167

	dbg("%s", __func__);

1168 1169 1170 1171
	buf = kmalloc(1, GFP_KERNEL);
	if (!buf)
		return -ENOMEM;

1172 1173 1174 1175 1176
	rv = usb_control_msg(udev,
			     usb_rcvctrlpipe(udev, 0),
			     FTDI_SIO_GET_LATENCY_TIMER_REQUEST,
			     FTDI_SIO_GET_LATENCY_TIMER_REQUEST_TYPE,
			     0, priv->interface,
1177
			     buf, 1, WDR_TIMEOUT);
1178
	if (rv < 0)
1179
		dev_err(&port->dev, "Unable to read latency timer: %i\n", rv);
1180
	else
1181 1182 1183 1184
		priv->latency = buf[0];

	kfree(buf);

1185
	return rv;
1186
}
L
Linus Torvalds 已提交
1187

A
Alan Cox 已提交
1188 1189
static int get_serial_info(struct usb_serial_port *port,
				struct serial_struct __user *retinfo)
L
Linus Torvalds 已提交
1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202
{
	struct ftdi_private *priv = usb_get_serial_port_data(port);
	struct serial_struct tmp;

	if (!retinfo)
		return -EFAULT;
	memset(&tmp, 0, sizeof(tmp));
	tmp.flags = priv->flags;
	tmp.baud_base = priv->baud_base;
	tmp.custom_divisor = priv->custom_divisor;
	if (copy_to_user(retinfo, &tmp, sizeof(*retinfo)))
		return -EFAULT;
	return 0;
1203
}
L
Linus Torvalds 已提交
1204

A
Alan Cox 已提交
1205
static int set_serial_info(struct tty_struct *tty,
A
Alan Cox 已提交
1206
	struct usb_serial_port *port, struct serial_struct __user *newinfo)
1207
{
L
Linus Torvalds 已提交
1208 1209 1210 1211 1212 1213
	struct ftdi_private *priv = usb_get_serial_port_data(port);
	struct serial_struct new_serial;
	struct ftdi_private old_priv;

	if (copy_from_user(&new_serial, newinfo, sizeof(new_serial)))
		return -EFAULT;
1214

1215
	mutex_lock(&priv->cfg_lock);
A
Alan Cox 已提交
1216
	old_priv = *priv;
L
Linus Torvalds 已提交
1217 1218 1219 1220 1221

	/* Do error checking and permission checking */

	if (!capable(CAP_SYS_ADMIN)) {
		if (((new_serial.flags & ~ASYNC_USR_MASK) !=
1222
		     (priv->flags & ~ASYNC_USR_MASK))) {
1223
			mutex_unlock(&priv->cfg_lock);
L
Linus Torvalds 已提交
1224
			return -EPERM;
1225
		}
L
Linus Torvalds 已提交
1226 1227 1228 1229 1230 1231 1232
		priv->flags = ((priv->flags & ~ASYNC_USR_MASK) |
			       (new_serial.flags & ASYNC_USR_MASK));
		priv->custom_divisor = new_serial.custom_divisor;
		goto check_and_exit;
	}

	if ((new_serial.baud_base != priv->baud_base) &&
1233
	    (new_serial.baud_base < 9600)) {
1234
		mutex_unlock(&priv->cfg_lock);
L
Linus Torvalds 已提交
1235
		return -EINVAL;
1236
	}
L
Linus Torvalds 已提交
1237 1238 1239 1240

	/* Make the changes - these are privileged changes! */

	priv->flags = ((priv->flags & ~ASYNC_FLAGS) |
A
Alan Cox 已提交
1241
					(new_serial.flags & ASYNC_FLAGS));
L
Linus Torvalds 已提交
1242 1243
	priv->custom_divisor = new_serial.custom_divisor;

1244
	write_latency_timer(port);
L
Linus Torvalds 已提交
1245 1246 1247 1248 1249

check_and_exit:
	if ((old_priv.flags & ASYNC_SPD_MASK) !=
	     (priv->flags & ASYNC_SPD_MASK)) {
		if ((priv->flags & ASYNC_SPD_MASK) == ASYNC_SPD_HI)
A
Alan Cox 已提交
1250
			tty->alt_speed = 57600;
L
Linus Torvalds 已提交
1251
		else if ((priv->flags & ASYNC_SPD_MASK) == ASYNC_SPD_VHI)
A
Alan Cox 已提交
1252
			tty->alt_speed = 115200;
L
Linus Torvalds 已提交
1253
		else if ((priv->flags & ASYNC_SPD_MASK) == ASYNC_SPD_SHI)
A
Alan Cox 已提交
1254
			tty->alt_speed = 230400;
L
Linus Torvalds 已提交
1255
		else if ((priv->flags & ASYNC_SPD_MASK) == ASYNC_SPD_WARP)
A
Alan Cox 已提交
1256
			tty->alt_speed = 460800;
L
Linus Torvalds 已提交
1257
		else
A
Alan Cox 已提交
1258
			tty->alt_speed = 0;
L
Linus Torvalds 已提交
1259 1260 1261 1262 1263
	}
	if (((old_priv.flags & ASYNC_SPD_MASK) !=
	     (priv->flags & ASYNC_SPD_MASK)) ||
	    (((priv->flags & ASYNC_SPD_MASK) == ASYNC_SPD_CUST) &&
	     (old_priv.custom_divisor != priv->custom_divisor))) {
A
Alan Cox 已提交
1264
		change_speed(tty, port);
1265
		mutex_unlock(&priv->cfg_lock);
L
Linus Torvalds 已提交
1266
	}
1267
	else
1268
		mutex_unlock(&priv->cfg_lock);
A
Alan Cox 已提交
1269
	return 0;
1270
}
L
Linus Torvalds 已提交
1271 1272


1273 1274 1275 1276 1277 1278 1279 1280 1281 1282
/* Determine type of FTDI chip based on USB config and descriptor. */
static void ftdi_determine_type(struct usb_serial_port *port)
{
	struct ftdi_private *priv = usb_get_serial_port_data(port);
	struct usb_serial *serial = port->serial;
	struct usb_device *udev = serial->dev;
	unsigned version;
	unsigned interfaces;

	/* Assume it is not the original SIO device for now. */
1283
	priv->baud_base = 48000000 / 2;
1284 1285 1286

	version = le16_to_cpu(udev->descriptor.bcdDevice);
	interfaces = udev->actconfig->desc.bNumInterfaces;
1287
	dbg("%s: bcdDevice = 0x%x, bNumInterfaces = %u", __func__,
1288 1289 1290 1291
			version, interfaces);
	if (interfaces > 1) {
		int inter;

1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303
		/* Multiple interfaces.*/
		if (version == 0x0800) {
			priv->chip_type = FT4232H;
			/* Hi-speed - baud clock runs at 120MHz */
			priv->baud_base = 120000000 / 2;
		} else if (version == 0x0700) {
			priv->chip_type = FT2232H;
			/* Hi-speed - baud clock runs at 120MHz */
			priv->baud_base = 120000000 / 2;
		} else
			priv->chip_type = FT2232C;

1304 1305
		/* Determine interface code. */
		inter = serial->interface->altsetting->desc.bInterfaceNumber;
1306 1307 1308 1309 1310 1311 1312 1313 1314
		if (inter == 0) {
			priv->interface = INTERFACE_A;
		} else  if (inter == 1) {
			priv->interface = INTERFACE_B;
		} else  if (inter == 2) {
			priv->interface = INTERFACE_C;
		} else  if (inter == 3) {
			priv->interface = INTERFACE_D;
		}
1315 1316 1317 1318
		/* BM-type devices have a bug where bcdDevice gets set
		 * to 0x200 when iSerialNumber is 0.  */
		if (version < 0x500) {
			dbg("%s: something fishy - bcdDevice too low for multi-interface device",
1319
					__func__);
1320 1321
		}
	} else if (version < 0x200) {
1322
		/* Old device.  Assume it's the original SIO. */
1323 1324 1325
		priv->chip_type = SIO;
		priv->baud_base = 12000000 / 16;
	} else if (version < 0x400) {
1326
		/* Assume it's an FT8U232AM (or FT8U245AM) */
1327 1328 1329
		/* (It might be a BM because of the iSerialNumber bug,
		 * but it will still work as an AM device.) */
		priv->chip_type = FT8U232AM;
1330
	} else if (version < 0x600) {
1331
		/* Assume it's an FT232BM (or FT245BM) */
1332
		priv->chip_type = FT232BM;
1333
	} else {
1334
		/* Assume it's an FT232R */
1335
		priv->chip_type = FT232RL;
1336
	}
1337
	dev_info(&udev->dev, "Detected %s\n", ftdi_chip_name[priv->chip_type]);
1338 1339 1340
}


1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353
/* Determine the maximum packet size for the device.  This depends on the chip
 * type and the USB host capabilities.  The value should be obtained from the
 * device descriptor as the chip will use the appropriate values for the host.*/
static void ftdi_set_max_packet_size(struct usb_serial_port *port)
{
	struct ftdi_private *priv = usb_get_serial_port_data(port);
	struct usb_serial *serial = port->serial;
	struct usb_device *udev = serial->dev;

	struct usb_interface *interface = serial->interface;
	struct usb_endpoint_descriptor *ep_desc = &interface->cur_altsetting->endpoint[1].desc;

	unsigned num_endpoints;
1354
	int i;
1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379

	num_endpoints = interface->cur_altsetting->desc.bNumEndpoints;
	dev_info(&udev->dev, "Number of endpoints %d\n", num_endpoints);

	/* NOTE: some customers have programmed FT232R/FT245R devices
	 * with an endpoint size of 0 - not good.  In this case, we
	 * want to override the endpoint descriptor setting and use a
	 * value of 64 for wMaxPacketSize */
	for (i = 0; i < num_endpoints; i++) {
		dev_info(&udev->dev, "Endpoint %d MaxPacketSize %d\n", i+1,
			interface->cur_altsetting->endpoint[i].desc.wMaxPacketSize);
		ep_desc = &interface->cur_altsetting->endpoint[i].desc;
		if (ep_desc->wMaxPacketSize == 0) {
			ep_desc->wMaxPacketSize = cpu_to_le16(0x40);
			dev_info(&udev->dev, "Overriding wMaxPacketSize on endpoint %d\n", i);
		}
	}

	/* set max packet size based on descriptor */
	priv->max_packet_size = ep_desc->wMaxPacketSize;

	dev_info(&udev->dev, "Setting MaxPacketSize %d\n", priv->max_packet_size);
}


L
Linus Torvalds 已提交
1380 1381 1382 1383 1384 1385
/*
 * ***************************************************************************
 * Sysfs Attribute
 * ***************************************************************************
 */

A
Alan Cox 已提交
1386 1387
static ssize_t show_latency_timer(struct device *dev,
				struct device_attribute *attr, char *buf)
L
Linus Torvalds 已提交
1388 1389 1390
{
	struct usb_serial_port *port = to_usb_serial_port(dev);
	struct ftdi_private *priv = usb_get_serial_port_data(port);
1391 1392 1393 1394
	if (priv->flags & ASYNC_LOW_LATENCY)
		return sprintf(buf, "1\n");
	else
		return sprintf(buf, "%i\n", priv->latency);
L
Linus Torvalds 已提交
1395 1396
}

1397

L
Linus Torvalds 已提交
1398
/* Write a new value of the latency timer, in units of milliseconds. */
A
Alan Cox 已提交
1399 1400 1401
static ssize_t store_latency_timer(struct device *dev,
			struct device_attribute *attr, const char *valbuf,
			size_t count)
L
Linus Torvalds 已提交
1402 1403 1404 1405
{
	struct usb_serial_port *port = to_usb_serial_port(dev);
	struct ftdi_private *priv = usb_get_serial_port_data(port);
	int v = simple_strtoul(valbuf, NULL, 10);
1406
	int rv;
D
David Brownell 已提交
1407

1408 1409 1410
	priv->latency = v;
	rv = write_latency_timer(port);
	if (rv < 0)
L
Linus Torvalds 已提交
1411 1412 1413 1414 1415 1416
		return -EIO;
	return count;
}

/* Write an event character directly to the FTDI register.  The ASCII
   value is in the low 8 bits, with the enable bit in the 9th bit. */
A
Alan Cox 已提交
1417 1418
static ssize_t store_event_char(struct device *dev,
	struct device_attribute *attr, const char *valbuf, size_t count)
L
Linus Torvalds 已提交
1419 1420 1421
{
	struct usb_serial_port *port = to_usb_serial_port(dev);
	struct ftdi_private *priv = usb_get_serial_port_data(port);
1422
	struct usb_device *udev = port->serial->dev;
L
Linus Torvalds 已提交
1423
	int v = simple_strtoul(valbuf, NULL, 10);
1424
	int rv;
D
David Brownell 已提交
1425

1426
	dbg("%s: setting event char = %i", __func__, v);
D
David Brownell 已提交
1427

L
Linus Torvalds 已提交
1428 1429 1430 1431
	rv = usb_control_msg(udev,
			     usb_sndctrlpipe(udev, 0),
			     FTDI_SIO_SET_EVENT_CHAR_REQUEST,
			     FTDI_SIO_SET_EVENT_CHAR_REQUEST_TYPE,
D
David Brownell 已提交
1432
			     v, priv->interface,
1433
			     NULL, 0, WDR_TIMEOUT);
L
Linus Torvalds 已提交
1434 1435 1436 1437
	if (rv < 0) {
		dbg("Unable to write event character: %i", rv);
		return -EIO;
	}
D
David Brownell 已提交
1438

L
Linus Torvalds 已提交
1439 1440 1441
	return count;
}

A
Alan Cox 已提交
1442 1443
static DEVICE_ATTR(latency_timer, S_IWUSR | S_IRUGO, show_latency_timer,
							store_latency_timer);
L
Linus Torvalds 已提交
1444 1445
static DEVICE_ATTR(event_char, S_IWUSR, NULL, store_event_char);

1446
static int create_sysfs_attrs(struct usb_serial_port *port)
1447
{
1448
	struct ftdi_private *priv = usb_get_serial_port_data(port);
1449
	int retval = 0;
L
Linus Torvalds 已提交
1450

A
Alan Cox 已提交
1451
	dbg("%s", __func__);
1452

L
Linus Torvalds 已提交
1453 1454 1455 1456
	/* XXX I've no idea if the original SIO supports the event_char
	 * sysfs parameter, so I'm playing it safe.  */
	if (priv->chip_type != SIO) {
		dbg("sysfs attributes for %s", ftdi_chip_name[priv->chip_type]);
1457
		retval = device_create_file(&port->dev, &dev_attr_event_char);
1458
		if ((!retval) &&
1459 1460
		    (priv->chip_type == FT232BM ||
		     priv->chip_type == FT2232C ||
1461 1462 1463
		     priv->chip_type == FT232RL ||
		     priv->chip_type == FT2232H ||
		     priv->chip_type == FT4232H)) {
1464
			retval = device_create_file(&port->dev,
1465
						    &dev_attr_latency_timer);
L
Linus Torvalds 已提交
1466 1467
		}
	}
1468
	return retval;
L
Linus Torvalds 已提交
1469 1470
}

1471
static void remove_sysfs_attrs(struct usb_serial_port *port)
L
Linus Torvalds 已提交
1472
{
1473
	struct ftdi_private *priv = usb_get_serial_port_data(port);
L
Linus Torvalds 已提交
1474

A
Alan Cox 已提交
1475
	dbg("%s", __func__);
L
Linus Torvalds 已提交
1476 1477 1478

	/* XXX see create_sysfs_attrs */
	if (priv->chip_type != SIO) {
1479
		device_remove_file(&port->dev, &dev_attr_event_char);
1480 1481
		if (priv->chip_type == FT232BM ||
		    priv->chip_type == FT2232C ||
1482 1483 1484
		    priv->chip_type == FT232RL ||
		    priv->chip_type == FT2232H ||
		    priv->chip_type == FT4232H) {
1485
			device_remove_file(&port->dev, &dev_attr_latency_timer);
L
Linus Torvalds 已提交
1486 1487
		}
	}
D
David Brownell 已提交
1488

L
Linus Torvalds 已提交
1489 1490 1491 1492 1493 1494 1495 1496
}

/*
 * ***************************************************************************
 * FTDI driver specific functions
 * ***************************************************************************
 */

1497
/* Probe function to check for special devices */
A
Alan Cox 已提交
1498 1499
static int ftdi_sio_probe(struct usb_serial *serial,
					const struct usb_device_id *id)
1500
{
A
Alan Cox 已提交
1501 1502
	struct ftdi_sio_quirk *quirk =
				(struct ftdi_sio_quirk *)id->driver_info;
1503 1504 1505 1506 1507 1508 1509

	if (quirk && quirk->probe) {
		int ret = quirk->probe(serial);
		if (ret != 0)
			return ret;
	}

1510 1511
	usb_set_serial_data(serial, (void *)id->driver_info);

1512
	return 0;
1513 1514
}

1515
static int ftdi_sio_port_probe(struct usb_serial_port *port)
L
Linus Torvalds 已提交
1516 1517
{
	struct ftdi_private *priv;
1518 1519
	struct ftdi_sio_quirk *quirk = usb_get_serial_data(port->serial);

1520

A
Alan Cox 已提交
1521
	dbg("%s", __func__);
L
Linus Torvalds 已提交
1522

1523
	priv = kzalloc(sizeof(struct ftdi_private), GFP_KERNEL);
A
Alan Cox 已提交
1524
	if (!priv) {
1525
		dev_err(&port->dev, "%s- kmalloc(%Zd) failed.\n", __func__,
A
Alan Cox 已提交
1526
					sizeof(struct ftdi_private));
L
Linus Torvalds 已提交
1527 1528 1529
		return -ENOMEM;
	}

1530
	kref_init(&priv->kref);
1531
	mutex_init(&priv->cfg_lock);
A
Alan Cox 已提交
1532
	init_waitqueue_head(&priv->delta_msr_wait);
1533

L
Linus Torvalds 已提交
1534 1535
	priv->flags = ASYNC_LOW_LATENCY;

1536 1537 1538
	if (quirk && quirk->port_probe)
		quirk->port_probe(priv);

D
David Howells 已提交
1539
	priv->port = port;
1540
	usb_set_serial_port_data(port, priv);
L
Linus Torvalds 已提交
1541

A
Alan Cox 已提交
1542
	ftdi_determine_type(port);
1543
	ftdi_set_max_packet_size(port);
1544 1545
	if (read_latency_timer(port) < 0)
		priv->latency = 16;
1546 1547 1548
	create_sysfs_attrs(port);
	return 0;
}
L
Linus Torvalds 已提交
1549

1550 1551
/* Setup for the USB-UIRT device, which requires hardwired
 * baudrate (38400 gets mapped to 312500) */
L
Linus Torvalds 已提交
1552
/* Called from usbserial:serial_probe */
A
Alan Cox 已提交
1553
static void ftdi_USB_UIRT_setup(struct ftdi_private *priv)
1554
{
A
Alan Cox 已提交
1555
	dbg("%s", __func__);
L
Linus Torvalds 已提交
1556 1557 1558

	priv->flags |= ASYNC_SPD_CUST;
	priv->custom_divisor = 77;
1559
	priv->force_baud = 38400;
1560
}
L
Linus Torvalds 已提交
1561

1562 1563
/* Setup for the HE-TIRA1 device, which requires hardwired
 * baudrate (38400 gets mapped to 100000) and RTS-CTS enabled.  */
A
Alan Cox 已提交
1564 1565

static void ftdi_HE_TIRA1_setup(struct ftdi_private *priv)
1566
{
A
Alan Cox 已提交
1567
	dbg("%s", __func__);
L
Linus Torvalds 已提交
1568 1569 1570

	priv->flags |= ASYNC_SPD_CUST;
	priv->custom_divisor = 240;
1571
	priv->force_baud = 38400;
L
Linus Torvalds 已提交
1572
	priv->force_rtscts = 1;
1573
}
L
Linus Torvalds 已提交
1574

M
Martin Geleynse 已提交
1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598
/*
 * Module parameter to control latency timer for NDI FTDI-based USB devices.
 * If this value is not set in modprobe.conf.local its value will be set to 1ms.
 */
static int ndi_latency_timer = 1;

/* Setup for the NDI FTDI-based USB devices, which requires hardwired
 * baudrate (19200 gets mapped to 1200000).
 *
 * Called from usbserial:serial_probe.
 */
static int ftdi_NDI_device_setup(struct usb_serial *serial)
{
	struct usb_device *udev = serial->dev;
	int latency = ndi_latency_timer;

	if (latency == 0)
		latency = 1;
	if (latency > 99)
		latency = 99;

	dbg("%s setting NDI device latency to %d", __func__, latency);
	dev_info(&udev->dev, "NDI device with a latency value of %d", latency);

1599 1600
	/* FIXME: errors are not returned */
	usb_control_msg(udev, usb_sndctrlpipe(udev, 0),
M
Martin Geleynse 已提交
1601 1602
				FTDI_SIO_SET_LATENCY_TIMER_REQUEST,
				FTDI_SIO_SET_LATENCY_TIMER_REQUEST_TYPE,
1603
				latency, 0, NULL, 0, WDR_TIMEOUT);
M
Martin Geleynse 已提交
1604 1605 1606
	return 0;
}

1607
/*
1608 1609 1610
 * First port on JTAG adaptors such as Olimex arm-usb-ocd or the FIC/OpenMoko
 * Neo1973 Debug Board is reserved for JTAG interface and can be accessed from
 * userspace using openocd.
1611
 */
1612
static int ftdi_jtag_probe(struct usb_serial *serial)
1613 1614 1615 1616
{
	struct usb_device *udev = serial->dev;
	struct usb_interface *interface = serial->interface;

A
Alan Cox 已提交
1617
	dbg("%s", __func__);
1618 1619

	if (interface == udev->actconfig->interface[0]) {
1620 1621
		dev_info(&udev->dev,
			 "Ignoring serial port reserved for JTAG\n");
1622 1623 1624 1625 1626
		return -ENODEV;
	}

	return 0;
}
L
Linus Torvalds 已提交
1627

1628 1629 1630 1631 1632 1633 1634 1635 1636 1637
/*
 * The Matrix Orbital VK204-25-USB has an invalid IN endpoint.
 * We have to correct it if we want to read from it.
 */
static int ftdi_mtxorb_hack_setup(struct usb_serial *serial)
{
	struct usb_host_endpoint *ep = serial->dev->ep_in[1];
	struct usb_endpoint_descriptor *ep_desc = &ep->desc;

	if (ep->enabled && ep_desc->wMaxPacketSize == 0) {
A
Al Viro 已提交
1638
		ep_desc->wMaxPacketSize = cpu_to_le16(0x40);
1639 1640
		dev_info(&serial->dev->dev,
			 "Fixing invalid wMaxPacketSize on read pipe\n");
1641 1642 1643 1644 1645
	}

	return 0;
}

1646 1647 1648 1649 1650 1651 1652
static void ftdi_sio_priv_release(struct kref *k)
{
	struct ftdi_private *priv = container_of(k, struct ftdi_private, kref);

	kfree(priv);
}

1653 1654
static int ftdi_sio_port_remove(struct usb_serial_port *port)
{
L
Linus Torvalds 已提交
1655 1656
	struct ftdi_private *priv = usb_get_serial_port_data(port);

1657
	dbg("%s", __func__);
L
Linus Torvalds 已提交
1658

1659
	remove_sysfs_attrs(port);
D
David Brownell 已提交
1660

1661
	kref_put(&priv->kref, ftdi_sio_priv_release);
L
Linus Torvalds 已提交
1662

1663 1664
	return 0;
}
L
Linus Torvalds 已提交
1665

1666
static int ftdi_open(struct tty_struct *tty, struct usb_serial_port *port)
1667
{
L
Linus Torvalds 已提交
1668 1669
	struct usb_device *dev = port->serial->dev;
	struct ftdi_private *priv = usb_get_serial_port_data(port);
1670
	int result;
L
Linus Torvalds 已提交
1671

1672
	dbg("%s", __func__);
L
Linus Torvalds 已提交
1673

1674 1675
	write_latency_timer(port);

L
Linus Torvalds 已提交
1676 1677 1678
	/* No error checking for this (will get errors later anyway) */
	/* See ftdi_sio.h for description of what is reset */
	usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
D
David Brownell 已提交
1679 1680
			FTDI_SIO_RESET_REQUEST, FTDI_SIO_RESET_REQUEST_TYPE,
			FTDI_SIO_RESET_SIO,
1681
			priv->interface, NULL, 0, WDR_TIMEOUT);
L
Linus Torvalds 已提交
1682 1683

	/* Termios defaults are set by usb_serial_init. We don't change
1684
	   port->tty->termios - this would lose speed settings, etc.
L
Linus Torvalds 已提交
1685 1686 1687
	   This is same behaviour as serial.c/rs_open() - Kuba */

	/* ftdi_set_termios  will send usb control messages */
A
Alan Cox 已提交
1688 1689
	if (tty)
		ftdi_set_termios(tty, port, tty->termios);
L
Linus Torvalds 已提交
1690 1691

	/* Start reading from the device */
1692
	result = usb_serial_generic_open(tty, port);
1693
	if (!result)
1694
		kref_get(&priv->kref);
L
Linus Torvalds 已提交
1695 1696

	return result;
1697
}
L
Linus Torvalds 已提交
1698

1699 1700 1701 1702 1703 1704 1705 1706 1707 1708 1709
static void ftdi_dtr_rts(struct usb_serial_port *port, int on)
{
	struct ftdi_private *priv = usb_get_serial_port_data(port);

	mutex_lock(&port->serial->disc_mutex);
	if (!port->serial->disconnected) {
		/* Disable flow control */
		if (!on && usb_control_msg(port->serial->dev,
			    usb_sndctrlpipe(port->serial->dev, 0),
			    FTDI_SIO_SET_FLOW_CTRL_REQUEST,
			    FTDI_SIO_SET_FLOW_CTRL_REQUEST_TYPE,
1710
			    0, priv->interface, NULL, 0,
1711 1712 1713 1714 1715 1716 1717 1718 1719 1720 1721
			    WDR_TIMEOUT) < 0) {
			    dev_err(&port->dev, "error from flowcontrol urb\n");
		}
		/* drop RTS and DTR */
		if (on)
			set_mctrl(port, TIOCM_DTR | TIOCM_RTS);
		else
			clear_mctrl(port, TIOCM_DTR | TIOCM_RTS);
	}
	mutex_unlock(&port->serial->disc_mutex);
}
L
Linus Torvalds 已提交
1722

D
David Brownell 已提交
1723
/*
L
Linus Torvalds 已提交
1724 1725 1726 1727
 * usbserial:__serial_close  only calls ftdi_close if the point is open
 *
 *   This only gets called when it is the last close
 */
1728
static void ftdi_close(struct usb_serial_port *port)
1729
{
L
Linus Torvalds 已提交
1730 1731
	struct ftdi_private *priv = usb_get_serial_port_data(port);

1732
	dbg("%s", __func__);
L
Linus Torvalds 已提交
1733

1734
	usb_serial_generic_close(port);
1735
	kref_put(&priv->kref, ftdi_sio_priv_release);
1736
}
D
David Brownell 已提交
1737

L
Linus Torvalds 已提交
1738 1739 1740 1741 1742 1743 1744
/* The SIO requires the first byte to have:
 *  B0 1
 *  B1 0
 *  B2..7 length of message excluding byte 0
 *
 * The new devices do not require this byte
 */
1745
static int ftdi_prepare_write_buffer(struct usb_serial_port *port,
1746
						void *dest, size_t size)
1747
{
1748
	struct ftdi_private *priv;
1749 1750
	int count;
	unsigned long flags;
L
Linus Torvalds 已提交
1751

1752
	priv = usb_get_serial_port_data(port);
D
David Brownell 已提交
1753

1754
	if (priv->chip_type == SIO) {
1755 1756 1757 1758 1759 1760 1761 1762 1763 1764
		unsigned char *buffer = dest;
		int i, len, c;

		count = 0;
		spin_lock_irqsave(&port->lock, flags);
		for (i = 0; i < size - 1; i += priv->max_packet_size) {
			len = min_t(int, size - i, priv->max_packet_size) - 1;
			c = kfifo_out(&port->write_fifo, &buffer[i + 1], len);
			if (!c)
				break;
1765
			buffer[i] = (c << 2) + 1;
1766
			count += c + 1;
L
Linus Torvalds 已提交
1767
		}
1768
		spin_unlock_irqrestore(&port->lock, flags);
L
Linus Torvalds 已提交
1769
	} else {
1770 1771
		count = kfifo_out_locked(&port->write_fifo, dest, size,
								&port->lock);
L
Linus Torvalds 已提交
1772 1773
	}

O
Oliver Neukum 已提交
1774
	return count;
1775
}
L
Linus Torvalds 已提交
1776

1777 1778
#define FTDI_RS_ERR_MASK (FTDI_RS_BI | FTDI_RS_PE | FTDI_RS_FE | FTDI_RS_OE)

1779 1780 1781
static int ftdi_process_packet(struct tty_struct *tty,
		struct usb_serial_port *port, struct ftdi_private *priv,
		char *packet, int len)
A
Alan Cox 已提交
1782
{
L
Linus Torvalds 已提交
1783
	int i;
1784 1785 1786
	char status;
	char flag;
	char *ch;
L
Linus Torvalds 已提交
1787

1788
	dbg("%s - port %d", __func__, port->number);
L
Linus Torvalds 已提交
1789

1790 1791 1792
	if (len < 2) {
		dbg("malformed packet");
		return 0;
L
Linus Torvalds 已提交
1793 1794
	}

1795 1796 1797 1798 1799 1800 1801 1802
	/* Compare new line status to the old one, signal if different/
	   N.B. packet may be processed more than once, but differences
	   are only processed once.  */
	status = packet[0] & FTDI_STATUS_B0_MASK;
	if (status != priv->prev_status) {
		priv->diff_status |= status ^ priv->prev_status;
		wake_up_interruptible(&priv->delta_msr_wait);
		priv->prev_status = status;
L
Linus Torvalds 已提交
1803 1804
	}

1805
	flag = TTY_NORMAL;
1806 1807 1808 1809 1810 1811 1812 1813 1814 1815 1816 1817 1818 1819
	if (packet[1] & FTDI_RS_ERR_MASK) {
		/* Break takes precedence over parity, which takes precedence
		 * over framing errors */
		if (packet[1] & FTDI_RS_BI) {
			flag = TTY_BREAK;
			usb_serial_handle_break(port);
		} else if (packet[1] & FTDI_RS_PE) {
			flag = TTY_PARITY;
		} else if (packet[1] & FTDI_RS_FE) {
			flag = TTY_FRAME;
		}
		/* Overrun is special, not associated with a char */
		if (packet[1] & FTDI_RS_OE)
			tty_insert_flip_char(tty, 0, TTY_OVERRUN);
1820
	}
L
Linus Torvalds 已提交
1821

1822 1823 1824 1825 1826
	len -= 2;
	if (!len)
		return 0;	/* status only */
	ch = packet + 2;

1827
	if (port->port.console && port->sysrq) {
1828 1829 1830
		for (i = 0; i < len; i++, ch++) {
			if (!usb_serial_handle_sysrq_char(tty, port, *ch))
				tty_insert_flip_char(tty, *ch, flag);
1831
		}
1832 1833
	} else {
		tty_insert_flip_string_fixed_flag(tty, ch, flag, len);
1834
	}
1835

1836 1837
	return len;
}
1838

1839
static void ftdi_process_read_urb(struct urb *urb)
1840
{
1841
	struct usb_serial_port *port = urb->context;
1842 1843 1844 1845 1846 1847
	struct tty_struct *tty;
	struct ftdi_private *priv = usb_get_serial_port_data(port);
	char *data = (char *)urb->transfer_buffer;
	int i;
	int len;
	int count = 0;
L
Linus Torvalds 已提交
1848

1849 1850 1851
	tty = tty_port_tty_get(&port->port);
	if (!tty)
		return;
L
Linus Torvalds 已提交
1852

1853 1854 1855 1856
	for (i = 0; i < urb->actual_length; i += priv->max_packet_size) {
		len = min_t(int, urb->actual_length - i, priv->max_packet_size);
		count += ftdi_process_packet(tty, port, priv, &data[i], len);
	}
L
Linus Torvalds 已提交
1857

1858
	if (count)
L
Linus Torvalds 已提交
1859
		tty_flip_buffer_push(tty);
1860 1861
	tty_kref_put(tty);
}
L
Linus Torvalds 已提交
1862

A
Alan Cox 已提交
1863
static void ftdi_break_ctl(struct tty_struct *tty, int break_state)
L
Linus Torvalds 已提交
1864
{
A
Alan Cox 已提交
1865
	struct usb_serial_port *port = tty->driver_data;
L
Linus Torvalds 已提交
1866
	struct ftdi_private *priv = usb_get_serial_port_data(port);
1867
	__u16 urb_value;
D
David Brownell 已提交
1868

L
Linus Torvalds 已提交
1869 1870 1871 1872
	/* break_state = -1 to turn on break, and 0 to turn off break */
	/* see drivers/char/tty_io.c to see it used */
	/* last_set_data_urb_value NEVER has the break bit set in it */

A
Alan Cox 已提交
1873
	if (break_state)
L
Linus Torvalds 已提交
1874
		urb_value = priv->last_set_data_urb_value | FTDI_SIO_SET_BREAK;
A
Alan Cox 已提交
1875
	else
D
David Brownell 已提交
1876 1877
		urb_value = priv->last_set_data_urb_value;

A
Alan Cox 已提交
1878 1879 1880 1881 1882
	if (usb_control_msg(port->serial->dev,
			usb_sndctrlpipe(port->serial->dev, 0),
			FTDI_SIO_SET_DATA_REQUEST,
			FTDI_SIO_SET_DATA_REQUEST_TYPE,
			urb_value , priv->interface,
1883
			NULL, 0, WDR_TIMEOUT) < 0) {
1884 1885
		dev_err(&port->dev, "%s FAILED to enable/disable break state "
			"(state was %d)\n", __func__, break_state);
D
David Brownell 已提交
1886
	}
L
Linus Torvalds 已提交
1887

A
Alan Cox 已提交
1888 1889
	dbg("%s break state is %d - urb is %d", __func__,
						break_state, urb_value);
D
David Brownell 已提交
1890

L
Linus Torvalds 已提交
1891 1892 1893 1894 1895 1896
}

/* old_termios contains the original termios settings and tty->termios contains
 * the new setting to be used
 * WARNING: set_termios calls this with old_termios in kernel space
 */
A
Alan Cox 已提交
1897 1898
static void ftdi_set_termios(struct tty_struct *tty,
		struct usb_serial_port *port, struct ktermios *old_termios)
1899
{
L
Linus Torvalds 已提交
1900 1901
	struct usb_device *dev = port->serial->dev;
	struct ftdi_private *priv = usb_get_serial_port_data(port);
A
Alan Cox 已提交
1902
	struct ktermios *termios = tty->termios;
1903
	unsigned int cflag = termios->c_cflag;
L
Linus Torvalds 已提交
1904
	__u16 urb_value; /* will hold the new flags */
D
David Brownell 已提交
1905

A
Alan Cox 已提交
1906
	/* Added for xon/xoff support */
1907
	unsigned int iflag = termios->c_iflag;
L
Linus Torvalds 已提交
1908 1909
	unsigned char vstop;
	unsigned char vstart;
D
David Brownell 已提交
1910

1911
	dbg("%s", __func__);
L
Linus Torvalds 已提交
1912

A
Alan Cox 已提交
1913 1914
	/* Force baud rate if this device requires it, unless it is set to
	   B0. */
1915
	if (priv->force_baud && ((termios->c_cflag & CBAUD) != B0)) {
1916
		dbg("%s: forcing baud rate for this device", __func__);
A
Alan Cox 已提交
1917
		tty_encode_baud_rate(tty, priv->force_baud,
1918
					priv->force_baud);
L
Linus Torvalds 已提交
1919 1920 1921 1922
	}

	/* Force RTS-CTS if this device requires it. */
	if (priv->force_rtscts) {
1923
		dbg("%s: forcing rtscts for this device", __func__);
1924
		termios->c_cflag |= CRTSCTS;
L
Linus Torvalds 已提交
1925 1926
	}

1927
	cflag = termios->c_cflag;
L
Linus Torvalds 已提交
1928

D
David Brownell 已提交
1929 1930
	/* FIXME -For this cut I don't care if the line is really changing or
	   not  - so just do the change regardless  - should be able to
L
Linus Torvalds 已提交
1931
	   compare old_termios and tty->termios */
D
David Brownell 已提交
1932
	/* NOTE These routines can get interrupted by
A
Alan Cox 已提交
1933 1934
	   ftdi_sio_read_bulk_callback  - need to examine what this means -
	   don't see any problems yet */
D
David Brownell 已提交
1935

L
Linus Torvalds 已提交
1936
	/* Set number of data bits, parity, stop bits */
D
David Brownell 已提交
1937

L
Linus Torvalds 已提交
1938 1939 1940
	urb_value = 0;
	urb_value |= (cflag & CSTOPB ? FTDI_SIO_SET_DATA_STOP_BITS_2 :
		      FTDI_SIO_SET_DATA_STOP_BITS_1);
1941 1942 1943 1944 1945 1946 1947 1948 1949 1950 1951 1952
	if (cflag & PARENB) {
		if (cflag & CMSPAR)
			urb_value |= cflag & PARODD ?
				     FTDI_SIO_SET_DATA_PARITY_MARK :
				     FTDI_SIO_SET_DATA_PARITY_SPACE;
		else
			urb_value |= cflag & PARODD ?
				     FTDI_SIO_SET_DATA_PARITY_ODD :
				     FTDI_SIO_SET_DATA_PARITY_EVEN;
	} else {
		urb_value |= FTDI_SIO_SET_DATA_PARITY_NONE;
	}
L
Linus Torvalds 已提交
1953 1954 1955 1956 1957
	if (cflag & CSIZE) {
		switch (cflag & CSIZE) {
		case CS7: urb_value |= 7; dbg("Setting CS7"); break;
		case CS8: urb_value |= 8; dbg("Setting CS8"); break;
		default:
1958
			dev_err(&port->dev, "CSIZE was set but not CS7-CS8\n");
L
Linus Torvalds 已提交
1959 1960 1961
		}
	}

A
Alan Cox 已提交
1962 1963
	/* This is needed by the break command since it uses the same command
	   - but is or'ed with this value  */
L
Linus Torvalds 已提交
1964
	priv->last_set_data_urb_value = urb_value;
D
David Brownell 已提交
1965

L
Linus Torvalds 已提交
1966
	if (usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
D
David Brownell 已提交
1967
			    FTDI_SIO_SET_DATA_REQUEST,
L
Linus Torvalds 已提交
1968 1969
			    FTDI_SIO_SET_DATA_REQUEST_TYPE,
			    urb_value , priv->interface,
1970
			    NULL, 0, WDR_SHORT_TIMEOUT) < 0) {
1971 1972
		dev_err(&port->dev, "%s FAILED to set "
			"databits/stopbits/parity\n", __func__);
D
David Brownell 已提交
1973
	}
L
Linus Torvalds 已提交
1974 1975

	/* Now do the baudrate */
A
Alan Cox 已提交
1976
	if ((cflag & CBAUD) == B0) {
L
Linus Torvalds 已提交
1977 1978
		/* Disable flow control */
		if (usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
D
David Brownell 已提交
1979
				    FTDI_SIO_SET_FLOW_CTRL_REQUEST,
L
Linus Torvalds 已提交
1980
				    FTDI_SIO_SET_FLOW_CTRL_REQUEST_TYPE,
D
David Brownell 已提交
1981
				    0, priv->interface,
1982
				    NULL, 0, WDR_TIMEOUT) < 0) {
1983 1984 1985
			dev_err(&port->dev,
				"%s error from disable flowcontrol urb\n",
				__func__);
D
David Brownell 已提交
1986
		}
L
Linus Torvalds 已提交
1987
		/* Drop RTS and DTR */
1988
		clear_mctrl(port, TIOCM_DTR | TIOCM_RTS);
L
Linus Torvalds 已提交
1989 1990
	} else {
		/* set the baudrate determined before */
1991
		mutex_lock(&priv->cfg_lock);
A
Alan Cox 已提交
1992
		if (change_speed(tty, port))
1993 1994
			dev_err(&port->dev, "%s urb failed to set baudrate\n",
				__func__);
1995
		mutex_unlock(&priv->cfg_lock);
1996
		/* Ensure RTS and DTR are raised when baudrate changed from 0 */
A
Alan Cox 已提交
1997
		if (!old_termios || (old_termios->c_cflag & CBAUD) == B0)
1998
			set_mctrl(port, TIOCM_DTR | TIOCM_RTS);
L
Linus Torvalds 已提交
1999 2000 2001 2002 2003
	}

	/* Set flow control */
	/* Note device also supports DTR/CD (ugh) and Xon/Xoff in hardware */
	if (cflag & CRTSCTS) {
2004
		dbg("%s Setting to CRTSCTS flow control", __func__);
D
David Brownell 已提交
2005
		if (usb_control_msg(dev,
L
Linus Torvalds 已提交
2006
				    usb_sndctrlpipe(dev, 0),
D
David Brownell 已提交
2007
				    FTDI_SIO_SET_FLOW_CTRL_REQUEST,
L
Linus Torvalds 已提交
2008 2009
				    FTDI_SIO_SET_FLOW_CTRL_REQUEST_TYPE,
				    0 , (FTDI_SIO_RTS_CTS_HS | priv->interface),
2010
				    NULL, 0, WDR_TIMEOUT) < 0) {
2011 2012
			dev_err(&port->dev,
				"urb failed to set to rts/cts flow control\n");
D
David Brownell 已提交
2013 2014
		}

2015 2016
		/* raise DTR/RTS */
		set_mctrl(port, TIOCM_DTR | TIOCM_RTS);
D
David Brownell 已提交
2017
	} else {
L
Linus Torvalds 已提交
2018 2019 2020
		/*
		 * Xon/Xoff code
		 *
A
Alan Cox 已提交
2021 2022 2023 2024
		 * Check the IXOFF status in the iflag component of the
		 * termios structure. If IXOFF is not set, the pre-xon/xoff
		 * code is executed.
		 */
L
Linus Torvalds 已提交
2025
		if (iflag & IXOFF) {
A
Alan Cox 已提交
2026 2027 2028 2029 2030 2031 2032 2033
			dbg("%s  request to enable xonxoff iflag=%04x",
							__func__, iflag);
			/* Try to enable the XON/XOFF on the ftdi_sio
			 * Set the vstart and vstop -- could have been done up
			 * above where a lot of other dereferencing is done but
			 * that would be very inefficient as vstart and vstop
			 * are not always needed.
			 */
2034 2035
			vstart = termios->c_cc[VSTART];
			vstop = termios->c_cc[VSTOP];
A
Alan Cox 已提交
2036
			urb_value = (vstop << 8) | (vstart);
L
Linus Torvalds 已提交
2037 2038 2039 2040 2041 2042 2043

			if (usb_control_msg(dev,
					    usb_sndctrlpipe(dev, 0),
					    FTDI_SIO_SET_FLOW_CTRL_REQUEST,
					    FTDI_SIO_SET_FLOW_CTRL_REQUEST_TYPE,
					    urb_value , (FTDI_SIO_XON_XOFF_HS
							 | priv->interface),
2044
					    NULL, 0, WDR_TIMEOUT) < 0) {
2045 2046
				dev_err(&port->dev, "urb failed to set to "
					"xon/xoff flow control\n");
L
Linus Torvalds 已提交
2047 2048
			}
		} else {
A
Alan Cox 已提交
2049 2050 2051
			/* else clause to only run if cflag ! CRTSCTS and iflag
			 * ! XOFF. CHECKME Assuming XON/XOFF handled by tty
			 * stack - not by device */
2052
			dbg("%s Turning off hardware flow control", __func__);
D
David Brownell 已提交
2053
			if (usb_control_msg(dev,
L
Linus Torvalds 已提交
2054
					    usb_sndctrlpipe(dev, 0),
D
David Brownell 已提交
2055
					    FTDI_SIO_SET_FLOW_CTRL_REQUEST,
L
Linus Torvalds 已提交
2056
					    FTDI_SIO_SET_FLOW_CTRL_REQUEST_TYPE,
D
David Brownell 已提交
2057
					    0, priv->interface,
2058
					    NULL, 0, WDR_TIMEOUT) < 0) {
2059 2060
				dev_err(&port->dev,
					"urb failed to clear flow control\n");
D
David Brownell 已提交
2061
			}
L
Linus Torvalds 已提交
2062
		}
D
David Brownell 已提交
2063

2064 2065
		/* lower DTR/RTS */
		clear_mctrl(port, TIOCM_DTR | TIOCM_RTS);
L
Linus Torvalds 已提交
2066 2067
	}
	return;
A
Alan Cox 已提交
2068
}
L
Linus Torvalds 已提交
2069

A
Alan Cox 已提交
2070
static int ftdi_tiocmget(struct tty_struct *tty, struct file *file)
L
Linus Torvalds 已提交
2071
{
A
Alan Cox 已提交
2072
	struct usb_serial_port *port = tty->driver_data;
L
Linus Torvalds 已提交
2073
	struct ftdi_private *priv = usb_get_serial_port_data(port);
2074
	unsigned char *buf;
2075
	int len;
L
Linus Torvalds 已提交
2076 2077
	int ret;

2078
	dbg("%s TIOCMGET", __func__);
2079 2080 2081 2082

	buf = kmalloc(2, GFP_KERNEL);
	if (!buf)
		return -ENOMEM;
2083 2084 2085 2086
	/*
	 * The 8U232AM returns a two byte value (the SIO a 1 byte value) in
	 * the same format as the data returned from the in point.
	 */
L
Linus Torvalds 已提交
2087 2088
	switch (priv->chip_type) {
	case SIO:
2089
		len = 1;
L
Linus Torvalds 已提交
2090 2091 2092 2093
		break;
	case FT8U232AM:
	case FT232BM:
	case FT2232C:
2094
	case FT232RL:
2095 2096
	case FT2232H:
	case FT4232H:
2097
		len = 2;
L
Linus Torvalds 已提交
2098 2099
		break;
	default:
2100 2101
		ret = -EFAULT;
		goto out;
L
Linus Torvalds 已提交
2102
	}
D
David Brownell 已提交
2103

2104 2105 2106 2107 2108 2109 2110 2111 2112
	ret = usb_control_msg(port->serial->dev,
			usb_rcvctrlpipe(port->serial->dev, 0),
			FTDI_SIO_GET_MODEM_STATUS_REQUEST,
			FTDI_SIO_GET_MODEM_STATUS_REQUEST_TYPE,
			0, priv->interface,
			buf, len, WDR_TIMEOUT);
	if (ret < 0)
		goto out;

2113
	ret = (buf[0] & FTDI_SIO_DSR_MASK ? TIOCM_DSR : 0) |
L
Linus Torvalds 已提交
2114 2115 2116
		(buf[0] & FTDI_SIO_CTS_MASK ? TIOCM_CTS : 0) |
		(buf[0]  & FTDI_SIO_RI_MASK  ? TIOCM_RI  : 0) |
		(buf[0]  & FTDI_SIO_RLSD_MASK ? TIOCM_CD  : 0) |
D
David Brownell 已提交
2117
		priv->last_dtr_rts;
2118 2119 2120
out:
	kfree(buf);
	return ret;
L
Linus Torvalds 已提交
2121 2122
}

A
Alan Cox 已提交
2123
static int ftdi_tiocmset(struct tty_struct *tty, struct file *file,
A
Alan Cox 已提交
2124
			unsigned int set, unsigned int clear)
L
Linus Torvalds 已提交
2125
{
A
Alan Cox 已提交
2126
	struct usb_serial_port *port = tty->driver_data;
2127
	dbg("%s TIOCMSET", __func__);
2128
	return update_mctrl(port, set, clear);
L
Linus Torvalds 已提交
2129 2130
}

A
Alan Cox 已提交
2131 2132
static int ftdi_ioctl(struct tty_struct *tty, struct file *file,
					unsigned int cmd, unsigned long arg)
L
Linus Torvalds 已提交
2133
{
A
Alan Cox 已提交
2134
	struct usb_serial_port *port = tty->driver_data;
L
Linus Torvalds 已提交
2135 2136
	struct ftdi_private *priv = usb_get_serial_port_data(port);

2137
	dbg("%s cmd 0x%04x", __func__, cmd);
L
Linus Torvalds 已提交
2138 2139 2140 2141 2142

	/* Based on code from acm.c and others */
	switch (cmd) {

	case TIOCGSERIAL: /* gets serial port data */
A
Alan Cox 已提交
2143 2144
		return get_serial_info(port,
					(struct serial_struct __user *) arg);
L
Linus Torvalds 已提交
2145 2146

	case TIOCSSERIAL: /* sets serial port data */
A
Alan Cox 已提交
2147 2148
		return set_serial_info(tty, port,
					(struct serial_struct __user *) arg);
L
Linus Torvalds 已提交
2149 2150 2151 2152 2153 2154 2155 2156 2157 2158 2159 2160 2161 2162 2163 2164 2165 2166

	/*
	 * Wait for any of the 4 modem inputs (DCD,RI,DSR,CTS) to change
	 * - mask passed in arg for lines of interest
	 *   (use |'ed TIOCM_RNG/DSR/CD/CTS for masking)
	 * Caller should use TIOCGICOUNT to see which one it was.
	 *
	 * This code is borrowed from linux/drivers/char/serial.c
	 */
	case TIOCMIWAIT:
		while (priv != NULL) {
			interruptible_sleep_on(&priv->delta_msr_wait);
			/* see if a signal did it */
			if (signal_pending(current))
				return -ERESTARTSYS;
			else {
				char diff = priv->diff_status;

A
Alan Cox 已提交
2167
				if (diff == 0)
L
Linus Torvalds 已提交
2168 2169 2170 2171 2172
					return -EIO; /* no change => error */

				/* Consume all events */
				priv->diff_status = 0;

A
Alan Cox 已提交
2173 2174 2175 2176 2177 2178
				/* Return 0 if caller wanted to know about
				   these bits */
				if (((arg & TIOCM_RNG) && (diff & FTDI_RS0_RI)) ||
				    ((arg & TIOCM_DSR) && (diff & FTDI_RS0_DSR)) ||
				    ((arg & TIOCM_CD)  && (diff & FTDI_RS0_RLSD)) ||
				    ((arg & TIOCM_CTS) && (diff & FTDI_RS0_CTS))) {
L
Linus Torvalds 已提交
2179 2180 2181
					return 0;
				}
				/*
A
Alan Cox 已提交
2182 2183 2184
				 * Otherwise caller can't care less about what
				 * happened,and so we continue to wait for more
				 * events.
L
Linus Torvalds 已提交
2185 2186 2187
				 */
			}
		}
A
Alan Cox 已提交
2188
		return 0;
L
Linus Torvalds 已提交
2189 2190 2191
	default:
		break;
	}
A
Alan Cox 已提交
2192 2193
	/* This is not necessarily an error - turns out the higher layers
	 * will do some ioctls themselves (see comment above)
L
Linus Torvalds 已提交
2194
	 */
2195
	dbg("%s arg not supported - it was 0x%04x - check /usr/include/asm/ioctls.h", __func__, cmd);
A
Alan Cox 已提交
2196 2197
	return -ENOIOCTLCMD;
}
L
Linus Torvalds 已提交
2198

A
Alan Cox 已提交
2199
static int __init ftdi_init(void)
L
Linus Torvalds 已提交
2200 2201 2202
{
	int retval;

2203
	dbg("%s", __func__);
2204 2205 2206 2207 2208 2209 2210 2211 2212
	if (vendor > 0 && product > 0) {
		/* Add user specified VID/PID to reserved element of table. */
		int i;
		for (i = 0; id_table_combined[i].idVendor; i++)
			;
		id_table_combined[i].match_flags = USB_DEVICE_ID_MATCH_DEVICE;
		id_table_combined[i].idVendor = vendor;
		id_table_combined[i].idProduct = product;
	}
2213
	retval = usb_serial_register(&ftdi_sio_device);
L
Linus Torvalds 已提交
2214
	if (retval)
2215
		goto failed_sio_register;
L
Linus Torvalds 已提交
2216
	retval = usb_register(&ftdi_driver);
D
David Brownell 已提交
2217
	if (retval)
L
Linus Torvalds 已提交
2218 2219
		goto failed_usb_register;

2220 2221
	printk(KERN_INFO KBUILD_MODNAME ": " DRIVER_VERSION ":"
	       DRIVER_DESC "\n");
L
Linus Torvalds 已提交
2222 2223
	return 0;
failed_usb_register:
2224 2225
	usb_serial_deregister(&ftdi_sio_device);
failed_sio_register:
L
Linus Torvalds 已提交
2226 2227 2228
	return retval;
}

A
Alan Cox 已提交
2229
static void __exit ftdi_exit(void)
L
Linus Torvalds 已提交
2230
{
2231
	dbg("%s", __func__);
L
Linus Torvalds 已提交
2232

A
Alan Cox 已提交
2233 2234
	usb_deregister(&ftdi_driver);
	usb_serial_deregister(&ftdi_sio_device);
L
Linus Torvalds 已提交
2235 2236 2237 2238 2239 2240
}


module_init(ftdi_init);
module_exit(ftdi_exit);

A
Alan Cox 已提交
2241 2242
MODULE_AUTHOR(DRIVER_AUTHOR);
MODULE_DESCRIPTION(DRIVER_DESC);
L
Linus Torvalds 已提交
2243 2244 2245 2246
MODULE_LICENSE("GPL");

module_param(debug, bool, S_IRUGO | S_IWUSR);
MODULE_PARM_DESC(debug, "Debug enabled or not");
2247 2248 2249 2250
module_param(vendor, ushort, 0);
MODULE_PARM_DESC(vendor, "User specified vendor ID (default="
		__MODULE_STRING(FTDI_VID)")");
module_param(product, ushort, 0);
2251
MODULE_PARM_DESC(product, "User specified product ID");
L
Linus Torvalds 已提交
2252

M
Martin Geleynse 已提交
2253 2254
module_param(ndi_latency_timer, int, S_IRUGO | S_IWUSR);
MODULE_PARM_DESC(ndi_latency_timer, "NDI device latency timer override");