~ubuntu-branches/ubuntu/precise/linux-lowlatency/precise

« back to all changes in this revision

Viewing changes to drivers/usb/serial/ipaq.c

  • Committer: Package Import Robot
  • Author(s): Alessio Igor Bogani
  • Date: 2011-10-26 11:13:05 UTC
  • Revision ID: package-import@ubuntu.com-20111026111305-tz023xykf0i6eosh
Tags: upstream-3.2.0
ImportĀ upstreamĀ versionĀ 3.2.0

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
 * USB Compaq iPAQ driver
 
3
 *
 
4
 *      Copyright (C) 2001 - 2002
 
5
 *          Ganesh Varadarajan <ganesh@veritas.com>
 
6
 *
 
7
 *      This program is free software; you can redistribute it and/or modify
 
8
 *      it under the terms of the GNU General Public License as published by
 
9
 *      the Free Software Foundation; either version 2 of the License, or
 
10
 *      (at your option) any later version.
 
11
 *
 
12
 * (12/12/2002) ganesh
 
13
 *      Added support for practically all devices supported by ActiveSync
 
14
 *      on Windows. Thanks to Wes Cilldhaire <billybobjoehenrybob@hotmail.com>.
 
15
 *
 
16
 * (26/11/2002) ganesh
 
17
 *      Added insmod options to specify product and vendor id.
 
18
 *      Use modprobe ipaq vendor=0xfoo product=0xbar
 
19
 *
 
20
 * (26/7/2002) ganesh
 
21
 *      Fixed up broken error handling in ipaq_open. Retry the "kickstart"
 
22
 *      packet much harder - this drastically reduces connection failures.
 
23
 *
 
24
 * (30/4/2002) ganesh
 
25
 *      Added support for the Casio EM500. Completely untested. Thanks
 
26
 *      to info from Nathan <wfilardo@fuse.net>
 
27
 *
 
28
 * (19/3/2002) ganesh
 
29
 *      Don't submit urbs while holding spinlocks. Not strictly necessary
 
30
 *      in 2.5.x.
 
31
 *
 
32
 * (8/3/2002) ganesh
 
33
 *      The ipaq sometimes emits a '\0' before the CLIENT string. At this
 
34
 *      point of time, the ppp ldisc is not yet attached to the tty, so
 
35
 *      n_tty echoes "^ " to the ipaq, which messes up the chat. In 2.5.6-pre2
 
36
 *      this causes a panic because echo_char() tries to sleep in interrupt
 
37
 *      context.
 
38
 *      The fix is to tell the upper layers that this is a raw device so that
 
39
 *      echoing is suppressed. Thanks to Lyle Lindholm for a detailed bug
 
40
 *      report.
 
41
 *
 
42
 * (25/2/2002) ganesh
 
43
 *      Added support for the HP Jornada 548 and 568. Completely untested.
 
44
 *      Thanks to info from Heath Robinson and Arieh Davidoff.
 
45
 */
 
46
 
 
47
#include <linux/kernel.h>
 
48
#include <linux/errno.h>
 
49
#include <linux/init.h>
 
50
#include <linux/slab.h>
 
51
#include <linux/tty.h>
 
52
#include <linux/tty_driver.h>
 
53
#include <linux/tty_flip.h>
 
54
#include <linux/module.h>
 
55
#include <linux/spinlock.h>
 
56
#include <linux/uaccess.h>
 
57
#include <linux/usb.h>
 
58
#include <linux/usb/serial.h>
 
59
 
 
60
#define KP_RETRIES      100
 
61
 
 
62
/*
 
63
 * Version Information
 
64
 */
 
65
 
 
66
#define DRIVER_VERSION "v1.0"
 
67
#define DRIVER_AUTHOR "Ganesh Varadarajan <ganesh@veritas.com>"
 
68
#define DRIVER_DESC "USB PocketPC PDA driver"
 
69
 
 
70
static __u16 product, vendor;
 
71
static int debug;
 
72
static int connect_retries = KP_RETRIES;
 
73
static int initial_wait;
 
74
 
 
75
/* Function prototypes for an ipaq */
 
76
static int  ipaq_open(struct tty_struct *tty,
 
77
                        struct usb_serial_port *port);
 
78
static int  ipaq_calc_num_ports(struct usb_serial *serial);
 
79
static int  ipaq_startup(struct usb_serial *serial);
 
