xref: /freebsd/sys/dev/usb/serial/uftdi.c (revision b04a7a0baf6523245034b8ccd06cd0176b8a18cf)
1 /*	$NetBSD: uftdi.c,v 1.13 2002/09/23 05:51:23 simonb Exp $	*/
2 
3 /*-
4  * Copyright (c) 2000 The NetBSD Foundation, Inc.
5  * All rights reserved.
6  *
7  * This code is derived from software contributed to The NetBSD Foundation
8  * by Lennart Augustsson (lennart@augustsson.net).
9  *
10  * Redistribution and use in source and binary forms, with or without
11  * modification, are permitted provided that the following conditions
12  * are met:
13  * 1. Redistributions of source code must retain the above copyright
14  *    notice, this list of conditions and the following disclaimer.
15  * 2. Redistributions in binary form must reproduce the above copyright
16  *    notice, this list of conditions and the following disclaimer in the
17  *    documentation and/or other materials provided with the distribution.
18  *
19  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
20  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
21  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
23  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29  * POSSIBILITY OF SUCH DAMAGE.
30  */
31 
32 #include <sys/cdefs.h>
33 __FBSDID("$FreeBSD$");
34 
35 /*
36  * NOTE: all function names beginning like "uftdi_cfg_" can only
37  * be called from within the config thread function !
38  */
39 
40 /*
41  * FTDI FT232x, FT2232x, FT4232x, FT8U100AX and FT8U232xM serial adapters.
42  *
43  * Note that we specifically do not do a reset or otherwise alter the state of
44  * the chip during attach, detach, open, and close, because it could be
45  * pre-initialized (via an attached serial eeprom) to power-on into a mode such
46  * as bitbang in which the pins are being driven to a specific state which we
47  * must not perturb.  The device gets reset at power-on, and doesn't need to be
48  * reset again after that to function, except as directed by ioctl() calls.
49  */
50 
51 #include <sys/stdint.h>
52 #include <sys/stddef.h>
53 #include <sys/param.h>
54 #include <sys/queue.h>
55 #include <sys/types.h>
56 #include <sys/systm.h>
57 #include <sys/kernel.h>
58 #include <sys/bus.h>
59 #include <sys/module.h>
60 #include <sys/lock.h>
61 #include <sys/mutex.h>
62 #include <sys/condvar.h>
63 #include <sys/sysctl.h>
64 #include <sys/sx.h>
65 #include <sys/unistd.h>
66 #include <sys/callout.h>
67 #include <sys/malloc.h>
68 #include <sys/priv.h>
69 
70 #include <dev/usb/usb.h>
71 #include <dev/usb/usbdi.h>
72 #include <dev/usb/usbdi_util.h>
73 #include <dev/usb/usb_core.h>
74 #include <dev/usb/usb_ioctl.h>
75 #include "usbdevs.h"
76 
77 #define	USB_DEBUG_VAR uftdi_debug
78 #include <dev/usb/usb_debug.h>
79 #include <dev/usb/usb_process.h>
80 
81 #include <dev/usb/serial/usb_serial.h>
82 #include <dev/usb/serial/uftdi_reg.h>
83 #include <dev/usb/uftdiio.h>
84 
85 #ifdef USB_DEBUG
86 static int uftdi_debug = 0;
87 
88 static SYSCTL_NODE(_hw_usb, OID_AUTO, uftdi, CTLFLAG_RW, 0, "USB uftdi");
89 SYSCTL_INT(_hw_usb_uftdi, OID_AUTO, debug, CTLFLAG_RW,
90     &uftdi_debug, 0, "Debug level");
91 #endif
92 
93 #define	UFTDI_CONFIG_INDEX	0
94 #define	UFTDI_IFACE_INDEX_JTAG	0
95 
96 /*
97  * IO buffer sizes and FTDI device procotol sizes.
98  *
99  * Note that the output packet size in the following defines is not the usb
100  * protocol packet size based on bus speed, it is the size dictated by the FTDI
101  * device itself, and is used only on older chips.
102  *
103  * We allocate buffers bigger than the hardware's packet size, and process
104  * multiple packets within each buffer.  This allows the controller to make
105  * optimal use of the usb bus by conducting multiple transfers with the device
106  * during a single bus timeslice to fill or drain the chip's fifos.
107  *
108  * The output data on newer chips has no packet header, and we are able to pack
109  * any number of output bytes into a buffer.  On some older chips, each output
110  * packet contains a 1-byte header and up to 63 bytes of payload.  The size is
111  * encoded in 6 bits of the header, hence the 64-byte limit on packet size.  We
112  * loop to fill the buffer with many of these header+payload packets.
113  *
114  * The input data on all chips consists of packets which contain a 2-byte header
115  * followed by data payload.  The total size of the packet is wMaxPacketSize
116  * which can change based on the bus speed (e.g., 64 for full speed, 512 for
117  * high speed).  We loop to extract the headers and payloads from the packets
118  * packed into an input buffer.
119  */
120 #define	UFTDI_IBUFSIZE	2048
121 #define	UFTDI_IHDRSIZE	   2
122 #define	UFTDI_OBUFSIZE	2048
123 #define	UFTDI_OPKTSIZE	  64
124 
125 enum {
126 	UFTDI_BULK_DT_WR,
127 	UFTDI_BULK_DT_RD,
128 	UFTDI_N_TRANSFER,
129 };
130 
131 enum {
132 	DEVT_SIO,
133 	DEVT_232A,
134 	DEVT_232B,
135 	DEVT_2232D,	/* Includes 2232C */
136 	DEVT_232R,
137 	DEVT_2232H,
138 	DEVT_4232H,
139 	DEVT_232H,
140 	DEVT_230X,
141 };
142 
143 #define	DEVF_BAUDBITS_HINDEX	0x01	/* Baud bits in high byte of index. */
144 #define	DEVF_BAUDCLK_12M	0X02	/* Base baud clock is 12MHz. */
145 
146 struct uftdi_softc {
147 	struct ucom_super_softc sc_super_ucom;
148 	struct ucom_softc sc_ucom;
149 
150 	struct usb_device *sc_udev;
151 	struct usb_xfer *sc_xfer[UFTDI_N_TRANSFER];
152 	device_t sc_dev;
153 	struct mtx sc_mtx;
154 
155 	uint32_t sc_unit;
156 
157 	uint16_t sc_last_lcr;
158 	uint16_t sc_bcdDevice;
159 
160 	uint8_t sc_devtype;
161 	uint8_t sc_devflags;
162 	uint8_t	sc_hdrlen;
163 	uint8_t	sc_msr;
164 	uint8_t	sc_lsr;
165 };
166 
167 struct uftdi_param_config {
168 	uint16_t baud_lobits;
169 	uint16_t baud_hibits;
170 	uint16_t lcr;
171 	uint8_t	v_start;
172 	uint8_t	v_stop;
173 	uint8_t	v_flow;
174 };
175 
176 /* prototypes */
177 
178 static device_probe_t uftdi_probe;
179 static device_attach_t uftdi_attach;
180 static device_detach_t uftdi_detach;
181 static void uftdi_free_softc(struct uftdi_softc *);
182 
183 static usb_callback_t uftdi_write_callback;
184 static usb_callback_t uftdi_read_callback;
185 
186 static void	uftdi_free(struct ucom_softc *);
187 static void	uftdi_cfg_open(struct ucom_softc *);
188 static void	uftdi_cfg_close(struct ucom_softc *);
189 static void	uftdi_cfg_set_dtr(struct ucom_softc *, uint8_t);
190 static void	uftdi_cfg_set_rts(struct ucom_softc *, uint8_t);
191 static void	uftdi_cfg_set_break(struct ucom_softc *, uint8_t);
192 static int	uftdi_set_parm_soft(struct ucom_softc *, struct termios *,
193 		    struct uftdi_param_config *);
194 static int	uftdi_pre_param(struct ucom_softc *, struct termios *);
195 static void	uftdi_cfg_param(struct ucom_softc *, struct termios *);
196 static void	uftdi_cfg_get_status(struct ucom_softc *, uint8_t *,
197 		    uint8_t *);
198 static int	uftdi_reset(struct ucom_softc *, int);
199 static int	uftdi_set_bitmode(struct ucom_softc *, uint8_t, uint8_t);
200 static int	uftdi_get_bitmode(struct ucom_softc *, uint8_t *);
201 static int	uftdi_set_latency(struct ucom_softc *, int);
202 static int	uftdi_get_latency(struct ucom_softc *, int *);
203 static int	uftdi_set_event_char(struct ucom_softc *, int);
204 static int	uftdi_set_error_char(struct ucom_softc *, int);
205 static int	uftdi_ioctl(struct ucom_softc *, uint32_t, caddr_t, int,
206 		    struct thread *);
207 static void	uftdi_start_read(struct ucom_softc *);
208 static void	uftdi_stop_read(struct ucom_softc *);
209 static void	uftdi_start_write(struct ucom_softc *);
210 static void	uftdi_stop_write(struct ucom_softc *);
211 static void	uftdi_poll(struct ucom_softc *ucom);
212 
213 static const struct usb_config uftdi_config[UFTDI_N_TRANSFER] = {
214 
215 	[UFTDI_BULK_DT_WR] = {
216 		.type = UE_BULK,
217 		.endpoint = UE_ADDR_ANY,
218 		.direction = UE_DIR_OUT,
219 		.bufsize = UFTDI_OBUFSIZE,
220 		.flags = {.pipe_bof = 1,},
221 		.callback = &uftdi_write_callback,
222 	},
223 
224 	[UFTDI_BULK_DT_RD] = {
225 		.type = UE_BULK,
226 		.endpoint = UE_ADDR_ANY,
227 		.direction = UE_DIR_IN,
228 		.bufsize = UFTDI_IBUFSIZE,
229 		.flags = {.pipe_bof = 1,.short_xfer_ok = 1,},
230 		.callback = &uftdi_read_callback,
231 	},
232 };
233 
234 static const struct ucom_callback uftdi_callback = {
235 	.ucom_cfg_get_status = &uftdi_cfg_get_status,
236 	.ucom_cfg_set_dtr = &uftdi_cfg_set_dtr,
237 	.ucom_cfg_set_rts = &uftdi_cfg_set_rts,
238 	.ucom_cfg_set_break = &uftdi_cfg_set_break,
239 	.ucom_cfg_param = &uftdi_cfg_param,
240 	.ucom_cfg_open = &uftdi_cfg_open,
241 	.ucom_cfg_close = &uftdi_cfg_close,
242 	.ucom_pre_param = &uftdi_pre_param,
243 	.ucom_ioctl = &uftdi_ioctl,
244 	.ucom_start_read = &uftdi_start_read,
245 	.ucom_stop_read = &uftdi_stop_read,
246 	.ucom_start_write = &uftdi_start_write,
247 	.ucom_stop_write = &uftdi_stop_write,
248 	.ucom_poll = &uftdi_poll,
249 	.ucom_free = &uftdi_free,
250 };
251 
252 static device_method_t uftdi_methods[] = {
253 	/* Device interface */
254 	DEVMETHOD(device_probe, uftdi_probe),
255 	DEVMETHOD(device_attach, uftdi_attach),
256 	DEVMETHOD(device_detach, uftdi_detach),
257 	DEVMETHOD_END
258 };
259 
260 static devclass_t uftdi_devclass;
261 
262 static driver_t uftdi_driver = {
263 	.name = "uftdi",
264 	.methods = uftdi_methods,
265 	.size = sizeof(struct uftdi_softc),
266 };
267 
268 DRIVER_MODULE(uftdi, uhub, uftdi_driver, uftdi_devclass, NULL, NULL);
269 MODULE_DEPEND(uftdi, ucom, 1, 1, 1);
270 MODULE_DEPEND(uftdi, usb, 1, 1, 1);
271 MODULE_VERSION(uftdi, 1);
272 
273 static const STRUCT_USB_HOST_ID uftdi_devs[] = {
274 #define	UFTDI_DEV(v, p, i) \
275   { USB_VPI(USB_VENDOR_##v, USB_PRODUCT_##v##_##p, i) }
276 	UFTDI_DEV(ACTON, SPECTRAPRO, UFTDI_TYPE_AUTO),
277 	UFTDI_DEV(ALTI2, N3, UFTDI_TYPE_AUTO),
278 	UFTDI_DEV(ANALOGDEVICES, GNICE, UFTDI_TYPE_AUTO | UFTDI_FLAG_JTAG),
279 	UFTDI_DEV(ANALOGDEVICES, GNICEPLUS, UFTDI_TYPE_AUTO | UFTDI_FLAG_JTAG),
280 	UFTDI_DEV(ATMEL, STK541, UFTDI_TYPE_8U232AM),
281 	UFTDI_DEV(BAYER, CONTOUR_CABLE, UFTDI_TYPE_AUTO),
282 	UFTDI_DEV(BBELECTRONICS, 232USB9M, UFTDI_TYPE_AUTO),
283 	UFTDI_DEV(BBELECTRONICS, 485USB9F_2W, UFTDI_TYPE_AUTO),
284 	UFTDI_DEV(BBELECTRONICS, 485USB9F_4W, UFTDI_TYPE_AUTO),
285 	UFTDI_DEV(BBELECTRONICS, 485USBTB_2W, UFTDI_TYPE_AUTO),
286 	UFTDI_DEV(BBELECTRONICS, 485USBTB_4W, UFTDI_TYPE_AUTO),
287 	UFTDI_DEV(BBELECTRONICS, TTL3USB9M, UFTDI_TYPE_AUTO),
288 	UFTDI_DEV(BBELECTRONICS, TTL5USB9M, UFTDI_TYPE_AUTO),
289 	UFTDI_DEV(BBELECTRONICS, USO9ML2, UFTDI_TYPE_AUTO),
290 	UFTDI_DEV(BBELECTRONICS, USO9ML2DR, UFTDI_TYPE_AUTO),
291 	UFTDI_DEV(BBELECTRONICS, USO9ML2DR_2, UFTDI_TYPE_AUTO),
292 	UFTDI_DEV(BBELECTRONICS, USOPTL4, UFTDI_TYPE_AUTO),
293 	UFTDI_DEV(BBELECTRONICS, USOPTL4DR, UFTDI_TYPE_AUTO),
294 	UFTDI_DEV(BBELECTRONICS, USOPTL4DR2, UFTDI_TYPE_AUTO),
295 	UFTDI_DEV(BBELECTRONICS, USOTL4, UFTDI_TYPE_8U232AM),
296 	UFTDI_DEV(BBELECTRONICS, USPTL4, UFTDI_TYPE_AUTO),
297 	UFTDI_DEV(BBELECTRONICS, USTL4, UFTDI_TYPE_AUTO),
298 	UFTDI_DEV(BBELECTRONICS, ZZ_PROG1_USB, UFTDI_TYPE_AUTO),
299 	UFTDI_DEV(CONTEC, COM1USBH, UFTDI_TYPE_AUTO),
300 	UFTDI_DEV(DRESDENELEKTRONIK, SENSORTERMINALBOARD, UFTDI_TYPE_8U232AM),
301 	UFTDI_DEV(DRESDENELEKTRONIK, WIRELESSHANDHELDTERMINAL, UFTDI_TYPE_8U232AM),
302 	UFTDI_DEV(DRESDENELEKTRONIK, LEVELSHIFTERSTICKLOWCOST, UFTDI_TYPE_8U232AM),
303 	UFTDI_DEV(ELEKTOR, FT323R, UFTDI_TYPE_AUTO),
304 	UFTDI_DEV(EVOLUTION, ER1, UFTDI_TYPE_AUTO),
305 	UFTDI_DEV(EVOLUTION, HYBRID, UFTDI_TYPE_AUTO),
306 	UFTDI_DEV(EVOLUTION, RCM4, UFTDI_TYPE_AUTO),
307 	UFTDI_DEV(FALCOM, SAMBA, UFTDI_TYPE_AUTO),
308 	UFTDI_DEV(FALCOM, TWIST, UFTDI_TYPE_8U232AM),
309 	UFTDI_DEV(FIC, NEO1973_DEBUG, UFTDI_TYPE_AUTO | UFTDI_FLAG_JTAG),
310 	UFTDI_DEV(FIC, NEO1973_DEBUG, UFTDI_TYPE_AUTO | UFTDI_FLAG_JTAG),
311 	UFTDI_DEV(FTDI, 232EX, UFTDI_TYPE_AUTO),
312 	UFTDI_DEV(FTDI, 232H, UFTDI_TYPE_AUTO),
313 	UFTDI_DEV(FTDI, 232RL, UFTDI_TYPE_AUTO),
314 	UFTDI_DEV(FTDI, 4N_GALAXY_DE_1, UFTDI_TYPE_AUTO),
315 	UFTDI_DEV(FTDI, 4N_GALAXY_DE_2, UFTDI_TYPE_AUTO),
316 	UFTDI_DEV(FTDI, 4N_GALAXY_DE_3, UFTDI_TYPE_AUTO),
317 	UFTDI_DEV(FTDI, 8U232AM_ALT, UFTDI_TYPE_AUTO),
318 	UFTDI_DEV(FTDI, ACCESSO, UFTDI_TYPE_AUTO),
319 	UFTDI_DEV(FTDI, ACG_HFDUAL, UFTDI_TYPE_AUTO),
320 	UFTDI_DEV(FTDI, ACTIVE_ROBOTS, UFTDI_TYPE_AUTO),
321 	UFTDI_DEV(FTDI, ACTZWAVE, UFTDI_TYPE_AUTO),
322 	UFTDI_DEV(FTDI, AMC232, UFTDI_TYPE_AUTO),
323 	UFTDI_DEV(FTDI, ARTEMIS, UFTDI_TYPE_AUTO),
324 	UFTDI_DEV(FTDI, ASK_RDR400, UFTDI_TYPE_AUTO),
325 	UFTDI_DEV(FTDI, ATIK_ATK16, UFTDI_TYPE_AUTO),
326 	UFTDI_DEV(FTDI, ATIK_ATK16C, UFTDI_TYPE_AUTO),
327 	UFTDI_DEV(FTDI, ATIK_ATK16HR, UFTDI_TYPE_AUTO),
328 	UFTDI_DEV(FTDI, ATIK_ATK16HRC, UFTDI_TYPE_AUTO),
329 	UFTDI_DEV(FTDI, ATIK_ATK16IC, UFTDI_TYPE_AUTO),
330 	UFTDI_DEV(FTDI, BCS_SE923, UFTDI_TYPE_AUTO),
331 	UFTDI_DEV(FTDI, BEAGLEBONE, UFTDI_TYPE_8U232AM),
332 	UFTDI_DEV(FTDI, CANDAPTER, UFTDI_TYPE_AUTO),
333 	UFTDI_DEV(FTDI, CANUSB, UFTDI_TYPE_AUTO),
334 	UFTDI_DEV(FTDI, CCSICDU20_0, UFTDI_TYPE_AUTO),
335 	UFTDI_DEV(FTDI, CCSICDU40_1, UFTDI_TYPE_AUTO),
336 	UFTDI_DEV(FTDI, CCSICDU64_4, UFTDI_TYPE_AUTO),
337 	UFTDI_DEV(FTDI, CCSLOAD_N_GO_3, UFTDI_TYPE_AUTO),
338 	UFTDI_DEV(FTDI, CCSMACHX_2, UFTDI_TYPE_AUTO),
339 	UFTDI_DEV(FTDI, CCSPRIME8_5, UFTDI_TYPE_AUTO),
340 	UFTDI_DEV(FTDI, CFA_631, UFTDI_TYPE_8U232AM),
341 	UFTDI_DEV(FTDI, CFA_632, UFTDI_TYPE_8U232AM),
342 	UFTDI_DEV(FTDI, CFA_633, UFTDI_TYPE_8U232AM),
343 	UFTDI_DEV(FTDI, CFA_634, UFTDI_TYPE_8U232AM),
344 	UFTDI_DEV(FTDI, CFA_635, UFTDI_TYPE_8U232AM),
345 	UFTDI_DEV(FTDI, CHAMSYS_24_MASTER_WING, UFTDI_TYPE_AUTO),
346 	UFTDI_DEV(FTDI, CHAMSYS_MAXI_WING, UFTDI_TYPE_AUTO),
347 	UFTDI_DEV(FTDI, CHAMSYS_MEDIA_WING, UFTDI_TYPE_AUTO),
348 	UFTDI_DEV(FTDI, CHAMSYS_MIDI_TIMECODE, UFTDI_TYPE_AUTO),
349 	UFTDI_DEV(FTDI, CHAMSYS_MINI_WING, UFTDI_TYPE_AUTO),
350 	UFTDI_DEV(FTDI, CHAMSYS_PC_WING, UFTDI_TYPE_AUTO),
351 	UFTDI_DEV(FTDI, CHAMSYS_USB_DMX, UFTDI_TYPE_AUTO),
352 	UFTDI_DEV(FTDI, CHAMSYS_WING, UFTDI_TYPE_AUTO),
353 	UFTDI_DEV(FTDI, COM4SM, UFTDI_TYPE_AUTO),
354 	UFTDI_DEV(FTDI, CONVERTER_0, UFTDI_TYPE_AUTO),
355 	UFTDI_DEV(FTDI, CONVERTER_1, UFTDI_TYPE_AUTO),
356 	UFTDI_DEV(FTDI, CONVERTER_2, UFTDI_TYPE_AUTO),
357 	UFTDI_DEV(FTDI, CONVERTER_3, UFTDI_TYPE_AUTO),
358 	UFTDI_DEV(FTDI, CONVERTER_4, UFTDI_TYPE_AUTO),
359 	UFTDI_DEV(FTDI, CONVERTER_5, UFTDI_TYPE_AUTO),
360 	UFTDI_DEV(FTDI, CONVERTER_6, UFTDI_TYPE_AUTO),
361 	UFTDI_DEV(FTDI, CONVERTER_7, UFTDI_TYPE_AUTO),
362 	UFTDI_DEV(FTDI, CTI_USB_MINI_485, UFTDI_TYPE_8U232AM),
363 	UFTDI_DEV(FTDI, CTI_USB_NANO_485, UFTDI_TYPE_8U232AM),
364 	UFTDI_DEV(FTDI, DMX4ALL, UFTDI_TYPE_AUTO),
365 	UFTDI_DEV(FTDI, DOMINTELL_DGQG, UFTDI_TYPE_AUTO),
366 	UFTDI_DEV(FTDI, DOMINTELL_DUSB, UFTDI_TYPE_AUTO),
367 	UFTDI_DEV(FTDI, DOTEC, UFTDI_TYPE_AUTO),
368 	UFTDI_DEV(FTDI, ECLO_COM_1WIRE, UFTDI_TYPE_AUTO),
369 	UFTDI_DEV(FTDI, ECO_PRO_CDS, UFTDI_TYPE_AUTO),
370 	UFTDI_DEV(FTDI, EISCOU, UFTDI_TYPE_8U232AM),
371 	UFTDI_DEV(FTDI, ELSTER_UNICOM, UFTDI_TYPE_AUTO),
372 	UFTDI_DEV(FTDI, ELV_ALC8500, UFTDI_TYPE_AUTO),
373 	UFTDI_DEV(FTDI, ELV_CLI7000, UFTDI_TYPE_AUTO),
374 	UFTDI_DEV(FTDI, ELV_CSI8, UFTDI_TYPE_AUTO),
375 	UFTDI_DEV(FTDI, ELV_EC3000, UFTDI_TYPE_AUTO),
376 	UFTDI_DEV(FTDI, ELV_EM1000DL, UFTDI_TYPE_AUTO),
377 	UFTDI_DEV(FTDI, ELV_EM1010PC, UFTDI_TYPE_AUTO),
378 	UFTDI_DEV(FTDI, ELV_FEM, UFTDI_TYPE_AUTO),
379 	UFTDI_DEV(FTDI, ELV_FHZ1000PC, UFTDI_TYPE_AUTO),
380 	UFTDI_DEV(FTDI, ELV_FHZ1300PC, UFTDI_TYPE_AUTO),
381 	UFTDI_DEV(FTDI, ELV_FM3RX, UFTDI_TYPE_AUTO),
382 	UFTDI_DEV(FTDI, ELV_FS20SIG, UFTDI_TYPE_AUTO),
383 	UFTDI_DEV(FTDI, ELV_HS485, UFTDI_TYPE_AUTO),
384 	UFTDI_DEV(FTDI, ELV_KL100, UFTDI_TYPE_AUTO),
385 	UFTDI_DEV(FTDI, ELV_MSM1, UFTDI_TYPE_AUTO),
386 	UFTDI_DEV(FTDI, ELV_PCD200, UFTDI_TYPE_AUTO),
387 	UFTDI_DEV(FTDI, ELV_PCK100, UFTDI_TYPE_AUTO),
388 	UFTDI_DEV(FTDI, ELV_PPS7330, UFTDI_TYPE_AUTO),
389 	UFTDI_DEV(FTDI, ELV_RFP500, UFTDI_TYPE_AUTO),
390 	UFTDI_DEV(FTDI, ELV_T1100, UFTDI_TYPE_AUTO),
391 	UFTDI_DEV(FTDI, ELV_TFD128, UFTDI_TYPE_AUTO),
392 	UFTDI_DEV(FTDI, ELV_TFM100, UFTDI_TYPE_AUTO),
393 	UFTDI_DEV(FTDI, ELV_TWS550, UFTDI_TYPE_AUTO),
394 	UFTDI_DEV(FTDI, ELV_UAD8, UFTDI_TYPE_AUTO),
395 	UFTDI_DEV(FTDI, ELV_UDA7, UFTDI_TYPE_AUTO),
396 	UFTDI_DEV(FTDI, ELV_UDF77, UFTDI_TYPE_AUTO),
397 	UFTDI_DEV(FTDI, ELV_UIO88, UFTDI_TYPE_AUTO),
398 	UFTDI_DEV(FTDI, ELV_ULA200, UFTDI_TYPE_AUTO),
399 	UFTDI_DEV(FTDI, ELV_UM100, UFTDI_TYPE_AUTO),
400 	UFTDI_DEV(FTDI, ELV_UMS100, UFTDI_TYPE_AUTO),
401 	UFTDI_DEV(FTDI, ELV_UO100, UFTDI_TYPE_AUTO),
402 	UFTDI_DEV(FTDI, ELV_UR100, UFTDI_TYPE_AUTO),
403 	UFTDI_DEV(FTDI, ELV_USI2, UFTDI_TYPE_AUTO),
404 	UFTDI_DEV(FTDI, ELV_USR, UFTDI_TYPE_AUTO),
405 	UFTDI_DEV(FTDI, ELV_UTP8, UFTDI_TYPE_AUTO),
406 	UFTDI_DEV(FTDI, ELV_WS300PC, UFTDI_TYPE_AUTO),
407 	UFTDI_DEV(FTDI, ELV_WS444PC, UFTDI_TYPE_AUTO),
408 	UFTDI_DEV(FTDI, ELV_WS500, UFTDI_TYPE_AUTO),
409 	UFTDI_DEV(FTDI, ELV_WS550, UFTDI_TYPE_AUTO),
410 	UFTDI_DEV(FTDI, ELV_WS777, UFTDI_TYPE_AUTO),
411 	UFTDI_DEV(FTDI, ELV_WS888, UFTDI_TYPE_AUTO),
412 	UFTDI_DEV(FTDI, EMCU2D, UFTDI_TYPE_8U232AM),
413 	UFTDI_DEV(FTDI, EMCU2H, UFTDI_TYPE_8U232AM),
414 	UFTDI_DEV(FTDI, FUTURE_0, UFTDI_TYPE_AUTO),
415 	UFTDI_DEV(FTDI, FUTURE_1, UFTDI_TYPE_AUTO),
416 	UFTDI_DEV(FTDI, FUTURE_2, UFTDI_TYPE_AUTO),
417 	UFTDI_DEV(FTDI, GAMMASCOUT, UFTDI_TYPE_8U232AM),
418 	UFTDI_DEV(FTDI, GENERIC, UFTDI_TYPE_AUTO),
419 	UFTDI_DEV(FTDI, GUDEADS_E808, UFTDI_TYPE_AUTO),
420 	UFTDI_DEV(FTDI, GUDEADS_E809, UFTDI_TYPE_AUTO),
421 	UFTDI_DEV(FTDI, GUDEADS_E80A, UFTDI_TYPE_AUTO),
422 	UFTDI_DEV(FTDI, GUDEADS_E80B, UFTDI_TYPE_AUTO),
423 	UFTDI_DEV(FTDI, GUDEADS_E80C, UFTDI_TYPE_AUTO),
424 	UFTDI_DEV(FTDI, GUDEADS_E80D, UFTDI_TYPE_AUTO),
425 	UFTDI_DEV(FTDI, GUDEADS_E80E, UFTDI_TYPE_AUTO),
426 	UFTDI_DEV(FTDI, GUDEADS_E80F, UFTDI_TYPE_AUTO),
427 	UFTDI_DEV(FTDI, GUDEADS_E88D, UFTDI_TYPE_AUTO),
428 	UFTDI_DEV(FTDI, GUDEADS_E88E, UFTDI_TYPE_AUTO),
429 	UFTDI_DEV(FTDI, GUDEADS_E88F, UFTDI_TYPE_AUTO),
430 	UFTDI_DEV(FTDI, HD_RADIO, UFTDI_TYPE_AUTO),
431 	UFTDI_DEV(FTDI, HO720, UFTDI_TYPE_AUTO),
432 	UFTDI_DEV(FTDI, HO730, UFTDI_TYPE_AUTO),
433 	UFTDI_DEV(FTDI, HO820, UFTDI_TYPE_AUTO),
434 	UFTDI_DEV(FTDI, HO870, UFTDI_TYPE_AUTO),
435 	UFTDI_DEV(FTDI, IBS_APP70, UFTDI_TYPE_AUTO),
436 	UFTDI_DEV(FTDI, IBS_PCMCIA, UFTDI_TYPE_AUTO),
437 	UFTDI_DEV(FTDI, IBS_PEDO, UFTDI_TYPE_AUTO),
438 	UFTDI_DEV(FTDI, IBS_PICPRO, UFTDI_TYPE_AUTO),
439 	UFTDI_DEV(FTDI, IBS_PK1, UFTDI_TYPE_AUTO),
440 	UFTDI_DEV(FTDI, IBS_PROD, UFTDI_TYPE_AUTO),
441 	UFTDI_DEV(FTDI, IBS_RS232MON, UFTDI_TYPE_AUTO),
442 	UFTDI_DEV(FTDI, IBS_US485, UFTDI_TYPE_AUTO),
443 	UFTDI_DEV(FTDI, IPLUS, UFTDI_TYPE_AUTO),
444 	UFTDI_DEV(FTDI, IPLUS2, UFTDI_TYPE_AUTO),
445 	UFTDI_DEV(FTDI, IRTRANS, UFTDI_TYPE_AUTO),
446 	UFTDI_DEV(FTDI, KBS, UFTDI_TYPE_8U232AM),
447 	UFTDI_DEV(FTDI, KTLINK, UFTDI_TYPE_8U232AM),
448 	UFTDI_DEV(FTDI, LENZ_LIUSB, UFTDI_TYPE_AUTO),
449 	UFTDI_DEV(FTDI, LK202, UFTDI_TYPE_8U232AM),
450 	UFTDI_DEV(FTDI, LK204, UFTDI_TYPE_8U232AM),
451 	UFTDI_DEV(FTDI, LM3S_DEVEL_BOARD, UFTDI_TYPE_AUTO | UFTDI_FLAG_JTAG),
452 	UFTDI_DEV(FTDI, LM3S_EVAL_BOARD, UFTDI_TYPE_AUTO | UFTDI_FLAG_JTAG),
453 	UFTDI_DEV(FTDI, LM3S_ICDI_B_BOARD, UFTDI_TYPE_AUTO | UFTDI_FLAG_JTAG),
454 	UFTDI_DEV(FTDI, MASTERDEVEL2, UFTDI_TYPE_AUTO),
455 	UFTDI_DEV(FTDI, MAXSTREAM, UFTDI_TYPE_8U232AM),
456 	UFTDI_DEV(FTDI, MHAM_DB9, UFTDI_TYPE_AUTO),
457 	UFTDI_DEV(FTDI, MHAM_IC, UFTDI_TYPE_AUTO),
458 	UFTDI_DEV(FTDI, MHAM_KW, UFTDI_TYPE_AUTO),
459 	UFTDI_DEV(FTDI, MHAM_RS232, UFTDI_TYPE_AUTO),
460 	UFTDI_DEV(FTDI, MHAM_Y6, UFTDI_TYPE_AUTO),
461 	UFTDI_DEV(FTDI, MHAM_Y8, UFTDI_TYPE_AUTO),
462 	UFTDI_DEV(FTDI, MHAM_Y9, UFTDI_TYPE_AUTO),
463 	UFTDI_DEV(FTDI, MHAM_YS, UFTDI_TYPE_AUTO),
464 	UFTDI_DEV(FTDI, MICRO_CHAMELEON, UFTDI_TYPE_AUTO),
465 	UFTDI_DEV(FTDI, MTXORB_5, UFTDI_TYPE_AUTO),
466 	UFTDI_DEV(FTDI, MTXORB_6, UFTDI_TYPE_AUTO),
467 	UFTDI_DEV(FTDI, MX2_3, UFTDI_TYPE_8U232AM),
468 	UFTDI_DEV(FTDI, MX4_5, UFTDI_TYPE_8U232AM),
469 	UFTDI_DEV(FTDI, NXTCAM, UFTDI_TYPE_AUTO),
470 	UFTDI_DEV(FTDI, OCEANIC, UFTDI_TYPE_AUTO),
471 	UFTDI_DEV(FTDI, OOCDLINK, UFTDI_TYPE_AUTO | UFTDI_FLAG_JTAG),
472 	UFTDI_DEV(FTDI, OPENDCC, UFTDI_TYPE_AUTO),
473 	UFTDI_DEV(FTDI, OPENDCC_GATEWAY, UFTDI_TYPE_AUTO),
474 	UFTDI_DEV(FTDI, OPENDCC_GBM, UFTDI_TYPE_AUTO),
475 	UFTDI_DEV(FTDI, OPENDCC_SNIFFER, UFTDI_TYPE_AUTO),
476 	UFTDI_DEV(FTDI, OPENDCC_THROTTLE, UFTDI_TYPE_AUTO),
477 	UFTDI_DEV(FTDI, PCDJ_DAC2, UFTDI_TYPE_AUTO),
478 	UFTDI_DEV(FTDI, PCMSFU, UFTDI_TYPE_8U232AM),
479 	UFTDI_DEV(FTDI, PERLE_ULTRAPORT, UFTDI_TYPE_AUTO),
480 	UFTDI_DEV(FTDI, PHI_FISCO, UFTDI_TYPE_AUTO),
481 	UFTDI_DEV(FTDI, PIEGROUP, UFTDI_TYPE_AUTO),
482 	UFTDI_DEV(FTDI, PROPOX_JTAGCABLEII, UFTDI_TYPE_AUTO),
483 	UFTDI_DEV(FTDI, R2000KU_TRUE_RNG, UFTDI_TYPE_AUTO),
484 	UFTDI_DEV(FTDI, R2X0, UFTDI_TYPE_AUTO),
485 	UFTDI_DEV(FTDI, RELAIS, UFTDI_TYPE_AUTO),
486 	UFTDI_DEV(FTDI, REU_TINY, UFTDI_TYPE_AUTO),
487 	UFTDI_DEV(FTDI, RMP200, UFTDI_TYPE_AUTO),
488 	UFTDI_DEV(FTDI, RM_CANVIEW, UFTDI_TYPE_AUTO),
489 	UFTDI_DEV(FTDI, RRCIRKITS_LOCOBUFFER, UFTDI_TYPE_AUTO),
490 	UFTDI_DEV(FTDI, SCIENCESCOPE_HS_LOGBOOK, UFTDI_TYPE_AUTO),
491 	UFTDI_DEV(FTDI, SCIENCESCOPE_LOGBOOKML, UFTDI_TYPE_AUTO),
492 	UFTDI_DEV(FTDI, SCIENCESCOPE_LS_LOGBOOK, UFTDI_TYPE_AUTO),
493 	UFTDI_DEV(FTDI, SCS_DEVICE_0, UFTDI_TYPE_AUTO),
494 	UFTDI_DEV(FTDI, SCS_DEVICE_1, UFTDI_TYPE_AUTO),
495 	UFTDI_DEV(FTDI, SCS_DEVICE_2, UFTDI_TYPE_AUTO),
496 	UFTDI_DEV(FTDI, SCS_DEVICE_3, UFTDI_TYPE_AUTO),
497 	UFTDI_DEV(FTDI, SCS_DEVICE_4, UFTDI_TYPE_AUTO),
498 	UFTDI_DEV(FTDI, SCS_DEVICE_5, UFTDI_TYPE_AUTO),
499 	UFTDI_DEV(FTDI, SCS_DEVICE_6, UFTDI_TYPE_AUTO),
500 	UFTDI_DEV(FTDI, SCS_DEVICE_7, UFTDI_TYPE_AUTO),
501 	UFTDI_DEV(FTDI, SDMUSBQSS, UFTDI_TYPE_AUTO),
502 	UFTDI_DEV(FTDI, SEMC_DSS20, UFTDI_TYPE_8U232AM),
503 	UFTDI_DEV(FTDI, SERIAL_2232C, UFTDI_TYPE_8U232AM),
504 	UFTDI_DEV(FTDI, SERIAL_2232D, UFTDI_TYPE_8U232AM),
505 	UFTDI_DEV(FTDI, SERIAL_232RL, UFTDI_TYPE_AUTO),
506 	UFTDI_DEV(FTDI, SERIAL_4232H, UFTDI_TYPE_8U232AM),
507 	UFTDI_DEV(FTDI, SERIAL_8U100AX, UFTDI_TYPE_SIO),
508 	UFTDI_DEV(FTDI, SERIAL_8U232AM, UFTDI_TYPE_8U232AM),
509 	UFTDI_DEV(FTDI, SERIAL_8U232AM4, UFTDI_TYPE_8U232AM),
510 	UFTDI_DEV(FTDI, SIGNALYZER_SH2, UFTDI_TYPE_AUTO | UFTDI_FLAG_JTAG),
511 	UFTDI_DEV(FTDI, SIGNALYZER_SH4, UFTDI_TYPE_AUTO | UFTDI_FLAG_JTAG),
512 	UFTDI_DEV(FTDI, SIGNALYZER_SLITE, UFTDI_TYPE_AUTO | UFTDI_FLAG_JTAG),
513 	UFTDI_DEV(FTDI, SIGNALYZER_ST, UFTDI_TYPE_AUTO | UFTDI_FLAG_JTAG),
514 	UFTDI_DEV(FTDI, SPECIAL_1, UFTDI_TYPE_AUTO),
515 	UFTDI_DEV(FTDI, SPECIAL_3, UFTDI_TYPE_AUTO),
516 	UFTDI_DEV(FTDI, SPECIAL_4, UFTDI_TYPE_AUTO),
517 	UFTDI_DEV(FTDI, SPROG_II, UFTDI_TYPE_AUTO),
518 	UFTDI_DEV(FTDI, SR_RADIO, UFTDI_TYPE_AUTO),
519 	UFTDI_DEV(FTDI, SUUNTO_SPORTS, UFTDI_TYPE_AUTO),
520 	UFTDI_DEV(FTDI, TACTRIX_OPENPORT_13M, UFTDI_TYPE_8U232AM),
521 	UFTDI_DEV(FTDI, TACTRIX_OPENPORT_13S, UFTDI_TYPE_8U232AM),
522 	UFTDI_DEV(FTDI, TACTRIX_OPENPORT_13U, UFTDI_TYPE_8U232AM),
523 	UFTDI_DEV(FTDI, TAVIR_STK500, UFTDI_TYPE_AUTO),
524 	UFTDI_DEV(FTDI, TERATRONIK_D2XX, UFTDI_TYPE_AUTO),
525 	UFTDI_DEV(FTDI, TERATRONIK_VCP, UFTDI_TYPE_AUTO),
526 	UFTDI_DEV(FTDI, THORLABS, UFTDI_TYPE_AUTO),
527 	UFTDI_DEV(FTDI, TNC_X, UFTDI_TYPE_AUTO),
528 	UFTDI_DEV(FTDI, TTUSB, UFTDI_TYPE_AUTO),
529 	UFTDI_DEV(FTDI, TURTELIZER2, UFTDI_TYPE_8U232AM | UFTDI_FLAG_JTAG),
530 	UFTDI_DEV(FTDI, UOPTBR, UFTDI_TYPE_8U232AM),
531 	UFTDI_DEV(FTDI, USBSERIAL, UFTDI_TYPE_8U232AM),
532 	UFTDI_DEV(FTDI, USBX_707, UFTDI_TYPE_AUTO),
533 	UFTDI_DEV(FTDI, USB_UIRT, UFTDI_TYPE_8U232AM),
534 	UFTDI_DEV(FTDI, USINT_CAT, UFTDI_TYPE_AUTO),
535 	UFTDI_DEV(FTDI, USINT_RS232, UFTDI_TYPE_AUTO),
536 	UFTDI_DEV(FTDI, USINT_WKEY, UFTDI_TYPE_AUTO),
537 	UFTDI_DEV(FTDI, VARDAAN, UFTDI_TYPE_AUTO),
538 	UFTDI_DEV(FTDI, VNHCPCUSB_D, UFTDI_TYPE_AUTO),
539 	UFTDI_DEV(FTDI, WESTREX_MODEL_777, UFTDI_TYPE_AUTO),
540 	UFTDI_DEV(FTDI, WESTREX_MODEL_8900F, UFTDI_TYPE_AUTO),
541 	UFTDI_DEV(FTDI, XF_547, UFTDI_TYPE_AUTO),
542 	UFTDI_DEV(FTDI, XF_640, UFTDI_TYPE_AUTO),
543 	UFTDI_DEV(FTDI, XF_642, UFTDI_TYPE_AUTO),
544 	UFTDI_DEV(FTDI, XM_RADIO, UFTDI_TYPE_AUTO),
545 	UFTDI_DEV(FTDI, YEI_SERVOCENTER31, UFTDI_TYPE_AUTO),
546 	UFTDI_DEV(GNOTOMETRICS, USB, UFTDI_TYPE_AUTO),
547 	UFTDI_DEV(ICOM, SP1, UFTDI_TYPE_AUTO),
548 	UFTDI_DEV(ICOM, OPC_U_UC, UFTDI_TYPE_AUTO),
549 	UFTDI_DEV(ICOM, RP2C1, UFTDI_TYPE_AUTO),
550 	UFTDI_DEV(ICOM, RP2C2, UFTDI_TYPE_AUTO),
551 	UFTDI_DEV(ICOM, RP2D, UFTDI_TYPE_AUTO),
552 	UFTDI_DEV(ICOM, RP2KVR, UFTDI_TYPE_AUTO),
553 	UFTDI_DEV(ICOM, RP2KVT, UFTDI_TYPE_AUTO),
554 	UFTDI_DEV(ICOM, RP2VR, UFTDI_TYPE_AUTO),
555 	UFTDI_DEV(ICOM, RP2VT, UFTDI_TYPE_AUTO),
556 	UFTDI_DEV(ICOM, RP4KVR, UFTDI_TYPE_AUTO),
557 	UFTDI_DEV(ICOM, RP4KVT, UFTDI_TYPE_AUTO),
558 	UFTDI_DEV(IDTECH, IDT1221U, UFTDI_TYPE_AUTO),
559 	UFTDI_DEV(INTERBIOMETRICS, IOBOARD, UFTDI_TYPE_AUTO),
560 	UFTDI_DEV(INTERBIOMETRICS, MINI_IOBOARD, UFTDI_TYPE_AUTO),
561 	UFTDI_DEV(INTREPIDCS, NEOVI, UFTDI_TYPE_8U232AM),
562 	UFTDI_DEV(INTREPIDCS, VALUECAN, UFTDI_TYPE_8U232AM),
563 	UFTDI_DEV(IONICS, PLUGCOMPUTER, UFTDI_TYPE_AUTO | UFTDI_FLAG_JTAG),
564 	UFTDI_DEV(JETI, SPC1201, UFTDI_TYPE_AUTO),
565 	UFTDI_DEV(KOBIL, CONV_B1, UFTDI_TYPE_AUTO),
566 	UFTDI_DEV(KOBIL, CONV_KAAN, UFTDI_TYPE_AUTO),
567 	UFTDI_DEV(LARSENBRUSGAARD, ALTITRACK, UFTDI_TYPE_AUTO),
568 	UFTDI_DEV(MARVELL, SHEEVAPLUG, UFTDI_TYPE_8U232AM),
569 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0100, UFTDI_TYPE_AUTO),
570 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0101, UFTDI_TYPE_AUTO),
571 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0102, UFTDI_TYPE_AUTO),
572 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0103, UFTDI_TYPE_AUTO),
573 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0104, UFTDI_TYPE_AUTO),
574 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0105, UFTDI_TYPE_AUTO),
575 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0106, UFTDI_TYPE_AUTO),
576 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0107, UFTDI_TYPE_AUTO),
577 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0108, UFTDI_TYPE_AUTO),
578 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0109, UFTDI_TYPE_AUTO),
579 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_010A, UFTDI_TYPE_AUTO),
580 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_010B, UFTDI_TYPE_AUTO),
581 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_010C, UFTDI_TYPE_AUTO),
582 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_010D, UFTDI_TYPE_AUTO),
583 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_010E, UFTDI_TYPE_AUTO),
584 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_010F, UFTDI_TYPE_AUTO),
585 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0110, UFTDI_TYPE_AUTO),
586 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0111, UFTDI_TYPE_AUTO),
587 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0112, UFTDI_TYPE_AUTO),
588 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0113, UFTDI_TYPE_AUTO),
589 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0114, UFTDI_TYPE_AUTO),
590 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0115, UFTDI_TYPE_AUTO),
591 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0116, UFTDI_TYPE_AUTO),
592 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0117, UFTDI_TYPE_AUTO),
593 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0118, UFTDI_TYPE_AUTO),
594 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0119, UFTDI_TYPE_AUTO),
595 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_011A, UFTDI_TYPE_AUTO),
596 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_011B, UFTDI_TYPE_AUTO),
597 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_011C, UFTDI_TYPE_AUTO),
598 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_011D, UFTDI_TYPE_AUTO),
599 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_011E, UFTDI_TYPE_AUTO),
600 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_011F, UFTDI_TYPE_AUTO),
601 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0120, UFTDI_TYPE_AUTO),
602 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0121, UFTDI_TYPE_AUTO),
603 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0122, UFTDI_TYPE_AUTO),
604 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0123, UFTDI_TYPE_AUTO),
605 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0124, UFTDI_TYPE_AUTO),
606 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0125, UFTDI_TYPE_AUTO),
607 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0126, UFTDI_TYPE_AUTO),
608 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0128, UFTDI_TYPE_AUTO),
609 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0129, UFTDI_TYPE_AUTO),
610 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_012A, UFTDI_TYPE_AUTO),
611 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_012B, UFTDI_TYPE_AUTO),
612 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_012D, UFTDI_TYPE_AUTO),
613 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_012E, UFTDI_TYPE_AUTO),
614 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_012F, UFTDI_TYPE_AUTO),
615 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0130, UFTDI_TYPE_AUTO),
616 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0131, UFTDI_TYPE_AUTO),
617 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0132, UFTDI_TYPE_AUTO),
618 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0133, UFTDI_TYPE_AUTO),
619 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0134, UFTDI_TYPE_AUTO),
620 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0135, UFTDI_TYPE_AUTO),
621 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0136, UFTDI_TYPE_AUTO),
622 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0137, UFTDI_TYPE_AUTO),
623 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0138, UFTDI_TYPE_AUTO),
624 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0139, UFTDI_TYPE_AUTO),
625 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_013A, UFTDI_TYPE_AUTO),
626 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_013B, UFTDI_TYPE_AUTO),
627 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_013C, UFTDI_TYPE_AUTO),
628 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_013D, UFTDI_TYPE_AUTO),
629 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_013E, UFTDI_TYPE_AUTO),
630 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_013F, UFTDI_TYPE_AUTO),
631 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0140, UFTDI_TYPE_AUTO),
632 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0141, UFTDI_TYPE_AUTO),
633 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0142, UFTDI_TYPE_AUTO),
634 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0143, UFTDI_TYPE_AUTO),
635 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0144, UFTDI_TYPE_AUTO),
636 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0145, UFTDI_TYPE_AUTO),
637 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0146, UFTDI_TYPE_AUTO),
638 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0147, UFTDI_TYPE_AUTO),
639 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0148, UFTDI_TYPE_AUTO),
640 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0149, UFTDI_TYPE_AUTO),
641 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_014A, UFTDI_TYPE_AUTO),
642 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_014B, UFTDI_TYPE_AUTO),
643 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_014C, UFTDI_TYPE_AUTO),
644 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_014D, UFTDI_TYPE_AUTO),
645 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_014E, UFTDI_TYPE_AUTO),
646 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_014F, UFTDI_TYPE_AUTO),
647 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0150, UFTDI_TYPE_AUTO),
648 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0151, UFTDI_TYPE_AUTO),
649 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0152, UFTDI_TYPE_AUTO),
650 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0159, UFTDI_TYPE_AUTO),
651 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_015A, UFTDI_TYPE_AUTO),
652 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_015B, UFTDI_TYPE_AUTO),
653 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_015C, UFTDI_TYPE_AUTO),
654 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_015D, UFTDI_TYPE_AUTO),
655 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_015E, UFTDI_TYPE_AUTO),
656 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_015F, UFTDI_TYPE_AUTO),
657 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0160, UFTDI_TYPE_AUTO),
658 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0161, UFTDI_TYPE_AUTO),
659 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0162, UFTDI_TYPE_AUTO),
660 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0163, UFTDI_TYPE_AUTO),
661 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0164, UFTDI_TYPE_AUTO),
662 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0165, UFTDI_TYPE_AUTO),
663 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0166, UFTDI_TYPE_AUTO),
664 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0167, UFTDI_TYPE_AUTO),
665 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0168, UFTDI_TYPE_AUTO),
666 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0169, UFTDI_TYPE_AUTO),
667 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_016A, UFTDI_TYPE_AUTO),
668 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_016B, UFTDI_TYPE_AUTO),
669 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_016C, UFTDI_TYPE_AUTO),
670 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_016D, UFTDI_TYPE_AUTO),
671 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_016E, UFTDI_TYPE_AUTO),
672 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_016F, UFTDI_TYPE_AUTO),
673 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0170, UFTDI_TYPE_AUTO),
674 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0171, UFTDI_TYPE_AUTO),
675 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0172, UFTDI_TYPE_AUTO),
676 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0173, UFTDI_TYPE_AUTO),
677 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0174, UFTDI_TYPE_AUTO),
678 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0175, UFTDI_TYPE_AUTO),
679 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0176, UFTDI_TYPE_AUTO),
680 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0177, UFTDI_TYPE_AUTO),
681 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0178, UFTDI_TYPE_AUTO),
682 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0179, UFTDI_TYPE_AUTO),
683 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_017A, UFTDI_TYPE_AUTO),
684 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_017B, UFTDI_TYPE_AUTO),
685 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_017C, UFTDI_TYPE_AUTO),
686 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_017D, UFTDI_TYPE_AUTO),
687 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_017E, UFTDI_TYPE_AUTO),
688 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_017F, UFTDI_TYPE_AUTO),
689 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0180, UFTDI_TYPE_AUTO),
690 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0181, UFTDI_TYPE_AUTO),
691 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0182, UFTDI_TYPE_AUTO),
692 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0183, UFTDI_TYPE_AUTO),
693 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0184, UFTDI_TYPE_AUTO),
694 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0185, UFTDI_TYPE_AUTO),
695 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0186, UFTDI_TYPE_AUTO),
696 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0187, UFTDI_TYPE_AUTO),
697 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0188, UFTDI_TYPE_AUTO),
698 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0189, UFTDI_TYPE_AUTO),
699 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_018A, UFTDI_TYPE_AUTO),
700 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_018B, UFTDI_TYPE_AUTO),
701 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_018C, UFTDI_TYPE_AUTO),
702 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_018D, UFTDI_TYPE_AUTO),
703 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_018E, UFTDI_TYPE_AUTO),
704 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_018F, UFTDI_TYPE_AUTO),
705 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0190, UFTDI_TYPE_AUTO),
706 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0191, UFTDI_TYPE_AUTO),
707 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0192, UFTDI_TYPE_AUTO),
708 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0193, UFTDI_TYPE_AUTO),
709 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0194, UFTDI_TYPE_AUTO),
710 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0195, UFTDI_TYPE_AUTO),
711 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0196, UFTDI_TYPE_AUTO),
712 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0197, UFTDI_TYPE_AUTO),
713 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0198, UFTDI_TYPE_AUTO),
714 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_0199, UFTDI_TYPE_AUTO),
715 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_019A, UFTDI_TYPE_AUTO),
716 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_019B, UFTDI_TYPE_AUTO),
717 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_019C, UFTDI_TYPE_AUTO),
718 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_019D, UFTDI_TYPE_AUTO),
719 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_019E, UFTDI_TYPE_AUTO),
720 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_019F, UFTDI_TYPE_AUTO),
721 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01A0, UFTDI_TYPE_AUTO),
722 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01A1, UFTDI_TYPE_AUTO),
723 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01A2, UFTDI_TYPE_AUTO),
724 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01A3, UFTDI_TYPE_AUTO),
725 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01A4, UFTDI_TYPE_AUTO),
726 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01A5, UFTDI_TYPE_AUTO),
727 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01A6, UFTDI_TYPE_AUTO),
728 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01A7, UFTDI_TYPE_AUTO),
729 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01A8, UFTDI_TYPE_AUTO),
730 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01A9, UFTDI_TYPE_AUTO),
731 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01AA, UFTDI_TYPE_AUTO),
732 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01AB, UFTDI_TYPE_AUTO),
733 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01AC, UFTDI_TYPE_AUTO),
734 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01AD, UFTDI_TYPE_AUTO),
735 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01AE, UFTDI_TYPE_AUTO),
736 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01AF, UFTDI_TYPE_AUTO),
737 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01B0, UFTDI_TYPE_AUTO),
738 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01B1, UFTDI_TYPE_AUTO),
739 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01B2, UFTDI_TYPE_AUTO),
740 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01B3, UFTDI_TYPE_AUTO),
741 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01B4, UFTDI_TYPE_AUTO),
742 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01B5, UFTDI_TYPE_AUTO),
743 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01B6, UFTDI_TYPE_AUTO),
744 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01B7, UFTDI_TYPE_AUTO),
745 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01B8, UFTDI_TYPE_AUTO),
746 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01B9, UFTDI_TYPE_AUTO),
747 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01BA, UFTDI_TYPE_AUTO),
748 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01BB, UFTDI_TYPE_AUTO),
749 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01BC, UFTDI_TYPE_AUTO),
750 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01BD, UFTDI_TYPE_AUTO),
751 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01BE, UFTDI_TYPE_AUTO),
752 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01BF, UFTDI_TYPE_AUTO),
753 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01C0, UFTDI_TYPE_AUTO),
754 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01C1, UFTDI_TYPE_AUTO),
755 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01C2, UFTDI_TYPE_AUTO),
756 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01C3, UFTDI_TYPE_AUTO),
757 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01C4, UFTDI_TYPE_AUTO),
758 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01C5, UFTDI_TYPE_AUTO),
759 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01C6, UFTDI_TYPE_AUTO),
760 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01C7, UFTDI_TYPE_AUTO),
761 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01C8, UFTDI_TYPE_AUTO),
762 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01C9, UFTDI_TYPE_AUTO),
763 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01CA, UFTDI_TYPE_AUTO),
764 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01CB, UFTDI_TYPE_AUTO),
765 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01CC, UFTDI_TYPE_AUTO),
766 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01CD, UFTDI_TYPE_AUTO),
767 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01CE, UFTDI_TYPE_AUTO),
768 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01CF, UFTDI_TYPE_AUTO),
769 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01D0, UFTDI_TYPE_AUTO),
770 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01D1, UFTDI_TYPE_AUTO),
771 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01D2, UFTDI_TYPE_AUTO),
772 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01D3, UFTDI_TYPE_AUTO),
773 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01D4, UFTDI_TYPE_AUTO),
774 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01D5, UFTDI_TYPE_AUTO),
775 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01D6, UFTDI_TYPE_AUTO),
776 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01D7, UFTDI_TYPE_AUTO),
777 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01D8, UFTDI_TYPE_AUTO),
778 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01D9, UFTDI_TYPE_AUTO),
779 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01DA, UFTDI_TYPE_AUTO),
780 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01DB, UFTDI_TYPE_AUTO),
781 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01DC, UFTDI_TYPE_AUTO),
782 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01DD, UFTDI_TYPE_AUTO),
783 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01DE, UFTDI_TYPE_AUTO),
784 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01DF, UFTDI_TYPE_AUTO),
785 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01E0, UFTDI_TYPE_AUTO),
786 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01E1, UFTDI_TYPE_AUTO),
787 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01E2, UFTDI_TYPE_AUTO),
788 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01E3, UFTDI_TYPE_AUTO),
789 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01E4, UFTDI_TYPE_AUTO),
790 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01E5, UFTDI_TYPE_AUTO),
791 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01E6, UFTDI_TYPE_AUTO),
792 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01E7, UFTDI_TYPE_AUTO),
793 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01E8, UFTDI_TYPE_AUTO),
794 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01E9, UFTDI_TYPE_AUTO),
795 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01EA, UFTDI_TYPE_AUTO),
796 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01EB, UFTDI_TYPE_AUTO),
797 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01EC, UFTDI_TYPE_AUTO),
798 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01ED, UFTDI_TYPE_AUTO),
799 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01EE, UFTDI_TYPE_AUTO),
800 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01EF, UFTDI_TYPE_AUTO),
801 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01F0, UFTDI_TYPE_AUTO),
802 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01F1, UFTDI_TYPE_AUTO),
803 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01F2, UFTDI_TYPE_AUTO),
804 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01F3, UFTDI_TYPE_AUTO),
805 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01F4, UFTDI_TYPE_AUTO),
806 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01F5, UFTDI_TYPE_AUTO),
807 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01F6, UFTDI_TYPE_AUTO),
808 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01F7, UFTDI_TYPE_AUTO),
809 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01F8, UFTDI_TYPE_AUTO),
810 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01F9, UFTDI_TYPE_AUTO),
811 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01FA, UFTDI_TYPE_AUTO),
812 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01FB, UFTDI_TYPE_AUTO),
813 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01FC, UFTDI_TYPE_AUTO),
814 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01FD, UFTDI_TYPE_AUTO),
815 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01FE, UFTDI_TYPE_AUTO),
816 	UFTDI_DEV(MATRIXORBITAL, FTDI_RANGE_01FF, UFTDI_TYPE_AUTO),
817 	UFTDI_DEV(MATRIXORBITAL, MOUA, UFTDI_TYPE_8U232AM),
818 	UFTDI_DEV(MELCO, PCOPRS1, UFTDI_TYPE_8U232AM),
819 	UFTDI_DEV(METAGEEK, TELLSTICK, UFTDI_TYPE_AUTO),
820 	UFTDI_DEV(MOBILITY, USB_SERIAL, UFTDI_TYPE_AUTO),
821 	UFTDI_DEV(OLIMEX, ARM_USB_OCD, UFTDI_TYPE_AUTO | UFTDI_FLAG_JTAG),
822 	UFTDI_DEV(OLIMEX, ARM_USB_OCD_H, UFTDI_TYPE_AUTO | UFTDI_FLAG_JTAG),
823 	UFTDI_DEV(OPTO, CRD7734, UFTDI_TYPE_AUTO),
824 	UFTDI_DEV(OPTO, CRD7734_1, UFTDI_TYPE_AUTO),
825 	UFTDI_DEV(PAPOUCH, AD4USB, UFTDI_TYPE_AUTO),
826 	UFTDI_DEV(PAPOUCH, AP485, UFTDI_TYPE_AUTO),
827 	UFTDI_DEV(PAPOUCH, AP485_2, UFTDI_TYPE_AUTO),
828 	UFTDI_DEV(PAPOUCH, DRAK5, UFTDI_TYPE_AUTO),
829 	UFTDI_DEV(PAPOUCH, DRAK6, UFTDI_TYPE_AUTO),
830 	UFTDI_DEV(PAPOUCH, GMSR, UFTDI_TYPE_AUTO),
831 	UFTDI_DEV(PAPOUCH, GMUX, UFTDI_TYPE_AUTO),
832 	UFTDI_DEV(PAPOUCH, IRAMP, UFTDI_TYPE_AUTO),
833 	UFTDI_DEV(PAPOUCH, LEC, UFTDI_TYPE_AUTO),
834 	UFTDI_DEV(PAPOUCH, MU, UFTDI_TYPE_AUTO),
835 	UFTDI_DEV(PAPOUCH, QUIDO10X1, UFTDI_TYPE_AUTO),
836 	UFTDI_DEV(PAPOUCH, QUIDO2X16, UFTDI_TYPE_AUTO),
837 	UFTDI_DEV(PAPOUCH, QUIDO2X2, UFTDI_TYPE_AUTO),
838 	UFTDI_DEV(PAPOUCH, QUIDO30X3, UFTDI_TYPE_AUTO),
839 	UFTDI_DEV(PAPOUCH, QUIDO3X32, UFTDI_TYPE_AUTO),
840 	UFTDI_DEV(PAPOUCH, QUIDO4X4, UFTDI_TYPE_AUTO),
841 	UFTDI_DEV(PAPOUCH, QUIDO60X3, UFTDI_TYPE_AUTO),
842 	UFTDI_DEV(PAPOUCH, QUIDO8X8, UFTDI_TYPE_AUTO),
843 	UFTDI_DEV(PAPOUCH, SB232, UFTDI_TYPE_AUTO),
844 	UFTDI_DEV(PAPOUCH, SB422, UFTDI_TYPE_AUTO),
845 	UFTDI_DEV(PAPOUCH, SB422_2, UFTDI_TYPE_AUTO),
846 	UFTDI_DEV(PAPOUCH, SB485, UFTDI_TYPE_AUTO),
847 	UFTDI_DEV(PAPOUCH, SB485C, UFTDI_TYPE_AUTO),
848 	UFTDI_DEV(PAPOUCH, SB485S, UFTDI_TYPE_AUTO),
849 	UFTDI_DEV(PAPOUCH, SB485_2, UFTDI_TYPE_AUTO),
850 	UFTDI_DEV(PAPOUCH, SIMUKEY, UFTDI_TYPE_AUTO),
851 	UFTDI_DEV(PAPOUCH, TMU, UFTDI_TYPE_AUTO),
852 	UFTDI_DEV(PAPOUCH, UPSUSB, UFTDI_TYPE_AUTO),
853 	UFTDI_DEV(POSIFLEX, PP7000, UFTDI_TYPE_AUTO),
854 	UFTDI_DEV(QIHARDWARE, JTAGSERIAL, UFTDI_TYPE_AUTO | UFTDI_FLAG_JTAG),
855 	UFTDI_DEV(RATOC, REXUSB60F, UFTDI_TYPE_8U232AM),
856 	UFTDI_DEV(RTSYSTEMS, CT29B, UFTDI_TYPE_AUTO),
857 	UFTDI_DEV(RTSYSTEMS, SERIAL_VX7, UFTDI_TYPE_AUTO),
858 	UFTDI_DEV(SEALEVEL, 2101, UFTDI_TYPE_AUTO),
859 	UFTDI_DEV(SEALEVEL, 2102, UFTDI_TYPE_AUTO),
860 	UFTDI_DEV(SEALEVEL, 2103, UFTDI_TYPE_AUTO),
861 	UFTDI_DEV(SEALEVEL, 2104, UFTDI_TYPE_AUTO),
862 	UFTDI_DEV(SEALEVEL, 2106, UFTDI_TYPE_AUTO),
863 	UFTDI_DEV(SEALEVEL, 2201_1, UFTDI_TYPE_AUTO),
864 	UFTDI_DEV(SEALEVEL, 2201_2, UFTDI_TYPE_AUTO),
865 	UFTDI_DEV(SEALEVEL, 2202_1, UFTDI_TYPE_AUTO),
866 	UFTDI_DEV(SEALEVEL, 2202_2, UFTDI_TYPE_AUTO),
867 	UFTDI_DEV(SEALEVEL, 2203_1, UFTDI_TYPE_AUTO),
868 	UFTDI_DEV(SEALEVEL, 2203_2, UFTDI_TYPE_AUTO),
869 	UFTDI_DEV(SEALEVEL, 2401_1, UFTDI_TYPE_AUTO),
870 	UFTDI_DEV(SEALEVEL, 2401_2, UFTDI_TYPE_AUTO),
871 	UFTDI_DEV(SEALEVEL, 2401_3, UFTDI_TYPE_AUTO),
872 	UFTDI_DEV(SEALEVEL, 2401_4, UFTDI_TYPE_AUTO),
873 	UFTDI_DEV(SEALEVEL, 2402_1, UFTDI_TYPE_AUTO),
874 	UFTDI_DEV(SEALEVEL, 2402_2, UFTDI_TYPE_AUTO),
875 	UFTDI_DEV(SEALEVEL, 2402_3, UFTDI_TYPE_AUTO),
876 	UFTDI_DEV(SEALEVEL, 2402_4, UFTDI_TYPE_AUTO),
877 	UFTDI_DEV(SEALEVEL, 2403_1, UFTDI_TYPE_AUTO),
878 	UFTDI_DEV(SEALEVEL, 2403_2, UFTDI_TYPE_AUTO),
879 	UFTDI_DEV(SEALEVEL, 2403_3, UFTDI_TYPE_AUTO),
880 	UFTDI_DEV(SEALEVEL, 2403_4, UFTDI_TYPE_AUTO),
881 	UFTDI_DEV(SEALEVEL, 2801_1, UFTDI_TYPE_AUTO),
882 	UFTDI_DEV(SEALEVEL, 2801_2, UFTDI_TYPE_AUTO),
883 	UFTDI_DEV(SEALEVEL, 2801_3, UFTDI_TYPE_AUTO),
884 	UFTDI_DEV(SEALEVEL, 2801_4, UFTDI_TYPE_AUTO),
885 	UFTDI_DEV(SEALEVEL, 2801_5, UFTDI_TYPE_AUTO),
886 	UFTDI_DEV(SEALEVEL, 2801_6, UFTDI_TYPE_AUTO),
887 	UFTDI_DEV(SEALEVEL, 2801_7, UFTDI_TYPE_AUTO),
888 	UFTDI_DEV(SEALEVEL, 2801_8, UFTDI_TYPE_AUTO),
889 	UFTDI_DEV(SEALEVEL, 2802_1, UFTDI_TYPE_AUTO),
890 	UFTDI_DEV(SEALEVEL, 2802_2, UFTDI_TYPE_AUTO),
891 	UFTDI_DEV(SEALEVEL, 2802_3, UFTDI_TYPE_AUTO),
892 	UFTDI_DEV(SEALEVEL, 2802_4, UFTDI_TYPE_AUTO),
893 	UFTDI_DEV(SEALEVEL, 2802_5, UFTDI_TYPE_AUTO),
894 	UFTDI_DEV(SEALEVEL, 2802_6, UFTDI_TYPE_AUTO),
895 	UFTDI_DEV(SEALEVEL, 2802_7, UFTDI_TYPE_AUTO),
896 	UFTDI_DEV(SEALEVEL, 2802_8, UFTDI_TYPE_AUTO),
897 	UFTDI_DEV(SEALEVEL, 2803_1, UFTDI_TYPE_AUTO),
898 	UFTDI_DEV(SEALEVEL, 2803_2, UFTDI_TYPE_AUTO),
899 	UFTDI_DEV(SEALEVEL, 2803_3, UFTDI_TYPE_AUTO),
900 	UFTDI_DEV(SEALEVEL, 2803_4, UFTDI_TYPE_AUTO),
901 	UFTDI_DEV(SEALEVEL, 2803_5, UFTDI_TYPE_AUTO),
902 	UFTDI_DEV(SEALEVEL, 2803_6, UFTDI_TYPE_AUTO),
903 	UFTDI_DEV(SEALEVEL, 2803_7, UFTDI_TYPE_AUTO),
904 	UFTDI_DEV(SEALEVEL, 2803_8, UFTDI_TYPE_AUTO),
905 	UFTDI_DEV(SIIG2, DK201, UFTDI_TYPE_AUTO),
906 	UFTDI_DEV(SIIG2, US2308, UFTDI_TYPE_8U232AM),
907 	UFTDI_DEV(TESTO, USB_INTERFACE, UFTDI_TYPE_AUTO),
908 	UFTDI_DEV(TML, USB_SERIAL, UFTDI_TYPE_AUTO),
909 	UFTDI_DEV(TTI, QL355P, UFTDI_TYPE_AUTO),
910 	UFTDI_DEV(UNKNOWN4, NF_RIC, UFTDI_TYPE_AUTO),
911 #undef UFTDI_DEV
912 };
913 
914 /*
915  * Set up softc fields whose value depends on the device type.
916  *
917  * Note that the 2232C and 2232D devices are the same for our purposes.  In the
918  * silicon the difference is that the D series has CPU FIFO mode and C doesn't.
919  * I haven't found any way of determining the C/D difference from info provided
920  * by the chip other than trying to set CPU FIFO mode and having it work or not.
921  *
922  * Due to a hardware bug, a 232B chip without an eeprom reports itself as a
923  * 232A, but if the serial number is also zero we know it's really a 232B.
924  */
925 static void
926 uftdi_devtype_setup(struct uftdi_softc *sc, struct usb_attach_arg *uaa)
927 {
928 	struct usb_device_descriptor *dd;
929 
930 	sc->sc_bcdDevice = uaa->info.bcdDevice;
931 
932 	switch (uaa->info.bcdDevice) {
933 	case 0x200:
934 		dd = usbd_get_device_descriptor(sc->sc_udev);
935 		if (dd->iSerialNumber == 0) {
936 			sc->sc_devtype = DEVT_232B;
937 		} else {
938 			sc->sc_devtype = DEVT_232A;
939 		}
940 		sc->sc_ucom.sc_portno = 0;
941 		break;
942 	case 0x400:
943 		sc->sc_devtype = DEVT_232B;
944 		sc->sc_ucom.sc_portno = 0;
945 		break;
946 	case 0x500:
947 		sc->sc_devtype = DEVT_2232D;
948 		sc->sc_devflags |= DEVF_BAUDBITS_HINDEX;
949 		sc->sc_ucom.sc_portno = FTDI_PIT_SIOA + uaa->info.bIfaceNum;
950 		break;
951 	case 0x600:
952 		sc->sc_devtype = DEVT_232R;
953 		sc->sc_ucom.sc_portno = 0;
954 		break;
955 	case 0x700:
956 		sc->sc_devtype = DEVT_2232H;
957 		sc->sc_devflags |= DEVF_BAUDBITS_HINDEX | DEVF_BAUDCLK_12M;
958 		sc->sc_ucom.sc_portno = FTDI_PIT_SIOA + uaa->info.bIfaceNum;
959 		break;
960 	case 0x800:
961 		sc->sc_devtype = DEVT_4232H;
962 		sc->sc_devflags |= DEVF_BAUDBITS_HINDEX | DEVF_BAUDCLK_12M;
963 		sc->sc_ucom.sc_portno = FTDI_PIT_SIOA + uaa->info.bIfaceNum;
964 		break;
965 	case 0x900:
966 		sc->sc_devtype = DEVT_232H;
967 		sc->sc_devflags |= DEVF_BAUDBITS_HINDEX | DEVF_BAUDCLK_12M;
968 		sc->sc_ucom.sc_portno = FTDI_PIT_SIOA + uaa->info.bIfaceNum;
969 		break;
970 	case 0x1000:
971 		sc->sc_devtype = DEVT_230X;
972 		sc->sc_devflags |= DEVF_BAUDBITS_HINDEX;
973 		sc->sc_ucom.sc_portno = FTDI_PIT_SIOA + uaa->info.bIfaceNum;
974 		break;
975 	default:
976 		if (uaa->info.bcdDevice < 0x200) {
977 			sc->sc_devtype = DEVT_SIO;
978 			sc->sc_hdrlen = 1;
979 		} else {
980 			sc->sc_devtype = DEVT_232R;
981 			device_printf(sc->sc_dev, "Warning: unknown FTDI "
982 			    "device type, bcdDevice=0x%04x, assuming 232R",
983 			    uaa->info.bcdDevice);
984 		}
985 		sc->sc_ucom.sc_portno = 0;
986 		break;
987 	}
988 }
989 
990 static int
991 uftdi_probe(device_t dev)
992 {
993 	struct usb_attach_arg *uaa = device_get_ivars(dev);
994 	const struct usb_device_id *id;
995 
996 	if (uaa->usb_mode != USB_MODE_HOST) {
997 		return (ENXIO);
998 	}
999 	if (uaa->info.bConfigIndex != UFTDI_CONFIG_INDEX) {
1000 		return (ENXIO);
1001 	}
1002 
1003 	/*
1004 	 * Attach to all present interfaces unless this is a JTAG one, which
1005 	 * we leave for userland.
1006 	 */
1007 	id = usbd_lookup_id_by_info(uftdi_devs, sizeof(uftdi_devs),
1008 	    &uaa->info);
1009 	if (id == NULL)
1010 		return (ENXIO);
1011 	if ((id->driver_info & UFTDI_FLAG_JTAG) != 0 &&
1012 	    uaa->info.bIfaceIndex == UFTDI_IFACE_INDEX_JTAG) {
1013 		printf("%s: skipping JTAG interface at %u.%u\n",
1014 		    device_get_name(dev), usbd_get_bus_index(uaa->device),
1015 		    usbd_get_device_index(uaa->device));
1016 		return (ENXIO);
1017 	}
1018 	uaa->driver_info = id->driver_info;
1019 	return (BUS_PROBE_SPECIFIC);
1020 }
1021 
1022 static int
1023 uftdi_attach(device_t dev)
1024 {
1025 	struct usb_attach_arg *uaa = device_get_ivars(dev);
1026 	struct uftdi_softc *sc = device_get_softc(dev);
1027 	int error;
1028 
1029 	DPRINTF("\n");
1030 
1031 	sc->sc_udev = uaa->device;
1032 	sc->sc_dev = dev;
1033 	sc->sc_unit = device_get_unit(dev);
1034 
1035 	device_set_usb_desc(dev);
1036 	mtx_init(&sc->sc_mtx, "uftdi", NULL, MTX_DEF);
1037 	ucom_ref(&sc->sc_super_ucom);
1038 
1039 
1040 	uftdi_devtype_setup(sc, uaa);
1041 
1042 	error = usbd_transfer_setup(uaa->device,
1043 	    &uaa->info.bIfaceIndex, sc->sc_xfer, uftdi_config,
1044 	    UFTDI_N_TRANSFER, sc, &sc->sc_mtx);
1045 
1046 	if (error) {
1047 		device_printf(dev, "allocating USB "
1048 		    "transfers failed\n");
1049 		goto detach;
1050 	}
1051 	/* clear stall at first run */
1052 	mtx_lock(&sc->sc_mtx);
1053 	usbd_xfer_set_stall(sc->sc_xfer[UFTDI_BULK_DT_WR]);
1054 	usbd_xfer_set_stall(sc->sc_xfer[UFTDI_BULK_DT_RD]);
1055 	mtx_unlock(&sc->sc_mtx);
1056 
1057 	/* set a valid "lcr" value */
1058 
1059 	sc->sc_last_lcr =
1060 	    (FTDI_SIO_SET_DATA_STOP_BITS_2 |
1061 	    FTDI_SIO_SET_DATA_PARITY_NONE |
1062 	    FTDI_SIO_SET_DATA_BITS(8));
1063 
1064 	error = ucom_attach(&sc->sc_super_ucom, &sc->sc_ucom, 1, sc,
1065 	    &uftdi_callback, &sc->sc_mtx);
1066 	if (error) {
1067 		goto detach;
1068 	}
1069 	ucom_set_pnpinfo_usb(&sc->sc_super_ucom, dev);
1070 
1071 	return (0);			/* success */
1072 
1073 detach:
1074 	uftdi_detach(dev);
1075 	return (ENXIO);
1076 }
1077 
1078 static int
1079 uftdi_detach(device_t dev)
1080 {
1081 	struct uftdi_softc *sc = device_get_softc(dev);
1082 
1083 	ucom_detach(&sc->sc_super_ucom, &sc->sc_ucom);
1084 	usbd_transfer_unsetup(sc->sc_xfer, UFTDI_N_TRANSFER);
1085 
1086 	device_claim_softc(dev);
1087 
1088 	uftdi_free_softc(sc);
1089 
1090 	return (0);
1091 }
1092 
1093 UCOM_UNLOAD_DRAIN(uftdi);
1094 
1095 static void
1096 uftdi_free_softc(struct uftdi_softc *sc)
1097 {
1098 	if (ucom_unref(&sc->sc_super_ucom)) {
1099 		mtx_destroy(&sc->sc_mtx);
1100 		device_free_softc(sc);
1101 	}
1102 }
1103 
1104 static void
1105 uftdi_free(struct ucom_softc *ucom)
1106 {
1107 	uftdi_free_softc(ucom->sc_parent);
1108 }
1109 
1110 static void
1111 uftdi_cfg_open(struct ucom_softc *ucom)
1112 {
1113 
1114 	/*
1115 	 * This do-nothing open routine exists for the sole purpose of this
1116 	 * DPRINTF() so that you can see the point at which open gets called
1117 	 * when debugging is enabled.
1118 	 */
1119 	DPRINTF("");
1120 }
1121 
1122 static void
1123 uftdi_cfg_close(struct ucom_softc *ucom)
1124 {
1125 
1126 	/*
1127 	 * This do-nothing close routine exists for the sole purpose of this
1128 	 * DPRINTF() so that you can see the point at which close gets called
1129 	 * when debugging is enabled.
1130 	 */
1131 	DPRINTF("");
1132 }
1133 
1134 static void
1135 uftdi_write_callback(struct usb_xfer *xfer, usb_error_t error)
1136 {
1137 	struct uftdi_softc *sc = usbd_xfer_softc(xfer);
1138 	struct usb_page_cache *pc;
1139 	uint32_t pktlen;
1140 	uint32_t buflen;
1141 	uint8_t buf[1];
1142 
1143 	switch (USB_GET_STATE(xfer)) {
1144 	default:			/* Error */
1145 		if (error != USB_ERR_CANCELLED) {
1146 			/* try to clear stall first */
1147 			usbd_xfer_set_stall(xfer);
1148 		}
1149 		/* FALLTHROUGH */
1150 	case USB_ST_SETUP:
1151 	case USB_ST_TRANSFERRED:
1152 		/*
1153 		 * If output packets don't require headers (the common case) we
1154 		 * can just load the buffer up with payload bytes all at once.
1155 		 * Otherwise, loop to format packets into the buffer while there
1156 		 * is data available, and room for a packet header and at least
1157 		 * one byte of payload.
1158 		 */
1159 		pc = usbd_xfer_get_frame(xfer, 0);
1160 		if (sc->sc_hdrlen == 0) {
1161 			ucom_get_data(&sc->sc_ucom, pc, 0, UFTDI_OBUFSIZE,
1162 			    &buflen);
1163 		} else {
1164 			buflen = 0;
1165 			while (buflen < UFTDI_OBUFSIZE - sc->sc_hdrlen - 1 &&
1166 			    ucom_get_data(&sc->sc_ucom, pc, buflen +
1167 			    sc->sc_hdrlen, UFTDI_OPKTSIZE - sc->sc_hdrlen,
1168 			    &pktlen) != 0) {
1169 				buf[0] = FTDI_OUT_TAG(pktlen,
1170 				    sc->sc_ucom.sc_portno);
1171 				usbd_copy_in(pc, buflen, buf, 1);
1172 				buflen += pktlen + sc->sc_hdrlen;
1173 			}
1174 		}
1175 		if (buflen != 0) {
1176 			usbd_xfer_set_frame_len(xfer, 0, buflen);
1177 			usbd_transfer_submit(xfer);
1178 		}
1179 		break;
1180 	}
1181 }
1182 
1183 static void
1184 uftdi_read_callback(struct usb_xfer *xfer, usb_error_t error)
1185 {
1186 	struct uftdi_softc *sc = usbd_xfer_softc(xfer);
1187 	struct usb_page_cache *pc;
1188 	uint8_t buf[2];
1189 	uint8_t ftdi_msr;
1190 	uint8_t msr;
1191 	uint8_t lsr;
1192 	int buflen;
1193 	int pktlen;
1194 	int pktmax;
1195 	int offset;
1196 
1197 	usbd_xfer_status(xfer, &buflen, NULL, NULL, NULL);
1198 
1199 	switch (USB_GET_STATE(xfer)) {
1200 	case USB_ST_TRANSFERRED:
1201 		if (buflen < UFTDI_IHDRSIZE)
1202 			goto tr_setup;
1203 		pc = usbd_xfer_get_frame(xfer, 0);
1204 		pktmax = xfer->max_packet_size - UFTDI_IHDRSIZE;
1205 		lsr = 0;
1206 		msr = 0;
1207 		offset = 0;
1208 		/*
1209 		 * Extract packet headers and payload bytes from the buffer.
1210 		 * Feed payload bytes to ucom/tty layer; OR-accumulate header
1211 		 * status bits which are transient and could toggle with each
1212 		 * packet. After processing all packets in the buffer, process
1213 		 * the accumulated transient MSR and LSR values along with the
1214 		 * non-transient bits from the last packet header.
1215 		 */
1216 		while (buflen >= UFTDI_IHDRSIZE) {
1217 			usbd_copy_out(pc, offset, buf, UFTDI_IHDRSIZE);
1218 			offset += UFTDI_IHDRSIZE;
1219 			buflen -= UFTDI_IHDRSIZE;
1220 			lsr |= FTDI_GET_LSR(buf);
1221 			if (FTDI_GET_MSR(buf) & FTDI_SIO_RI_MASK)
1222 				msr |= SER_RI;
1223 			pktlen = min(buflen, pktmax);
1224 			if (pktlen != 0) {
1225 				ucom_put_data(&sc->sc_ucom, pc, offset,
1226 				    pktlen);
1227 				offset += pktlen;
1228 				buflen -= pktlen;
1229 			}
1230 		}
1231 		ftdi_msr = FTDI_GET_MSR(buf);
1232 
1233 		if (ftdi_msr & FTDI_SIO_CTS_MASK)
1234 			msr |= SER_CTS;
1235 		if (ftdi_msr & FTDI_SIO_DSR_MASK)
1236 			msr |= SER_DSR;
1237 		if (ftdi_msr & FTDI_SIO_RI_MASK)
1238 			msr |= SER_RI;
1239 		if (ftdi_msr & FTDI_SIO_RLSD_MASK)
1240 			msr |= SER_DCD;
1241 
1242 		if ((sc->sc_msr != msr) ||
1243 		    ((sc->sc_lsr & FTDI_LSR_MASK) != (lsr & FTDI_LSR_MASK))) {
1244 			DPRINTF("status change msr=0x%02x (0x%02x) "
1245 			    "lsr=0x%02x (0x%02x)\n", msr, sc->sc_msr,
1246 			    lsr, sc->sc_lsr);
1247 
1248 			sc->sc_msr = msr;
1249 			sc->sc_lsr = lsr;
1250 
1251 			ucom_status_change(&sc->sc_ucom);
1252 		}
1253 		/* FALLTHROUGH */
1254 	case USB_ST_SETUP:
1255 tr_setup:
1256 		usbd_xfer_set_frame_len(xfer, 0, usbd_xfer_max_len(xfer));
1257 		usbd_transfer_submit(xfer);
1258 		return;
1259 
1260 	default:			/* Error */
1261 		if (error != USB_ERR_CANCELLED) {
1262 			/* try to clear stall first */
1263 			usbd_xfer_set_stall(xfer);
1264 			goto tr_setup;
1265 		}
1266 		return;
1267 	}
1268 }
1269 
1270 static void
1271 uftdi_cfg_set_dtr(struct ucom_softc *ucom, uint8_t onoff)
1272 {
1273 	struct uftdi_softc *sc = ucom->sc_parent;
1274 	uint16_t wIndex = ucom->sc_portno;
1275 	uint16_t wValue;
1276 	struct usb_device_request req;
1277 
1278 	wValue = onoff ? FTDI_SIO_SET_DTR_HIGH : FTDI_SIO_SET_DTR_LOW;
1279 
1280 	req.bmRequestType = UT_WRITE_VENDOR_DEVICE;
1281 	req.bRequest = FTDI_SIO_MODEM_CTRL;
1282 	USETW(req.wValue, wValue);
1283 	USETW(req.wIndex, wIndex);
1284 	USETW(req.wLength, 0);
1285 	ucom_cfg_do_request(sc->sc_udev, &sc->sc_ucom,
1286 	    &req, NULL, 0, 1000);
1287 }
1288 
1289 static void
1290 uftdi_cfg_set_rts(struct ucom_softc *ucom, uint8_t onoff)
1291 {
1292 	struct uftdi_softc *sc = ucom->sc_parent;
1293 	uint16_t wIndex = ucom->sc_portno;
1294 	uint16_t wValue;
1295 	struct usb_device_request req;
1296 
1297 	wValue = onoff ? FTDI_SIO_SET_RTS_HIGH : FTDI_SIO_SET_RTS_LOW;
1298 
1299 	req.bmRequestType = UT_WRITE_VENDOR_DEVICE;
1300 	req.bRequest = FTDI_SIO_MODEM_CTRL;
1301 	USETW(req.wValue, wValue);
1302 	USETW(req.wIndex, wIndex);
1303 	USETW(req.wLength, 0);
1304 	ucom_cfg_do_request(sc->sc_udev, &sc->sc_ucom,
1305 	    &req, NULL, 0, 1000);
1306 }
1307 
1308 static void
1309 uftdi_cfg_set_break(struct ucom_softc *ucom, uint8_t onoff)
1310 {
1311 	struct uftdi_softc *sc = ucom->sc_parent;
1312 	uint16_t wIndex = ucom->sc_portno;
1313 	uint16_t wValue;
1314 	struct usb_device_request req;
1315 
1316 	if (onoff) {
1317 		sc->sc_last_lcr |= FTDI_SIO_SET_BREAK;
1318 	} else {
1319 		sc->sc_last_lcr &= ~FTDI_SIO_SET_BREAK;
1320 	}
1321 
1322 	wValue = sc->sc_last_lcr;
1323 
1324 	req.bmRequestType = UT_WRITE_VENDOR_DEVICE;
1325 	req.bRequest = FTDI_SIO_SET_DATA;
1326 	USETW(req.wValue, wValue);
1327 	USETW(req.wIndex, wIndex);
1328 	USETW(req.wLength, 0);
1329 	ucom_cfg_do_request(sc->sc_udev, &sc->sc_ucom,
1330 	    &req, NULL, 0, 1000);
1331 }
1332 
1333 /*
1334  * Return true if the given speed is within operational tolerance of the target
1335  * speed.  FTDI recommends that the hardware speed be within 3% of nominal.
1336  */
1337 static inline boolean_t
1338 uftdi_baud_within_tolerance(uint64_t speed, uint64_t target)
1339 {
1340 	return ((speed >= (target * 100) / 103) &&
1341 	    (speed <= (target * 100) / 97));
1342 }
1343 
1344 static int
1345 uftdi_sio_encode_baudrate(struct uftdi_softc *sc, speed_t speed,
1346 	struct uftdi_param_config *cfg)
1347 {
1348 	u_int i;
1349 	const speed_t sio_speeds[] = {
1350 		300, 600, 1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200
1351 	};
1352 
1353 	/*
1354 	 * The original SIO chips were limited to a small choice of speeds
1355 	 * listed in an internal table of speeds chosen by an index value.
1356 	 */
1357 	for (i = 0; i < nitems(sio_speeds); ++i) {
1358 		if (speed == sio_speeds[i]) {
1359 			cfg->baud_lobits = i;
1360 			cfg->baud_hibits = 0;
1361 			return (0);
1362 		}
1363 	}
1364 	return (ERANGE);
1365 }
1366 
1367 static int
1368 uftdi_encode_baudrate(struct uftdi_softc *sc, speed_t speed,
1369 	struct uftdi_param_config *cfg)
1370 {
1371 	static const uint8_t encoded_fraction[8] = {0, 3, 2, 4, 1, 5, 6, 7};
1372 	static const uint8_t roundoff_232a[16] = {
1373 		0,  1,  0,  1,  0, -1,  2,  1,
1374 		0, -1, -2, -3,  4,  3,  2,  1,
1375 	};
1376 	uint32_t clk, divisor, fastclk_flag, frac, hwspeed;
1377 
1378 	/*
1379 	 * If this chip has the fast clock capability and the speed is within
1380 	 * range, use the 12MHz clock, otherwise the standard clock is 3MHz.
1381 	 */
1382 	if ((sc->sc_devflags & DEVF_BAUDCLK_12M) && speed >= 1200) {
1383 		clk = 12000000;
1384 		fastclk_flag = (1 << 17);
1385 	} else {
1386 		clk = 3000000;
1387 		fastclk_flag = 0;
1388 	}
1389 
1390 	/*
1391 	 * Make sure the requested speed is reachable with the available clock
1392 	 * and a 14-bit divisor.
1393 	 */
1394 	if (speed < (clk >> 14) || speed > clk)
1395 		return (ERANGE);
1396 
1397 	/*
1398 	 * Calculate the divisor, initially yielding a fixed point number with a
1399 	 * 4-bit (1/16ths) fraction, then round it to the nearest fraction the
1400 	 * hardware can handle.  When the integral part of the divisor is
1401 	 * greater than one, the fractional part is in 1/8ths of the base clock.
1402 	 * The FT8U232AM chips can handle only 0.125, 0.250, and 0.5 fractions.
1403 	 * Later chips can handle all 1/8th fractions.
1404 	 *
1405 	 * If the integral part of the divisor is 1, a special rule applies: the
1406 	 * fractional part can only be .0 or .5 (this is a limitation of the
1407 	 * hardware).  We handle this by truncating the fraction rather than
1408 	 * rounding, because this only applies to the two fastest speeds the
1409 	 * chip can achieve and rounding doesn't matter, either you've asked for
1410 	 * that exact speed or you've asked for something the chip can't do.
1411 	 *
1412 	 * For the FT8U232AM chips, use a roundoff table to adjust the result
1413 	 * to the nearest 1/8th fraction that is supported by the hardware,
1414 	 * leaving a fixed-point number with a 3-bit fraction which exactly
1415 	 * represents the math the hardware divider will do.  For later-series
1416 	 * chips that support all 8 fractional divisors, just round 16ths to
1417 	 * 8ths by adding 1 and dividing by 2.
1418 	 */
1419 	divisor = (clk << 4) / speed;
1420 	if ((divisor & 0xfffffff0) == 1)
1421 		divisor &= 0xfffffff8;
1422 	else if (sc->sc_devtype == DEVT_232A)
1423 		divisor += roundoff_232a[divisor & 0x0f];
1424 	else
1425 		divisor += 1;  /* Rounds odd 16ths up to next 8th. */
1426 	divisor >>= 1;
1427 
1428 	/*
1429 	 * Ensure the resulting hardware speed will be within operational
1430 	 * tolerance (within 3% of nominal).
1431 	 */
1432 	hwspeed = (clk << 3) / divisor;
1433 	if (!uftdi_baud_within_tolerance(hwspeed, speed))
1434 		return (ERANGE);
1435 
1436 	/*
1437 	 * Re-pack the divisor into hardware format. The lower 14-bits hold the
1438 	 * integral part, while the upper bits specify the fraction by indexing
1439 	 * a table of fractions within the hardware which is laid out as:
1440 	 *    {0.0, 0.5, 0.25, 0.125, 0.325, 0.625, 0.725, 0.875}
1441 	 * The A-series chips only have the first four table entries; the
1442 	 * roundoff table logic above ensures that the fractional part for those
1443 	 * chips will be one of the first four values.
1444 	 *
1445 	 * When the divisor is 1 a special encoding applies:  1.0 is encoded as
1446 	 * 0.0, and 1.5 is encoded as 1.0.  The rounding logic above has already
1447 	 * ensured that the fraction is either .0 or .5 if the integral is 1.
1448 	 */
1449 	frac = divisor & 0x07;
1450 	divisor >>= 3;
1451 	if (divisor == 1) {
1452 		if (frac == 0)
1453 			divisor = 0;  /* 1.0 becomes 0.0 */
1454 		else
1455 			frac = 0;     /* 1.5 becomes 1.0 */
1456 	}
1457 	divisor |= (encoded_fraction[frac] << 14) | fastclk_flag;
1458 
1459 	cfg->baud_lobits = (uint16_t)divisor;
1460 	cfg->baud_hibits = (uint16_t)(divisor >> 16);
1461 
1462 	/*
1463 	 * If this chip requires the baud bits to be in the high byte of the
1464 	 * index word, move the bits up to that location.
1465 	 */
1466 	if (sc->sc_devflags & DEVF_BAUDBITS_HINDEX) {
1467 		cfg->baud_hibits <<= 8;
1468 	}
1469 
1470 	return (0);
1471 }
1472 
1473 static int
1474 uftdi_set_parm_soft(struct ucom_softc *ucom, struct termios *t,
1475     struct uftdi_param_config *cfg)
1476 {
1477 	struct uftdi_softc *sc = ucom->sc_parent;
1478 	int err;
1479 
1480 	memset(cfg, 0, sizeof(*cfg));
1481 
1482 	if (sc->sc_devtype == DEVT_SIO)
1483 		err = uftdi_sio_encode_baudrate(sc, t->c_ospeed, cfg);
1484 	else
1485 		err = uftdi_encode_baudrate(sc, t->c_ospeed, cfg);
1486 	if (err != 0)
1487 		return (err);
1488 
1489 	if (t->c_cflag & CSTOPB)
1490 		cfg->lcr = FTDI_SIO_SET_DATA_STOP_BITS_2;
1491 	else
1492 		cfg->lcr = FTDI_SIO_SET_DATA_STOP_BITS_1;
1493 
1494 	if (t->c_cflag & PARENB) {
1495 		if (t->c_cflag & PARODD) {
1496 			cfg->lcr |= FTDI_SIO_SET_DATA_PARITY_ODD;
1497 		} else {
1498 			cfg->lcr |= FTDI_SIO_SET_DATA_PARITY_EVEN;
1499 		}
1500 	} else {
1501 		cfg->lcr |= FTDI_SIO_SET_DATA_PARITY_NONE;
1502 	}
1503 
1504 	switch (t->c_cflag & CSIZE) {
1505 	case CS5:
1506 		cfg->lcr |= FTDI_SIO_SET_DATA_BITS(5);
1507 		break;
1508 
1509 	case CS6:
1510 		cfg->lcr |= FTDI_SIO_SET_DATA_BITS(6);
1511 		break;
1512 
1513 	case CS7:
1514 		cfg->lcr |= FTDI_SIO_SET_DATA_BITS(7);
1515 		break;
1516 
1517 	case CS8:
1518 		cfg->lcr |= FTDI_SIO_SET_DATA_BITS(8);
1519 		break;
1520 	}
1521 
1522 	if (t->c_cflag & CRTSCTS) {
1523 		cfg->v_flow = FTDI_SIO_RTS_CTS_HS;
1524 	} else if (t->c_iflag & (IXON | IXOFF)) {
1525 		cfg->v_flow = FTDI_SIO_XON_XOFF_HS;
1526 		cfg->v_start = t->c_cc[VSTART];
1527 		cfg->v_stop = t->c_cc[VSTOP];
1528 	} else {
1529 		cfg->v_flow = FTDI_SIO_DISABLE_FLOW_CTRL;
1530 	}
1531 
1532 	return (0);
1533 }
1534 
1535 static int
1536 uftdi_pre_param(struct ucom_softc *ucom, struct termios *t)
1537 {
1538 	struct uftdi_param_config cfg;
1539 
1540 	DPRINTF("\n");
1541 
1542 	return (uftdi_set_parm_soft(ucom, t, &cfg));
1543 }
1544 
1545 static void
1546 uftdi_cfg_param(struct ucom_softc *ucom, struct termios *t)
1547 {
1548 	struct uftdi_softc *sc = ucom->sc_parent;
1549 	uint16_t wIndex = ucom->sc_portno;
1550 	struct uftdi_param_config cfg;
1551 	struct usb_device_request req;
1552 
1553 	if (uftdi_set_parm_soft(ucom, t, &cfg)) {
1554 		/* should not happen */
1555 		return;
1556 	}
1557 	sc->sc_last_lcr = cfg.lcr;
1558 
1559 	DPRINTF("\n");
1560 
1561 	req.bmRequestType = UT_WRITE_VENDOR_DEVICE;
1562 	req.bRequest = FTDI_SIO_SET_BAUD_RATE;
1563 	USETW(req.wValue, cfg.baud_lobits);
1564 	USETW(req.wIndex, cfg.baud_hibits | wIndex);
1565 	USETW(req.wLength, 0);
1566 	ucom_cfg_do_request(sc->sc_udev, &sc->sc_ucom,
1567 	    &req, NULL, 0, 1000);
1568 
1569 	req.bmRequestType = UT_WRITE_VENDOR_DEVICE;
1570 	req.bRequest = FTDI_SIO_SET_DATA;
1571 	USETW(req.wValue, cfg.lcr);
1572 	USETW(req.wIndex, wIndex);
1573 	USETW(req.wLength, 0);
1574 	ucom_cfg_do_request(sc->sc_udev, &sc->sc_ucom,
1575 	    &req, NULL, 0, 1000);
1576 
1577 	req.bmRequestType = UT_WRITE_VENDOR_DEVICE;
1578 	req.bRequest = FTDI_SIO_SET_FLOW_CTRL;
1579 	USETW2(req.wValue, cfg.v_stop, cfg.v_start);
1580 	USETW2(req.wIndex, cfg.v_flow, wIndex);
1581 	USETW(req.wLength, 0);
1582 	ucom_cfg_do_request(sc->sc_udev, &sc->sc_ucom,
1583 	    &req, NULL, 0, 1000);
1584 }
1585 
1586 static void
1587 uftdi_cfg_get_status(struct ucom_softc *ucom, uint8_t *lsr, uint8_t *msr)
1588 {
1589 	struct uftdi_softc *sc = ucom->sc_parent;
1590 
1591 	DPRINTF("msr=0x%02x lsr=0x%02x\n",
1592 	    sc->sc_msr, sc->sc_lsr);
1593 
1594 	*msr = sc->sc_msr;
1595 	*lsr = sc->sc_lsr;
1596 }
1597 
1598 static int
1599 uftdi_reset(struct ucom_softc *ucom, int reset_type)
1600 {
1601 	struct uftdi_softc *sc = ucom->sc_parent;
1602 	usb_device_request_t req;
1603 
1604 	req.bmRequestType = UT_WRITE_VENDOR_DEVICE;
1605 	req.bRequest = FTDI_SIO_RESET;
1606 
1607 	USETW(req.wIndex, sc->sc_ucom.sc_portno);
1608 	USETW(req.wLength, 0);
1609 	USETW(req.wValue, reset_type);
1610 
1611 	return (usbd_do_request(sc->sc_udev, &sc->sc_mtx, &req, NULL));
1612 }
1613 
1614 static int
1615 uftdi_set_bitmode(struct ucom_softc *ucom, uint8_t bitmode, uint8_t iomask)
1616 {
1617 	struct uftdi_softc *sc = ucom->sc_parent;
1618 	usb_device_request_t req;
1619 
1620 	req.bmRequestType = UT_WRITE_VENDOR_DEVICE;
1621 	req.bRequest = FTDI_SIO_SET_BITMODE;
1622 
1623 	USETW(req.wIndex, sc->sc_ucom.sc_portno);
1624 	USETW(req.wLength, 0);
1625 
1626 	if (bitmode == UFTDI_BITMODE_NONE)
1627 	    USETW2(req.wValue, 0, 0);
1628 	else
1629 	    USETW2(req.wValue, (1 << bitmode), iomask);
1630 
1631 	return (usbd_do_request(sc->sc_udev, &sc->sc_mtx, &req, NULL));
1632 }
1633 
1634 static int
1635 uftdi_get_bitmode(struct ucom_softc *ucom, uint8_t *iomask)
1636 {
1637 	struct uftdi_softc *sc = ucom->sc_parent;
1638 	usb_device_request_t req;
1639 
1640 	req.bmRequestType = UT_WRITE_VENDOR_DEVICE;
1641 	req.bRequest = FTDI_SIO_GET_BITMODE;
1642 
1643 	USETW(req.wIndex, sc->sc_ucom.sc_portno);
1644 	USETW(req.wLength, 1);
1645 	USETW(req.wValue,  0);
1646 
1647 	return (usbd_do_request(sc->sc_udev, &sc->sc_mtx, &req, iomask));
1648 }
1649 
1650 static int
1651 uftdi_set_latency(struct ucom_softc *ucom, int latency)
1652 {
1653 	struct uftdi_softc *sc = ucom->sc_parent;
1654 	usb_device_request_t req;
1655 
1656 	if (latency < 0 || latency > 255)
1657 		return (USB_ERR_INVAL);
1658 
1659 	req.bmRequestType = UT_WRITE_VENDOR_DEVICE;
1660 	req.bRequest = FTDI_SIO_SET_LATENCY;
1661 
1662 	USETW(req.wIndex, sc->sc_ucom.sc_portno);
1663 	USETW(req.wLength, 0);
1664 	USETW2(req.wValue, 0, latency);
1665 
1666 	return (usbd_do_request(sc->sc_udev, &sc->sc_mtx, &req, NULL));
1667 }
1668 
1669 static int
1670 uftdi_get_latency(struct ucom_softc *ucom, int *latency)
1671 {
1672 	struct uftdi_softc *sc = ucom->sc_parent;
1673 	usb_device_request_t req;
1674 	usb_error_t err;
1675 	uint8_t buf;
1676 
1677 	req.bmRequestType = UT_WRITE_VENDOR_DEVICE;
1678 	req.bRequest = FTDI_SIO_GET_LATENCY;
1679 
1680 	USETW(req.wIndex, sc->sc_ucom.sc_portno);
1681 	USETW(req.wLength, 1);
1682 	USETW(req.wValue, 0);
1683 
1684 	err = usbd_do_request(sc->sc_udev, &sc->sc_mtx, &req, &buf);
1685 	*latency = buf;
1686 
1687 	return (err);
1688 }
1689 
1690 static int
1691 uftdi_set_event_char(struct ucom_softc *ucom, int echar)
1692 {
1693 	struct uftdi_softc *sc = ucom->sc_parent;
1694 	usb_device_request_t req;
1695 	uint8_t enable;
1696 
1697 	enable = (echar == -1) ? 0 : 1;
1698 
1699 	req.bmRequestType = UT_WRITE_VENDOR_DEVICE;
1700 	req.bRequest = FTDI_SIO_SET_EVENT_CHAR;
1701 
1702 	USETW(req.wIndex, sc->sc_ucom.sc_portno);
1703 	USETW(req.wLength, 0);
1704 	USETW2(req.wValue, enable, echar & 0xff);
1705 
1706 	return (usbd_do_request(sc->sc_udev, &sc->sc_mtx, &req, NULL));
1707 }
1708 
1709 static int
1710 uftdi_set_error_char(struct ucom_softc *ucom, int echar)
1711 {
1712 	struct uftdi_softc *sc = ucom->sc_parent;
1713 	usb_device_request_t req;
1714 	uint8_t enable;
1715 
1716 	enable = (echar == -1) ? 0 : 1;
1717 
1718 	req.bmRequestType = UT_WRITE_VENDOR_DEVICE;
1719 	req.bRequest = FTDI_SIO_SET_ERROR_CHAR;
1720 
1721 	USETW(req.wIndex, sc->sc_ucom.sc_portno);
1722 	USETW(req.wLength, 0);
1723 	USETW2(req.wValue, enable, echar & 0xff);
1724 
1725 	return (usbd_do_request(sc->sc_udev, &sc->sc_mtx, &req, NULL));
1726 }
1727 
1728 static int
1729 uftdi_ioctl(struct ucom_softc *ucom, uint32_t cmd, caddr_t data,
1730     int flag, struct thread *td)
1731 {
1732 	struct uftdi_softc *sc = ucom->sc_parent;
1733 	int err;
1734 	struct uftdi_bitmode * mode;
1735 
1736 	DPRINTF("portno: %d cmd: %#x\n", ucom->sc_portno, cmd);
1737 
1738 	switch (cmd) {
1739 	case UFTDIIOC_RESET_IO:
1740 	case UFTDIIOC_RESET_RX:
1741 	case UFTDIIOC_RESET_TX:
1742 		err = uftdi_reset(ucom,
1743 		    cmd == UFTDIIOC_RESET_IO ? FTDI_SIO_RESET_SIO :
1744 		    (cmd == UFTDIIOC_RESET_RX ? FTDI_SIO_RESET_PURGE_RX :
1745 		    FTDI_SIO_RESET_PURGE_TX));
1746 		break;
1747 	case UFTDIIOC_SET_BITMODE:
1748 		mode = (struct uftdi_bitmode *)data;
1749 		err = uftdi_set_bitmode(ucom, mode->mode, mode->iomask);
1750 		break;
1751 	case UFTDIIOC_GET_BITMODE:
1752 		mode = (struct uftdi_bitmode *)data;
1753 		err = uftdi_get_bitmode(ucom, &mode->iomask);
1754 		break;
1755 	case UFTDIIOC_SET_LATENCY:
1756 		err = uftdi_set_latency(ucom, *((int *)data));
1757 		break;
1758 	case UFTDIIOC_GET_LATENCY:
1759 		err = uftdi_get_latency(ucom, (int *)data);
1760 		break;
1761 	case UFTDIIOC_SET_ERROR_CHAR:
1762 		err = uftdi_set_event_char(ucom, *(int *)data);
1763 		break;
1764 	case UFTDIIOC_SET_EVENT_CHAR:
1765 		err = uftdi_set_error_char(ucom, *(int *)data);
1766 	case UFTDIIOC_GET_HWREV:
1767 		*(int *)data = sc->sc_bcdDevice;
1768 		err = 0;
1769 		break;
1770 	default:
1771 		return (ENOIOCTL);
1772 	}
1773 	if (err != USB_ERR_NORMAL_COMPLETION)
1774 		return (EIO);
1775 	return (0);
1776 }
1777 
1778 static void
1779 uftdi_start_read(struct ucom_softc *ucom)
1780 {
1781 	struct uftdi_softc *sc = ucom->sc_parent;
1782 
1783 	usbd_transfer_start(sc->sc_xfer[UFTDI_BULK_DT_RD]);
1784 }
1785 
1786 static void
1787 uftdi_stop_read(struct ucom_softc *ucom)
1788 {
1789 	struct uftdi_softc *sc = ucom->sc_parent;
1790 
1791 	usbd_transfer_stop(sc->sc_xfer[UFTDI_BULK_DT_RD]);
1792 }
1793 
1794 static void
1795 uftdi_start_write(struct ucom_softc *ucom)
1796 {
1797 	struct uftdi_softc *sc = ucom->sc_parent;
1798 
1799 	usbd_transfer_start(sc->sc_xfer[UFTDI_BULK_DT_WR]);
1800 }
1801 
1802 static void
1803 uftdi_stop_write(struct ucom_softc *ucom)
1804 {
1805 	struct uftdi_softc *sc = ucom->sc_parent;
1806 
1807 	usbd_transfer_stop(sc->sc_xfer[UFTDI_BULK_DT_WR]);
1808 }
1809 
1810 static void
1811 uftdi_poll(struct ucom_softc *ucom)
1812 {
1813 	struct uftdi_softc *sc = ucom->sc_parent;
1814 
1815 	usbd_transfer_poll(sc->sc_xfer, UFTDI_N_TRANSFER);
1816 }
1817