Blame view

drivers/usb/serial/ipaq.c 31.8 KB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1
2
3
4
5
6
7
8
9
10
  /*
   * USB Compaq iPAQ driver
   *
   *	Copyright (C) 2001 - 2002
   *	    Ganesh Varadarajan <ganesh@veritas.com>
   *
   *	This program is free software; you can redistribute it and/or modify
   *	it under the terms of the GNU General Public License as published by
   *	the Free Software Foundation; either version 2 of the License, or
   *	(at your option) any later version.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
11
   */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
12
13
  #include <linux/kernel.h>
  #include <linux/errno.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
14
15
16
17
18
19
  #include <linux/slab.h>
  #include <linux/tty.h>
  #include <linux/tty_driver.h>
  #include <linux/tty_flip.h>
  #include <linux/module.h>
  #include <linux/spinlock.h>
eb6215ccd   Alan Cox   ipaq: Coding style
20
  #include <linux/uaccess.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
21
  #include <linux/usb.h>
a969888ce   Greg Kroah-Hartman   [PATCH] USB: move...
22
  #include <linux/usb/serial.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
23
24
  
  #define KP_RETRIES	100
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
25
26
  #define DRIVER_AUTHOR "Ganesh Varadarajan <ganesh@veritas.com>"
  #define DRIVER_DESC "USB PocketPC PDA driver"
b33488eb5   Frank Gevaerts   [PATCH] USB: ipaq...
27
28
  static int connect_retries = KP_RETRIES;
  static int initial_wait;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
29
30
  
  /* Function prototypes for an ipaq */
95da310e6   Alan Cox   usb_serial: API a...
31
  static int  ipaq_open(struct tty_struct *tty,
a509a7e47   Alan Cox   tty: USB does not...
32
  			struct usb_serial_port *port);
1b8fb4141   Mark Ellis   USB: ipaq: handle...
33
  static int  ipaq_calc_num_ports(struct usb_serial *serial);
95da310e6   Alan Cox   usb_serial: API a...
34
  static int  ipaq_startup(struct usb_serial *serial);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
35

