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