80
 
 
81
static struct usb_device_id ipaq_id_table [] = {
 
82
        /* The first entry is a placeholder for the insmod-specified device */
 
83
        { USB_DEVICE(0x049F, 0x0003) },
 
84
        { USB_DEVICE(0x0104, 0x00BE) }, /* Socket USB Sync */
 
85
        { USB_DEVICE(0x03F0, 0x1016) }, /* HP USB Sync */
 
86
        { USB_DEVICE(0x03F0, 0x1116) }, /* HP USB Sync 1611 */
 
87
        { USB_DEVICE(0x03F0, 0x1216) }, /* HP USB Sync 1612 */
 
88
        { USB_DEVICE(0x03F0, 0x2016) }, /* HP USB Sync 1620 */
 
89
        { USB_DEVICE(0x03F0, 0x2116) }, /* HP USB Sync 1621 */
 
90
        { USB_DEVICE(0x03F0, 0x2216) }, /* HP USB Sync 1622 */
 
91
        { USB_DEVICE(0x03F0, 0x3016) }, /* HP USB Sync 1630 */
 
92
        { USB_DEVICE(0x03F0, 0x3116) }, /* HP USB Sync 1631 */
 
93
        { USB_DEVICE(0x03F0, 0x3216) }, /* HP USB Sync 1632 */
 
94
        { USB_DEVICE(0x03F0, 0x4016) }, /* HP USB Sync 1640 */
 
95
        { USB_DEVICE(0x03F0, 0x4116) }, /* HP USB Sync 1641 */
 
96
        { USB_DEVICE(0x03F0, 0x4216) }, /* HP USB Sync 1642 */
 
97
        { USB_DEVICE(0x03F0, 0x5016) }, /* HP USB Sync 1650 */
 
98
        { USB_DEVICE(0x03F0, 0x5116) }, /* HP USB Sync 1651 */
 
99
        { USB_DEVICE(0x03F0, 0x5216) }, /* HP USB Sync 1652 */
 
100
        { USB_DEVICE(0x0409, 0x00D5) }, /* NEC USB Sync */
 
101
        { USB_DEVICE(0x0409, 0x00D6) }, /* NEC USB Sync */
 
102
        { USB_DEVICE(0x0409, 0x00D7) }, /* NEC USB Sync */
 
103
        { USB_DEVICE(0x0409, 0x8024) }, /* NEC USB Sync */
 
104
        { USB_DEVICE(0x0409, 0x8025) }, /* NEC USB Sync */
 
105
        { USB_DEVICE(0x043E, 0x9C01) }, /* LGE USB Sync */
 
106
        { USB_DEVICE(0x045E, 0x00CE) }, /* Microsoft USB Sync */
 
107
        { USB_DEVICE(0x045E, 0x0400) }, /* Windows Powered Pocket PC 2002 */
 
108
        { USB_DEVICE(0x045E, 0x0401) }, /* Windows Powered Pocket PC 2002 */
 
109
        { USB_DEVICE(0x045E, 0x0402) }, /* Windows Powered Pocket PC 2002 */
 
110
        { USB_DEVICE(0x045E, 0x0403) }, /* Windows Powered Pocket PC 2002 */
 
111
        { USB_DEVICE(0x045E, 0x0404) }, /* Windows Powered Pocket PC 2002 */
 
112
        { USB_DEVICE(0x045E, 0x0405) }, /* Windows Powered Pocket PC 2002 */
 
113
        { USB_DEVICE(0x045E, 0x0406) }, /* Windows Powered Pocket PC 2002 */
 
114
        { USB_DEVICE(0x045E, 0x0407) }, /* Windows Powered Pocket PC 2002 */
 
115
        { USB_DEVICE(0x045E, 0x0408) }, /* Windows Powered Pocket PC 2002 */
 
116
        { USB_DEVICE(0x045E, 0x0409) }, /* Windows Powered Pocket PC 2002 */
 
117
        { USB_DEVICE(0x045E, 0x040A) }, /* Windows Powered Pocket PC 2002 */
 
118
        { USB_DEVICE(0x045E, 0x040B) }, /* Windows Powered Pocket PC 2002 */
 
119
        { USB_DEVICE(0x045E, 0x040C) }, /* Windows Powered Pocket PC 2002 */
 
120
        { USB_DEVICE(0x045E, 0x040D) }, /* Windows Powered Pocket PC 2002 */
 
121
        { USB_DEVICE(0x045E, 0x040E) }, /* Windows Powered Pocket PC 2002 */
 
122
        { USB_DEVICE(0x045E, 0x040F) }, /* Windows Powered Pocket PC 2002 */
 
123
        { USB_DEVICE(0x045E, 0x0410) }, /* Windows Powered Pocket PC 2002 */
 
124
        { USB_DEVICE(0x045E, 0x0411) }, /* Windows Powered Pocket PC 2002 */
 
125
        { USB_DEVICE(0x045E, 0x0412) }, /* Windows Powered Pocket PC 2002 */
 
126
        { USB_DEVICE(0x045E, 0x0413) }, /* Windows Powered Pocket PC 2002 */
 
127
        { USB_DEVICE(0x045E, 0x0414) }, /* Windows Powered Pocket PC 2002 */
 
128
        { USB_DEVICE(0x045E, 0x0415) }, /* Windows Powered Pocket PC 2002 */
 
129
        { USB_DEVICE(0x045E, 0x0416) }, /* Windows Powered Pocket PC 2002 */
 
130
        { USB_DEVICE(0x045E, 0x0417) }, /* Windows Powered Pocket PC 2002 */
 
131
        { USB_DEVICE(0x045E, 0x0432) }, /* Windows Powered Pocket PC 2003 */
 
132
        { USB_DEVICE(0x045E, 0x0433) }, /* Windows Powered Pocket PC 2003 */
 
133
        { USB_DEVICE(0x045E, 0x0434) }, /* Windows Powered Pocket PC 2003 */
 
134
        { USB_DEVICE(0x045E, 0x0435) }, /* Windows Powered Pocket PC 2003 */
 
135
        { USB_DEVICE(0x045E, 0x0436) }, /* Windows Powered Pocket PC 2003 */
 
136
        { USB_DEVICE(0x045E, 0x0437) }, /* Windows Powered Pocket PC 2003 */
 
137
        { USB_DEVICE(0x045E, 0x0438) }, /* Windows Powered Pocket PC 2003 */
 
138
        { USB_DEVICE(0x045E, 0x0439) }, /* Windows Powered Pocket PC 2003 */
 
139
        { USB_DEVICE(0x045E, 0x043A) }, /* Windows Powered Pocket PC 2003 */
 
140
        { USB_DEVICE(0x045E, 0x043B) }, /* Windows Powered Pocket PC 2003 */
 
141
        { USB_DEVICE(0x045E, 0x043C) }, /* Windows Powered Pocket PC 2003 */
 
142
        { USB_DEVICE(0x045E, 0x043D) }, /* Windows Powered Pocket PC 2003 */
 
143
        { USB_DEVICE(0x045E, 0x043E) }, /* Windows Powered Pocket PC 2003 */
 
144
        { USB_DEVICE(0x045E, 0x043F) }, /* Windows Powered Pocket PC 2003 */
 
145
        { USB_DEVICE(0x045E, 0x0440) }, /* Windows Powered Pocket PC 2003 */
 
146
        { USB_DEVICE(0x045E, 0x0441) }, /* Windows Powered Pocket PC 2003 */
 
147
        { USB_DEVICE(0x045E, 0x0442) }, /* Windows Powered Pocket PC 2003 */
 
148
        { USB_DEVICE(0x045E, 0x0443) }, /* Windows Powered Pocket PC 2003 */
 
149
        { USB_DEVICE(0x045E, 0x0444) }, /* Windows Powered Pocket PC 2003 */
 
150
        { USB_DEVICE(0x045E, 0x0445) }, /* Windows Powered Pocket PC 2003 */
 
151
        { USB_DEVICE(0x045E, 0x0446) }, /* Windows Powered Pocket PC 2003 */
 
152
        { USB_DEVICE(0x045E, 0x0447) }, /* Windows Powered Pocket PC 2003 */
 
153
        { USB_DEVICE(0x045E, 0x0448) }, /* Windows Powered Pocket PC 2003 */
 
154
        { USB_DEVICE(0x045E, 0x0449) }, /* Windows Powered Pocket PC 2003 */
 
155
        { USB_DEVICE(0x045E, 0x044A) }, /* Windows Powered Pocket PC 2003 */
 
156
        { USB_DEVICE(0x045E, 0x044B) }, /* Windows Powered Pocket PC 2003 */
 
157
        { USB_DEVICE(0x045E, 0x044C) }, /* Windows Powered Pocket PC 2003 */
 
158
        { USB_DEVICE(0x045E, 0x044D) }, /* Windows Powered Pocket PC 2003 */
 
159
        { USB_DEVICE(0x045E, 0x044E) }, /* Windows Powered Pocket PC 2003 */
 
160
        { USB_DEVICE(0x045E, 0x044F) }, /* Windows Powered Pocket PC 2003 */
 
161
        { USB_DEVICE(0x045E, 0x0450) }, /* Windows Powered Pocket PC 2003 */
 
162
        { USB_DEVICE(0x045E, 0x0451) }, /* Windows Powered Pocket PC 2003 */
 
163
        { USB_DEVICE(0x045E, 0x0452) }, /* Windows Powered Pocket PC 2003 */
 
164
        { USB_DEVICE(0x045E, 0x0453) }, /* Windows Powered Pocket PC 2003 */
 
165
        { USB_DEVICE(0x045E, 0x0454) }, /* Windows Powered Pocket PC 2003 */
 
166
        { USB_DEVICE(0x045E, 0x0455) }, /* Windows Powered Pocket PC 2003 */
 
167
        { USB_DEVICE(0x045E, 0x0456) }, /* Windows Powered Pocket PC 2003 */
 
168
        { USB_DEVICE(0x045E, 0x0457) }, /* Windows Powered Pocket PC 2003 */
 
169
        { USB_DEVICE(0x045E, 0x0458) }, /* Windows Powered Pocket PC 2003 */
 
170
        { USB_DEVICE(0x045E, 0x0459) }, /* Windows Powered Pocket PC 2003 */
 
171
        { USB_DEVICE(0x045E, 0x045A) }, /* Windows Powered Pocket PC 2003 */
 
172
        { USB_DEVICE(0x045E, 0x045B) }, /* Windows Powered Pocket PC 2003 */
 
173
        { USB_DEVICE(0x045E, 0x045C) }, /* Windows Powered Pocket PC 2003 */
 
174
        { USB_DEVICE(0x045E, 0x045D) }, /* Windows Powered Pocket PC 2003 */
 
175
        { USB_DEVICE(0x045E, 0x045E) }, /* Windows Powered Pocket PC 2003 */
 
176
        { USB_DEVICE(0x045E, 0x045F) }, /* Windows Powered Pocket PC 2003 */
 
177
        { USB_DEVICE(0x045E, 0x0460) }, /* Windows Powered Pocket PC 2003 */
 
178
        { USB_DEVICE(0x045E, 0x0461) }, /* Windows Powered Pocket PC 2003 */
 
179
        { USB_DEVICE(0x045E, 0x0462) }, /* Windows Powered Pocket PC 2003 */
 
180
        { USB_DEVICE(0x045E, 0x0463) }, /* Windows Powered Pocket PC 2003 */
 
181
        { USB_DEVICE(0x045E, 0x0464) }, /* Windows Powered Pocket PC 2003 */
 
182
        { USB_DEVICE(0x045E, 0x0465) }, /* Windows Powered Pocket PC 2003 */
 
183
        { USB_DEVICE(0x045E, 0x0466) }, /* Windows Powered Pocket PC 2003 */
 
184
        { USB_DEVICE(0x045E, 0x0467) }, /* Windows Powered Pocket PC 2003 */
 
185
        { USB_DEVICE(0x045E, 0x0468) }, /* Windows Powered Pocket PC 2003 */
 
186
        { USB_DEVICE(0x045E, 0x0469) }, /* Windows Powered Pocket PC 2003 */
 
187
        { USB_DEVICE(0x045E, 0x046A) }, /* Windows Powered Pocket PC 2003 */
 
188
        { USB_DEVICE(0x045E, 0x046B) }, /* Windows Powered Pocket PC 2003 */
 
189
        { USB_DEVICE(0x045E, 0x046C) }, /* Windows Powered Pocket PC 2003 */
 
190
        { USB_DEVICE(0x045E, 0x046D) }, /* Windows Powered Pocket PC 2003 */
 
191
        { USB_DEVICE(0x045E, 0x046E) }, /* Windows Powered Pocket PC 2003 */
 
192
        { USB_DEVICE(0x045E, 0x046F) }, /* Windows Powered Pocket PC 2003 */
 
193
        { USB_DEVICE(0x045E, 0x0470) }, /* Windows Powered Pocket PC 2003 */
 
194
        { USB_DEVICE(0x045E, 0x0471) }, /* Windows Powered Pocket PC 2003 */
 
195
        { USB_DEVICE(0x045E, 0x0472) }, /* Windows Powered Pocket PC 2003 */
 
196
        { USB_DEVICE(0x045E, 0x0473) }, /* Windows Powered Pocket PC 2003 */
 
197
        { USB_DEVICE(0x045E, 0x0474) }, /* Windows Powered Pocket PC 2003 */
 
198
        { USB_DEVICE(0x045E, 0x0475) }, /* Windows Powered Pocket PC 2003 */
 
199
        { USB_DEVICE(0x045E, 0x0476) }, /* Windows Powered Pocket PC 2003 */
 
200
        { USB_DEVICE(0x045E, 0x0477) }, /* Windows Powered Pocket PC 2003 */
 
201
        { USB_DEVICE(0x045E, 0x0478) }, /* Windows Powered Pocket PC 2003 */
 
202
        { USB_DEVICE(0x045E, 0x0479) }, /* Windows Powered Pocket PC 2003 */
 
203
        { USB_DEVICE(0x045E, 0x047A) }, /* Windows Powered Pocket PC 2003 */
 
204
        { USB_DEVICE(0x045E, 0x047B) }, /* Windows Powered Pocket PC 2003 */
 
205
        { USB_DEVICE(0x045E, 0x04C8) }, /* Windows Powered Smartphone 2002 */
 
206
        { USB_DEVICE(0x045E, 0x04C9) }, /* Windows Powered Smartphone 2002 */
 
207
        { USB_DEVICE(0x045E, 0x04CA) }, /* Windows Powered Smartphone 2002 */
 
208
        { USB_DEVICE(0x045E, 0x04CB) }, /* Windows Powered Smartphone 2002 */
 
209
        { USB_DEVICE(0x045E, 0x04CC) }, /* Windows Powered Smartphone 2002 */
 
210
        { USB_DEVICE(0x045E, 0x04CD) }, /* Windows Powered Smartphone 2002 */
 
211
        { USB_DEVICE(0x045E, 0x04CE) }, /* Windows Powered Smartphone 2002 */
 
212
        { USB_DEVICE(0x045E, 0x04D7) }, /* Windows Powered Smartphone 2003 */
 
213
        { USB_DEVICE(0x045E, 0x04D8) }, /* Windows Powered Smartphone 2003 */
 
214
        { USB_DEVICE(0x045E, 0x04D9) }, /* Windows Powered Smartphone 2003 */
 
215
        { USB_DEVICE(0x045E, 0x04DA) }, /* Windows Powered Smartphone 2003 */
 
216
        { USB_DEVICE(0x045E, 0x04DB) }, /* Windows Powered Smartphone 2003 */
 
217
        { USB_DEVICE(0x045E, 0x04DC) }, /* Windows Powered Smartphone 2003 */
 
218
        { USB_DEVICE(0x045E, 0x04DD) }, /* Windows Powered Smartphone 2003 */
 
219
        { USB_DEVICE(0x045E, 0x04DE) }, /* Windows Powered Smartphone 2003 */
 
220
        { USB_DEVICE(0x045E, 0x04DF) }, /* Windows Powered Smartphone 2003 */
 
221
        { USB_DEVICE(0x045E, 0x04E0) }, /* Windows Powered Smartphone 2003 */
 
222
        { USB_DEVICE(0x045E, 0x04E1) }, /* Windows Powered Smartphone 2003 */
 
223
        { USB_DEVICE(0x045E, 0x04E2) }, /* Windows Powered Smartphone 2003 */
 
224
        { USB_DEVICE(0x045E, 0x04E3) }, /* Windows Powered Smartphone 2003 */
 
225
        { USB_DEVICE(0x045E, 0x04E4) }, /* Windows Powered Smartphone 2003 */
 
226
        { USB_DEVICE(0x045E, 0x04E5) }, /* Windows Powered Smartphone 2003 */
 
227
        { USB_DEVICE(0x045E, 0x04E6) }, /* Windows Powered Smartphone 2003 */
 
228
        { USB_DEVICE(0x045E, 0x04E7) }, /* Windows Powered Smartphone 2003 */
 
229
        { USB_DEVICE(0x045E, 0x04E8) }, /* Windows Powered Smartphone 2003 */
 
230
        { USB_DEVICE(0x045E, 0x04E9) }, /* Windows Powered Smartphone 2003 */
 
231
        { USB_DEVICE(0x045E, 0x04EA) }, /* Windows Powered Smartphone 2003 */
 
232
        { USB_DEVICE(0x049F, 0x0003) }, /* Compaq iPAQ USB Sync */
 
233
        { USB_DEVICE(0x049F, 0x0032) }, /* Compaq iPAQ USB Sync */
 
234
        { USB_DEVICE(0x04A4, 0x0014) }, /* Hitachi USB Sync */
 
235
        { USB_DEVICE(0x04AD, 0x0301) }, /* USB Sync 0301 */
 
236
        { USB_DEVICE(0x04AD, 0x0302) }, /* USB Sync 0302 */
 
237
        { USB_DEVICE(0x04AD, 0x0303) }, /* USB Sync 0303 */
 
238
        { USB_DEVICE(0x04AD, 0x0306) }, /* GPS Pocket PC USB Sync */
 
239
        { USB_DEVICE(0x04B7, 0x0531) }, /* MyGuide 7000 XL USB Sync */
 
240
        { USB_DEVICE(0x04C5, 0x1058) }, /* FUJITSU USB Sync */
 
241
        { USB_DEVICE(0x04C5, 0x1079) }, /* FUJITSU USB Sync */
 
242
        { USB_DEVICE(0x04DA, 0x2500) }, /* Panasonic USB Sync */
 
243
        { USB_DEVICE(0x04DD, 0x9102) }, /* SHARP WS003SH USB Modem */
 
244
        { USB_DEVICE(0x04DD, 0x9121) }, /* SHARP WS004SH USB Modem */
 
245
        { USB_DEVICE(0x04DD, 0x9123) }, /* SHARP WS007SH USB Modem */
 
246
        { USB_DEVICE(0x04DD, 0x9151) }, /* SHARP S01SH USB Modem */
 
247
        { USB_DEVICE(0x04DD, 0x91AC) }, /* SHARP WS011SH USB Modem */
 
248
        { USB_DEVICE(0x04E8, 0x5F00) }, /* Samsung NEXiO USB Sync */
 
249
        { USB_DEVICE(0x04E8, 0x5F01) }, /* Samsung NEXiO USB Sync */
 
250
        { USB_DEVICE(0x04E8, 0x5F02) }, /* Samsung NEXiO USB Sync */
 
251
        { USB_DEVICE(0x04E8, 0x5F03) }, /* Samsung NEXiO USB Sync */
 
252
        { USB_DEVICE(0x04E8, 0x5F04) }, /* Samsung NEXiO USB Sync */
 
253
        { USB_DEVICE(0x04E8, 0x6611) }, /* Samsung MITs USB Sync */
 
254
        { USB_DEVICE(0x04E8, 0x6613) }, /* Samsung MITs USB Sync */
 
255
        { USB_DEVICE(0x04E8, 0x6615) }, /* Samsung MITs USB Sync */
 
256
        { USB_DEVICE(0x04E8, 0x6617) }, /* Samsung MITs USB Sync */
 
257
        { USB_DEVICE(0x04E8, 0x6619) }, /* Samsung MITs USB Sync */
 
258
        { USB_DEVICE(0x04E8, 0x661B) }, /* Samsung MITs USB Sync */
 
259
        { USB_DEVICE(0x04E8, 0x662E) }, /* Samsung MITs USB Sync */
 
260
        { USB_DEVICE(0x04E8, 0x6630) }, /* Samsung MITs USB Sync */
 
261
        { USB_DEVICE(0x04E8, 0x6632) }, /* Samsung MITs USB Sync */
 
262
        { USB_DEVICE(0x04f1, 0x3011) }, /* JVC USB Sync */
 
263
        { USB_DEVICE(0x04F1, 0x3012) }, /* JVC USB Sync */
 
264
        { USB_DEVICE(0x0502, 0x1631) }, /* c10 Series */
 
265
        { USB_DEVICE(0x0502, 0x1632) }, /* c20 Series */
 
266
        { USB_DEVICE(0x0502, 0x16E1) }, /* Acer n10 Handheld USB Sync */
 
267
        { USB_DEVICE(0x0502, 0x16E2) }, /* Acer n20 Handheld USB Sync */
 
268
        { USB_DEVICE(0x0502, 0x16E3) }, /* Acer n30 Handheld USB Sync */
 
269
        { USB_DEVICE(0x0536, 0x01A0) }, /* HHP PDT */
 
270
        { USB_DEVICE(0x0543, 0x0ED9) }, /* ViewSonic Color Pocket PC V35 */
 
271
        { USB_DEVICE(0x0543, 0x1527) }, /* ViewSonic Color Pocket PC V36 */
 
272
        { USB_DEVICE(0x0543, 0x1529) }, /* ViewSonic Color Pocket PC V37 */
 
273
        { USB_DEVICE(0x0543, 0x152B) }, /* ViewSonic Color Pocket PC V38 */
 
274
        { USB_DEVICE(0x0543, 0x152E) }, /* ViewSonic Pocket PC */
 
275
        { USB_DEVICE(0x0543, 0x1921) }, /* ViewSonic Communicator Pocket PC */
 
276
        { USB_DEVICE(0x0543, 0x1922) }, /* ViewSonic Smartphone */
 
277
        { USB_DEVICE(0x0543, 0x1923) }, /* ViewSonic Pocket PC V30 */
 
278
        { USB_DEVICE(0x05E0, 0x2000) }, /* Symbol USB Sync */
 
279
        { USB_DEVICE(0x05E0, 0x2001) }, /* Symbol USB Sync 0x2001 */
 
280
        { USB_DEVICE(0x05E0, 0x2002) }, /* Symbol USB Sync 0x2002 */
 
281
        { USB_DEVICE(0x05E0, 0x2003) }, /* Symbol USB Sync 0x2003 */
 
282
        { USB_DEVICE(0x05E0, 0x2004) }, /* Symbol USB Sync 0x2004 */
 
283
        { USB_DEVICE(0x05E0, 0x2005) }, /* Symbol USB Sync 0x2005 */
 
284
        { USB_DEVICE(0x05E0, 0x2006) }, /* Symbol USB Sync 0x2006 */
 
285
        { USB_DEVICE(0x05E0, 0x2007) }, /* Symbol USB Sync 0x2007 */
 
286
        { USB_DEVICE(0x05E0, 0x2008) }, /* Symbol USB Sync 0x2008 */
 
287
        { USB_DEVICE(0x05E0, 0x2009) }, /* Symbol USB Sync 0x2009 */
 
288
        { USB_DEVICE(0x05E0, 0x200A) }, /* Symbol USB Sync 0x200A */
 
289
        { USB_DEVICE(0x067E, 0x1001) }, /* Intermec Mobile Computer */
 
290
        { USB_DEVICE(0x07CF, 0x2001) }, /* CASIO USB Sync 2001 */
 
291
        { USB_DEVICE(0x07CF, 0x2002) }, /* CASIO USB Sync 2002 */
 
292
        { USB_DEVICE(0x07CF, 0x2003) }, /* CASIO USB Sync 2003 */
 
293
        { USB_DEVICE(0x0930, 0x0700) }, /* TOSHIBA USB Sync 0700 */
 
294
        { USB_DEVICE(0x0930, 0x0705) }, /* TOSHIBA Pocket PC e310 */
 
295
        { USB_DEVICE(0x0930, 0x0706) }, /* TOSHIBA Pocket PC e740 */
 
296
        { USB_DEVICE(0x0930, 0x0707) }, /* TOSHIBA Pocket PC e330 Series */
 
297
        { USB_DEVICE(0x0930, 0x0708) }, /* TOSHIBA Pocket PC e350 Series */
 
298
        { USB_DEVICE(0x0930, 0x0709) }, /* TOSHIBA Pocket PC e750 Series */
 
299
        { USB_DEVICE(0x0930, 0x070A) }, /* TOSHIBA Pocket PC e400 Series */
 
300
        { USB_DEVICE(0x0930, 0x070B) }, /* TOSHIBA Pocket PC e800 Series */
 
301
        { USB_DEVICE(0x094B, 0x0001) }, /* Linkup Systems USB Sync */
 
302
        { USB_DEVICE(0x0960, 0x0065) }, /* BCOM USB Sync 0065 */
 
303
        { USB_DEVICE(0x0960, 0x0066) }, /* BCOM USB Sync 0066 */
 
304
        { USB_DEVICE(0x0960, 0x0067) }, /* BCOM USB Sync 0067 */
 
305
        { USB_DEVICE(0x0961, 0x0010) }, /* Portatec USB Sync */
 
306
        { USB_DEVICE(0x099E, 0x0052) }, /* Trimble GeoExplorer */
 
307
        { USB_DEVICE(0x099E, 0x4000) }, /* TDS Data Collector */
 
308
        { USB_DEVICE(0x0B05, 0x4200) }, /* ASUS USB Sync */
 
309
        { USB_DEVICE(0x0B05, 0x4201) }, /* ASUS USB Sync */
 
310
        { USB_DEVICE(0x0B05, 0x4202) }, /* ASUS USB Sync */
 
311
        { USB_DEVICE(0x0B05, 0x420F) }, /* ASUS USB Sync */
 
312
        { USB_DEVICE(0x0B05, 0x9200) }, /* ASUS USB Sync */
 
313
        { USB_DEVICE(0x0B05, 0x9202) }, /* ASUS USB Sync */
 
314
        { USB_DEVICE(0x0BB4, 0x00CE) }, /* HTC USB Sync */
 
315
        { USB_DEVICE(0x0BB4, 0x00CF) }, /* HTC USB Modem */
 
316
        { USB_DEVICE(0x0BB4, 0x0A01) }, /* PocketPC USB Sync */
 
317
        { USB_DEVICE(0x0BB4, 0x0A02) }, /* PocketPC USB Sync */
 
318
        { USB_DEVICE(0x0BB4, 0x0A03) }, /* PocketPC USB Sync */
 
319
        { USB_DEVICE(0x0BB4, 0x0A04) }, /* PocketPC USB Sync */
 
320
        { USB_DEVICE(0x0BB4, 0x0A05) }, /* PocketPC USB Sync */
 
321
        { USB_DEVICE(0x0BB4, 0x0A06) }, /* PocketPC USB Sync */
 
322
        { USB_DEVICE(0x0BB4, 0x0A07) }, /* PocketPC USB Sync */
 
323
        { USB_DEVICE(0x0BB4, 0x0A08) }, /* PocketPC USB Sync */
 
324
        { USB_DEVICE(0x0BB4, 0x0A09) }, /* PocketPC USB Sync */
 
325
        { USB_DEVICE(0x0BB4, 0x0A0A) }, /* PocketPC USB Sync */
 
326
        { USB_DEVICE(0x0BB4, 0x0A0B) }, /* PocketPC USB Sync */
 
327
        { USB_DEVICE(0x0BB4, 0x0A0C) }, /* PocketPC USB Sync */
 
328
        { USB_DEVICE(0x0BB4, 0x0A0D) }, /* PocketPC USB Sync */
 
329
        { USB_DEVICE(0x0BB4, 0x0A0E) }, /* PocketPC USB Sync */
 
330
        { USB_DEVICE(0x0BB4, 0x0A0F) }, /* PocketPC USB Sync */
 
331
        { USB_DEVICE(0x0BB4, 0x0A10) }, /* PocketPC USB Sync */
 
332
        { USB_DEVICE(0x0BB4, 0x0A11) }, /* PocketPC USB Sync */
 
333
        { USB_DEVICE(0x0BB4, 0x0A12) }, /* PocketPC USB Sync */
 
334
        { USB_DEVICE(0x0BB4, 0x0A13) }, /* PocketPC USB Sync */
 
335
        { USB_DEVICE(0x0BB4, 0x0A14) }, /* PocketPC USB Sync */
 
336
        { USB_DEVICE(0x0BB4, 0x0A15) }, /* PocketPC USB Sync */
 
337
        { USB_DEVICE(0x0BB4, 0x0A16) }, /* PocketPC USB Sync */
 
338
        { USB_DEVICE(0x0BB4, 0x0A17) }, /* PocketPC USB Sync */
 
339
        { USB_DEVICE(0x0BB4, 0x0A18) }, /* PocketPC USB Sync */
 
340
        { USB_DEVICE(0x0BB4, 0x0A19) }, /* PocketPC USB Sync */
 
341
        { USB_DEVICE(0x0BB4, 0x0A1A) }, /* PocketPC USB Sync */
 
342
        { USB_DEVICE(0x0BB4, 0x0A1B) }, /* PocketPC USB Sync */
 
343
        { USB_DEVICE(0x0BB4, 0x0A1C) }, /* PocketPC USB Sync */
 
344
        { USB_DEVICE(0x0BB4, 0x0A1D) }, /* PocketPC USB Sync */
 
345
        { USB_DEVICE(0x0BB4, 0x0A1E) }, /* PocketPC USB Sync */
 
346
        { USB_DEVICE(0x0BB4, 0x0A1F) }, /* PocketPC USB Sync */
 
347
        { USB_DEVICE(0x0BB4, 0x0A20) }, /* PocketPC USB Sync */
 
348
        { USB_DEVICE(0x0BB4, 0x0A21) }, /* PocketPC USB Sync */
 
349
        { USB_DEVICE(0x0BB4, 0x0A22) }, /* PocketPC USB Sync */
 
350
        { USB_DEVICE(0x0BB4, 0x0A23) }, /* PocketPC USB Sync */
 
351
        { USB_DEVICE(0x0BB4, 0x0A24) }, /* PocketPC USB Sync */
 
352
        { USB_DEVICE(0x0BB4, 0x0A25) }, /* PocketPC USB Sync */
 
353
        { USB_DEVICE(0x0BB4, 0x0A26) }, /* PocketPC USB Sync */
 
354
        { USB_DEVICE(0x0BB4, 0x0A27) }, /* PocketPC USB Sync */
 
355
        { USB_DEVICE(0x0BB4, 0x0A28) }, /* PocketPC USB Sync */
 
356
        { USB_DEVICE(0x0BB4, 0x0A29) }, /* PocketPC USB Sync */
 
357
        { USB_DEVICE(0x0BB4, 0x0A2A) }, /* PocketPC USB Sync */
 
358
        { USB_DEVICE(0x0BB4, 0x0A2B) }, /* PocketPC USB Sync */
 
359
        { USB_DEVICE(0x0BB4, 0x0A2C) }, /* PocketPC USB Sync */
 
360
        { USB_DEVICE(0x0BB4, 0x0A2D) }, /* PocketPC USB Sync */
 
361
        { USB_DEVICE(0x0BB4, 0x0A2E) }, /* PocketPC USB Sync */
 
362
        { USB_DEVICE(0x0BB4, 0x0A2F) }, /* PocketPC USB Sync */
 
363
        { USB_DEVICE(0x0BB4, 0x0A30) }, /* PocketPC USB Sync */
 
364
        { USB_DEVICE(0x0BB4, 0x0A31) }, /* PocketPC USB Sync */
 
365
        { USB_DEVICE(0x0BB4, 0x0A32) }, /* PocketPC USB Sync */
 
366
        { USB_DEVICE(0x0BB4, 0x0A33) }, /* PocketPC USB Sync */
 
367
        { USB_DEVICE(0x0BB4, 0x0A34) }, /* PocketPC USB Sync */
 
368
        { USB_DEVICE(0x0BB4, 0x0A35) }, /* PocketPC USB Sync */
 
369
        { USB_DEVICE(0x0BB4, 0x0A36) }, /* PocketPC USB Sync */
 
370
        { USB_DEVICE(0x0BB4, 0x0A37) }, /* PocketPC USB Sync */
 
371
        { USB_DEVICE(0x0BB4, 0x0A38) }, /* PocketPC USB Sync */
 
372
        { USB_DEVICE(0x0BB4, 0x0A39) }, /* PocketPC USB Sync */
 
373
        { USB_DEVICE(0x0BB4, 0x0A3A) }, /* PocketPC USB Sync */
 
374
        { USB_DEVICE(0x0BB4, 0x0A3B) }, /* PocketPC USB Sync */
 
375
        { USB_DEVICE(0x0BB4, 0x0A3C) }, /* PocketPC USB Sync */
 
376
        { USB_DEVICE(0x0BB4, 0x0A3D) }, /* PocketPC USB Sync */
 
377
        { USB_DEVICE(0x0BB4, 0x0A3E) }, /* PocketPC USB Sync */
 
378
        { USB_DEVICE(0x0BB4, 0x0A3F) }, /* PocketPC USB Sync */
 
379
        { USB_DEVICE(0x0BB4, 0x0A40) }, /* PocketPC USB Sync */
 
380
        { USB_DEVICE(0x0BB4, 0x0A41) }, /* PocketPC USB Sync */
 
381
        { USB_DEVICE(0x0BB4, 0x0A42) }, /* PocketPC USB Sync */
 
382
        { USB_DEVICE(0x0BB4, 0x0A43) }, /* PocketPC USB Sync */
 
383
        { USB_DEVICE(0x0BB4, 0x0A44) }, /* PocketPC USB Sync */
 
384
        { USB_DEVICE(0x0BB4, 0x0A45) }, /* PocketPC USB Sync */
 
385
        { USB_DEVICE(0x0BB4, 0x0A46) }, /* PocketPC USB Sync */
 
386
        { USB_DEVICE(0x0BB4, 0x0A47) }, /* PocketPC USB Sync */
 
387
        { USB_DEVICE(0x0BB4, 0x0A48) }, /* PocketPC USB Sync */
 
388
        { USB_DEVICE(0x0BB4, 0x0A49) }, /* PocketPC USB Sync */
 
389
        { USB_DEVICE(0x0BB4, 0x0A4A) }, /* PocketPC USB Sync */
 
390
        { USB_DEVICE(0x0BB4, 0x0A4B) }, /* PocketPC USB Sync */
 
391
        { USB_DEVICE(0x0BB4, 0x0A4C) }, /* PocketPC USB Sync */
 
392
        { USB_DEVICE(0x0BB4, 0x0A4D) }, /* PocketPC USB Sync */
 
393
        { USB_DEVICE(0x0BB4, 0x0A4E) }, /* PocketPC USB Sync */
 
394
        { USB_DEVICE(0x0BB4, 0x0A4F) }, /* PocketPC USB Sync */
 
395
        { USB_DEVICE(0x0BB4, 0x0A50) }, /* HTC SmartPhone USB Sync */
 
396
        { USB_DEVICE(0x0BB4, 0x0A51) }, /* SmartPhone USB Sync */
 
397
        { USB_DEVICE(0x0BB4, 0x0A52) }, /* SmartPhone USB Sync */
 
398
        { USB_DEVICE(0x0BB4, 0x0A53) }, /* SmartPhone USB Sync */
 
399
        { USB_DEVICE(0x0BB4, 0x0A54) }, /* SmartPhone USB Sync */
 
400
        { USB_DEVICE(0x0BB4, 0x0A55) }, /* SmartPhone USB Sync */
 
401
        { USB_DEVICE(0x0BB4, 0x0A56) }, /* SmartPhone USB Sync */
 
402
        { USB_DEVICE(0x0BB4, 0x0A57) }, /* SmartPhone USB Sync */
 
403
        { USB_DEVICE(0x0BB4, 0x0A58) }, /* SmartPhone USB Sync */
 
404
        { USB_DEVICE(0x0BB4, 0x0A59) }, /* SmartPhone USB Sync */
 
405
        { USB_DEVICE(0x0BB4, 0x0A5A) }, /* SmartPhone USB Sync */
 
406
        { USB_DEVICE(0x0BB4, 0x0A5B) }, /* SmartPhone USB Sync */
 
407
        { USB_DEVICE(0x0BB4, 0x0A5C) }, /* SmartPhone USB Sync */
 
408
        { USB_DEVICE(0x0BB4, 0x0A5D) }, /* SmartPhone USB Sync */
 
409
        { USB_DEVICE(0x0BB4, 0x0A5E) }, /* SmartPhone USB Sync */
 
410
        { USB_DEVICE(0x0BB4, 0x0A5F) }, /* SmartPhone USB Sync */
 
411
        { USB_DEVICE(0x0BB4, 0x0A60) }, /* SmartPhone USB Sync */
 
412
        { USB_DEVICE(0x0BB4, 0x0A61) }, /* SmartPhone USB Sync */
 
413
        { USB_DEVICE(0x0BB4, 0x0A62) }, /* SmartPhone USB Sync */
 
414
        { USB_DEVICE(0x0BB4, 0x0A63) }, /* SmartPhone USB Sync */
 
415
        { USB_DEVICE(0x0BB4, 0x0A64) }, /* SmartPhone USB Sync */
 
416
        { USB_DEVICE(0x0BB4, 0x0A65) }, /* SmartPhone USB Sync */
 
417
        { USB_DEVICE(0x0BB4, 0x0A66) }, /* SmartPhone USB Sync */
 
418
        { USB_DEVICE(0x0BB4, 0x0A67) }, /* SmartPhone USB Sync */
 
419
        { USB_DEVICE(0x0BB4, 0x0A68) }, /* SmartPhone USB Sync */
 
420
        { USB_DEVICE(0x0BB4, 0x0A69) }, /* SmartPhone USB Sync */
 
421
        { USB_DEVICE(0x0BB4, 0x0A6A) }, /* SmartPhone USB Sync */
 
422
        { USB_DEVICE(0x0BB4, 0x0A6B) }, /* SmartPhone USB Sync */
 
423
        { USB_DEVICE(0x0BB4, 0x0A6C) }, /* SmartPhone USB Sync */
 
424
        { USB_DEVICE(0x0BB4, 0x0A6D) }, /* SmartPhone USB Sync */
 
425
        { USB_DEVICE(0x0BB4, 0x0A6E) }, /* SmartPhone USB Sync */
 
426
        { USB_DEVICE(0x0BB4, 0x0A6F) }, /* SmartPhone USB Sync */
 
427
        { USB_DEVICE(0x0BB4, 0x0A70) }, /* SmartPhone USB Sync */
 
428
        { USB_DEVICE(0x0BB4, 0x0A71) }, /* SmartPhone USB Sync */
 
429
        { USB_DEVICE(0x0BB4, 0x0A72) }, /* SmartPhone USB Sync */
 
430
        { USB_DEVICE(0x0BB4, 0x0A73) }, /* SmartPhone USB Sync */
 
431
        { USB_DEVICE(0x0BB4, 0x0A74) }, /* SmartPhone USB Sync */
 
432
        { USB_DEVICE(0x0BB4, 0x0A75) }, /* SmartPhone USB Sync */
 
433
        { USB_DEVICE(0x0BB4, 0x0A76) }, /* SmartPhone USB Sync */
 
434
        { USB_DEVICE(0x0BB4, 0x0A77) }, /* SmartPhone USB Sync */
 
435
        { USB_DEVICE(0x0BB4, 0x0A78) }, /* SmartPhone USB Sync */
 
436
        { USB_DEVICE(0x0BB4, 0x0A79) }, /* SmartPhone USB Sync */
 
437
        { USB_DEVICE(0x0BB4, 0x0A7A) }, /* SmartPhone USB Sync */
 
438
        { USB_DEVICE(0x0BB4, 0x0A7B) }, /* SmartPhone USB Sync */
 
439
        { USB_DEVICE(0x0BB4, 0x0A7C) }, /* SmartPhone USB Sync */
 
440
        { USB_DEVICE(0x0BB4, 0x0A7D) }, /* SmartPhone USB Sync */
 
441
        { USB_DEVICE(0x0BB4, 0x0A7E) }, /* SmartPhone USB Sync */
 
442
        { USB_DEVICE(0x0BB4, 0x0A7F) }, /* SmartPhone USB Sync */
 
443
        { USB_DEVICE(0x0BB4, 0x0A80) }, /* SmartPhone USB Sync */
 
444
        { USB_DEVICE(0x0BB4, 0x0A81) }, /* SmartPhone USB Sync */
 
445
        { USB_DEVICE(0x0BB4, 0x0A82) }, /* SmartPhone USB Sync */
 
446
        { USB_DEVICE(0x0BB4, 0x0A83) }, /* SmartPhone USB Sync */
 
447
        { USB_DEVICE(0x0BB4, 0x0A84) }, /* SmartPhone USB Sync */
 
448
        { USB_DEVICE(0x0BB4, 0x0A85) }, /* SmartPhone USB Sync */
 
449
        { USB_DEVICE(0x0BB4, 0x0A86) }, /* SmartPhone USB Sync */
 
450
        { USB_DEVICE(0x0BB4, 0x0A87) }, /* SmartPhone USB Sync */
 
451
        { USB_DEVICE(0x0BB4, 0x0A88) }, /* SmartPhone USB Sync */
 
452
        { USB_DEVICE(0x0BB4, 0x0A89) }, /* SmartPhone USB Sync */
 
453
        { USB_DEVICE(0x0BB4, 0x0A8A) }, /* SmartPhone USB Sync */
 
454
        { USB_DEVICE(0x0BB4, 0x0A8B) }, /* SmartPhone USB Sync */
 
455
        { USB_DEVICE(0x0BB4, 0x0A8C) }, /* SmartPhone USB Sync */
 
456
        { USB_DEVICE(0x0BB4, 0x0A8D) }, /* SmartPhone USB Sync */
 
457
        { USB_DEVICE(0x0BB4, 0x0A8E) }, /* SmartPhone USB Sync */
 
458
        { USB_DEVICE(0x0BB4, 0x0A8F) }, /* SmartPhone USB Sync */
 
459
        { USB_DEVICE(0x0BB4, 0x0A90) }, /* SmartPhone USB Sync */
 
460
        { USB_DEVICE(0x0BB4, 0x0A91) }, /* SmartPhone USB Sync */
 
461
        { USB_DEVICE(0x0BB4, 0x0A92) }, /* SmartPhone USB Sync */
 
462
        { USB_DEVICE(0x0BB4, 0x0A93) }, /* SmartPhone USB Sync */
 
463
        { USB_DEVICE(0x0BB4, 0x0A94) }, /* SmartPhone USB Sync */
 
464
        { USB_DEVICE(0x0BB4, 0x0A95) }, /* SmartPhone USB Sync */
 
465
        { USB_DEVICE(0x0BB4, 0x0A96) }, /* SmartPhone USB Sync */
 
466
        { USB_DEVICE(0x0BB4, 0x0A97) }, /* SmartPhone USB Sync */
 
467
        { USB_DEVICE(0x0BB4, 0x0A98) }, /* SmartPhone USB Sync */
 
468
        { USB_DEVICE(0x0BB4, 0x0A99) }, /* SmartPhone USB Sync */
 
469
        { USB_DEVICE(0x0BB4, 0x0A9A) }, /* SmartPhone USB Sync */
 
470
        { USB_DEVICE(0x0BB4, 0x0A9B) }, /* SmartPhone USB Sync */
 
471
        { USB_DEVICE(0x0BB4, 0x0A9C) }, /* SmartPhone USB Sync */
 
472
        { USB_DEVICE(0x0BB4, 0x0A9D) }, /* SmartPhone USB Sync */
 
473
        { USB_DEVICE(0x0BB4, 0x0A9E) }, /* SmartPhone USB Sync */
 
474
        { USB_DEVICE(0x0BB4, 0x0A9F) }, /* SmartPhone USB Sync */
 
475
        { USB_DEVICE(0x0BB4, 0x0BCE) }, /* "High Tech Computer Corp" */
 
476
        { USB_DEVICE(0x0BF8, 0x1001) }, /* Fujitsu Siemens Computers USB Sync */
 
477
        { USB_DEVICE(0x0C44, 0x03A2) }, /* Motorola iDEN Smartphone */
 
478
        { USB_DEVICE(0x0C8E, 0x6000) }, /* Cesscom Luxian Series */
 
479
        { USB_DEVICE(0x0CAD, 0x9001) }, /* Motorola PowerPad Pocket PC Device */
 
480
        { USB_DEVICE(0x0F4E, 0x0200) }, /* Freedom Scientific USB Sync */
 
481
        { USB_DEVICE(0x0F98, 0x0201) }, /* Cyberbank USB Sync */
 
482
        { USB_DEVICE(0x0FB8, 0x3001) }, /* Wistron USB Sync */
 
483
        { USB_DEVICE(0x0FB8, 0x3002) }, /* Wistron USB Sync */
 
484
        { USB_DEVICE(0x0FB8, 0x3003) }, /* Wistron USB Sync */
 
485
        { USB_DEVICE(0x0FB8, 0x4001) }, /* Wistron USB Sync */
 
486
        { USB_DEVICE(0x1066, 0x00CE) }, /* E-TEN USB Sync */
 
487
        { USB_DEVICE(0x1066, 0x0300) }, /* E-TEN P3XX Pocket PC */
 
488
        { USB_DEVICE(0x1066, 0x0500) }, /* E-TEN P5XX Pocket PC */
 
489
        { USB_DEVICE(0x1066, 0x0600) }, /* E-TEN P6XX Pocket PC */
 
490
        { USB_DEVICE(0x1066, 0x0700) }, /* E-TEN P7XX Pocket PC */
 
491
        { USB_DEVICE(0x1114, 0x0001) }, /* Psion Teklogix Sync 753x */
 
492
        { USB_DEVICE(0x1114, 0x0004) }, /* Psion Teklogix Sync netBookPro */
 
493
        { USB_DEVICE(0x1114, 0x0006) }, /* Psion Teklogix Sync 7525 */
 
494
        { USB_DEVICE(0x1182, 0x1388) }, /* VES USB Sync */
 
495
        { USB_DEVICE(0x11D9, 0x1002) }, /* Rugged Pocket PC 2003 */
 
496
        { USB_DEVICE(0x11D9, 0x1003) }, /* Rugged Pocket PC 2003 */
 
497
        { USB_DEVICE(0x1231, 0xCE01) }, /* USB Sync 03 */
 
498
        { USB_DEVICE(0x1231, 0xCE02) }, /* USB Sync 03 */
 
499
        { USB_DEVICE(0x1690, 0x0601) }, /* Askey USB Sync */
 
500
        { USB_DEVICE(0x22B8, 0x4204) }, /* Motorola MPx200 Smartphone */
 
501
        { USB_DEVICE(0x22B8, 0x4214) }, /* Motorola MPc GSM */
 
502
        { USB_DEVICE(0x22B8, 0x4224) }, /* Motorola MPx220 Smartphone */
 
503
        { USB_DEVICE(0x22B8, 0x4234) }, /* Motorola MPc CDMA */
 
504
        { USB_DEVICE(0x22B8, 0x4244) }, /* Motorola MPx100 Smartphone */
 
505
        { USB_DEVICE(0x3340, 0x011C) }, /* Mio DigiWalker PPC StrongARM */
 
506
        { USB_DEVICE(0x3340, 0x0326) }, /* Mio DigiWalker 338 */
 
507
        { USB_DEVICE(0x3340, 0x0426) }, /* Mio DigiWalker 338 */
 
508
        { USB_DEVICE(0x3340, 0x043A) }, /* Mio DigiWalker USB Sync */
 
509
        { USB_DEVICE(0x3340, 0x051C) }, /* MiTAC USB Sync 528 */
 
510
        { USB_DEVICE(0x3340, 0x053A) }, /* Mio DigiWalker SmartPhone USB Sync */
 
511
        { USB_DEVICE(0x3340, 0x071C) }, /* MiTAC USB Sync */
 
512
        { USB_DEVICE(0x3340, 0x0B1C) }, /* Generic PPC StrongARM */
 
513
        { USB_DEVICE(0x3340, 0x0E3A) }, /* Generic PPC USB Sync */
 
514
        { USB_DEVICE(0x3340, 0x0F1C) }, /* Itautec USB Sync */
 
515
        { USB_DEVICE(0x3340, 0x0F3A) }, /* Generic SmartPhone USB Sync */
 
516
        { USB_DEVICE(0x3340, 0x1326) }, /* Itautec USB Sync */
 
517
        { USB_DEVICE(0x3340, 0x191C) }, /* YAKUMO USB Sync */
 
518
        { USB_DEVICE(0x3340, 0x2326) }, /* Vobis USB Sync */
 
519
        { USB_DEVICE(0x3340, 0x3326) }, /* MEDION Winodws Moble USB Sync */
 
520
        { USB_DEVICE(0x3708, 0x20CE) }, /* Legend USB Sync */
 
521
        { USB_DEVICE(0x3708, 0x21CE) }, /* Lenovo USB Sync */
 
522
        { USB_DEVICE(0x4113, 0x0210) }, /* Mobile Media Technology USB Sync */
 
523
        { USB_DEVICE(0x4113, 0x0211) }, /* Mobile Media Technology USB Sync */
 
524
        { USB_DEVICE(0x4113, 0x0400) }, /* Mobile Media Technology USB Sync */
 
525
        { USB_DEVICE(0x4113, 0x0410) }, /* Mobile Media Technology USB Sync */
 
526
        { USB_DEVICE(0x413C, 0x4001) }, /* Dell Axim USB Sync */
 
527
        { USB_DEVICE(0x413C, 0x4002) }, /* Dell Axim USB Sync */
 
528
        { USB_DEVICE(0x413C, 0x4003) }, /* Dell Axim USB Sync */
 
529
        { USB_DEVICE(0x413C, 0x4004) }, /* Dell Axim USB Sync */
 
530
        { USB_DEVICE(0x413C, 0x4005) }, /* Dell Axim USB Sync */
 
531
        { USB_DEVICE(0x413C, 0x4006) }, /* Dell Axim USB Sync */
 
532
        { USB_DEVICE(0x413C, 0x4007) }, /* Dell Axim USB Sync */
 
533
        { USB_DEVICE(0x413C, 0x4008) }, /* Dell Axim USB Sync */
 
534
        { USB_DEVICE(0x413C, 0x4009) }, /* Dell Axim USB Sync */
 
535
        { USB_DEVICE(0x4505, 0x0010) }, /* Smartphone */
 
536
        { USB_DEVICE(0x5E04, 0xCE00) }, /* SAGEM Wireless Assistant */
 
537
        { }                             /* Terminating entry */
 
538
};
 