5c6b98dd0   Johan Hovold   USB: serial: cons...
36
  static const struct usb_device_id ipaq_id_table[] = {
eb3c5ed86   David Eriksson   [PATCH] USB: Impr...
37
  	{ USB_DEVICE(0x0104, 0x00BE) }, /* Socket USB Sync */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
  	{ USB_DEVICE(0x03F0, 0x1016) }, /* HP USB Sync */
  	{ USB_DEVICE(0x03F0, 0x1116) }, /* HP USB Sync 1611 */
  	{ USB_DEVICE(0x03F0, 0x1216) }, /* HP USB Sync 1612 */
  	{ USB_DEVICE(0x03F0, 0x2016) }, /* HP USB Sync 1620 */
  	{ USB_DEVICE(0x03F0, 0x2116) }, /* HP USB Sync 1621 */
  	{ USB_DEVICE(0x03F0, 0x2216) }, /* HP USB Sync 1622 */
  	{ USB_DEVICE(0x03F0, 0x3016) }, /* HP USB Sync 1630 */
  	{ USB_DEVICE(0x03F0, 0x3116) }, /* HP USB Sync 1631 */
  	{ USB_DEVICE(0x03F0, 0x3216) }, /* HP USB Sync 1632 */
  	{ USB_DEVICE(0x03F0, 0x4016) }, /* HP USB Sync 1640 */
  	{ USB_DEVICE(0x03F0, 0x4116) }, /* HP USB Sync 1641 */
  	{ USB_DEVICE(0x03F0, 0x4216) }, /* HP USB Sync 1642 */
  	{ USB_DEVICE(0x03F0, 0x5016) }, /* HP USB Sync 1650 */
  	{ USB_DEVICE(0x03F0, 0x5116) }, /* HP USB Sync 1651 */
  	{ USB_DEVICE(0x03F0, 0x5216) }, /* HP USB Sync 1652 */
eb3c5ed86   David Eriksson   [PATCH] USB: Impr...
53
54
55
56
57
58
59
  	{ USB_DEVICE(0x0409, 0x00D5) }, /* NEC USB Sync */
  	{ USB_DEVICE(0x0409, 0x00D6) }, /* NEC USB Sync */
  	{ USB_DEVICE(0x0409, 0x00D7) }, /* NEC USB Sync */
  	{ USB_DEVICE(0x0409, 0x8024) }, /* NEC USB Sync */
  	{ USB_DEVICE(0x0409, 0x8025) }, /* NEC USB Sync */
  	{ USB_DEVICE(0x043E, 0x9C01) }, /* LGE USB Sync */
  	{ USB_DEVICE(0x045E, 0x00CE) }, /* Microsoft USB Sync */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
  	{ USB_DEVICE(0x045E, 0x0400) }, /* Windows Powered Pocket PC 2002 */
  	{ USB_DEVICE(0x045E, 0x0401) }, /* Windows Powered Pocket PC 2002 */
  	{ USB_DEVICE(0x045E, 0x0402) }, /* Windows Powered Pocket PC 2002 */
  	{ USB_DEVICE(0x045E, 0x0403) }, /* Windows Powered Pocket PC 2002 */
  	{ USB_DEVICE(0x045E, 0x0404) }, /* Windows Powered Pocket PC 2002 */
  	{ USB_DEVICE(0x045E, 0x0405) }, /* Windows Powered Pocket PC 2002 */
  	{ USB_DEVICE(0x045E, 0x0406) }, /* Windows Powered Pocket PC 2002 */
  	{ USB_DEVICE(0x045E, 0x0407) }, /* Windows Powered Pocket PC 2002 */
  	{ USB_DEVICE(0x045E, 0x0408) }, /* Windows Powered Pocket PC 2002 */
  	{ USB_DEVICE(0x045E, 0x0409) }, /* Windows Powered Pocket PC 2002 */
  	{ USB_DEVICE(0x045E, 0x040A) }, /* Windows Powered Pocket PC 2002 */
  	{ USB_DEVICE(0x045E, 0x040B) }, /* Windows Powered Pocket PC 2002 */
  	{ USB_DEVICE(0x045E, 0x040C) }, /* Windows Powered Pocket PC 2002 */
  	{ USB_DEVICE(0x045E, 0x040D) }, /* Windows Powered Pocket PC 2002 */
  	{ USB_DEVICE(0x045E, 0x040E) }, /* Windows Powered Pocket PC 2002 */
  	{ USB_DEVICE(0x045E, 0x040F) }, /* Windows Powered Pocket PC 2002 */
  	{ USB_DEVICE(0x045E, 0x0410) }, /* Windows Powered Pocket PC 2002 */
  	{ USB_DEVICE(0x045E, 0x0411) }, /* Windows Powered Pocket PC 2002 */
  	{ USB_DEVICE(0x045E, 0x0412) }, /* Windows Powered Pocket PC 2002 */
  	{ USB_DEVICE(0x045E, 0x0413) }, /* Windows Powered Pocket PC 2002 */
  	{ USB_DEVICE(0x045E, 0x0414) }, /* Windows Powered Pocket PC 2002 */
  	{ USB_DEVICE(0x045E, 0x0415) }, /* Windows Powered Pocket PC 2002 */
  	{ USB_DEVICE(0x045E, 0x0416) }, /* Windows Powered Pocket PC 2002 */
  	{ USB_DEVICE(0x045E, 0x0417) }, /* Windows Powered Pocket PC 2002 */
  	{ USB_DEVICE(0x045E, 0x0432) }, /* Windows Powered Pocket PC 2003 */
  	{ USB_DEVICE(0x045E, 0x0433) }, /* Windows Powered Pocket PC 2003 */
  	{ USB_DEVICE(0x045E, 0x0434) }, /* Windows Powered Pocket PC 2003 */
  	{ USB_DEVICE(0x045E, 0x0435) }, /* Windows Powered Pocket PC 2003 */
  	{ USB_DEVICE(0x045E, 0x0436) }, /* Windows Powered Pocket PC 2003 */
  	{ USB_DEVICE(0x045E, 0x0437) }, /* Windows Powered Pocket PC 2003 */
  	{ USB_DEVICE(0x045E, 0x0438) }, /* Windows Powered Pocket PC 2003 */
  	{ USB_DEVICE(0x045E, 0x0439) }, /* Windows Powered Pocket PC 2003 */
  	{ USB_DEVICE(0x045E, 0x043A) }, /* Windows Powered Pocket PC 2003 */
  	{ USB_DEVICE(0x045E, 0x043B) }, /* Windows Powered Pocket PC 2003 */
  	{ USB_DEVICE(0x045E, 0x043C) }, /* Windows Powered Pocket PC 2003 */
  	{ USB_DEVICE(0x045E, 0x043D) }, /* Windows Powered Pocket PC 2003 */
  	{ USB_DEVICE(0x045E, 0x043E) }, /* Windows Powered Pocket PC 2003 */
  	{ USB_DEVICE(0x045E, 0x043F) }, /* Windows Powered Pocket PC 2003 */
  	{ USB_DEVICE(0x045E, 0x0440) }, /* Windows Powered Pocket PC 2003 */
  	{ USB_DEVICE(0x045E, 0x0441) }, /* Windows Powered Pocket PC 2003 */
  	{ USB_DEVICE(0x045E, 0x0442) }, /* Windows Powered Pocket PC 2003 */
  	{ USB_DEVICE(0x045E, 0x0443) }, /* Windows Powered Pocket PC 2003 */
  	{ USB_DEVICE(0x045E, 0x0444) }, /* Windows Powered Pocket PC 2003 */
  	{ USB_DEVICE(0x045E, 0x0445) }, /* Windows Powered Pocket PC 2003 */
  	{ USB_DEVICE(0x045E, 0x0446) }, /* Windows Powered Pocket PC 2003 */
  	{ USB_DEVICE(0x045E, 0x0447) }, /* Windows Powered Pocket PC 2003 */
  	{ USB_DEVICE(0x045E, 0x0448) }, /* Windows Powered Pocket PC 2003 */
  	{ USB_DEVICE(0x045E, 0x0449) }, /* Windows Powered Pocket PC 2003 */
  	{ USB_DEVICE(0x045E, 0x044A) }, /* Windows Powered Pocket PC 2003 */
  	{ USB_DEVICE(0x045E, 0x044B) }, /* Windows Powered Pocket PC 2003 */
  	{ USB_DEVICE(0x045E, 0x044C) }, /* Windows Powered Pocket PC 2003 */
  	{ USB_DEVICE(0x045E, 0x044D) }, /* Windows Powered Pocket PC 2003 */
  	{ USB_DEVICE(0x045E, 0x044E) }, /* Windows Powered Pocket PC 2003 */
  	{ USB_DEVICE(0x045E, 0x044F) }, /* Windows Powered Pocket PC 2003 */
  	{ USB_DEVICE(0x045E, 0x0450) }, /* Windows Powered Pocket PC 2003 */
  	{ USB_DEVICE(0x045E, 0x0451) }, /* Windows Powered Pocket PC 2003 */
  	{ USB_DEVICE(0x045E, 0x0452) }, /* Windows Powered Pocket PC 2003 */
  	{ USB_DEVICE(0x045E, 0x0453) }, /* Windows Powered Pocket PC 2003 */
  	{ USB_DEVICE(0x045E, 0x0454) }, /* Windows Powered Pocket PC 2003 */
  	{ USB_DEVICE(0x045E, 0x0455) }, /* Windows Powered Pocket PC 2003 */
  	{ USB_DEVICE(0x045E, 0x0456) }, /* Windows Powered Pocket PC 2003 */
  	{ USB_DEVICE(0x045E, 0x0457) }, /* Windows Powered Pocket PC 2003 */
  	{ USB_DEVICE(0x045E, 0x0458) }, /* Windows Powered Pocket PC 2003 */
  	{ USB_DEVICE(0x045E, 0x0459) }, /* Windows Powered Pocket PC 2003 */
  	{ USB_DEVICE(0x045E, 0x045A) }, /* Windows Powered Pocket PC 2003 */
  	{ USB_DEVICE(0x045E, 0x045B) }, /* Windows Powered Pocket PC 2003 */
  	{ USB_DEVICE(0x045E, 0x045C) }, /* Windows Powered Pocket PC 2003 */
  	{ USB_DEVICE(0x045E, 0x045D) }, /* Windows Powered Pocket PC 2003 */
  	{ USB_DEVICE(0x045E, 0x045E) }, /* Windows Powered Pocket PC 2003 */
  	{ USB_DEVICE(0x045E, 0x045F) }, /* Windows Powered Pocket PC 2003 */
  	{ USB_DEVICE(0x045E, 0x0460) }, /* Windows Powered Pocket PC 2003 */
  	{ USB_DEVICE(0x045E, 0x0461) }, /* Windows Powered Pocket PC 2003 */
  	{ USB_DEVICE(0x045E, 0x0462) }, /* Windows Powered Pocket PC 2003 */
  	{ USB_DEVICE(0x045E, 0x0463) }, /* Windows Powered Pocket PC 2003 */
  	{ USB_DEVICE(0x045E, 0x0464) }, /* Windows Powered Pocket PC 2003 */
  	{ USB_DEVICE(0x045E, 0x0465) }, /* Windows Powered Pocket PC 2003 */
  	{ USB_DEVICE(0x045E, 0x0466) }, /* Windows Powered Pocket PC 2003 */
  	{ USB_DEVICE(0x045E, 0x0467) }, /* Windows Powered Pocket PC 2003 */
  	{ USB_DEVICE(0x045E, 0x0468) }, /* Windows Powered Pocket PC 2003 */
  	{ USB_DEVICE(0x045E, 0x0469) }, /* Windows Powered Pocket PC 2003 */
  	{ USB_DEVICE(0x045E, 0x046A) }, /* Windows Powered Pocket PC 2003 */
  	{ USB_DEVICE(0x045E, 0x046B) }, /* Windows Powered Pocket PC 2003 */
  	{ USB_DEVICE(0x045E, 0x046C) }, /* Windows Powered Pocket PC 2003 */
  	{ USB_DEVICE(0x045E, 0x046D) }, /* Windows Powered Pocket PC 2003 */
  	{ USB_DEVICE(0x045E, 0x046E) }, /* Windows Powered Pocket PC 2003 */
  	{ USB_DEVICE(0x045E, 0x046F) }, /* Windows Powered Pocket PC 2003 */
  	{ USB_DEVICE(0x045E, 0x0470) }, /* Windows Powered Pocket PC 2003 */
  	{ USB_DEVICE(0x045E, 0x0471) }, /* Windows Powered Pocket PC 2003 */
  	{ USB_DEVICE(0x045E, 0x0472) }, /* Windows Powered Pocket PC 2003 */
  	{ USB_DEVICE(0x045E, 0x0473) }, /* Windows Powered Pocket PC 2003 */
  	{ USB_DEVICE(0x045E, 0x0474) }, /* Windows Powered Pocket PC 2003 */
  	{ USB_DEVICE(0x045E, 0x0475) }, /* Windows Powered Pocket PC 2003 */
  	{ USB_DEVICE(0x045E, 0x0476) }, /* Windows Powered Pocket PC 2003 */
  	{ USB_DEVICE(0x045E, 0x0477) }, /* Windows Powered Pocket PC 2003 */
  	{ USB_DEVICE(0x045E, 0x0478) }, /* Windows Powered Pocket PC 2003 */
  	{ USB_DEVICE(0x045E, 0x0479) }, /* Windows Powered Pocket PC 2003 */
  	{ USB_DEVICE(0x045E, 0x047A) }, /* Windows Powered Pocket PC 2003 */
  	{ USB_DEVICE(0x045E, 0x047B) }, /* Windows Powered Pocket PC 2003 */
  	{ USB_DEVICE(0x045E, 0x04C8) }, /* Windows Powered Smartphone 2002 */
  	{ USB_DEVICE(0x045E, 0x04C9) }, /* Windows Powered Smartphone 2002 */
  	{ USB_DEVICE(0x045E, 0x04CA) }, /* Windows Powered Smartphone 2002 */
  	{ USB_DEVICE(0x045E, 0x04CB) }, /* Windows Powered Smartphone 2002 */
  	{ USB_DEVICE(0x045E, 0x04CC) }, /* Windows Powered Smartphone 2002 */
  	{ USB_DEVICE(0x045E, 0x04CD) }, /* Windows Powered Smartphone 2002 */
  	{ USB_DEVICE(0x045E, 0x04CE) }, /* Windows Powered Smartphone 2002 */
  	{ USB_DEVICE(0x045E, 0x04D7) }, /* Windows Powered Smartphone 2003 */
  	{ USB_DEVICE(0x045E, 0x04D8) }, /* Windows Powered Smartphone 2003 */
  	{ USB_DEVICE(0x045E, 0x04D9) }, /* Windows Powered Smartphone 2003 */
  	{ USB_DEVICE(0x045E, 0x04DA) }, /* Windows Powered Smartphone 2003 */
  	{ USB_DEVICE(0x045E, 0x04DB) }, /* Windows Powered Smartphone 2003 */
  	{ USB_DEVICE(0x045E, 0x04DC) }, /* Windows Powered Smartphone 2003 */
  	{ USB_DEVICE(0x045E, 0x04DD) }, /* Windows Powered Smartphone 2003 */
  	{ USB_DEVICE(0x045E, 0x04DE) }, /* Windows Powered Smartphone 2003 */
  	{ USB_DEVICE(0x045E, 0x04DF) }, /* Windows Powered Smartphone 2003 */
  	{ USB_DEVICE(0x045E, 0x04E0) }, /* Windows Powered Smartphone 2003 */
  	{ USB_DEVICE(0x045E, 0x04E1) }, /* Windows Powered Smartphone 2003 */
  	{ USB_DEVICE(0x045E, 0x04E2) }, /* Windows Powered Smartphone 2003 */
  	{ USB_DEVICE(0x045E, 0x04E3) }, /* Windows Powered Smartphone 2003 */
  	{ USB_DEVICE(0x045E, 0x04E4) }, /* Windows Powered Smartphone 2003 */
  	{ USB_DEVICE(0x045E, 0x04E5) }, /* Windows Powered Smartphone 2003 */
  	{ USB_DEVICE(0x045E, 0x04E6) }, /* Windows Powered Smartphone 2003 */
  	{ USB_DEVICE(0x045E, 0x04E7) }, /* Windows Powered Smartphone 2003 */
  	{ USB_DEVICE(0x045E, 0x04E8) }, /* Windows Powered Smartphone 2003 */
  	{ USB_DEVICE(0x045E, 0x04E9) }, /* Windows Powered Smartphone 2003 */
  	{ USB_DEVICE(0x045E, 0x04EA) }, /* Windows Powered Smartphone 2003 */
eb3c5ed86   David Eriksson   [PATCH] USB: Impr...
185
186
187
188
189
190
  	{ USB_DEVICE(0x049F, 0x0003) }, /* Compaq iPAQ USB Sync */
  	{ USB_DEVICE(0x049F, 0x0032) }, /* Compaq iPAQ USB Sync */
  	{ USB_DEVICE(0x04A4, 0x0014) }, /* Hitachi USB Sync */
  	{ USB_DEVICE(0x04AD, 0x0301) }, /* USB Sync 0301 */
  	{ USB_DEVICE(0x04AD, 0x0302) }, /* USB Sync 0302 */
  	{ USB_DEVICE(0x04AD, 0x0303) }, /* USB Sync 0303 */
62d909ced   Andre Spahlinger   USB: ipaq.c: Addi...
191
192
  	{ USB_DEVICE(0x04AD, 0x0306) }, /* GPS Pocket PC USB Sync */
  	{ USB_DEVICE(0x04B7, 0x0531) }, /* MyGuide 7000 XL USB Sync */
eb3c5ed86   David Eriksson   [PATCH] USB: Impr...
193
194
195
  	{ USB_DEVICE(0x04C5, 0x1058) }, /* FUJITSU USB Sync */
  	{ USB_DEVICE(0x04C5, 0x1079) }, /* FUJITSU USB Sync */
  	{ USB_DEVICE(0x04DA, 0x2500) }, /* Panasonic USB Sync */
aec0d50b8   Norihiko Tomiyama   USB: adding suppo...
196
  	{ USB_DEVICE(0x04DD, 0x9102) }, /* SHARP WS003SH USB Modem */
922fdaa69   Norihiko Tomiyama   USB: Additional P...
197
198
  	{ USB_DEVICE(0x04DD, 0x9121) }, /* SHARP WS004SH USB Modem */
  	{ USB_DEVICE(0x04DD, 0x9123) }, /* SHARP WS007SH USB Modem */
c51e9749a   Norihiko Tomiyama   Adding PID of SHA...
199
  	{ USB_DEVICE(0x04DD, 0x9151) }, /* SHARP S01SH USB Modem */
eecfb911a   Nobuhiro Iwamatsu   USB: Adding suppo...
200
  	{ USB_DEVICE(0x04DD, 0x91AC) }, /* SHARP WS011SH USB Modem */
eb3c5ed86   David Eriksson   [PATCH] USB: Impr...
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
  	{ USB_DEVICE(0x04E8, 0x5F00) }, /* Samsung NEXiO USB Sync */
  	{ USB_DEVICE(0x04E8, 0x5F01) }, /* Samsung NEXiO USB Sync */
  	{ USB_DEVICE(0x04E8, 0x5F02) }, /* Samsung NEXiO USB Sync */
  	{ USB_DEVICE(0x04E8, 0x5F03) }, /* Samsung NEXiO USB Sync */
  	{ USB_DEVICE(0x04E8, 0x5F04) }, /* Samsung NEXiO USB Sync */
  	{ USB_DEVICE(0x04E8, 0x6611) }, /* Samsung MITs USB Sync */
  	{ USB_DEVICE(0x04E8, 0x6613) }, /* Samsung MITs USB Sync */
  	{ USB_DEVICE(0x04E8, 0x6615) }, /* Samsung MITs USB Sync */
  	{ USB_DEVICE(0x04E8, 0x6617) }, /* Samsung MITs USB Sync */
  	{ USB_DEVICE(0x04E8, 0x6619) }, /* Samsung MITs USB Sync */
  	{ USB_DEVICE(0x04E8, 0x661B) }, /* Samsung MITs USB Sync */
  	{ USB_DEVICE(0x04E8, 0x662E) }, /* Samsung MITs USB Sync */
  	{ USB_DEVICE(0x04E8, 0x6630) }, /* Samsung MITs USB Sync */
  	{ USB_DEVICE(0x04E8, 0x6632) }, /* Samsung MITs USB Sync */
  	{ USB_DEVICE(0x04f1, 0x3011) }, /* JVC USB Sync */
  	{ USB_DEVICE(0x04F1, 0x3012) }, /* JVC USB Sync */
  	{ USB_DEVICE(0x0502, 0x1631) }, /* c10 Series */
  	{ USB_DEVICE(0x0502, 0x1632) }, /* c20 Series */
  	{ USB_DEVICE(0x0502, 0x16E1) }, /* Acer n10 Handheld USB Sync */
  	{ USB_DEVICE(0x0502, 0x16E2) }, /* Acer n20 Handheld USB Sync */
  	{ USB_DEVICE(0x0502, 0x16E3) }, /* Acer n30 Handheld USB Sync */
  	{ USB_DEVICE(0x0536, 0x01A0) }, /* HHP PDT */
  	{ USB_DEVICE(0x0543, 0x0ED9) }, /* ViewSonic Color Pocket PC V35 */
  	{ USB_DEVICE(0x0543, 0x1527) }, /* ViewSonic Color Pocket PC V36 */
  	{ USB_DEVICE(0x0543, 0x1529) }, /* ViewSonic Color Pocket PC V37 */
  	{ USB_DEVICE(0x0543, 0x152B) }, /* ViewSonic Color Pocket PC V38 */
  	{ USB_DEVICE(0x0543, 0x152E) }, /* ViewSonic Pocket PC */
  	{ USB_DEVICE(0x0543, 0x1921) }, /* ViewSonic Communicator Pocket PC */
  	{ USB_DEVICE(0x0543, 0x1922) }, /* ViewSonic Smartphone */
  	{ USB_DEVICE(0x0543, 0x1923) }, /* ViewSonic Pocket PC V30 */
  	{ USB_DEVICE(0x05E0, 0x2000) }, /* Symbol USB Sync */
  	{ USB_DEVICE(0x05E0, 0x2001) }, /* Symbol USB Sync 0x2001 */
  	{ USB_DEVICE(0x05E0, 0x2002) }, /* Symbol USB Sync 0x2002 */
  	{ USB_DEVICE(0x05E0, 0x2003) }, /* Symbol USB Sync 0x2003 */
  	{ USB_DEVICE(0x05E0, 0x2004) }, /* Symbol USB Sync 0x2004 */
  	{ USB_DEVICE(0x05E0, 0x2005) }, /* Symbol USB Sync 0x2005 */
  	{ USB_DEVICE(0x05E0, 0x2006) }, /* Symbol USB Sync 0x2006 */
  	{ USB_DEVICE(0x05E0, 0x2007) }, /* Symbol USB Sync 0x2007 */
  	{ USB_DEVICE(0x05E0, 0x2008) }, /* Symbol USB Sync 0x2008 */
  	{ USB_DEVICE(0x05E0, 0x2009) }, /* Symbol USB Sync 0x2009 */
  	{ USB_DEVICE(0x05E0, 0x200A) }, /* Symbol USB Sync 0x200A */
  	{ USB_DEVICE(0x067E, 0x1001) }, /* Intermec Mobile Computer */
  	{ USB_DEVICE(0x07CF, 0x2001) }, /* CASIO USB Sync 2001 */
  	{ USB_DEVICE(0x07CF, 0x2002) }, /* CASIO USB Sync 2002 */
  	{ USB_DEVICE(0x07CF, 0x2003) }, /* CASIO USB Sync 2003 */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
246
247
  	{ USB_DEVICE(0x0930, 0x0700) }, /* TOSHIBA USB Sync 0700 */
  	{ USB_DEVICE(0x0930, 0x0705) }, /* TOSHIBA Pocket PC e310 */
eb3c5ed86   David Eriksson   [PATCH] USB: Impr...
248
  	{ USB_DEVICE(0x0930, 0x0706) }, /* TOSHIBA Pocket PC e740 */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
249
  	{ USB_DEVICE(0x0930, 0x0707) }, /* TOSHIBA Pocket PC e330 Series */
96de0e252   Jan Engelhardt   Convert files to ...
250
  	{ USB_DEVICE(0x0930, 0x0708) }, /* TOSHIBA Pocket PC e350 Series */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
251
252
253
  	{ USB_DEVICE(0x0930, 0x0709) }, /* TOSHIBA Pocket PC e750 Series */
  	{ USB_DEVICE(0x0930, 0x070A) }, /* TOSHIBA Pocket PC e400 Series */
  	{ USB_DEVICE(0x0930, 0x070B) }, /* TOSHIBA Pocket PC e800 Series */
eb3c5ed86   David Eriksson   [PATCH] USB: Impr...
254
255
256
257
258
259
260
261
262
263
264
265
266
  	{ USB_DEVICE(0x094B, 0x0001) }, /* Linkup Systems USB Sync */
  	{ USB_DEVICE(0x0960, 0x0065) }, /* BCOM USB Sync 0065 */
  	{ USB_DEVICE(0x0960, 0x0066) }, /* BCOM USB Sync 0066 */
  	{ USB_DEVICE(0x0960, 0x0067) }, /* BCOM USB Sync 0067 */
  	{ USB_DEVICE(0x0961, 0x0010) }, /* Portatec USB Sync */
  	{ USB_DEVICE(0x099E, 0x0052) }, /* Trimble GeoExplorer */
  	{ USB_DEVICE(0x099E, 0x4000) }, /* TDS Data Collector */
  	{ USB_DEVICE(0x0B05, 0x4200) }, /* ASUS USB Sync */
  	{ USB_DEVICE(0x0B05, 0x4201) }, /* ASUS USB Sync */
  	{ USB_DEVICE(0x0B05, 0x4202) }, /* ASUS USB Sync */
  	{ USB_DEVICE(0x0B05, 0x420F) }, /* ASUS USB Sync */
  	{ USB_DEVICE(0x0B05, 0x9200) }, /* ASUS USB Sync */
  	{ USB_DEVICE(0x0B05, 0x9202) }, /* ASUS USB Sync */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
267
  	{ USB_DEVICE(0x0BB4, 0x00CE) }, /* HTC USB Sync */
0029908ba   Alex Sanks   USB: ipaq: Add HT...
268
  	{ USB_DEVICE(0x0BB4, 0x00CF) }, /* HTC USB Modem */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
  	{ USB_DEVICE(0x0BB4, 0x0A01) }, /* PocketPC USB Sync */
  	{ USB_DEVICE(0x0BB4, 0x0A02) }, /* PocketPC USB Sync */
  	{ USB_DEVICE(0x0BB4, 0x0A03) }, /* PocketPC USB Sync */
  	{ USB_DEVICE(0x0BB4, 0x0A04) }, /* PocketPC USB Sync */
  	{ USB_DEVICE(0x0BB4, 0x0A05) }, /* PocketPC USB Sync */
  	{ USB_DEVICE(0x0BB4, 0x0A06) }, /* PocketPC USB Sync */
  	{ USB_DEVICE(0x0BB4, 0x0A07) }, /* PocketPC USB Sync */
  	{ USB_DEVICE(0x0BB4, 0x0A08) }, /* PocketPC USB Sync */
  	{ USB_DEVICE(0x0BB4, 0x0A09) }, /* PocketPC USB Sync */
  	{ USB_DEVICE(0x0BB4, 0x0A0A) }, /* PocketPC USB Sync */
  	{ USB_DEVICE(0x0BB4, 0x0A0B) }, /* PocketPC USB Sync */
  	{ USB_DEVICE(0x0BB4, 0x0A0C) }, /* PocketPC USB Sync */
  	{ USB_DEVICE(0x0BB4, 0x0A0D) }, /* PocketPC USB Sync */
  	{ USB_DEVICE(0x0BB4, 0x0A0E) }, /* PocketPC USB Sync */
  	{ USB_DEVICE(0x0BB4, 0x0A0F) }, /* PocketPC USB Sync */
  	{ USB_DEVICE(0x0BB4, 0x0A10) }, /* PocketPC USB Sync */
  	{ USB_DEVICE(0x0BB4, 0x0A11) }, /* PocketPC USB Sync */
  	{ USB_DEVICE(0x0BB4, 0x0A12) }, /* PocketPC USB Sync */
  	{ USB_DEVICE(0x0BB4, 0x0A13) }, /* PocketPC USB Sync */
  	{ USB_DEVICE(0x0BB4, 0x0A14) }, /* PocketPC USB Sync */
  	{ USB_DEVICE(0x0BB4, 0x0A15) }, /* PocketPC USB Sync */
  	{ USB_DEVICE(0x0BB4, 0x0A16) }, /* PocketPC USB Sync */
  	{ USB_DEVICE(0x0BB4, 0x0A17) }, /* PocketPC USB Sync */
  	{ USB_DEVICE(0x0BB4, 0x0A18) }, /* PocketPC USB Sync */
  	{ USB_DEVICE(0x0BB4, 0x0A19) }, /* PocketPC USB Sync */
  	{ USB_DEVICE(0x0BB4, 0x0A1A) }, /* PocketPC USB Sync */
  	{ USB_DEVICE(0x0BB4, 0x0A1B) }, /* PocketPC USB Sync */
  	{ USB_DEVICE(0x0BB4, 0x0A1C) }, /* PocketPC USB Sync */
  	{ USB_DEVICE(0x0BB4, 0x0A1D) }, /* PocketPC USB Sync */
  	{ USB_DEVICE(0x0BB4, 0x0A1E) }, /* PocketPC USB Sync */
  	{ USB_DEVICE(0x0BB4, 0x0A1F) }, /* PocketPC USB Sync */
  	{ USB_DEVICE(0x0BB4, 0x0A20) }, /* PocketPC USB Sync */
  	{ USB_DEVICE(0x0BB4, 0x0A21) }, /* PocketPC USB Sync */
  	{ USB_DEVICE(0x0BB4, 0x0A22) }, /* PocketPC USB Sync */
  	{ USB_DEVICE(0x0BB4, 0x0A23) }, /* PocketPC USB Sync */
  	{ USB_DEVICE(0x0BB4, 0x0A24) }, /* PocketPC USB Sync */
  	{ USB_DEVICE(0x0BB4, 0x0A25) }, /* PocketPC USB Sync */
  	{ USB_DEVICE(0x0BB4, 0x0A26) }, /* PocketPC USB Sync */
  	{ USB_DEVICE(0x0BB4, 0x0A27) }, /* PocketPC USB Sync */
  	{ USB_DEVICE(0x0BB4, 0x0A28) }, /* PocketPC USB Sync */
  	{ USB_DEVICE(0x0BB4, 0x0A29) }, /* PocketPC USB Sync */
  	{ USB_DEVICE(0x0BB4, 0x0A2A) }, /* PocketPC USB Sync */
  	{ USB_DEVICE(0x0BB4, 0x0A2B) }, /* PocketPC USB Sync */
  	{ USB_DEVICE(0x0BB4, 0x0A2C) }, /* PocketPC USB Sync */
  	{ USB_DEVICE(0x0BB4, 0x0A2D) }, /* PocketPC USB Sync */
  	{ USB_DEVICE(0x0BB4, 0x0A2E) }, /* PocketPC USB Sync */
  	{ USB_DEVICE(0x0BB4, 0x0A2F) }, /* PocketPC USB Sync */
  	{ USB_DEVICE(0x0BB4, 0x0A30) }, /* PocketPC USB Sync */
  	{ USB_DEVICE(0x0BB4, 0x0A31) }, /* PocketPC USB Sync */
  	{ USB_DEVICE(0x0BB4, 0x0A32) }, /* PocketPC USB Sync */
  	{ USB_DEVICE(0x0BB4, 0x0A33) }, /* PocketPC USB Sync */
  	{ USB_DEVICE(0x0BB4, 0x0A34) }, /* PocketPC USB Sync */
  	{ USB_DEVICE(0x0BB4, 0x0A35) }, /* PocketPC USB Sync */
  	{ USB_DEVICE(0x0BB4, 0x0A36) }, /* PocketPC USB Sync */
  	{ USB_DEVICE(0x0BB4, 0x0A37) }, /* PocketPC USB Sync */
  	{ USB_DEVICE(0x0BB4, 0x0A38) }, /* PocketPC USB Sync */
  	{ USB_DEVICE(0x0BB4, 0x0A39) }, /* PocketPC USB Sync */
  	{ USB_DEVICE(0x0BB4, 0x0A3A) }, /* PocketPC USB Sync */
  	{ USB_DEVICE(0x0BB4, 0x0A3B) }, /* PocketPC USB Sync */
  	{ USB_DEVICE(0x0BB4, 0x0A3C) }, /* PocketPC USB Sync */
  	{ USB_DEVICE(0x0BB4, 0x0A3D) }, /* PocketPC USB Sync */
  	{ USB_DEVICE(0x0BB4, 0x0A3E) }, /* PocketPC USB Sync */
  	{ USB_DEVICE(0x0BB4, 0x0A3F) }, /* PocketPC USB Sync */
  	{ USB_DEVICE(0x0BB4, 0x0A40) }, /* PocketPC USB Sync */
  	{ USB_DEVICE(0x0BB4, 0x0A41) }, /* PocketPC USB Sync */
  	{ USB_DEVICE(0x0BB4, 0x0A42) }, /* PocketPC USB Sync */
  	{ USB_DEVICE(0x0BB4, 0x0A43) }, /* PocketPC USB Sync */
  	{ USB_DEVICE(0x0BB4, 0x0A44) }, /* PocketPC USB Sync */
  	{ USB_DEVICE(0x0BB4, 0x0A45) }, /* PocketPC USB Sync */
  	{ USB_DEVICE(0x0BB4, 0x0A46) }, /* PocketPC USB Sync */
  	{ USB_DEVICE(0x0BB4, 0x0A47) }, /* PocketPC USB Sync */
  	{ USB_DEVICE(0x0BB4, 0x0A48) }, /* PocketPC USB Sync */
  	{ USB_DEVICE(0x0BB4, 0x0A49) }, /* PocketPC USB Sync */
  	{ USB_DEVICE(0x0BB4, 0x0A4A) }, /* PocketPC USB Sync */
  	{ USB_DEVICE(0x0BB4, 0x0A4B) }, /* PocketPC USB Sync */
  	{ USB_DEVICE(0x0BB4, 0x0A4C) }, /* PocketPC USB Sync */
  	{ USB_DEVICE(0x0BB4, 0x0A4D) }, /* PocketPC USB Sync */
  	{ USB_DEVICE(0x0BB4, 0x0A4E) }, /* PocketPC USB Sync */
  	{ USB_DEVICE(0x0BB4, 0x0A4F) }, /* PocketPC USB Sync */
  	{ USB_DEVICE(0x0BB4, 0x0A50) }, /* HTC SmartPhone USB Sync */
  	{ USB_DEVICE(0x0BB4, 0x0A51) }, /* SmartPhone USB Sync */
  	{ USB_DEVICE(0x0BB4, 0x0A52) }, /* SmartPhone USB Sync */
  	{ USB_DEVICE(0x0BB4, 0x0A53) }, /* SmartPhone USB Sync */
  	{ USB_DEVICE(0x0BB4, 0x0A54) }, /* SmartPhone USB Sync */
  	{ USB_DEVICE(0x0BB4, 0x0A55) }, /* SmartPhone USB Sync */
  	{ USB_DEVICE(0x0BB4, 0x0A56) }, /* SmartPhone USB Sync */
  	{ USB_DEVICE(0x0BB4, 0x0A57) }, /* SmartPhone USB Sync */
  	{ USB_DEVICE(0x0BB4, 0x0A58) }, /* SmartPhone USB Sync */
  	{ USB_DEVICE(0x0BB4, 0x0A59) }, /* SmartPhone USB Sync */
  	{ USB_DEVICE(0x0BB4, 0x0A5A) }, /* SmartPhone USB Sync */
  	{ USB_DEVICE(0x0BB4, 0x0A5B) }, /* SmartPhone USB Sync */
  	{ USB_DEVICE(0x0BB4, 0x0A5C) }, /* SmartPhone USB Sync */
  	{ USB_DEVICE(0x0BB4, 0x0A5D) }, /* SmartPhone USB Sync */
  	{ USB_DEVICE(0x0BB4, 0x0A5E) }, /* SmartPhone USB Sync */
  	{ USB_DEVICE(0x0BB4, 0x0A5F) }, /* SmartPhone USB Sync */
  	{ USB_DEVICE(0x0BB4, 0x0A60) }, /* SmartPhone USB Sync */
  	{ USB_DEVICE(0x0BB4, 0x0A61) }, /* SmartPhone USB Sync */
  	{ USB_DEVICE(0x0BB4, 0x0A62) }, /* SmartPhone USB Sync */
  	{ USB_DEVICE(0x0BB4, 0x0A63) }, /* SmartPhone USB Sync */
  	{ USB_DEVICE(0x0BB4, 0x0A64) }, /* SmartPhone USB Sync */
  	{ USB_DEVICE(0x0BB4, 0x0A65) }, /* SmartPhone USB Sync */
  	{ USB_DEVICE(0x0BB4, 0x0A66) }, /* SmartPhone USB Sync */
  	{ USB_DEVICE(0x0BB4, 0x0A67) }, /* SmartPhone USB Sync */
  	{ USB_DEVICE(0x0BB4, 0x0A68) }, /* SmartPhone USB Sync */
  	{ USB_DEVICE(0x0BB4, 0x0A69) }, /* SmartPhone USB Sync */
  	{ USB_DEVICE(0x0BB4, 0x0A6A) }, /* SmartPhone USB Sync */
  	{ USB_DEVICE(0x0BB4, 0x0A6B) }, /* SmartPhone USB Sync */
  	{ USB_DEVICE(0x0BB4, 0x0A6C) }, /* SmartPhone USB Sync */
  	{ USB_DEVICE(0x0BB4, 0x0A6D) }, /* SmartPhone USB Sync */
  	{ USB_DEVICE(0x0BB4, 0x0A6E) }, /* SmartPhone USB Sync */
  	{ USB_DEVICE(0x0BB4, 0x0A6F) }, /* SmartPhone USB Sync */
  	{ USB_DEVICE(0x0BB4, 0x0A70) }, /* SmartPhone USB Sync */
  	{ USB_DEVICE(0x0BB4, 0x0A71) }, /* SmartPhone USB Sync */
  	{ USB_DEVICE(0x0BB4, 0x0A72) }, /* SmartPhone USB Sync */
  	{ USB_DEVICE(0x0BB4, 0x0A73) }, /* SmartPhone USB Sync */
  	{ USB_DEVICE(0x0BB4, 0x0A74) }, /* SmartPhone USB Sync */
  	{ USB_DEVICE(0x0BB4, 0x0A75) }, /* SmartPhone USB Sync */
  	{ USB_DEVICE(0x0BB4, 0x0A76) }, /* SmartPhone USB Sync */
  	{ USB_DEVICE(0x0BB4, 0x0A77) }, /* SmartPhone USB Sync */
  	{ USB_DEVICE(0x0BB4, 0x0A78) }, /* SmartPhone USB Sync */
  	{ USB_DEVICE(0x0BB4, 0x0A79) }, /* SmartPhone USB Sync */
  	{ USB_DEVICE(0x0BB4, 0x0A7A) }, /* SmartPhone USB Sync */
  	{ USB_DEVICE(0x0BB4, 0x0A7B) }, /* SmartPhone USB Sync */
  	{ USB_DEVICE(0x0BB4, 0x0A7C) }, /* SmartPhone USB Sync */
  	{ USB_DEVICE(0x0BB4, 0x0A7D) }, /* SmartPhone USB Sync */
  	{ USB_DEVICE(0x0BB4, 0x0A7E) }, /* SmartPhone USB Sync */
  	{ USB_DEVICE(0x0BB4, 0x0A7F) }, /* SmartPhone USB Sync */
  	{ USB_DEVICE(0x0BB4, 0x0A80) }, /* SmartPhone USB Sync */
  	{ USB_DEVICE(0x0BB4, 0x0A81) }, /* SmartPhone USB Sync */
  	{ USB_DEVICE(0x0BB4, 0x0A82) }, /* SmartPhone USB Sync */
  	{ USB_DEVICE(0x0BB4, 0x0A83) }, /* SmartPhone USB Sync */
  	{ USB_DEVICE(0x0BB4, 0x0A84) }, /* SmartPhone USB Sync */
  	{ USB_DEVICE(0x0BB4, 0x0A85) }, /* SmartPhone USB Sync */
  	{ USB_DEVICE(0x0BB4, 0x0A86) }, /* SmartPhone USB Sync */
  	{ USB_DEVICE(0x0BB4, 0x0A87) }, /* SmartPhone USB Sync */
  	{ USB_DEVICE(0x0BB4, 0x0A88) }, /* SmartPhone USB Sync */
  	{ USB_DEVICE(0x0BB4, 0x0A89) }, /* SmartPhone USB Sync */
  	{ USB_DEVICE(0x0BB4, 0x0A8A) }, /* SmartPhone USB Sync */
  	{ USB_DEVICE(0x0BB4, 0x0A8B) }, /* SmartPhone USB Sync */
  	{ USB_DEVICE(0x0BB4, 0x0A8C) }, /* SmartPhone USB Sync */
  	{ USB_DEVICE(0x0BB4, 0x0A8D) }, /* SmartPhone USB Sync */
  	{ USB_DEVICE(0x0BB4, 0x0A8E) }, /* SmartPhone USB Sync */
  	{ USB_DEVICE(0x0BB4, 0x0A8F) }, /* SmartPhone USB Sync */
  	{ USB_DEVICE(0x0BB4, 0x0A90) }, /* SmartPhone USB Sync */
  	{ USB_DEVICE(0x0BB4, 0x0A91) }, /* SmartPhone USB Sync */
  	{ USB_DEVICE(0x0BB4, 0x0A92) }, /* SmartPhone USB Sync */
  	{ USB_DEVICE(0x0BB4, 0x0A93) }, /* SmartPhone USB Sync */
  	{ USB_DEVICE(0x0BB4, 0x0A94) }, /* SmartPhone USB Sync */
  	{ USB_DEVICE(0x0BB4, 0x0A95) }, /* SmartPhone USB Sync */
  	{ USB_DEVICE(0x0BB4, 0x0A96) }, /* SmartPhone USB Sync */
  	{ USB_DEVICE(0x0BB4, 0x0A97) }, /* SmartPhone USB Sync */
  	{ USB_DEVICE(0x0BB4, 0x0A98) }, /* SmartPhone USB Sync */
  	{ USB_DEVICE(0x0BB4, 0x0A99) }, /* SmartPhone USB Sync */
  	{ USB_DEVICE(0x0BB4, 0x0A9A) }, /* SmartPhone USB Sync */
  	{ USB_DEVICE(0x0BB4, 0x0A9B) }, /* SmartPhone USB Sync */
  	{ USB_DEVICE(0x0BB4, 0x0A9C) }, /* SmartPhone USB Sync */
  	{ USB_DEVICE(0x0BB4, 0x0A9D) }, /* SmartPhone USB Sync */
  	{ USB_DEVICE(0x0BB4, 0x0A9E) }, /* SmartPhone USB Sync */
  	{ USB_DEVICE(0x0BB4, 0x0A9F) }, /* SmartPhone USB Sync */
1b495f753   Matthias Urlichs   USB: another devi...
428
  	{ USB_DEVICE(0x0BB4, 0x0BCE) }, /* "High Tech Computer Corp" */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
429
  	{ USB_DEVICE(0x0BF8, 0x1001) }, /* Fujitsu Siemens Computers USB Sync */
eb3c5ed86   David Eriksson   [PATCH] USB: Impr...
430
  	{ USB_DEVICE(0x0C44, 0x03A2) }, /* Motorola iDEN Smartphone */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
431
  	{ USB_DEVICE(0x0C8E, 0x6000) }, /* Cesscom Luxian Series */
96de0e252   Jan Engelhardt   Convert files to ...
432
  	{ USB_DEVICE(0x0CAD, 0x9001) }, /* Motorola PowerPad Pocket PC Device */
eb3c5ed86   David Eriksson   [PATCH] USB: Impr...
433
434
435
436
437
438
439
  	{ USB_DEVICE(0x0F4E, 0x0200) }, /* Freedom Scientific USB Sync */
  	{ USB_DEVICE(0x0F98, 0x0201) }, /* Cyberbank USB Sync */
  	{ USB_DEVICE(0x0FB8, 0x3001) }, /* Wistron USB Sync */
  	{ USB_DEVICE(0x0FB8, 0x3002) }, /* Wistron USB Sync */
  	{ USB_DEVICE(0x0FB8, 0x3003) }, /* Wistron USB Sync */
  	{ USB_DEVICE(0x0FB8, 0x4001) }, /* Wistron USB Sync */
  	{ USB_DEVICE(0x1066, 0x00CE) }, /* E-TEN USB Sync */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
440
441
442
443
  	{ USB_DEVICE(0x1066, 0x0300) }, /* E-TEN P3XX Pocket PC */
  	{ USB_DEVICE(0x1066, 0x0500) }, /* E-TEN P5XX Pocket PC */
  	{ USB_DEVICE(0x1066, 0x0600) }, /* E-TEN P6XX Pocket PC */
  	{ USB_DEVICE(0x1066, 0x0700) }, /* E-TEN P7XX Pocket PC */
eb3c5ed86   David Eriksson   [PATCH] USB: Impr...
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
  	{ USB_DEVICE(0x1114, 0x0001) }, /* Psion Teklogix Sync 753x */
  	{ USB_DEVICE(0x1114, 0x0004) }, /* Psion Teklogix Sync netBookPro */
  	{ USB_DEVICE(0x1114, 0x0006) }, /* Psion Teklogix Sync 7525 */
  	{ USB_DEVICE(0x1182, 0x1388) }, /* VES USB Sync */
  	{ USB_DEVICE(0x11D9, 0x1002) }, /* Rugged Pocket PC 2003 */
  	{ USB_DEVICE(0x11D9, 0x1003) }, /* Rugged Pocket PC 2003 */
  	{ USB_DEVICE(0x1231, 0xCE01) }, /* USB Sync 03 */
  	{ USB_DEVICE(0x1231, 0xCE02) }, /* USB Sync 03 */
  	{ USB_DEVICE(0x1690, 0x0601) }, /* Askey USB Sync */
  	{ USB_DEVICE(0x22B8, 0x4204) }, /* Motorola MPx200 Smartphone */
  	{ USB_DEVICE(0x22B8, 0x4214) }, /* Motorola MPc GSM */
  	{ USB_DEVICE(0x22B8, 0x4224) }, /* Motorola MPx220 Smartphone */
  	{ USB_DEVICE(0x22B8, 0x4234) }, /* Motorola MPc CDMA */
  	{ USB_DEVICE(0x22B8, 0x4244) }, /* Motorola MPx100 Smartphone */
  	{ USB_DEVICE(0x3340, 0x011C) }, /* Mio DigiWalker PPC StrongARM */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
459
460
  	{ USB_DEVICE(0x3340, 0x0326) }, /* Mio DigiWalker 338 */
  	{ USB_DEVICE(0x3340, 0x0426) }, /* Mio DigiWalker 338 */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
461
  	{ USB_DEVICE(0x3340, 0x043A) }, /* Mio DigiWalker USB Sync */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
462
  	{ USB_DEVICE(0x3340, 0x051C) }, /* MiTAC USB Sync 528 */
eb3c5ed86   David Eriksson   [PATCH] USB: Impr...
463
464
465
466
467
468
469
  	{ USB_DEVICE(0x3340, 0x053A) }, /* Mio DigiWalker SmartPhone USB Sync */
  	{ USB_DEVICE(0x3340, 0x071C) }, /* MiTAC USB Sync */
  	{ USB_DEVICE(0x3340, 0x0B1C) }, /* Generic PPC StrongARM */
  	{ USB_DEVICE(0x3340, 0x0E3A) }, /* Generic PPC USB Sync */
  	{ USB_DEVICE(0x3340, 0x0F1C) }, /* Itautec USB Sync */
  	{ USB_DEVICE(0x3340, 0x0F3A) }, /* Generic SmartPhone USB Sync */
  	{ USB_DEVICE(0x3340, 0x1326) }, /* Itautec USB Sync */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
470
  	{ USB_DEVICE(0x3340, 0x191C) }, /* YAKUMO USB Sync */
eb3c5ed86   David Eriksson   [PATCH] USB: Impr...
471
472
473
474
  	{ USB_DEVICE(0x3340, 0x2326) }, /* Vobis USB Sync */
  	{ USB_DEVICE(0x3340, 0x3326) }, /* MEDION Winodws Moble USB Sync */
  	{ USB_DEVICE(0x3708, 0x20CE) }, /* Legend USB Sync */
  	{ USB_DEVICE(0x3708, 0x21CE) }, /* Lenovo USB Sync */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
475
476
477
478
  	{ USB_DEVICE(0x4113, 0x0210) }, /* Mobile Media Technology USB Sync */
  	{ USB_DEVICE(0x4113, 0x0211) }, /* Mobile Media Technology USB Sync */
  	{ USB_DEVICE(0x4113, 0x0400) }, /* Mobile Media Technology USB Sync */
  	{ USB_DEVICE(0x4113, 0x0410) }, /* Mobile Media Technology USB Sync */
eb3c5ed86   David Eriksson   [PATCH] USB: Impr...
479
480
481
482
483
484
485
486
487
  	{ USB_DEVICE(0x413C, 0x4001) }, /* Dell Axim USB Sync */
  	{ USB_DEVICE(0x413C, 0x4002) }, /* Dell Axim USB Sync */
  	{ USB_DEVICE(0x413C, 0x4003) }, /* Dell Axim USB Sync */
  	{ USB_DEVICE(0x413C, 0x4004) }, /* Dell Axim USB Sync */
  	{ USB_DEVICE(0x413C, 0x4005) }, /* Dell Axim USB Sync */
  	{ USB_DEVICE(0x413C, 0x4006) }, /* Dell Axim USB Sync */
  	{ USB_DEVICE(0x413C, 0x4007) }, /* Dell Axim USB Sync */
  	{ USB_DEVICE(0x413C, 0x4008) }, /* Dell Axim USB Sync */
  	{ USB_DEVICE(0x413C, 0x4009) }, /* Dell Axim USB Sync */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
488
  	{ USB_DEVICE(0x4505, 0x0010) }, /* Smartphone */
eb3c5ed86   David Eriksson   [PATCH] USB: Impr...
489
  	{ USB_DEVICE(0x5E04, 0xCE00) }, /* SAGEM Wireless Assistant */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
490
491
  	{ }                             /* Terminating entry */
  };
