qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH 31/32] usbredir: Add support for buffered bulk i


From: Blue Swirl
Subject: Re: [Qemu-devel] [PATCH 31/32] usbredir: Add support for buffered bulk input (v2)
Date: Wed, 9 Jan 2013 20:52:21 +0000

On Tue, Jan 8, 2013 at 1:14 PM, Gerd Hoffmann <address@hidden> wrote:
> From: Hans de Goede <address@hidden>
>
> Buffered bulk mode is intended for bulk *input* endpoints, where the data is
> of a streaming nature (not part of a command-response protocol). These
> endpoints' input buffer may overflow if data is not read quickly enough.
> So in buffered bulk mode the usb-host takes care of the submitting and
> re-submitting of bulk transfers.
>
> Buffered bulk mode is necessary for reliable operation with the bulk in
> endpoints of usb to serial convertors. Unfortunatelty buffered bulk input
> mode will only work with certain devices, therefor this patch also adds a
> usb-id table to enable it for devices which need it, while leaving the
> bulk ep handling for other devices unmodified.
>
> Note that the bumping of the required usbredir from 0.5.3 to 0.6 does
> not mean that we will now need a newer usbredir release then qemu-1.3,
> .pc files reporting 0.5.3 have only ever existed in usbredir builds directly
> from git, so qemu-1.3 needs the 0.6 release too.
>
> Changes in v2:
> -Split of quirk handling into quirks.c
>
> Signed-off-by: Hans de Goede <address@hidden>
> ---
>  configure                  |    2 +-
>  hw/usb.h                   |   12 +-
>  hw/usb/Makefile.objs       |    2 +-
>  hw/usb/quirks-ftdi-ids.h   | 1255 
> ++++++++++++++++++++++++++++++++++++++++++++
>  hw/usb/quirks-pl2303-ids.h |  150 ++++++
>  hw/usb/quirks.c            |   53 ++
>  hw/usb/quirks.h            |  910 ++++++++++++++++++++++++++++++++
>  hw/usb/redirect.c          |  355 ++++++++++++-
>  8 files changed, 2718 insertions(+), 21 deletions(-)
>  create mode 100644 hw/usb/quirks-ftdi-ids.h
>  create mode 100644 hw/usb/quirks-pl2303-ids.h
>  create mode 100644 hw/usb/quirks.c
>  create mode 100644 hw/usb/quirks.h
>
> diff --git a/configure b/configure
> index fe18ed2..82f6e71 100755
> --- a/configure
> +++ b/configure
> @@ -2851,7 +2851,7 @@ fi
>
>  # check for usbredirparser for usb network redirection support
>  if test "$usb_redir" != "no" ; then
> -    if $pkg_config --atleast-version=0.5.3 libusbredirparser-0.5 >/dev/null 
> 2>&1 ; then
> +    if $pkg_config --atleast-version=0.6 libusbredirparser-0.5 >/dev/null 
> 2>&1 ; then
>          usb_redir="yes"
>          usb_redir_cflags=$($pkg_config --cflags libusbredirparser-0.5 
> 2>/dev/null)
>          usb_redir_libs=$($pkg_config --libs libusbredirparser-0.5 
> 2>/dev/null)
> diff --git a/hw/usb.h b/hw/usb.h
> index aca8ff6..50c297f 100644
> --- a/hw/usb.h
> +++ b/hw/usb.h
> @@ -553,5 +553,15 @@ const USBDesc *usb_device_get_usb_desc(USBDevice *dev);
>
>  int ehci_create_ich9_with_companions(PCIBus *bus, int slot);
>
> -#endif
> +/* quirks.c */
> +
> +/* In bulk endpoints are streaming data sources (iow behave like isoc eps) */
> +#define USB_QUIRK_BUFFER_BULK_IN       0x01
> +/* Bulk pkts in FTDI format, need special handling when combining packets */
> +#define USB_QUIRK_IS_FTDI              0x02
>
> +int usb_get_quirks(uint16_t vendor_id, uint16_t product_id,
> +                   uint8_t interface_class, uint8_t interface_subclass,
> +                   uint8_t interface_protocol);
> +
> +#endif
> diff --git a/hw/usb/Makefile.objs b/hw/usb/Makefile.objs
> index 5a4eeb6..dad4cb9 100644
> --- a/hw/usb/Makefile.objs
> +++ b/hw/usb/Makefile.objs
> @@ -5,7 +5,7 @@ common-obj-$(CONFIG_USB_XHCI) += hcd-xhci.o
>  common-obj-y += libhw.o
>
>  common-obj-$(CONFIG_SMARTCARD) += dev-smartcard-reader.o
> -common-obj-$(CONFIG_USB_REDIR) += redirect.o
> +common-obj-$(CONFIG_USB_REDIR) += redirect.o quirks.o
>
>  common-obj-y += core.o combined-packet.o bus.o desc.o dev-hub.o
>  common-obj-y += host-$(HOST_USB).o dev-bluetooth.o
> diff --git a/hw/usb/quirks-ftdi-ids.h b/hw/usb/quirks-ftdi-ids.h
> new file mode 100644
> index 0000000..57c12ef
> --- /dev/null
> +++ b/hw/usb/quirks-ftdi-ids.h
> @@ -0,0 +1,1255 @@
> +/*
> + * vendor/product IDs (VID/PID) of devices using FTDI USB serial converters.
> + * Please keep numerically sorted within individual areas, thanks!
> + *
> + * Philipp Gühring - address@hidden - added the Device ID of the USB relais
> + * from Rudolf Gugler

License information is missing.

Where is this file coming from, Linux? Should we use linux-headers instead?

> + *
> + */
> +
> +
> +/**********************************/
> +/***** devices using FTDI VID *****/
> +/**********************************/
> +
> +
> +#define FTDI_VID       0x0403  /* Vendor Id */
> +
> +
> +/*** "original" FTDI device PIDs ***/
> +
> +#define FTDI_8U232AM_PID 0x6001 /* Similar device to SIO above */
> +#define FTDI_8U232AM_ALT_PID 0x6006 /* FTDI's alternate PID for above */
> +#define FTDI_8U2232C_PID 0x6010 /* Dual channel device */
> +#define FTDI_4232H_PID 0x6011 /* Quad channel hi-speed device */
> +#define FTDI_232H_PID  0x6014 /* Single channel hi-speed device */
> +#define FTDI_FTX_PID   0x6015 /* FT-X series (FT201X, FT230X, FT231X, etc) */
> +#define FTDI_SIO_PID   0x8372  /* Product Id SIO application of 8U100AX */
> +#define FTDI_232RL_PID  0xFBFA  /* Product ID for FT232RL */
> +
> +
> +/*** third-party PIDs (using FTDI_VID) ***/
> +
> +#define FTDI_LUMEL_PD12_PID    0x6002
> +
> +/*
> + * Marvell OpenRD Base, Client
> + * http://www.open-rd.org
> + * OpenRD Base, Client use VID 0x0403
> + */
> +#define MARVELL_OPENRD_PID     0x9e90
> +
> +/* www.candapter.com Ewert Energy Systems CANdapter device */
> +#define FTDI_CANDAPTER_PID 0x9F80 /* Product Id */
> +
> +/*
> + * Texas Instruments XDS100v2 JTAG / BeagleBone A3
> + * http://processors.wiki.ti.com/index.php/XDS100
> + * http://beagleboard.org/bone
> + */
> +#define TI_XDS100V2_PID                0xa6d0
> +
> +#define FTDI_NXTCAM_PID                0xABB8 /* NXTCam for Mindstorms NXT */
> +
> +/* US Interface Navigator (http://www.usinterface.com/) */
> +#define FTDI_USINT_CAT_PID     0xb810  /* Navigator CAT and 2nd PTT lines */
> +#define FTDI_USINT_WKEY_PID    0xb811  /* Navigator WKEY and FSK lines */
> +#define FTDI_USINT_RS232_PID   0xb812  /* Navigator RS232 and CONFIG lines */
> +
> +/* OOCDlink by Joern Kaipf <address@hidden>
> + * (http://www.joernonline.de/) */
> +#define FTDI_OOCDLINK_PID      0xbaf8  /* Amontec JTAGkey */
> +
> +/* Luminary Micro Stellaris Boards, VID = FTDI_VID */
> +/* FTDI 2332C Dual channel device, side A=245 FIFO (JTAG), Side B=RS232 UART 
> */
> +#define LMI_LM3S_DEVEL_BOARD_PID       0xbcd8
> +#define LMI_LM3S_EVAL_BOARD_PID                0xbcd9
> +#define LMI_LM3S_ICDI_BOARD_PID                0xbcda
> +
> +#define FTDI_TURTELIZER_PID    0xBDC8 /* JTAG/RS-232 adapter by egnite GmbH 
> */
> +
> +/* OpenDCC (www.opendcc.de) product id */
> +#define FTDI_OPENDCC_PID       0xBFD8
> +#define FTDI_OPENDCC_SNIFFER_PID       0xBFD9
> +#define FTDI_OPENDCC_THROTTLE_PID      0xBFDA
> +#define FTDI_OPENDCC_GATEWAY_PID       0xBFDB
> +#define FTDI_OPENDCC_GBM_PID   0xBFDC
> +
> +/* NZR SEM 16+ USB (http://www.nzr.de) */
> +#define FTDI_NZR_SEM_USB_PID   0xC1E0  /* NZR SEM-LOG16+ */
> +
> +/*
> + * RR-CirKits LocoBuffer USB (http://www.rr-cirkits.com)
> + */
> +#define FTDI_RRCIRKITS_LOCOBUFFER_PID  0xc7d0  /* LocoBuffer USB */
> +
> +/* DMX4ALL DMX Interfaces */
> +#define FTDI_DMX4ALL 0xC850
> +
> +/*
> + * ASK.fr devices
> + */
> +#define FTDI_ASK_RDR400_PID    0xC991  /* ASK RDR 400 series card reader */
> +
> +/* www.starting-point-systems.com µChameleon device */
> +#define FTDI_MICRO_CHAMELEON_PID       0xCAA0  /* Product Id */
> +
> +/*
> + * Tactrix OpenPort (ECU) devices.
> + * OpenPort 1.3M submitted by Donour Sizemore.
> + * OpenPort 1.3S and 1.3U submitted by Ian Abbott.
> + */
> +#define FTDI_TACTRIX_OPENPORT_13M_PID  0xCC48  /* OpenPort 1.3 Mitsubishi */
> +#define FTDI_TACTRIX_OPENPORT_13S_PID  0xCC49  /* OpenPort 1.3 Subaru */
> +#define FTDI_TACTRIX_OPENPORT_13U_PID  0xCC4A  /* OpenPort 1.3 Universal */
> +
> +#define FTDI_DISTORTEC_JTAG_LOCK_PICK_PID      0xCFF8
> +
> +/* SCS HF Radio Modems PID's (http://www.scs-ptc.com) */
> +/* the VID is the standard ftdi vid (FTDI_VID) */
> +#define FTDI_SCS_DEVICE_0_PID 0xD010    /* SCS PTC-IIusb */
> +#define FTDI_SCS_DEVICE_1_PID 0xD011    /* SCS Tracker / DSP TNC */
> +#define FTDI_SCS_DEVICE_2_PID 0xD012
> +#define FTDI_SCS_DEVICE_3_PID 0xD013
> +#define FTDI_SCS_DEVICE_4_PID 0xD014
> +#define FTDI_SCS_DEVICE_5_PID 0xD015
> +#define FTDI_SCS_DEVICE_6_PID 0xD016
> +#define FTDI_SCS_DEVICE_7_PID 0xD017
> +
> +/* iPlus device */
> +#define FTDI_IPLUS_PID 0xD070 /* Product Id */
> +#define FTDI_IPLUS2_PID 0xD071 /* Product Id */
> +
> +/*
> + * Gamma Scout (http://gamma-scout.com/). Submitted by address@hidden
> + */
> +#define FTDI_GAMMA_SCOUT_PID           0xD678  /* Gamma Scout online */
> +
> +/* Propox devices */
> +#define FTDI_PROPOX_JTAGCABLEII_PID    0xD738
> +#define FTDI_PROPOX_ISPCABLEIII_PID    0xD739
> +
> +/* Lenz LI-USB Computer Interface. */
> +#define FTDI_LENZ_LIUSB_PID    0xD780
> +
> +/* Vardaan Enterprises Serial Interface VEUSB422R3 */
> +#define FTDI_VARDAAN_PID       0xF070
> +
> +/*
> + * Xsens Technologies BV products (http://www.xsens.com).
> + */
> +#define XSENS_CONVERTER_0_PID  0xD388
> +#define XSENS_CONVERTER_1_PID  0xD389
> +#define XSENS_CONVERTER_2_PID  0xD38A
> +#define XSENS_CONVERTER_3_PID  0xD38B
> +#define XSENS_CONVERTER_4_PID  0xD38C
> +#define XSENS_CONVERTER_5_PID  0xD38D
> +#define XSENS_CONVERTER_6_PID  0xD38E
> +#define XSENS_CONVERTER_7_PID  0xD38F
> +
> +/*
> + * NDI (www.ndigital.com) product ids
> + */
> +#define FTDI_NDI_HUC_PID               0xDA70  /* NDI Host USB Converter */
> +#define FTDI_NDI_SPECTRA_SCU_PID       0xDA71  /* NDI Spectra SCU */
> +#define FTDI_NDI_FUTURE_2_PID          0xDA72  /* NDI future device #2 */
> +#define FTDI_NDI_FUTURE_3_PID          0xDA73  /* NDI future device #3 */
> +#define FTDI_NDI_AURORA_SCU_PID                0xDA74  /* NDI Aurora SCU */
> +
> +/*
> + * ChamSys Limited (www.chamsys.co.uk) USB wing/interface product IDs
> + */
> +#define FTDI_CHAMSYS_24_MASTER_WING_PID        0xDAF8
> +#define FTDI_CHAMSYS_PC_WING_PID       0xDAF9
> +#define FTDI_CHAMSYS_USB_DMX_PID       0xDAFA
> +#define FTDI_CHAMSYS_MIDI_TIMECODE_PID 0xDAFB
> +#define FTDI_CHAMSYS_MINI_WING_PID     0xDAFC
> +#define FTDI_CHAMSYS_MAXI_WING_PID     0xDAFD
> +#define FTDI_CHAMSYS_MEDIA_WING_PID    0xDAFE
> +#define FTDI_CHAMSYS_WING_PID  0xDAFF
> +
> +/*
> + * Westrex International devices submitted by Cory Lee
> + */
> +#define FTDI_WESTREX_MODEL_777_PID     0xDC00  /* Model 777 */
> +#define FTDI_WESTREX_MODEL_8900F_PID   0xDC01  /* Model 8900F */
> +
> +/*
> + * ACG Identification Technologies GmbH products (http://www.acg.de/).
> + * Submitted by anton -at- goto10 -dot- org.
> + */
> +#define FTDI_ACG_HFDUAL_PID            0xDD20  /* HF Dual ISO Reader (RFID) 
> */
> +
> +/*
> + * Definitions for Artemis astronomical USB based cameras
> + * Check it at http://www.artemisccd.co.uk/
> + */
> +#define FTDI_ARTEMIS_PID       0xDF28  /* All Artemis Cameras */
> +
> +/*
> + * Definitions for ATIK Instruments astronomical USB based cameras
> + * Check it at http://www.atik-instruments.com/
> + */
> +#define FTDI_ATIK_ATK16_PID    0xDF30  /* ATIK ATK-16 Grayscale Camera */
> +#define FTDI_ATIK_ATK16C_PID   0xDF32  /* ATIK ATK-16C Colour Camera */
> +#define FTDI_ATIK_ATK16HR_PID  0xDF31  /* ATIK ATK-16HR Grayscale Camera */
> +#define FTDI_ATIK_ATK16HRC_PID 0xDF33  /* ATIK ATK-16HRC Colour Camera */
> +#define FTDI_ATIK_ATK16IC_PID   0xDF35  /* ATIK ATK-16IC Grayscale Camera */
> +
> +/*
> + * Yost Engineering, Inc. products (www.yostengineering.com).
> + * PID 0xE050 submitted by Aaron Prose.
> + */
> +#define FTDI_YEI_SERVOCENTER31_PID     0xE050  /* YEI ServoCenter3.1 USB */
> +
> +/*
> + * ELV USB devices submitted by Christian Abt of ELV (www.elv.de).
> + * All of these devices use FTDI's vendor ID (0x0403).
> + * Further IDs taken from ELV Windows .inf file.
> + *
> + * The previously included PID for the UO 100 module was incorrect.
> + * In fact, that PID was for ELV's UR 100 USB-RS232 converter (0xFB58).
> + *
> + * Armin Laeuger originally sent the PID for the UM 100 module.
> + */
> +#define FTDI_ELV_USR_PID       0xE000  /* ELV Universal-Sound-Recorder */
> +#define FTDI_ELV_MSM1_PID      0xE001  /* ELV Mini-Sound-Modul */
> +#define FTDI_ELV_KL100_PID     0xE002  /* ELV Kfz-Leistungsmesser KL 100 */
> +#define FTDI_ELV_WS550_PID     0xE004  /* WS 550 */
> +#define FTDI_ELV_EC3000_PID    0xE006  /* ENERGY CONTROL 3000 USB */
> +#define FTDI_ELV_WS888_PID     0xE008  /* WS 888 */
> +#define FTDI_ELV_TWS550_PID    0xE009  /* Technoline WS 550 */
> +#define FTDI_ELV_FEM_PID       0xE00A  /* Funk Energie Monitor */
> +#define FTDI_ELV_FHZ1300PC_PID 0xE0E8  /* FHZ 1300 PC */
> +#define FTDI_ELV_WS500_PID     0xE0E9  /* PC-Wetterstation (WS 500) */
> +#define FTDI_ELV_HS485_PID     0xE0EA  /* USB to RS-485 adapter */
> +#define FTDI_ELV_UMS100_PID    0xE0EB  /* ELV USB Master-Slave 
> Schaltsteckdose UMS 100 */
> +#define FTDI_ELV_TFD128_PID    0xE0EC  /* ELV Temperatur-Feuchte-Datenlogger 
> TFD 128 */
> +#define FTDI_ELV_FM3RX_PID     0xE0ED  /* ELV Messwertuebertragung FM3 RX */
> +#define FTDI_ELV_WS777_PID     0xE0EE  /* Conrad WS 777 */
> +#define FTDI_ELV_EM1010PC_PID  0xE0EF  /* Energy monitor EM 1010 PC */
> +#define FTDI_ELV_CSI8_PID      0xE0F0  /* Computer-Schalt-Interface (CSI 8) 
> */
> +#define FTDI_ELV_EM1000DL_PID  0xE0F1  /* PC-Datenlogger fuer Energiemonitor 
> (EM 1000 DL) */
> +#define FTDI_ELV_PCK100_PID    0xE0F2  /* PC-Kabeltester (PCK 100) */
> +#define FTDI_ELV_RFP500_PID    0xE0F3  /* HF-Leistungsmesser (RFP 500) */
> +#define FTDI_ELV_FS20SIG_PID   0xE0F4  /* Signalgeber (FS 20 SIG) */
> +#define FTDI_ELV_UTP8_PID      0xE0F5  /* ELV UTP 8 */
> +#define FTDI_ELV_WS300PC_PID   0xE0F6  /* PC-Wetterstation (WS 300 PC) */
> +#define FTDI_ELV_WS444PC_PID   0xE0F7  /* Conrad WS 444 PC */
> +#define FTDI_PHI_FISCO_PID      0xE40B  /* PHI Fisco USB to Serial cable */
> +#define FTDI_ELV_UAD8_PID      0xF068  /* USB-AD-Wandler (UAD 8) */
> +#define FTDI_ELV_UDA7_PID      0xF069  /* USB-DA-Wandler (UDA 7) */
> +#define FTDI_ELV_USI2_PID      0xF06A  /* USB-Schrittmotoren-Interface (USI 
> 2) */
> +#define FTDI_ELV_T1100_PID     0xF06B  /* Thermometer (T 1100) */
> +#define FTDI_ELV_PCD200_PID    0xF06C  /* PC-Datenlogger (PCD 200) */
> +#define FTDI_ELV_ULA200_PID    0xF06D  /* USB-LCD-Ansteuerung (ULA 200) */
> +#define FTDI_ELV_ALC8500_PID   0xF06E  /* ALC 8500 Expert */
> +#define FTDI_ELV_FHZ1000PC_PID 0xF06F  /* FHZ 1000 PC */
> +#define FTDI_ELV_UR100_PID     0xFB58  /* USB-RS232-Umsetzer (UR 100) */
> +#define FTDI_ELV_UM100_PID     0xFB5A  /* USB-Modul UM 100 */
> +#define FTDI_ELV_UO100_PID     0xFB5B  /* USB-Modul UO 100 */
> +/* Additional ELV PIDs that default to using the FTDI D2XX drivers on
> + * MS Windows, rather than the FTDI Virtual Com Port drivers.
> + * Maybe these will be easier to use with the libftdi/libusb user-space
> + * drivers, or possibly the Comedi drivers in some cases. */
> +#define FTDI_ELV_CLI7000_PID   0xFB59  /* Computer-Light-Interface (CLI 
> 7000) */
> +#define FTDI_ELV_PPS7330_PID   0xFB5C  /* Processor-Power-Supply (PPS 7330) 
> */
> +#define FTDI_ELV_TFM100_PID    0xFB5D  /* Temperatur-Feuchte-Messgeraet (TFM 
> 100) */
> +#define FTDI_ELV_UDF77_PID     0xFB5E  /* USB DCF Funkuhr (UDF 77) */
> +#define FTDI_ELV_UIO88_PID     0xFB5F  /* USB-I/O Interface (UIO 88) */
> +
> +/*
> + * EVER Eco Pro UPS (http://www.ever.com.pl/)
> + */
> +
> +#define        EVER_ECO_PRO_CDS        0xe520  /* RS-232 converter */
> +
> +/*
> + * Active Robots product ids.
> + */
> +#define FTDI_ACTIVE_ROBOTS_PID 0xE548  /* USB comms board */
> +
> +/* Pyramid Computer GmbH */
> +#define FTDI_PYRAMID_PID       0xE6C8  /* Pyramid Appliance Display */
> +
> +/* www.elsterelectricity.com Elster Unicom III Optical Probe */
> +#define FTDI_ELSTER_UNICOM_PID         0xE700 /* Product Id */
> +
> +/*
> + * Gude Analog- und Digitalsysteme GmbH
> + */
> +#define FTDI_GUDEADS_E808_PID    0xE808
> +#define FTDI_GUDEADS_E809_PID    0xE809
> +#define FTDI_GUDEADS_E80A_PID    0xE80A
> +#define FTDI_GUDEADS_E80B_PID    0xE80B
> +#define FTDI_GUDEADS_E80C_PID    0xE80C
> +#define FTDI_GUDEADS_E80D_PID    0xE80D
> +#define FTDI_GUDEADS_E80E_PID    0xE80E
> +#define FTDI_GUDEADS_E80F_PID    0xE80F
> +#define FTDI_GUDEADS_E888_PID    0xE888  /* Expert ISDN Control USB */
> +#define FTDI_GUDEADS_E889_PID    0xE889  /* USB RS-232 OptoBridge */
> +#define FTDI_GUDEADS_E88A_PID    0xE88A
> +#define FTDI_GUDEADS_E88B_PID    0xE88B
> +#define FTDI_GUDEADS_E88C_PID    0xE88C
> +#define FTDI_GUDEADS_E88D_PID    0xE88D
> +#define FTDI_GUDEADS_E88E_PID    0xE88E
> +#define FTDI_GUDEADS_E88F_PID    0xE88F
> +
> +/*
> + * Eclo (http://www.eclo.pt/) product IDs.
> + * PID 0xEA90 submitted by Martin Grill.
> + */
> +#define FTDI_ECLO_COM_1WIRE_PID        0xEA90  /* COM to 1-Wire USB adaptor 
> */
> +
> +/* TNC-X USB-to-packet-radio adapter, versions prior to 3.0 (DLP module) */
> +#define FTDI_TNC_X_PID         0xEBE0
> +
> +/*
> + * Teratronik product ids.
> + * Submitted by O. Wölfelschneider.
> + */
> +#define FTDI_TERATRONIK_VCP_PID         0xEC88 /* Teratronik device 
> (preferring VCP driver on windows) */
> +#define FTDI_TERATRONIK_D2XX_PID 0xEC89        /* Teratronik device 
> (preferring D2XX driver on windows) */
> +
> +/* Rig Expert Ukraine devices */
> +#define FTDI_REU_TINY_PID              0xED22  /* RigExpert Tiny */
> +
> +/*
> + * Hameg HO820 and HO870 interface (using VID 0x0403)
> + */
> +#define HAMEG_HO820_PID                        0xed74
> +#define HAMEG_HO730_PID                        0xed73
> +#define HAMEG_HO720_PID                        0xed72
> +#define HAMEG_HO870_PID                        0xed71
> +
> +/*
> + *  MaxStream devices  www.maxstream.net
> + */
> +#define FTDI_MAXSTREAM_PID     0xEE18  /* Xbee PKG-U Module */
> +
> +/*
> + * microHAM product IDs (http://www.microham.com).
> + * Submitted by Justin Burket (KL1RL) <address@hidden>
> + * and Mike Studer (K6EEP) <address@hidden>.
> + * Ian Abbott <address@hidden> added a few more from the driver INF file.
> + */
> +#define FTDI_MHAM_KW_PID       0xEEE8  /* USB-KW interface */
> +#define FTDI_MHAM_YS_PID       0xEEE9  /* USB-YS interface */
> +#define FTDI_MHAM_Y6_PID       0xEEEA  /* USB-Y6 interface */
> +#define FTDI_MHAM_Y8_PID       0xEEEB  /* USB-Y8 interface */
> +#define FTDI_MHAM_IC_PID       0xEEEC  /* USB-IC interface */
> +#define FTDI_MHAM_DB9_PID      0xEEED  /* USB-DB9 interface */
> +#define FTDI_MHAM_RS232_PID    0xEEEE  /* USB-RS232 interface */
> +#define FTDI_MHAM_Y9_PID       0xEEEF  /* USB-Y9 interface */
> +
> +/* Domintell products  http://www.domintell.com */
> +#define FTDI_DOMINTELL_DGQG_PID        0xEF50  /* Master */
> +#define FTDI_DOMINTELL_DUSB_PID        0xEF51  /* DUSB01 module */
> +
> +/*
> + * The following are the values for the Perle Systems
> + * UltraPort USB serial converters
> + */
> +#define FTDI_PERLE_ULTRAPORT_PID 0xF0C0        /* Perle UltraPort Product Id 
> */
> +
> +/* Sprog II (Andrew Crosland's SprogII DCC interface) */
> +#define FTDI_SPROG_II          0xF0C8
> +
> +/* an infrared receiver for user access control with IR tags */
> +#define FTDI_PIEGROUP_PID      0xF208  /* Product Id */
> +
> +/* ACT Solutions HomePro ZWave interface
> +   (http://www.act-solutions.com/HomePro-Product-Matrix.html) */
> +#define FTDI_ACTZWAVE_PID      0xF2D0
> +
> +/*
> + * 4N-GALAXY.DE PIDs for CAN-USB, USB-RS232, USB-RS422, USB-RS485,
> + * USB-TTY aktiv, USB-TTY passiv.  Some PIDs are used by several devices
> + * and I'm not entirely sure which are used by which.
> + */
> +#define FTDI_4N_GALAXY_DE_1_PID        0xF3C0
> +#define FTDI_4N_GALAXY_DE_2_PID        0xF3C1
> +#define FTDI_4N_GALAXY_DE_3_PID        0xF3C2
> +
> +/*
> + * Linx Technologies product ids
> + */
> +#define LINX_SDMUSBQSS_PID     0xF448  /* Linx SDM-USB-QS-S */
> +#define LINX_MASTERDEVEL2_PID   0xF449 /* Linx Master Development 2.0 */
> +#define LINX_FUTURE_0_PID   0xF44A     /* Linx future device */
> +#define LINX_FUTURE_1_PID   0xF44B     /* Linx future device */
> +#define LINX_FUTURE_2_PID   0xF44C     /* Linx future device */
> +
> +/*
> + * Oceanic product ids
> + */
> +#define FTDI_OCEANIC_PID       0xF460  /* Oceanic dive instrument */
> +
> +/*
> + * SUUNTO product ids
> + */
> +#define FTDI_SUUNTO_SPORTS_PID 0xF680  /* Suunto Sports instrument */
> +
> +/* USB-UIRT - An infrared receiver and transmitter using the 8U232AM chip */
> +/* http://www.usbuirt.com/ */
> +#define FTDI_USB_UIRT_PID      0xF850  /* Product Id */
> +
> +/* CCS Inc. ICDU/ICDU40 product ID -
> + * the FT232BM is used in an in-circuit-debugger unit for PIC16's/PIC18's */
> +#define FTDI_CCSICDU20_0_PID    0xF9D0
> +#define FTDI_CCSICDU40_1_PID    0xF9D1
> +#define FTDI_CCSMACHX_2_PID     0xF9D2
> +#define FTDI_CCSLOAD_N_GO_3_PID 0xF9D3
> +#define FTDI_CCSICDU64_4_PID    0xF9D4
> +#define FTDI_CCSPRIME8_5_PID    0xF9D5
> +
> +/*
> + * The following are the values for the Matrix Orbital LCD displays,
> + * which are the FT232BM ( similar to the 8U232AM )
> + */
> +#define FTDI_MTXORB_0_PID      0xFA00  /* Matrix Orbital Product Id */
> +#define FTDI_MTXORB_1_PID      0xFA01  /* Matrix Orbital Product Id */
> +#define FTDI_MTXORB_2_PID      0xFA02  /* Matrix Orbital Product Id */
> +#define FTDI_MTXORB_3_PID      0xFA03  /* Matrix Orbital Product Id */
> +#define FTDI_MTXORB_4_PID      0xFA04  /* Matrix Orbital Product Id */
> +#define FTDI_MTXORB_5_PID      0xFA05  /* Matrix Orbital Product Id */
> +#define FTDI_MTXORB_6_PID      0xFA06  /* Matrix Orbital Product Id */
> +
> +/*
> + * Home Electronics (www.home-electro.com) USB gadgets
> + */
> +#define FTDI_HE_TIRA1_PID      0xFA78  /* Tira-1 IR transceiver */
> +
> +/* Inside Accesso contactless reader (http://www.insidecontactless.com/) */
> +#define INSIDE_ACCESSO         0xFAD0
> +
> +/*
> + * ThorLabs USB motor drivers
> + */
> +#define FTDI_THORLABS_PID              0xfaf0 /* ThorLabs USB motor drivers 
> */
> +
> +/*
> + * Protego product ids
> + */
> +#define PROTEGO_SPECIAL_1      0xFC70  /* special/unknown device */
> +#define PROTEGO_R2X0           0xFC71  /* R200-USB TRNG unit (R210, R220, 
> and R230) */
> +#define PROTEGO_SPECIAL_3      0xFC72  /* special/unknown device */
> +#define PROTEGO_SPECIAL_4      0xFC73  /* special/unknown device */
> +
> +/*
> + * Sony Ericsson product ids
> + */
> +#define FTDI_DSS20_PID         0xFC82  /* DSS-20 Sync Station for Sony 
> Ericsson P800 */
> +#define FTDI_URBAN_0_PID       0xFC8A  /* Sony Ericsson Urban, uart #0 */
> +#define FTDI_URBAN_1_PID       0xFC8B  /* Sony Ericsson Urban, uart #1 */
> +
> +/* www.irtrans.de device */
> +#define FTDI_IRTRANS_PID 0xFC60 /* Product Id */
> +
> +/*
> + * RM Michaelides CANview USB (http://www.rmcan.com) (FTDI_VID)
> + * CAN fieldbus interface adapter, added by port GmbH www.port.de)
> + * Ian Abbott changed the macro names for consistency.
> + */
> +#define FTDI_RM_CANVIEW_PID    0xfd60  /* Product Id */
> +/* www.thoughttechnology.com/ TT-USB provide with procomp use ftdi_sio */
> +#define FTDI_TTUSB_PID 0xFF20 /* Product Id */
> +
> +#define FTDI_USBX_707_PID 0xF857       /* ADSTech IR Blaster USBX-707 
> (FTDI_VID) */
> +
> +#define FTDI_RELAIS_PID        0xFA10  /* Relais device from Rudolf Gugler */
> +
> +/*
> + * PCDJ use ftdi based dj-controllers. The following PID is
> + * for their DAC-2 device http://www.pcdjhardware.com/DAC2.asp
> + * (the VID is the standard ftdi vid (FTDI_VID), PID sent by Wouter Paesen)
> + */
> +#define FTDI_PCDJ_DAC2_PID 0xFA88
> +
> +#define FTDI_R2000KU_TRUE_RNG  0xFB80  /* R2000KU TRUE RNG (FTDI_VID) */
> +
> +/*
> + * DIEBOLD BCS SE923 (FTDI_VID)
> + */
> +#define DIEBOLD_BCS_SE923_PID  0xfb99
> +
> +/* www.crystalfontz.com devices
> + * - thanx for providing free devices for evaluation !
> + * they use the ftdi chipset for the USB interface
> + * and the vendor id is the same
> + */
> +#define FTDI_XF_632_PID 0xFC08 /* 632: 16x2 Character Display */
> +#define FTDI_XF_634_PID 0xFC09 /* 634: 20x4 Character Display */
> +#define FTDI_XF_547_PID 0xFC0A /* 547: Two line Display */
> +#define FTDI_XF_633_PID 0xFC0B /* 633: 16x2 Character Display with Keys */
> +#define FTDI_XF_631_PID 0xFC0C /* 631: 20x2 Character Display */
> +#define FTDI_XF_635_PID 0xFC0D /* 635: 20x4 Character Display */
> +#define FTDI_XF_640_PID 0xFC0E /* 640: Two line Display */
> +#define FTDI_XF_642_PID 0xFC0F /* 642: Two line Display */
> +
> +/*
> + * Video Networks Limited / Homechoice in the UK use an ftdi-based device
> + * for their 1Mb broadband internet service.  The following PID is exhibited
> + * by the usb device supplied (the VID is the standard ftdi vid (FTDI_VID)
> + */
> +#define FTDI_VNHCPCUSB_D_PID 0xfe38 /* Product Id */
> +
> +/* AlphaMicro Components AMC-232USB01 device (FTDI_VID) */
> +#define FTDI_AMC232_PID 0xFF00 /* Product Id */
> +
> +/*
> + * IBS elektronik product ids (FTDI_VID)
> + * Submitted by Thomas Schleusener
> + */
> +#define FTDI_IBS_US485_PID     0xff38  /* IBS US485 (USB<-->RS422/485 
> interface) */
> +#define FTDI_IBS_PICPRO_PID    0xff39  /* IBS PIC-Programmer */
> +#define FTDI_IBS_PCMCIA_PID    0xff3a  /* IBS Card reader for PCMCIA 
> SRAM-cards */
> +#define FTDI_IBS_PK1_PID       0xff3b  /* IBS PK1 - Particel counter */
> +#define FTDI_IBS_RS232MON_PID  0xff3c  /* IBS RS232 - Monitor */
> +#define FTDI_IBS_APP70_PID     0xff3d  /* APP 70 (dust monitoring system) */
> +#define FTDI_IBS_PEDO_PID      0xff3e  /* IBS PEDO-Modem (RF modem 868.35 
> MHz) */
> +#define FTDI_IBS_PROD_PID      0xff3f  /* future device */
> +/* www.canusb.com Lawicel CANUSB device (FTDI_VID) */
> +#define FTDI_CANUSB_PID 0xFFA8 /* Product Id */
> +
> +/*
> + * TavIR AVR product ids (FTDI_VID)
> + */
> +#define FTDI_TAVIR_STK500_PID  0xFA33  /* STK500 AVR programmer */
> +
> +/*
> + * TIAO product ids (FTDI_VID)
> + * http://www.tiaowiki.com/w/Main_Page
> + */
> +#define FTDI_TIAO_UMPA_PID     0x8a98  /* TIAO/DIYGADGET USB Multi-Protocol 
> Adapter */
> +
> +
> +/********************************/
> +/** third-party VID/PID combos **/
> +/********************************/
> +
> +
> +
> +/*
> + * Atmel STK541
> + */
> +#define ATMEL_VID              0x03eb /* Vendor ID */
> +#define STK541_PID             0x2109 /* Zigbee Controller */
> +
> +/*
> + * Blackfin gnICE JTAG
> + * http://docs.blackfin.uclinux.org/doku.php?id=hw:jtag:gnice
> + */
> +#define ADI_VID                        0x0456
> +#define ADI_GNICE_PID          0xF000
> +#define ADI_GNICEPLUS_PID      0xF001
> +
> +/*
> + * Microchip Technology, Inc.
> + *
> + * MICROCHIP_VID (0x04D8) and MICROCHIP_USB_BOARD_PID (0x000A) are
> + * used by single function CDC ACM class based firmware demo
> + * applications.  The VID/PID has also been used in firmware
> + * emulating FTDI serial chips by:
> + * Hornby Elite - Digital Command Control Console
> + * http://www.hornby.com/hornby-dcc/controllers/
> + */
> +#define MICROCHIP_VID          0x04D8
> +#define MICROCHIP_USB_BOARD_PID        0x000A /* CDC RS-232 Emulation Demo */
> +
> +/*
> + * RATOC REX-USB60F
> + */
> +#define RATOC_VENDOR_ID                0x0584
> +#define RATOC_PRODUCT_ID_USB60F        0xb020
> +
> +/*
> + * Acton Research Corp.
> + */
> +#define ACTON_VID              0x0647  /* Vendor ID */
> +#define ACTON_SPECTRAPRO_PID   0x0100
> +
> +/*
> + * Contec products (http://www.contec.com)
> + * Submitted by Daniel Sangorrin
> + */
> +#define CONTEC_VID             0x06CE  /* Vendor ID */
> +#define CONTEC_COM1USBH_PID    0x8311  /* COM-1(USB)H */
> +
> +/*
> + * Definitions for B&B Electronics products.
> + */
> +#define BANDB_VID              0x0856  /* B&B Electronics Vendor ID */
> +#define BANDB_USOTL4_PID       0xAC01  /* USOTL4 Isolated RS-485 Converter */
> +#define BANDB_USTL4_PID                0xAC02  /* USTL4 RS-485 Converter */
> +#define BANDB_USO9ML2_PID      0xAC03  /* USO9ML2 Isolated RS-232 Converter 
> */
> +#define BANDB_USOPTL4_PID      0xAC11
> +#define BANDB_USPTL4_PID       0xAC12
> +#define BANDB_USO9ML2DR_2_PID  0xAC16
> +#define BANDB_USO9ML2DR_PID    0xAC17
> +#define BANDB_USOPTL4DR2_PID   0xAC18  /* USOPTL4R-2 2-port Isolated RS-232 
> Converter */
> +#define BANDB_USOPTL4DR_PID    0xAC19
> +#define BANDB_485USB9F_2W_PID  0xAC25
> +#define BANDB_485USB9F_4W_PID  0xAC26
> +#define BANDB_232USB9M_PID     0xAC27
> +#define BANDB_485USBTB_2W_PID  0xAC33
> +#define BANDB_485USBTB_4W_PID  0xAC34
> +#define BANDB_TTL5USB9M_PID    0xAC49
> +#define BANDB_TTL3USB9M_PID    0xAC50
> +#define BANDB_ZZ_PROG1_USB_PID 0xBA02
> +
> +/*
> + * Intrepid Control Systems (http://www.intrepidcs.com/) ValueCAN and NeoVI
> + */
> +#define INTREPID_VID           0x093C
> +#define INTREPID_VALUECAN_PID  0x0601
> +#define INTREPID_NEOVI_PID     0x0701
> +
> +/*
> + * Definitions for ID TECH (www.idt-net.com) devices
> + */
> +#define IDTECH_VID             0x0ACD  /* ID TECH Vendor ID */
> +#define IDTECH_IDT1221U_PID    0x0300  /* IDT1221U USB to RS-232 adapter */
> +
> +/*
> + * Definitions for Omnidirectional Control Technology, Inc. devices
> + */
> +#define OCT_VID                        0x0B39  /* OCT vendor ID */
> +/* Note: OCT US101 is also rebadged as Dick Smith Electronics (NZ) XH6381 */
> +/* Also rebadged as Dick Smith Electronics (Aus) XH6451 */
> +/* Also rebadged as SIIG Inc. model US2308 hardware version 1 */
> +#define OCT_DK201_PID          0x0103  /* OCT DK201 USB docking station */
> +#define OCT_US101_PID          0x0421  /* OCT US101 USB to RS-232 */
> +
> +/*
> + * Definitions for Icom Inc. devices
> + */
> +#define ICOM_VID               0x0C26 /* Icom vendor ID */
> +/* Note: ID-1 is a communications tranceiver for HAM-radio operators */
> +#define ICOM_ID_1_PID          0x0004 /* ID-1 USB to RS-232 */
> +/* Note: OPC is an Optional cable to connect an Icom Tranceiver */
> +#define ICOM_OPC_U_UC_PID      0x0018 /* OPC-478UC, OPC-1122U cloning cable 
> */
> +/* Note: ID-RP* devices are Icom Repeater Devices for HAM-radio */
> +#define ICOM_ID_RP2C1_PID      0x0009 /* ID-RP2C Asset 1 to RS-232 */
> +#define ICOM_ID_RP2C2_PID      0x000A /* ID-RP2C Asset 2 to RS-232 */
> +#define ICOM_ID_RP2D_PID       0x000B /* ID-RP2D configuration port*/
> +#define ICOM_ID_RP2VT_PID      0x000C /* ID-RP2V Transmit config port */
> +#define ICOM_ID_RP2VR_PID      0x000D /* ID-RP2V Receive config port */
> +#define ICOM_ID_RP4KVT_PID     0x0010 /* ID-RP4000V Transmit config port */
> +#define ICOM_ID_RP4KVR_PID     0x0011 /* ID-RP4000V Receive config port */
> +#define ICOM_ID_RP2KVT_PID     0x0012 /* ID-RP2000V Transmit config port */
> +#define ICOM_ID_RP2KVR_PID     0x0013 /* ID-RP2000V Receive config port */
> +
> +/*
> + * GN Otometrics (http://www.otometrics.com)
> + * Submitted by Ville Sundberg.
> + */
> +#define GN_OTOMETRICS_VID      0x0c33  /* Vendor ID */
> +#define AURICAL_USB_PID                0x0010  /* Aurical USB Audiometer */
> +
> +/*
> + * The following are the values for the Sealevel SeaLINK+ adapters.
> + * (Original list sent by Tuan Hoang.  Ian Abbott renamed the macros and
> + * removed some PIDs that don't seem to match any existing products.)
> + */
> +#define SEALEVEL_VID           0x0c52  /* Sealevel Vendor ID */
> +#define SEALEVEL_2101_PID      0x2101  /* SeaLINK+232 (2101/2105) */
> +#define SEALEVEL_2102_PID      0x2102  /* SeaLINK+485 (2102) */
> +#define SEALEVEL_2103_PID      0x2103  /* SeaLINK+232I (2103) */
> +#define SEALEVEL_2104_PID      0x2104  /* SeaLINK+485I (2104) */
> +#define SEALEVEL_2106_PID      0x9020  /* SeaLINK+422 (2106) */
> +#define SEALEVEL_2201_1_PID    0x2211  /* SeaPORT+2/232 (2201) Port 1 */
> +#define SEALEVEL_2201_2_PID    0x2221  /* SeaPORT+2/232 (2201) Port 2 */
> +#define SEALEVEL_2202_1_PID    0x2212  /* SeaPORT+2/485 (2202) Port 1 */
> +#define SEALEVEL_2202_2_PID    0x2222  /* SeaPORT+2/485 (2202) Port 2 */
> +#define SEALEVEL_2203_1_PID    0x2213  /* SeaPORT+2 (2203) Port 1 */
> +#define SEALEVEL_2203_2_PID    0x2223  /* SeaPORT+2 (2203) Port 2 */
> +#define SEALEVEL_2401_1_PID    0x2411  /* SeaPORT+4/232 (2401) Port 1 */
> +#define SEALEVEL_2401_2_PID    0x2421  /* SeaPORT+4/232 (2401) Port 2 */
> +#define SEALEVEL_2401_3_PID    0x2431  /* SeaPORT+4/232 (2401) Port 3 */
> +#define SEALEVEL_2401_4_PID    0x2441  /* SeaPORT+4/232 (2401) Port 4 */
> +#define SEALEVEL_2402_1_PID    0x2412  /* SeaPORT+4/485 (2402) Port 1 */
> +#define SEALEVEL_2402_2_PID    0x2422  /* SeaPORT+4/485 (2402) Port 2 */
> +#define SEALEVEL_2402_3_PID    0x2432  /* SeaPORT+4/485 (2402) Port 3 */
> +#define SEALEVEL_2402_4_PID    0x2442  /* SeaPORT+4/485 (2402) Port 4 */
> +#define SEALEVEL_2403_1_PID    0x2413  /* SeaPORT+4 (2403) Port 1 */
> +#define SEALEVEL_2403_2_PID    0x2423  /* SeaPORT+4 (2403) Port 2 */
> +#define SEALEVEL_2403_3_PID    0x2433  /* SeaPORT+4 (2403) Port 3 */
> +#define SEALEVEL_2403_4_PID    0x2443  /* SeaPORT+4 (2403) Port 4 */
> +#define SEALEVEL_2801_1_PID    0X2811  /* SeaLINK+8/232 (2801) Port 1 */
> +#define SEALEVEL_2801_2_PID    0X2821  /* SeaLINK+8/232 (2801) Port 2 */
> +#define SEALEVEL_2801_3_PID    0X2831  /* SeaLINK+8/232 (2801) Port 3 */
> +#define SEALEVEL_2801_4_PID    0X2841  /* SeaLINK+8/232 (2801) Port 4 */
> +#define SEALEVEL_2801_5_PID    0X2851  /* SeaLINK+8/232 (2801) Port 5 */
> +#define SEALEVEL_2801_6_PID    0X2861  /* SeaLINK+8/232 (2801) Port 6 */
> +#define SEALEVEL_2801_7_PID    0X2871  /* SeaLINK+8/232 (2801) Port 7 */
> +#define SEALEVEL_2801_8_PID    0X2881  /* SeaLINK+8/232 (2801) Port 8 */
> +#define SEALEVEL_2802_1_PID    0X2812  /* SeaLINK+8/485 (2802) Port 1 */
> +#define SEALEVEL_2802_2_PID    0X2822  /* SeaLINK+8/485 (2802) Port 2 */
> +#define SEALEVEL_2802_3_PID    0X2832  /* SeaLINK+8/485 (2802) Port 3 */
> +#define SEALEVEL_2802_4_PID    0X2842  /* SeaLINK+8/485 (2802) Port 4 */
> +#define SEALEVEL_2802_5_PID    0X2852  /* SeaLINK+8/485 (2802) Port 5 */
> +#define SEALEVEL_2802_6_PID    0X2862  /* SeaLINK+8/485 (2802) Port 6 */
> +#define SEALEVEL_2802_7_PID    0X2872  /* SeaLINK+8/485 (2802) Port 7 */
> +#define SEALEVEL_2802_8_PID    0X2882  /* SeaLINK+8/485 (2802) Port 8 */
> +#define SEALEVEL_2803_1_PID    0X2813  /* SeaLINK+8 (2803) Port 1 */
> +#define SEALEVEL_2803_2_PID    0X2823  /* SeaLINK+8 (2803) Port 2 */
> +#define SEALEVEL_2803_3_PID    0X2833  /* SeaLINK+8 (2803) Port 3 */
> +#define SEALEVEL_2803_4_PID    0X2843  /* SeaLINK+8 (2803) Port 4 */
> +#define SEALEVEL_2803_5_PID    0X2853  /* SeaLINK+8 (2803) Port 5 */
> +#define SEALEVEL_2803_6_PID    0X2863  /* SeaLINK+8 (2803) Port 6 */
> +#define SEALEVEL_2803_7_PID    0X2873  /* SeaLINK+8 (2803) Port 7 */
> +#define SEALEVEL_2803_8_PID    0X2883  /* SeaLINK+8 (2803) Port 8 */
> +#define SEALEVEL_2803R_1_PID   0Xa02a  /* SeaLINK+8 (2803-ROHS) Port 1+2 */
> +#define SEALEVEL_2803R_2_PID   0Xa02b  /* SeaLINK+8 (2803-ROHS) Port 3+4 */
> +#define SEALEVEL_2803R_3_PID   0Xa02c  /* SeaLINK+8 (2803-ROHS) Port 5+6 */
> +#define SEALEVEL_2803R_4_PID   0Xa02d  /* SeaLINK+8 (2803-ROHS) Port 7+8 */
> +
> +/*
> + * JETI SPECTROMETER SPECBOS 1201
> + * 
> http://www.jeti.com/cms/index.php/instruments/other-instruments/specbos-2101
> + */
> +#define JETI_VID               0x0c6c
> +#define JETI_SPC1201_PID       0x04b2
> +
> +/*
> + * FTDI USB UART chips used in construction projects from the
> + * Elektor Electronics magazine (http://www.elektor.com/)
> + */
> +#define ELEKTOR_VID            0x0C7D
> +#define ELEKTOR_FT323R_PID     0x0005  /* RFID-Reader, issue 09-2006 */
> +
> +/*
> + * Posiflex inc retail equipment (http://www.posiflex.com.tw)
> + */
> +#define POSIFLEX_VID           0x0d3a  /* Vendor ID */
> +#define POSIFLEX_PP7000_PID    0x0300  /* PP-7000II thermal printer */
> +
> +/*
> + * The following are the values for two KOBIL chipcard terminals.
> + */
> +#define KOBIL_VID              0x0d46  /* KOBIL Vendor ID */
> +#define KOBIL_CONV_B1_PID      0x2020  /* KOBIL Konverter for B1 */
> +#define KOBIL_CONV_KAAN_PID    0x2021  /* KOBIL_Konverter for KAAN */
> +
> +#define FTDI_NF_RIC_VID        0x0DCD  /* Vendor Id */
> +#define FTDI_NF_RIC_PID        0x0001  /* Product Id */
> +
> +/*
> + * Falcom Wireless Communications GmbH
> + */
> +#define FALCOM_VID             0x0F94  /* Vendor Id */
> +#define FALCOM_TWIST_PID       0x0001  /* Falcom Twist USB GPRS modem */
> +#define FALCOM_SAMBA_PID       0x0005  /* Falcom Samba USB GPRS modem */
> +
> +/* Larsen and Brusgaard AltiTrack/USBtrack */
> +#define LARSENBRUSGAARD_VID            0x0FD8
> +#define LB_ALTITRACK_PID               0x0001
> +
> +/*
> + * TTi (Thurlby Thandar Instruments)
> + */
> +#define TTI_VID                        0x103E  /* Vendor Id */
> +#define TTI_QL355P_PID         0x03E8  /* TTi QL355P power supply */
> +
> +/* Interbiometrics USB I/O Board */
> +/* Developed for Interbiometrics by Rudolf Gugler */
> +#define INTERBIOMETRICS_VID              0x1209
> +#define INTERBIOMETRICS_IOBOARD_PID      0x1002
> +#define INTERBIOMETRICS_MINI_IOBOARD_PID 0x1006
> +
> +/*
> + * Testo products (http://www.testo.com/)
> + * Submitted by Colin Leroy
> + */
> +#define TESTO_VID                      0x128D
> +#define TESTO_USB_INTERFACE_PID                0x0001
> +
> +/*
> + * Mobility Electronics products.
> + */
> +#define MOBILITY_VID                   0x1342
> +#define MOBILITY_USB_SERIAL_PID                0x0202  /* EasiDock USB 200 
> serial */
> +
> +/*
> + * FIC / OpenMoko, Inc. http://wiki.openmoko.org/wiki/Neo1973_Debug_Board_v3
> + * Submitted by Harald Welte <address@hidden>
> + */
> +#define        FIC_VID                 0x1457
> +#define        FIC_NEO1973_DEBUG_PID   0x5118
> +
> +/* Olimex */
> +#define OLIMEX_VID                     0x15BA
> +#define OLIMEX_ARM_USB_OCD_PID         0x0003
> +#define OLIMEX_ARM_USB_OCD_H_PID       0x002b
> +
> +/*
> + * Telldus Technologies
> + */
> +#define TELLDUS_VID                    0x1781  /* Vendor ID */
> +#define TELLDUS_TELLSTICK_PID          0x0C30  /* RF control dongle 433 MHz 
> using FT232RL */
> +
> +/*
> + * RT Systems programming cables for various ham radios
> + */
> +#define RTSYSTEMS_VID                  0x2100  /* Vendor ID */
> +#define RTSYSTEMS_SERIAL_VX7_PID       0x9e52  /* Serial converter for VX-7 
> Radios using FT232RL */
> +#define RTSYSTEMS_CT29B_PID            0x9e54  /* CT29B Radio Cable */
> +#define RTSYSTEMS_RTS01_PID            0x9e57  /* USB-RTS01 Radio Cable */
> +
> +
> +/*
> + * Physik Instrumente
> + * http://www.physikinstrumente.com/en/products/
> + */
> +/* These two devices use the VID of FTDI */
> +#define PI_C865_PID    0xe0a0  /* PI C-865 Piezomotor Controller */
> +#define PI_C857_PID    0xe0a1  /* PI Encoder Trigger Box */
> +
> +#define PI_VID              0x1a72  /* Vendor ID */
> +#define PI_C866_PID    0x1000  /* PI C-866 Piezomotor Controller */
> +#define PI_C663_PID    0x1001  /* PI C-663 Mercury-Step */
> +#define PI_C725_PID    0x1002  /* PI C-725 Piezomotor Controller */
> +#define PI_E517_PID    0x1005  /* PI E-517 Digital Piezo Controller 
> Operation Module */
> +#define PI_C863_PID    0x1007  /* PI C-863 */
> +#define PI_E861_PID    0x1008  /* PI E-861 Piezomotor Controller */
> +#define PI_C867_PID    0x1009  /* PI C-867 Piezomotor Controller */
> +#define PI_E609_PID    0x100D  /* PI E-609 Digital Piezo Controller */
> +#define PI_E709_PID    0x100E  /* PI E-709 Digital Piezo Controller */
> +#define PI_100F_PID    0x100F  /* PI Digital Piezo Controller */
> +#define PI_1011_PID    0x1011  /* PI Digital Piezo Controller */
> +#define PI_1012_PID    0x1012  /* PI Motion Controller */
> +#define PI_1013_PID    0x1013  /* PI Motion Controller */
> +#define PI_1014_PID    0x1014  /* PI Device */
> +#define PI_1015_PID    0x1015  /* PI Device */
> +#define PI_1016_PID    0x1016  /* PI Digital Servo Module */
> +
> +/*
> + * Kondo Kagaku Co.Ltd.
> + * http://www.kondo-robot.com/EN
> + */
> +#define KONDO_VID              0x165c
> +#define KONDO_USB_SERIAL_PID   0x0002
> +
> +/*
> + * Bayer Ascensia Contour blood glucose meter USB-converter cable.
> + * http://winglucofacts.com/cables/
> + */
> +#define BAYER_VID                      0x1A79
> +#define BAYER_CONTOUR_CABLE_PID        0x6001
> +
> +/*
> + * The following are the values for the Matrix Orbital FTDI Range
> + * Anything in this range will use an FT232RL.
> + */
> +#define MTXORB_VID                     0x1B3D
> +#define MTXORB_FTDI_RANGE_0100_PID     0x0100
> +#define MTXORB_FTDI_RANGE_0101_PID     0x0101
> +#define MTXORB_FTDI_RANGE_0102_PID     0x0102
> +#define MTXORB_FTDI_RANGE_0103_PID     0x0103
> +#define MTXORB_FTDI_RANGE_0104_PID     0x0104
> +#define MTXORB_FTDI_RANGE_0105_PID     0x0105
> +#define MTXORB_FTDI_RANGE_0106_PID     0x0106
> +#define MTXORB_FTDI_RANGE_0107_PID     0x0107
> +#define MTXORB_FTDI_RANGE_0108_PID     0x0108
> +#define MTXORB_FTDI_RANGE_0109_PID     0x0109
> +#define MTXORB_FTDI_RANGE_010A_PID     0x010A
> +#define MTXORB_FTDI_RANGE_010B_PID     0x010B
> +#define MTXORB_FTDI_RANGE_010C_PID     0x010C
> +#define MTXORB_FTDI_RANGE_010D_PID     0x010D
> +#define MTXORB_FTDI_RANGE_010E_PID     0x010E
> +#define MTXORB_FTDI_RANGE_010F_PID     0x010F
> +#define MTXORB_FTDI_RANGE_0110_PID     0x0110
> +#define MTXORB_FTDI_RANGE_0111_PID     0x0111
> +#define MTXORB_FTDI_RANGE_0112_PID     0x0112
> +#define MTXORB_FTDI_RANGE_0113_PID     0x0113
> +#define MTXORB_FTDI_RANGE_0114_PID     0x0114
> +#define MTXORB_FTDI_RANGE_0115_PID     0x0115
> +#define MTXORB_FTDI_RANGE_0116_PID     0x0116
> +#define MTXORB_FTDI_RANGE_0117_PID     0x0117
> +#define MTXORB_FTDI_RANGE_0118_PID     0x0118
> +#define MTXORB_FTDI_RANGE_0119_PID     0x0119
> +#define MTXORB_FTDI_RANGE_011A_PID     0x011A
> +#define MTXORB_FTDI_RANGE_011B_PID     0x011B
> +#define MTXORB_FTDI_RANGE_011C_PID     0x011C
> +#define MTXORB_FTDI_RANGE_011D_PID     0x011D
> +#define MTXORB_FTDI_RANGE_011E_PID     0x011E
> +#define MTXORB_FTDI_RANGE_011F_PID     0x011F
> +#define MTXORB_FTDI_RANGE_0120_PID     0x0120
> +#define MTXORB_FTDI_RANGE_0121_PID     0x0121
> +#define MTXORB_FTDI_RANGE_0122_PID     0x0122
> +#define MTXORB_FTDI_RANGE_0123_PID     0x0123
> +#define MTXORB_FTDI_RANGE_0124_PID     0x0124
> +#define MTXORB_FTDI_RANGE_0125_PID     0x0125
> +#define MTXORB_FTDI_RANGE_0126_PID     0x0126
> +#define MTXORB_FTDI_RANGE_0127_PID     0x0127
> +#define MTXORB_FTDI_RANGE_0128_PID     0x0128
> +#define MTXORB_FTDI_RANGE_0129_PID     0x0129
> +#define MTXORB_FTDI_RANGE_012A_PID     0x012A
> +#define MTXORB_FTDI_RANGE_012B_PID     0x012B
> +#define MTXORB_FTDI_RANGE_012C_PID     0x012C
> +#define MTXORB_FTDI_RANGE_012D_PID     0x012D
> +#define MTXORB_FTDI_RANGE_012E_PID     0x012E
> +#define MTXORB_FTDI_RANGE_012F_PID     0x012F
> +#define MTXORB_FTDI_RANGE_0130_PID     0x0130
> +#define MTXORB_FTDI_RANGE_0131_PID     0x0131
> +#define MTXORB_FTDI_RANGE_0132_PID     0x0132
> +#define MTXORB_FTDI_RANGE_0133_PID     0x0133
> +#define MTXORB_FTDI_RANGE_0134_PID     0x0134
> +#define MTXORB_FTDI_RANGE_0135_PID     0x0135
> +#define MTXORB_FTDI_RANGE_0136_PID     0x0136
> +#define MTXORB_FTDI_RANGE_0137_PID     0x0137
> +#define MTXORB_FTDI_RANGE_0138_PID     0x0138
> +#define MTXORB_FTDI_RANGE_0139_PID     0x0139
> +#define MTXORB_FTDI_RANGE_013A_PID     0x013A
> +#define MTXORB_FTDI_RANGE_013B_PID     0x013B
> +#define MTXORB_FTDI_RANGE_013C_PID     0x013C
> +#define MTXORB_FTDI_RANGE_013D_PID     0x013D
> +#define MTXORB_FTDI_RANGE_013E_PID     0x013E
> +#define MTXORB_FTDI_RANGE_013F_PID     0x013F
> +#define MTXORB_FTDI_RANGE_0140_PID     0x0140
> +#define MTXORB_FTDI_RANGE_0141_PID     0x0141
> +#define MTXORB_FTDI_RANGE_0142_PID     0x0142
> +#define MTXORB_FTDI_RANGE_0143_PID     0x0143
> +#define MTXORB_FTDI_RANGE_0144_PID     0x0144
> +#define MTXORB_FTDI_RANGE_0145_PID     0x0145
> +#define MTXORB_FTDI_RANGE_0146_PID     0x0146
> +#define MTXORB_FTDI_RANGE_0147_PID     0x0147
> +#define MTXORB_FTDI_RANGE_0148_PID     0x0148
> +#define MTXORB_FTDI_RANGE_0149_PID     0x0149
> +#define MTXORB_FTDI_RANGE_014A_PID     0x014A
> +#define MTXORB_FTDI_RANGE_014B_PID     0x014B
> +#define MTXORB_FTDI_RANGE_014C_PID     0x014C
> +#define MTXORB_FTDI_RANGE_014D_PID     0x014D
> +#define MTXORB_FTDI_RANGE_014E_PID     0x014E
> +#define MTXORB_FTDI_RANGE_014F_PID     0x014F
> +#define MTXORB_FTDI_RANGE_0150_PID     0x0150
> +#define MTXORB_FTDI_RANGE_0151_PID     0x0151
> +#define MTXORB_FTDI_RANGE_0152_PID     0x0152
> +#define MTXORB_FTDI_RANGE_0153_PID     0x0153
> +#define MTXORB_FTDI_RANGE_0154_PID     0x0154
> +#define MTXORB_FTDI_RANGE_0155_PID     0x0155
> +#define MTXORB_FTDI_RANGE_0156_PID     0x0156
> +#define MTXORB_FTDI_RANGE_0157_PID     0x0157
> +#define MTXORB_FTDI_RANGE_0158_PID     0x0158
> +#define MTXORB_FTDI_RANGE_0159_PID     0x0159
> +#define MTXORB_FTDI_RANGE_015A_PID     0x015A
> +#define MTXORB_FTDI_RANGE_015B_PID     0x015B
> +#define MTXORB_FTDI_RANGE_015C_PID     0x015C
> +#define MTXORB_FTDI_RANGE_015D_PID     0x015D
> +#define MTXORB_FTDI_RANGE_015E_PID     0x015E
> +#define MTXORB_FTDI_RANGE_015F_PID     0x015F
> +#define MTXORB_FTDI_RANGE_0160_PID     0x0160
> +#define MTXORB_FTDI_RANGE_0161_PID     0x0161
> +#define MTXORB_FTDI_RANGE_0162_PID     0x0162
> +#define MTXORB_FTDI_RANGE_0163_PID     0x0163
> +#define MTXORB_FTDI_RANGE_0164_PID     0x0164
> +#define MTXORB_FTDI_RANGE_0165_PID     0x0165
> +#define MTXORB_FTDI_RANGE_0166_PID     0x0166
> +#define MTXORB_FTDI_RANGE_0167_PID     0x0167
> +#define MTXORB_FTDI_RANGE_0168_PID     0x0168
> +#define MTXORB_FTDI_RANGE_0169_PID     0x0169
> +#define MTXORB_FTDI_RANGE_016A_PID     0x016A
> +#define MTXORB_FTDI_RANGE_016B_PID     0x016B
> +#define MTXORB_FTDI_RANGE_016C_PID     0x016C
> +#define MTXORB_FTDI_RANGE_016D_PID     0x016D
> +#define MTXORB_FTDI_RANGE_016E_PID     0x016E
> +#define MTXORB_FTDI_RANGE_016F_PID     0x016F
> +#define MTXORB_FTDI_RANGE_0170_PID     0x0170
> +#define MTXORB_FTDI_RANGE_0171_PID     0x0171
> +#define MTXORB_FTDI_RANGE_0172_PID     0x0172
> +#define MTXORB_FTDI_RANGE_0173_PID     0x0173
> +#define MTXORB_FTDI_RANGE_0174_PID     0x0174
> +#define MTXORB_FTDI_RANGE_0175_PID     0x0175
> +#define MTXORB_FTDI_RANGE_0176_PID     0x0176
> +#define MTXORB_FTDI_RANGE_0177_PID     0x0177
> +#define MTXORB_FTDI_RANGE_0178_PID     0x0178
> +#define MTXORB_FTDI_RANGE_0179_PID     0x0179
> +#define MTXORB_FTDI_RANGE_017A_PID     0x017A
> +#define MTXORB_FTDI_RANGE_017B_PID     0x017B
> +#define MTXORB_FTDI_RANGE_017C_PID     0x017C
> +#define MTXORB_FTDI_RANGE_017D_PID     0x017D
> +#define MTXORB_FTDI_RANGE_017E_PID     0x017E
> +#define MTXORB_FTDI_RANGE_017F_PID     0x017F
> +#define MTXORB_FTDI_RANGE_0180_PID     0x0180
> +#define MTXORB_FTDI_RANGE_0181_PID     0x0181
> +#define MTXORB_FTDI_RANGE_0182_PID     0x0182
> +#define MTXORB_FTDI_RANGE_0183_PID     0x0183
> +#define MTXORB_FTDI_RANGE_0184_PID     0x0184
> +#define MTXORB_FTDI_RANGE_0185_PID     0x0185
> +#define MTXORB_FTDI_RANGE_0186_PID     0x0186
> +#define MTXORB_FTDI_RANGE_0187_PID     0x0187
> +#define MTXORB_FTDI_RANGE_0188_PID     0x0188
> +#define MTXORB_FTDI_RANGE_0189_PID     0x0189
> +#define MTXORB_FTDI_RANGE_018A_PID     0x018A
> +#define MTXORB_FTDI_RANGE_018B_PID     0x018B
> +#define MTXORB_FTDI_RANGE_018C_PID     0x018C
> +#define MTXORB_FTDI_RANGE_018D_PID     0x018D
> +#define MTXORB_FTDI_RANGE_018E_PID     0x018E
> +#define MTXORB_FTDI_RANGE_018F_PID     0x018F
> +#define MTXORB_FTDI_RANGE_0190_PID     0x0190
> +#define MTXORB_FTDI_RANGE_0191_PID     0x0191
> +#define MTXORB_FTDI_RANGE_0192_PID     0x0192
> +#define MTXORB_FTDI_RANGE_0193_PID     0x0193
> +#define MTXORB_FTDI_RANGE_0194_PID     0x0194
> +#define MTXORB_FTDI_RANGE_0195_PID     0x0195
> +#define MTXORB_FTDI_RANGE_0196_PID     0x0196
> +#define MTXORB_FTDI_RANGE_0197_PID     0x0197
> +#define MTXORB_FTDI_RANGE_0198_PID     0x0198
> +#define MTXORB_FTDI_RANGE_0199_PID     0x0199
> +#define MTXORB_FTDI_RANGE_019A_PID     0x019A
> +#define MTXORB_FTDI_RANGE_019B_PID     0x019B
> +#define MTXORB_FTDI_RANGE_019C_PID     0x019C
> +#define MTXORB_FTDI_RANGE_019D_PID     0x019D
> +#define MTXORB_FTDI_RANGE_019E_PID     0x019E
> +#define MTXORB_FTDI_RANGE_019F_PID     0x019F
> +#define MTXORB_FTDI_RANGE_01A0_PID     0x01A0
> +#define MTXORB_FTDI_RANGE_01A1_PID     0x01A1
> +#define MTXORB_FTDI_RANGE_01A2_PID     0x01A2
> +#define MTXORB_FTDI_RANGE_01A3_PID     0x01A3
> +#define MTXORB_FTDI_RANGE_01A4_PID     0x01A4
> +#define MTXORB_FTDI_RANGE_01A5_PID     0x01A5
> +#define MTXORB_FTDI_RANGE_01A6_PID     0x01A6
> +#define MTXORB_FTDI_RANGE_01A7_PID     0x01A7
> +#define MTXORB_FTDI_RANGE_01A8_PID     0x01A8
> +#define MTXORB_FTDI_RANGE_01A9_PID     0x01A9
> +#define MTXORB_FTDI_RANGE_01AA_PID     0x01AA
> +#define MTXORB_FTDI_RANGE_01AB_PID     0x01AB
> +#define MTXORB_FTDI_RANGE_01AC_PID     0x01AC
> +#define MTXORB_FTDI_RANGE_01AD_PID     0x01AD
> +#define MTXORB_FTDI_RANGE_01AE_PID     0x01AE
> +#define MTXORB_FTDI_RANGE_01AF_PID     0x01AF
> +#define MTXORB_FTDI_RANGE_01B0_PID     0x01B0
> +#define MTXORB_FTDI_RANGE_01B1_PID     0x01B1
> +#define MTXORB_FTDI_RANGE_01B2_PID     0x01B2
> +#define MTXORB_FTDI_RANGE_01B3_PID     0x01B3
> +#define MTXORB_FTDI_RANGE_01B4_PID     0x01B4
> +#define MTXORB_FTDI_RANGE_01B5_PID     0x01B5
> +#define MTXORB_FTDI_RANGE_01B6_PID     0x01B6
> +#define MTXORB_FTDI_RANGE_01B7_PID     0x01B7
> +#define MTXORB_FTDI_RANGE_01B8_PID     0x01B8
> +#define MTXORB_FTDI_RANGE_01B9_PID     0x01B9
> +#define MTXORB_FTDI_RANGE_01BA_PID     0x01BA
> +#define MTXORB_FTDI_RANGE_01BB_PID     0x01BB
> +#define MTXORB_FTDI_RANGE_01BC_PID     0x01BC
> +#define MTXORB_FTDI_RANGE_01BD_PID     0x01BD
> +#define MTXORB_FTDI_RANGE_01BE_PID     0x01BE
> +#define MTXORB_FTDI_RANGE_01BF_PID     0x01BF
> +#define MTXORB_FTDI_RANGE_01C0_PID     0x01C0
> +#define MTXORB_FTDI_RANGE_01C1_PID     0x01C1
> +#define MTXORB_FTDI_RANGE_01C2_PID     0x01C2
> +#define MTXORB_FTDI_RANGE_01C3_PID     0x01C3
> +#define MTXORB_FTDI_RANGE_01C4_PID     0x01C4
> +#define MTXORB_FTDI_RANGE_01C5_PID     0x01C5
> +#define MTXORB_FTDI_RANGE_01C6_PID     0x01C6
> +#define MTXORB_FTDI_RANGE_01C7_PID     0x01C7
> +#define MTXORB_FTDI_RANGE_01C8_PID     0x01C8
> +#define MTXORB_FTDI_RANGE_01C9_PID     0x01C9
> +#define MTXORB_FTDI_RANGE_01CA_PID     0x01CA
> +#define MTXORB_FTDI_RANGE_01CB_PID     0x01CB
> +#define MTXORB_FTDI_RANGE_01CC_PID     0x01CC
> +#define MTXORB_FTDI_RANGE_01CD_PID     0x01CD
> +#define MTXORB_FTDI_RANGE_01CE_PID     0x01CE
> +#define MTXORB_FTDI_RANGE_01CF_PID     0x01CF
> +#define MTXORB_FTDI_RANGE_01D0_PID     0x01D0
> +#define MTXORB_FTDI_RANGE_01D1_PID     0x01D1
> +#define MTXORB_FTDI_RANGE_01D2_PID     0x01D2
> +#define MTXORB_FTDI_RANGE_01D3_PID     0x01D3
> +#define MTXORB_FTDI_RANGE_01D4_PID     0x01D4
> +#define MTXORB_FTDI_RANGE_01D5_PID     0x01D5
> +#define MTXORB_FTDI_RANGE_01D6_PID     0x01D6
> +#define MTXORB_FTDI_RANGE_01D7_PID     0x01D7
> +#define MTXORB_FTDI_RANGE_01D8_PID     0x01D8
> +#define MTXORB_FTDI_RANGE_01D9_PID     0x01D9
> +#define MTXORB_FTDI_RANGE_01DA_PID     0x01DA
> +#define MTXORB_FTDI_RANGE_01DB_PID     0x01DB
> +#define MTXORB_FTDI_RANGE_01DC_PID     0x01DC
> +#define MTXORB_FTDI_RANGE_01DD_PID     0x01DD
> +#define MTXORB_FTDI_RANGE_01DE_PID     0x01DE
> +#define MTXORB_FTDI_RANGE_01DF_PID     0x01DF
> +#define MTXORB_FTDI_RANGE_01E0_PID     0x01E0
> +#define MTXORB_FTDI_RANGE_01E1_PID     0x01E1
> +#define MTXORB_FTDI_RANGE_01E2_PID     0x01E2
> +#define MTXORB_FTDI_RANGE_01E3_PID     0x01E3
> +#define MTXORB_FTDI_RANGE_01E4_PID     0x01E4
> +#define MTXORB_FTDI_RANGE_01E5_PID     0x01E5
> +#define MTXORB_FTDI_RANGE_01E6_PID     0x01E6
> +#define MTXORB_FTDI_RANGE_01E7_PID     0x01E7
> +#define MTXORB_FTDI_RANGE_01E8_PID     0x01E8
> +#define MTXORB_FTDI_RANGE_01E9_PID     0x01E9
> +#define MTXORB_FTDI_RANGE_01EA_PID     0x01EA
> +#define MTXORB_FTDI_RANGE_01EB_PID     0x01EB
> +#define MTXORB_FTDI_RANGE_01EC_PID     0x01EC
> +#define MTXORB_FTDI_RANGE_01ED_PID     0x01ED
> +#define MTXORB_FTDI_RANGE_01EE_PID     0x01EE
> +#define MTXORB_FTDI_RANGE_01EF_PID     0x01EF
> +#define MTXORB_FTDI_RANGE_01F0_PID     0x01F0
> +#define MTXORB_FTDI_RANGE_01F1_PID     0x01F1
> +#define MTXORB_FTDI_RANGE_01F2_PID     0x01F2
> +#define MTXORB_FTDI_RANGE_01F3_PID     0x01F3
> +#define MTXORB_FTDI_RANGE_01F4_PID     0x01F4
> +#define MTXORB_FTDI_RANGE_01F5_PID     0x01F5
> +#define MTXORB_FTDI_RANGE_01F6_PID     0x01F6
> +#define MTXORB_FTDI_RANGE_01F7_PID     0x01F7
> +#define MTXORB_FTDI_RANGE_01F8_PID     0x01F8
> +#define MTXORB_FTDI_RANGE_01F9_PID     0x01F9
> +#define MTXORB_FTDI_RANGE_01FA_PID     0x01FA
> +#define MTXORB_FTDI_RANGE_01FB_PID     0x01FB
> +#define MTXORB_FTDI_RANGE_01FC_PID     0x01FC
> +#define MTXORB_FTDI_RANGE_01FD_PID     0x01FD
> +#define MTXORB_FTDI_RANGE_01FE_PID     0x01FE
> +#define MTXORB_FTDI_RANGE_01FF_PID     0x01FF
> +
> +
> +
> +/*
> + * The Mobility Lab (TML)
> + * Submitted by Pierre Castella
> + */
> +#define TML_VID                        0x1B91  /* Vendor ID */
> +#define TML_USB_SERIAL_PID     0x0064  /* USB - Serial Converter */
> +
> +/* Alti-2 products  http://www.alti-2.com */
> +#define ALTI2_VID      0x1BC9
> +#define ALTI2_N3_PID   0x6001  /* Neptune 3 */
> +
> +/*
> + * Ionics PlugComputer
> + */
> +#define IONICS_VID                     0x1c0c
> +#define IONICS_PLUGCOMPUTER_PID                0x0102
> +
> +/*
> + * Dresden Elektronik Sensor Terminal Board
> + */
> +#define DE_VID                 0x1cf1 /* Vendor ID */
> +#define STB_PID                        0x0001 /* Sensor Terminal Board */
> +#define WHT_PID                        0x0004 /* Wireless Handheld Terminal 
> */
> +
> +/*
> + * STMicroelectonics
> + */
> +#define ST_VID                 0x0483
> +#define ST_STMCLT1030_PID      0x3747 /* ST Micro Connect Lite STMCLT1030 */
> +
> +/*
> + * Papouch products (http://www.papouch.com/)
> + * Submitted by Folkert van Heusden
> + */
> +
> +#define PAPOUCH_VID                    0x5050  /* Vendor ID */
> +#define PAPOUCH_SB485_PID              0x0100  /* Papouch SB485 USB-485/422 
> Converter */
> +#define PAPOUCH_AP485_PID              0x0101  /* AP485 USB-RS485 Converter 
> */
> +#define PAPOUCH_SB422_PID              0x0102  /* Papouch SB422 USB-RS422 
> Converter  */
> +#define PAPOUCH_SB485_2_PID            0x0103  /* Papouch SB485 USB-485/422 
> Converter */
> +#define PAPOUCH_AP485_2_PID            0x0104  /* AP485 USB-RS485 Converter 
> */
> +#define PAPOUCH_SB422_2_PID            0x0105  /* Papouch SB422 USB-RS422 
> Converter  */
> +#define PAPOUCH_SB485S_PID             0x0106  /* Papouch SB485S USB-485/422 
> Converter */
> +#define PAPOUCH_SB485C_PID             0x0107  /* Papouch SB485C USB-485/422 
> Converter */
> +#define PAPOUCH_LEC_PID                        0x0300  /* LEC USB Converter 
> */
> +#define PAPOUCH_SB232_PID              0x0301  /* Papouch SB232 USB-RS232 
> Converter */
> +#define PAPOUCH_TMU_PID                        0x0400  /* TMU USB 
> Thermometer */
> +#define PAPOUCH_IRAMP_PID              0x0500  /* Papouch IRAmp Duplex */
> +#define PAPOUCH_DRAK5_PID              0x0700  /* Papouch DRAK5 */
> +#define PAPOUCH_QUIDO8x8_PID           0x0800  /* Papouch Quido 8/8 Module */
> +#define PAPOUCH_QUIDO4x4_PID           0x0900  /* Papouch Quido 4/4 Module */
> +#define PAPOUCH_QUIDO2x2_PID           0x0a00  /* Papouch Quido 2/2 Module */
> +#define PAPOUCH_QUIDO10x1_PID          0x0b00  /* Papouch Quido 10/1 Module 
> */
> +#define PAPOUCH_QUIDO30x3_PID          0x0c00  /* Papouch Quido 30/3 Module 
> */
> +#define PAPOUCH_QUIDO60x3_PID          0x0d00  /* Papouch Quido 60(100)/3 
> Module */
> +#define PAPOUCH_QUIDO2x16_PID          0x0e00  /* Papouch Quido 2/16 Module 
> */
> +#define PAPOUCH_QUIDO3x32_PID          0x0f00  /* Papouch Quido 3/32 Module 
> */
> +#define PAPOUCH_DRAK6_PID              0x1000  /* Papouch DRAK6 */
> +#define PAPOUCH_UPSUSB_PID             0x8000  /* Papouch UPS-USB adapter */
> +#define PAPOUCH_MU_PID                 0x8001  /* MU controller */
> +#define PAPOUCH_SIMUKEY_PID            0x8002  /* Papouch SimuKey */
> +#define PAPOUCH_AD4USB_PID             0x8003  /* AD4USB Measurement Module 
> */
> +#define PAPOUCH_GMUX_PID               0x8004  /* Papouch GOLIATH MUX */
> +#define PAPOUCH_GMSR_PID               0x8005  /* Papouch GOLIATH MSR */
> +
> +/*
> + * Marvell SheevaPlug
> + */
> +#define MARVELL_VID            0x9e88
> +#define MARVELL_SHEEVAPLUG_PID 0x9e8f
> +
> +/*
> + * Evolution Robotics products (http://www.evolution.com/).
> + * Submitted by Shawn M. Lavelle.
> + */
> +#define EVOLUTION_VID          0xDEEE  /* Vendor ID */
> +#define EVOLUTION_ER1_PID      0x0300  /* ER1 Control Module */
> +#define EVO_8U232AM_PID                0x02FF  /* Evolution robotics RCM2 
> (FT232AM)*/
> +#define EVO_HYBRID_PID         0x0302  /* Evolution robotics RCM4 PID 
> (FT232BM)*/
> +#define EVO_RCM4_PID           0x0303  /* Evolution robotics RCM4 PID */
> +
> +/*
> + * MJS Gadgets HD Radio / XM Radio / Sirius Radio interfaces (using VID 
> 0x0403)
> + */
> +#define MJSG_GENERIC_PID       0x9378
> +#define MJSG_SR_RADIO_PID      0x9379
> +#define MJSG_XM_RADIO_PID      0x937A
> +#define MJSG_HD_RADIO_PID      0x937C
> +
> +/*
> + * D.O.Tec products (http://www.directout.eu)
> + */
> +#define FTDI_DOTEC_PID 0x9868
> +
> +/*
> + * Xverve Signalyzer tools (http://www.signalyzer.com/)
> + */
> +#define XVERVE_SIGNALYZER_ST_PID       0xBCA0
> +#define XVERVE_SIGNALYZER_SLITE_PID    0xBCA1
> +#define XVERVE_SIGNALYZER_SH2_PID      0xBCA2
> +#define XVERVE_SIGNALYZER_SH4_PID      0xBCA4
> +
> +/*
> + * Segway Robotic Mobility Platform USB interface (using VID 0x0403)
> + * Submitted by John G. Rogers
> + */
> +#define SEGWAY_RMP200_PID      0xe729
> +
> +
> +/*
> + * Accesio USB Data Acquisition products (http://www.accesio.com/)
> + */
> +#define ACCESIO_COM4SM_PID     0xD578
> +
> +/* www.sciencescope.co.uk educational dataloggers */
> +#define FTDI_SCIENCESCOPE_LOGBOOKML_PID                0xFF18
> +#define FTDI_SCIENCESCOPE_LS_LOGBOOK_PID       0xFF1C
> +#define FTDI_SCIENCESCOPE_HS_LOGBOOK_PID       0xFF1D
> +
> +/*
> + * Milkymist One JTAG/Serial
> + */
> +#define QIHARDWARE_VID                 0x20B7
> +#define MILKYMISTONE_JTAGSERIAL_PID    0x0713
> +
> +/*
> + * CTI GmbH RS485 Converter http://www.cti-lean.com/
> + */
> +/* USB-485-Mini*/
> +#define FTDI_CTI_MINI_PID      0xF608
> +/* USB-Nano-485*/
> +#define FTDI_CTI_NANO_PID      0xF60B
> +
> +/*
> + * ZeitControl cardsystems GmbH rfid-readers http://zeitconrol.de
> + */
> +/* TagTracer MIFARE*/
> +#define FTDI_ZEITCONTROL_TAGTRACE_MIFARE_PID   0xF7C0
> +
> +/*
> + * Rainforest Automation
> + */
> +/* ZigBee controller */
> +#define FTDI_RF_R106           0x8A28
> +
> +/*
> + * Product: HCP HIT GPRS modem
> + * Manufacturer: HCP d.o.o.
> + * ATI command output: Cinterion MC55i
> + */
> +#define FTDI_CINTERION_MC55I_PID       0xA951
> diff --git a/hw/usb/quirks-pl2303-ids.h b/hw/usb/quirks-pl2303-ids.h
> new file mode 100644
> index 0000000..8dbdb46
> --- /dev/null
> +++ b/hw/usb/quirks-pl2303-ids.h
> @@ -0,0 +1,150 @@
> +/*
> + * Prolific PL2303 USB to serial adaptor driver header file
> + *
> + *     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.
> + *
> + */
> +
> +#define BENQ_VENDOR_ID                 0x04a5
> +#define BENQ_PRODUCT_ID_S81            0x4027
> +
> +#define PL2303_VENDOR_ID       0x067b
> +#define PL2303_PRODUCT_ID      0x2303
> +#define PL2303_PRODUCT_ID_RSAQ2                0x04bb
> +#define PL2303_PRODUCT_ID_DCU11                0x1234
> +#define PL2303_PRODUCT_ID_PHAROS       0xaaa0
> +#define PL2303_PRODUCT_ID_RSAQ3                0xaaa2
> +#define PL2303_PRODUCT_ID_ALDIGA       0x0611
> +#define PL2303_PRODUCT_ID_MMX          0x0612
> +#define PL2303_PRODUCT_ID_GPRS         0x0609
> +#define PL2303_PRODUCT_ID_HCR331       0x331a
> +#define PL2303_PRODUCT_ID_MOTOROLA     0x0307
> +
> +#define ATEN_VENDOR_ID         0x0557
> +#define ATEN_VENDOR_ID2                0x0547
> +#define ATEN_PRODUCT_ID                0x2008
> +
> +#define IODATA_VENDOR_ID       0x04bb
> +#define IODATA_PRODUCT_ID      0x0a03
> +#define IODATA_PRODUCT_ID_RSAQ5        0x0a0e
> +
> +#define ELCOM_VENDOR_ID                0x056e
> +#define ELCOM_PRODUCT_ID       0x5003
> +#define ELCOM_PRODUCT_ID_UCSGT 0x5004
> +
> +#define ITEGNO_VENDOR_ID       0x0eba
> +#define ITEGNO_PRODUCT_ID      0x1080
> +#define ITEGNO_PRODUCT_ID_2080 0x2080
> +
> +#define MA620_VENDOR_ID                0x0df7
> +#define MA620_PRODUCT_ID       0x0620
> +
> +#define RATOC_VENDOR_ID                0x0584
> +#define RATOC_PRODUCT_ID       0xb000
> +
> +#define TRIPP_VENDOR_ID                0x2478
> +#define TRIPP_PRODUCT_ID       0x2008
> +
> +#define RADIOSHACK_VENDOR_ID   0x1453
> +#define RADIOSHACK_PRODUCT_ID  0x4026
> +
> +#define DCU10_VENDOR_ID                0x0731
> +#define DCU10_PRODUCT_ID       0x0528
> +
> +#define SITECOM_VENDOR_ID      0x6189
> +#define SITECOM_PRODUCT_ID     0x2068
> +
> +/* Alcatel OT535/735 USB cable */
> +#define ALCATEL_VENDOR_ID      0x11f7
> +#define ALCATEL_PRODUCT_ID     0x02df
> +
> +/* Samsung I330 phone cradle */
> +#define SAMSUNG_VENDOR_ID      0x04e8
> +#define SAMSUNG_PRODUCT_ID     0x8001
> +
> +#define SIEMENS_VENDOR_ID      0x11f5
> +#define SIEMENS_PRODUCT_ID_SX1 0x0001
> +#define SIEMENS_PRODUCT_ID_X65 0x0003
> +#define SIEMENS_PRODUCT_ID_X75 0x0004
> +#define SIEMENS_PRODUCT_ID_EF81        0x0005
> +
> +#define SYNTECH_VENDOR_ID      0x0745
> +#define SYNTECH_PRODUCT_ID     0x0001
> +
> +/* Nokia CA-42 Cable */
> +#define NOKIA_CA42_VENDOR_ID   0x078b
> +#define NOKIA_CA42_PRODUCT_ID  0x1234
> +
> +/* CA-42 CLONE Cable www.ca-42.com chipset: Prolific Technology Inc */
> +#define CA_42_CA42_VENDOR_ID   0x10b5
> +#define CA_42_CA42_PRODUCT_ID  0xac70
> +
> +#define SAGEM_VENDOR_ID                0x079b
> +#define SAGEM_PRODUCT_ID       0x0027
> +
> +/* Leadtek GPS 9531 (ID 0413:2101) */
> +#define LEADTEK_VENDOR_ID      0x0413
> +#define LEADTEK_9531_PRODUCT_ID        0x2101
> +
> +/* USB GSM cable from Speed Dragon Multimedia, Ltd */
> +#define SPEEDDRAGON_VENDOR_ID  0x0e55
> +#define SPEEDDRAGON_PRODUCT_ID 0x110b
> +
> +/* DATAPILOT Universal-2 Phone Cable */
> +#define DATAPILOT_U2_VENDOR_ID 0x0731
> +#define DATAPILOT_U2_PRODUCT_ID        0x2003
> +
> +/* Belkin "F5U257" Serial Adapter */
> +#define BELKIN_VENDOR_ID       0x050d
> +#define BELKIN_PRODUCT_ID      0x0257
> +
> +/* Alcor Micro Corp. USB 2.0 TO RS-232 */
> +#define ALCOR_VENDOR_ID                0x058F
> +#define ALCOR_PRODUCT_ID       0x9720
> +
> +/* Willcom WS002IN Data Driver (by NetIndex Inc.) */
> +#define WS002IN_VENDOR_ID      0x11f6
> +#define WS002IN_PRODUCT_ID     0x2001
> +
> +/* Corega CG-USBRS232R Serial Adapter */
> +#define COREGA_VENDOR_ID       0x07aa
> +#define COREGA_PRODUCT_ID      0x002a
> +
> +/* Y.C. Cable U.S.A., Inc - USB to RS-232 */
> +#define YCCABLE_VENDOR_ID      0x05ad
> +#define YCCABLE_PRODUCT_ID     0x0fba
> +
> +/* "Superial" USB - Serial */
> +#define SUPERIAL_VENDOR_ID     0x5372
> +#define SUPERIAL_PRODUCT_ID    0x2303
> +
> +/* Hewlett-Packard LD220-HP POS Pole Display */
> +#define HP_VENDOR_ID           0x03f0
> +#define HP_LD220_PRODUCT_ID    0x3524
> +
> +/* Cressi Edy (diving computer) PC interface */
> +#define CRESSI_VENDOR_ID       0x04b8
> +#define CRESSI_EDY_PRODUCT_ID  0x0521
> +
> +/* Zeagle dive computer interface */
> +#define ZEAGLE_VENDOR_ID       0x04b8
> +#define ZEAGLE_N2ITION3_PRODUCT_ID     0x0522
> +
> +/* Sony, USB data cable for CMD-Jxx mobile phones */
> +#define SONY_VENDOR_ID         0x054c
> +#define SONY_QN3USB_PRODUCT_ID 0x0437
> +
> +/* Sanwa KB-USB2 multimeter cable (ID: 11ad:0001) */
> +#define SANWA_VENDOR_ID                0x11ad
> +#define SANWA_PRODUCT_ID       0x0001
> +
> +/* ADLINK ND-6530 RS232,RS485 and RS422 adapter */
> +#define ADLINK_VENDOR_ID               0x0b63
> +#define ADLINK_ND6530_PRODUCT_ID       0x6530
> +
> +/* SMART USB Serial Adapter */
> +#define SMART_VENDOR_ID        0x0b8c
> +#define SMART_PRODUCT_ID       0x2303
> diff --git a/hw/usb/quirks.c b/hw/usb/quirks.c
> new file mode 100644
> index 0000000..a761a96
> --- /dev/null
> +++ b/hw/usb/quirks.c
> @@ -0,0 +1,53 @@
> +/*
> + * USB quirk handling
> + *
> + * Copyright (c) 2012 Red Hat, Inc.
> + *
> + * Red Hat Authors:
> + * Hans de Goede <address@hidden>
> + *
> + * 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.
> + */
> +
> +#include "quirks.h"
> +#include "hw/usb.h"
> +
> +static bool usb_id_match(const struct usb_device_id *ids,
> +                         uint16_t vendor_id, uint16_t product_id,
> +                         uint8_t interface_class, uint8_t interface_subclass,
> +                         uint8_t interface_protocol) {
> +    int i;
> +
> +    for (i = 0; ids[i].vendor_id != -1; i++) {
> +        if (ids[i].vendor_id  == vendor_id &&
> +            ids[i].product_id == product_id &&
> +            (ids[i].interface_class == -1 ||
> +             (ids[i].interface_class == interface_class &&
> +              ids[i].interface_subclass == interface_subclass &&
> +              ids[i].interface_protocol == interface_protocol))) {
> +            return true;
> +        }
> +    }
> +    return false;
> +}
> +
> +int usb_get_quirks(uint16_t vendor_id, uint16_t product_id,
> +                   uint8_t interface_class, uint8_t interface_subclass,
> +                   uint8_t interface_protocol)
> +{
> +    int quirks = 0;
> +
> +    if (usb_id_match(usbredir_raw_serial_ids, vendor_id, product_id,
> +                   interface_class, interface_subclass, interface_protocol)) 
> {
> +        quirks |= USB_QUIRK_BUFFER_BULK_IN;
> +    }
> +    if (usb_id_match(usbredir_ftdi_serial_ids, vendor_id, product_id,
> +                   interface_class, interface_subclass, interface_protocol)) 
> {
> +        quirks |= USB_QUIRK_BUFFER_BULK_IN | USB_QUIRK_IS_FTDI;
> +    }
> +
> +    return quirks;
> +}
> diff --git a/hw/usb/quirks.h b/hw/usb/quirks.h
> new file mode 100644
> index 0000000..8dc6065
> --- /dev/null
> +++ b/hw/usb/quirks.h
> @@ -0,0 +1,910 @@
> +/*
> + * USB quirk handling
> + *
> + * Copyright (c) 2012 Red Hat, Inc.
> + *
> + * Red Hat Authors:
> + * Hans de Goede <address@hidden>
> + *
> + * 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.
> + */
> +
> +/* 1 on 1 copy of linux/drivers/usb/serial/ftdi_sio_ids.h */
> +#include "quirks-ftdi-ids.h"
> +/* 1 on 1 copy of linux/drivers/usb/serial/pl2303.h */
> +#include "quirks-pl2303-ids.h"
> +
> +struct usb_device_id {
> +    int vendor_id;
> +    int product_id;
> +    int interface_class;
> +    int interface_subclass;
> +    int interface_protocol;
> +};
> +
> +#define USB_DEVICE(vendor, product) \
> +    .vendor_id = vendor, .product_id = product, .interface_class = -1,
> +
> +#define USB_DEVICE_AND_INTERFACE_INFO(vend, prod, iclass, isubclass, iproto) 
> \
> +    .vendor_id = vend, .product_id = prod, .interface_class = iclass, \
> +    .interface_subclass = isubclass, .interface_protocol = iproto
> +
> +static const struct usb_device_id usbredir_raw_serial_ids[] = {
> +    /*
> +     * Silicon Laboratories CP210x USB to RS232 serial adapter ids
> +     * copied from linux/drivers/usb/serial/cp210x.c
> +     *
> +     * Copyright (C) 2005 Craig Shelley (address@hidden)
> +     */
> +    { USB_DEVICE(0x045B, 0x0053) }, /* Renesas RX610 RX-Stick */
> +    { USB_DEVICE(0x0471, 0x066A) }, /* AKTAKOM ACE-1001 cable */
> +    { USB_DEVICE(0x0489, 0xE000) }, /* Pirelli Broadband S.p.A, DP-L10 
> SIP/GSM Mobile */
> +    { USB_DEVICE(0x0489, 0xE003) }, /* Pirelli Broadband S.p.A, DP-L10 
> SIP/GSM Mobile */
> +    { USB_DEVICE(0x0745, 0x1000) }, /* CipherLab USB CCD Barcode Scanner 
> 1000 */
> +    { USB_DEVICE(0x08e6, 0x5501) }, /* Gemalto Prox-PU/CU contactless 
> smartcard reader */
> +    { USB_DEVICE(0x08FD, 0x000A) }, /* Digianswer A/S , ZigBee/802.15.4 MAC 
> Device */
> +    { USB_DEVICE(0x0BED, 0x1100) }, /* MEI (TM) Cashflow-SC Bill/Voucher 
> Acceptor */
> +    { USB_DEVICE(0x0BED, 0x1101) }, /* MEI series 2000 Combo Acceptor */
> +    { USB_DEVICE(0x0FCF, 0x1003) }, /* Dynastream ANT development board */
> +    { USB_DEVICE(0x0FCF, 0x1004) }, /* Dynastream ANT2USB */
> +    { USB_DEVICE(0x0FCF, 0x1006) }, /* Dynastream ANT development board */
> +    { USB_DEVICE(0x10A6, 0xAA26) }, /* Knock-off DCU-11 cable */
> +    { USB_DEVICE(0x10AB, 0x10C5) }, /* Siemens MC60 Cable */
> +    { USB_DEVICE(0x10B5, 0xAC70) }, /* Nokia CA-42 USB */
> +    { USB_DEVICE(0x10C4, 0x0F91) }, /* Vstabi */
> +    { USB_DEVICE(0x10C4, 0x1101) }, /* Arkham Technology DS101 Bus Monitor */
> +    { USB_DEVICE(0x10C4, 0x1601) }, /* Arkham Technology DS101 Adapter */
> +    { USB_DEVICE(0x10C4, 0x800A) }, /* SPORTident BSM7-D-USB main station */
> +    { USB_DEVICE(0x10C4, 0x803B) }, /* Pololu USB-serial converter */
> +    { USB_DEVICE(0x10C4, 0x8044) }, /* Cygnal Debug Adapter */
> +    { USB_DEVICE(0x10C4, 0x804E) }, /* Software Bisque Paramount ME build-in 
> converter */
> +    { USB_DEVICE(0x10C4, 0x8053) }, /* Enfora EDG1228 */
> +    { USB_DEVICE(0x10C4, 0x8054) }, /* Enfora GSM2228 */
> +    { USB_DEVICE(0x10C4, 0x8066) }, /* Argussoft In-System Programmer */
> +    { USB_DEVICE(0x10C4, 0x806F) }, /* IMS USB to RS422 Converter Cable */
> +    { USB_DEVICE(0x10C4, 0x807A) }, /* Crumb128 board */
> +    { USB_DEVICE(0x10C4, 0x80C4) }, /* Cygnal Integrated Products, Inc., 
> Optris infrared thermometer */
> +    { USB_DEVICE(0x10C4, 0x80CA) }, /* Degree Controls Inc */
> +    { USB_DEVICE(0x10C4, 0x80DD) }, /* Tracient RFID */
> +    { USB_DEVICE(0x10C4, 0x80F6) }, /* Suunto sports instrument */
> +    { USB_DEVICE(0x10C4, 0x8115) }, /* Arygon NFC/Mifare Reader */
> +    { USB_DEVICE(0x10C4, 0x813D) }, /* Burnside Telecom Deskmobile */
> +    { USB_DEVICE(0x10C4, 0x813F) }, /* Tams Master Easy Control */
> +    { USB_DEVICE(0x10C4, 0x814A) }, /* West Mountain Radio RIGblaster P&P */
> +    { USB_DEVICE(0x10C4, 0x814B) }, /* West Mountain Radio RIGtalk */
> +    { USB_DEVICE(0x10C4, 0x8156) }, /* B&G H3000 link cable */
> +    { USB_DEVICE(0x10C4, 0x815E) }, /* Helicomm IP-Link 1220-DVM */
> +    { USB_DEVICE(0x10C4, 0x815F) }, /* Timewave HamLinkUSB */
> +    { USB_DEVICE(0x10C4, 0x818B) }, /* AVIT Research USB to TTL */
> +    { USB_DEVICE(0x10C4, 0x819F) }, /* MJS USB Toslink Switcher */
> +    { USB_DEVICE(0x10C4, 0x81A6) }, /* ThinkOptics WavIt */
> +    { USB_DEVICE(0x10C4, 0x81A9) }, /* Multiplex RC Interface */
> +    { USB_DEVICE(0x10C4, 0x81AC) }, /* MSD Dash Hawk */
> +    { USB_DEVICE(0x10C4, 0x81AD) }, /* INSYS USB Modem */
> +    { USB_DEVICE(0x10C4, 0x81C8) }, /* Lipowsky Industrie Elektronik GmbH, 
> Baby-JTAG */
> +    { USB_DEVICE(0x10C4, 0x81E2) }, /* Lipowsky Industrie Elektronik GmbH, 
> Baby-LIN */
> +    { USB_DEVICE(0x10C4, 0x81E7) }, /* Aerocomm Radio */
> +    { USB_DEVICE(0x10C4, 0x81E8) }, /* Zephyr Bioharness */
> +    { USB_DEVICE(0x10C4, 0x81F2) }, /* C1007 HF band RFID controller */
> +    { USB_DEVICE(0x10C4, 0x8218) }, /* Lipowsky Industrie Elektronik GmbH, 
> HARP-1 */
> +    { USB_DEVICE(0x10C4, 0x822B) }, /* Modem EDGE(GSM) Comander 2 */
> +    { USB_DEVICE(0x10C4, 0x826B) }, /* Cygnal Integrated Products, Inc., 
> Fasttrax GPS demonstration module */
> +    { USB_DEVICE(0x10C4, 0x8293) }, /* Telegesis ETRX2USB */
> +    { USB_DEVICE(0x10C4, 0x82F9) }, /* Procyon AVS */
> +    { USB_DEVICE(0x10C4, 0x8341) }, /* Siemens MC35PU GPRS Modem */
> +    { USB_DEVICE(0x10C4, 0x8382) }, /* Cygnal Integrated Products, Inc. */
> +    { USB_DEVICE(0x10C4, 0x83A8) }, /* Amber Wireless AMB2560 */
> +    { USB_DEVICE(0x10C4, 0x83D8) }, /* DekTec DTA Plus VHF/UHF 
> Booster/Attenuator */
> +    { USB_DEVICE(0x10C4, 0x8411) }, /* Kyocera GPS Module */
> +    { USB_DEVICE(0x10C4, 0x8418) }, /* IRZ Automation Teleport SG-10 
> GSM/GPRS Modem */
> +    { USB_DEVICE(0x10C4, 0x846E) }, /* BEI USB Sensor Interface (VCP) */
> +    { USB_DEVICE(0x10C4, 0x8477) }, /* Balluff RFID */
> +    { USB_DEVICE(0x10C4, 0x85EA) }, /* AC-Services IBUS-IF */
> +    { USB_DEVICE(0x10C4, 0x85EB) }, /* AC-Services CIS-IBUS */
> +    { USB_DEVICE(0x10C4, 0x8664) }, /* AC-Services CAN-IF */
> +    { USB_DEVICE(0x10C4, 0x8665) }, /* AC-Services OBD-IF */
> +    { USB_DEVICE(0x10C4, 0xEA60) }, /* Silicon Labs factory default */
> +    { USB_DEVICE(0x10C4, 0xEA61) }, /* Silicon Labs factory default */
> +    { USB_DEVICE(0x10C4, 0xEA70) }, /* Silicon Labs factory default */
> +    { USB_DEVICE(0x10C4, 0xEA80) }, /* Silicon Labs factory default */
> +    { USB_DEVICE(0x10C4, 0xEA71) }, /* Infinity GPS-MIC-1 Radio Monophone */
> +    { USB_DEVICE(0x10C4, 0xF001) }, /* Elan Digital Systems USBscope50 */
> +    { USB_DEVICE(0x10C4, 0xF002) }, /* Elan Digital Systems USBwave12 */
> +    { USB_DEVICE(0x10C4, 0xF003) }, /* Elan Digital Systems USBpulse100 */
> +    { USB_DEVICE(0x10C4, 0xF004) }, /* Elan Digital Systems USBcount50 */
> +    { USB_DEVICE(0x10C5, 0xEA61) }, /* Silicon Labs MobiData GPRS USB Modem 
> */
> +    { USB_DEVICE(0x10CE, 0xEA6A) }, /* Silicon Labs MobiData GPRS USB Modem 
> 100EU */
> +    { USB_DEVICE(0x13AD, 0x9999) }, /* Baltech card reader */
> +    { USB_DEVICE(0x1555, 0x0004) }, /* Owen AC4 USB-RS485 Converter */
> +    { USB_DEVICE(0x166A, 0x0201) }, /* Clipsal 5500PACA C-Bus Pascal 
> Automation Controller */
> +    { USB_DEVICE(0x166A, 0x0301) }, /* Clipsal 5800PC C-Bus Wireless PC 
> Interface */
> +    { USB_DEVICE(0x166A, 0x0303) }, /* Clipsal 5500PCU C-Bus USB interface */
> +    { USB_DEVICE(0x166A, 0x0304) }, /* Clipsal 5000CT2 C-Bus Black and White 
> Touchscreen */
> +    { USB_DEVICE(0x166A, 0x0305) }, /* Clipsal C-5000CT2 C-Bus Spectrum 
> Colour Touchscreen */
> +    { USB_DEVICE(0x166A, 0x0401) }, /* Clipsal L51xx C-Bus Architectural 
> Dimmer */
> +    { USB_DEVICE(0x166A, 0x0101) }, /* Clipsal 5560884 C-Bus Multi-room 
> Audio Matrix Switcher */
> +    { USB_DEVICE(0x16D6, 0x0001) }, /* Jablotron serial interface */
> +    { USB_DEVICE(0x16DC, 0x0010) }, /* W-IE-NE-R Plein & Baus GmbH PL512 
> Power Supply */
> +    { USB_DEVICE(0x16DC, 0x0011) }, /* W-IE-NE-R Plein & Baus GmbH RCM 
> Remote Control for MARATON Power Supply */
> +    { USB_DEVICE(0x16DC, 0x0012) }, /* W-IE-NE-R Plein & Baus GmbH MPOD 
> Multi Channel Power Supply */
> +    { USB_DEVICE(0x16DC, 0x0015) }, /* W-IE-NE-R Plein & Baus GmbH CML 
> Control, Monitoring and Data Logger */
> +    { USB_DEVICE(0x17A8, 0x0001) }, /* Kamstrup Optical Eye/3-wire */
> +    { USB_DEVICE(0x17A8, 0x0005) }, /* Kamstrup M-Bus Master MultiPort 250D 
> */
> +    { USB_DEVICE(0x17F4, 0xAAAA) }, /* Wavesense Jazz blood glucose meter */
> +    { USB_DEVICE(0x1843, 0x0200) }, /* Vaisala USB Instrument Cable */
> +    { USB_DEVICE(0x18EF, 0xE00F) }, /* ELV USB-I2C-Interface */
> +    { USB_DEVICE(0x1BE3, 0x07A6) }, /* WAGO 750-923 USB Service Cable */
> +    { USB_DEVICE(0x1E29, 0x0102) }, /* Festo CPX-USB */
> +    { USB_DEVICE(0x1E29, 0x0501) }, /* Festo CMSP */
> +    { USB_DEVICE(0x3195, 0xF190) }, /* Link Instruments MSO-19 */
> +    { USB_DEVICE(0x3195, 0xF280) }, /* Link Instruments MSO-28 */
> +    { USB_DEVICE(0x3195, 0xF281) }, /* Link Instruments MSO-28 */
> +    { USB_DEVICE(0x413C, 0x9500) }, /* DW700 GPS USB interface */
> +
> +    /*
> +     * Prolific pl2303 USB to RS232 serial adapter ids
> +     * copied from linux/drivers/usb/serial/pl2303.c
> +     *
> +     * Copyright (C) 2001-2007 Greg Kroah-Hartman (address@hidden)
> +     * Copyright (C) 2003 IBM Corp.
> +     */
> +    { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID) },
> +    { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_RSAQ2) },
> +    { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_DCU11) },
> +    { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_RSAQ3) },
> +    { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_PHAROS) },
> +    { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_ALDIGA) },
> +    { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_MMX) },
> +    { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_GPRS) },
> +    { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_HCR331) },
> +    { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_MOTOROLA) },
> +    { USB_DEVICE(IODATA_VENDOR_ID, IODATA_PRODUCT_ID) },
> +    { USB_DEVICE(IODATA_VENDOR_ID, IODATA_PRODUCT_ID_RSAQ5) },
> +    { USB_DEVICE(ATEN_VENDOR_ID, ATEN_PRODUCT_ID) },
> +    { USB_DEVICE(ATEN_VENDOR_ID2, ATEN_PRODUCT_ID) },
> +    { USB_DEVICE(ELCOM_VENDOR_ID, ELCOM_PRODUCT_ID) },
> +    { USB_DEVICE(ELCOM_VENDOR_ID, ELCOM_PRODUCT_ID_UCSGT) },
> +    { USB_DEVICE(ITEGNO_VENDOR_ID, ITEGNO_PRODUCT_ID) },
> +    { USB_DEVICE(ITEGNO_VENDOR_ID, ITEGNO_PRODUCT_ID_2080) },
> +    { USB_DEVICE(MA620_VENDOR_ID, MA620_PRODUCT_ID) },
> +    { USB_DEVICE(RATOC_VENDOR_ID, RATOC_PRODUCT_ID) },
> +    { USB_DEVICE(TRIPP_VENDOR_ID, TRIPP_PRODUCT_ID) },
> +    { USB_DEVICE(RADIOSHACK_VENDOR_ID, RADIOSHACK_PRODUCT_ID) },
> +    { USB_DEVICE(DCU10_VENDOR_ID, DCU10_PRODUCT_ID) },
> +    { USB_DEVICE(SITECOM_VENDOR_ID, SITECOM_PRODUCT_ID) },
> +    { USB_DEVICE(ALCATEL_VENDOR_ID, ALCATEL_PRODUCT_ID) },
> +    { USB_DEVICE(SAMSUNG_VENDOR_ID, SAMSUNG_PRODUCT_ID) },
> +    { USB_DEVICE(SIEMENS_VENDOR_ID, SIEMENS_PRODUCT_ID_SX1) },
> +    { USB_DEVICE(SIEMENS_VENDOR_ID, SIEMENS_PRODUCT_ID_X65) },
> +    { USB_DEVICE(SIEMENS_VENDOR_ID, SIEMENS_PRODUCT_ID_X75) },
> +    { USB_DEVICE(SIEMENS_VENDOR_ID, SIEMENS_PRODUCT_ID_EF81) },
> +    { USB_DEVICE(BENQ_VENDOR_ID, BENQ_PRODUCT_ID_S81) }, /* Benq/Siemens S81 
> */
> +    { USB_DEVICE(SYNTECH_VENDOR_ID, SYNTECH_PRODUCT_ID) },
> +    { USB_DEVICE(NOKIA_CA42_VENDOR_ID, NOKIA_CA42_PRODUCT_ID) },
> +    { USB_DEVICE(CA_42_CA42_VENDOR_ID, CA_42_CA42_PRODUCT_ID) },
> +    { USB_DEVICE(SAGEM_VENDOR_ID, SAGEM_PRODUCT_ID) },
> +    { USB_DEVICE(LEADTEK_VENDOR_ID, LEADTEK_9531_PRODUCT_ID) },
> +    { USB_DEVICE(SPEEDDRAGON_VENDOR_ID, SPEEDDRAGON_PRODUCT_ID) },
> +    { USB_DEVICE(DATAPILOT_U2_VENDOR_ID, DATAPILOT_U2_PRODUCT_ID) },
> +    { USB_DEVICE(BELKIN_VENDOR_ID, BELKIN_PRODUCT_ID) },
> +    { USB_DEVICE(ALCOR_VENDOR_ID, ALCOR_PRODUCT_ID) },
> +    { USB_DEVICE(WS002IN_VENDOR_ID, WS002IN_PRODUCT_ID) },
> +    { USB_DEVICE(COREGA_VENDOR_ID, COREGA_PRODUCT_ID) },
> +    { USB_DEVICE(YCCABLE_VENDOR_ID, YCCABLE_PRODUCT_ID) },
> +    { USB_DEVICE(SUPERIAL_VENDOR_ID, SUPERIAL_PRODUCT_ID) },
> +    { USB_DEVICE(HP_VENDOR_ID, HP_LD220_PRODUCT_ID) },
> +    { USB_DEVICE(CRESSI_VENDOR_ID, CRESSI_EDY_PRODUCT_ID) },
> +    { USB_DEVICE(ZEAGLE_VENDOR_ID, ZEAGLE_N2ITION3_PRODUCT_ID) },
> +    { USB_DEVICE(SONY_VENDOR_ID, SONY_QN3USB_PRODUCT_ID) },
> +    { USB_DEVICE(SANWA_VENDOR_ID, SANWA_PRODUCT_ID) },
> +    { USB_DEVICE(ADLINK_VENDOR_ID, ADLINK_ND6530_PRODUCT_ID) },
> +    { USB_DEVICE(SMART_VENDOR_ID, SMART_PRODUCT_ID) },
> +
> +    { USB_DEVICE(-1, -1) } /* Terminating Entry */
> +};
> +
> +static const struct usb_device_id usbredir_ftdi_serial_ids[] = {
> +    /*
> +     * FTDI USB to RS232 serial adapter ids
> +     * copied from linux/drivers/usb/serial/ftdi_sio.c
> +     *
> +     * Copyright (C) 2009 - 2010
> +     *    Johan Hovold (address@hidden)
> +     * Copyright (C) 1999 - 2001
> +     *    Greg Kroah-Hartman (address@hidden)
> +     *    Bill Ryder (address@hidden)
> +     * Copyright (C) 2002
> +     *    Kuba Ober (address@hidden)
> +     */
> +    { USB_DEVICE(FTDI_VID, FTDI_ZEITCONTROL_TAGTRACE_MIFARE_PID) },
> +    { USB_DEVICE(FTDI_VID, FTDI_CTI_MINI_PID) },
> +    { USB_DEVICE(FTDI_VID, FTDI_CTI_NANO_PID) },
> +    { USB_DEVICE(FTDI_VID, FTDI_AMC232_PID) },
> +    { USB_DEVICE(FTDI_VID, FTDI_CANUSB_PID) },
> +    { USB_DEVICE(FTDI_VID, FTDI_CANDAPTER_PID) },
> +    { USB_DEVICE(FTDI_VID, FTDI_NXTCAM_PID) },
> +    { 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) },
> +    { USB_DEVICE(FTDI_VID, FTDI_USINT_CAT_PID) },
> +    { USB_DEVICE(FTDI_VID, FTDI_USINT_WKEY_PID) },
> +    { USB_DEVICE(FTDI_VID, FTDI_USINT_RS232_PID) },
> +    { USB_DEVICE(FTDI_VID, FTDI_ACTZWAVE_PID) },
> +    { USB_DEVICE(FTDI_VID, FTDI_IRTRANS_PID) },
> +    { USB_DEVICE(FTDI_VID, FTDI_IPLUS_PID) },
> +    { USB_DEVICE(FTDI_VID, FTDI_IPLUS2_PID) },
> +    { USB_DEVICE(FTDI_VID, FTDI_DMX4ALL) },
> +    { USB_DEVICE(FTDI_VID, FTDI_SIO_PID) },
> +    { USB_DEVICE(FTDI_VID, FTDI_8U232AM_PID) },
> +    { USB_DEVICE(FTDI_VID, FTDI_8U232AM_ALT_PID) },
> +    { USB_DEVICE(FTDI_VID, FTDI_232RL_PID) },
> +    { USB_DEVICE(FTDI_VID, FTDI_8U2232C_PID) },
> +    { USB_DEVICE(FTDI_VID, FTDI_4232H_PID) },
> +    { USB_DEVICE(FTDI_VID, FTDI_232H_PID) },
> +    { USB_DEVICE(FTDI_VID, FTDI_FTX_PID) },
> +    { USB_DEVICE(FTDI_VID, FTDI_MICRO_CHAMELEON_PID) },
> +    { USB_DEVICE(FTDI_VID, FTDI_RELAIS_PID) },
> +    { USB_DEVICE(FTDI_VID, FTDI_OPENDCC_PID) },
> +    { USB_DEVICE(FTDI_VID, FTDI_OPENDCC_SNIFFER_PID) },
> +    { USB_DEVICE(FTDI_VID, FTDI_OPENDCC_THROTTLE_PID) },
> +    { USB_DEVICE(FTDI_VID, FTDI_OPENDCC_GATEWAY_PID) },
> +    { USB_DEVICE(FTDI_VID, FTDI_OPENDCC_GBM_PID) },
> +    { USB_DEVICE(INTERBIOMETRICS_VID, INTERBIOMETRICS_IOBOARD_PID) },
> +    { USB_DEVICE(INTERBIOMETRICS_VID, INTERBIOMETRICS_MINI_IOBOARD_PID) },
> +    { USB_DEVICE(FTDI_VID, FTDI_SPROG_II) },
> +    { USB_DEVICE(FTDI_VID, FTDI_LENZ_LIUSB_PID) },
> +    { 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_VID, FTDI_URBAN_0_PID) },
> +    { USB_DEVICE(FTDI_VID, FTDI_URBAN_1_PID) },
> +    { USB_DEVICE(FTDI_NF_RIC_VID, FTDI_NF_RIC_PID) },
> +    { USB_DEVICE(FTDI_VID, FTDI_VNHCPCUSB_D_PID) },
> +    { 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) },
> +    { USB_DEVICE(FTDI_VID, FTDI_R2000KU_TRUE_RNG) },
> +    { USB_DEVICE(FTDI_VID, FTDI_VARDAAN_PID) },
> +    { 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) },
> +    { 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) },
> +    { 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) },
> +    { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0154_PID) },
> +    { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0155_PID) },
> +    { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0156_PID) },
> +    { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0157_PID) },
> +    { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0158_PID) },
> +    { 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) },
> +    { USB_DEVICE(FTDI_VID, FTDI_PERLE_ULTRAPORT_PID) },
> +    { USB_DEVICE(FTDI_VID, FTDI_PIEGROUP_PID) },
> +    { USB_DEVICE(FTDI_VID, FTDI_TNC_X_PID) },
> +    { USB_DEVICE(FTDI_VID, FTDI_USBX_707_PID) },
> +    { 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) },
> +    { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2106_PID) },
> +    { 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(SEALEVEL_VID, SEALEVEL_2803R_1_PID) },
> +    { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2803R_2_PID) },
> +    { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2803R_3_PID) },
> +    { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2803R_4_PID) },
> +    { USB_DEVICE(IDTECH_VID, IDTECH_IDT1221U_PID) },
> +    { USB_DEVICE(OCT_VID, OCT_US101_PID) },
> +    { USB_DEVICE(OCT_VID, OCT_DK201_PID) },
> +    { USB_DEVICE(FTDI_VID, FTDI_HE_TIRA1_PID) },
> +    { USB_DEVICE(FTDI_VID, FTDI_USB_UIRT_PID) },
> +    { 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) },
> +    { 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) },
> +    { USB_DEVICE(FTDI_VID, FTDI_ELV_UO100_PID) },
> +    { USB_DEVICE(FTDI_VID, FTDI_ELV_UM100_PID) },
> +    { USB_DEVICE(FTDI_VID, FTDI_ELV_UR100_PID) },
> +    { USB_DEVICE(FTDI_VID, FTDI_ELV_ALC8500_PID) },
> +    { USB_DEVICE(FTDI_VID, FTDI_PYRAMID_PID) },
> +    { USB_DEVICE(FTDI_VID, FTDI_ELV_FHZ1000PC_PID) },
> +    { 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) },
> +    { USB_DEVICE(FTDI_VID, FTDI_TAVIR_STK500_PID) },
> +    { USB_DEVICE(FTDI_VID, FTDI_TIAO_UMPA_PID) },
> +    /*
> +     * ELV devices:
> +     */
> +    { 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) },
> +    { 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) },
> +    { USB_DEVICE(FTDI_VID, FTDI_ELV_UTP8_PID) },
> +    { USB_DEVICE(FTDI_VID, FTDI_ELV_WS300PC_PID) },
> +    { USB_DEVICE(FTDI_VID, FTDI_ELV_WS444PC_PID) },
> +    { USB_DEVICE(FTDI_VID, FTDI_ELV_FHZ1300PC_PID) },
> +    { USB_DEVICE(FTDI_VID, FTDI_ELV_EM1010PC_PID) },
> +    { USB_DEVICE(FTDI_VID, FTDI_ELV_WS500_PID) },
> +    { USB_DEVICE(FTDI_VID, FTDI_ELV_HS485_PID) },
> +    { 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) },
> +    { 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) },
> +    { USB_DEVICE(FTDI_VID, FTDI_CCSMACHX_2_PID) },
> +    { 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) },
> +    { 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) },
> +    { USB_DEVICE(FALCOM_VID, FALCOM_SAMBA_PID) },
> +    { USB_DEVICE(FTDI_VID, FTDI_SUUNTO_SPORTS_PID) },
> +    { USB_DEVICE(FTDI_VID, FTDI_OCEANIC_PID) },
> +    { USB_DEVICE(TTI_VID, TTI_QL355P_PID) },
> +    { USB_DEVICE(FTDI_VID, FTDI_RM_CANVIEW_PID) },
> +    { USB_DEVICE(ACTON_VID, ACTON_SPECTRAPRO_PID) },
> +    { USB_DEVICE(CONTEC_VID, CONTEC_COM1USBH_PID) },
> +    { USB_DEVICE(BANDB_VID, BANDB_USOTL4_PID) },
> +    { USB_DEVICE(BANDB_VID, BANDB_USTL4_PID) },
> +    { USB_DEVICE(BANDB_VID, BANDB_USO9ML2_PID) },
> +    { 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) },
> +    { USB_DEVICE(FTDI_VID, EVER_ECO_PRO_CDS) },
> +    { USB_DEVICE(FTDI_VID, FTDI_4N_GALAXY_DE_1_PID) },
> +    { USB_DEVICE(FTDI_VID, FTDI_4N_GALAXY_DE_2_PID) },
> +    { USB_DEVICE(FTDI_VID, FTDI_4N_GALAXY_DE_3_PID) },
> +    { 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) },
> +    { USB_DEVICE(MOBILITY_VID, MOBILITY_USB_SERIAL_PID) },
> +    { USB_DEVICE(FTDI_VID, FTDI_ACTIVE_ROBOTS_PID) },
> +    { USB_DEVICE(FTDI_VID, FTDI_MHAM_KW_PID) },
> +    { USB_DEVICE(FTDI_VID, FTDI_MHAM_YS_PID) },
> +    { USB_DEVICE(FTDI_VID, FTDI_MHAM_Y6_PID) },
> +    { USB_DEVICE(FTDI_VID, FTDI_MHAM_Y8_PID) },
> +    { 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) },
> +    { USB_DEVICE(FTDI_VID, FTDI_TERATRONIK_VCP_PID) },
> +    { USB_DEVICE(FTDI_VID, FTDI_TERATRONIK_D2XX_PID) },
> +    { USB_DEVICE(EVOLUTION_VID, EVOLUTION_ER1_PID) },
> +    { USB_DEVICE(EVOLUTION_VID, EVO_HYBRID_PID) },
> +    { USB_DEVICE(EVOLUTION_VID, EVO_RCM4_PID) },
> +    { USB_DEVICE(FTDI_VID, FTDI_ARTEMIS_PID) },
> +    { USB_DEVICE(FTDI_VID, FTDI_ATIK_ATK16_PID) },
> +    { USB_DEVICE(FTDI_VID, FTDI_ATIK_ATK16C_PID) },
> +    { USB_DEVICE(FTDI_VID, FTDI_ATIK_ATK16HR_PID) },
> +    { USB_DEVICE(FTDI_VID, FTDI_ATIK_ATK16HRC_PID) },
> +    { USB_DEVICE(FTDI_VID, FTDI_ATIK_ATK16IC_PID) },
> +    { USB_DEVICE(KOBIL_VID, KOBIL_CONV_B1_PID) },
> +    { USB_DEVICE(KOBIL_VID, KOBIL_CONV_KAAN_PID) },
> +    { USB_DEVICE(POSIFLEX_VID, POSIFLEX_PP7000_PID) },
> +    { USB_DEVICE(FTDI_VID, FTDI_TTUSB_PID) },
> +    { USB_DEVICE(FTDI_VID, FTDI_ECLO_COM_1WIRE_PID) },
> +    { USB_DEVICE(FTDI_VID, FTDI_WESTREX_MODEL_777_PID) },
> +    { USB_DEVICE(FTDI_VID, FTDI_WESTREX_MODEL_8900F_PID) },
> +    { USB_DEVICE(FTDI_VID, FTDI_PCDJ_DAC2_PID) },
> +    { USB_DEVICE(FTDI_VID, FTDI_RRCIRKITS_LOCOBUFFER_PID) },
> +    { USB_DEVICE(FTDI_VID, FTDI_ASK_RDR400_PID) },
> +    { USB_DEVICE(FTDI_VID, FTDI_NZR_SEM_USB_PID) },
> +    { USB_DEVICE(ICOM_VID, ICOM_ID_1_PID) },
> +    { USB_DEVICE(ICOM_VID, ICOM_OPC_U_UC_PID) },
> +    { USB_DEVICE(ICOM_VID, ICOM_ID_RP2C1_PID) },
> +    { USB_DEVICE(ICOM_VID, ICOM_ID_RP2C2_PID) },
> +    { USB_DEVICE(ICOM_VID, ICOM_ID_RP2D_PID) },
> +    { USB_DEVICE(ICOM_VID, ICOM_ID_RP2VT_PID) },
> +    { USB_DEVICE(ICOM_VID, ICOM_ID_RP2VR_PID) },
> +    { USB_DEVICE(ICOM_VID, ICOM_ID_RP4KVT_PID) },
> +    { USB_DEVICE(ICOM_VID, ICOM_ID_RP4KVR_PID) },
> +    { USB_DEVICE(ICOM_VID, ICOM_ID_RP2KVT_PID) },
> +    { USB_DEVICE(ICOM_VID, ICOM_ID_RP2KVR_PID) },
> +    { USB_DEVICE(FTDI_VID, FTDI_ACG_HFDUAL_PID) },
> +    { USB_DEVICE(FTDI_VID, FTDI_YEI_SERVOCENTER31_PID) },
> +    { USB_DEVICE(FTDI_VID, FTDI_THORLABS_PID) },
> +    { USB_DEVICE(TESTO_VID, TESTO_USB_INTERFACE_PID) },
> +    { USB_DEVICE(FTDI_VID, FTDI_GAMMA_SCOUT_PID) },
> +    { 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) },
> +    { USB_DEVICE(ELEKTOR_VID, ELEKTOR_FT323R_PID) },
> +    { USB_DEVICE(FTDI_VID, FTDI_NDI_HUC_PID) },
> +    { USB_DEVICE(FTDI_VID, FTDI_NDI_SPECTRA_SCU_PID) },
> +    { USB_DEVICE(FTDI_VID, FTDI_NDI_FUTURE_2_PID) },
> +    { USB_DEVICE(FTDI_VID, FTDI_NDI_FUTURE_3_PID) },
> +    { USB_DEVICE(FTDI_VID, FTDI_NDI_AURORA_SCU_PID) },
> +    { USB_DEVICE(TELLDUS_VID, TELLDUS_TELLSTICK_PID) },
> +    { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_SERIAL_VX7_PID) },
> +    { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_CT29B_PID) },
> +    { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_RTS01_PID) },
> +    { USB_DEVICE(FTDI_VID, FTDI_MAXSTREAM_PID) },
> +    { USB_DEVICE(FTDI_VID, FTDI_PHI_FISCO_PID) },
> +    { USB_DEVICE(TML_VID, TML_USB_SERIAL_PID) },
> +    { USB_DEVICE(FTDI_VID, FTDI_ELSTER_UNICOM_PID) },
> +    { USB_DEVICE(FTDI_VID, FTDI_PROPOX_JTAGCABLEII_PID) },
> +    { USB_DEVICE(FTDI_VID, FTDI_PROPOX_ISPCABLEIII_PID) },
> +    { USB_DEVICE(OLIMEX_VID, OLIMEX_ARM_USB_OCD_PID) },
> +    { USB_DEVICE(OLIMEX_VID, OLIMEX_ARM_USB_OCD_H_PID) },
> +    { USB_DEVICE(FIC_VID, FIC_NEO1973_DEBUG_PID) },
> +    { USB_DEVICE(FTDI_VID, FTDI_OOCDLINK_PID) },
> +    { USB_DEVICE(FTDI_VID, LMI_LM3S_DEVEL_BOARD_PID) },
> +    { USB_DEVICE(FTDI_VID, LMI_LM3S_EVAL_BOARD_PID) },
> +    { USB_DEVICE(FTDI_VID, LMI_LM3S_ICDI_BOARD_PID) },
> +    { USB_DEVICE(FTDI_VID, FTDI_TURTELIZER_PID) },
> +    { USB_DEVICE(RATOC_VENDOR_ID, RATOC_PRODUCT_ID_USB60F) },
> +    { USB_DEVICE(FTDI_VID, FTDI_REU_TINY_PID) },
> +
> +    /* Papouch devices based on FTDI chip */
> +    { USB_DEVICE(PAPOUCH_VID, PAPOUCH_SB485_PID) },
> +    { USB_DEVICE(PAPOUCH_VID, PAPOUCH_AP485_PID) },
> +    { USB_DEVICE(PAPOUCH_VID, PAPOUCH_SB422_PID) },
> +    { USB_DEVICE(PAPOUCH_VID, PAPOUCH_SB485_2_PID) },
> +    { USB_DEVICE(PAPOUCH_VID, PAPOUCH_AP485_2_PID) },
> +    { USB_DEVICE(PAPOUCH_VID, PAPOUCH_SB422_2_PID) },
> +    { USB_DEVICE(PAPOUCH_VID, PAPOUCH_SB485S_PID) },
> +    { USB_DEVICE(PAPOUCH_VID, PAPOUCH_SB485C_PID) },
> +    { USB_DEVICE(PAPOUCH_VID, PAPOUCH_LEC_PID) },
> +    { USB_DEVICE(PAPOUCH_VID, PAPOUCH_SB232_PID) },
> +    { USB_DEVICE(PAPOUCH_VID, PAPOUCH_TMU_PID) },
> +    { USB_DEVICE(PAPOUCH_VID, PAPOUCH_IRAMP_PID) },
> +    { USB_DEVICE(PAPOUCH_VID, PAPOUCH_DRAK5_PID) },
> +    { USB_DEVICE(PAPOUCH_VID, PAPOUCH_QUIDO8x8_PID) },
> +    { USB_DEVICE(PAPOUCH_VID, PAPOUCH_QUIDO4x4_PID) },
> +    { USB_DEVICE(PAPOUCH_VID, PAPOUCH_QUIDO2x2_PID) },
> +    { USB_DEVICE(PAPOUCH_VID, PAPOUCH_QUIDO10x1_PID) },
> +    { USB_DEVICE(PAPOUCH_VID, PAPOUCH_QUIDO30x3_PID) },
> +    { USB_DEVICE(PAPOUCH_VID, PAPOUCH_QUIDO60x3_PID) },
> +    { USB_DEVICE(PAPOUCH_VID, PAPOUCH_QUIDO2x16_PID) },
> +    { USB_DEVICE(PAPOUCH_VID, PAPOUCH_QUIDO3x32_PID) },
> +    { USB_DEVICE(PAPOUCH_VID, PAPOUCH_DRAK6_PID) },
> +    { USB_DEVICE(PAPOUCH_VID, PAPOUCH_UPSUSB_PID) },
> +    { USB_DEVICE(PAPOUCH_VID, PAPOUCH_MU_PID) },
> +    { USB_DEVICE(PAPOUCH_VID, PAPOUCH_SIMUKEY_PID) },
> +    { USB_DEVICE(PAPOUCH_VID, PAPOUCH_AD4USB_PID) },
> +    { USB_DEVICE(PAPOUCH_VID, PAPOUCH_GMUX_PID) },
> +    { USB_DEVICE(PAPOUCH_VID, PAPOUCH_GMSR_PID) },
> +
> +    { USB_DEVICE(FTDI_VID, FTDI_DOMINTELL_DGQG_PID) },
> +    { USB_DEVICE(FTDI_VID, FTDI_DOMINTELL_DUSB_PID) },
> +    { USB_DEVICE(ALTI2_VID, ALTI2_N3_PID) },
> +    { USB_DEVICE(FTDI_VID, DIEBOLD_BCS_SE923_PID) },
> +    { USB_DEVICE(ATMEL_VID, STK541_PID) },
> +    { USB_DEVICE(DE_VID, STB_PID) },
> +    { USB_DEVICE(DE_VID, WHT_PID) },
> +    { USB_DEVICE(ADI_VID, ADI_GNICE_PID) },
> +    { USB_DEVICE(ADI_VID, ADI_GNICEPLUS_PID) },
> +    { USB_DEVICE_AND_INTERFACE_INFO(MICROCHIP_VID, MICROCHIP_USB_BOARD_PID,
> +                                    0xff, 0xff, 0x00) },
> +    { USB_DEVICE(JETI_VID, JETI_SPC1201_PID) },
> +    { USB_DEVICE(MARVELL_VID, MARVELL_SHEEVAPLUG_PID) },
> +    { USB_DEVICE(LARSENBRUSGAARD_VID, LB_ALTITRACK_PID) },
> +    { USB_DEVICE(GN_OTOMETRICS_VID, AURICAL_USB_PID) },
> +    { USB_DEVICE(FTDI_VID, PI_C865_PID) },
> +    { USB_DEVICE(FTDI_VID, PI_C857_PID) },
> +    { USB_DEVICE(PI_VID, PI_C866_PID) },
> +    { USB_DEVICE(PI_VID, PI_C663_PID) },
> +    { USB_DEVICE(PI_VID, PI_C725_PID) },
> +    { USB_DEVICE(PI_VID, PI_E517_PID) },
> +    { USB_DEVICE(PI_VID, PI_C863_PID) },
> +    { USB_DEVICE(PI_VID, PI_E861_PID) },
> +    { USB_DEVICE(PI_VID, PI_C867_PID) },
> +    { USB_DEVICE(PI_VID, PI_E609_PID) },
> +    { USB_DEVICE(PI_VID, PI_E709_PID) },
> +    { USB_DEVICE(PI_VID, PI_100F_PID) },
> +    { USB_DEVICE(PI_VID, PI_1011_PID) },
> +    { USB_DEVICE(PI_VID, PI_1012_PID) },
> +    { USB_DEVICE(PI_VID, PI_1013_PID) },
> +    { USB_DEVICE(PI_VID, PI_1014_PID) },
> +    { USB_DEVICE(PI_VID, PI_1015_PID) },
> +    { USB_DEVICE(PI_VID, PI_1016_PID) },
> +    { USB_DEVICE(KONDO_VID, KONDO_USB_SERIAL_PID) },
> +    { USB_DEVICE(BAYER_VID, BAYER_CONTOUR_CABLE_PID) },
> +    { USB_DEVICE(FTDI_VID, MARVELL_OPENRD_PID) },
> +    { USB_DEVICE(FTDI_VID, TI_XDS100V2_PID) },
> +    { USB_DEVICE(FTDI_VID, HAMEG_HO820_PID) },
> +    { USB_DEVICE(FTDI_VID, HAMEG_HO720_PID) },
> +    { USB_DEVICE(FTDI_VID, HAMEG_HO730_PID) },
> +    { USB_DEVICE(FTDI_VID, HAMEG_HO870_PID) },
> +    { 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) },
> +    { USB_DEVICE(FTDI_VID, XVERVE_SIGNALYZER_ST_PID) },
> +    { USB_DEVICE(FTDI_VID, XVERVE_SIGNALYZER_SLITE_PID) },
> +    { USB_DEVICE(FTDI_VID, XVERVE_SIGNALYZER_SH2_PID) },
> +    { USB_DEVICE(FTDI_VID, XVERVE_SIGNALYZER_SH4_PID) },
> +    { USB_DEVICE(FTDI_VID, SEGWAY_RMP200_PID) },
> +    { USB_DEVICE(FTDI_VID, ACCESIO_COM4SM_PID) },
> +    { USB_DEVICE(IONICS_VID, IONICS_PLUGCOMPUTER_PID) },
> +    { USB_DEVICE(FTDI_VID, FTDI_CHAMSYS_24_MASTER_WING_PID) },
> +    { USB_DEVICE(FTDI_VID, FTDI_CHAMSYS_PC_WING_PID) },
> +    { USB_DEVICE(FTDI_VID, FTDI_CHAMSYS_USB_DMX_PID) },
> +    { USB_DEVICE(FTDI_VID, FTDI_CHAMSYS_MIDI_TIMECODE_PID) },
> +    { USB_DEVICE(FTDI_VID, FTDI_CHAMSYS_MINI_WING_PID) },
> +    { USB_DEVICE(FTDI_VID, FTDI_CHAMSYS_MAXI_WING_PID) },
> +    { USB_DEVICE(FTDI_VID, FTDI_CHAMSYS_MEDIA_WING_PID) },
> +    { USB_DEVICE(FTDI_VID, FTDI_CHAMSYS_WING_PID) },
> +    { USB_DEVICE(FTDI_VID, FTDI_SCIENCESCOPE_LOGBOOKML_PID) },
> +    { USB_DEVICE(FTDI_VID, FTDI_SCIENCESCOPE_LS_LOGBOOK_PID) },
> +    { USB_DEVICE(FTDI_VID, FTDI_SCIENCESCOPE_HS_LOGBOOK_PID) },
> +    { USB_DEVICE(FTDI_VID, FTDI_CINTERION_MC55I_PID) },
> +    { USB_DEVICE(FTDI_VID, FTDI_DOTEC_PID) },
> +    { USB_DEVICE(QIHARDWARE_VID, MILKYMISTONE_JTAGSERIAL_PID) },
> +    { USB_DEVICE(ST_VID, ST_STMCLT1030_PID) },
> +    { USB_DEVICE(FTDI_VID, FTDI_RF_R106) },
> +    { USB_DEVICE(FTDI_VID, FTDI_DISTORTEC_JTAG_LOCK_PICK_PID) },
> +    { USB_DEVICE(FTDI_VID, FTDI_LUMEL_PD12_PID) },
> +
> +    { USB_DEVICE(-1, -1) } /* Terminating Entry */
> +};
> +
> +#undef USB_DEVICE
> +#undef USB_DEVICE_AND_INTERFACE_INFO
> diff --git a/hw/usb/redirect.c b/hw/usb/redirect.c
> index f15dc91..f1bf84c 100644
> --- a/hw/usb/redirect.c
> +++ b/hw/usb/redirect.c
> @@ -52,11 +52,13 @@
>
>  typedef struct USBRedirDevice USBRedirDevice;
>
> -/* Struct to hold buffered packets (iso or int input packets) */
> +/* Struct to hold buffered packets */
>  struct buf_packet {
>      uint8_t *data;
> -    int len;
> -    int status;
> +    void *free_on_destroy;
> +    uint16_t len;
> +    uint16_t offset;
> +    uint8_t status;
>      QTAILQ_ENTRY(buf_packet)next;
>  };
>
> @@ -70,11 +72,14 @@ struct endp_data {
>      uint8_t iso_error; /* For reporting iso errors to the HC */
>      uint8_t interrupt_started;
>      uint8_t interrupt_error;
> +    uint8_t bulk_receiving_enabled;
> +    uint8_t bulk_receiving_started;
>      uint8_t bufpq_prefilled;
>      uint8_t bufpq_dropping_packets;
>      QTAILQ_HEAD(, buf_packet) bufpq;
>      int32_t bufpq_size;
>      int32_t bufpq_target_size;
> +    USBPacket *pending_async_packet;
>  };
>
>  struct PacketIdQueueEntry {
> @@ -108,6 +113,7 @@ struct USBRedirDevice {
>      struct endp_data endpoint[MAX_ENDPOINTS];
>      struct PacketIdQueue cancelled;
>      struct PacketIdQueue already_in_flight;
> +    void (*buffered_bulk_in_complete)(USBRedirDevice *, USBPacket *, 
> uint8_t);
>      /* Data for device filtering */
>      struct usb_redir_device_connect_header device_info;
>      struct usb_redir_interface_info_header interface_info;
> @@ -135,6 +141,8 @@ static void usbredir_interrupt_receiving_status(void 
> *priv, uint64_t id,
>      *interrupt_receiving_status);
>  static void usbredir_bulk_streams_status(void *priv, uint64_t id,
>      struct usb_redir_bulk_streams_status_header *bulk_streams_status);
> +static void usbredir_bulk_receiving_status(void *priv, uint64_t id,
> +    struct usb_redir_bulk_receiving_status_header *bulk_receiving_status);
>  static void usbredir_control_packet(void *priv, uint64_t id,
>      struct usb_redir_control_packet_header *control_packet,
>      uint8_t *data, int data_len);
> @@ -147,6 +155,9 @@ static void usbredir_iso_packet(void *priv, uint64_t id,
>  static void usbredir_interrupt_packet(void *priv, uint64_t id,
>      struct usb_redir_interrupt_packet_header *interrupt_header,
>      uint8_t *data, int data_len);
> +static void usbredir_buffered_bulk_packet(void *priv, uint64_t id,
> +    struct usb_redir_buffered_bulk_packet_header *buffered_bulk_packet,
> +    uint8_t *data, int data_len);
>
>  static void usbredir_handle_status(USBRedirDevice *dev, USBPacket *p,
>      int status);
> @@ -320,12 +331,19 @@ static void packet_id_queue_empty(struct PacketIdQueue 
> *q)
>  static void usbredir_cancel_packet(USBDevice *udev, USBPacket *p)
>  {
>      USBRedirDevice *dev = DO_UPCAST(USBRedirDevice, dev, udev);
> +    int i = USBEP2I(p->ep);
>
>      if (p->combined) {
>          usb_combined_packet_cancel(udev, p);
>          return;
>      }
>
> +    if (dev->endpoint[i].pending_async_packet) {
> +        assert(dev->endpoint[i].pending_async_packet == p);
> +        dev->endpoint[i].pending_async_packet = NULL;
> +        return;
> +    }
> +
>      packet_id_queue_add(&dev->cancelled, p->id);
>      usbredirparser_send_cancel_data_packet(dev->parser, p->id);
>      usbredirparser_do_write(dev->parser);
> @@ -344,6 +362,11 @@ static void 
> usbredir_fill_already_in_flight_from_ep(USBRedirDevice *dev,
>  {
>      static USBPacket *p;
>
> +    /* async handled packets for bulk receiving eps do not count as inflight 
> */
> +    if (dev->endpoint[USBEP2I(ep)].bulk_receiving_started) {
> +        return;
> +    }
> +
>      QTAILQ_FOREACH(p, &ep->queue, queue) {
>          /* Skip combined packets, except for the first */
>          if (p->combined && p != p->combined->first) {
> @@ -391,8 +414,8 @@ static USBPacket 
> *usbredir_find_packet_by_id(USBRedirDevice *dev,
>      return p;
>  }
>
> -static void bufp_alloc(USBRedirDevice *dev,
> -    uint8_t *data, int len, int status, uint8_t ep)
> +static void bufp_alloc(USBRedirDevice *dev, uint8_t *data, uint16_t len,
> +    uint8_t status, uint8_t ep, void *free_on_destroy)
>  {
>      struct buf_packet *bufp;
>
> @@ -416,7 +439,9 @@ static void bufp_alloc(USBRedirDevice *dev,
>      bufp = g_malloc(sizeof(struct buf_packet));
>      bufp->data   = data;
>      bufp->len    = len;
> +    bufp->offset = 0;
>      bufp->status = status;
> +    bufp->free_on_destroy = free_on_destroy;
>      QTAILQ_INSERT_TAIL(&dev->endpoint[EP2I(ep)].bufpq, bufp, next);
>      dev->endpoint[EP2I(ep)].bufpq_size++;
>  }
> @@ -426,7 +451,7 @@ static void bufp_free(USBRedirDevice *dev, struct 
> buf_packet *bufp,
>  {
>      QTAILQ_REMOVE(&dev->endpoint[EP2I(ep)].bufpq, bufp, next);
>      dev->endpoint[EP2I(ep)].bufpq_size--;
> -    free(bufp->data);
> +    free(bufp->free_on_destroy);
>      g_free(bufp);
>  }
>
> @@ -577,19 +602,162 @@ static void usbredir_stop_iso_stream(USBRedirDevice 
> *dev, uint8_t ep)
>      usbredir_free_bufpq(dev, ep);
>  }
>
> +/*
> + * The usb-host may poll the endpoint faster then our guest, resulting in 
> lots
> + * of smaller bulkp-s. The below buffered_bulk_in_complete* functions combine
> + * data from multiple bulkp-s into a single packet, avoiding bufpq overflows.
> + */
> +static void usbredir_buffered_bulk_add_data_to_packet(USBRedirDevice *dev,
> +    struct buf_packet *bulkp, int count, USBPacket *p, uint8_t ep)
> +{
> +    usb_packet_copy(p, bulkp->data + bulkp->offset, count);
> +    bulkp->offset += count;
> +    if (bulkp->offset == bulkp->len) {
> +        /* Store status in the last packet with data from this bulkp */
> +        usbredir_handle_status(dev, p, bulkp->status);
> +        bufp_free(dev, bulkp, ep);
> +    }
> +}
> +
> +static void usbredir_buffered_bulk_in_complete_raw(USBRedirDevice *dev,
> +    USBPacket *p, uint8_t ep)
> +{
> +    struct buf_packet *bulkp;
> +    int count;
> +
> +    while ((bulkp = QTAILQ_FIRST(&dev->endpoint[EP2I(ep)].bufpq)) &&
> +           p->actual_length < p->iov.size && p->status == USB_RET_SUCCESS) {
> +        count = bulkp->len - bulkp->offset;
> +        if (count > (p->iov.size - p->actual_length)) {
> +            count = p->iov.size - p->actual_length;
> +        }
> +        usbredir_buffered_bulk_add_data_to_packet(dev, bulkp, count, p, ep);
> +    }
> +}
> +
> +static void usbredir_buffered_bulk_in_complete_ftdi(USBRedirDevice *dev,
> +    USBPacket *p, uint8_t ep)
> +{
> +    const int maxp = dev->endpoint[EP2I(ep)].max_packet_size;
> +    uint8_t header[2] = { 0, 0 };
> +    struct buf_packet *bulkp;
> +    int count;
> +
> +    while ((bulkp = QTAILQ_FIRST(&dev->endpoint[EP2I(ep)].bufpq)) &&
> +           p->actual_length < p->iov.size && p->status == USB_RET_SUCCESS) {
> +        if (bulkp->len < 2) {
> +            WARNING("malformed ftdi bulk in packet\n");
> +            bufp_free(dev, bulkp, ep);
> +            continue;
> +        }
> +
> +        if ((p->actual_length % maxp) == 0) {
> +            usb_packet_copy(p, bulkp->data, 2);
> +            memcpy(header, bulkp->data, 2);
> +        } else {
> +            if (bulkp->data[0] != header[0] || bulkp->data[1] != header[1]) {
> +                break; /* Different header, add to next packet */
> +            }
> +        }
> +
> +        if (bulkp->offset == 0) {
> +            bulkp->offset = 2; /* Skip header */
> +        }
> +        count = bulkp->len - bulkp->offset;
> +        /* Must repeat the header at maxp interval */
> +        if (count > (maxp - (p->actual_length % maxp))) {
> +            count = maxp - (p->actual_length % maxp);
> +        }
> +        usbredir_buffered_bulk_add_data_to_packet(dev, bulkp, count, p, ep);
> +    }
> +}
> +
> +static void usbredir_buffered_bulk_in_complete(USBRedirDevice *dev,
> +    USBPacket *p, uint8_t ep)
> +{
> +    p->status = USB_RET_SUCCESS; /* Clear previous ASYNC status */
> +    dev->buffered_bulk_in_complete(dev, p, ep);
> +    DPRINTF("bulk-token-in ep %02X status %d len %d id %"PRIu64"\n",
> +            ep, p->status, p->actual_length, p->id);
> +}
> +
> +static void usbredir_handle_buffered_bulk_in_data(USBRedirDevice *dev,
> +    USBPacket *p, uint8_t ep)
> +{
> +    /* Input bulk endpoint, buffered packet input */
> +    if (!dev->endpoint[EP2I(ep)].bulk_receiving_started) {
> +        int bpt;
> +        struct usb_redir_start_bulk_receiving_header start = {
> +            .endpoint = ep,
> +            .stream_id = 0,
> +            .no_transfers = 5,
> +        };
> +        /* Round bytes_per_transfer up to a multiple of max_packet_size */
> +        bpt = 512 + dev->endpoint[EP2I(ep)].max_packet_size - 1;
> +        bpt /= dev->endpoint[EP2I(ep)].max_packet_size;
> +        bpt *= dev->endpoint[EP2I(ep)].max_packet_size;
> +        start.bytes_per_transfer = bpt;
> +        /* No id, we look at the ep when receiving a status back */
> +        usbredirparser_send_start_bulk_receiving(dev->parser, 0, &start);
> +        usbredirparser_do_write(dev->parser);
> +        DPRINTF("bulk receiving started bytes/transfer %u count %d ep 
> %02X\n",
> +                start.bytes_per_transfer, start.no_transfers, ep);
> +        dev->endpoint[EP2I(ep)].bulk_receiving_started = 1;
> +        /* We don't really want to drop bulk packets ever, but
> +           having some upper limit to how much we buffer is good. */
> +        dev->endpoint[EP2I(ep)].bufpq_target_size = 5000;
> +        dev->endpoint[EP2I(ep)].bufpq_dropping_packets = 0;
> +    }
> +
> +    if (QTAILQ_EMPTY(&dev->endpoint[EP2I(ep)].bufpq)) {
> +        DPRINTF("bulk-token-in ep %02X, no bulkp\n", ep);
> +        assert(dev->endpoint[EP2I(ep)].pending_async_packet == NULL);
> +        dev->endpoint[EP2I(ep)].pending_async_packet = p;
> +        p->status = USB_RET_ASYNC;
> +        return;
> +    }
> +    usbredir_buffered_bulk_in_complete(dev, p, ep);
> +}
> +
> +static void usbredir_stop_bulk_receiving(USBRedirDevice *dev, uint8_t ep)
> +{
> +    struct usb_redir_stop_bulk_receiving_header stop_bulk = {
> +        .endpoint = ep,
> +        .stream_id = 0,
> +    };
> +    if (dev->endpoint[EP2I(ep)].bulk_receiving_started) {
> +        usbredirparser_send_stop_bulk_receiving(dev->parser, 0, &stop_bulk);
> +        DPRINTF("bulk receiving stopped ep %02X\n", ep);
> +        dev->endpoint[EP2I(ep)].bulk_receiving_started = 0;
> +    }
> +    usbredir_free_bufpq(dev, ep);
> +}
> +
>  static void usbredir_handle_bulk_data(USBRedirDevice *dev, USBPacket *p,
>                                        uint8_t ep)
>  {
>      struct usb_redir_bulk_packet_header bulk_packet;
>      size_t size = (p->combined) ? p->combined->iov.size : p->iov.size;
> -
> -    DPRINTF("bulk-out ep %02X len %zd id %"PRIu64"\n", ep, size, p->id);
> +    const int maxp = dev->endpoint[EP2I(ep)].max_packet_size;
>
>      if (usbredir_already_in_flight(dev, p->id)) {
>          p->status = USB_RET_ASYNC;
>          return;
>      }
>
> +    if (dev->endpoint[EP2I(ep)].bulk_receiving_enabled) {
> +        if (size != 0 && (size % maxp) == 0) {
> +            usbredir_handle_buffered_bulk_in_data(dev, p, ep);
> +            return;
> +        }
> +        WARNING("bulk recv invalid size %zd ep %02x, disabling\n", size, ep);
> +        assert(dev->endpoint[EP2I(ep)].pending_async_packet == NULL);
> +        usbredir_stop_bulk_receiving(dev, ep);
> +        dev->endpoint[EP2I(ep)].bulk_receiving_enabled = 0;
> +    }
> +
> +    DPRINTF("bulk-out ep %02X len %zd id %"PRIu64"\n", ep, size, p->id);
> +
>      bulk_packet.endpoint  = ep;
>      bulk_packet.length    = size;
>      bulk_packet.stream_id = 0;
> @@ -726,9 +894,6 @@ static void usbredir_handle_data(USBDevice *udev, 
> USBPacket *p)
>          ERROR("handle_data called for control transfer on ep %02X\n", ep);
>          p->status = USB_RET_NAK;
>          break;
> -    case USB_ENDPOINT_XFER_ISOC:
> -        usbredir_handle_iso_data(dev, p, ep);
> -        break;
>      case USB_ENDPOINT_XFER_BULK:
>          if (p->state == USB_PACKET_SETUP && p->pid == USB_TOKEN_IN &&
>                  p->ep->pipeline) {
> @@ -737,6 +902,9 @@ static void usbredir_handle_data(USBDevice *udev, 
> USBPacket *p)
>          }
>          usbredir_handle_bulk_data(dev, p, ep);
>          break;
> +    case USB_ENDPOINT_XFER_ISOC:
> +        usbredir_handle_iso_data(dev, p, ep);
> +        break;
>      case USB_ENDPOINT_XFER_INT:
>          if (ep & USB_DIR_IN) {
>              usbredir_handle_interrupt_in_data(dev, p, ep);
> @@ -763,6 +931,11 @@ static void usbredir_stop_ep(USBRedirDevice *dev, int i)
>      uint8_t ep = I2EP(i);
>
>      switch (dev->endpoint[i].type) {
> +    case USB_ENDPOINT_XFER_BULK:
> +        if (ep & USB_DIR_IN) {
> +            usbredir_stop_bulk_receiving(dev, ep);
> +        }
> +        break;
>      case USB_ENDPOINT_XFER_ISOC:
>          usbredir_stop_iso_stream(dev, ep);
>          break;
> @@ -942,10 +1115,12 @@ static void usbredir_create_parser(USBRedirDevice *dev)
>      dev->parser->interrupt_receiving_status_func =
>          usbredir_interrupt_receiving_status;
>      dev->parser->bulk_streams_status_func = usbredir_bulk_streams_status;
> +    dev->parser->bulk_receiving_status_func = usbredir_bulk_receiving_status;
>      dev->parser->control_packet_func = usbredir_control_packet;
>      dev->parser->bulk_packet_func = usbredir_bulk_packet;
>      dev->parser->iso_packet_func = usbredir_iso_packet;
>      dev->parser->interrupt_packet_func = usbredir_interrupt_packet;
> +    dev->parser->buffered_bulk_packet_func = usbredir_buffered_bulk_packet;
>      dev->read_buf = NULL;
>      dev->read_buf_size = 0;
>
> @@ -954,6 +1129,7 @@ static void usbredir_create_parser(USBRedirDevice *dev)
>      usbredirparser_caps_set_cap(caps, usb_redir_cap_ep_info_max_packet_size);
>      usbredirparser_caps_set_cap(caps, usb_redir_cap_64bits_ids);
>      usbredirparser_caps_set_cap(caps, usb_redir_cap_32bits_bulk_length);
> +    usbredirparser_caps_set_cap(caps, usb_redir_cap_bulk_receiving);
>
>      if (runstate_check(RUN_STATE_INMIGRATE)) {
>          flags |= usbredirparser_fl_no_hello;
> @@ -1192,6 +1368,52 @@ error:
>      return -1;
>  }
>
> +static void usbredir_check_bulk_receiving(USBRedirDevice *dev)
> +{
> +    int i, j, quirks;
> +
> +    if (!usbredirparser_peer_has_cap(dev->parser,
> +                                     usb_redir_cap_bulk_receiving)) {
> +        return;
> +    }
> +
> +    for (i = EP2I(USB_DIR_IN); i < MAX_ENDPOINTS; i++) {
> +        dev->endpoint[i].bulk_receiving_enabled = 0;
> +    }
> +    for (i = 0; i < dev->interface_info.interface_count; i++) {
> +        quirks = usb_get_quirks(dev->device_info.vendor_id,
> +                                dev->device_info.product_id,
> +                                dev->interface_info.interface_class[i],
> +                                dev->interface_info.interface_subclass[i],
> +                                dev->interface_info.interface_protocol[i]);
> +        if (!(quirks & USB_QUIRK_BUFFER_BULK_IN)) {
> +            continue;
> +        }
> +        if (quirks & USB_QUIRK_IS_FTDI) {
> +            dev->buffered_bulk_in_complete =
> +                usbredir_buffered_bulk_in_complete_ftdi;
> +        } else {
> +            dev->buffered_bulk_in_complete =
> +                usbredir_buffered_bulk_in_complete_raw;
> +        }
> +
> +        for (j = EP2I(USB_DIR_IN); j < MAX_ENDPOINTS; j++) {
> +            if (dev->endpoint[j].interface ==
> +                                    dev->interface_info.interface[i] &&
> +                    dev->endpoint[j].type == USB_ENDPOINT_XFER_BULK &&
> +                    dev->endpoint[j].max_packet_size != 0) {
> +                dev->endpoint[j].bulk_receiving_enabled = 1;
> +                /*
> +                 * With buffering pipelining is not necessary. Also packet
> +                 * combining and bulk in buffering don't play nice together!
> +                 */
> +                I2USBEP(dev, j)->pipeline = false;
> +                break; /* Only buffer for the first ep of each intf */
> +            }
> +        }
> +    }
> +}
> +
>  /*
>   * usbredirparser packet complete callbacks
>   */
> @@ -1300,6 +1522,7 @@ static void usbredir_device_connect(void *priv,
>          return;
>      }
>
> +    usbredir_check_bulk_receiving(dev);
>      qemu_mod_timer(dev->attach_timer, dev->next_attach_time);
>  }
>
> @@ -1338,9 +1561,10 @@ static void usbredir_interface_info(void *priv,
>
>      /*
>       * If we receive interface info after the device has already been
> -     * connected (ie on a set_config), re-check the filter.
> +     * connected (ie on a set_config), re-check interface dependent things.
>       */
>      if (qemu_timer_pending(dev->attach_timer) || dev->dev.attached) {
> +        usbredir_check_bulk_receiving(dev);
>          if (usbredir_check_filter(dev)) {
>              ERROR("Device no longer matches filter after interface info "
>                    "change, disconnecting!\n");
> @@ -1441,6 +1665,7 @@ static void usbredir_ep_info(void *priv,
>          return;
>      }
>      usbredir_setup_usb_eps(dev);
> +    usbredir_check_bulk_receiving(dev);
>  }
>
>  static void usbredir_configuration_status(void *priv, uint64_t id,
> @@ -1531,6 +1756,25 @@ static void usbredir_bulk_streams_status(void *priv, 
> uint64_t id,
>  {
>  }
>
> +static void usbredir_bulk_receiving_status(void *priv, uint64_t id,
> +    struct usb_redir_bulk_receiving_status_header *bulk_receiving_status)
> +{
> +    USBRedirDevice *dev = priv;
> +    uint8_t ep = bulk_receiving_status->endpoint;
> +
> +    DPRINTF("bulk recv status %d ep %02X id %"PRIu64"\n",
> +            bulk_receiving_status->status, ep, id);
> +
> +    if (!dev->dev.attached || 
> !dev->endpoint[EP2I(ep)].bulk_receiving_started) {
> +        return;
> +    }
> +
> +    if (bulk_receiving_status->status == usb_redir_stall) {
> +        DPRINTF("bulk receiving stopped by peer ep %02X\n", ep);
> +        dev->endpoint[EP2I(ep)].bulk_receiving_started = 0;
> +    }
> +}
> +
>  static void usbredir_control_packet(void *priv, uint64_t id,
>      struct usb_redir_control_packet_header *control_packet,
>      uint8_t *data, int data_len)
> @@ -1636,7 +1880,7 @@ static void usbredir_iso_packet(void *priv, uint64_t id,
>      }
>
>      /* bufp_alloc also adds the packet to the ep queue */
> -    bufp_alloc(dev, data, data_len, iso_packet->status, ep);
> +    bufp_alloc(dev, data, data_len, iso_packet->status, ep, data);
>  }
>
>  static void usbredir_interrupt_packet(void *priv, uint64_t id,
> @@ -1667,7 +1911,7 @@ static void usbredir_interrupt_packet(void *priv, 
> uint64_t id,
>          }
>
>          /* bufp_alloc also adds the packet to the ep queue */
> -        bufp_alloc(dev, data, data_len, interrupt_packet->status, ep);
> +        bufp_alloc(dev, data, data_len, interrupt_packet->status, ep, data);
>      } else {
>          /*
>           * We report output interrupt packets as completed directly upon
> @@ -1680,6 +1924,52 @@ static void usbredir_interrupt_packet(void *priv, 
> uint64_t id,
>      }
>  }
>
> +static void usbredir_buffered_bulk_packet(void *priv, uint64_t id,
> +    struct usb_redir_buffered_bulk_packet_header *buffered_bulk_packet,
> +    uint8_t *data, int data_len)
> +{
> +    USBRedirDevice *dev = priv;
> +    uint8_t status, ep = buffered_bulk_packet->endpoint;
> +    void *free_on_destroy;
> +    int i, len;
> +
> +    DPRINTF("buffered-bulk-in status %d ep %02X len %d id %"PRIu64"\n",
> +            buffered_bulk_packet->status, ep, data_len, id);
> +
> +    if (dev->endpoint[EP2I(ep)].type != USB_ENDPOINT_XFER_BULK) {
> +        ERROR("received buffered-bulk packet for non bulk ep %02X\n", ep);
> +        free(data);
> +        return;
> +    }
> +
> +    if (dev->endpoint[EP2I(ep)].bulk_receiving_started == 0) {
> +        DPRINTF("received buffered-bulk packet on not started ep %02X\n", 
> ep);
> +        free(data);
> +        return;
> +    }
> +
> +    /* Data must be in maxp chunks for buffered_bulk_add_*_data_to_packet */
> +    len = dev->endpoint[EP2I(ep)].max_packet_size;
> +    status = usb_redir_success;
> +    free_on_destroy = NULL;
> +    for (i = 0; i < data_len; i += len) {
> +        if (len >= (data_len - i)) {
> +            len = data_len - i;
> +            status = buffered_bulk_packet->status;
> +            free_on_destroy = data;
> +        }
> +        /* bufp_alloc also adds the packet to the ep queue */
> +        bufp_alloc(dev, data + i, len, status, ep, free_on_destroy);
> +    }
> +
> +    if (dev->endpoint[EP2I(ep)].pending_async_packet) {
> +        USBPacket *p = dev->endpoint[EP2I(ep)].pending_async_packet;
> +        dev->endpoint[EP2I(ep)].pending_async_packet = NULL;
> +        usbredir_buffered_bulk_in_complete(dev, p, ep);
> +        usb_packet_complete(&dev->dev, p);
> +    }
> +}
> +
>  /*
>   * Migration code
>   */
> @@ -1714,6 +2004,7 @@ static int usbredir_post_load(void *priv, int 
> version_id)
>      dev->dev.speedmask = (1 << dev->dev.speed);
>
>      usbredir_setup_usb_eps(dev);
> +    usbredir_check_bulk_receiving(dev);
>
>      return 0;
>  }
> @@ -1787,15 +2078,16 @@ static void usbredir_put_bufpq(QEMUFile *f, void 
> *priv, size_t unused)
>      struct endp_data *endp = priv;
>      USBRedirDevice *dev = endp->dev;
>      struct buf_packet *bufp;
> -    int i = 0;
> +    int len, i = 0;
>
>      qemu_put_be32(f, endp->bufpq_size);
>      QTAILQ_FOREACH(bufp, &endp->bufpq, next) {
> +        len = bufp->len - bufp->offset;
>          DPRINTF("put_bufpq %d/%d len %d status %d\n", i + 1, 
> endp->bufpq_size,
> -                bufp->len, bufp->status);
> -        qemu_put_be32(f, bufp->len);
> +                len, bufp->status);
> +        qemu_put_be32(f, len);
>          qemu_put_be32(f, bufp->status);
> -        qemu_put_buffer(f, bufp->data, bufp->len);
> +        qemu_put_buffer(f, bufp->data + bufp->offset, len);
>          i++;
>      }
>      assert(i == endp->bufpq_size);
> @@ -1813,7 +2105,9 @@ static int usbredir_get_bufpq(QEMUFile *f, void *priv, 
> size_t unused)
>          bufp = g_malloc(sizeof(struct buf_packet));
>          bufp->len = qemu_get_be32(f);
>          bufp->status = qemu_get_be32(f);
> +        bufp->offset = 0;
>          bufp->data = qemu_oom_check(malloc(bufp->len)); /* regular malloc! */
> +        bufp->free_on_destroy = bufp->data;
>          qemu_get_buffer(f, bufp->data, bufp->len);
>          QTAILQ_INSERT_TAIL(&endp->bufpq, bufp, next);
>          DPRINTF("get_bufpq %d/%d len %d status %d\n", i + 1, 
> endp->bufpq_size,
> @@ -1830,6 +2124,23 @@ static const VMStateInfo 
> usbredir_ep_bufpq_vmstate_info = {
>
>
>  /* For endp_data migration */
> +static const VMStateDescription usbredir_bulk_receiving_vmstate = {
> +    .name = "usb-redir-ep/bulk-receiving",
> +    .version_id = 1,
> +    .minimum_version_id = 1,
> +    .fields = (VMStateField[]) {
> +        VMSTATE_UINT8(bulk_receiving_started, struct endp_data),
> +        VMSTATE_END_OF_LIST()
> +    }
> +};
> +
> +static bool usbredir_bulk_receiving_needed(void *priv)
> +{
> +    struct endp_data *endp = priv;
> +
> +    return endp->bulk_receiving_started;
> +}
> +
>  static const VMStateDescription usbredir_ep_vmstate = {
>      .name = "usb-redir-ep",
>      .version_id = 1,
> @@ -1856,6 +2167,14 @@ static const VMStateDescription usbredir_ep_vmstate = {
>          },
>          VMSTATE_INT32(bufpq_target_size, struct endp_data),
>          VMSTATE_END_OF_LIST()
> +    },
> +    .subsections = (VMStateSubsection[]) {
> +        {
> +            .vmsd = &usbredir_bulk_receiving_vmstate,
> +            .needed = usbredir_bulk_receiving_needed,
> +        }, {
> +            /* empty */
> +        }
>      }
>  };
>
> --
> 1.7.1
>
>



reply via email to

[Prev in Thread] Current Thread [Next in Thread]