539
 
 
540
MODULE_DEVICE_TABLE(usb, ipaq_id_table);
 
541
 
 
542
static struct usb_driver ipaq_driver = {
 
543
        .name =         "ipaq",
 
544
        .probe =        usb_serial_probe,
 
545
        .disconnect =   usb_serial_disconnect,
 
546
        .id_table =     ipaq_id_table,
 
547
        .no_dynamic_id =        1,
 
548
};
 
549
 
 
550
 
 
551
/* All of the device info needed for the Compaq iPAQ */
 
552
static struct usb_serial_driver ipaq_device = {
 
553
        .driver = {
 
554
                .owner =        THIS_MODULE,
 
555
                .name =         "ipaq",
 
556
        },
 
557
        .description =          "PocketPC PDA",
 
558
        .usb_driver =           &ipaq_driver,
 
559
        .id_table =             ipaq_id_table,
 
560
        .bulk_in_size =         256,
 
561
        .bulk_out_size =        256,
 
562
        .open =                 ipaq_open,
 
563
        .attach =               ipaq_startup,
 
564
        .calc_num_ports =       ipaq_calc_num_ports,
 
565
};
 
566
 
 
567
static int ipaq_open(struct tty_struct *tty,
 
568
                        struct usb_serial_port *port)
 
569
{
 
570
        struct usb_serial       *serial = port->serial;
 
571
        int                     result = 0;
 
572
        int                     retries = connect_retries;
 
573
 
 
574
        dbg("%s - port %d", __func__, port->number);
 
575
 
 
576
        msleep(1000*initial_wait);
 
577
 
 
578
        /*
 
579
         * Send out control message observed in win98 sniffs. Not sure what
 
580
         * it does, but from empirical observations, it seems that the device
 
581
         * will start the chat sequence once one of these messages gets
 
582
         * through. Since this has a reasonably high failure rate, we retry
 
583
         * several times.
 
584
         */
 
585
        while (retries--) {
 
586
                result = usb_control_msg(serial->dev,
 
587
                                usb_sndctrlpipe(serial->dev, 0), 0x22, 0x21,
 
588
                                0x1, 0, NULL, 0, 100);
 
589
                if (!result)
 
590
                        break;
 
591
 
 
592
                msleep(1000);
 
593
        }
 
594
        if (!retries && result) {
 
595
                dev_err(&port->dev, "%s - failed doing control urb, error %d\n",
 
596
                                                        __func__, result);
 
597
                return result;
 
598
        }
 
599
 
 
600
        return usb_serial_generic_open(tty, port);
 
601
}
 
