diff options
author | Linus Torvalds <torvalds@ppc970.osdl.org> | 2005-04-16 18:20:36 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@ppc970.osdl.org> | 2005-04-16 18:20:36 -0400 |
commit | 1da177e4c3f41524e886b7f1b8a0c1fc7321cac2 (patch) | |
tree | 0bba044c4ce775e45a88a51686b5d9f90697ea9d /drivers/usb/serial/ipaq.c |
Linux-2.6.12-rc2v2.6.12-rc2
Initial git repository build. I'm not bothering with the full history,
even though we have it. We can create a separate "historical" git
archive of that later if we want to, and in the meantime it's about
3.2GB when imported into git - space that would just make the early
git days unnecessarily complicated, when we don't have a lot of good
infrastructure for it.
Let it rip!
Diffstat (limited to 'drivers/usb/serial/ipaq.c')
-rw-r--r-- | drivers/usb/serial/ipaq.c | 973 |
1 files changed, 973 insertions, 0 deletions
diff --git a/drivers/usb/serial/ipaq.c b/drivers/usb/serial/ipaq.c new file mode 100644 index 000000000000..3bd69c4ef24b --- /dev/null +++ b/drivers/usb/serial/ipaq.c | |||
@@ -0,0 +1,973 @@ | |||
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/config.h> | ||
48 | #include <linux/kernel.h> | ||
49 | #include <linux/errno.h> | ||
50 | #include <linux/init.h> | ||
51 | #include <linux/slab.h> | ||
52 | #include <linux/tty.h> | ||
53 | #include <linux/tty_driver.h> | ||
54 | #include <linux/tty_flip.h> | ||
55 | #include <linux/module.h> | ||
56 | #include <linux/spinlock.h> | ||
57 | #include <asm/uaccess.h> | ||
58 | #include <linux/usb.h> | ||
59 | #include "usb-serial.h" | ||
60 | #include "ipaq.h" | ||
61 | |||
62 | #define KP_RETRIES 100 | ||
63 | |||
64 | /* | ||
65 | * Version Information | ||
66 | */ | ||
67 | |||
68 | #define DRIVER_VERSION "v0.5" | ||
69 | #define DRIVER_AUTHOR "Ganesh Varadarajan <ganesh@veritas.com>" | ||
70 | #define DRIVER_DESC "USB PocketPC PDA driver" | ||
71 | |||
72 | static __u16 product, vendor; | ||
73 | static int debug; | ||
74 | |||
75 | /* Function prototypes for an ipaq */ | ||
76 | static int ipaq_open (struct usb_serial_port *port, struct file *filp); | ||
77 | static void ipaq_close (struct usb_serial_port *port, struct file *filp); | ||
78 | static int ipaq_startup (struct usb_serial *serial); | ||
79 | static void ipaq_shutdown (struct usb_serial *serial); | ||
80 | static int ipaq_write(struct usb_serial_port *port, const unsigned char *buf, | ||
81 | int count); | ||
82 | static int ipaq_write_bulk(struct usb_serial_port *port, const unsigned char *buf, | ||
83 | int count); | ||
84 | static void ipaq_write_gather(struct usb_serial_port *port); | ||
85 | static void ipaq_read_bulk_callback (struct urb *urb, struct pt_regs *regs); | ||
86 | static void ipaq_write_bulk_callback(struct urb *urb, struct pt_regs *regs); | ||
87 | static int ipaq_write_room(struct usb_serial_port *port); | ||
88 | static int ipaq_chars_in_buffer(struct usb_serial_port *port); | ||
89 | static void ipaq_destroy_lists(struct usb_serial_port *port); | ||
90 | |||
91 | |||
92 | static struct usb_device_id ipaq_id_table [] = { | ||
93 | /* The first entry is a placeholder for the insmod-specified device */ | ||
94 | { USB_DEVICE(0x049F, 0x0003) }, | ||
95 | { USB_DEVICE(0x1690, 0x0601) }, /* Askey USB Sync */ | ||
96 | { USB_DEVICE(0x0960, 0x0065) }, /* BCOM USB Sync 0065 */ | ||
97 | { USB_DEVICE(0x0960, 0x0066) }, /* BCOM USB Sync 0066 */ | ||
98 | { USB_DEVICE(0x0960, 0x0067) }, /* BCOM USB Sync 0067 */ | ||
99 | { USB_DEVICE(0x07CF, 0x2001) }, /* CASIO USB Sync 2001 */ | ||
100 | { USB_DEVICE(0x07CF, 0x2002) }, /* CASIO USB Sync 2002 */ | ||
101 | { USB_DEVICE(0x07CF, 0x2003) }, /* CASIO USB Sync 2003 */ | ||
102 | { USB_DEVICE(0x049F, 0x0003) }, /* Compaq iPAQ USB Sync */ | ||
103 | { USB_DEVICE(0x049F, 0x0032) }, /* Compaq iPAQ USB Sync */ | ||
104 | { USB_DEVICE(0x413C, 0x4001) }, /* Dell Axim USB Sync */ | ||
105 | { USB_DEVICE(0x413C, 0x4002) }, /* Dell Axim USB Sync */ | ||
106 | { USB_DEVICE(0x413C, 0x4003) }, /* Dell Axim USB Sync */ | ||
107 | { USB_DEVICE(0x413C, 0x4004) }, /* Dell Axim USB Sync */ | ||
108 | { USB_DEVICE(0x413C, 0x4005) }, /* Dell Axim USB Sync */ | ||
109 | { USB_DEVICE(0x413C, 0x4006) }, /* Dell Axim USB Sync */ | ||
110 | { USB_DEVICE(0x413C, 0x4007) }, /* Dell Axim USB Sync */ | ||
111 | { USB_DEVICE(0x413C, 0x4008) }, /* Dell Axim USB Sync */ | ||
112 | { USB_DEVICE(0x413C, 0x4009) }, /* Dell Axim USB Sync */ | ||
113 | { USB_DEVICE(0x03F0, 0x1016) }, /* HP USB Sync */ | ||
114 | { USB_DEVICE(0x03F0, 0x1116) }, /* HP USB Sync 1611 */ | ||
115 | { USB_DEVICE(0x03F0, 0x1216) }, /* HP USB Sync 1612 */ | ||
116 | { USB_DEVICE(0x03F0, 0x2016) }, /* HP USB Sync 1620 */ | ||
117 | { USB_DEVICE(0x03F0, 0x2116) }, /* HP USB Sync 1621 */ | ||
118 | { USB_DEVICE(0x03F0, 0x2216) }, /* HP USB Sync 1622 */ | ||
119 | { USB_DEVICE(0x03F0, 0x3016) }, /* HP USB Sync 1630 */ | ||
120 | { USB_DEVICE(0x03F0, 0x3116) }, /* HP USB Sync 1631 */ | ||
121 | { USB_DEVICE(0x03F0, 0x3216) }, /* HP USB Sync 1632 */ | ||
122 | { USB_DEVICE(0x03F0, 0x4016) }, /* HP USB Sync 1640 */ | ||
123 | { USB_DEVICE(0x03F0, 0x4116) }, /* HP USB Sync 1641 */ | ||
124 | { USB_DEVICE(0x03F0, 0x4216) }, /* HP USB Sync 1642 */ | ||
125 | { USB_DEVICE(0x03F0, 0x5016) }, /* HP USB Sync 1650 */ | ||
126 | { USB_DEVICE(0x03F0, 0x5116) }, /* HP USB Sync 1651 */ | ||
127 | { USB_DEVICE(0x03F0, 0x5216) }, /* HP USB Sync 1652 */ | ||
128 | { USB_DEVICE(0x094B, 0x0001) }, /* Linkup Systems USB Sync */ | ||
129 | { USB_DEVICE(0x045E, 0x0400) }, /* Windows Powered Pocket PC 2002 */ | ||
130 | { USB_DEVICE(0x045E, 0x0401) }, /* Windows Powered Pocket PC 2002 */ | ||
131 | { USB_DEVICE(0x045E, 0x0402) }, /* Windows Powered Pocket PC 2002 */ | ||
132 | { USB_DEVICE(0x045E, 0x0403) }, /* Windows Powered Pocket PC 2002 */ | ||
133 | { USB_DEVICE(0x045E, 0x0404) }, /* Windows Powered Pocket PC 2002 */ | ||
134 | { USB_DEVICE(0x045E, 0x0405) }, /* Windows Powered Pocket PC 2002 */ | ||
135 | { USB_DEVICE(0x045E, 0x0406) }, /* Windows Powered Pocket PC 2002 */ | ||
136 | { USB_DEVICE(0x045E, 0x0407) }, /* Windows Powered Pocket PC 2002 */ | ||
137 | { USB_DEVICE(0x045E, 0x0408) }, /* Windows Powered Pocket PC 2002 */ | ||
138 | { USB_DEVICE(0x045E, 0x0409) }, /* Windows Powered Pocket PC 2002 */ | ||
139 | { USB_DEVICE(0x045E, 0x040A) }, /* Windows Powered Pocket PC 2002 */ | ||
140 | { USB_DEVICE(0x045E, 0x040B) }, /* Windows Powered Pocket PC 2002 */ | ||
141 | { USB_DEVICE(0x045E, 0x040C) }, /* Windows Powered Pocket PC 2002 */ | ||
142 | { USB_DEVICE(0x045E, 0x040D) }, /* Windows Powered Pocket PC 2002 */ | ||
143 | { USB_DEVICE(0x045E, 0x040E) }, /* Windows Powered Pocket PC 2002 */ | ||
144 | { USB_DEVICE(0x045E, 0x040F) }, /* Windows Powered Pocket PC 2002 */ | ||
145 | { USB_DEVICE(0x045E, 0x0410) }, /* Windows Powered Pocket PC 2002 */ | ||
146 | { USB_DEVICE(0x045E, 0x0411) }, /* Windows Powered Pocket PC 2002 */ | ||
147 | { USB_DEVICE(0x045E, 0x0412) }, /* Windows Powered Pocket PC 2002 */ | ||
148 | { USB_DEVICE(0x045E, 0x0413) }, /* Windows Powered Pocket PC 2002 */ | ||
149 | { USB_DEVICE(0x045E, 0x0414) }, /* Windows Powered Pocket PC 2002 */ | ||
150 | { USB_DEVICE(0x045E, 0x0415) }, /* Windows Powered Pocket PC 2002 */ | ||
151 | { USB_DEVICE(0x045E, 0x0416) }, /* Windows Powered Pocket PC 2002 */ | ||
152 | { USB_DEVICE(0x045E, 0x0417) }, /* Windows Powered Pocket PC 2002 */ | ||
153 | { USB_DEVICE(0x045E, 0x0432) }, /* Windows Powered Pocket PC 2003 */ | ||
154 | { USB_DEVICE(0x045E, 0x0433) }, /* Windows Powered Pocket PC 2003 */ | ||
155 | { USB_DEVICE(0x045E, 0x0434) }, /* Windows Powered Pocket PC 2003 */ | ||
156 | { USB_DEVICE(0x045E, 0x0435) }, /* Windows Powered Pocket PC 2003 */ | ||
157 | { USB_DEVICE(0x045E, 0x0436) }, /* Windows Powered Pocket PC 2003 */ | ||
158 | { USB_DEVICE(0x045E, 0x0437) }, /* Windows Powered Pocket PC 2003 */ | ||
159 | { USB_DEVICE(0x045E, 0x0438) }, /* Windows Powered Pocket PC 2003 */ | ||
160 | { USB_DEVICE(0x045E, 0x0439) }, /* Windows Powered Pocket PC 2003 */ | ||
161 | { USB_DEVICE(0x045E, 0x043A) }, /* Windows Powered Pocket PC 2003 */ | ||
162 | { USB_DEVICE(0x045E, 0x043B) }, /* Windows Powered Pocket PC 2003 */ | ||
163 | { USB_DEVICE(0x045E, 0x043C) }, /* Windows Powered Pocket PC 2003 */ | ||
164 | { USB_DEVICE(0x045E, 0x043D) }, /* Windows Powered Pocket PC 2003 */ | ||
165 | { USB_DEVICE(0x045E, 0x043E) }, /* Windows Powered Pocket PC 2003 */ | ||
166 | { USB_DEVICE(0x045E, 0x043F) }, /* Windows Powered Pocket PC 2003 */ | ||
167 | { USB_DEVICE(0x045E, 0x0440) }, /* Windows Powered Pocket PC 2003 */ | ||
168 | { USB_DEVICE(0x045E, 0x0441) }, /* Windows Powered Pocket PC 2003 */ | ||
169 | { USB_DEVICE(0x045E, 0x0442) }, /* Windows Powered Pocket PC 2003 */ | ||
170 | { USB_DEVICE(0x045E, 0x0443) }, /* Windows Powered Pocket PC 2003 */ | ||
171 | { USB_DEVICE(0x045E, 0x0444) }, /* Windows Powered Pocket PC 2003 */ | ||
172 | { USB_DEVICE(0x045E, 0x0445) }, /* Windows Powered Pocket PC 2003 */ | ||
173 | { USB_DEVICE(0x045E, 0x0446) }, /* Windows Powered Pocket PC 2003 */ | ||
174 | { USB_DEVICE(0x045E, 0x0447) }, /* Windows Powered Pocket PC 2003 */ | ||
175 | { USB_DEVICE(0x045E, 0x0448) }, /* Windows Powered Pocket PC 2003 */ | ||
176 | { USB_DEVICE(0x045E, 0x0449) }, /* Windows Powered Pocket PC 2003 */ | ||
177 | { USB_DEVICE(0x045E, 0x044A) }, /* Windows Powered Pocket PC 2003 */ | ||
178 | { USB_DEVICE(0x045E, 0x044B) }, /* Windows Powered Pocket PC 2003 */ | ||
179 | { USB_DEVICE(0x045E, 0x044C) }, /* Windows Powered Pocket PC 2003 */ | ||
180 | { USB_DEVICE(0x045E, 0x044D) }, /* Windows Powered Pocket PC 2003 */ | ||
181 | { USB_DEVICE(0x045E, 0x044E) }, /* Windows Powered Pocket PC 2003 */ | ||
182 | { USB_DEVICE(0x045E, 0x044F) }, /* Windows Powered Pocket PC 2003 */ | ||
183 | { USB_DEVICE(0x045E, 0x0450) }, /* Windows Powered Pocket PC 2003 */ | ||
184 | { USB_DEVICE(0x045E, 0x0451) }, /* Windows Powered Pocket PC 2003 */ | ||
185 | { USB_DEVICE(0x045E, 0x0452) }, /* Windows Powered Pocket PC 2003 */ | ||
186 | { USB_DEVICE(0x045E, 0x0453) }, /* Windows Powered Pocket PC 2003 */ | ||
187 | { USB_DEVICE(0x045E, 0x0454) }, /* Windows Powered Pocket PC 2003 */ | ||
188 | { USB_DEVICE(0x045E, 0x0455) }, /* Windows Powered Pocket PC 2003 */ | ||
189 | { USB_DEVICE(0x045E, 0x0456) }, /* Windows Powered Pocket PC 2003 */ | ||
190 | { USB_DEVICE(0x045E, 0x0457) }, /* Windows Powered Pocket PC 2003 */ | ||
191 | { USB_DEVICE(0x045E, 0x0458) }, /* Windows Powered Pocket PC 2003 */ | ||
192 | { USB_DEVICE(0x045E, 0x0459) }, /* Windows Powered Pocket PC 2003 */ | ||
193 | { USB_DEVICE(0x045E, 0x045A) }, /* Windows Powered Pocket PC 2003 */ | ||
194 | { USB_DEVICE(0x045E, 0x045B) }, /* Windows Powered Pocket PC 2003 */ | ||
195 | { USB_DEVICE(0x045E, 0x045C) }, /* Windows Powered Pocket PC 2003 */ | ||
196 | { USB_DEVICE(0x045E, 0x045D) }, /* Windows Powered Pocket PC 2003 */ | ||
197 | { USB_DEVICE(0x045E, 0x045E) }, /* Windows Powered Pocket PC 2003 */ | ||
198 | { USB_DEVICE(0x045E, 0x045F) }, /* Windows Powered Pocket PC 2003 */ | ||
199 | { USB_DEVICE(0x045E, 0x0460) }, /* Windows Powered Pocket PC 2003 */ | ||
200 | { USB_DEVICE(0x045E, 0x0461) }, /* Windows Powered Pocket PC 2003 */ | ||
201 | { USB_DEVICE(0x045E, 0x0462) }, /* Windows Powered Pocket PC 2003 */ | ||
202 | { USB_DEVICE(0x045E, 0x0463) }, /* Windows Powered Pocket PC 2003 */ | ||
203 | { USB_DEVICE(0x045E, 0x0464) }, /* Windows Powered Pocket PC 2003 */ | ||
204 | { USB_DEVICE(0x045E, 0x0465) }, /* Windows Powered Pocket PC 2003 */ | ||
205 | { USB_DEVICE(0x045E, 0x0466) }, /* Windows Powered Pocket PC 2003 */ | ||
206 | { USB_DEVICE(0x045E, 0x0467) }, /* Windows Powered Pocket PC 2003 */ | ||
207 | { USB_DEVICE(0x045E, 0x0468) }, /* Windows Powered Pocket PC 2003 */ | ||
208 | { USB_DEVICE(0x045E, 0x0469) }, /* Windows Powered Pocket PC 2003 */ | ||
209 | { USB_DEVICE(0x045E, 0x046A) }, /* Windows Powered Pocket PC 2003 */ | ||
210 | { USB_DEVICE(0x045E, 0x046B) }, /* Windows Powered Pocket PC 2003 */ | ||
211 | { USB_DEVICE(0x045E, 0x046C) }, /* Windows Powered Pocket PC 2003 */ | ||
212 | { USB_DEVICE(0x045E, 0x046D) }, /* Windows Powered Pocket PC 2003 */ | ||
213 | { USB_DEVICE(0x045E, 0x046E) }, /* Windows Powered Pocket PC 2003 */ | ||
214 | { USB_DEVICE(0x045E, 0x046F) }, /* Windows Powered Pocket PC 2003 */ | ||
215 | { USB_DEVICE(0x045E, 0x0470) }, /* Windows Powered Pocket PC 2003 */ | ||
216 | { USB_DEVICE(0x045E, 0x0471) }, /* Windows Powered Pocket PC 2003 */ | ||
217 | { USB_DEVICE(0x045E, 0x0472) }, /* Windows Powered Pocket PC 2003 */ | ||
218 | { USB_DEVICE(0x045E, 0x0473) }, /* Windows Powered Pocket PC 2003 */ | ||
219 | { USB_DEVICE(0x045E, 0x0474) }, /* Windows Powered Pocket PC 2003 */ | ||
220 | { USB_DEVICE(0x045E, 0x0475) }, /* Windows Powered Pocket PC 2003 */ | ||
221 | { USB_DEVICE(0x045E, 0x0476) }, /* Windows Powered Pocket PC 2003 */ | ||
222 | { USB_DEVICE(0x045E, 0x0477) }, /* Windows Powered Pocket PC 2003 */ | ||
223 | { USB_DEVICE(0x045E, 0x0478) }, /* Windows Powered Pocket PC 2003 */ | ||
224 | { USB_DEVICE(0x045E, 0x0479) }, /* Windows Powered Pocket PC 2003 */ | ||
225 | { USB_DEVICE(0x045E, 0x047A) }, /* Windows Powered Pocket PC 2003 */ | ||
226 | { USB_DEVICE(0x045E, 0x047B) }, /* Windows Powered Pocket PC 2003 */ | ||
227 | { USB_DEVICE(0x045E, 0x04C8) }, /* Windows Powered Smartphone 2002 */ | ||
228 | { USB_DEVICE(0x045E, 0x04C9) }, /* Windows Powered Smartphone 2002 */ | ||
229 | { USB_DEVICE(0x045E, 0x04CA) }, /* Windows Powered Smartphone 2002 */ | ||
230 | { USB_DEVICE(0x045E, 0x04CB) }, /* Windows Powered Smartphone 2002 */ | ||
231 | { USB_DEVICE(0x045E, 0x04CC) }, /* Windows Powered Smartphone 2002 */ | ||
232 | { USB_DEVICE(0x045E, 0x04CD) }, /* Windows Powered Smartphone 2002 */ | ||
233 | { USB_DEVICE(0x045E, 0x04CE) }, /* Windows Powered Smartphone 2002 */ | ||
234 | { USB_DEVICE(0x045E, 0x04D7) }, /* Windows Powered Smartphone 2003 */ | ||
235 | { USB_DEVICE(0x045E, 0x04D8) }, /* Windows Powered Smartphone 2003 */ | ||
236 | { USB_DEVICE(0x045E, 0x04D9) }, /* Windows Powered Smartphone 2003 */ | ||
237 | { USB_DEVICE(0x045E, 0x04DA) }, /* Windows Powered Smartphone 2003 */ | ||
238 | { USB_DEVICE(0x045E, 0x04DB) }, /* Windows Powered Smartphone 2003 */ | ||
239 | { USB_DEVICE(0x045E, 0x04DC) }, /* Windows Powered Smartphone 2003 */ | ||
240 | { USB_DEVICE(0x045E, 0x04DD) }, /* Windows Powered Smartphone 2003 */ | ||
241 | { USB_DEVICE(0x045E, 0x04DE) }, /* Windows Powered Smartphone 2003 */ | ||
242 | { USB_DEVICE(0x045E, 0x04DF) }, /* Windows Powered Smartphone 2003 */ | ||
243 | { USB_DEVICE(0x045E, 0x04E0) }, /* Windows Powered Smartphone 2003 */ | ||
244 | { USB_DEVICE(0x045E, 0x04E1) }, /* Windows Powered Smartphone 2003 */ | ||
245 | { USB_DEVICE(0x045E, 0x04E2) }, /* Windows Powered Smartphone 2003 */ | ||
246 | { USB_DEVICE(0x045E, 0x04E3) }, /* Windows Powered Smartphone 2003 */ | ||
247 | { USB_DEVICE(0x045E, 0x04E4) }, /* Windows Powered Smartphone 2003 */ | ||
248 | { USB_DEVICE(0x045E, 0x04E5) }, /* Windows Powered Smartphone 2003 */ | ||
249 | { USB_DEVICE(0x045E, 0x04E6) }, /* Windows Powered Smartphone 2003 */ | ||
250 | { USB_DEVICE(0x045E, 0x04E7) }, /* Windows Powered Smartphone 2003 */ | ||
251 | { USB_DEVICE(0x045E, 0x04E8) }, /* Windows Powered Smartphone 2003 */ | ||
252 | { USB_DEVICE(0x045E, 0x04E9) }, /* Windows Powered Smartphone 2003 */ | ||
253 | { USB_DEVICE(0x045E, 0x04EA) }, /* Windows Powered Smartphone 2003 */ | ||
254 | { USB_DEVICE(0x0961, 0x0010) }, /* Portatec USB Sync */ | ||
255 | { USB_DEVICE(0x5E04, 0xCE00) }, /* SAGEM Wireless Assistant */ | ||
256 | { USB_DEVICE(0x0104, 0x00BE) }, /* Socket USB Sync */ | ||
257 | { USB_DEVICE(0x0930, 0x0700) }, /* TOSHIBA USB Sync 0700 */ | ||
258 | { USB_DEVICE(0x0930, 0x0705) }, /* TOSHIBA Pocket PC e310 */ | ||
259 | { USB_DEVICE(0x0930, 0x0707) }, /* TOSHIBA Pocket PC e330 Series */ | ||
260 | { USB_DEVICE(0x0930, 0x0708) }, /* TOSHIBA Pocket PC e350 Series */ | ||
261 | { USB_DEVICE(0x0930, 0x0706) }, /* TOSHIBA Pocket PC e740 */ | ||
262 | { USB_DEVICE(0x0930, 0x0709) }, /* TOSHIBA Pocket PC e750 Series */ | ||
263 | { USB_DEVICE(0x0930, 0x070A) }, /* TOSHIBA Pocket PC e400 Series */ | ||
264 | { USB_DEVICE(0x0930, 0x070B) }, /* TOSHIBA Pocket PC e800 Series */ | ||
265 | { USB_DEVICE(0x0BB4, 0x00CE) }, /* HTC USB Sync */ | ||
266 | { USB_DEVICE(0x0BB4, 0x0A01) }, /* PocketPC USB Sync */ | ||
267 | { USB_DEVICE(0x0BB4, 0x0A02) }, /* PocketPC USB Sync */ | ||
268 | { USB_DEVICE(0x0BB4, 0x0A03) }, /* PocketPC USB Sync */ | ||
269 | { USB_DEVICE(0x0BB4, 0x0A04) }, /* PocketPC USB Sync */ | ||
270 | { USB_DEVICE(0x0BB4, 0x0A05) }, /* PocketPC USB Sync */ | ||
271 | { USB_DEVICE(0x0BB4, 0x0A06) }, /* PocketPC USB Sync */ | ||
272 | { USB_DEVICE(0x0BB4, 0x0A07) }, /* PocketPC USB Sync */ | ||
273 | { USB_DEVICE(0x0BB4, 0x0A08) }, /* PocketPC USB Sync */ | ||
274 | { USB_DEVICE(0x0BB4, 0x0A09) }, /* PocketPC USB Sync */ | ||
275 | { USB_DEVICE(0x0BB4, 0x0A0A) }, /* PocketPC USB Sync */ | ||
276 | { USB_DEVICE(0x0BB4, 0x0A0B) }, /* PocketPC USB Sync */ | ||
277 | { USB_DEVICE(0x0BB4, 0x0A0C) }, /* PocketPC USB Sync */ | ||
278 | { USB_DEVICE(0x0BB4, 0x0A0D) }, /* PocketPC USB Sync */ | ||
279 | { USB_DEVICE(0x0BB4, 0x0A0E) }, /* PocketPC USB Sync */ | ||
280 | { USB_DEVICE(0x0BB4, 0x0A0F) }, /* PocketPC USB Sync */ | ||
281 | { USB_DEVICE(0x0BB4, 0x0A10) }, /* PocketPC USB Sync */ | ||
282 | { USB_DEVICE(0x0BB4, 0x0A11) }, /* PocketPC USB Sync */ | ||
283 | { USB_DEVICE(0x0BB4, 0x0A12) }, /* PocketPC USB Sync */ | ||
284 | { USB_DEVICE(0x0BB4, 0x0A13) }, /* PocketPC USB Sync */ | ||
285 | { USB_DEVICE(0x0BB4, 0x0A14) }, /* PocketPC USB Sync */ | ||
286 | { USB_DEVICE(0x0BB4, 0x0A15) }, /* PocketPC USB Sync */ | ||
287 | { USB_DEVICE(0x0BB4, 0x0A16) }, /* PocketPC USB Sync */ | ||
288 | { USB_DEVICE(0x0BB4, 0x0A17) }, /* PocketPC USB Sync */ | ||
289 | { USB_DEVICE(0x0BB4, 0x0A18) }, /* PocketPC USB Sync */ | ||
290 | { USB_DEVICE(0x0BB4, 0x0A19) }, /* PocketPC USB Sync */ | ||
291 | { USB_DEVICE(0x0BB4, 0x0A1A) }, /* PocketPC USB Sync */ | ||
292 | { USB_DEVICE(0x0BB4, 0x0A1B) }, /* PocketPC USB Sync */ | ||
293 | { USB_DEVICE(0x0BB4, 0x0A1C) }, /* PocketPC USB Sync */ | ||
294 | { USB_DEVICE(0x0BB4, 0x0A1D) }, /* PocketPC USB Sync */ | ||
295 | { USB_DEVICE(0x0BB4, 0x0A1E) }, /* PocketPC USB Sync */ | ||
296 | { USB_DEVICE(0x0BB4, 0x0A1F) }, /* PocketPC USB Sync */ | ||
297 | { USB_DEVICE(0x0BB4, 0x0A20) }, /* PocketPC USB Sync */ | ||
298 | { USB_DEVICE(0x0BB4, 0x0A21) }, /* PocketPC USB Sync */ | ||
299 | { USB_DEVICE(0x0BB4, 0x0A22) }, /* PocketPC USB Sync */ | ||
300 | { USB_DEVICE(0x0BB4, 0x0A23) }, /* PocketPC USB Sync */ | ||
301 | { USB_DEVICE(0x0BB4, 0x0A24) }, /* PocketPC USB Sync */ | ||
302 | { USB_DEVICE(0x0BB4, 0x0A25) }, /* PocketPC USB Sync */ | ||
303 | { USB_DEVICE(0x0BB4, 0x0A26) }, /* PocketPC USB Sync */ | ||
304 | { USB_DEVICE(0x0BB4, 0x0A27) }, /* PocketPC USB Sync */ | ||
305 | { USB_DEVICE(0x0BB4, 0x0A28) }, /* PocketPC USB Sync */ | ||
306 | { USB_DEVICE(0x0BB4, 0x0A29) }, /* PocketPC USB Sync */ | ||
307 | { USB_DEVICE(0x0BB4, 0x0A2A) }, /* PocketPC USB Sync */ | ||
308 | { USB_DEVICE(0x0BB4, 0x0A2B) }, /* PocketPC USB Sync */ | ||
309 | { USB_DEVICE(0x0BB4, 0x0A2C) }, /* PocketPC USB Sync */ | ||
310 | { USB_DEVICE(0x0BB4, 0x0A2D) }, /* PocketPC USB Sync */ | ||
311 | { USB_DEVICE(0x0BB4, 0x0A2E) }, /* PocketPC USB Sync */ | ||
312 | { USB_DEVICE(0x0BB4, 0x0A2F) }, /* PocketPC USB Sync */ | ||
313 | { USB_DEVICE(0x0BB4, 0x0A30) }, /* PocketPC USB Sync */ | ||
314 | { USB_DEVICE(0x0BB4, 0x0A31) }, /* PocketPC USB Sync */ | ||
315 | { USB_DEVICE(0x0BB4, 0x0A32) }, /* PocketPC USB Sync */ | ||
316 | { USB_DEVICE(0x0BB4, 0x0A33) }, /* PocketPC USB Sync */ | ||
317 | { USB_DEVICE(0x0BB4, 0x0A34) }, /* PocketPC USB Sync */ | ||
318 | { USB_DEVICE(0x0BB4, 0x0A35) }, /* PocketPC USB Sync */ | ||
319 | { USB_DEVICE(0x0BB4, 0x0A36) }, /* PocketPC USB Sync */ | ||
320 | { USB_DEVICE(0x0BB4, 0x0A37) }, /* PocketPC USB Sync */ | ||
321 | { USB_DEVICE(0x0BB4, 0x0A38) }, /* PocketPC USB Sync */ | ||
322 | { USB_DEVICE(0x0BB4, 0x0A39) }, /* PocketPC USB Sync */ | ||
323 | { USB_DEVICE(0x0BB4, 0x0A3A) }, /* PocketPC USB Sync */ | ||
324 | { USB_DEVICE(0x0BB4, 0x0A3B) }, /* PocketPC USB Sync */ | ||
325 | { USB_DEVICE(0x0BB4, 0x0A3C) }, /* PocketPC USB Sync */ | ||
326 | { USB_DEVICE(0x0BB4, 0x0A3D) }, /* PocketPC USB Sync */ | ||
327 | { USB_DEVICE(0x0BB4, 0x0A3E) }, /* PocketPC USB Sync */ | ||
328 | { USB_DEVICE(0x0BB4, 0x0A3F) }, /* PocketPC USB Sync */ | ||
329 | { USB_DEVICE(0x0BB4, 0x0A40) }, /* PocketPC USB Sync */ | ||
330 | { USB_DEVICE(0x0BB4, 0x0A41) }, /* PocketPC USB Sync */ | ||
331 | { USB_DEVICE(0x0BB4, 0x0A42) }, /* PocketPC USB Sync */ | ||
332 | { USB_DEVICE(0x0BB4, 0x0A43) }, /* PocketPC USB Sync */ | ||
333 | { USB_DEVICE(0x0BB4, 0x0A44) }, /* PocketPC USB Sync */ | ||
334 | { USB_DEVICE(0x0BB4, 0x0A45) }, /* PocketPC USB Sync */ | ||
335 | { USB_DEVICE(0x0BB4, 0x0A46) }, /* PocketPC USB Sync */ | ||
336 | { USB_DEVICE(0x0BB4, 0x0A47) }, /* PocketPC USB Sync */ | ||
337 | { USB_DEVICE(0x0BB4, 0x0A48) }, /* PocketPC USB Sync */ | ||
338 | { USB_DEVICE(0x0BB4, 0x0A49) }, /* PocketPC USB Sync */ | ||
339 | { USB_DEVICE(0x0BB4, 0x0A4A) }, /* PocketPC USB Sync */ | ||
340 | { USB_DEVICE(0x0BB4, 0x0A4B) }, /* PocketPC USB Sync */ | ||
341 | { USB_DEVICE(0x0BB4, 0x0A4C) }, /* PocketPC USB Sync */ | ||
342 | { USB_DEVICE(0x0BB4, 0x0A4D) }, /* PocketPC USB Sync */ | ||
343 | { USB_DEVICE(0x0BB4, 0x0A4E) }, /* PocketPC USB Sync */ | ||
344 | { USB_DEVICE(0x0BB4, 0x0A4F) }, /* PocketPC USB Sync */ | ||
345 | { USB_DEVICE(0x0BB4, 0x0A50) }, /* HTC SmartPhone USB Sync */ | ||
346 | { USB_DEVICE(0x0BB4, 0x0A51) }, /* SmartPhone USB Sync */ | ||
347 | { USB_DEVICE(0x0BB4, 0x0A52) }, /* SmartPhone USB Sync */ | ||
348 | { USB_DEVICE(0x0BB4, 0x0A53) }, /* SmartPhone USB Sync */ | ||
349 | { USB_DEVICE(0x0BB4, 0x0A54) }, /* SmartPhone USB Sync */ | ||
350 | { USB_DEVICE(0x0BB4, 0x0A55) }, /* SmartPhone USB Sync */ | ||
351 | { USB_DEVICE(0x0BB4, 0x0A56) }, /* SmartPhone USB Sync */ | ||
352 | { USB_DEVICE(0x0BB4, 0x0A57) }, /* SmartPhone USB Sync */ | ||
353 | { USB_DEVICE(0x0BB4, 0x0A58) }, /* SmartPhone USB Sync */ | ||
354 | { USB_DEVICE(0x0BB4, 0x0A59) }, /* SmartPhone USB Sync */ | ||
355 | { USB_DEVICE(0x0BB4, 0x0A5A) }, /* SmartPhone USB Sync */ | ||
356 | { USB_DEVICE(0x0BB4, 0x0A5B) }, /* SmartPhone USB Sync */ | ||
357 | { USB_DEVICE(0x0BB4, 0x0A5C) }, /* SmartPhone USB Sync */ | ||
358 | { USB_DEVICE(0x0BB4, 0x0A5D) }, /* SmartPhone USB Sync */ | ||
359 | { USB_DEVICE(0x0BB4, 0x0A5E) }, /* SmartPhone USB Sync */ | ||
360 | { USB_DEVICE(0x0BB4, 0x0A5F) }, /* SmartPhone USB Sync */ | ||
361 | { USB_DEVICE(0x0BB4, 0x0A60) }, /* SmartPhone USB Sync */ | ||
362 | { USB_DEVICE(0x0BB4, 0x0A61) }, /* SmartPhone USB Sync */ | ||
363 | { USB_DEVICE(0x0BB4, 0x0A62) }, /* SmartPhone USB Sync */ | ||
364 | { USB_DEVICE(0x0BB4, 0x0A63) }, /* SmartPhone USB Sync */ | ||
365 | { USB_DEVICE(0x0BB4, 0x0A64) }, /* SmartPhone USB Sync */ | ||
366 | { USB_DEVICE(0x0BB4, 0x0A65) }, /* SmartPhone USB Sync */ | ||
367 | { USB_DEVICE(0x0BB4, 0x0A66) }, /* SmartPhone USB Sync */ | ||
368 | { USB_DEVICE(0x0BB4, 0x0A67) }, /* SmartPhone USB Sync */ | ||
369 | { USB_DEVICE(0x0BB4, 0x0A68) }, /* SmartPhone USB Sync */ | ||
370 | { USB_DEVICE(0x0BB4, 0x0A69) }, /* SmartPhone USB Sync */ | ||
371 | { USB_DEVICE(0x0BB4, 0x0A6A) }, /* SmartPhone USB Sync */ | ||
372 | { USB_DEVICE(0x0BB4, 0x0A6B) }, /* SmartPhone USB Sync */ | ||
373 | { USB_DEVICE(0x0BB4, 0x0A6C) }, /* SmartPhone USB Sync */ | ||
374 | { USB_DEVICE(0x0BB4, 0x0A6D) }, /* SmartPhone USB Sync */ | ||
375 | { USB_DEVICE(0x0BB4, 0x0A6E) }, /* SmartPhone USB Sync */ | ||
376 | { USB_DEVICE(0x0BB4, 0x0A6F) }, /* SmartPhone USB Sync */ | ||
377 | { USB_DEVICE(0x0BB4, 0x0A70) }, /* SmartPhone USB Sync */ | ||
378 | { USB_DEVICE(0x0BB4, 0x0A71) }, /* SmartPhone USB Sync */ | ||
379 | { USB_DEVICE(0x0BB4, 0x0A72) }, /* SmartPhone USB Sync */ | ||
380 | { USB_DEVICE(0x0BB4, 0x0A73) }, /* SmartPhone USB Sync */ | ||
381 | { USB_DEVICE(0x0BB4, 0x0A74) }, /* SmartPhone USB Sync */ | ||
382 | { USB_DEVICE(0x0BB4, 0x0A75) }, /* SmartPhone USB Sync */ | ||
383 | { USB_DEVICE(0x0BB4, 0x0A76) }, /* SmartPhone USB Sync */ | ||
384 | { USB_DEVICE(0x0BB4, 0x0A77) }, /* SmartPhone USB Sync */ | ||
385 | { USB_DEVICE(0x0BB4, 0x0A78) }, /* SmartPhone USB Sync */ | ||
386 | { USB_DEVICE(0x0BB4, 0x0A79) }, /* SmartPhone USB Sync */ | ||
387 | { USB_DEVICE(0x0BB4, 0x0A7A) }, /* SmartPhone USB Sync */ | ||
388 | { USB_DEVICE(0x0BB4, 0x0A7B) }, /* SmartPhone USB Sync */ | ||
389 | { USB_DEVICE(0x0BB4, 0x0A7C) }, /* SmartPhone USB Sync */ | ||
390 | { USB_DEVICE(0x0BB4, 0x0A7D) }, /* SmartPhone USB Sync */ | ||
391 | { USB_DEVICE(0x0BB4, 0x0A7E) }, /* SmartPhone USB Sync */ | ||
392 | { USB_DEVICE(0x0BB4, 0x0A7F) }, /* SmartPhone USB Sync */ | ||
393 | { USB_DEVICE(0x0BB4, 0x0A80) }, /* SmartPhone USB Sync */ | ||
394 | { USB_DEVICE(0x0BB4, 0x0A81) }, /* SmartPhone USB Sync */ | ||
395 | { USB_DEVICE(0x0BB4, 0x0A82) }, /* SmartPhone USB Sync */ | ||
396 | { USB_DEVICE(0x0BB4, 0x0A83) }, /* SmartPhone USB Sync */ | ||
397 | { USB_DEVICE(0x0BB4, 0x0A84) }, /* SmartPhone USB Sync */ | ||
398 | { USB_DEVICE(0x0BB4, 0x0A85) }, /* SmartPhone USB Sync */ | ||
399 | { USB_DEVICE(0x0BB4, 0x0A86) }, /* SmartPhone USB Sync */ | ||
400 | { USB_DEVICE(0x0BB4, 0x0A87) }, /* SmartPhone USB Sync */ | ||
401 | { USB_DEVICE(0x0BB4, 0x0A88) }, /* SmartPhone USB Sync */ | ||
402 | { USB_DEVICE(0x0BB4, 0x0A89) }, /* SmartPhone USB Sync */ | ||
403 | { USB_DEVICE(0x0BB4, 0x0A8A) }, /* SmartPhone USB Sync */ | ||
404 | { USB_DEVICE(0x0BB4, 0x0A8B) }, /* SmartPhone USB Sync */ | ||
405 | { USB_DEVICE(0x0BB4, 0x0A8C) }, /* SmartPhone USB Sync */ | ||
406 | { USB_DEVICE(0x0BB4, 0x0A8D) }, /* SmartPhone USB Sync */ | ||
407 | { USB_DEVICE(0x0BB4, 0x0A8E) }, /* SmartPhone USB Sync */ | ||
408 | { USB_DEVICE(0x0BB4, 0x0A8F) }, /* SmartPhone USB Sync */ | ||
409 | { USB_DEVICE(0x0BB4, 0x0A90) }, /* SmartPhone USB Sync */ | ||
410 | { USB_DEVICE(0x0BB4, 0x0A91) }, /* SmartPhone USB Sync */ | ||
411 | { USB_DEVICE(0x0BB4, 0x0A92) }, /* SmartPhone USB Sync */ | ||
412 | { USB_DEVICE(0x0BB4, 0x0A93) }, /* SmartPhone USB Sync */ | ||
413 | { USB_DEVICE(0x0BB4, 0x0A94) }, /* SmartPhone USB Sync */ | ||
414 | { USB_DEVICE(0x0BB4, 0x0A95) }, /* SmartPhone USB Sync */ | ||
415 | { USB_DEVICE(0x0BB4, 0x0A96) }, /* SmartPhone USB Sync */ | ||
416 | { USB_DEVICE(0x0BB4, 0x0A97) }, /* SmartPhone USB Sync */ | ||
417 | { USB_DEVICE(0x0BB4, 0x0A98) }, /* SmartPhone USB Sync */ | ||
418 | { USB_DEVICE(0x0BB4, 0x0A99) }, /* SmartPhone USB Sync */ | ||
419 | { USB_DEVICE(0x0BB4, 0x0A9A) }, /* SmartPhone USB Sync */ | ||
420 | { USB_DEVICE(0x0BB4, 0x0A9B) }, /* SmartPhone USB Sync */ | ||
421 | { USB_DEVICE(0x0BB4, 0x0A9C) }, /* SmartPhone USB Sync */ | ||
422 | { USB_DEVICE(0x0BB4, 0x0A9D) }, /* SmartPhone USB Sync */ | ||
423 | { USB_DEVICE(0x0BB4, 0x0A9E) }, /* SmartPhone USB Sync */ | ||
424 | { USB_DEVICE(0x0BB4, 0x0A9F) }, /* SmartPhone USB Sync */ | ||
425 | { USB_DEVICE(0x0409, 0x00D5) }, /* NEC USB Sync */ | ||
426 | { USB_DEVICE(0x0409, 0x00D6) }, /* NEC USB Sync */ | ||
427 | { USB_DEVICE(0x0409, 0x00D7) }, /* NEC USB Sync */ | ||
428 | { USB_DEVICE(0x0409, 0x8024) }, /* NEC USB Sync */ | ||
429 | { USB_DEVICE(0x0409, 0x8025) }, /* NEC USB Sync */ | ||
430 | { USB_DEVICE(0x04A4, 0x0014) }, /* Hitachi USB Sync */ | ||
431 | { USB_DEVICE(0x0BF8, 0x1001) }, /* Fujitsu Siemens Computers USB Sync */ | ||
432 | { USB_DEVICE(0x0F98, 0x0201) }, /* Cyberbank USB Sync */ | ||
433 | { USB_DEVICE(0x0502, 0x16E1) }, /* Acer n10 Handheld USB Sync */ | ||
434 | { USB_DEVICE(0x0502, 0x16E3) }, /* Acer n30 Handheld USB Sync */ | ||
435 | { USB_DEVICE(0x0502, 0x16E2) }, /* Acer n20 Handheld USB Sync */ | ||
436 | { USB_DEVICE(0x0502, 0x1631) }, /* c10 Series */ | ||
437 | { USB_DEVICE(0x0502, 0x1632) }, /* c20 Series */ | ||
438 | { USB_DEVICE(0x0B05, 0x9202) }, /* ASUS USB Sync */ | ||
439 | { USB_DEVICE(0x0B05, 0x420F) }, /* ASUS USB Sync */ | ||
440 | { USB_DEVICE(0x0B05, 0x4200) }, /* ASUS USB Sync */ | ||
441 | { USB_DEVICE(0x0B05, 0x4201) }, /* ASUS USB Sync */ | ||
442 | { USB_DEVICE(0x0B05, 0x4202) }, /* ASUS USB Sync */ | ||
443 | { USB_DEVICE(0x0B05, 0x9200) }, /* ASUS USB Sync */ | ||
444 | { USB_DEVICE(0x0C8E, 0x6000) }, /* Cesscom Luxian Series */ | ||
445 | { USB_DEVICE(0x04AD, 0x0301) }, /* USB Sync 0301 */ | ||
446 | { USB_DEVICE(0x04AD, 0x0302) }, /* USB Sync 0302 */ | ||
447 | { USB_DEVICE(0x04AD, 0x0303) }, /* USB Sync 0303 */ | ||
448 | { USB_DEVICE(0x1066, 0x0300) }, /* E-TEN P3XX Pocket PC */ | ||
449 | { USB_DEVICE(0x1066, 0x0500) }, /* E-TEN P5XX Pocket PC */ | ||
450 | { USB_DEVICE(0x1066, 0x0600) }, /* E-TEN P6XX Pocket PC */ | ||
451 | { USB_DEVICE(0x1066, 0x0700) }, /* E-TEN P7XX Pocket PC */ | ||
452 | { USB_DEVICE(0x1066, 0x00CE) }, /* E-TEN USB Sync */ | ||
453 | { USB_DEVICE(0x0F4E, 0x0200) }, /* Freedom Scientific USB Sync */ | ||
454 | { USB_DEVICE(0x04C5, 0x1058) }, /* FUJITSU USB Sync */ | ||
455 | { USB_DEVICE(0x04C5, 0x1079) }, /* FUJITSU USB Sync */ | ||
456 | { USB_DEVICE(0x067E, 0x1001) }, /* Intermec Mobile Computer */ | ||
457 | { USB_DEVICE(0x04f1, 0x3011) }, /* JVC USB Sync */ | ||
458 | { USB_DEVICE(0x04F1, 0x3012) }, /* JVC USB Sync */ | ||
459 | { USB_DEVICE(0x3708, 0x20CE) }, /* Legend USB Sync */ | ||
460 | { USB_DEVICE(0x3708, 0x21CE) }, /* Lenovo USB Sync */ | ||
461 | { USB_DEVICE(0x043E, 0x9C01) }, /* LGE USB Sync */ | ||
462 | { USB_DEVICE(0x04DA, 0x2500) }, /* Panasonic USB Sync */ | ||
463 | { USB_DEVICE(0x3340, 0x0B1C) }, /* Generic PPC StrongARM */ | ||
464 | { USB_DEVICE(0x3340, 0x0E3A) }, /* Generic PPC USB Sync */ | ||
465 | { USB_DEVICE(0x3340, 0x0F3A) }, /* Generic SmartPhone USB Sync */ | ||
466 | { USB_DEVICE(0x3340, 0x0F1C) }, /* Itautec USB Sync */ | ||
467 | { USB_DEVICE(0x3340, 0x1326) }, /* Itautec USB Sync */ | ||
468 | { USB_DEVICE(0x3340, 0x3326) }, /* MEDION Winodws Moble USB Sync */ | ||
469 | { USB_DEVICE(0x3340, 0x0326) }, /* Mio DigiWalker 338 */ | ||
470 | { USB_DEVICE(0x3340, 0x0426) }, /* Mio DigiWalker 338 */ | ||
471 | { USB_DEVICE(0x3340, 0x011C) }, /* Mio DigiWalker PPC StrongARM */ | ||
472 | { USB_DEVICE(0x3340, 0x053A) }, /* Mio DigiWalker SmartPhone USB Sync */ | ||
473 | { USB_DEVICE(0x3340, 0x043A) }, /* Mio DigiWalker USB Sync */ | ||
474 | { USB_DEVICE(0x3340, 0x071C) }, /* MiTAC USB Sync */ | ||
475 | { USB_DEVICE(0x3340, 0x051C) }, /* MiTAC USB Sync 528 */ | ||
476 | { USB_DEVICE(0x3340, 0x2326) }, /* Vobis USB Sync */ | ||
477 | { USB_DEVICE(0x3340, 0x191C) }, /* YAKUMO USB Sync */ | ||
478 | { USB_DEVICE(0x4113, 0x0210) }, /* Mobile Media Technology USB Sync */ | ||
479 | { USB_DEVICE(0x4113, 0x0211) }, /* Mobile Media Technology USB Sync */ | ||
480 | { USB_DEVICE(0x4113, 0x0400) }, /* Mobile Media Technology USB Sync */ | ||
481 | { USB_DEVICE(0x4113, 0x0410) }, /* Mobile Media Technology USB Sync */ | ||
482 | { USB_DEVICE(0x0CAD, 0x9001) }, /* Motorola PowerPad Pocket PC Device */ | ||
483 | { USB_DEVICE(0x0C44, 0x03A2) }, /* Motorola iDEN Smartphone */ | ||
484 | { USB_DEVICE(0x04E8, 0x6611) }, /* Samsung MITs USB Sync */ | ||
485 | { USB_DEVICE(0x04E8, 0x6613) }, /* Samsung MITs USB Sync */ | ||
486 | { USB_DEVICE(0x04E8, 0x6615) }, /* Samsung MITs USB Sync */ | ||
487 | { USB_DEVICE(0x04E8, 0x6617) }, /* Samsung MITs USB Sync */ | ||
488 | { USB_DEVICE(0x04E8, 0x6619) }, /* Samsung MITs USB Sync */ | ||
489 | { USB_DEVICE(0x04E8, 0x661B) }, /* Samsung MITs USB Sync */ | ||
490 | { USB_DEVICE(0x04E8, 0x5F00) }, /* Samsung NEXiO USB Sync */ | ||
491 | { USB_DEVICE(0x04E8, 0x5F01) }, /* Samsung NEXiO USB Sync */ | ||
492 | { USB_DEVICE(0x04E8, 0x5F02) }, /* Samsung NEXiO USB Sync */ | ||
493 | { USB_DEVICE(0x04E8, 0x5F03) }, /* Samsung NEXiO USB Sync */ | ||
494 | { USB_DEVICE(0x04E8, 0x5F04) }, /* Samsung NEXiO USB Sync */ | ||
495 | { USB_DEVICE(0x04E8, 0x662E) }, /* Samsung MITs USB Sync */ | ||
496 | { USB_DEVICE(0x04E8, 0x6630) }, /* Samsung MITs USB Sync */ | ||
497 | { USB_DEVICE(0x04E8, 0x6632) }, /* Samsung MITs USB Sync */ | ||
498 | { USB_DEVICE(0x4505, 0x0010) }, /* Smartphone */ | ||
499 | { USB_DEVICE(0x05E0, 0x2000) }, /* Symbol USB Sync */ | ||
500 | { USB_DEVICE(0x05E0, 0x2001) }, /* Symbol USB Sync 0x2001 */ | ||
501 | { USB_DEVICE(0x05E0, 0x2002) }, /* Symbol USB Sync 0x2002 */ | ||
502 | { USB_DEVICE(0x05E0, 0x2003) }, /* Symbol USB Sync 0x2003 */ | ||
503 | { USB_DEVICE(0x05E0, 0x2004) }, /* Symbol USB Sync 0x2004 */ | ||
504 | { USB_DEVICE(0x05E0, 0x2005) }, /* Symbol USB Sync 0x2005 */ | ||
505 | { USB_DEVICE(0x05E0, 0x2006) }, /* Symbol USB Sync 0x2006 */ | ||
506 | { USB_DEVICE(0x05E0, 0x2007) }, /* Symbol USB Sync 0x2007 */ | ||
507 | { USB_DEVICE(0x05E0, 0x2008) }, /* Symbol USB Sync 0x2008 */ | ||
508 | { USB_DEVICE(0x05E0, 0x2009) }, /* Symbol USB Sync 0x2009 */ | ||
509 | { USB_DEVICE(0x05E0, 0x200A) }, /* Symbol USB Sync 0x200A */ | ||
510 | { USB_DEVICE(0x1182, 0x1388) }, /* VES USB Sync */ | ||
511 | { USB_DEVICE(0x0543, 0x0ED9) }, /* ViewSonic Color Pocket PC V35 */ | ||
512 | { USB_DEVICE(0x0543, 0x1527) }, /* ViewSonic Color Pocket PC V36 */ | ||
513 | { USB_DEVICE(0x0543, 0x1529) }, /* ViewSonic Color Pocket PC V37 */ | ||
514 | { USB_DEVICE(0x0543, 0x152B) }, /* ViewSonic Color Pocket PC V38 */ | ||
515 | { USB_DEVICE(0x0543, 0x152E) }, /* ViewSonic Pocket PC */ | ||
516 | { USB_DEVICE(0x0543, 0x1921) }, /* ViewSonic Communicator Pocket PC */ | ||
517 | { USB_DEVICE(0x0543, 0x1922) }, /* ViewSonic Smartphone */ | ||
518 | { USB_DEVICE(0x0543, 0x1923) }, /* ViewSonic Pocket PC V30 */ | ||
519 | { USB_DEVICE(0x0536, 0x01A0) }, /* HHP PDT */ | ||
520 | { USB_DEVICE(0x099E, 0x0052) }, /* Trimble GeoExplorer */ | ||
521 | { USB_DEVICE(0x099E, 0x4000) }, /* TDS Data Collector */ | ||
522 | { USB_DEVICE(0x0FB8, 0x3001) }, /* Wistron USB Sync */ | ||
523 | { USB_DEVICE(0x0FB8, 0x3002) }, /* Wistron USB Sync */ | ||
524 | { USB_DEVICE(0x0FB8, 0x3003) }, /* Wistron USB Sync */ | ||
525 | { USB_DEVICE(0x0FB8, 0x4001) }, /* Wistron USB Sync */ | ||
526 | { USB_DEVICE(0x11D9, 0x1003) }, /* Rugged Pocket PC 2003 */ | ||
527 | { USB_DEVICE(0x11D9, 0x1002) }, /* Rugged Pocket PC 2003 */ | ||
528 | { USB_DEVICE(0x22B8, 0x4204) }, /* Motorola MPx200 Smartphone */ | ||
529 | { USB_DEVICE(0x22B8, 0x4214) }, /* Motorola MPc GSM */ | ||
530 | { USB_DEVICE(0x22B8, 0x4224) }, /* Motorola MPx220 Smartphone */ | ||
531 | { USB_DEVICE(0x22B8, 0x4234) }, /* Motorola MPc CDMA */ | ||
532 | { USB_DEVICE(0x22B8, 0x4244) }, /* Motorola MPx100 Smartphone */ | ||
533 | { USB_DEVICE(0x1231, 0xCE01) }, /* USB Sync 03 */ | ||
534 | { USB_DEVICE(0x1231, 0xCE02) }, /* USB Sync 03 */ | ||
535 | { } /* Terminating entry */ | ||
536 | }; | ||
537 | |||
538 | MODULE_DEVICE_TABLE (usb, ipaq_id_table); | ||
539 | |||
540 | static struct usb_driver ipaq_driver = { | ||
541 | .owner = THIS_MODULE, | ||
542 | .name = "ipaq", | ||
543 | .probe = usb_serial_probe, | ||
544 | .disconnect = usb_serial_disconnect, | ||
545 | .id_table = ipaq_id_table, | ||
546 | }; | ||
547 | |||
548 | |||
549 | /* All of the device info needed for the Compaq iPAQ */ | ||
550 | static struct usb_serial_device_type ipaq_device = { | ||
551 | .owner = THIS_MODULE, | ||
552 | .name = "PocketPC PDA", | ||
553 | .id_table = ipaq_id_table, | ||
554 | .num_interrupt_in = NUM_DONT_CARE, | ||
555 | .num_bulk_in = 1, | ||
556 | .num_bulk_out = 1, | ||
557 | .num_ports = 1, | ||
558 | .open = ipaq_open, | ||
559 | .close = ipaq_close, | ||
560 | .attach = ipaq_startup, | ||
561 | .shutdown = ipaq_shutdown, | ||
562 | .write = ipaq_write, | ||
563 | .write_room = ipaq_write_room, | ||
564 | .chars_in_buffer = ipaq_chars_in_buffer, | ||
565 | .read_bulk_callback = ipaq_read_bulk_callback, | ||
566 | .write_bulk_callback = ipaq_write_bulk_callback, | ||
567 | }; | ||
568 | |||
569 | static spinlock_t write_list_lock; | ||
570 | static int bytes_in; | ||
571 | static int bytes_out; | ||
572 | |||
573 | static int ipaq_open(struct usb_serial_port *port, struct file *filp) | ||
574 | { | ||
575 | struct usb_serial *serial = port->serial; | ||
576 | struct ipaq_private *priv; | ||
577 | struct ipaq_packet *pkt; | ||
578 | int i, result = 0; | ||
579 | int retries = KP_RETRIES; | ||
580 | |||
581 | dbg("%s - port %d", __FUNCTION__, port->number); | ||
582 | |||
583 | bytes_in = 0; | ||
584 | bytes_out = 0; | ||
585 | priv = (struct ipaq_private *)kmalloc(sizeof(struct ipaq_private), GFP_KERNEL); | ||
586 | if (priv == NULL) { | ||
587 | err("%s - Out of memory", __FUNCTION__); | ||
588 | return -ENOMEM; | ||
589 | } | ||
590 | usb_set_serial_port_data(port, priv); | ||
591 | priv->active = 0; | ||
592 | priv->queue_len = 0; | ||
593 | priv->free_len = 0; | ||
594 | INIT_LIST_HEAD(&priv->queue); | ||
595 | INIT_LIST_HEAD(&priv->freelist); | ||
596 | |||
597 | for (i = 0; i < URBDATA_QUEUE_MAX / PACKET_SIZE; i++) { | ||
598 | pkt = kmalloc(sizeof(struct ipaq_packet), GFP_KERNEL); | ||
599 | if (pkt == NULL) { | ||
600 | goto enomem; | ||
601 | } | ||
602 | pkt->data = kmalloc(PACKET_SIZE, GFP_KERNEL); | ||
603 | if (pkt->data == NULL) { | ||
604 | kfree(pkt); | ||
605 | goto enomem; | ||
606 | } | ||
607 | pkt->len = 0; | ||
608 | pkt->written = 0; | ||
609 | INIT_LIST_HEAD(&pkt->list); | ||
610 | list_add(&pkt->list, &priv->freelist); | ||
611 | priv->free_len += PACKET_SIZE; | ||
612 | } | ||
613 | |||
614 | /* | ||
615 | * Force low latency on. This will immediately push data to the line | ||
616 | * discipline instead of queueing. | ||
617 | */ | ||
618 | |||
619 | port->tty->low_latency = 1; | ||
620 | port->tty->raw = 1; | ||
621 | port->tty->real_raw = 1; | ||
622 | |||
623 | /* | ||
624 | * Lose the small buffers usbserial provides. Make larger ones. | ||
625 | */ | ||
626 | |||
627 | kfree(port->bulk_in_buffer); | ||
628 | kfree(port->bulk_out_buffer); | ||
629 | port->bulk_in_buffer = kmalloc(URBDATA_SIZE, GFP_KERNEL); | ||
630 | if (port->bulk_in_buffer == NULL) { | ||
631 | goto enomem; | ||
632 | } | ||
633 | port->bulk_out_buffer = kmalloc(URBDATA_SIZE, GFP_KERNEL); | ||
634 | if (port->bulk_out_buffer == NULL) { | ||
635 | kfree(port->bulk_in_buffer); | ||
636 | goto enomem; | ||
637 | } | ||
638 | port->read_urb->transfer_buffer = port->bulk_in_buffer; | ||
639 | port->write_urb->transfer_buffer = port->bulk_out_buffer; | ||
640 | port->read_urb->transfer_buffer_length = URBDATA_SIZE; | ||
641 | port->bulk_out_size = port->write_urb->transfer_buffer_length = URBDATA_SIZE; | ||
642 | |||
643 | /* Start reading from the device */ | ||
644 | usb_fill_bulk_urb(port->read_urb, serial->dev, | ||
645 | usb_rcvbulkpipe(serial->dev, port->bulk_in_endpointAddress), | ||
646 | port->read_urb->transfer_buffer, port->read_urb->transfer_buffer_length, | ||
647 | ipaq_read_bulk_callback, port); | ||
648 | result = usb_submit_urb(port->read_urb, GFP_KERNEL); | ||
649 | if (result) { | ||
650 | err("%s - failed submitting read urb, error %d", __FUNCTION__, result); | ||
651 | goto error; | ||
652 | } | ||
653 | |||
654 | /* | ||
655 | * Send out control message observed in win98 sniffs. Not sure what | ||
656 | * it does, but from empirical observations, it seems that the device | ||
657 | * will start the chat sequence once one of these messages gets | ||
658 | * through. Since this has a reasonably high failure rate, we retry | ||
659 | * several times. | ||
660 | */ | ||
661 | |||
662 | while (retries--) { | ||
663 | result = usb_control_msg(serial->dev, | ||
664 | usb_sndctrlpipe(serial->dev, 0), 0x22, 0x21, | ||
665 | 0x1, 0, NULL, 0, 100); | ||
666 | if (result == 0) { | ||
667 | return 0; | ||
668 | } | ||
669 | } | ||
670 | err("%s - failed doing control urb, error %d", __FUNCTION__, result); | ||
671 | goto error; | ||
672 | |||
673 | enomem: | ||
674 | result = -ENOMEM; | ||
675 | err("%s - Out of memory", __FUNCTION__); | ||
676 | error: | ||
677 | ipaq_destroy_lists(port); | ||
678 | kfree(priv); | ||
679 | return result; | ||
680 | } | ||
681 | |||
682 | |||
683 | static void ipaq_close(struct usb_serial_port *port, struct file *filp) | ||
684 | { | ||
685 | struct ipaq_private *priv = usb_get_serial_port_data(port); | ||
686 | |||
687 | dbg("%s - port %d", __FUNCTION__, port->number); | ||
688 | |||
689 | /* | ||
690 | * shut down bulk read and write | ||
691 | */ | ||
692 | usb_kill_urb(port->write_urb); | ||
693 | usb_kill_urb(port->read_urb); | ||
694 | ipaq_destroy_lists(port); | ||
695 | kfree(priv); | ||
696 | usb_set_serial_port_data(port, NULL); | ||
697 | |||
698 | /* Uncomment the following line if you want to see some statistics in your syslog */ | ||
699 | /* info ("Bytes In = %d Bytes Out = %d", bytes_in, bytes_out); */ | ||
700 | } | ||
701 | |||
702 | static void ipaq_read_bulk_callback(struct urb *urb, struct pt_regs *regs) | ||
703 | { | ||
704 | struct usb_serial_port *port = (struct usb_serial_port *)urb->context; | ||
705 | struct tty_struct *tty; | ||
706 | unsigned char *data = urb->transfer_buffer; | ||
707 | int i, result; | ||
708 | |||
709 | dbg("%s - port %d", __FUNCTION__, port->number); | ||
710 | |||
711 | if (urb->status) { | ||
712 | dbg("%s - nonzero read bulk status received: %d", __FUNCTION__, urb->status); | ||
713 | return; | ||
714 | } | ||
715 | |||
716 | usb_serial_debug_data(debug, &port->dev, __FUNCTION__, urb->actual_length, data); | ||
717 | |||
718 | tty = port->tty; | ||
719 | if (tty && urb->actual_length) { | ||
720 | for (i = 0; i < urb->actual_length ; ++i) { | ||
721 | /* if we insert more than TTY_FLIPBUF_SIZE characters, we drop them. */ | ||
722 | if(tty->flip.count >= TTY_FLIPBUF_SIZE) { | ||
723 | tty_flip_buffer_push(tty); | ||
724 | } | ||
725 | /* this doesn't actually push the data through unless tty->low_latency is set */ | ||
726 | tty_insert_flip_char(tty, data[i], 0); | ||
727 | } | ||
728 | tty_flip_buffer_push(tty); | ||
729 | bytes_in += urb->actual_length; | ||
730 | } | ||
731 | |||
732 | /* Continue trying to always read */ | ||
733 | usb_fill_bulk_urb(port->read_urb, port->serial->dev, | ||
734 | usb_rcvbulkpipe(port->serial->dev, port->bulk_in_endpointAddress), | ||
735 | port->read_urb->transfer_buffer, port->read_urb->transfer_buffer_length, | ||
736 | ipaq_read_bulk_callback, port); | ||
737 | result = usb_submit_urb(port->read_urb, GFP_ATOMIC); | ||
738 | if (result) | ||
739 | err("%s - failed resubmitting read urb, error %d", __FUNCTION__, result); | ||
740 | return; | ||
741 | } | ||
742 | |||
743 | static int ipaq_write(struct usb_serial_port *port, const unsigned char *buf, | ||
744 | int count) | ||
745 | { | ||
746 | const unsigned char *current_position = buf; | ||
747 | int bytes_sent = 0; | ||
748 | int transfer_size; | ||
749 | |||
750 | dbg("%s - port %d", __FUNCTION__, port->number); | ||
751 | |||
752 | while (count > 0) { | ||
753 | transfer_size = min(count, PACKET_SIZE); | ||
754 | if (ipaq_write_bulk(port, current_position, transfer_size)) { | ||
755 | break; | ||
756 | } | ||
757 | current_position += transfer_size; | ||
758 | bytes_sent += transfer_size; | ||
759 | count -= transfer_size; | ||
760 | bytes_out += transfer_size; | ||
761 | } | ||
762 | |||
763 | return bytes_sent; | ||
764 | } | ||
765 | |||
766 | static int ipaq_write_bulk(struct usb_serial_port *port, const unsigned char *buf, | ||
767 | int count) | ||
768 | { | ||
769 | struct ipaq_private *priv = usb_get_serial_port_data(port); | ||
770 | struct ipaq_packet *pkt = NULL; | ||
771 | int result = 0; | ||
772 | unsigned long flags; | ||
773 | |||
774 | if (priv->free_len <= 0) { | ||
775 | dbg("%s - we're stuffed", __FUNCTION__); | ||
776 | return -EAGAIN; | ||
777 | } | ||
778 | |||
779 | spin_lock_irqsave(&write_list_lock, flags); | ||
780 | if (!list_empty(&priv->freelist)) { | ||
781 | pkt = list_entry(priv->freelist.next, struct ipaq_packet, list); | ||
782 | list_del(&pkt->list); | ||
783 | priv->free_len -= PACKET_SIZE; | ||
784 | } | ||
785 | spin_unlock_irqrestore(&write_list_lock, flags); | ||
786 | if (pkt == NULL) { | ||
787 | dbg("%s - we're stuffed", __FUNCTION__); | ||
788 | return -EAGAIN; | ||
789 | } | ||
790 | |||
791 | memcpy(pkt->data, buf, count); | ||
792 | usb_serial_debug_data(debug, &port->dev, __FUNCTION__, count, pkt->data); | ||
793 | |||
794 | pkt->len = count; | ||
795 | pkt->written = 0; | ||
796 | spin_lock_irqsave(&write_list_lock, flags); | ||
797 | list_add_tail(&pkt->list, &priv->queue); | ||
798 | priv->queue_len += count; | ||
799 | if (priv->active == 0) { | ||
800 | priv->active = 1; | ||
801 | ipaq_write_gather(port); | ||
802 | spin_unlock_irqrestore(&write_list_lock, flags); | ||
803 | result = usb_submit_urb(port->write_urb, GFP_ATOMIC); | ||
804 | if (result) { | ||
805 | err("%s - failed submitting write urb, error %d", __FUNCTION__, result); | ||
806 | } | ||
807 | } else { | ||
808 | spin_unlock_irqrestore(&write_list_lock, flags); | ||
809 | } | ||
810 | return result; | ||
811 | } | ||
812 | |||
813 | static void ipaq_write_gather(struct usb_serial_port *port) | ||
814 | { | ||
815 | struct ipaq_private *priv = usb_get_serial_port_data(port); | ||
816 | struct usb_serial *serial = port->serial; | ||
817 | int count, room; | ||
818 | struct ipaq_packet *pkt, *tmp; | ||
819 | struct urb *urb = port->write_urb; | ||
820 | |||
821 | if (urb->status == -EINPROGRESS) { | ||
822 | /* Should never happen */ | ||
823 | err("%s - flushing while urb is active !", __FUNCTION__); | ||
824 | return; | ||
825 | } | ||
826 | room = URBDATA_SIZE; | ||
827 | list_for_each_entry_safe(pkt, tmp, &priv->queue, list) { | ||
828 | count = min(room, (int)(pkt->len - pkt->written)); | ||
829 | memcpy(urb->transfer_buffer + (URBDATA_SIZE - room), | ||
830 | pkt->data + pkt->written, count); | ||
831 | room -= count; | ||
832 | pkt->written += count; | ||
833 | priv->queue_len -= count; | ||
834 | if (pkt->written == pkt->len) { | ||
835 | list_move(&pkt->list, &priv->freelist); | ||
836 | priv->free_len += PACKET_SIZE; | ||
837 | } | ||
838 | if (room == 0) { | ||
839 | break; | ||
840 | } | ||
841 | } | ||
842 | |||
843 | count = URBDATA_SIZE - room; | ||
844 | usb_fill_bulk_urb(port->write_urb, serial->dev, | ||
845 | usb_sndbulkpipe(serial->dev, port->bulk_out_endpointAddress), | ||
846 | port->write_urb->transfer_buffer, count, ipaq_write_bulk_callback, | ||
847 | port); | ||
848 | return; | ||
849 | } | ||
850 | |||
851 | static void ipaq_write_bulk_callback(struct urb *urb, struct pt_regs *regs) | ||
852 | { | ||
853 | struct usb_serial_port *port = (struct usb_serial_port *)urb->context; | ||
854 | struct ipaq_private *priv = usb_get_serial_port_data(port); | ||
855 | unsigned long flags; | ||
856 | int result; | ||
857 | |||
858 | dbg("%s - port %d", __FUNCTION__, port->number); | ||
859 | |||
860 | if (urb->status) { | ||
861 | dbg("%s - nonzero write bulk status received: %d", __FUNCTION__, urb->status); | ||
862 | } | ||
863 | |||
864 | spin_lock_irqsave(&write_list_lock, flags); | ||
865 | if (!list_empty(&priv->queue)) { | ||
866 | ipaq_write_gather(port); | ||
867 | spin_unlock_irqrestore(&write_list_lock, flags); | ||
868 | result = usb_submit_urb(port->write_urb, GFP_ATOMIC); | ||
869 | if (result) { | ||
870 | err("%s - failed submitting write urb, error %d", __FUNCTION__, result); | ||
871 | } | ||
872 | } else { | ||
873 | priv->active = 0; | ||
874 | spin_unlock_irqrestore(&write_list_lock, flags); | ||
875 | } | ||
876 | |||
877 | schedule_work(&port->work); | ||
878 | } | ||
879 | |||
880 | static int ipaq_write_room(struct usb_serial_port *port) | ||
881 | { | ||
882 | struct ipaq_private *priv = usb_get_serial_port_data(port); | ||
883 | |||
884 | dbg("%s - freelen %d", __FUNCTION__, priv->free_len); | ||
885 | return priv->free_len; | ||
886 | } | ||
887 | |||
888 | static int ipaq_chars_in_buffer(struct usb_serial_port *port) | ||
889 | { | ||
890 | struct ipaq_private *priv = usb_get_serial_port_data(port); | ||
891 | |||
892 | dbg("%s - queuelen %d", __FUNCTION__, priv->queue_len); | ||
893 | return priv->queue_len; | ||
894 | } | ||
895 | |||
896 | static void ipaq_destroy_lists(struct usb_serial_port *port) | ||
897 | { | ||
898 | struct ipaq_private *priv = usb_get_serial_port_data(port); | ||
899 | struct ipaq_packet *pkt, *tmp; | ||
900 | |||
901 | list_for_each_entry_safe(pkt, tmp, &priv->queue, list) { | ||
902 | kfree(pkt->data); | ||
903 | kfree(pkt); | ||
904 | } | ||
905 | list_for_each_entry_safe(pkt, tmp, &priv->freelist, list) { | ||
906 | kfree(pkt->data); | ||
907 | kfree(pkt); | ||
908 | } | ||
909 | } | ||
910 | |||
911 | |||
912 | static int ipaq_startup(struct usb_serial *serial) | ||
913 | { | ||
914 | dbg("%s", __FUNCTION__); | ||
915 | if (serial->dev->actconfig->desc.bConfigurationValue != 1) { | ||
916 | err("active config #%d != 1 ??", | ||
917 | serial->dev->actconfig->desc.bConfigurationValue); | ||
918 | return -ENODEV; | ||
919 | } | ||
920 | return usb_reset_configuration (serial->dev); | ||
921 | } | ||
922 | |||
923 | static void ipaq_shutdown(struct usb_serial *serial) | ||
924 | { | ||
925 | dbg("%s", __FUNCTION__); | ||
926 | } | ||
927 | |||
928 | static int __init ipaq_init(void) | ||
929 | { | ||
930 | int retval; | ||
931 | spin_lock_init(&write_list_lock); | ||
932 | retval = usb_serial_register(&ipaq_device); | ||
933 | if (retval) | ||
934 | goto failed_usb_serial_register; | ||
935 | info(DRIVER_DESC " " DRIVER_VERSION); | ||
936 | if (vendor) { | ||
937 | ipaq_id_table[0].idVendor = vendor; | ||
938 | ipaq_id_table[0].idProduct = product; | ||
939 | } | ||
940 | retval = usb_register(&ipaq_driver); | ||
941 | if (retval) | ||
942 | goto failed_usb_register; | ||
943 | |||
944 | return 0; | ||
945 | failed_usb_register: | ||
946 | usb_serial_deregister(&ipaq_device); | ||
947 | failed_usb_serial_register: | ||
948 | return retval; | ||
949 | } | ||
950 | |||
951 | |||
952 | static void __exit ipaq_exit(void) | ||
953 | { | ||
954 | usb_deregister(&ipaq_driver); | ||
955 | usb_serial_deregister(&ipaq_device); | ||
956 | } | ||
957 | |||
958 | |||
959 | module_init(ipaq_init); | ||
960 | module_exit(ipaq_exit); | ||
961 | |||
962 | MODULE_AUTHOR( DRIVER_AUTHOR ); | ||
963 | MODULE_DESCRIPTION( DRIVER_DESC ); | ||
964 | MODULE_LICENSE("GPL"); | ||
965 | |||
966 | module_param(debug, bool, S_IRUGO | S_IWUSR); | ||
967 | MODULE_PARM_DESC(debug, "Debug enabled or not"); | ||
968 | |||
969 | module_param(vendor, ushort, 0); | ||
970 | MODULE_PARM_DESC(vendor, "User specified USB idVendor"); | ||
971 | |||
972 | module_param(product, ushort, 0); | ||
973 | MODULE_PARM_DESC(product, "User specified USB idProduct"); | ||