eb6215ccd   Alan Cox   ipaq: Coding style
492
  MODULE_DEVICE_TABLE(usb, ipaq_id_table);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
493

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
494
495
  
  /* All of the device info needed for the Compaq iPAQ */
ea65370d0   Greg Kroah-Hartman   [PATCH] USB Seria...
496
  static struct usb_serial_driver ipaq_device = {
18fcac353   Greg Kroah-Hartman   [PATCH] USB Seria...
497
498
  	.driver = {
  		.owner =	THIS_MODULE,
269bda1c1   Greg Kroah-Hartman   [PATCH] USB Seria...
499
  		.name =		"ipaq",
18fcac353   Greg Kroah-Hartman   [PATCH] USB Seria...
500
  	},
269bda1c1   Greg Kroah-Hartman   [PATCH] USB Seria...
501
  	.description =		"PocketPC PDA",
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
502
  	.id_table =		ipaq_id_table,
6b6962f9c   Johan Hovold   USB: ipaq: reimpl...
503
504
  	.bulk_in_size =		256,
  	.bulk_out_size =	256,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
505
  	.open =			ipaq_open,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
506
  	.attach =		ipaq_startup,
1b8fb4141   Mark Ellis   USB: ipaq: handle...
507
  	.calc_num_ports =	ipaq_calc_num_ports,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
508
  };