602
 
 
603
static int ipaq_calc_num_ports(struct usb_serial *serial)
 
604
{
 
605
        /*
 
606
         * some devices have 3 endpoints, the 3rd of which
 
607
         * must be ignored as it would make the core
 
608
         * create a second port which oopses when used
 
609
         */
 
610
        int ipaq_num_ports = 1;
 
611
 
 
612
        dbg("%s - numberofendpoints: %d", __FUNCTION__,
 
613
                (int)serial->interface->cur_altsetting->desc.bNumEndpoints);
 
614
 
 
615
        /*
 
616
         * a few devices have 4 endpoints, seemingly Yakuma devices,
 
617
         * and we need the second pair, so let them have 2 ports
 
618
         *
 
619
         * TODO: can we drop port 1 ?
 
620
         */
 
621
        if (serial->interface->cur_altsetting->desc.bNumEndpoints > 3) {
 
622
                ipaq_num_ports = 2;
 
623
        }
 
624
 
 
625
        return ipaq_num_ports;
 
626
}
 
627
 
 
628
 
 
629
static int ipaq_startup(struct usb_serial *serial)
 
630
{
 
631
        dbg("%s", __func__);
 
632
 
 
633
        /* Some of the devices in ipaq_id_table[] are composite, and we
 
634
         * shouldn't bind to all the interfaces.  This test will rule out
 
635
         * some obviously invalid possibilities.
 
636
         */
 
637
        if (serial->num_bulk_in < serial->num_ports ||
 
638
                        serial->num_bulk_out < serial->num_ports)
 
639
                return -ENODEV;
 
640
 
 
641
        if (serial->dev->actconfig->desc.bConfigurationValue != 1) {
 
642
                /*
 
643
                 * FIXME: HP iPaq rx3715, possibly others, have 1 config that
 
644
                 * is labeled as 2
 
645
                 */
 
646
 
 
647
                dev_err(&serial->dev->dev, "active config #%d != 1 ??\n",
 
648
                        serial->dev->actconfig->desc.bConfigurationValue);
 
649
                return -ENODEV;
 
650
        }
 
651
 
 
652
        dbg("%s - iPAQ module configured for %d ports",
 
653
                __FUNCTION__, serial->num_ports);
 
654
 
 
655
        return usb_reset_configuration(serial->dev);
 
656
}
 
