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