7dbe24609   Alan Stern   usb-serial: use n...
509
510
511
  static struct usb_serial_driver * const serial_drivers[] = {
  	&ipaq_device, NULL
  };
95da310e6   Alan Cox   usb_serial: API a...
512
  static int ipaq_open(struct tty_struct *tty,
a509a7e47   Alan Cox   tty: USB does not...
513
  			struct usb_serial_port *port)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
514
515
  {
  	struct usb_serial	*serial = port->serial;
6b6962f9c   Johan Hovold   USB: ipaq: reimpl...
516
  	int			result = 0;
b33488eb5   Frank Gevaerts   [PATCH] USB: ipaq...
517
  	int			retries = connect_retries;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
518

b33488eb5   Frank Gevaerts   [PATCH] USB: ipaq...
519
  	msleep(1000*initial_wait);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
520
521
522
523
524
525
526
527
  
  	/*
  	 * Send out control message observed in win98 sniffs. Not sure what
  	 * it does, but from empirical observations, it seems that the device
  	 * will start the chat sequence once one of these messages gets
  	 * through. Since this has a reasonably high failure rate, we retry
  	 * several times.
  	 */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
528
529
530
531
  	while (retries--) {
  		result = usb_control_msg(serial->dev,
  				usb_sndctrlpipe(serial->dev, 0), 0x22, 0x21,
  				0x1, 0, NULL, 0, 100);
014aa2a3c   Luiz Fernando N. Capitulino   USB: ipaq: minor ...
532
533
  		if (!result)
  			break;
b33488eb5   Frank Gevaerts   [PATCH] USB: ipaq...
534
  		msleep(1000);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
535
  	}
014aa2a3c   Luiz Fernando N. Capitulino   USB: ipaq: minor ...
536
  	if (!retries && result) {
6b6962f9c   Johan Hovold   USB: ipaq: reimpl...
537
538
539
540
  		dev_err(&port->dev, "%s - failed doing control urb, error %d
  ",
  							__func__, result);
  		return result;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
541
  	}
6b6962f9c   Johan Hovold   USB: ipaq: reimpl...
542
  	return usb_serial_generic_open(tty, port);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
543
  }