657
 
 
658
static int __init ipaq_init(void)
 
659
{
 
660
        int retval;
 
661
        retval = usb_serial_register(&ipaq_device);
 
662
        if (retval)
 
663
                goto failed_usb_serial_register;
 
664
        if (vendor) {
 
665
                ipaq_id_table[0].idVendor = vendor;
 
666
                ipaq_id_table[0].idProduct = product;
 
667
        }
 
668
        retval = usb_register(&ipaq_driver);
 
669
        if (retval)
 
670
                goto failed_usb_register;
 
671
 
 
672
        printk(KERN_INFO KBUILD_MODNAME ": " DRIVER_VERSION ":"
 
673
               DRIVER_DESC "\n");
 
674
        return 0;
 
675
failed_usb_register:
 
676
        usb_serial_deregister(&ipaq_device);
 
677
failed_usb_serial_register:
 
678
        return retval;
 
679
}
 
680
 
 
681
static void __exit ipaq_exit(void)
 
682
{
 
683
        usb_deregister(&ipaq_driver);
 
684
        usb_serial_deregister(&ipaq_device);
 
685
}
 
686
 
 
687
 
 
688
module_init(ipaq_init);
 
689
module_exit(ipaq_exit);
 
690
 
 
691
MODULE_AUTHOR(DRIVER_AUTHOR);
 
692
MODULE_DESCRIPTION(DRIVER_DESC);
 
693
MODULE_LICENSE("GPL");
 
694
 
 
695
module_param(debug, bool, S_IRUGO | S_IWUSR);
 
696
MODULE_PARM_DESC(debug, "Debug enabled or not");
 
697
 
 
698
module_param(vendor, ushort, 0);
 
699
MODULE_PARM_DESC(vendor, "User specified USB idVendor");
 
700
 
 
701
module_param(product, ushort, 0);
 
702
MODULE_PARM_DESC(product, "User specified USB idProduct");
 
703
 
 
704
module_param(connect_retries, int, S_IRUGO|S_IWUSR);
 
705
MODULE_PARM_DESC(connect_retries,
 
706
                "Maximum number of connect retries (one second each)");
 
707
 
 
708
module_param(initial_wait, int, S_IRUGO|S_IWUSR);
 
709
MODULE_PARM_DESC(initial_wait,
 
710
                "Time to wait before attempting a connection (in seconds)");