1184610Salfred/*	$NetBSD: uipaq.c,v 1.4 2006/11/16 01:33:27 christos Exp $	*/
2184610Salfred/*	$OpenBSD: uipaq.c,v 1.1 2005/06/17 23:50:33 deraadt Exp $	*/
3184610Salfred
4184610Salfred/*
5184610Salfred * Copyright (c) 2000-2005 The NetBSD Foundation, Inc.
6184610Salfred * All rights reserved.
7184610Salfred *
8184610Salfred * This code is derived from software contributed to The NetBSD Foundation
9184610Salfred * by Lennart Augustsson (lennart@augustsson.net) at
10184610Salfred * Carlstedt Research & Technology.
11184610Salfred *
12184610Salfred * Redistribution and use in source and binary forms, with or without
13184610Salfred * modification, are permitted provided that the following conditions
14184610Salfred * are met:
15184610Salfred * 1. Redistributions of source code must retain the above copyright
16184610Salfred *    notice, this list of conditions and the following disclaimer.
17184610Salfred * 2. Redistributions in binary form must reproduce the above copyright
18184610Salfred *    notice, this list of conditions and the following disclaimer in the
19184610Salfred *    documentation and/or other materials provided with the distribution.
20184610Salfred *
21184610Salfred * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
22184610Salfred * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
23184610Salfred * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
24184610Salfred * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
25184610Salfred * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
26184610Salfred * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
27184610Salfred * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
28184610Salfred * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
29184610Salfred * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
30184610Salfred * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
31184610Salfred * POSSIBILITY OF SUCH DAMAGE.
32184610Salfred */
33184610Salfred
34184610Salfred/*
35184610Salfred * iPAQ driver
36184610Salfred *
37184610Salfred * 19 July 2003:	Incorporated changes suggested by Sam Lawrance from
38184610Salfred * 			the uppc module
39184610Salfred *
40184610Salfred *
41184610Salfred * Contact isis@cs.umd.edu if you have any questions/comments about this driver
42184610Salfred */
43184610Salfred
44184610Salfred#include <sys/cdefs.h>
45184610Salfred__FBSDID("$FreeBSD: releng/11.0/sys/dev/usb/serial/uipaq.c 292080 2015-12-11 05:28:00Z imp $");
46184610Salfred
47194677Sthompsa#include <sys/stdint.h>
48194677Sthompsa#include <sys/stddef.h>
49194677Sthompsa#include <sys/param.h>
50194677Sthompsa#include <sys/queue.h>
51194677Sthompsa#include <sys/types.h>
52194677Sthompsa#include <sys/systm.h>
53194677Sthompsa#include <sys/kernel.h>
54194677Sthompsa#include <sys/bus.h>
55194677Sthompsa#include <sys/module.h>
56194677Sthompsa#include <sys/lock.h>
57194677Sthompsa#include <sys/mutex.h>
58194677Sthompsa#include <sys/condvar.h>
59194677Sthompsa#include <sys/sysctl.h>
60194677Sthompsa#include <sys/sx.h>
61194677Sthompsa#include <sys/unistd.h>
62194677Sthompsa#include <sys/callout.h>
63194677Sthompsa#include <sys/malloc.h>
64194677Sthompsa#include <sys/priv.h>
65194677Sthompsa
66188942Sthompsa#include <dev/usb/usb.h>
67194677Sthompsa#include <dev/usb/usbdi.h>
68194677Sthompsa#include <dev/usb/usbdi_util.h>
69188942Sthompsa#include <dev/usb/usb_cdc.h>
70194677Sthompsa#include "usbdevs.h"
71184610Salfred
72194228Sthompsa#define	USB_DEBUG_VAR usb_debug
73188942Sthompsa#include <dev/usb/usb_debug.h>
74188942Sthompsa#include <dev/usb/usb_process.h>
75184610Salfred
76188942Sthompsa#include <dev/usb/serial/usb_serial.h>
77184610Salfred
78184610Salfred#define	UIPAQ_CONFIG_INDEX	0	/* config number 1 */
79184610Salfred#define	UIPAQ_IFACE_INDEX	0
80184610Salfred
81184610Salfred#define	UIPAQ_BUF_SIZE		1024
82184610Salfred
83187259Sthompsaenum {
84187259Sthompsa	UIPAQ_BULK_DT_WR,
85187259Sthompsa	UIPAQ_BULK_DT_RD,
86188413Sthompsa	UIPAQ_N_TRANSFER,
87187259Sthompsa};
88187259Sthompsa
89184610Salfredstruct uipaq_softc {
90192984Sthompsa	struct ucom_super_softc sc_super_ucom;
91192984Sthompsa	struct ucom_softc sc_ucom;
92184610Salfred
93192984Sthompsa	struct usb_xfer *sc_xfer[UIPAQ_N_TRANSFER];
94192984Sthompsa	struct usb_device *sc_udev;
95189265Sthompsa	struct mtx sc_mtx;
96184610Salfred
97184610Salfred	uint16_t sc_line;
98184610Salfred
99184610Salfred	uint8_t	sc_lsr;			/* local status register */
100184610Salfred	uint8_t	sc_msr;			/* modem status register */
101184610Salfred};
102184610Salfred
103184610Salfredstatic device_probe_t uipaq_probe;
104184610Salfredstatic device_attach_t uipaq_attach;
105184610Salfredstatic device_detach_t uipaq_detach;
106239299Shselaskystatic void uipaq_free_softc(struct uipaq_softc *);
107184610Salfred
108193045Sthompsastatic usb_callback_t uipaq_write_callback;
109193045Sthompsastatic usb_callback_t uipaq_read_callback;
110184610Salfred
111239180Shselaskystatic void	uipaq_free(struct ucom_softc *);
112192984Sthompsastatic void	uipaq_start_read(struct ucom_softc *);
113192984Sthompsastatic void	uipaq_stop_read(struct ucom_softc *);
114192984Sthompsastatic void	uipaq_start_write(struct ucom_softc *);
115192984Sthompsastatic void	uipaq_stop_write(struct ucom_softc *);
116192984Sthompsastatic void	uipaq_cfg_set_dtr(struct ucom_softc *, uint8_t);
117192984Sthompsastatic void	uipaq_cfg_set_rts(struct ucom_softc *, uint8_t);
118192984Sthompsastatic void	uipaq_cfg_set_break(struct ucom_softc *, uint8_t);
119197570Sthompsastatic void	uipaq_poll(struct ucom_softc *ucom);
120184610Salfred
121192984Sthompsastatic const struct usb_config uipaq_config_data[UIPAQ_N_TRANSFER] = {
122184610Salfred
123187259Sthompsa	[UIPAQ_BULK_DT_WR] = {
124184610Salfred		.type = UE_BULK,
125184610Salfred		.endpoint = UE_ADDR_ANY,
126184610Salfred		.direction = UE_DIR_OUT,
127190734Sthompsa		.bufsize = UIPAQ_BUF_SIZE,
128190734Sthompsa		.flags = {.pipe_bof = 1,.force_short_xfer = 1,},
129190734Sthompsa		.callback = &uipaq_write_callback,
130184610Salfred	},
131184610Salfred
132187259Sthompsa	[UIPAQ_BULK_DT_RD] = {
133184610Salfred		.type = UE_BULK,
134184610Salfred		.endpoint = UE_ADDR_ANY,
135184610Salfred		.direction = UE_DIR_IN,
136190734Sthompsa		.bufsize = UIPAQ_BUF_SIZE,
137190734Sthompsa		.flags = {.pipe_bof = 1,.short_xfer_ok = 1,},
138190734Sthompsa		.callback = &uipaq_read_callback,
139184610Salfred	},
140184610Salfred};
141184610Salfred
142192984Sthompsastatic const struct ucom_callback uipaq_callback = {
143194228Sthompsa	.ucom_cfg_set_dtr = &uipaq_cfg_set_dtr,
144194228Sthompsa	.ucom_cfg_set_rts = &uipaq_cfg_set_rts,
145194228Sthompsa	.ucom_cfg_set_break = &uipaq_cfg_set_break,
146194228Sthompsa	.ucom_start_read = &uipaq_start_read,
147194228Sthompsa	.ucom_stop_read = &uipaq_stop_read,
148194228Sthompsa	.ucom_start_write = &uipaq_start_write,
149194228Sthompsa	.ucom_stop_write = &uipaq_stop_write,
150197570Sthompsa	.ucom_poll = &uipaq_poll,
151239180Shselasky	.ucom_free = &uipaq_free,
152184610Salfred};
153184610Salfred
154184610Salfred/*
155184610Salfred * Much of this list is generated from lists of other drivers that
156184610Salfred * support the same hardware. Numeric values are used where no usbdevs
157184610Salfred * entries exist.
158184610Salfred */
159223486Shselaskystatic const STRUCT_USB_HOST_ID uipaq_devs[] = {
160184610Salfred	/* Socket USB Sync */
161184610Salfred	{USB_VPI(0x0104, 0x00be, 0)},
162184610Salfred	/* USB Sync 0301 */
163184610Salfred	{USB_VPI(0x04ad, 0x0301, 0)},
164184610Salfred	/* USB Sync 0302 */
165184610Salfred	{USB_VPI(0x04ad, 0x0302, 0)},
166184610Salfred	/* USB Sync 0303 */
167184610Salfred	{USB_VPI(0x04ad, 0x0303, 0)},
168184610Salfred	/* GPS Pocket PC USB Sync */
169184610Salfred	{USB_VPI(0x04ad, 0x0306, 0)},
170184610Salfred	/* HHP PDT */
171184610Salfred	{USB_VPI(0x0536, 0x01a0, 0)},
172184610Salfred	/* Intermec Mobile Computer */
173184610Salfred	{USB_VPI(0x067e, 0x1001, 0)},
174184610Salfred	/* Linkup Systems USB Sync */
175184610Salfred	{USB_VPI(0x094b, 0x0001, 0)},
176184610Salfred	/* BCOM USB Sync 0065 */
177184610Salfred	{USB_VPI(0x0960, 0x0065, 0)},
178184610Salfred	/* BCOM USB Sync 0066 */
179184610Salfred	{USB_VPI(0x0960, 0x0066, 0)},
180184610Salfred	/* BCOM USB Sync 0067 */
181184610Salfred	{USB_VPI(0x0960, 0x0067, 0)},
182184610Salfred	/* Portatec USB Sync */
183184610Salfred	{USB_VPI(0x0961, 0x0010, 0)},
184184610Salfred	/* Trimble GeoExplorer */
185184610Salfred	{USB_VPI(0x099e, 0x0052, 0)},
186184610Salfred	/* TDS Data Collector */
187184610Salfred	{USB_VPI(0x099e, 0x4000, 0)},
188184610Salfred	/* Motorola iDEN Smartphone */
189184610Salfred	{USB_VPI(0x0c44, 0x03a2, 0)},
190184610Salfred	/* Cesscom Luxian Series */
191184610Salfred	{USB_VPI(0x0c8e, 0x6000, 0)},
192184610Salfred	/* Motorola PowerPad Pocket PCDevice */
193184610Salfred	{USB_VPI(0x0cad, 0x9001, 0)},
194184610Salfred	/* Freedom Scientific USB Sync */
195184610Salfred	{USB_VPI(0x0f4e, 0x0200, 0)},
196184610Salfred	/* Cyberbank USB Sync */
197184610Salfred	{USB_VPI(0x0f98, 0x0201, 0)},
198184610Salfred	/* Wistron USB Sync */
199184610Salfred	{USB_VPI(0x0fb8, 0x3001, 0)},
200184610Salfred	/* Wistron USB Sync */
201184610Salfred	{USB_VPI(0x0fb8, 0x3002, 0)},
202184610Salfred	/* Wistron USB Sync */
203184610Salfred	{USB_VPI(0x0fb8, 0x3003, 0)},
204184610Salfred	/* Wistron USB Sync */
205184610Salfred	{USB_VPI(0x0fb8, 0x4001, 0)},
206184610Salfred	/* E-TEN USB Sync */
207184610Salfred	{USB_VPI(0x1066, 0x00ce, 0)},
208184610Salfred	/* E-TEN P3XX Pocket PC */
209184610Salfred	{USB_VPI(0x1066, 0x0300, 0)},
210184610Salfred	/* E-TEN P5XX Pocket PC */
211184610Salfred	{USB_VPI(0x1066, 0x0500, 0)},
212184610Salfred	/* E-TEN P6XX Pocket PC */
213184610Salfred	{USB_VPI(0x1066, 0x0600, 0)},
214184610Salfred	/* E-TEN P7XX Pocket PC */
215184610Salfred	{USB_VPI(0x1066, 0x0700, 0)},
216184610Salfred	/* Psion Teklogix Sync 753x */
217184610Salfred	{USB_VPI(0x1114, 0x0001, 0)},
218184610Salfred	/* Psion Teklogix Sync netBookPro */
219184610Salfred	{USB_VPI(0x1114, 0x0004, 0)},
220184610Salfred	/* Psion Teklogix Sync 7525 */
221184610Salfred	{USB_VPI(0x1114, 0x0006, 0)},
222184610Salfred	/* VES USB Sync */
223184610Salfred	{USB_VPI(0x1182, 0x1388, 0)},
224184610Salfred	/* Rugged Pocket PC 2003 */
225184610Salfred	{USB_VPI(0x11d9, 0x1002, 0)},
226184610Salfred	/* Rugged Pocket PC 2003 */
227184610Salfred	{USB_VPI(0x11d9, 0x1003, 0)},
228184610Salfred	/* USB Sync 03 */
229184610Salfred	{USB_VPI(0x1231, 0xce01, 0)},
230184610Salfred	/* USB Sync 03 */
231184610Salfred	{USB_VPI(0x1231, 0xce02, 0)},
232184610Salfred	/* Mio DigiWalker PPC StrongARM */
233184610Salfred	{USB_VPI(0x3340, 0x011c, 0)},
234184610Salfred	/* Mio DigiWalker 338 */
235184610Salfred	{USB_VPI(0x3340, 0x0326, 0)},
236184610Salfred	/* Mio DigiWalker 338 */
237184610Salfred	{USB_VPI(0x3340, 0x0426, 0)},
238184610Salfred	/* Mio DigiWalker USB Sync */
239184610Salfred	{USB_VPI(0x3340, 0x043a, 0)},
240184610Salfred	/* MiTAC USB Sync 528 */
241184610Salfred	{USB_VPI(0x3340, 0x051c, 0)},
242184610Salfred	/* Mio DigiWalker SmartPhone USB Sync */
243184610Salfred	{USB_VPI(0x3340, 0x053a, 0)},
244184610Salfred	/* MiTAC USB Sync */
245184610Salfred	{USB_VPI(0x3340, 0x071c, 0)},
246184610Salfred	/* Generic PPC StrongARM */
247184610Salfred	{USB_VPI(0x3340, 0x0b1c, 0)},
248184610Salfred	/* Generic PPC USB Sync */
249184610Salfred	{USB_VPI(0x3340, 0x0e3a, 0)},
250184610Salfred	/* Itautec USB Sync */
251184610Salfred	{USB_VPI(0x3340, 0x0f1c, 0)},
252184610Salfred	/* Generic SmartPhone USB Sync */
253184610Salfred	{USB_VPI(0x3340, 0x0f3a, 0)},
254184610Salfred	/* Itautec USB Sync */
255184610Salfred	{USB_VPI(0x3340, 0x1326, 0)},
256184610Salfred	/* YAKUMO USB Sync */
257184610Salfred	{USB_VPI(0x3340, 0x191c, 0)},
258184610Salfred	/* Vobis USB Sync */
259184610Salfred	{USB_VPI(0x3340, 0x2326, 0)},
260184610Salfred	/* MEDION Winodws Moble USB Sync */
261184610Salfred	{USB_VPI(0x3340, 0x3326, 0)},
262184610Salfred	/* Legend USB Sync */
263184610Salfred	{USB_VPI(0x3708, 0x20ce, 0)},
264184610Salfred	/* Lenovo USB Sync */
265184610Salfred	{USB_VPI(0x3708, 0x21ce, 0)},
266184610Salfred	/* Mobile Media Technology USB Sync */
267184610Salfred	{USB_VPI(0x4113, 0x0210, 0)},
268184610Salfred	/* Mobile Media Technology USB Sync */
269184610Salfred	{USB_VPI(0x4113, 0x0211, 0)},
270184610Salfred	/* Mobile Media Technology USB Sync */
271184610Salfred	{USB_VPI(0x4113, 0x0400, 0)},
272184610Salfred	/* Mobile Media Technology USB Sync */
273184610Salfred	{USB_VPI(0x4113, 0x0410, 0)},
274184610Salfred	/* Smartphone */
275184610Salfred	{USB_VPI(0x4505, 0x0010, 0)},
276184610Salfred	/* SAGEM Wireless Assistant */
277184610Salfred	{USB_VPI(0x5e04, 0xce00, 0)},
278184610Salfred	/* c10 Series */
279184610Salfred	{USB_VPI(USB_VENDOR_ACER, 0x1631, 0)},
280184610Salfred	/* c20 Series */
281184610Salfred	{USB_VPI(USB_VENDOR_ACER, 0x1632, 0)},
282184610Salfred	/* Acer n10 Handheld USB Sync */
283184610Salfred	{USB_VPI(USB_VENDOR_ACER, 0x16e1, 0)},
284184610Salfred	/* Acer n20 Handheld USB Sync */
285184610Salfred	{USB_VPI(USB_VENDOR_ACER, 0x16e2, 0)},
286184610Salfred	/* Acer n30 Handheld USB Sync */
287184610Salfred	{USB_VPI(USB_VENDOR_ACER, 0x16e3, 0)},
288184610Salfred	/* ASUS USB Sync */
289184610Salfred	{USB_VPI(USB_VENDOR_ASUS, 0x4200, 0)},
290184610Salfred	/* ASUS USB Sync */
291184610Salfred	{USB_VPI(USB_VENDOR_ASUS, 0x4201, 0)},
292184610Salfred	/* ASUS USB Sync */
293184610Salfred	{USB_VPI(USB_VENDOR_ASUS, 0x4202, 0)},
294184610Salfred	/* ASUS USB Sync */
295184610Salfred	{USB_VPI(USB_VENDOR_ASUS, 0x9200, 0)},
296184610Salfred	/* ASUS USB Sync */
297184610Salfred	{USB_VPI(USB_VENDOR_ASUS, 0x9202, 0)},
298184610Salfred	/**/
299184610Salfred	{USB_VPI(USB_VENDOR_ASUS, USB_PRODUCT_ASUS_P535, 0)},
300184610Salfred	/* CASIO USB Sync 2001 */
301184610Salfred	{USB_VPI(USB_VENDOR_CASIO, 0x2001, 0)},
302184610Salfred	/* CASIO USB Sync 2003 */
303184610Salfred	{USB_VPI(USB_VENDOR_CASIO, 0x2003, 0)},
304184610Salfred	/**/
305184610Salfred	{USB_VPI(USB_VENDOR_CASIO, USB_PRODUCT_CASIO_BE300, 0)},
306184610Salfred	/* MyGuide 7000 XL USB Sync */
307184610Salfred	{USB_VPI(USB_VENDOR_COMPAL, 0x0531, 0)},
308184610Salfred	/* Compaq iPAQ USB Sync */
309184610Salfred	{USB_VPI(USB_VENDOR_COMPAQ, 0x0032, 0)},
310184610Salfred	/**/
311184610Salfred	{USB_VPI(USB_VENDOR_COMPAQ, USB_PRODUCT_COMPAQ_IPAQPOCKETPC, 0)},
312184610Salfred	/* Dell Axim USB Sync */
313184610Salfred	{USB_VPI(USB_VENDOR_DELL, 0x4001, 0)},
314184610Salfred	/* Dell Axim USB Sync */
315184610Salfred	{USB_VPI(USB_VENDOR_DELL, 0x4002, 0)},
316184610Salfred	/* Dell Axim USB Sync */
317184610Salfred	{USB_VPI(USB_VENDOR_DELL, 0x4003, 0)},
318184610Salfred	/* Dell Axim USB Sync */
319184610Salfred	{USB_VPI(USB_VENDOR_DELL, 0x4004, 0)},
320184610Salfred	/* Dell Axim USB Sync */
321184610Salfred	{USB_VPI(USB_VENDOR_DELL, 0x4005, 0)},
322184610Salfred	/* Dell Axim USB Sync */
323184610Salfred	{USB_VPI(USB_VENDOR_DELL, 0x4006, 0)},
324184610Salfred	/* Dell Axim USB Sync */
325184610Salfred	{USB_VPI(USB_VENDOR_DELL, 0x4007, 0)},
326184610Salfred	/* Dell Axim USB Sync */
327184610Salfred	{USB_VPI(USB_VENDOR_DELL, 0x4008, 0)},
328184610Salfred	/* Dell Axim USB Sync */
329184610Salfred	{USB_VPI(USB_VENDOR_DELL, 0x4009, 0)},
330184610Salfred	/* Fujitsu Siemens Computers USB Sync */
331184610Salfred	{USB_VPI(USB_VENDOR_FSC, 0x1001, 0)},
332184610Salfred	/* FUJITSU USB Sync */
333184610Salfred	{USB_VPI(USB_VENDOR_FUJITSU, 0x1058, 0)},
334184610Salfred	/* FUJITSU USB Sync */
335184610Salfred	{USB_VPI(USB_VENDOR_FUJITSU, 0x1079, 0)},
336184610Salfred	/* Askey USB Sync */
337184610Salfred	{USB_VPI(USB_VENDOR_GIGASET, 0x0601, 0)},
338184610Salfred	/* Hitachi USB Sync */
339184610Salfred	{USB_VPI(USB_VENDOR_HITACHI, 0x0014, 0)},
340184610Salfred	/* HP USB Sync 1612 */
341184610Salfred	{USB_VPI(USB_VENDOR_HP, 0x1216, 0)},
342184610Salfred	/* HP USB Sync 1620 */
343184610Salfred	{USB_VPI(USB_VENDOR_HP, 0x2016, 0)},
344184610Salfred	/* HP USB Sync 1621 */
345184610Salfred	{USB_VPI(USB_VENDOR_HP, 0x2116, 0)},
346184610Salfred	/* HP USB Sync 1622 */
347184610Salfred	{USB_VPI(USB_VENDOR_HP, 0x2216, 0)},
348184610Salfred	/* HP USB Sync 1630 */
349184610Salfred	{USB_VPI(USB_VENDOR_HP, 0x3016, 0)},
350184610Salfred	/* HP USB Sync 1631 */
351184610Salfred	{USB_VPI(USB_VENDOR_HP, 0x3116, 0)},
352184610Salfred	/* HP USB Sync 1632 */
353184610Salfred	{USB_VPI(USB_VENDOR_HP, 0x3216, 0)},
354184610Salfred	/* HP USB Sync 1640 */
355184610Salfred	{USB_VPI(USB_VENDOR_HP, 0x4016, 0)},
356184610Salfred	/* HP USB Sync 1641 */
357184610Salfred	{USB_VPI(USB_VENDOR_HP, 0x4116, 0)},
358184610Salfred	/* HP USB Sync 1642 */
359184610Salfred	{USB_VPI(USB_VENDOR_HP, 0x4216, 0)},
360184610Salfred	/* HP USB Sync 1650 */
361184610Salfred	{USB_VPI(USB_VENDOR_HP, 0x5016, 0)},
362184610Salfred	/* HP USB Sync 1651 */
363184610Salfred	{USB_VPI(USB_VENDOR_HP, 0x5116, 0)},
364184610Salfred	/* HP USB Sync 1652 */
365184610Salfred	{USB_VPI(USB_VENDOR_HP, 0x5216, 0)},
366184610Salfred	/**/
367184610Salfred	{USB_VPI(USB_VENDOR_HP, USB_PRODUCT_HP_2215, 0)},
368184610Salfred	/**/
369184610Salfred	{USB_VPI(USB_VENDOR_HP, USB_PRODUCT_HP_568J, 0)},
370184610Salfred	/* HTC USB Modem */
371184610Salfred	{USB_VPI(USB_VENDOR_HTC, 0x00cf, 0)},
372184610Salfred	/* PocketPC USB Sync */
373184610Salfred	{USB_VPI(USB_VENDOR_HTC, 0x0a01, 0)},
374184610Salfred	/* PocketPC USB Sync */
375184610Salfred	{USB_VPI(USB_VENDOR_HTC, 0x0a02, 0)},
376184610Salfred	/* PocketPC USB Sync */
377184610Salfred	{USB_VPI(USB_VENDOR_HTC, 0x0a03, 0)},
378184610Salfred	/* PocketPC USB Sync */
379184610Salfred	{USB_VPI(USB_VENDOR_HTC, 0x0a04, 0)},
380184610Salfred	/* PocketPC USB Sync */
381184610Salfred	{USB_VPI(USB_VENDOR_HTC, 0x0a05, 0)},
382184610Salfred	/* PocketPC USB Sync */
383184610Salfred	{USB_VPI(USB_VENDOR_HTC, 0x0a06, 0)},
384184610Salfred	/* PocketPC USB Sync */
385184610Salfred	{USB_VPI(USB_VENDOR_HTC, 0x0a07, 0)},
386184610Salfred	/* PocketPC USB Sync */
387184610Salfred	{USB_VPI(USB_VENDOR_HTC, 0x0a08, 0)},
388184610Salfred	/* PocketPC USB Sync */
389184610Salfred	{USB_VPI(USB_VENDOR_HTC, 0x0a09, 0)},
390184610Salfred	/* PocketPC USB Sync */
391184610Salfred	{USB_VPI(USB_VENDOR_HTC, 0x0a0a, 0)},
392184610Salfred	/* PocketPC USB Sync */
393184610Salfred	{USB_VPI(USB_VENDOR_HTC, 0x0a0b, 0)},
394184610Salfred	/* PocketPC USB Sync */
395184610Salfred	{USB_VPI(USB_VENDOR_HTC, 0x0a0c, 0)},
396184610Salfred	/* PocketPC USB Sync */
397184610Salfred	{USB_VPI(USB_VENDOR_HTC, 0x0a0d, 0)},
398184610Salfred	/* PocketPC USB Sync */
399184610Salfred	{USB_VPI(USB_VENDOR_HTC, 0x0a0e, 0)},
400184610Salfred	/* PocketPC USB Sync */
401184610Salfred	{USB_VPI(USB_VENDOR_HTC, 0x0a0f, 0)},
402184610Salfred	/* PocketPC USB Sync */
403184610Salfred	{USB_VPI(USB_VENDOR_HTC, 0x0a10, 0)},
404184610Salfred	/* PocketPC USB Sync */
405184610Salfred	{USB_VPI(USB_VENDOR_HTC, 0x0a11, 0)},
406184610Salfred	/* PocketPC USB Sync */
407184610Salfred	{USB_VPI(USB_VENDOR_HTC, 0x0a12, 0)},
408184610Salfred	/* PocketPC USB Sync */
409184610Salfred	{USB_VPI(USB_VENDOR_HTC, 0x0a13, 0)},
410184610Salfred	/* PocketPC USB Sync */
411184610Salfred	{USB_VPI(USB_VENDOR_HTC, 0x0a14, 0)},
412184610Salfred	/* PocketPC USB Sync */
413184610Salfred	{USB_VPI(USB_VENDOR_HTC, 0x0a15, 0)},
414184610Salfred	/* PocketPC USB Sync */
415184610Salfred	{USB_VPI(USB_VENDOR_HTC, 0x0a16, 0)},
416184610Salfred	/* PocketPC USB Sync */
417184610Salfred	{USB_VPI(USB_VENDOR_HTC, 0x0a17, 0)},
418184610Salfred	/* PocketPC USB Sync */
419184610Salfred	{USB_VPI(USB_VENDOR_HTC, 0x0a18, 0)},
420184610Salfred	/* PocketPC USB Sync */
421184610Salfred	{USB_VPI(USB_VENDOR_HTC, 0x0a19, 0)},
422184610Salfred	/* PocketPC USB Sync */
423184610Salfred	{USB_VPI(USB_VENDOR_HTC, 0x0a1a, 0)},
424184610Salfred	/* PocketPC USB Sync */
425184610Salfred	{USB_VPI(USB_VENDOR_HTC, 0x0a1b, 0)},
426184610Salfred	/* PocketPC USB Sync */
427184610Salfred	{USB_VPI(USB_VENDOR_HTC, 0x0a1c, 0)},
428184610Salfred	/* PocketPC USB Sync */
429184610Salfred	{USB_VPI(USB_VENDOR_HTC, 0x0a1d, 0)},
430184610Salfred	/* PocketPC USB Sync */
431184610Salfred	{USB_VPI(USB_VENDOR_HTC, 0x0a1e, 0)},
432184610Salfred	/* PocketPC USB Sync */
433184610Salfred	{USB_VPI(USB_VENDOR_HTC, 0x0a1f, 0)},
434184610Salfred	/* PocketPC USB Sync */
435184610Salfred	{USB_VPI(USB_VENDOR_HTC, 0x0a20, 0)},
436184610Salfred	/* PocketPC USB Sync */
437184610Salfred	{USB_VPI(USB_VENDOR_HTC, 0x0a21, 0)},
438184610Salfred	/* PocketPC USB Sync */
439184610Salfred	{USB_VPI(USB_VENDOR_HTC, 0x0a22, 0)},
440184610Salfred	/* PocketPC USB Sync */
441184610Salfred	{USB_VPI(USB_VENDOR_HTC, 0x0a23, 0)},
442184610Salfred	/* PocketPC USB Sync */
443184610Salfred	{USB_VPI(USB_VENDOR_HTC, 0x0a24, 0)},
444184610Salfred	/* PocketPC USB Sync */
445184610Salfred	{USB_VPI(USB_VENDOR_HTC, 0x0a25, 0)},
446184610Salfred	/* PocketPC USB Sync */
447184610Salfred	{USB_VPI(USB_VENDOR_HTC, 0x0a26, 0)},
448184610Salfred	/* PocketPC USB Sync */
449184610Salfred	{USB_VPI(USB_VENDOR_HTC, 0x0a27, 0)},
450184610Salfred	/* PocketPC USB Sync */
451184610Salfred	{USB_VPI(USB_VENDOR_HTC, 0x0a28, 0)},
452184610Salfred	/* PocketPC USB Sync */
453184610Salfred	{USB_VPI(USB_VENDOR_HTC, 0x0a29, 0)},
454184610Salfred	/* PocketPC USB Sync */
455184610Salfred	{USB_VPI(USB_VENDOR_HTC, 0x0a2a, 0)},
456184610Salfred	/* PocketPC USB Sync */
457184610Salfred	{USB_VPI(USB_VENDOR_HTC, 0x0a2b, 0)},
458184610Salfred	/* PocketPC USB Sync */
459184610Salfred	{USB_VPI(USB_VENDOR_HTC, 0x0a2c, 0)},
460184610Salfred	/* PocketPC USB Sync */
461184610Salfred	{USB_VPI(USB_VENDOR_HTC, 0x0a2d, 0)},
462184610Salfred	/* PocketPC USB Sync */
463184610Salfred	{USB_VPI(USB_VENDOR_HTC, 0x0a2e, 0)},
464184610Salfred	/* PocketPC USB Sync */
465184610Salfred	{USB_VPI(USB_VENDOR_HTC, 0x0a2f, 0)},
466184610Salfred	/* PocketPC USB Sync */
467184610Salfred	{USB_VPI(USB_VENDOR_HTC, 0x0a30, 0)},
468184610Salfred	/* PocketPC USB Sync */
469184610Salfred	{USB_VPI(USB_VENDOR_HTC, 0x0a31, 0)},
470184610Salfred	/* PocketPC USB Sync */
471184610Salfred	{USB_VPI(USB_VENDOR_HTC, 0x0a32, 0)},
472184610Salfred	/* PocketPC USB Sync */
473184610Salfred	{USB_VPI(USB_VENDOR_HTC, 0x0a33, 0)},
474184610Salfred	/* PocketPC USB Sync */
475184610Salfred	{USB_VPI(USB_VENDOR_HTC, 0x0a34, 0)},
476184610Salfred	/* PocketPC USB Sync */
477184610Salfred	{USB_VPI(USB_VENDOR_HTC, 0x0a35, 0)},
478184610Salfred	/* PocketPC USB Sync */
479184610Salfred	{USB_VPI(USB_VENDOR_HTC, 0x0a36, 0)},
480184610Salfred	/* PocketPC USB Sync */
481184610Salfred	{USB_VPI(USB_VENDOR_HTC, 0x0a37, 0)},
482184610Salfred	/* PocketPC USB Sync */
483184610Salfred	{USB_VPI(USB_VENDOR_HTC, 0x0a38, 0)},
484184610Salfred	/* PocketPC USB Sync */
485184610Salfred	{USB_VPI(USB_VENDOR_HTC, 0x0a39, 0)},
486184610Salfred	/* PocketPC USB Sync */
487184610Salfred	{USB_VPI(USB_VENDOR_HTC, 0x0a3a, 0)},
488184610Salfred	/* PocketPC USB Sync */
489184610Salfred	{USB_VPI(USB_VENDOR_HTC, 0x0a3b, 0)},
490184610Salfred	/* PocketPC USB Sync */
491184610Salfred	{USB_VPI(USB_VENDOR_HTC, 0x0a3c, 0)},
492184610Salfred	/* PocketPC USB Sync */
493184610Salfred	{USB_VPI(USB_VENDOR_HTC, 0x0a3d, 0)},
494184610Salfred	/* PocketPC USB Sync */
495184610Salfred	{USB_VPI(USB_VENDOR_HTC, 0x0a3e, 0)},
496184610Salfred	/* PocketPC USB Sync */
497184610Salfred	{USB_VPI(USB_VENDOR_HTC, 0x0a3f, 0)},
498184610Salfred	/* PocketPC USB Sync */
499184610Salfred	{USB_VPI(USB_VENDOR_HTC, 0x0a40, 0)},
500184610Salfred	/* PocketPC USB Sync */
501184610Salfred	{USB_VPI(USB_VENDOR_HTC, 0x0a41, 0)},
502184610Salfred	/* PocketPC USB Sync */
503184610Salfred	{USB_VPI(USB_VENDOR_HTC, 0x0a42, 0)},
504184610Salfred	/* PocketPC USB Sync */
505184610Salfred	{USB_VPI(USB_VENDOR_HTC, 0x0a43, 0)},
506184610Salfred	/* PocketPC USB Sync */
507184610Salfred	{USB_VPI(USB_VENDOR_HTC, 0x0a44, 0)},
508184610Salfred	/* PocketPC USB Sync */
509184610Salfred	{USB_VPI(USB_VENDOR_HTC, 0x0a45, 0)},
510184610Salfred	/* PocketPC USB Sync */
511184610Salfred	{USB_VPI(USB_VENDOR_HTC, 0x0a46, 0)},
512184610Salfred	/* PocketPC USB Sync */
513184610Salfred	{USB_VPI(USB_VENDOR_HTC, 0x0a47, 0)},
514184610Salfred	/* PocketPC USB Sync */
515184610Salfred	{USB_VPI(USB_VENDOR_HTC, 0x0a48, 0)},
516184610Salfred	/* PocketPC USB Sync */
517184610Salfred	{USB_VPI(USB_VENDOR_HTC, 0x0a49, 0)},
518184610Salfred	/* PocketPC USB Sync */
519184610Salfred	{USB_VPI(USB_VENDOR_HTC, 0x0a4a, 0)},
520184610Salfred	/* PocketPC USB Sync */
521184610Salfred	{USB_VPI(USB_VENDOR_HTC, 0x0a4b, 0)},
522184610Salfred	/* PocketPC USB Sync */
523184610Salfred	{USB_VPI(USB_VENDOR_HTC, 0x0a4c, 0)},
524184610Salfred	/* PocketPC USB Sync */
525184610Salfred	{USB_VPI(USB_VENDOR_HTC, 0x0a4d, 0)},
526184610Salfred	/* PocketPC USB Sync */
527184610Salfred	{USB_VPI(USB_VENDOR_HTC, 0x0a4e, 0)},
528184610Salfred	/* PocketPC USB Sync */
529184610Salfred	{USB_VPI(USB_VENDOR_HTC, 0x0a4f, 0)},
530184610Salfred	/* HTC SmartPhone USB Sync */
531184610Salfred	{USB_VPI(USB_VENDOR_HTC, 0x0a50, 0)},
532184610Salfred	/* SmartPhone USB Sync */
533184610Salfred	{USB_VPI(USB_VENDOR_HTC, 0x0a52, 0)},
534184610Salfred	/* SmartPhone USB Sync */
535184610Salfred	{USB_VPI(USB_VENDOR_HTC, 0x0a53, 0)},
536184610Salfred	/* SmartPhone USB Sync */
537184610Salfred	{USB_VPI(USB_VENDOR_HTC, 0x0a54, 0)},
538184610Salfred	/* SmartPhone USB Sync */
539184610Salfred	{USB_VPI(USB_VENDOR_HTC, 0x0a55, 0)},
540184610Salfred	/* SmartPhone USB Sync */
541184610Salfred	{USB_VPI(USB_VENDOR_HTC, 0x0a56, 0)},
542184610Salfred	/* SmartPhone USB Sync */
543184610Salfred	{USB_VPI(USB_VENDOR_HTC, 0x0a57, 0)},
544184610Salfred	/* SmartPhone USB Sync */
545184610Salfred	{USB_VPI(USB_VENDOR_HTC, 0x0a58, 0)},
546184610Salfred	/* SmartPhone USB Sync */
547184610Salfred	{USB_VPI(USB_VENDOR_HTC, 0x0a59, 0)},
548184610Salfred	/* SmartPhone USB Sync */
549184610Salfred	{USB_VPI(USB_VENDOR_HTC, 0x0a5a, 0)},
550184610Salfred	/* SmartPhone USB Sync */
551184610Salfred	{USB_VPI(USB_VENDOR_HTC, 0x0a5b, 0)},
552184610Salfred	/* SmartPhone USB Sync */
553184610Salfred	{USB_VPI(USB_VENDOR_HTC, 0x0a5c, 0)},
554184610Salfred	/* SmartPhone USB Sync */
555184610Salfred	{USB_VPI(USB_VENDOR_HTC, 0x0a5d, 0)},
556184610Salfred	/* SmartPhone USB Sync */
557184610Salfred	{USB_VPI(USB_VENDOR_HTC, 0x0a5e, 0)},
558184610Salfred	/* SmartPhone USB Sync */
559184610Salfred	{USB_VPI(USB_VENDOR_HTC, 0x0a5f, 0)},
560184610Salfred	/* SmartPhone USB Sync */
561184610Salfred	{USB_VPI(USB_VENDOR_HTC, 0x0a60, 0)},
562184610Salfred	/* SmartPhone USB Sync */
563184610Salfred	{USB_VPI(USB_VENDOR_HTC, 0x0a61, 0)},
564184610Salfred	/* SmartPhone USB Sync */
565184610Salfred	{USB_VPI(USB_VENDOR_HTC, 0x0a62, 0)},
566184610Salfred	/* SmartPhone USB Sync */
567184610Salfred	{USB_VPI(USB_VENDOR_HTC, 0x0a63, 0)},
568184610Salfred	/* SmartPhone USB Sync */
569184610Salfred	{USB_VPI(USB_VENDOR_HTC, 0x0a64, 0)},
570184610Salfred	/* SmartPhone USB Sync */
571184610Salfred	{USB_VPI(USB_VENDOR_HTC, 0x0a65, 0)},
572184610Salfred	/* SmartPhone USB Sync */
573184610Salfred	{USB_VPI(USB_VENDOR_HTC, 0x0a66, 0)},
574184610Salfred	/* SmartPhone USB Sync */
575184610Salfred	{USB_VPI(USB_VENDOR_HTC, 0x0a67, 0)},
576184610Salfred	/* SmartPhone USB Sync */
577184610Salfred	{USB_VPI(USB_VENDOR_HTC, 0x0a68, 0)},
578184610Salfred	/* SmartPhone USB Sync */
579184610Salfred	{USB_VPI(USB_VENDOR_HTC, 0x0a69, 0)},
580184610Salfred	/* SmartPhone USB Sync */
581184610Salfred	{USB_VPI(USB_VENDOR_HTC, 0x0a6a, 0)},
582184610Salfred	/* SmartPhone USB Sync */
583184610Salfred	{USB_VPI(USB_VENDOR_HTC, 0x0a6b, 0)},
584184610Salfred	/* SmartPhone USB Sync */
585184610Salfred	{USB_VPI(USB_VENDOR_HTC, 0x0a6c, 0)},
586184610Salfred	/* SmartPhone USB Sync */
587184610Salfred	{USB_VPI(USB_VENDOR_HTC, 0x0a6d, 0)},
588184610Salfred	/* SmartPhone USB Sync */
589184610Salfred	{USB_VPI(USB_VENDOR_HTC, 0x0a6e, 0)},
590184610Salfred	/* SmartPhone USB Sync */
591184610Salfred	{USB_VPI(USB_VENDOR_HTC, 0x0a6f, 0)},
592184610Salfred	/* SmartPhone USB Sync */
593184610Salfred	{USB_VPI(USB_VENDOR_HTC, 0x0a70, 0)},
594184610Salfred	/* SmartPhone USB Sync */
595184610Salfred	{USB_VPI(USB_VENDOR_HTC, 0x0a71, 0)},
596184610Salfred	/* SmartPhone USB Sync */
597184610Salfred	{USB_VPI(USB_VENDOR_HTC, 0x0a72, 0)},
598184610Salfred	/* SmartPhone USB Sync */
599184610Salfred	{USB_VPI(USB_VENDOR_HTC, 0x0a73, 0)},
600184610Salfred	/* SmartPhone USB Sync */
601184610Salfred	{USB_VPI(USB_VENDOR_HTC, 0x0a74, 0)},
602184610Salfred	/* SmartPhone USB Sync */
603184610Salfred	{USB_VPI(USB_VENDOR_HTC, 0x0a75, 0)},
604184610Salfred	/* SmartPhone USB Sync */
605184610Salfred	{USB_VPI(USB_VENDOR_HTC, 0x0a76, 0)},
606184610Salfred	/* SmartPhone USB Sync */
607184610Salfred	{USB_VPI(USB_VENDOR_HTC, 0x0a77, 0)},
608184610Salfred	/* SmartPhone USB Sync */
609184610Salfred	{USB_VPI(USB_VENDOR_HTC, 0x0a78, 0)},
610184610Salfred	/* SmartPhone USB Sync */
611184610Salfred	{USB_VPI(USB_VENDOR_HTC, 0x0a79, 0)},
612184610Salfred	/* SmartPhone USB Sync */
613184610Salfred	{USB_VPI(USB_VENDOR_HTC, 0x0a7a, 0)},
614184610Salfred	/* SmartPhone USB Sync */
615184610Salfred	{USB_VPI(USB_VENDOR_HTC, 0x0a7b, 0)},
616184610Salfred	/* SmartPhone USB Sync */
617184610Salfred	{USB_VPI(USB_VENDOR_HTC, 0x0a7c, 0)},
618184610Salfred	/* SmartPhone USB Sync */
619184610Salfred	{USB_VPI(USB_VENDOR_HTC, 0x0a7d, 0)},
620184610Salfred	/* SmartPhone USB Sync */
621184610Salfred	{USB_VPI(USB_VENDOR_HTC, 0x0a7e, 0)},
622184610Salfred	/* SmartPhone USB Sync */
623184610Salfred	{USB_VPI(USB_VENDOR_HTC, 0x0a7f, 0)},
624184610Salfred	/* SmartPhone USB Sync */
625184610Salfred	{USB_VPI(USB_VENDOR_HTC, 0x0a80, 0)},
626184610Salfred	/* SmartPhone USB Sync */
627184610Salfred	{USB_VPI(USB_VENDOR_HTC, 0x0a81, 0)},
628184610Salfred	/* SmartPhone USB Sync */
629184610Salfred	{USB_VPI(USB_VENDOR_HTC, 0x0a82, 0)},
630184610Salfred	/* SmartPhone USB Sync */
631184610Salfred	{USB_VPI(USB_VENDOR_HTC, 0x0a83, 0)},
632184610Salfred	/* SmartPhone USB Sync */
633184610Salfred	{USB_VPI(USB_VENDOR_HTC, 0x0a84, 0)},
634184610Salfred	/* SmartPhone USB Sync */
635184610Salfred	{USB_VPI(USB_VENDOR_HTC, 0x0a85, 0)},
636184610Salfred	/* SmartPhone USB Sync */
637184610Salfred	{USB_VPI(USB_VENDOR_HTC, 0x0a86, 0)},
638184610Salfred	/* SmartPhone USB Sync */
639184610Salfred	{USB_VPI(USB_VENDOR_HTC, 0x0a87, 0)},
640184610Salfred	/* SmartPhone USB Sync */
641184610Salfred	{USB_VPI(USB_VENDOR_HTC, 0x0a88, 0)},
642184610Salfred	/* SmartPhone USB Sync */
643184610Salfred	{USB_VPI(USB_VENDOR_HTC, 0x0a89, 0)},
644184610Salfred	/* SmartPhone USB Sync */
645184610Salfred	{USB_VPI(USB_VENDOR_HTC, 0x0a8a, 0)},
646184610Salfred	/* SmartPhone USB Sync */
647184610Salfred	{USB_VPI(USB_VENDOR_HTC, 0x0a8b, 0)},
648184610Salfred	/* SmartPhone USB Sync */
649184610Salfred	{USB_VPI(USB_VENDOR_HTC, 0x0a8c, 0)},
650184610Salfred	/* SmartPhone USB Sync */
651184610Salfred	{USB_VPI(USB_VENDOR_HTC, 0x0a8d, 0)},
652184610Salfred	/* SmartPhone USB Sync */
653184610Salfred	{USB_VPI(USB_VENDOR_HTC, 0x0a8e, 0)},
654184610Salfred	/* SmartPhone USB Sync */
655184610Salfred	{USB_VPI(USB_VENDOR_HTC, 0x0a8f, 0)},
656184610Salfred	/* SmartPhone USB Sync */
657184610Salfred	{USB_VPI(USB_VENDOR_HTC, 0x0a90, 0)},
658184610Salfred	/* SmartPhone USB Sync */
659184610Salfred	{USB_VPI(USB_VENDOR_HTC, 0x0a91, 0)},
660184610Salfred	/* SmartPhone USB Sync */
661184610Salfred	{USB_VPI(USB_VENDOR_HTC, 0x0a92, 0)},
662184610Salfred	/* SmartPhone USB Sync */
663184610Salfred	{USB_VPI(USB_VENDOR_HTC, 0x0a93, 0)},
664184610Salfred	/* SmartPhone USB Sync */
665184610Salfred	{USB_VPI(USB_VENDOR_HTC, 0x0a94, 0)},
666184610Salfred	/* SmartPhone USB Sync */
667184610Salfred	{USB_VPI(USB_VENDOR_HTC, 0x0a95, 0)},
668184610Salfred	/* SmartPhone USB Sync */
669184610Salfred	{USB_VPI(USB_VENDOR_HTC, 0x0a96, 0)},
670184610Salfred	/* SmartPhone USB Sync */
671184610Salfred	{USB_VPI(USB_VENDOR_HTC, 0x0a97, 0)},
672184610Salfred	/* SmartPhone USB Sync */
673184610Salfred	{USB_VPI(USB_VENDOR_HTC, 0x0a98, 0)},
674184610Salfred	/* SmartPhone USB Sync */
675184610Salfred	{USB_VPI(USB_VENDOR_HTC, 0x0a99, 0)},
676184610Salfred	/* SmartPhone USB Sync */
677184610Salfred	{USB_VPI(USB_VENDOR_HTC, 0x0a9a, 0)},
678184610Salfred	/* SmartPhone USB Sync */
679184610Salfred	{USB_VPI(USB_VENDOR_HTC, 0x0a9b, 0)},
680184610Salfred	/* SmartPhone USB Sync */
681184610Salfred	{USB_VPI(USB_VENDOR_HTC, 0x0a9c, 0)},
682184610Salfred	/* SmartPhone USB Sync */
683184610Salfred	{USB_VPI(USB_VENDOR_HTC, 0x0a9d, 0)},
684184610Salfred	/* SmartPhone USB Sync */
685184610Salfred	{USB_VPI(USB_VENDOR_HTC, 0x0a9e, 0)},
686184610Salfred	/* SmartPhone USB Sync */
687184610Salfred	{USB_VPI(USB_VENDOR_HTC, 0x0a9f, 0)},
688184610Salfred	/**/
689184610Salfred	{USB_VPI(USB_VENDOR_HTC, USB_PRODUCT_HTC_PPC6700MODEM, 0)},
690184610Salfred	/**/
691184610Salfred	{USB_VPI(USB_VENDOR_HTC, USB_PRODUCT_HTC_SMARTPHONE, 0)},
692184610Salfred	/**/
693184610Salfred	{USB_VPI(USB_VENDOR_HTC, USB_PRODUCT_HTC_WINMOBILE, 0)},
694210469Sgavin	/* High Tech Computer Wizard Smartphone */
695210469Sgavin	{USB_VPI(USB_VENDOR_HTC, USB_PRODUCT_HTC_WIZARD, 0)},
696184610Salfred	/* JVC USB Sync */
697184610Salfred	{USB_VPI(USB_VENDOR_JVC, 0x3011, 0)},
698184610Salfred	/* JVC USB Sync */
699184610Salfred	{USB_VPI(USB_VENDOR_JVC, 0x3012, 0)},
700184610Salfred	/* LGE USB Sync */
701184610Salfred	{USB_VPI(USB_VENDOR_LG, 0x9c01, 0)},
702184610Salfred	/* Microsoft USB Sync */
703184610Salfred	{USB_VPI(USB_VENDOR_MICROSOFT, 0x00ce, 0)},
704184610Salfred	/* Windows Pocket PC 2002 */
705184610Salfred	{USB_VPI(USB_VENDOR_MICROSOFT, 0x0400, 0)},
706184610Salfred	/* Windows Pocket PC 2002 */
707184610Salfred	{USB_VPI(USB_VENDOR_MICROSOFT, 0x0401, 0)},
708184610Salfred	/* Windows Pocket PC 2002 */
709184610Salfred	{USB_VPI(USB_VENDOR_MICROSOFT, 0x0402, 0)},
710184610Salfred	/* Windows Pocket PC 2002 */
711184610Salfred	{USB_VPI(USB_VENDOR_MICROSOFT, 0x0403, 0)},
712184610Salfred	/* Windows Pocket PC 2002 */
713184610Salfred	{USB_VPI(USB_VENDOR_MICROSOFT, 0x0404, 0)},
714184610Salfred	/* Windows Pocket PC 2002 */
715184610Salfred	{USB_VPI(USB_VENDOR_MICROSOFT, 0x0405, 0)},
716184610Salfred	/* Windows Pocket PC 2002 */
717184610Salfred	{USB_VPI(USB_VENDOR_MICROSOFT, 0x0406, 0)},
718184610Salfred	/* Windows Pocket PC 2002 */
719184610Salfred	{USB_VPI(USB_VENDOR_MICROSOFT, 0x0407, 0)},
720184610Salfred	/* Windows Pocket PC 2002 */
721184610Salfred	{USB_VPI(USB_VENDOR_MICROSOFT, 0x0408, 0)},
722184610Salfred	/* Windows Pocket PC 2002 */
723184610Salfred	{USB_VPI(USB_VENDOR_MICROSOFT, 0x0409, 0)},
724184610Salfred	/* Windows Pocket PC 2002 */
725184610Salfred	{USB_VPI(USB_VENDOR_MICROSOFT, 0x040a, 0)},
726184610Salfred	/* Windows Pocket PC 2002 */
727184610Salfred	{USB_VPI(USB_VENDOR_MICROSOFT, 0x040b, 0)},
728184610Salfred	/* Windows Pocket PC 2002 */
729184610Salfred	{USB_VPI(USB_VENDOR_MICROSOFT, 0x040c, 0)},
730184610Salfred	/* Windows Pocket PC 2002 */
731184610Salfred	{USB_VPI(USB_VENDOR_MICROSOFT, 0x040d, 0)},
732184610Salfred	/* Windows Pocket PC 2002 */
733184610Salfred	{USB_VPI(USB_VENDOR_MICROSOFT, 0x040e, 0)},
734184610Salfred	/* Windows Pocket PC 2002 */
735184610Salfred	{USB_VPI(USB_VENDOR_MICROSOFT, 0x040f, 0)},
736184610Salfred	/* Windows Pocket PC 2002 */
737184610Salfred	{USB_VPI(USB_VENDOR_MICROSOFT, 0x0410, 0)},
738184610Salfred	/* Windows Pocket PC 2002 */
739184610Salfred	{USB_VPI(USB_VENDOR_MICROSOFT, 0x0411, 0)},
740184610Salfred	/* Windows Pocket PC 2002 */
741184610Salfred	{USB_VPI(USB_VENDOR_MICROSOFT, 0x0412, 0)},
742184610Salfred	/* Windows Pocket PC 2002 */
743184610Salfred	{USB_VPI(USB_VENDOR_MICROSOFT, 0x0413, 0)},
744184610Salfred	/* Windows Pocket PC 2002 */
745184610Salfred	{USB_VPI(USB_VENDOR_MICROSOFT, 0x0414, 0)},
746184610Salfred	/* Windows Pocket PC 2002 */
747184610Salfred	{USB_VPI(USB_VENDOR_MICROSOFT, 0x0415, 0)},
748184610Salfred	/* Windows Pocket PC 2002 */
749184610Salfred	{USB_VPI(USB_VENDOR_MICROSOFT, 0x0416, 0)},
750184610Salfred	/* Windows Pocket PC 2002 */
751184610Salfred	{USB_VPI(USB_VENDOR_MICROSOFT, 0x0417, 0)},
752184610Salfred	/* Windows Pocket PC 2003 */
753184610Salfred	{USB_VPI(USB_VENDOR_MICROSOFT, 0x0432, 0)},
754184610Salfred	/* Windows Pocket PC 2003 */
755184610Salfred	{USB_VPI(USB_VENDOR_MICROSOFT, 0x0433, 0)},
756184610Salfred	/* Windows Pocket PC 2003 */
757184610Salfred	{USB_VPI(USB_VENDOR_MICROSOFT, 0x0434, 0)},
758184610Salfred	/* Windows Pocket PC 2003 */
759184610Salfred	{USB_VPI(USB_VENDOR_MICROSOFT, 0x0435, 0)},
760184610Salfred	/* Windows Pocket PC 2003 */
761184610Salfred	{USB_VPI(USB_VENDOR_MICROSOFT, 0x0436, 0)},
762184610Salfred	/* Windows Pocket PC 2003 */
763184610Salfred	{USB_VPI(USB_VENDOR_MICROSOFT, 0x0437, 0)},
764184610Salfred	/* Windows Pocket PC 2003 */
765184610Salfred	{USB_VPI(USB_VENDOR_MICROSOFT, 0x0438, 0)},
766184610Salfred	/* Windows Pocket PC 2003 */
767184610Salfred	{USB_VPI(USB_VENDOR_MICROSOFT, 0x0439, 0)},
768184610Salfred	/* Windows Pocket PC 2003 */
769184610Salfred	{USB_VPI(USB_VENDOR_MICROSOFT, 0x043a, 0)},
770184610Salfred	/* Windows Pocket PC 2003 */
771184610Salfred	{USB_VPI(USB_VENDOR_MICROSOFT, 0x043b, 0)},
772184610Salfred	/* Windows Pocket PC 2003 */
773184610Salfred	{USB_VPI(USB_VENDOR_MICROSOFT, 0x043c, 0)},
774184610Salfred	/* Windows Pocket PC 2003 */
775184610Salfred	{USB_VPI(USB_VENDOR_MICROSOFT, 0x043d, 0)},
776184610Salfred	/* Windows Pocket PC 2003 */
777184610Salfred	{USB_VPI(USB_VENDOR_MICROSOFT, 0x043e, 0)},
778184610Salfred	/* Windows Pocket PC 2003 */
779184610Salfred	{USB_VPI(USB_VENDOR_MICROSOFT, 0x043f, 0)},
780184610Salfred	/* Windows Pocket PC 2003 */
781184610Salfred	{USB_VPI(USB_VENDOR_MICROSOFT, 0x0440, 0)},
782184610Salfred	/* Windows Pocket PC 2003 */
783184610Salfred	{USB_VPI(USB_VENDOR_MICROSOFT, 0x0441, 0)},
784184610Salfred	/* Windows Pocket PC 2003 */
785184610Salfred	{USB_VPI(USB_VENDOR_MICROSOFT, 0x0442, 0)},
786184610Salfred	/* Windows Pocket PC 2003 */
787184610Salfred	{USB_VPI(USB_VENDOR_MICROSOFT, 0x0443, 0)},
788184610Salfred	/* Windows Pocket PC 2003 */
789184610Salfred	{USB_VPI(USB_VENDOR_MICROSOFT, 0x0444, 0)},
790184610Salfred	/* Windows Pocket PC 2003 */
791184610Salfred	{USB_VPI(USB_VENDOR_MICROSOFT, 0x0445, 0)},
792184610Salfred	/* Windows Pocket PC 2003 */
793184610Salfred	{USB_VPI(USB_VENDOR_MICROSOFT, 0x0446, 0)},
794184610Salfred	/* Windows Pocket PC 2003 */
795184610Salfred	{USB_VPI(USB_VENDOR_MICROSOFT, 0x0447, 0)},
796184610Salfred	/* Windows Pocket PC 2003 */
797184610Salfred	{USB_VPI(USB_VENDOR_MICROSOFT, 0x0448, 0)},
798184610Salfred	/* Windows Pocket PC 2003 */
799184610Salfred	{USB_VPI(USB_VENDOR_MICROSOFT, 0x0449, 0)},
800184610Salfred	/* Windows Pocket PC 2003 */
801184610Salfred	{USB_VPI(USB_VENDOR_MICROSOFT, 0x044a, 0)},
802184610Salfred	/* Windows Pocket PC 2003 */
803184610Salfred	{USB_VPI(USB_VENDOR_MICROSOFT, 0x044b, 0)},
804184610Salfred	/* Windows Pocket PC 2003 */
805184610Salfred	{USB_VPI(USB_VENDOR_MICROSOFT, 0x044c, 0)},
806184610Salfred	/* Windows Pocket PC 2003 */
807184610Salfred	{USB_VPI(USB_VENDOR_MICROSOFT, 0x044d, 0)},
808184610Salfred	/* Windows Pocket PC 2003 */
809184610Salfred	{USB_VPI(USB_VENDOR_MICROSOFT, 0x044e, 0)},
810184610Salfred	/* Windows Pocket PC 2003 */
811184610Salfred	{USB_VPI(USB_VENDOR_MICROSOFT, 0x044f, 0)},
812184610Salfred	/* Windows Pocket PC 2003 */
813184610Salfred	{USB_VPI(USB_VENDOR_MICROSOFT, 0x0450, 0)},
814184610Salfred	/* Windows Pocket PC 2003 */
815184610Salfred	{USB_VPI(USB_VENDOR_MICROSOFT, 0x0451, 0)},
816184610Salfred	/* Windows Pocket PC 2003 */
817184610Salfred	{USB_VPI(USB_VENDOR_MICROSOFT, 0x0452, 0)},
818184610Salfred	/* Windows Pocket PC 2003 */
819184610Salfred	{USB_VPI(USB_VENDOR_MICROSOFT, 0x0453, 0)},
820184610Salfred	/* Windows Pocket PC 2003 */
821184610Salfred	{USB_VPI(USB_VENDOR_MICROSOFT, 0x0454, 0)},
822184610Salfred	/* Windows Pocket PC 2003 */
823184610Salfred	{USB_VPI(USB_VENDOR_MICROSOFT, 0x0455, 0)},
824184610Salfred	/* Windows Pocket PC 2003 */
825184610Salfred	{USB_VPI(USB_VENDOR_MICROSOFT, 0x0456, 0)},
826184610Salfred	/* Windows Pocket PC 2003 */
827184610Salfred	{USB_VPI(USB_VENDOR_MICROSOFT, 0x0457, 0)},
828184610Salfred	/* Windows Pocket PC 2003 */
829184610Salfred	{USB_VPI(USB_VENDOR_MICROSOFT, 0x0458, 0)},
830184610Salfred	/* Windows Pocket PC 2003 */
831184610Salfred	{USB_VPI(USB_VENDOR_MICROSOFT, 0x0459, 0)},
832184610Salfred	/* Windows Pocket PC 2003 */
833184610Salfred	{USB_VPI(USB_VENDOR_MICROSOFT, 0x045a, 0)},
834184610Salfred	/* Windows Pocket PC 2003 */
835184610Salfred	{USB_VPI(USB_VENDOR_MICROSOFT, 0x045b, 0)},
836184610Salfred	/* Windows Pocket PC 2003 */
837184610Salfred	{USB_VPI(USB_VENDOR_MICROSOFT, 0x045c, 0)},
838184610Salfred	/* Windows Pocket PC 2003 */
839184610Salfred	{USB_VPI(USB_VENDOR_MICROSOFT, 0x045d, 0)},
840184610Salfred	/* Windows Pocket PC 2003 */
841184610Salfred	{USB_VPI(USB_VENDOR_MICROSOFT, 0x045e, 0)},
842184610Salfred	/* Windows Pocket PC 2003 */
843184610Salfred	{USB_VPI(USB_VENDOR_MICROSOFT, 0x045f, 0)},
844184610Salfred	/* Windows Pocket PC 2003 */
845184610Salfred	{USB_VPI(USB_VENDOR_MICROSOFT, 0x0460, 0)},
846184610Salfred	/* Windows Pocket PC 2003 */
847184610Salfred	{USB_VPI(USB_VENDOR_MICROSOFT, 0x0461, 0)},
848184610Salfred	/* Windows Pocket PC 2003 */
849184610Salfred	{USB_VPI(USB_VENDOR_MICROSOFT, 0x0462, 0)},
850184610Salfred	/* Windows Pocket PC 2003 */
851184610Salfred	{USB_VPI(USB_VENDOR_MICROSOFT, 0x0463, 0)},
852184610Salfred	/* Windows Pocket PC 2003 */
853184610Salfred	{USB_VPI(USB_VENDOR_MICROSOFT, 0x0464, 0)},
854184610Salfred	/* Windows Pocket PC 2003 */
855184610Salfred	{USB_VPI(USB_VENDOR_MICROSOFT, 0x0465, 0)},
856184610Salfred	/* Windows Pocket PC 2003 */
857184610Salfred	{USB_VPI(USB_VENDOR_MICROSOFT, 0x0466, 0)},
858184610Salfred	/* Windows Pocket PC 2003 */
859184610Salfred	{USB_VPI(USB_VENDOR_MICROSOFT, 0x0467, 0)},
860184610Salfred	/* Windows Pocket PC 2003 */
861184610Salfred	{USB_VPI(USB_VENDOR_MICROSOFT, 0x0468, 0)},
862184610Salfred	/* Windows Pocket PC 2003 */
863184610Salfred	{USB_VPI(USB_VENDOR_MICROSOFT, 0x0469, 0)},
864184610Salfred	/* Windows Pocket PC 2003 */
865184610Salfred	{USB_VPI(USB_VENDOR_MICROSOFT, 0x046a, 0)},
866184610Salfred	/* Windows Pocket PC 2003 */
867184610Salfred	{USB_VPI(USB_VENDOR_MICROSOFT, 0x046b, 0)},
868184610Salfred	/* Windows Pocket PC 2003 */
869184610Salfred	{USB_VPI(USB_VENDOR_MICROSOFT, 0x046c, 0)},
870184610Salfred	/* Windows Pocket PC 2003 */
871184610Salfred	{USB_VPI(USB_VENDOR_MICROSOFT, 0x046d, 0)},
872184610Salfred	/* Windows Pocket PC 2003 */
873184610Salfred	{USB_VPI(USB_VENDOR_MICROSOFT, 0x046e, 0)},
874184610Salfred	/* Windows Pocket PC 2003 */
875184610Salfred	{USB_VPI(USB_VENDOR_MICROSOFT, 0x046f, 0)},
876184610Salfred	/* Windows Pocket PC 2003 */
877184610Salfred	{USB_VPI(USB_VENDOR_MICROSOFT, 0x0470, 0)},
878184610Salfred	/* Windows Pocket PC 2003 */
879184610Salfred	{USB_VPI(USB_VENDOR_MICROSOFT, 0x0471, 0)},
880184610Salfred	/* Windows Pocket PC 2003 */
881184610Salfred	{USB_VPI(USB_VENDOR_MICROSOFT, 0x0472, 0)},
882184610Salfred	/* Windows Pocket PC 2003 */
883184610Salfred	{USB_VPI(USB_VENDOR_MICROSOFT, 0x0473, 0)},
884184610Salfred	/* Windows Pocket PC 2003 */
885184610Salfred	{USB_VPI(USB_VENDOR_MICROSOFT, 0x0474, 0)},
886184610Salfred	/* Windows Pocket PC 2003 */
887184610Salfred	{USB_VPI(USB_VENDOR_MICROSOFT, 0x0475, 0)},
888184610Salfred	/* Windows Pocket PC 2003 */
889184610Salfred	{USB_VPI(USB_VENDOR_MICROSOFT, 0x0476, 0)},
890184610Salfred	/* Windows Pocket PC 2003 */
891184610Salfred	{USB_VPI(USB_VENDOR_MICROSOFT, 0x0477, 0)},
892184610Salfred	/* Windows Pocket PC 2003 */
893184610Salfred	{USB_VPI(USB_VENDOR_MICROSOFT, 0x0478, 0)},
894184610Salfred	/* Windows Pocket PC 2003 */
895184610Salfred	{USB_VPI(USB_VENDOR_MICROSOFT, 0x0479, 0)},
896184610Salfred	/* Windows Pocket PC 2003 */
897184610Salfred	{USB_VPI(USB_VENDOR_MICROSOFT, 0x047a, 0)},
898184610Salfred	/* Windows Pocket PC 2003 */
899184610Salfred	{USB_VPI(USB_VENDOR_MICROSOFT, 0x047b, 0)},
900184610Salfred	/* Windows Smartphone 2002 */
901184610Salfred	{USB_VPI(USB_VENDOR_MICROSOFT, 0x04c8, 0)},
902184610Salfred	/* Windows Smartphone 2002 */
903184610Salfred	{USB_VPI(USB_VENDOR_MICROSOFT, 0x04c9, 0)},
904184610Salfred	/* Windows Smartphone 2002 */
905184610Salfred	{USB_VPI(USB_VENDOR_MICROSOFT, 0x04ca, 0)},
906184610Salfred	/* Windows Smartphone 2002 */
907184610Salfred	{USB_VPI(USB_VENDOR_MICROSOFT, 0x04cb, 0)},
908184610Salfred	/* Windows Smartphone 2002 */
909184610Salfred	{USB_VPI(USB_VENDOR_MICROSOFT, 0x04cc, 0)},
910184610Salfred	/* Windows Smartphone 2002 */
911184610Salfred	{USB_VPI(USB_VENDOR_MICROSOFT, 0x04cd, 0)},
912184610Salfred	/* Windows Smartphone 2002 */
913184610Salfred	{USB_VPI(USB_VENDOR_MICROSOFT, 0x04ce, 0)},
914184610Salfred	/* Windows Smartphone 2003 */
915184610Salfred	{USB_VPI(USB_VENDOR_MICROSOFT, 0x04d7, 0)},
916184610Salfred	/* Windows Smartphone 2003 */
917184610Salfred	{USB_VPI(USB_VENDOR_MICROSOFT, 0x04d8, 0)},
918184610Salfred	/* Windows Smartphone 2003 */
919184610Salfred	{USB_VPI(USB_VENDOR_MICROSOFT, 0x04d9, 0)},
920184610Salfred	/* Windows Smartphone 2003 */
921184610Salfred	{USB_VPI(USB_VENDOR_MICROSOFT, 0x04da, 0)},
922184610Salfred	/* Windows Smartphone 2003 */
923184610Salfred	{USB_VPI(USB_VENDOR_MICROSOFT, 0x04db, 0)},
924184610Salfred	/* Windows Smartphone 2003 */
925184610Salfred	{USB_VPI(USB_VENDOR_MICROSOFT, 0x04dc, 0)},
926184610Salfred	/* Windows Smartphone 2003 */
927184610Salfred	{USB_VPI(USB_VENDOR_MICROSOFT, 0x04dd, 0)},
928184610Salfred	/* Windows Smartphone 2003 */
929184610Salfred	{USB_VPI(USB_VENDOR_MICROSOFT, 0x04de, 0)},
930184610Salfred	/* Windows Smartphone 2003 */
931184610Salfred	{USB_VPI(USB_VENDOR_MICROSOFT, 0x04df, 0)},
932184610Salfred	/* Windows Smartphone 2003 */
933184610Salfred	{USB_VPI(USB_VENDOR_MICROSOFT, 0x04e0, 0)},
934184610Salfred	/* Windows Smartphone 2003 */
935184610Salfred	{USB_VPI(USB_VENDOR_MICROSOFT, 0x04e1, 0)},
936184610Salfred	/* Windows Smartphone 2003 */
937184610Salfred	{USB_VPI(USB_VENDOR_MICROSOFT, 0x04e2, 0)},
938184610Salfred	/* Windows Smartphone 2003 */
939184610Salfred	{USB_VPI(USB_VENDOR_MICROSOFT, 0x04e3, 0)},
940184610Salfred	/* Windows Smartphone 2003 */
941184610Salfred	{USB_VPI(USB_VENDOR_MICROSOFT, 0x04e4, 0)},
942184610Salfred	/* Windows Smartphone 2003 */
943184610Salfred	{USB_VPI(USB_VENDOR_MICROSOFT, 0x04e5, 0)},
944184610Salfred	/* Windows Smartphone 2003 */
945184610Salfred	{USB_VPI(USB_VENDOR_MICROSOFT, 0x04e6, 0)},
946184610Salfred	/* Windows Smartphone 2003 */
947184610Salfred	{USB_VPI(USB_VENDOR_MICROSOFT, 0x04e7, 0)},
948184610Salfred	/* Windows Smartphone 2003 */
949184610Salfred	{USB_VPI(USB_VENDOR_MICROSOFT, 0x04e8, 0)},
950184610Salfred	/* Windows Smartphone 2003 */
951184610Salfred	{USB_VPI(USB_VENDOR_MICROSOFT, 0x04e9, 0)},
952184610Salfred	/* Windows Smartphone 2003 */
953184610Salfred	{USB_VPI(USB_VENDOR_MICROSOFT, 0x04ea, 0)},
954184610Salfred	/* Motorola MPx200 Smartphone */
955184610Salfred	{USB_VPI(USB_VENDOR_MOTOROLA2, 0x4204, 0)},
956184610Salfred	/* Motorola MPc GSM */
957184610Salfred	{USB_VPI(USB_VENDOR_MOTOROLA2, 0x4214, 0)},
958184610Salfred	/* Motorola MPx220 Smartphone */
959184610Salfred	{USB_VPI(USB_VENDOR_MOTOROLA2, 0x4224, 0)},
960184610Salfred	/* Motorola MPc CDMA */
961184610Salfred	{USB_VPI(USB_VENDOR_MOTOROLA2, 0x4234, 0)},
962184610Salfred	/* Motorola MPx100 Smartphone */
963184610Salfred	{USB_VPI(USB_VENDOR_MOTOROLA2, 0x4244, 0)},
964184610Salfred	/* NEC USB Sync */
965184610Salfred	{USB_VPI(USB_VENDOR_NEC, 0x00d5, 0)},
966184610Salfred	/* NEC USB Sync */
967184610Salfred	{USB_VPI(USB_VENDOR_NEC, 0x00d6, 0)},
968184610Salfred	/* NEC USB Sync */
969184610Salfred	{USB_VPI(USB_VENDOR_NEC, 0x00d7, 0)},
970184610Salfred	/* NEC USB Sync */
971184610Salfred	{USB_VPI(USB_VENDOR_NEC, 0x8024, 0)},
972184610Salfred	/* NEC USB Sync */
973184610Salfred	{USB_VPI(USB_VENDOR_NEC, 0x8025, 0)},
974184610Salfred	/* Panasonic USB Sync */
975184610Salfred	{USB_VPI(USB_VENDOR_PANASONIC, 0x2500, 0)},
976184610Salfred	/* Samsung NEXiO USB Sync */
977184610Salfred	{USB_VPI(USB_VENDOR_SAMSUNG, 0x5f00, 0)},
978184610Salfred	/* Samsung NEXiO USB Sync */
979184610Salfred	{USB_VPI(USB_VENDOR_SAMSUNG, 0x5f01, 0)},
980184610Salfred	/* Samsung NEXiO USB Sync */
981184610Salfred	{USB_VPI(USB_VENDOR_SAMSUNG, 0x5f02, 0)},
982184610Salfred	/* Samsung NEXiO USB Sync */
983184610Salfred	{USB_VPI(USB_VENDOR_SAMSUNG, 0x5f03, 0)},
984184610Salfred	/* Samsung NEXiO USB Sync */
985184610Salfred	{USB_VPI(USB_VENDOR_SAMSUNG, 0x5f04, 0)},
986184610Salfred	/* Samsung MITs USB Sync */
987184610Salfred	{USB_VPI(USB_VENDOR_SAMSUNG, 0x6611, 0)},
988184610Salfred	/* Samsung MITs USB Sync */
989184610Salfred	{USB_VPI(USB_VENDOR_SAMSUNG, 0x6613, 0)},
990184610Salfred	/* Samsung MITs USB Sync */
991184610Salfred	{USB_VPI(USB_VENDOR_SAMSUNG, 0x6615, 0)},
992184610Salfred	/* Samsung MITs USB Sync */
993184610Salfred	{USB_VPI(USB_VENDOR_SAMSUNG, 0x6617, 0)},
994184610Salfred	/* Samsung MITs USB Sync */
995184610Salfred	{USB_VPI(USB_VENDOR_SAMSUNG, 0x6619, 0)},
996184610Salfred	/* Samsung MITs USB Sync */
997184610Salfred	{USB_VPI(USB_VENDOR_SAMSUNG, 0x661b, 0)},
998184610Salfred	/* Samsung MITs USB Sync */
999184610Salfred	{USB_VPI(USB_VENDOR_SAMSUNG, 0x662e, 0)},
1000184610Salfred	/* Samsung MITs USB Sync */
1001184610Salfred	{USB_VPI(USB_VENDOR_SAMSUNG, 0x6630, 0)},
1002184610Salfred	/* Samsung MITs USB Sync */
1003184610Salfred	{USB_VPI(USB_VENDOR_SAMSUNG, 0x6632, 0)},
1004184610Salfred	/* SHARP WS003SH USB Modem */
1005184610Salfred	{USB_VPI(USB_VENDOR_SHARP, 0x9102, 0)},
1006184610Salfred	/* SHARP WS004SH USB Modem */
1007184610Salfred	{USB_VPI(USB_VENDOR_SHARP, 0x9121, 0)},
1008184610Salfred	/* SHARP S01SH USB Modem */
1009184610Salfred	{USB_VPI(USB_VENDOR_SHARP, 0x9151, 0)},
1010192557Sthompsa	/**/
1011184610Salfred	{USB_VPI(USB_VENDOR_SHARP, USB_PRODUCT_SHARP_WZERO3ES, 0)},
1012192557Sthompsa	/**/
1013201318Sthompsa	{USB_VPI(USB_VENDOR_SHARP, USB_PRODUCT_SHARP_WZERO3ADES, 0)},
1014201318Sthompsa	/**/
1015192557Sthompsa	{USB_VPI(USB_VENDOR_SHARP, USB_PRODUCT_SHARP_WILLCOM03, 0)},
1016184610Salfred	/* Symbol USB Sync */
1017184610Salfred	{USB_VPI(USB_VENDOR_SYMBOL, 0x2000, 0)},
1018184610Salfred	/* Symbol USB Sync 0x2001 */
1019184610Salfred	{USB_VPI(USB_VENDOR_SYMBOL, 0x2001, 0)},
1020184610Salfred	/* Symbol USB Sync 0x2002 */
1021184610Salfred	{USB_VPI(USB_VENDOR_SYMBOL, 0x2002, 0)},
1022184610Salfred	/* Symbol USB Sync 0x2003 */
1023184610Salfred	{USB_VPI(USB_VENDOR_SYMBOL, 0x2003, 0)},
1024184610Salfred	/* Symbol USB Sync 0x2004 */
1025184610Salfred	{USB_VPI(USB_VENDOR_SYMBOL, 0x2004, 0)},
1026184610Salfred	/* Symbol USB Sync 0x2005 */
1027184610Salfred	{USB_VPI(USB_VENDOR_SYMBOL, 0x2005, 0)},
1028184610Salfred	/* Symbol USB Sync 0x2006 */
1029184610Salfred	{USB_VPI(USB_VENDOR_SYMBOL, 0x2006, 0)},
1030184610Salfred	/* Symbol USB Sync 0x2007 */
1031184610Salfred	{USB_VPI(USB_VENDOR_SYMBOL, 0x2007, 0)},
1032184610Salfred	/* Symbol USB Sync 0x2008 */
1033184610Salfred	{USB_VPI(USB_VENDOR_SYMBOL, 0x2008, 0)},
1034184610Salfred	/* Symbol USB Sync 0x2009 */
1035184610Salfred	{USB_VPI(USB_VENDOR_SYMBOL, 0x2009, 0)},
1036184610Salfred	/* Symbol USB Sync 0x200a */
1037184610Salfred	{USB_VPI(USB_VENDOR_SYMBOL, 0x200a, 0)},
1038184610Salfred	/* TOSHIBA USB Sync 0700 */
1039184610Salfred	{USB_VPI(USB_VENDOR_TOSHIBA, 0x0700, 0)},
1040184610Salfred	/* TOSHIBA Pocket PC e310 */
1041184610Salfred	{USB_VPI(USB_VENDOR_TOSHIBA, 0x0705, 0)},
1042184610Salfred	/* TOSHIBA Pocket PC e330 Series */
1043184610Salfred	{USB_VPI(USB_VENDOR_TOSHIBA, 0x0707, 0)},
1044184610Salfred	/* TOSHIBA Pocket PC e350Series */
1045184610Salfred	{USB_VPI(USB_VENDOR_TOSHIBA, 0x0708, 0)},
1046184610Salfred	/* TOSHIBA Pocket PC e750 Series */
1047184610Salfred	{USB_VPI(USB_VENDOR_TOSHIBA, 0x0709, 0)},
1048184610Salfred	/* TOSHIBA Pocket PC e400 Series */
1049184610Salfred	{USB_VPI(USB_VENDOR_TOSHIBA, 0x070a, 0)},
1050184610Salfred	/* TOSHIBA Pocket PC e800 Series */
1051184610Salfred	{USB_VPI(USB_VENDOR_TOSHIBA, 0x070b, 0)},
1052184610Salfred	/* TOSHIBA Pocket PC e740 */
1053184610Salfred	{USB_VPI(USB_VENDOR_TOSHIBA, USB_PRODUCT_TOSHIBA_POCKETPC_E740, 0)},
1054184610Salfred	/* ViewSonic Color Pocket PC V35 */
1055184610Salfred	{USB_VPI(USB_VENDOR_VIEWSONIC, 0x0ed9, 0)},
1056184610Salfred	/* ViewSonic Color Pocket PC V36 */
1057184610Salfred	{USB_VPI(USB_VENDOR_VIEWSONIC, 0x1527, 0)},
1058184610Salfred	/* ViewSonic Color Pocket PC V37 */
1059184610Salfred	{USB_VPI(USB_VENDOR_VIEWSONIC, 0x1529, 0)},
1060184610Salfred	/* ViewSonic Color Pocket PC V38 */
1061184610Salfred	{USB_VPI(USB_VENDOR_VIEWSONIC, 0x152b, 0)},
1062184610Salfred	/* ViewSonic Pocket PC */
1063184610Salfred	{USB_VPI(USB_VENDOR_VIEWSONIC, 0x152e, 0)},
1064184610Salfred	/* ViewSonic Communicator Pocket PC */
1065184610Salfred	{USB_VPI(USB_VENDOR_VIEWSONIC, 0x1921, 0)},
1066184610Salfred	/* ViewSonic Smartphone */
1067184610Salfred	{USB_VPI(USB_VENDOR_VIEWSONIC, 0x1922, 0)},
1068184610Salfred	/* ViewSonic Pocket PC V30 */
1069184610Salfred	{USB_VPI(USB_VENDOR_VIEWSONIC, 0x1923, 0)},
1070184610Salfred};
1071184610Salfred
1072184610Salfredstatic device_method_t uipaq_methods[] = {
1073184610Salfred	DEVMETHOD(device_probe, uipaq_probe),
1074184610Salfred	DEVMETHOD(device_attach, uipaq_attach),
1075184610Salfred	DEVMETHOD(device_detach, uipaq_detach),
1076239180Shselasky	DEVMETHOD_END
1077184610Salfred};
1078184610Salfred
1079184610Salfredstatic devclass_t uipaq_devclass;
1080184610Salfred
1081184610Salfredstatic driver_t uipaq_driver = {
1082184610Salfred	.name = "uipaq",
1083184610Salfred	.methods = uipaq_methods,
1084184610Salfred	.size = sizeof(struct uipaq_softc),
1085184610Salfred};
1086184610Salfred
1087189275SthompsaDRIVER_MODULE(uipaq, uhub, uipaq_driver, uipaq_devclass, NULL, 0);
1088188942SthompsaMODULE_DEPEND(uipaq, ucom, 1, 1, 1);
1089188942SthompsaMODULE_DEPEND(uipaq, usb, 1, 1, 1);
1090212122SthompsaMODULE_VERSION(uipaq, 1);
1091292080SimpUSB_PNP_HOST_INFO(uipaq_devs);
1092184610Salfred
1093184610Salfredstatic int
1094184610Salfreduipaq_probe(device_t dev)
1095184610Salfred{
1096192984Sthompsa	struct usb_attach_arg *uaa = device_get_ivars(dev);
1097184610Salfred
1098192499Sthompsa	if (uaa->usb_mode != USB_MODE_HOST) {
1099184610Salfred		return (ENXIO);
1100184610Salfred	}
1101184610Salfred	if (uaa->info.bConfigIndex != UIPAQ_CONFIG_INDEX) {
1102184610Salfred		return (ENXIO);
1103184610Salfred	}
1104184610Salfred	if (uaa->info.bIfaceIndex != UIPAQ_IFACE_INDEX) {
1105184610Salfred		return (ENXIO);
1106184610Salfred	}
1107196493Salfred	if (uaa->info.bInterfaceClass == UICLASS_IAD) {
1108196493Salfred		DPRINTF("IAD detected - not UIPAQ serial device\n");
1109196493Salfred		return (ENXIO);
1110196493Salfred	}
1111194228Sthompsa	return (usbd_lookup_id_by_uaa(uipaq_devs, sizeof(uipaq_devs), uaa));
1112184610Salfred}
1113184610Salfred
1114184610Salfredstatic int
1115184610Salfreduipaq_attach(device_t dev)
1116184610Salfred{
1117192984Sthompsa	struct usb_device_request req;
1118192984Sthompsa	struct usb_attach_arg *uaa = device_get_ivars(dev);
1119184610Salfred	struct uipaq_softc *sc = device_get_softc(dev);
1120184610Salfred	int error;
1121184610Salfred	uint8_t iface_index;
1122184610Salfred	uint8_t i;
1123184610Salfred
1124184610Salfred	sc->sc_udev = uaa->device;
1125184610Salfred
1126194228Sthompsa	device_set_usb_desc(dev);
1127189265Sthompsa	mtx_init(&sc->sc_mtx, "uipaq", NULL, MTX_DEF);
1128239180Shselasky	ucom_ref(&sc->sc_super_ucom);
1129184610Salfred
1130184610Salfred	/*
1131184610Salfred	 * Send magic bytes, cribbed from Linux ipaq driver that
1132184610Salfred	 * claims to have sniffed them from Win98. Wait for driver to
1133184610Salfred	 * become ready on device side?
1134184610Salfred	 */
1135184610Salfred	req.bmRequestType = UT_WRITE_CLASS_INTERFACE;
1136184610Salfred	req.bRequest = UCDC_SET_CONTROL_LINE_STATE;
1137184610Salfred	USETW(req.wValue, UCDC_LINE_DTR);
1138184610Salfred	USETW(req.wIndex, 0x0);
1139184610Salfred	USETW(req.wLength, 0);
1140184610Salfred	for (i = 0; i != 64; i++) {
1141184610Salfred		error =
1142194228Sthompsa		    usbd_do_request_flags(uaa->device, NULL, &req,
1143184610Salfred		    NULL, 0, NULL, 100);
1144184610Salfred		if (error == 0)
1145184610Salfred			break;
1146194228Sthompsa		usb_pause_mtx(NULL, hz / 10);
1147184610Salfred	}
1148184610Salfred
1149184610Salfred	iface_index = UIPAQ_IFACE_INDEX;
1150194228Sthompsa	error = usbd_transfer_setup(uaa->device, &iface_index,
1151187259Sthompsa	    sc->sc_xfer, uipaq_config_data,
1152189265Sthompsa	    UIPAQ_N_TRANSFER, sc, &sc->sc_mtx);
1153184610Salfred
1154184610Salfred	if (error) {
1155184610Salfred		goto detach;
1156184610Salfred	}
1157184610Salfred	/* clear stall at first run */
1158189265Sthompsa	mtx_lock(&sc->sc_mtx);
1159194677Sthompsa	usbd_xfer_set_stall(sc->sc_xfer[UIPAQ_BULK_DT_WR]);
1160194677Sthompsa	usbd_xfer_set_stall(sc->sc_xfer[UIPAQ_BULK_DT_RD]);
1161189265Sthompsa	mtx_unlock(&sc->sc_mtx);
1162184610Salfred
1163194228Sthompsa	error = ucom_attach(&sc->sc_super_ucom, &sc->sc_ucom, 1, sc,
1164189265Sthompsa	    &uipaq_callback, &sc->sc_mtx);
1165184610Salfred	if (error) {
1166184610Salfred		goto detach;
1167184610Salfred	}
1168214843Sn_hibma	ucom_set_pnpinfo_usb(&sc->sc_super_ucom, dev);
1169214843Sn_hibma
1170184610Salfred	return (0);
1171184610Salfred
1172184610Salfreddetach:
1173184610Salfred	uipaq_detach(dev);
1174184610Salfred	return (ENXIO);
1175184610Salfred}
1176184610Salfred
1177184610Salfredint
1178184610Salfreduipaq_detach(device_t dev)
1179184610Salfred{
1180184610Salfred	struct uipaq_softc *sc = device_get_softc(dev);
1181184610Salfred
1182214761Sn_hibma	ucom_detach(&sc->sc_super_ucom, &sc->sc_ucom);
1183194228Sthompsa	usbd_transfer_unsetup(sc->sc_xfer, UIPAQ_N_TRANSFER);
1184184610Salfred
1185239299Shselasky	device_claim_softc(dev);
1186239299Shselasky
1187239299Shselasky	uipaq_free_softc(sc);
1188239299Shselasky
1189184610Salfred	return (0);
1190184610Salfred}
1191184610Salfred
1192239180ShselaskyUCOM_UNLOAD_DRAIN(uipaq);
1193239180Shselasky
1194184610Salfredstatic void
1195239299Shselaskyuipaq_free_softc(struct uipaq_softc *sc)
1196239180Shselasky{
1197239180Shselasky	if (ucom_unref(&sc->sc_super_ucom)) {
1198239299Shselasky		mtx_destroy(&sc->sc_mtx);
1199239299Shselasky		device_free_softc(sc);
1200239180Shselasky	}
1201239180Shselasky}
1202239180Shselasky
1203239180Shselaskystatic void
1204239180Shselaskyuipaq_free(struct ucom_softc *ucom)
1205239180Shselasky{
1206239299Shselasky	uipaq_free_softc(ucom->sc_parent);
1207239180Shselasky}
1208239180Shselasky
1209239180Shselaskystatic void
1210192984Sthompsauipaq_start_read(struct ucom_softc *ucom)
1211184610Salfred{
1212184610Salfred	struct uipaq_softc *sc = ucom->sc_parent;
1213184610Salfred
1214184610Salfred	/* start read endpoint */
1215194228Sthompsa	usbd_transfer_start(sc->sc_xfer[UIPAQ_BULK_DT_RD]);
1216184610Salfred}
1217184610Salfred
1218184610Salfredstatic void
1219192984Sthompsauipaq_stop_read(struct ucom_softc *ucom)
1220184610Salfred{
1221184610Salfred	struct uipaq_softc *sc = ucom->sc_parent;
1222184610Salfred
1223184610Salfred	/* stop read endpoint */
1224194228Sthompsa	usbd_transfer_stop(sc->sc_xfer[UIPAQ_BULK_DT_RD]);
1225184610Salfred}
1226184610Salfred
1227184610Salfredstatic void
1228192984Sthompsauipaq_start_write(struct ucom_softc *ucom)
1229184610Salfred{
1230184610Salfred	struct uipaq_softc *sc = ucom->sc_parent;
1231184610Salfred
1232194228Sthompsa	usbd_transfer_start(sc->sc_xfer[UIPAQ_BULK_DT_WR]);
1233184610Salfred}
1234184610Salfred
1235184610Salfredstatic void
1236192984Sthompsauipaq_stop_write(struct ucom_softc *ucom)
1237184610Salfred{
1238184610Salfred	struct uipaq_softc *sc = ucom->sc_parent;
1239184610Salfred
1240194228Sthompsa	usbd_transfer_stop(sc->sc_xfer[UIPAQ_BULK_DT_WR]);
1241184610Salfred}
1242184610Salfred
1243184610Salfredstatic void
1244192984Sthompsauipaq_cfg_set_dtr(struct ucom_softc *ucom, uint8_t onoff)
1245184610Salfred{
1246184610Salfred	struct uipaq_softc *sc = ucom->sc_parent;
1247192984Sthompsa	struct usb_device_request req;
1248184610Salfred
1249184610Salfred	DPRINTF("onoff=%d\n", onoff);
1250184610Salfred
1251184610Salfred	if (onoff)
1252184610Salfred		sc->sc_line |= UCDC_LINE_DTR;
1253184610Salfred	else
1254184610Salfred		sc->sc_line &= ~UCDC_LINE_DTR;
1255184610Salfred
1256184610Salfred	req.bmRequestType = UT_WRITE_CLASS_INTERFACE;
1257184610Salfred	req.bRequest = UCDC_SET_CONTROL_LINE_STATE;
1258184610Salfred	USETW(req.wValue, sc->sc_line);
1259184610Salfred	req.wIndex[0] = UIPAQ_IFACE_INDEX;
1260184610Salfred	req.wIndex[1] = 0;
1261184610Salfred	USETW(req.wLength, 0);
1262184610Salfred
1263194228Sthompsa	ucom_cfg_do_request(sc->sc_udev, &sc->sc_ucom,
1264188413Sthompsa	    &req, NULL, 0, 1000);
1265184610Salfred}
1266184610Salfred
1267184610Salfredstatic void
1268192984Sthompsauipaq_cfg_set_rts(struct ucom_softc *ucom, uint8_t onoff)
1269184610Salfred{
1270184610Salfred	struct uipaq_softc *sc = ucom->sc_parent;
1271192984Sthompsa	struct usb_device_request req;
1272184610Salfred
1273184610Salfred	DPRINTF("onoff=%d\n", onoff);
1274184610Salfred
1275184610Salfred	if (onoff)
1276184610Salfred		sc->sc_line |= UCDC_LINE_RTS;
1277184610Salfred	else
1278184610Salfred		sc->sc_line &= ~UCDC_LINE_RTS;
1279184610Salfred
1280184610Salfred	req.bmRequestType = UT_WRITE_CLASS_INTERFACE;
1281184610Salfred	req.bRequest = UCDC_SET_CONTROL_LINE_STATE;
1282184610Salfred	USETW(req.wValue, sc->sc_line);
1283184610Salfred	req.wIndex[0] = UIPAQ_IFACE_INDEX;
1284184610Salfred	req.wIndex[1] = 0;
1285184610Salfred	USETW(req.wLength, 0);
1286184610Salfred
1287194228Sthompsa	ucom_cfg_do_request(sc->sc_udev, &sc->sc_ucom,
1288188413Sthompsa	    &req, NULL, 0, 1000);
1289184610Salfred}
1290184610Salfred
1291184610Salfredstatic void
1292192984Sthompsauipaq_cfg_set_break(struct ucom_softc *ucom, uint8_t onoff)
1293184610Salfred{
1294184610Salfred	struct uipaq_softc *sc = ucom->sc_parent;
1295192984Sthompsa	struct usb_device_request req;
1296184610Salfred	uint16_t temp;
1297184610Salfred
1298184610Salfred	temp = onoff ? UCDC_BREAK_ON : UCDC_BREAK_OFF;
1299184610Salfred
1300184610Salfred	req.bmRequestType = UT_WRITE_CLASS_INTERFACE;
1301184610Salfred	req.bRequest = UCDC_SEND_BREAK;
1302184610Salfred	USETW(req.wValue, temp);
1303184610Salfred	req.wIndex[0] = UIPAQ_IFACE_INDEX;
1304184610Salfred	req.wIndex[1] = 0;
1305184610Salfred	USETW(req.wLength, 0);
1306184610Salfred
1307194228Sthompsa	ucom_cfg_do_request(sc->sc_udev, &sc->sc_ucom,
1308188413Sthompsa	    &req, NULL, 0, 1000);
1309184610Salfred}
1310184610Salfred
1311184610Salfredstatic void
1312194677Sthompsauipaq_write_callback(struct usb_xfer *xfer, usb_error_t error)
1313184610Salfred{
1314194677Sthompsa	struct uipaq_softc *sc = usbd_xfer_softc(xfer);
1315194677Sthompsa	struct usb_page_cache *pc;
1316184610Salfred	uint32_t actlen;
1317184610Salfred
1318184610Salfred	switch (USB_GET_STATE(xfer)) {
1319184610Salfred	case USB_ST_SETUP:
1320184610Salfred	case USB_ST_TRANSFERRED:
1321188413Sthompsatr_setup:
1322194677Sthompsa		pc = usbd_xfer_get_frame(xfer, 0);
1323194677Sthompsa		if (ucom_get_data(&sc->sc_ucom, pc, 0,
1324184610Salfred		    UIPAQ_BUF_SIZE, &actlen)) {
1325194677Sthompsa			usbd_xfer_set_frame_len(xfer, 0, actlen);
1326194228Sthompsa			usbd_transfer_submit(xfer);
1327184610Salfred		}
1328184610Salfred		return;
1329184610Salfred
1330184610Salfred	default:			/* Error */
1331194677Sthompsa		if (error != USB_ERR_CANCELLED) {
1332188413Sthompsa			/* try to clear stall first */
1333194677Sthompsa			usbd_xfer_set_stall(xfer);
1334188413Sthompsa			goto tr_setup;
1335184610Salfred		}
1336184610Salfred		return;
1337184610Salfred	}
1338184610Salfred}
1339184610Salfred
1340184610Salfredstatic void
1341194677Sthompsauipaq_read_callback(struct usb_xfer *xfer, usb_error_t error)
1342184610Salfred{
1343194677Sthompsa	struct uipaq_softc *sc = usbd_xfer_softc(xfer);
1344194677Sthompsa	struct usb_page_cache *pc;
1345194677Sthompsa	int actlen;
1346184610Salfred
1347194677Sthompsa	usbd_xfer_status(xfer, &actlen, NULL, NULL, NULL);
1348194677Sthompsa
1349184610Salfred	switch (USB_GET_STATE(xfer)) {
1350184610Salfred	case USB_ST_TRANSFERRED:
1351194677Sthompsa		pc = usbd_xfer_get_frame(xfer, 0);
1352194677Sthompsa		ucom_put_data(&sc->sc_ucom, pc, 0, actlen);
1353184610Salfred
1354184610Salfred	case USB_ST_SETUP:
1355188413Sthompsatr_setup:
1356194677Sthompsa		usbd_xfer_set_frame_len(xfer, 0, usbd_xfer_max_len(xfer));
1357194228Sthompsa		usbd_transfer_submit(xfer);
1358184610Salfred		return;
1359184610Salfred
1360184610Salfred	default:			/* Error */
1361194677Sthompsa		if (error != USB_ERR_CANCELLED) {
1362188413Sthompsa			/* try to clear stall first */
1363194677Sthompsa			usbd_xfer_set_stall(xfer);
1364188413Sthompsa			goto tr_setup;
1365184610Salfred		}
1366184610Salfred		return;
1367184610Salfred	}
1368184610Salfred}
1369197570Sthompsa
1370197570Sthompsastatic void
1371197570Sthompsauipaq_poll(struct ucom_softc *ucom)
1372197570Sthompsa{
1373197570Sthompsa	struct uipaq_softc *sc = ucom->sc_parent;
1374197570Sthompsa	usbd_transfer_poll(sc->sc_xfer, UIPAQ_N_TRANSFER);
1375197570Sthompsa}
1376