1b8fb4141   Mark Ellis   USB: ipaq: handle...
544
545
546
547
548
549
550
551
  static int ipaq_calc_num_ports(struct usb_serial *serial)
  {
  	/*
  	 * some devices have 3 endpoints, the 3rd of which
  	 * must be ignored as it would make the core
  	 * create a second port which oopses when used
  	 */
  	int ipaq_num_ports = 1;
f73e1ffa2   Greg Kroah-Hartman   USB: ipaq.c: remo...
552
553
  	dev_dbg(&serial->dev->dev, "%s - numberofendpoints: %d
  ", __func__,
1b8fb4141   Mark Ellis   USB: ipaq: handle...
554
555
556
557
558
559
560
561
562
563
564
565
566
567
  		(int)serial->interface->cur_altsetting->desc.bNumEndpoints);
  
  	/*
  	 * a few devices have 4 endpoints, seemingly Yakuma devices,
  	 * and we need the second pair, so let them have 2 ports
  	 *
  	 * TODO: can we drop port 1 ?
  	 */
  	if (serial->interface->cur_altsetting->desc.bNumEndpoints > 3) {
  		ipaq_num_ports = 2;
  	}
  
  	return ipaq_num_ports;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
568
569
  static int ipaq_startup(struct usb_serial *serial)
  {
06bad89da   Alan Stern   USB: ipaq: fix oo...
570
571
572
573
574
575
576
  	/* Some of the devices in ipaq_id_table[] are composite, and we
  	 * shouldn't bind to all the interfaces.  This test will rule out
  	 * some obviously invalid possibilities.
  	 */
  	if (serial->num_bulk_in < serial->num_ports ||
  			serial->num_bulk_out < serial->num_ports)
  		return -ENODEV;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
577
  	if (serial->dev->actconfig->desc.bConfigurationValue != 1) {
1b8fb4141   Mark Ellis   USB: ipaq: handle...
578
579
580
581
  		/*
  		 * FIXME: HP iPaq rx3715, possibly others, have 1 config that
  		 * is labeled as 2
  		 */
194343d93   Greg Kroah-Hartman   USB: remove use o...
582
583
  		dev_err(&serial->dev->dev, "active config #%d != 1 ??
  ",
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
584
585
586
  			serial->dev->actconfig->desc.bConfigurationValue);
  		return -ENODEV;
  	}
1b8fb4141   Mark Ellis   USB: ipaq: handle...
587

f73e1ffa2   Greg Kroah-Hartman   USB: ipaq.c: remo...
588
589
590
591
  	dev_dbg(&serial->dev->dev,
  		"%s - iPAQ module configured for %d ports
  ", __func__,
  		serial->num_ports);
1b8fb4141   Mark Ellis   USB: ipaq: handle...
592

eb6215ccd   Alan Cox   ipaq: Coding style
593
  	return usb_reset_configuration(serial->dev);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
594
  }
68e241134   Greg Kroah-Hartman   USB: serial: rewo...
595
  module_usb_serial_driver(serial_drivers, ipaq_id_table);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
596

eb6215ccd   Alan Cox   ipaq: Coding style
597
598
  MODULE_AUTHOR(DRIVER_AUTHOR);
  MODULE_DESCRIPTION(DRIVER_DESC);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
599
  MODULE_LICENSE("GPL");
b33488eb5   Frank Gevaerts   [PATCH] USB: ipaq...
600
  module_param(connect_retries, int, S_IRUGO|S_IWUSR);
eb6215ccd   Alan Cox   ipaq: Coding style
601
602
  MODULE_PARM_DESC(connect_retries,
  		"Maximum number of connect retries (one second each)");
b33488eb5   Frank Gevaerts   [PATCH] USB: ipaq...
603
604
  
  module_param(initial_wait, int, S_IRUGO|S_IWUSR);
eb6215ccd   Alan Cox   ipaq: Coding style
605
606
  MODULE_PARM_DESC(initial_wait,
  		"Time to wait before attempting a connection (in seconds)");