uipaq.c revision 194677
1194178Sed/*	$NetBSD: uipaq.c,v 1.4 2006/11/16 01:33:27 christos Exp $	*/
2194178Sed/*	$OpenBSD: uipaq.c,v 1.1 2005/06/17 23:50:33 deraadt Exp $	*/
3194178Sed
4194178Sed/*
5194178Sed * Copyright (c) 2000-2005 The NetBSD Foundation, Inc.
6194178Sed * All rights reserved.
7194178Sed *
8194178Sed * This code is derived from software contributed to The NetBSD Foundation
9194178Sed * by Lennart Augustsson (lennart@augustsson.net) at
10194178Sed * Carlstedt Research & Technology.
11194178Sed *
12194178Sed * Redistribution and use in source and binary forms, with or without
13194178Sed * modification, are permitted provided that the following conditions
14194178Sed * are met:
15194178Sed * 1. Redistributions of source code must retain the above copyright
16194178Sed *    notice, this list of conditions and the following disclaimer.
17194178Sed * 2. Redistributions in binary form must reproduce the above copyright
18194178Sed *    notice, this list of conditions and the following disclaimer in the
19194178Sed *    documentation and/or other materials provided with the distribution.
20194178Sed * 3. All advertising materials mentioning features or use of this software
21194178Sed *    must display the following acknowledgement:
22194178Sed *        This product includes software developed by the NetBSD
23194612Sed *        Foundation, Inc. and its contributors.
24194178Sed * 4. Neither the name of The NetBSD Foundation nor the names of its
25194178Sed *    contributors may be used to endorse or promote products derived
26194178Sed *    from this software without specific prior written permission.
27194612Sed *
28194612Sed * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
29194178Sed * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
30198892Srdivacky * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
31194178Sed * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
32194178Sed * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
33212904Sdim * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
34194178Sed * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
35194178Sed * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
36194178Sed * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
37194178Sed * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
38194178Sed * POSSIBILITY OF SUCH DAMAGE.
39194178Sed */
40194178Sed
41194178Sed/*
42194178Sed * iPAQ driver
43212904Sdim *
44212904Sdim * 19 July 2003:	Incorporated changes suggested by Sam Lawrance from
45194178Sed * 			the uppc module
46194178Sed *
47194178Sed *
48194178Sed * Contact isis@cs.umd.edu if you have any questions/comments about this driver
49194178Sed */
50194178Sed
51198090Srdivacky#include <sys/cdefs.h>
52198090Srdivacky__FBSDID("$FreeBSD: head/sys/dev/usb/serial/uipaq.c 194677 2009-06-23 02:19:59Z thompsa $");
53194178Sed
54194178Sed#include <sys/stdint.h>
55194178Sed#include <sys/stddef.h>
56194178Sed#include <sys/param.h>
57194178Sed#include <sys/queue.h>
58194178Sed#include <sys/types.h>
59194178Sed#include <sys/systm.h>
60194178Sed#include <sys/kernel.h>
61194178Sed#include <sys/bus.h>
62194178Sed#include <sys/linker_set.h>
63194178Sed#include <sys/module.h>
64194178Sed#include <sys/lock.h>
65194178Sed#include <sys/mutex.h>
66194178Sed#include <sys/condvar.h>
67194178Sed#include <sys/sysctl.h>
68194178Sed#include <sys/sx.h>
69194178Sed#include <sys/unistd.h>
70210299Sed#include <sys/callout.h>
71212904Sdim#include <sys/malloc.h>
72212904Sdim#include <sys/priv.h>
73194178Sed
74194178Sed#include <dev/usb/usb.h>
75210299Sed#include <dev/usb/usbdi.h>
76210299Sed#include <dev/usb/usbdi_util.h>
77210299Sed#include <dev/usb/usb_cdc.h>
78194178Sed#include "usbdevs.h"
79194178Sed
80194178Sed#define	USB_DEBUG_VAR usb_debug
81194178Sed#include <dev/usb/usb_debug.h>
82194178Sed#include <dev/usb/usb_process.h>
83194178Sed
84194178Sed#include <dev/usb/serial/usb_serial.h>
85194178Sed
86194178Sed#define	UIPAQ_CONFIG_INDEX	0	/* config number 1 */
87194178Sed#define	UIPAQ_IFACE_INDEX	0
88194178Sed
89194178Sed#define	UIPAQ_BUF_SIZE		1024
90194178Sed
91194178Sedenum {
92194178Sed	UIPAQ_BULK_DT_WR,
93194178Sed	UIPAQ_BULK_DT_RD,
94194178Sed	UIPAQ_N_TRANSFER,
95194178Sed};
96194178Sed
97194178Sedstruct uipaq_softc {
98194178Sed	struct ucom_super_softc sc_super_ucom;
99194178Sed	struct ucom_softc sc_ucom;
100194178Sed
101194178Sed	struct usb_xfer *sc_xfer[UIPAQ_N_TRANSFER];
102194178Sed	struct usb_device *sc_udev;
103194178Sed	struct mtx sc_mtx;
104194178Sed
105194178Sed	uint16_t sc_line;
106194178Sed
107194178Sed	uint8_t	sc_lsr;			/* local status register */
108194178Sed	uint8_t	sc_msr;			/* modem status register */
109194178Sed};
110194178Sed
111194178Sedstatic device_probe_t uipaq_probe;
112194178Sedstatic device_attach_t uipaq_attach;
113194178Sedstatic device_detach_t uipaq_detach;
114194178Sed
115194178Sedstatic usb_callback_t uipaq_write_callback;
116194178Sedstatic usb_callback_t uipaq_read_callback;
117194178Sed
118194178Sedstatic void	uipaq_start_read(struct ucom_softc *);
119194178Sedstatic void	uipaq_stop_read(struct ucom_softc *);
120194178Sedstatic void	uipaq_start_write(struct ucom_softc *);
121194178Sedstatic void	uipaq_stop_write(struct ucom_softc *);
122203954Srdivackystatic void	uipaq_cfg_set_dtr(struct ucom_softc *, uint8_t);
123194178Sedstatic void	uipaq_cfg_set_rts(struct ucom_softc *, uint8_t);
124194178Sedstatic void	uipaq_cfg_set_break(struct ucom_softc *, uint8_t);
125207618Srdivacky
126207618Srdivackystatic const struct usb_config uipaq_config_data[UIPAQ_N_TRANSFER] = {
127194178Sed
128194178Sed	[UIPAQ_BULK_DT_WR] = {
129194178Sed		.type = UE_BULK,
130194178Sed		.endpoint = UE_ADDR_ANY,
131194178Sed		.direction = UE_DIR_OUT,
132207618Srdivacky		.bufsize = UIPAQ_BUF_SIZE,
133207618Srdivacky		.flags = {.pipe_bof = 1,.force_short_xfer = 1,},
134207618Srdivacky		.callback = &uipaq_write_callback,
135207618Srdivacky	},
136194178Sed
137194178Sed	[UIPAQ_BULK_DT_RD] = {
138194178Sed		.type = UE_BULK,
139194178Sed		.endpoint = UE_ADDR_ANY,
140194178Sed		.direction = UE_DIR_IN,
141194178Sed		.bufsize = UIPAQ_BUF_SIZE,
142194612Sed		.flags = {.pipe_bof = 1,.short_xfer_ok = 1,},
143194612Sed		.callback = &uipaq_read_callback,
144194178Sed	},
145194178Sed};
146194178Sed
147194178Sedstatic const struct ucom_callback uipaq_callback = {
148194178Sed	.ucom_cfg_set_dtr = &uipaq_cfg_set_dtr,
149194178Sed	.ucom_cfg_set_rts = &uipaq_cfg_set_rts,
150194178Sed	.ucom_cfg_set_break = &uipaq_cfg_set_break,
151194178Sed	.ucom_start_read = &uipaq_start_read,
152202375Srdivacky	.ucom_stop_read = &uipaq_stop_read,
153194178Sed	.ucom_start_write = &uipaq_start_write,
154194178Sed	.ucom_stop_write = &uipaq_stop_write,
155194178Sed};
156194178Sed
157194178Sed/*
158194178Sed * Much of this list is generated from lists of other drivers that
159194178Sed * support the same hardware. Numeric values are used where no usbdevs
160194178Sed * entries exist.
161194178Sed */
162194178Sedstatic const struct usb_device_id uipaq_devs[] = {
163194178Sed	/* Socket USB Sync */
164212904Sdim	{USB_VPI(0x0104, 0x00be, 0)},
165194178Sed	/* USB Sync 0301 */
166194178Sed	{USB_VPI(0x04ad, 0x0301, 0)},
167194178Sed	/* USB Sync 0302 */
168194178Sed	{USB_VPI(0x04ad, 0x0302, 0)},
169194178Sed	/* USB Sync 0303 */
170194178Sed	{USB_VPI(0x04ad, 0x0303, 0)},
171194178Sed	/* GPS Pocket PC USB Sync */
172194178Sed	{USB_VPI(0x04ad, 0x0306, 0)},
173194178Sed	/* HHP PDT */
174194178Sed	{USB_VPI(0x0536, 0x01a0, 0)},
175194178Sed	/* Intermec Mobile Computer */
176194178Sed	{USB_VPI(0x067e, 0x1001, 0)},
177194178Sed	/* Linkup Systems USB Sync */
178194178Sed	{USB_VPI(0x094b, 0x0001, 0)},
179194178Sed	/* BCOM USB Sync 0065 */
180195340Sed	{USB_VPI(0x0960, 0x0065, 0)},
181	/* BCOM USB Sync 0066 */
182	{USB_VPI(0x0960, 0x0066, 0)},
183	/* BCOM USB Sync 0067 */
184	{USB_VPI(0x0960, 0x0067, 0)},
185	/* Portatec USB Sync */
186	{USB_VPI(0x0961, 0x0010, 0)},
187	/* Trimble GeoExplorer */
188	{USB_VPI(0x099e, 0x0052, 0)},
189	/* TDS Data Collector */
190	{USB_VPI(0x099e, 0x4000, 0)},
191	/* Motorola iDEN Smartphone */
192	{USB_VPI(0x0c44, 0x03a2, 0)},
193	/* Cesscom Luxian Series */
194	{USB_VPI(0x0c8e, 0x6000, 0)},
195	/* Motorola PowerPad Pocket PCDevice */
196	{USB_VPI(0x0cad, 0x9001, 0)},
197	/* Freedom Scientific USB Sync */
198	{USB_VPI(0x0f4e, 0x0200, 0)},
199	/* Cyberbank USB Sync */
200	{USB_VPI(0x0f98, 0x0201, 0)},
201	/* Wistron USB Sync */
202	{USB_VPI(0x0fb8, 0x3001, 0)},
203	/* Wistron USB Sync */
204	{USB_VPI(0x0fb8, 0x3002, 0)},
205	/* Wistron USB Sync */
206	{USB_VPI(0x0fb8, 0x3003, 0)},
207	/* Wistron USB Sync */
208	{USB_VPI(0x0fb8, 0x4001, 0)},
209	/* E-TEN USB Sync */
210	{USB_VPI(0x1066, 0x00ce, 0)},
211	/* E-TEN P3XX Pocket PC */
212	{USB_VPI(0x1066, 0x0300, 0)},
213	/* E-TEN P5XX Pocket PC */
214	{USB_VPI(0x1066, 0x0500, 0)},
215	/* E-TEN P6XX Pocket PC */
216	{USB_VPI(0x1066, 0x0600, 0)},
217	/* E-TEN P7XX Pocket PC */
218	{USB_VPI(0x1066, 0x0700, 0)},
219	/* Psion Teklogix Sync 753x */
220	{USB_VPI(0x1114, 0x0001, 0)},
221	/* Psion Teklogix Sync netBookPro */
222	{USB_VPI(0x1114, 0x0004, 0)},
223	/* Psion Teklogix Sync 7525 */
224	{USB_VPI(0x1114, 0x0006, 0)},
225	/* VES USB Sync */
226	{USB_VPI(0x1182, 0x1388, 0)},
227	/* Rugged Pocket PC 2003 */
228	{USB_VPI(0x11d9, 0x1002, 0)},
229	/* Rugged Pocket PC 2003 */
230	{USB_VPI(0x11d9, 0x1003, 0)},
231	/* USB Sync 03 */
232	{USB_VPI(0x1231, 0xce01, 0)},
233	/* USB Sync 03 */
234	{USB_VPI(0x1231, 0xce02, 0)},
235	/* Mio DigiWalker PPC StrongARM */
236	{USB_VPI(0x3340, 0x011c, 0)},
237	/* Mio DigiWalker 338 */
238	{USB_VPI(0x3340, 0x0326, 0)},
239	/* Mio DigiWalker 338 */
240	{USB_VPI(0x3340, 0x0426, 0)},
241	/* Mio DigiWalker USB Sync */
242	{USB_VPI(0x3340, 0x043a, 0)},
243	/* MiTAC USB Sync 528 */
244	{USB_VPI(0x3340, 0x051c, 0)},
245	/* Mio DigiWalker SmartPhone USB Sync */
246	{USB_VPI(0x3340, 0x053a, 0)},
247	/* MiTAC USB Sync */
248	{USB_VPI(0x3340, 0x071c, 0)},
249	/* Generic PPC StrongARM */
250	{USB_VPI(0x3340, 0x0b1c, 0)},
251	/* Generic PPC USB Sync */
252	{USB_VPI(0x3340, 0x0e3a, 0)},
253	/* Itautec USB Sync */
254	{USB_VPI(0x3340, 0x0f1c, 0)},
255	/* Generic SmartPhone USB Sync */
256	{USB_VPI(0x3340, 0x0f3a, 0)},
257	/* Itautec USB Sync */
258	{USB_VPI(0x3340, 0x1326, 0)},
259	/* YAKUMO USB Sync */
260	{USB_VPI(0x3340, 0x191c, 0)},
261	/* Vobis USB Sync */
262	{USB_VPI(0x3340, 0x2326, 0)},
263	/* MEDION Winodws Moble USB Sync */
264	{USB_VPI(0x3340, 0x3326, 0)},
265	/* Legend USB Sync */
266	{USB_VPI(0x3708, 0x20ce, 0)},
267	/* Lenovo USB Sync */
268	{USB_VPI(0x3708, 0x21ce, 0)},
269	/* Mobile Media Technology USB Sync */
270	{USB_VPI(0x4113, 0x0210, 0)},
271	/* Mobile Media Technology USB Sync */
272	{USB_VPI(0x4113, 0x0211, 0)},
273	/* Mobile Media Technology USB Sync */
274	{USB_VPI(0x4113, 0x0400, 0)},
275	/* Mobile Media Technology USB Sync */
276	{USB_VPI(0x4113, 0x0410, 0)},
277	/* Smartphone */
278	{USB_VPI(0x4505, 0x0010, 0)},
279	/* SAGEM Wireless Assistant */
280	{USB_VPI(0x5e04, 0xce00, 0)},
281	/* c10 Series */
282	{USB_VPI(USB_VENDOR_ACER, 0x1631, 0)},
283	/* c20 Series */
284	{USB_VPI(USB_VENDOR_ACER, 0x1632, 0)},
285	/* Acer n10 Handheld USB Sync */
286	{USB_VPI(USB_VENDOR_ACER, 0x16e1, 0)},
287	/* Acer n20 Handheld USB Sync */
288	{USB_VPI(USB_VENDOR_ACER, 0x16e2, 0)},
289	/* Acer n30 Handheld USB Sync */
290	{USB_VPI(USB_VENDOR_ACER, 0x16e3, 0)},
291	/* ASUS USB Sync */
292	{USB_VPI(USB_VENDOR_ASUS, 0x4200, 0)},
293	/* ASUS USB Sync */
294	{USB_VPI(USB_VENDOR_ASUS, 0x4201, 0)},
295	/* ASUS USB Sync */
296	{USB_VPI(USB_VENDOR_ASUS, 0x4202, 0)},
297	/* ASUS USB Sync */
298	{USB_VPI(USB_VENDOR_ASUS, 0x9200, 0)},
299	/* ASUS USB Sync */
300	{USB_VPI(USB_VENDOR_ASUS, 0x9202, 0)},
301	/**/
302	{USB_VPI(USB_VENDOR_ASUS, USB_PRODUCT_ASUS_P535, 0)},
303	/* CASIO USB Sync 2001 */
304	{USB_VPI(USB_VENDOR_CASIO, 0x2001, 0)},
305	/* CASIO USB Sync 2003 */
306	{USB_VPI(USB_VENDOR_CASIO, 0x2003, 0)},
307	/**/
308	{USB_VPI(USB_VENDOR_CASIO, USB_PRODUCT_CASIO_BE300, 0)},
309	/* MyGuide 7000 XL USB Sync */
310	{USB_VPI(USB_VENDOR_COMPAL, 0x0531, 0)},
311	/* Compaq iPAQ USB Sync */
312	{USB_VPI(USB_VENDOR_COMPAQ, 0x0032, 0)},
313	/**/
314	{USB_VPI(USB_VENDOR_COMPAQ, USB_PRODUCT_COMPAQ_IPAQPOCKETPC, 0)},
315	/* Dell Axim USB Sync */
316	{USB_VPI(USB_VENDOR_DELL, 0x4001, 0)},
317	/* Dell Axim USB Sync */
318	{USB_VPI(USB_VENDOR_DELL, 0x4002, 0)},
319	/* Dell Axim USB Sync */
320	{USB_VPI(USB_VENDOR_DELL, 0x4003, 0)},
321	/* Dell Axim USB Sync */
322	{USB_VPI(USB_VENDOR_DELL, 0x4004, 0)},
323	/* Dell Axim USB Sync */
324	{USB_VPI(USB_VENDOR_DELL, 0x4005, 0)},
325	/* Dell Axim USB Sync */
326	{USB_VPI(USB_VENDOR_DELL, 0x4006, 0)},
327	/* Dell Axim USB Sync */
328	{USB_VPI(USB_VENDOR_DELL, 0x4007, 0)},
329	/* Dell Axim USB Sync */
330	{USB_VPI(USB_VENDOR_DELL, 0x4008, 0)},
331	/* Dell Axim USB Sync */
332	{USB_VPI(USB_VENDOR_DELL, 0x4009, 0)},
333	/* Fujitsu Siemens Computers USB Sync */
334	{USB_VPI(USB_VENDOR_FSC, 0x1001, 0)},
335	/* FUJITSU USB Sync */
336	{USB_VPI(USB_VENDOR_FUJITSU, 0x1058, 0)},
337	/* FUJITSU USB Sync */
338	{USB_VPI(USB_VENDOR_FUJITSU, 0x1079, 0)},
339	/* Askey USB Sync */
340	{USB_VPI(USB_VENDOR_GIGASET, 0x0601, 0)},
341	/* Hitachi USB Sync */
342	{USB_VPI(USB_VENDOR_HITACHI, 0x0014, 0)},
343	/* HP USB Sync 1612 */
344	{USB_VPI(USB_VENDOR_HP, 0x1216, 0)},
345	/* HP USB Sync 1620 */
346	{USB_VPI(USB_VENDOR_HP, 0x2016, 0)},
347	/* HP USB Sync 1621 */
348	{USB_VPI(USB_VENDOR_HP, 0x2116, 0)},
349	/* HP USB Sync 1622 */
350	{USB_VPI(USB_VENDOR_HP, 0x2216, 0)},
351	/* HP USB Sync 1630 */
352	{USB_VPI(USB_VENDOR_HP, 0x3016, 0)},
353	/* HP USB Sync 1631 */
354	{USB_VPI(USB_VENDOR_HP, 0x3116, 0)},
355	/* HP USB Sync 1632 */
356	{USB_VPI(USB_VENDOR_HP, 0x3216, 0)},
357	/* HP USB Sync 1640 */
358	{USB_VPI(USB_VENDOR_HP, 0x4016, 0)},
359	/* HP USB Sync 1641 */
360	{USB_VPI(USB_VENDOR_HP, 0x4116, 0)},
361	/* HP USB Sync 1642 */
362	{USB_VPI(USB_VENDOR_HP, 0x4216, 0)},
363	/* HP USB Sync 1650 */
364	{USB_VPI(USB_VENDOR_HP, 0x5016, 0)},
365	/* HP USB Sync 1651 */
366	{USB_VPI(USB_VENDOR_HP, 0x5116, 0)},
367	/* HP USB Sync 1652 */
368	{USB_VPI(USB_VENDOR_HP, 0x5216, 0)},
369	/**/
370	{USB_VPI(USB_VENDOR_HP, USB_PRODUCT_HP_2215, 0)},
371	/**/
372	{USB_VPI(USB_VENDOR_HP, USB_PRODUCT_HP_568J, 0)},
373	/* HTC USB Modem */
374	{USB_VPI(USB_VENDOR_HTC, 0x00cf, 0)},
375	/* PocketPC USB Sync */
376	{USB_VPI(USB_VENDOR_HTC, 0x0a01, 0)},
377	/* PocketPC USB Sync */
378	{USB_VPI(USB_VENDOR_HTC, 0x0a02, 0)},
379	/* PocketPC USB Sync */
380	{USB_VPI(USB_VENDOR_HTC, 0x0a03, 0)},
381	/* PocketPC USB Sync */
382	{USB_VPI(USB_VENDOR_HTC, 0x0a04, 0)},
383	/* PocketPC USB Sync */
384	{USB_VPI(USB_VENDOR_HTC, 0x0a05, 0)},
385	/* PocketPC USB Sync */
386	{USB_VPI(USB_VENDOR_HTC, 0x0a06, 0)},
387	/* PocketPC USB Sync */
388	{USB_VPI(USB_VENDOR_HTC, 0x0a07, 0)},
389	/* PocketPC USB Sync */
390	{USB_VPI(USB_VENDOR_HTC, 0x0a08, 0)},
391	/* PocketPC USB Sync */
392	{USB_VPI(USB_VENDOR_HTC, 0x0a09, 0)},
393	/* PocketPC USB Sync */
394	{USB_VPI(USB_VENDOR_HTC, 0x0a0a, 0)},
395	/* PocketPC USB Sync */
396	{USB_VPI(USB_VENDOR_HTC, 0x0a0b, 0)},
397	/* PocketPC USB Sync */
398	{USB_VPI(USB_VENDOR_HTC, 0x0a0c, 0)},
399	/* PocketPC USB Sync */
400	{USB_VPI(USB_VENDOR_HTC, 0x0a0d, 0)},
401	/* PocketPC USB Sync */
402	{USB_VPI(USB_VENDOR_HTC, 0x0a0e, 0)},
403	/* PocketPC USB Sync */
404	{USB_VPI(USB_VENDOR_HTC, 0x0a0f, 0)},
405	/* PocketPC USB Sync */
406	{USB_VPI(USB_VENDOR_HTC, 0x0a10, 0)},
407	/* PocketPC USB Sync */
408	{USB_VPI(USB_VENDOR_HTC, 0x0a11, 0)},
409	/* PocketPC USB Sync */
410	{USB_VPI(USB_VENDOR_HTC, 0x0a12, 0)},
411	/* PocketPC USB Sync */
412	{USB_VPI(USB_VENDOR_HTC, 0x0a13, 0)},
413	/* PocketPC USB Sync */
414	{USB_VPI(USB_VENDOR_HTC, 0x0a14, 0)},
415	/* PocketPC USB Sync */
416	{USB_VPI(USB_VENDOR_HTC, 0x0a15, 0)},
417	/* PocketPC USB Sync */
418	{USB_VPI(USB_VENDOR_HTC, 0x0a16, 0)},
419	/* PocketPC USB Sync */
420	{USB_VPI(USB_VENDOR_HTC, 0x0a17, 0)},
421	/* PocketPC USB Sync */
422	{USB_VPI(USB_VENDOR_HTC, 0x0a18, 0)},
423	/* PocketPC USB Sync */
424	{USB_VPI(USB_VENDOR_HTC, 0x0a19, 0)},
425	/* PocketPC USB Sync */
426	{USB_VPI(USB_VENDOR_HTC, 0x0a1a, 0)},
427	/* PocketPC USB Sync */
428	{USB_VPI(USB_VENDOR_HTC, 0x0a1b, 0)},
429	/* PocketPC USB Sync */
430	{USB_VPI(USB_VENDOR_HTC, 0x0a1c, 0)},
431	/* PocketPC USB Sync */
432	{USB_VPI(USB_VENDOR_HTC, 0x0a1d, 0)},
433	/* PocketPC USB Sync */
434	{USB_VPI(USB_VENDOR_HTC, 0x0a1e, 0)},
435	/* PocketPC USB Sync */
436	{USB_VPI(USB_VENDOR_HTC, 0x0a1f, 0)},
437	/* PocketPC USB Sync */
438	{USB_VPI(USB_VENDOR_HTC, 0x0a20, 0)},
439	/* PocketPC USB Sync */
440	{USB_VPI(USB_VENDOR_HTC, 0x0a21, 0)},
441	/* PocketPC USB Sync */
442	{USB_VPI(USB_VENDOR_HTC, 0x0a22, 0)},
443	/* PocketPC USB Sync */
444	{USB_VPI(USB_VENDOR_HTC, 0x0a23, 0)},
445	/* PocketPC USB Sync */
446	{USB_VPI(USB_VENDOR_HTC, 0x0a24, 0)},
447	/* PocketPC USB Sync */
448	{USB_VPI(USB_VENDOR_HTC, 0x0a25, 0)},
449	/* PocketPC USB Sync */
450	{USB_VPI(USB_VENDOR_HTC, 0x0a26, 0)},
451	/* PocketPC USB Sync */
452	{USB_VPI(USB_VENDOR_HTC, 0x0a27, 0)},
453	/* PocketPC USB Sync */
454	{USB_VPI(USB_VENDOR_HTC, 0x0a28, 0)},
455	/* PocketPC USB Sync */
456	{USB_VPI(USB_VENDOR_HTC, 0x0a29, 0)},
457	/* PocketPC USB Sync */
458	{USB_VPI(USB_VENDOR_HTC, 0x0a2a, 0)},
459	/* PocketPC USB Sync */
460	{USB_VPI(USB_VENDOR_HTC, 0x0a2b, 0)},
461	/* PocketPC USB Sync */
462	{USB_VPI(USB_VENDOR_HTC, 0x0a2c, 0)},
463	/* PocketPC USB Sync */
464	{USB_VPI(USB_VENDOR_HTC, 0x0a2d, 0)},
465	/* PocketPC USB Sync */
466	{USB_VPI(USB_VENDOR_HTC, 0x0a2e, 0)},
467	/* PocketPC USB Sync */
468	{USB_VPI(USB_VENDOR_HTC, 0x0a2f, 0)},
469	/* PocketPC USB Sync */
470	{USB_VPI(USB_VENDOR_HTC, 0x0a30, 0)},
471	/* PocketPC USB Sync */
472	{USB_VPI(USB_VENDOR_HTC, 0x0a31, 0)},
473	/* PocketPC USB Sync */
474	{USB_VPI(USB_VENDOR_HTC, 0x0a32, 0)},
475	/* PocketPC USB Sync */
476	{USB_VPI(USB_VENDOR_HTC, 0x0a33, 0)},
477	/* PocketPC USB Sync */
478	{USB_VPI(USB_VENDOR_HTC, 0x0a34, 0)},
479	/* PocketPC USB Sync */
480	{USB_VPI(USB_VENDOR_HTC, 0x0a35, 0)},
481	/* PocketPC USB Sync */
482	{USB_VPI(USB_VENDOR_HTC, 0x0a36, 0)},
483	/* PocketPC USB Sync */
484	{USB_VPI(USB_VENDOR_HTC, 0x0a37, 0)},
485	/* PocketPC USB Sync */
486	{USB_VPI(USB_VENDOR_HTC, 0x0a38, 0)},
487	/* PocketPC USB Sync */
488	{USB_VPI(USB_VENDOR_HTC, 0x0a39, 0)},
489	/* PocketPC USB Sync */
490	{USB_VPI(USB_VENDOR_HTC, 0x0a3a, 0)},
491	/* PocketPC USB Sync */
492	{USB_VPI(USB_VENDOR_HTC, 0x0a3b, 0)},
493	/* PocketPC USB Sync */
494	{USB_VPI(USB_VENDOR_HTC, 0x0a3c, 0)},
495	/* PocketPC USB Sync */
496	{USB_VPI(USB_VENDOR_HTC, 0x0a3d, 0)},
497	/* PocketPC USB Sync */
498	{USB_VPI(USB_VENDOR_HTC, 0x0a3e, 0)},
499	/* PocketPC USB Sync */
500	{USB_VPI(USB_VENDOR_HTC, 0x0a3f, 0)},
501	/* PocketPC USB Sync */
502	{USB_VPI(USB_VENDOR_HTC, 0x0a40, 0)},
503	/* PocketPC USB Sync */
504	{USB_VPI(USB_VENDOR_HTC, 0x0a41, 0)},
505	/* PocketPC USB Sync */
506	{USB_VPI(USB_VENDOR_HTC, 0x0a42, 0)},
507	/* PocketPC USB Sync */
508	{USB_VPI(USB_VENDOR_HTC, 0x0a43, 0)},
509	/* PocketPC USB Sync */
510	{USB_VPI(USB_VENDOR_HTC, 0x0a44, 0)},
511	/* PocketPC USB Sync */
512	{USB_VPI(USB_VENDOR_HTC, 0x0a45, 0)},
513	/* PocketPC USB Sync */
514	{USB_VPI(USB_VENDOR_HTC, 0x0a46, 0)},
515	/* PocketPC USB Sync */
516	{USB_VPI(USB_VENDOR_HTC, 0x0a47, 0)},
517	/* PocketPC USB Sync */
518	{USB_VPI(USB_VENDOR_HTC, 0x0a48, 0)},
519	/* PocketPC USB Sync */
520	{USB_VPI(USB_VENDOR_HTC, 0x0a49, 0)},
521	/* PocketPC USB Sync */
522	{USB_VPI(USB_VENDOR_HTC, 0x0a4a, 0)},
523	/* PocketPC USB Sync */
524	{USB_VPI(USB_VENDOR_HTC, 0x0a4b, 0)},
525	/* PocketPC USB Sync */
526	{USB_VPI(USB_VENDOR_HTC, 0x0a4c, 0)},
527	/* PocketPC USB Sync */
528	{USB_VPI(USB_VENDOR_HTC, 0x0a4d, 0)},
529	/* PocketPC USB Sync */
530	{USB_VPI(USB_VENDOR_HTC, 0x0a4e, 0)},
531	/* PocketPC USB Sync */
532	{USB_VPI(USB_VENDOR_HTC, 0x0a4f, 0)},
533	/* HTC SmartPhone USB Sync */
534	{USB_VPI(USB_VENDOR_HTC, 0x0a50, 0)},
535	/* SmartPhone USB Sync */
536	{USB_VPI(USB_VENDOR_HTC, 0x0a52, 0)},
537	/* SmartPhone USB Sync */
538	{USB_VPI(USB_VENDOR_HTC, 0x0a53, 0)},
539	/* SmartPhone USB Sync */
540	{USB_VPI(USB_VENDOR_HTC, 0x0a54, 0)},
541	/* SmartPhone USB Sync */
542	{USB_VPI(USB_VENDOR_HTC, 0x0a55, 0)},
543	/* SmartPhone USB Sync */
544	{USB_VPI(USB_VENDOR_HTC, 0x0a56, 0)},
545	/* SmartPhone USB Sync */
546	{USB_VPI(USB_VENDOR_HTC, 0x0a57, 0)},
547	/* SmartPhone USB Sync */
548	{USB_VPI(USB_VENDOR_HTC, 0x0a58, 0)},
549	/* SmartPhone USB Sync */
550	{USB_VPI(USB_VENDOR_HTC, 0x0a59, 0)},
551	/* SmartPhone USB Sync */
552	{USB_VPI(USB_VENDOR_HTC, 0x0a5a, 0)},
553	/* SmartPhone USB Sync */
554	{USB_VPI(USB_VENDOR_HTC, 0x0a5b, 0)},
555	/* SmartPhone USB Sync */
556	{USB_VPI(USB_VENDOR_HTC, 0x0a5c, 0)},
557	/* SmartPhone USB Sync */
558	{USB_VPI(USB_VENDOR_HTC, 0x0a5d, 0)},
559	/* SmartPhone USB Sync */
560	{USB_VPI(USB_VENDOR_HTC, 0x0a5e, 0)},
561	/* SmartPhone USB Sync */
562	{USB_VPI(USB_VENDOR_HTC, 0x0a5f, 0)},
563	/* SmartPhone USB Sync */
564	{USB_VPI(USB_VENDOR_HTC, 0x0a60, 0)},
565	/* SmartPhone USB Sync */
566	{USB_VPI(USB_VENDOR_HTC, 0x0a61, 0)},
567	/* SmartPhone USB Sync */
568	{USB_VPI(USB_VENDOR_HTC, 0x0a62, 0)},
569	/* SmartPhone USB Sync */
570	{USB_VPI(USB_VENDOR_HTC, 0x0a63, 0)},
571	/* SmartPhone USB Sync */
572	{USB_VPI(USB_VENDOR_HTC, 0x0a64, 0)},
573	/* SmartPhone USB Sync */
574	{USB_VPI(USB_VENDOR_HTC, 0x0a65, 0)},
575	/* SmartPhone USB Sync */
576	{USB_VPI(USB_VENDOR_HTC, 0x0a66, 0)},
577	/* SmartPhone USB Sync */
578	{USB_VPI(USB_VENDOR_HTC, 0x0a67, 0)},
579	/* SmartPhone USB Sync */
580	{USB_VPI(USB_VENDOR_HTC, 0x0a68, 0)},
581	/* SmartPhone USB Sync */
582	{USB_VPI(USB_VENDOR_HTC, 0x0a69, 0)},
583	/* SmartPhone USB Sync */
584	{USB_VPI(USB_VENDOR_HTC, 0x0a6a, 0)},
585	/* SmartPhone USB Sync */
586	{USB_VPI(USB_VENDOR_HTC, 0x0a6b, 0)},
587	/* SmartPhone USB Sync */
588	{USB_VPI(USB_VENDOR_HTC, 0x0a6c, 0)},
589	/* SmartPhone USB Sync */
590	{USB_VPI(USB_VENDOR_HTC, 0x0a6d, 0)},
591	/* SmartPhone USB Sync */
592	{USB_VPI(USB_VENDOR_HTC, 0x0a6e, 0)},
593	/* SmartPhone USB Sync */
594	{USB_VPI(USB_VENDOR_HTC, 0x0a6f, 0)},
595	/* SmartPhone USB Sync */
596	{USB_VPI(USB_VENDOR_HTC, 0x0a70, 0)},
597	/* SmartPhone USB Sync */
598	{USB_VPI(USB_VENDOR_HTC, 0x0a71, 0)},
599	/* SmartPhone USB Sync */
600	{USB_VPI(USB_VENDOR_HTC, 0x0a72, 0)},
601	/* SmartPhone USB Sync */
602	{USB_VPI(USB_VENDOR_HTC, 0x0a73, 0)},
603	/* SmartPhone USB Sync */
604	{USB_VPI(USB_VENDOR_HTC, 0x0a74, 0)},
605	/* SmartPhone USB Sync */
606	{USB_VPI(USB_VENDOR_HTC, 0x0a75, 0)},
607	/* SmartPhone USB Sync */
608	{USB_VPI(USB_VENDOR_HTC, 0x0a76, 0)},
609	/* SmartPhone USB Sync */
610	{USB_VPI(USB_VENDOR_HTC, 0x0a77, 0)},
611	/* SmartPhone USB Sync */
612	{USB_VPI(USB_VENDOR_HTC, 0x0a78, 0)},
613	/* SmartPhone USB Sync */
614	{USB_VPI(USB_VENDOR_HTC, 0x0a79, 0)},
615	/* SmartPhone USB Sync */
616	{USB_VPI(USB_VENDOR_HTC, 0x0a7a, 0)},
617	/* SmartPhone USB Sync */
618	{USB_VPI(USB_VENDOR_HTC, 0x0a7b, 0)},
619	/* SmartPhone USB Sync */
620	{USB_VPI(USB_VENDOR_HTC, 0x0a7c, 0)},
621	/* SmartPhone USB Sync */
622	{USB_VPI(USB_VENDOR_HTC, 0x0a7d, 0)},
623	/* SmartPhone USB Sync */
624	{USB_VPI(USB_VENDOR_HTC, 0x0a7e, 0)},
625	/* SmartPhone USB Sync */
626	{USB_VPI(USB_VENDOR_HTC, 0x0a7f, 0)},
627	/* SmartPhone USB Sync */
628	{USB_VPI(USB_VENDOR_HTC, 0x0a80, 0)},
629	/* SmartPhone USB Sync */
630	{USB_VPI(USB_VENDOR_HTC, 0x0a81, 0)},
631	/* SmartPhone USB Sync */
632	{USB_VPI(USB_VENDOR_HTC, 0x0a82, 0)},
633	/* SmartPhone USB Sync */
634	{USB_VPI(USB_VENDOR_HTC, 0x0a83, 0)},
635	/* SmartPhone USB Sync */
636	{USB_VPI(USB_VENDOR_HTC, 0x0a84, 0)},
637	/* SmartPhone USB Sync */
638	{USB_VPI(USB_VENDOR_HTC, 0x0a85, 0)},
639	/* SmartPhone USB Sync */
640	{USB_VPI(USB_VENDOR_HTC, 0x0a86, 0)},
641	/* SmartPhone USB Sync */
642	{USB_VPI(USB_VENDOR_HTC, 0x0a87, 0)},
643	/* SmartPhone USB Sync */
644	{USB_VPI(USB_VENDOR_HTC, 0x0a88, 0)},
645	/* SmartPhone USB Sync */
646	{USB_VPI(USB_VENDOR_HTC, 0x0a89, 0)},
647	/* SmartPhone USB Sync */
648	{USB_VPI(USB_VENDOR_HTC, 0x0a8a, 0)},
649	/* SmartPhone USB Sync */
650	{USB_VPI(USB_VENDOR_HTC, 0x0a8b, 0)},
651	/* SmartPhone USB Sync */
652	{USB_VPI(USB_VENDOR_HTC, 0x0a8c, 0)},
653	/* SmartPhone USB Sync */
654	{USB_VPI(USB_VENDOR_HTC, 0x0a8d, 0)},
655	/* SmartPhone USB Sync */
656	{USB_VPI(USB_VENDOR_HTC, 0x0a8e, 0)},
657	/* SmartPhone USB Sync */
658	{USB_VPI(USB_VENDOR_HTC, 0x0a8f, 0)},
659	/* SmartPhone USB Sync */
660	{USB_VPI(USB_VENDOR_HTC, 0x0a90, 0)},
661	/* SmartPhone USB Sync */
662	{USB_VPI(USB_VENDOR_HTC, 0x0a91, 0)},
663	/* SmartPhone USB Sync */
664	{USB_VPI(USB_VENDOR_HTC, 0x0a92, 0)},
665	/* SmartPhone USB Sync */
666	{USB_VPI(USB_VENDOR_HTC, 0x0a93, 0)},
667	/* SmartPhone USB Sync */
668	{USB_VPI(USB_VENDOR_HTC, 0x0a94, 0)},
669	/* SmartPhone USB Sync */
670	{USB_VPI(USB_VENDOR_HTC, 0x0a95, 0)},
671	/* SmartPhone USB Sync */
672	{USB_VPI(USB_VENDOR_HTC, 0x0a96, 0)},
673	/* SmartPhone USB Sync */
674	{USB_VPI(USB_VENDOR_HTC, 0x0a97, 0)},
675	/* SmartPhone USB Sync */
676	{USB_VPI(USB_VENDOR_HTC, 0x0a98, 0)},
677	/* SmartPhone USB Sync */
678	{USB_VPI(USB_VENDOR_HTC, 0x0a99, 0)},
679	/* SmartPhone USB Sync */
680	{USB_VPI(USB_VENDOR_HTC, 0x0a9a, 0)},
681	/* SmartPhone USB Sync */
682	{USB_VPI(USB_VENDOR_HTC, 0x0a9b, 0)},
683	/* SmartPhone USB Sync */
684	{USB_VPI(USB_VENDOR_HTC, 0x0a9c, 0)},
685	/* SmartPhone USB Sync */
686	{USB_VPI(USB_VENDOR_HTC, 0x0a9d, 0)},
687	/* SmartPhone USB Sync */
688	{USB_VPI(USB_VENDOR_HTC, 0x0a9e, 0)},
689	/* SmartPhone USB Sync */
690	{USB_VPI(USB_VENDOR_HTC, 0x0a9f, 0)},
691	/* "High Tech Computer Corp" */
692	{USB_VPI(USB_VENDOR_HTC, 0x0bce, 0)},
693	/**/
694	{USB_VPI(USB_VENDOR_HTC, USB_PRODUCT_HTC_PPC6700MODEM, 0)},
695	/**/
696	{USB_VPI(USB_VENDOR_HTC, USB_PRODUCT_HTC_SMARTPHONE, 0)},
697	/**/
698	{USB_VPI(USB_VENDOR_HTC, USB_PRODUCT_HTC_WINMOBILE, 0)},
699	/* JVC USB Sync */
700	{USB_VPI(USB_VENDOR_JVC, 0x3011, 0)},
701	/* JVC USB Sync */
702	{USB_VPI(USB_VENDOR_JVC, 0x3012, 0)},
703	/* LGE USB Sync */
704	{USB_VPI(USB_VENDOR_LG, 0x9c01, 0)},
705	/* Microsoft USB Sync */
706	{USB_VPI(USB_VENDOR_MICROSOFT, 0x00ce, 0)},
707	/* Windows Pocket PC 2002 */
708	{USB_VPI(USB_VENDOR_MICROSOFT, 0x0400, 0)},
709	/* Windows Pocket PC 2002 */
710	{USB_VPI(USB_VENDOR_MICROSOFT, 0x0401, 0)},
711	/* Windows Pocket PC 2002 */
712	{USB_VPI(USB_VENDOR_MICROSOFT, 0x0402, 0)},
713	/* Windows Pocket PC 2002 */
714	{USB_VPI(USB_VENDOR_MICROSOFT, 0x0403, 0)},
715	/* Windows Pocket PC 2002 */
716	{USB_VPI(USB_VENDOR_MICROSOFT, 0x0404, 0)},
717	/* Windows Pocket PC 2002 */
718	{USB_VPI(USB_VENDOR_MICROSOFT, 0x0405, 0)},
719	/* Windows Pocket PC 2002 */
720	{USB_VPI(USB_VENDOR_MICROSOFT, 0x0406, 0)},
721	/* Windows Pocket PC 2002 */
722	{USB_VPI(USB_VENDOR_MICROSOFT, 0x0407, 0)},
723	/* Windows Pocket PC 2002 */
724	{USB_VPI(USB_VENDOR_MICROSOFT, 0x0408, 0)},
725	/* Windows Pocket PC 2002 */
726	{USB_VPI(USB_VENDOR_MICROSOFT, 0x0409, 0)},
727	/* Windows Pocket PC 2002 */
728	{USB_VPI(USB_VENDOR_MICROSOFT, 0x040a, 0)},
729	/* Windows Pocket PC 2002 */
730	{USB_VPI(USB_VENDOR_MICROSOFT, 0x040b, 0)},
731	/* Windows Pocket PC 2002 */
732	{USB_VPI(USB_VENDOR_MICROSOFT, 0x040c, 0)},
733	/* Windows Pocket PC 2002 */
734	{USB_VPI(USB_VENDOR_MICROSOFT, 0x040d, 0)},
735	/* Windows Pocket PC 2002 */
736	{USB_VPI(USB_VENDOR_MICROSOFT, 0x040e, 0)},
737	/* Windows Pocket PC 2002 */
738	{USB_VPI(USB_VENDOR_MICROSOFT, 0x040f, 0)},
739	/* Windows Pocket PC 2002 */
740	{USB_VPI(USB_VENDOR_MICROSOFT, 0x0410, 0)},
741	/* Windows Pocket PC 2002 */
742	{USB_VPI(USB_VENDOR_MICROSOFT, 0x0411, 0)},
743	/* Windows Pocket PC 2002 */
744	{USB_VPI(USB_VENDOR_MICROSOFT, 0x0412, 0)},
745	/* Windows Pocket PC 2002 */
746	{USB_VPI(USB_VENDOR_MICROSOFT, 0x0413, 0)},
747	/* Windows Pocket PC 2002 */
748	{USB_VPI(USB_VENDOR_MICROSOFT, 0x0414, 0)},
749	/* Windows Pocket PC 2002 */
750	{USB_VPI(USB_VENDOR_MICROSOFT, 0x0415, 0)},
751	/* Windows Pocket PC 2002 */
752	{USB_VPI(USB_VENDOR_MICROSOFT, 0x0416, 0)},
753	/* Windows Pocket PC 2002 */
754	{USB_VPI(USB_VENDOR_MICROSOFT, 0x0417, 0)},
755	/* Windows Pocket PC 2003 */
756	{USB_VPI(USB_VENDOR_MICROSOFT, 0x0432, 0)},
757	/* Windows Pocket PC 2003 */
758	{USB_VPI(USB_VENDOR_MICROSOFT, 0x0433, 0)},
759	/* Windows Pocket PC 2003 */
760	{USB_VPI(USB_VENDOR_MICROSOFT, 0x0434, 0)},
761	/* Windows Pocket PC 2003 */
762	{USB_VPI(USB_VENDOR_MICROSOFT, 0x0435, 0)},
763	/* Windows Pocket PC 2003 */
764	{USB_VPI(USB_VENDOR_MICROSOFT, 0x0436, 0)},
765	/* Windows Pocket PC 2003 */
766	{USB_VPI(USB_VENDOR_MICROSOFT, 0x0437, 0)},
767	/* Windows Pocket PC 2003 */
768	{USB_VPI(USB_VENDOR_MICROSOFT, 0x0438, 0)},
769	/* Windows Pocket PC 2003 */
770	{USB_VPI(USB_VENDOR_MICROSOFT, 0x0439, 0)},
771	/* Windows Pocket PC 2003 */
772	{USB_VPI(USB_VENDOR_MICROSOFT, 0x043a, 0)},
773	/* Windows Pocket PC 2003 */
774	{USB_VPI(USB_VENDOR_MICROSOFT, 0x043b, 0)},
775	/* Windows Pocket PC 2003 */
776	{USB_VPI(USB_VENDOR_MICROSOFT, 0x043c, 0)},
777	/* Windows Pocket PC 2003 */
778	{USB_VPI(USB_VENDOR_MICROSOFT, 0x043d, 0)},
779	/* Windows Pocket PC 2003 */
780	{USB_VPI(USB_VENDOR_MICROSOFT, 0x043e, 0)},
781	/* Windows Pocket PC 2003 */
782	{USB_VPI(USB_VENDOR_MICROSOFT, 0x043f, 0)},
783	/* Windows Pocket PC 2003 */
784	{USB_VPI(USB_VENDOR_MICROSOFT, 0x0440, 0)},
785	/* Windows Pocket PC 2003 */
786	{USB_VPI(USB_VENDOR_MICROSOFT, 0x0441, 0)},
787	/* Windows Pocket PC 2003 */
788	{USB_VPI(USB_VENDOR_MICROSOFT, 0x0442, 0)},
789	/* Windows Pocket PC 2003 */
790	{USB_VPI(USB_VENDOR_MICROSOFT, 0x0443, 0)},
791	/* Windows Pocket PC 2003 */
792	{USB_VPI(USB_VENDOR_MICROSOFT, 0x0444, 0)},
793	/* Windows Pocket PC 2003 */
794	{USB_VPI(USB_VENDOR_MICROSOFT, 0x0445, 0)},
795	/* Windows Pocket PC 2003 */
796	{USB_VPI(USB_VENDOR_MICROSOFT, 0x0446, 0)},
797	/* Windows Pocket PC 2003 */
798	{USB_VPI(USB_VENDOR_MICROSOFT, 0x0447, 0)},
799	/* Windows Pocket PC 2003 */
800	{USB_VPI(USB_VENDOR_MICROSOFT, 0x0448, 0)},
801	/* Windows Pocket PC 2003 */
802	{USB_VPI(USB_VENDOR_MICROSOFT, 0x0449, 0)},
803	/* Windows Pocket PC 2003 */
804	{USB_VPI(USB_VENDOR_MICROSOFT, 0x044a, 0)},
805	/* Windows Pocket PC 2003 */
806	{USB_VPI(USB_VENDOR_MICROSOFT, 0x044b, 0)},
807	/* Windows Pocket PC 2003 */
808	{USB_VPI(USB_VENDOR_MICROSOFT, 0x044c, 0)},
809	/* Windows Pocket PC 2003 */
810	{USB_VPI(USB_VENDOR_MICROSOFT, 0x044d, 0)},
811	/* Windows Pocket PC 2003 */
812	{USB_VPI(USB_VENDOR_MICROSOFT, 0x044e, 0)},
813	/* Windows Pocket PC 2003 */
814	{USB_VPI(USB_VENDOR_MICROSOFT, 0x044f, 0)},
815	/* Windows Pocket PC 2003 */
816	{USB_VPI(USB_VENDOR_MICROSOFT, 0x0450, 0)},
817	/* Windows Pocket PC 2003 */
818	{USB_VPI(USB_VENDOR_MICROSOFT, 0x0451, 0)},
819	/* Windows Pocket PC 2003 */
820	{USB_VPI(USB_VENDOR_MICROSOFT, 0x0452, 0)},
821	/* Windows Pocket PC 2003 */
822	{USB_VPI(USB_VENDOR_MICROSOFT, 0x0453, 0)},
823	/* Windows Pocket PC 2003 */
824	{USB_VPI(USB_VENDOR_MICROSOFT, 0x0454, 0)},
825	/* Windows Pocket PC 2003 */
826	{USB_VPI(USB_VENDOR_MICROSOFT, 0x0455, 0)},
827	/* Windows Pocket PC 2003 */
828	{USB_VPI(USB_VENDOR_MICROSOFT, 0x0456, 0)},
829	/* Windows Pocket PC 2003 */
830	{USB_VPI(USB_VENDOR_MICROSOFT, 0x0457, 0)},
831	/* Windows Pocket PC 2003 */
832	{USB_VPI(USB_VENDOR_MICROSOFT, 0x0458, 0)},
833	/* Windows Pocket PC 2003 */
834	{USB_VPI(USB_VENDOR_MICROSOFT, 0x0459, 0)},
835	/* Windows Pocket PC 2003 */
836	{USB_VPI(USB_VENDOR_MICROSOFT, 0x045a, 0)},
837	/* Windows Pocket PC 2003 */
838	{USB_VPI(USB_VENDOR_MICROSOFT, 0x045b, 0)},
839	/* Windows Pocket PC 2003 */
840	{USB_VPI(USB_VENDOR_MICROSOFT, 0x045c, 0)},
841	/* Windows Pocket PC 2003 */
842	{USB_VPI(USB_VENDOR_MICROSOFT, 0x045d, 0)},
843	/* Windows Pocket PC 2003 */
844	{USB_VPI(USB_VENDOR_MICROSOFT, 0x045e, 0)},
845	/* Windows Pocket PC 2003 */
846	{USB_VPI(USB_VENDOR_MICROSOFT, 0x045f, 0)},
847	/* Windows Pocket PC 2003 */
848	{USB_VPI(USB_VENDOR_MICROSOFT, 0x0460, 0)},
849	/* Windows Pocket PC 2003 */
850	{USB_VPI(USB_VENDOR_MICROSOFT, 0x0461, 0)},
851	/* Windows Pocket PC 2003 */
852	{USB_VPI(USB_VENDOR_MICROSOFT, 0x0462, 0)},
853	/* Windows Pocket PC 2003 */
854	{USB_VPI(USB_VENDOR_MICROSOFT, 0x0463, 0)},
855	/* Windows Pocket PC 2003 */
856	{USB_VPI(USB_VENDOR_MICROSOFT, 0x0464, 0)},
857	/* Windows Pocket PC 2003 */
858	{USB_VPI(USB_VENDOR_MICROSOFT, 0x0465, 0)},
859	/* Windows Pocket PC 2003 */
860	{USB_VPI(USB_VENDOR_MICROSOFT, 0x0466, 0)},
861	/* Windows Pocket PC 2003 */
862	{USB_VPI(USB_VENDOR_MICROSOFT, 0x0467, 0)},
863	/* Windows Pocket PC 2003 */
864	{USB_VPI(USB_VENDOR_MICROSOFT, 0x0468, 0)},
865	/* Windows Pocket PC 2003 */
866	{USB_VPI(USB_VENDOR_MICROSOFT, 0x0469, 0)},
867	/* Windows Pocket PC 2003 */
868	{USB_VPI(USB_VENDOR_MICROSOFT, 0x046a, 0)},
869	/* Windows Pocket PC 2003 */
870	{USB_VPI(USB_VENDOR_MICROSOFT, 0x046b, 0)},
871	/* Windows Pocket PC 2003 */
872	{USB_VPI(USB_VENDOR_MICROSOFT, 0x046c, 0)},
873	/* Windows Pocket PC 2003 */
874	{USB_VPI(USB_VENDOR_MICROSOFT, 0x046d, 0)},
875	/* Windows Pocket PC 2003 */
876	{USB_VPI(USB_VENDOR_MICROSOFT, 0x046e, 0)},
877	/* Windows Pocket PC 2003 */
878	{USB_VPI(USB_VENDOR_MICROSOFT, 0x046f, 0)},
879	/* Windows Pocket PC 2003 */
880	{USB_VPI(USB_VENDOR_MICROSOFT, 0x0470, 0)},
881	/* Windows Pocket PC 2003 */
882	{USB_VPI(USB_VENDOR_MICROSOFT, 0x0471, 0)},
883	/* Windows Pocket PC 2003 */
884	{USB_VPI(USB_VENDOR_MICROSOFT, 0x0472, 0)},
885	/* Windows Pocket PC 2003 */
886	{USB_VPI(USB_VENDOR_MICROSOFT, 0x0473, 0)},
887	/* Windows Pocket PC 2003 */
888	{USB_VPI(USB_VENDOR_MICROSOFT, 0x0474, 0)},
889	/* Windows Pocket PC 2003 */
890	{USB_VPI(USB_VENDOR_MICROSOFT, 0x0475, 0)},
891	/* Windows Pocket PC 2003 */
892	{USB_VPI(USB_VENDOR_MICROSOFT, 0x0476, 0)},
893	/* Windows Pocket PC 2003 */
894	{USB_VPI(USB_VENDOR_MICROSOFT, 0x0477, 0)},
895	/* Windows Pocket PC 2003 */
896	{USB_VPI(USB_VENDOR_MICROSOFT, 0x0478, 0)},
897	/* Windows Pocket PC 2003 */
898	{USB_VPI(USB_VENDOR_MICROSOFT, 0x0479, 0)},
899	/* Windows Pocket PC 2003 */
900	{USB_VPI(USB_VENDOR_MICROSOFT, 0x047a, 0)},
901	/* Windows Pocket PC 2003 */
902	{USB_VPI(USB_VENDOR_MICROSOFT, 0x047b, 0)},
903	/* Windows Smartphone 2002 */
904	{USB_VPI(USB_VENDOR_MICROSOFT, 0x04c8, 0)},
905	/* Windows Smartphone 2002 */
906	{USB_VPI(USB_VENDOR_MICROSOFT, 0x04c9, 0)},
907	/* Windows Smartphone 2002 */
908	{USB_VPI(USB_VENDOR_MICROSOFT, 0x04ca, 0)},
909	/* Windows Smartphone 2002 */
910	{USB_VPI(USB_VENDOR_MICROSOFT, 0x04cb, 0)},
911	/* Windows Smartphone 2002 */
912	{USB_VPI(USB_VENDOR_MICROSOFT, 0x04cc, 0)},
913	/* Windows Smartphone 2002 */
914	{USB_VPI(USB_VENDOR_MICROSOFT, 0x04cd, 0)},
915	/* Windows Smartphone 2002 */
916	{USB_VPI(USB_VENDOR_MICROSOFT, 0x04ce, 0)},
917	/* Windows Smartphone 2003 */
918	{USB_VPI(USB_VENDOR_MICROSOFT, 0x04d7, 0)},
919	/* Windows Smartphone 2003 */
920	{USB_VPI(USB_VENDOR_MICROSOFT, 0x04d8, 0)},
921	/* Windows Smartphone 2003 */
922	{USB_VPI(USB_VENDOR_MICROSOFT, 0x04d9, 0)},
923	/* Windows Smartphone 2003 */
924	{USB_VPI(USB_VENDOR_MICROSOFT, 0x04da, 0)},
925	/* Windows Smartphone 2003 */
926	{USB_VPI(USB_VENDOR_MICROSOFT, 0x04db, 0)},
927	/* Windows Smartphone 2003 */
928	{USB_VPI(USB_VENDOR_MICROSOFT, 0x04dc, 0)},
929	/* Windows Smartphone 2003 */
930	{USB_VPI(USB_VENDOR_MICROSOFT, 0x04dd, 0)},
931	/* Windows Smartphone 2003 */
932	{USB_VPI(USB_VENDOR_MICROSOFT, 0x04de, 0)},
933	/* Windows Smartphone 2003 */
934	{USB_VPI(USB_VENDOR_MICROSOFT, 0x04df, 0)},
935	/* Windows Smartphone 2003 */
936	{USB_VPI(USB_VENDOR_MICROSOFT, 0x04e0, 0)},
937	/* Windows Smartphone 2003 */
938	{USB_VPI(USB_VENDOR_MICROSOFT, 0x04e1, 0)},
939	/* Windows Smartphone 2003 */
940	{USB_VPI(USB_VENDOR_MICROSOFT, 0x04e2, 0)},
941	/* Windows Smartphone 2003 */
942	{USB_VPI(USB_VENDOR_MICROSOFT, 0x04e3, 0)},
943	/* Windows Smartphone 2003 */
944	{USB_VPI(USB_VENDOR_MICROSOFT, 0x04e4, 0)},
945	/* Windows Smartphone 2003 */
946	{USB_VPI(USB_VENDOR_MICROSOFT, 0x04e5, 0)},
947	/* Windows Smartphone 2003 */
948	{USB_VPI(USB_VENDOR_MICROSOFT, 0x04e6, 0)},
949	/* Windows Smartphone 2003 */
950	{USB_VPI(USB_VENDOR_MICROSOFT, 0x04e7, 0)},
951	/* Windows Smartphone 2003 */
952	{USB_VPI(USB_VENDOR_MICROSOFT, 0x04e8, 0)},
953	/* Windows Smartphone 2003 */
954	{USB_VPI(USB_VENDOR_MICROSOFT, 0x04e9, 0)},
955	/* Windows Smartphone 2003 */
956	{USB_VPI(USB_VENDOR_MICROSOFT, 0x04ea, 0)},
957	/* Motorola MPx200 Smartphone */
958	{USB_VPI(USB_VENDOR_MOTOROLA2, 0x4204, 0)},
959	/* Motorola MPc GSM */
960	{USB_VPI(USB_VENDOR_MOTOROLA2, 0x4214, 0)},
961	/* Motorola MPx220 Smartphone */
962	{USB_VPI(USB_VENDOR_MOTOROLA2, 0x4224, 0)},
963	/* Motorola MPc CDMA */
964	{USB_VPI(USB_VENDOR_MOTOROLA2, 0x4234, 0)},
965	/* Motorola MPx100 Smartphone */
966	{USB_VPI(USB_VENDOR_MOTOROLA2, 0x4244, 0)},
967	/* NEC USB Sync */
968	{USB_VPI(USB_VENDOR_NEC, 0x00d5, 0)},
969	/* NEC USB Sync */
970	{USB_VPI(USB_VENDOR_NEC, 0x00d6, 0)},
971	/* NEC USB Sync */
972	{USB_VPI(USB_VENDOR_NEC, 0x00d7, 0)},
973	/* NEC USB Sync */
974	{USB_VPI(USB_VENDOR_NEC, 0x8024, 0)},
975	/* NEC USB Sync */
976	{USB_VPI(USB_VENDOR_NEC, 0x8025, 0)},
977	/* Panasonic USB Sync */
978	{USB_VPI(USB_VENDOR_PANASONIC, 0x2500, 0)},
979	/* Samsung NEXiO USB Sync */
980	{USB_VPI(USB_VENDOR_SAMSUNG, 0x5f00, 0)},
981	/* Samsung NEXiO USB Sync */
982	{USB_VPI(USB_VENDOR_SAMSUNG, 0x5f01, 0)},
983	/* Samsung NEXiO USB Sync */
984	{USB_VPI(USB_VENDOR_SAMSUNG, 0x5f02, 0)},
985	/* Samsung NEXiO USB Sync */
986	{USB_VPI(USB_VENDOR_SAMSUNG, 0x5f03, 0)},
987	/* Samsung NEXiO USB Sync */
988	{USB_VPI(USB_VENDOR_SAMSUNG, 0x5f04, 0)},
989	/* Samsung MITs USB Sync */
990	{USB_VPI(USB_VENDOR_SAMSUNG, 0x6611, 0)},
991	/* Samsung MITs USB Sync */
992	{USB_VPI(USB_VENDOR_SAMSUNG, 0x6613, 0)},
993	/* Samsung MITs USB Sync */
994	{USB_VPI(USB_VENDOR_SAMSUNG, 0x6615, 0)},
995	/* Samsung MITs USB Sync */
996	{USB_VPI(USB_VENDOR_SAMSUNG, 0x6617, 0)},
997	/* Samsung MITs USB Sync */
998	{USB_VPI(USB_VENDOR_SAMSUNG, 0x6619, 0)},
999	/* Samsung MITs USB Sync */
1000	{USB_VPI(USB_VENDOR_SAMSUNG, 0x661b, 0)},
1001	/* Samsung MITs USB Sync */
1002	{USB_VPI(USB_VENDOR_SAMSUNG, 0x662e, 0)},
1003	/* Samsung MITs USB Sync */
1004	{USB_VPI(USB_VENDOR_SAMSUNG, 0x6630, 0)},
1005	/* Samsung MITs USB Sync */
1006	{USB_VPI(USB_VENDOR_SAMSUNG, 0x6632, 0)},
1007	/* SHARP WS003SH USB Modem */
1008	{USB_VPI(USB_VENDOR_SHARP, 0x9102, 0)},
1009	/* SHARP WS004SH USB Modem */
1010	{USB_VPI(USB_VENDOR_SHARP, 0x9121, 0)},
1011	/* SHARP S01SH USB Modem */
1012	{USB_VPI(USB_VENDOR_SHARP, 0x9151, 0)},
1013	/**/
1014	{USB_VPI(USB_VENDOR_SHARP, USB_PRODUCT_SHARP_WZERO3ES, 0)},
1015	/**/
1016	{USB_VPI(USB_VENDOR_SHARP, USB_PRODUCT_SHARP_WILLCOM03, 0)},
1017	/* Symbol USB Sync */
1018	{USB_VPI(USB_VENDOR_SYMBOL, 0x2000, 0)},
1019	/* Symbol USB Sync 0x2001 */
1020	{USB_VPI(USB_VENDOR_SYMBOL, 0x2001, 0)},
1021	/* Symbol USB Sync 0x2002 */
1022	{USB_VPI(USB_VENDOR_SYMBOL, 0x2002, 0)},
1023	/* Symbol USB Sync 0x2003 */
1024	{USB_VPI(USB_VENDOR_SYMBOL, 0x2003, 0)},
1025	/* Symbol USB Sync 0x2004 */
1026	{USB_VPI(USB_VENDOR_SYMBOL, 0x2004, 0)},
1027	/* Symbol USB Sync 0x2005 */
1028	{USB_VPI(USB_VENDOR_SYMBOL, 0x2005, 0)},
1029	/* Symbol USB Sync 0x2006 */
1030	{USB_VPI(USB_VENDOR_SYMBOL, 0x2006, 0)},
1031	/* Symbol USB Sync 0x2007 */
1032	{USB_VPI(USB_VENDOR_SYMBOL, 0x2007, 0)},
1033	/* Symbol USB Sync 0x2008 */
1034	{USB_VPI(USB_VENDOR_SYMBOL, 0x2008, 0)},
1035	/* Symbol USB Sync 0x2009 */
1036	{USB_VPI(USB_VENDOR_SYMBOL, 0x2009, 0)},
1037	/* Symbol USB Sync 0x200a */
1038	{USB_VPI(USB_VENDOR_SYMBOL, 0x200a, 0)},
1039	/* TOSHIBA USB Sync 0700 */
1040	{USB_VPI(USB_VENDOR_TOSHIBA, 0x0700, 0)},
1041	/* TOSHIBA Pocket PC e310 */
1042	{USB_VPI(USB_VENDOR_TOSHIBA, 0x0705, 0)},
1043	/* TOSHIBA Pocket PC e330 Series */
1044	{USB_VPI(USB_VENDOR_TOSHIBA, 0x0707, 0)},
1045	/* TOSHIBA Pocket PC e350Series */
1046	{USB_VPI(USB_VENDOR_TOSHIBA, 0x0708, 0)},
1047	/* TOSHIBA Pocket PC e750 Series */
1048	{USB_VPI(USB_VENDOR_TOSHIBA, 0x0709, 0)},
1049	/* TOSHIBA Pocket PC e400 Series */
1050	{USB_VPI(USB_VENDOR_TOSHIBA, 0x070a, 0)},
1051	/* TOSHIBA Pocket PC e800 Series */
1052	{USB_VPI(USB_VENDOR_TOSHIBA, 0x070b, 0)},
1053	/* TOSHIBA Pocket PC e740 */
1054	{USB_VPI(USB_VENDOR_TOSHIBA, USB_PRODUCT_TOSHIBA_POCKETPC_E740, 0)},
1055	/* ViewSonic Color Pocket PC V35 */
1056	{USB_VPI(USB_VENDOR_VIEWSONIC, 0x0ed9, 0)},
1057	/* ViewSonic Color Pocket PC V36 */
1058	{USB_VPI(USB_VENDOR_VIEWSONIC, 0x1527, 0)},
1059	/* ViewSonic Color Pocket PC V37 */
1060	{USB_VPI(USB_VENDOR_VIEWSONIC, 0x1529, 0)},
1061	/* ViewSonic Color Pocket PC V38 */
1062	{USB_VPI(USB_VENDOR_VIEWSONIC, 0x152b, 0)},
1063	/* ViewSonic Pocket PC */
1064	{USB_VPI(USB_VENDOR_VIEWSONIC, 0x152e, 0)},
1065	/* ViewSonic Communicator Pocket PC */
1066	{USB_VPI(USB_VENDOR_VIEWSONIC, 0x1921, 0)},
1067	/* ViewSonic Smartphone */
1068	{USB_VPI(USB_VENDOR_VIEWSONIC, 0x1922, 0)},
1069	/* ViewSonic Pocket PC V30 */
1070	{USB_VPI(USB_VENDOR_VIEWSONIC, 0x1923, 0)},
1071};
1072
1073static device_method_t uipaq_methods[] = {
1074	DEVMETHOD(device_probe, uipaq_probe),
1075	DEVMETHOD(device_attach, uipaq_attach),
1076	DEVMETHOD(device_detach, uipaq_detach),
1077	{0, 0}
1078};
1079
1080static devclass_t uipaq_devclass;
1081
1082static driver_t uipaq_driver = {
1083	.name = "uipaq",
1084	.methods = uipaq_methods,
1085	.size = sizeof(struct uipaq_softc),
1086};
1087
1088DRIVER_MODULE(uipaq, uhub, uipaq_driver, uipaq_devclass, NULL, 0);
1089MODULE_DEPEND(uipaq, ucom, 1, 1, 1);
1090MODULE_DEPEND(uipaq, usb, 1, 1, 1);
1091
1092static int
1093uipaq_probe(device_t dev)
1094{
1095	struct usb_attach_arg *uaa = device_get_ivars(dev);
1096
1097	if (uaa->usb_mode != USB_MODE_HOST) {
1098		return (ENXIO);
1099	}
1100	if (uaa->info.bConfigIndex != UIPAQ_CONFIG_INDEX) {
1101		return (ENXIO);
1102	}
1103	if (uaa->info.bIfaceIndex != UIPAQ_IFACE_INDEX) {
1104		return (ENXIO);
1105	}
1106	return (usbd_lookup_id_by_uaa(uipaq_devs, sizeof(uipaq_devs), uaa));
1107}
1108
1109static int
1110uipaq_attach(device_t dev)
1111{
1112	struct usb_device_request req;
1113	struct usb_attach_arg *uaa = device_get_ivars(dev);
1114	struct uipaq_softc *sc = device_get_softc(dev);
1115	int error;
1116	uint8_t iface_index;
1117	uint8_t i;
1118
1119	sc->sc_udev = uaa->device;
1120
1121	device_set_usb_desc(dev);
1122	mtx_init(&sc->sc_mtx, "uipaq", NULL, MTX_DEF);
1123
1124	/*
1125	 * Send magic bytes, cribbed from Linux ipaq driver that
1126	 * claims to have sniffed them from Win98. Wait for driver to
1127	 * become ready on device side?
1128	 */
1129	req.bmRequestType = UT_WRITE_CLASS_INTERFACE;
1130	req.bRequest = UCDC_SET_CONTROL_LINE_STATE;
1131	USETW(req.wValue, UCDC_LINE_DTR);
1132	USETW(req.wIndex, 0x0);
1133	USETW(req.wLength, 0);
1134	for (i = 0; i != 64; i++) {
1135		error =
1136		    usbd_do_request_flags(uaa->device, NULL, &req,
1137		    NULL, 0, NULL, 100);
1138		if (error == 0)
1139			break;
1140		usb_pause_mtx(NULL, hz / 10);
1141	}
1142
1143	iface_index = UIPAQ_IFACE_INDEX;
1144	error = usbd_transfer_setup(uaa->device, &iface_index,
1145	    sc->sc_xfer, uipaq_config_data,
1146	    UIPAQ_N_TRANSFER, sc, &sc->sc_mtx);
1147
1148	if (error) {
1149		goto detach;
1150	}
1151	/* clear stall at first run */
1152	mtx_lock(&sc->sc_mtx);
1153	usbd_xfer_set_stall(sc->sc_xfer[UIPAQ_BULK_DT_WR]);
1154	usbd_xfer_set_stall(sc->sc_xfer[UIPAQ_BULK_DT_RD]);
1155	mtx_unlock(&sc->sc_mtx);
1156
1157	error = ucom_attach(&sc->sc_super_ucom, &sc->sc_ucom, 1, sc,
1158	    &uipaq_callback, &sc->sc_mtx);
1159	if (error) {
1160		goto detach;
1161	}
1162	return (0);
1163
1164detach:
1165	uipaq_detach(dev);
1166	return (ENXIO);
1167}
1168
1169int
1170uipaq_detach(device_t dev)
1171{
1172	struct uipaq_softc *sc = device_get_softc(dev);
1173
1174	ucom_detach(&sc->sc_super_ucom, &sc->sc_ucom, 1);
1175	usbd_transfer_unsetup(sc->sc_xfer, UIPAQ_N_TRANSFER);
1176	mtx_destroy(&sc->sc_mtx);
1177
1178	return (0);
1179}
1180
1181static void
1182uipaq_start_read(struct ucom_softc *ucom)
1183{
1184	struct uipaq_softc *sc = ucom->sc_parent;
1185
1186	/* start read endpoint */
1187	usbd_transfer_start(sc->sc_xfer[UIPAQ_BULK_DT_RD]);
1188}
1189
1190static void
1191uipaq_stop_read(struct ucom_softc *ucom)
1192{
1193	struct uipaq_softc *sc = ucom->sc_parent;
1194
1195	/* stop read endpoint */
1196	usbd_transfer_stop(sc->sc_xfer[UIPAQ_BULK_DT_RD]);
1197}
1198
1199static void
1200uipaq_start_write(struct ucom_softc *ucom)
1201{
1202	struct uipaq_softc *sc = ucom->sc_parent;
1203
1204	usbd_transfer_start(sc->sc_xfer[UIPAQ_BULK_DT_WR]);
1205}
1206
1207static void
1208uipaq_stop_write(struct ucom_softc *ucom)
1209{
1210	struct uipaq_softc *sc = ucom->sc_parent;
1211
1212	usbd_transfer_stop(sc->sc_xfer[UIPAQ_BULK_DT_WR]);
1213}
1214
1215static void
1216uipaq_cfg_set_dtr(struct ucom_softc *ucom, uint8_t onoff)
1217{
1218	struct uipaq_softc *sc = ucom->sc_parent;
1219	struct usb_device_request req;
1220
1221	DPRINTF("onoff=%d\n", onoff);
1222
1223	if (onoff)
1224		sc->sc_line |= UCDC_LINE_DTR;
1225	else
1226		sc->sc_line &= ~UCDC_LINE_DTR;
1227
1228	req.bmRequestType = UT_WRITE_CLASS_INTERFACE;
1229	req.bRequest = UCDC_SET_CONTROL_LINE_STATE;
1230	USETW(req.wValue, sc->sc_line);
1231	req.wIndex[0] = UIPAQ_IFACE_INDEX;
1232	req.wIndex[1] = 0;
1233	USETW(req.wLength, 0);
1234
1235	ucom_cfg_do_request(sc->sc_udev, &sc->sc_ucom,
1236	    &req, NULL, 0, 1000);
1237}
1238
1239static void
1240uipaq_cfg_set_rts(struct ucom_softc *ucom, uint8_t onoff)
1241{
1242	struct uipaq_softc *sc = ucom->sc_parent;
1243	struct usb_device_request req;
1244
1245	DPRINTF("onoff=%d\n", onoff);
1246
1247	if (onoff)
1248		sc->sc_line |= UCDC_LINE_RTS;
1249	else
1250		sc->sc_line &= ~UCDC_LINE_RTS;
1251
1252	req.bmRequestType = UT_WRITE_CLASS_INTERFACE;
1253	req.bRequest = UCDC_SET_CONTROL_LINE_STATE;
1254	USETW(req.wValue, sc->sc_line);
1255	req.wIndex[0] = UIPAQ_IFACE_INDEX;
1256	req.wIndex[1] = 0;
1257	USETW(req.wLength, 0);
1258
1259	ucom_cfg_do_request(sc->sc_udev, &sc->sc_ucom,
1260	    &req, NULL, 0, 1000);
1261}
1262
1263static void
1264uipaq_cfg_set_break(struct ucom_softc *ucom, uint8_t onoff)
1265{
1266	struct uipaq_softc *sc = ucom->sc_parent;
1267	struct usb_device_request req;
1268	uint16_t temp;
1269
1270	temp = onoff ? UCDC_BREAK_ON : UCDC_BREAK_OFF;
1271
1272	req.bmRequestType = UT_WRITE_CLASS_INTERFACE;
1273	req.bRequest = UCDC_SEND_BREAK;
1274	USETW(req.wValue, temp);
1275	req.wIndex[0] = UIPAQ_IFACE_INDEX;
1276	req.wIndex[1] = 0;
1277	USETW(req.wLength, 0);
1278
1279	ucom_cfg_do_request(sc->sc_udev, &sc->sc_ucom,
1280	    &req, NULL, 0, 1000);
1281}
1282
1283static void
1284uipaq_write_callback(struct usb_xfer *xfer, usb_error_t error)
1285{
1286	struct uipaq_softc *sc = usbd_xfer_softc(xfer);
1287	struct usb_page_cache *pc;
1288	uint32_t actlen;
1289
1290	switch (USB_GET_STATE(xfer)) {
1291	case USB_ST_SETUP:
1292	case USB_ST_TRANSFERRED:
1293tr_setup:
1294		pc = usbd_xfer_get_frame(xfer, 0);
1295		if (ucom_get_data(&sc->sc_ucom, pc, 0,
1296		    UIPAQ_BUF_SIZE, &actlen)) {
1297			usbd_xfer_set_frame_len(xfer, 0, actlen);
1298			usbd_transfer_submit(xfer);
1299		}
1300		return;
1301
1302	default:			/* Error */
1303		if (error != USB_ERR_CANCELLED) {
1304			/* try to clear stall first */
1305			usbd_xfer_set_stall(xfer);
1306			goto tr_setup;
1307		}
1308		return;
1309	}
1310}
1311
1312static void
1313uipaq_read_callback(struct usb_xfer *xfer, usb_error_t error)
1314{
1315	struct uipaq_softc *sc = usbd_xfer_softc(xfer);
1316	struct usb_page_cache *pc;
1317	int actlen;
1318
1319	usbd_xfer_status(xfer, &actlen, NULL, NULL, NULL);
1320
1321	switch (USB_GET_STATE(xfer)) {
1322	case USB_ST_TRANSFERRED:
1323		pc = usbd_xfer_get_frame(xfer, 0);
1324		ucom_put_data(&sc->sc_ucom, pc, 0, actlen);
1325
1326	case USB_ST_SETUP:
1327tr_setup:
1328		usbd_xfer_set_frame_len(xfer, 0, usbd_xfer_max_len(xfer));
1329		usbd_transfer_submit(xfer);
1330		return;
1331
1332	default:			/* Error */
1333		if (error != USB_ERR_CANCELLED) {
1334			/* try to clear stall first */
1335			usbd_xfer_set_stall(xfer);
1336			goto tr_setup;
1337		}
1338		return;
1339	}
1340}
1341