root/src/linux/rt2880/linux-2.6.23/drivers/usb/serial/option.c

Revision 12433, 42.5 kB (checked in by BrainSlayer, 5 months ago)

fixes usb issues with some devices

Line 
1 /*
2   USB Driver for GSM modems
3
4   Copyright (C) 2005  Matthias Urlichs <smurf@smurf.noris.de>
5
6   This driver is free software; you can redistribute it and/or modify
7   it under the terms of Version 2 of the GNU General Public License as
8   published by the Free Software Foundation.
9
10   Portions copied from the Keyspan driver by Hugh Blemings <hugh@blemings.org>
11
12   History: see the git log.
13
14   Work sponsored by: Sigos GmbH, Germany <info@sigos.de>
15
16   This driver exists because the "normal" serial driver doesn't work too well
17   with GSM modems. Issues:
18   - data loss -- one single Receive URB is not nearly enough
19   - nonstandard flow (Option devices) control
20   - controlling the baud rate doesn't make sense
21
22   This driver is named "option" because the most common device it's
23   used for is a PC-Card (with an internal OHCI-USB interface, behind
24   which the GSM interface sits), made by Option Inc.
25
26   Some of the "one port" devices actually exhibit multiple USB instances
27   on the USB bus. This is not a bug, these ports are used for different
28   device features.
29 */
30
31 #define DRIVER_VERSION "v0.7.1"
32 #define DRIVER_AUTHOR "Matthias Urlichs <smurf@smurf.noris.de>"
33 #define DRIVER_DESC "USB Driver for GSM modems"
34
35 #include <linux/kernel.h>
36 #include <linux/jiffies.h>
37 #include <linux/errno.h>
38 #include <linux/tty.h>
39 #include <linux/tty_flip.h>
40 #include <linux/module.h>
41 #include <linux/bitops.h>
42 #include <linux/usb.h>
43 #include <linux/usb/serial.h>
44
45 /* Function prototypes */
46 static int  option_open(struct usb_serial_port *port, struct file *filp);
47 static void option_close(struct usb_serial_port *port, struct file *filp);
48 static int  option_startup(struct usb_serial *serial);
49 static void option_shutdown(struct usb_serial *serial);
50 static void option_rx_throttle(struct usb_serial_port *port);
51 static void option_rx_unthrottle(struct usb_serial_port *port);
52 static int  option_write_room(struct usb_serial_port *port);
53
54 static void option_instat_callback(struct urb *urb);
55
56 static int option_write(struct usb_serial_port *port,
57                         const unsigned char *buf, int count);
58
59 static int  option_chars_in_buffer(struct usb_serial_port *port);
60 static int  option_ioctl(struct usb_serial_port *port, struct file *file,
61                         unsigned int cmd, unsigned long arg);
62 static void option_set_termios(struct usb_serial_port *port,
63                                 struct ktermios *old);
64 static void option_break_ctl(struct usb_serial_port *port, int break_state);
65 static int  option_tiocmget(struct usb_serial_port *port, struct file *file);
66 static int  option_tiocmset(struct usb_serial_port *port, struct file *file,
67                                 unsigned int set, unsigned int clear);
68 static int  option_send_setup(struct usb_serial_port *port);
69
70 /* Vendor and product IDs */
71 #define OPTION_VENDOR_ID                        0x0AF0
72 #define OPTION_PRODUCT_COLT                     0x5000
73 #define OPTION_PRODUCT_RICOLA                   0x6000
74 #define OPTION_PRODUCT_RICOLA_LIGHT             0x6100
75 #define OPTION_PRODUCT_RICOLA_QUAD              0x6200
76 #define OPTION_PRODUCT_RICOLA_QUAD_LIGHT        0x6300
77 #define OPTION_PRODUCT_RICOLA_NDIS              0x6050
78 #define OPTION_PRODUCT_RICOLA_NDIS_LIGHT        0x6150
79 #define OPTION_PRODUCT_RICOLA_NDIS_QUAD         0x6250
80 #define OPTION_PRODUCT_RICOLA_NDIS_QUAD_LIGHT   0x6350
81 #define OPTION_PRODUCT_COBRA                    0x6500
82 #define OPTION_PRODUCT_COBRA_BUS                0x6501
83 #define OPTION_PRODUCT_VIPER                    0x6600
84 #define OPTION_PRODUCT_VIPER_BUS                0x6601
85 #define OPTION_PRODUCT_GT_MAX_READY             0x6701
86 #define OPTION_PRODUCT_GT_MAX                   0x6711
87 #define OPTION_PRODUCT_FUJI_MODEM_LIGHT         0x6721
88 #define OPTION_PRODUCT_FUJI_MODEM_GT            0x6741
89 #define OPTION_PRODUCT_FUJI_MODEM_EX            0x6761
90 #define OPTION_PRODUCT_FUJI_NETWORK_LIGHT       0x6731
91 #define OPTION_PRODUCT_FUJI_NETWORK_GT          0x6751
92 #define OPTION_PRODUCT_FUJI_NETWORK_EX          0x6771
93 #define OPTION_PRODUCT_KOI_MODEM                0x6800
94 #define OPTION_PRODUCT_KOI_NETWORK              0x6811
95 #define OPTION_PRODUCT_SCORPION_MODEM           0x6901
96 #define OPTION_PRODUCT_SCORPION_NETWORK         0x6911
97 #define OPTION_PRODUCT_ETNA_MODEM               0x7001
98 #define OPTION_PRODUCT_ETNA_NETWORK             0x7011
99 #define OPTION_PRODUCT_ETNA_MODEM_LITE          0x7021
100 #define OPTION_PRODUCT_ETNA_MODEM_GT            0x7041
101 #define OPTION_PRODUCT_ETNA_MODEM_EX            0x7061
102 #define OPTION_PRODUCT_ETNA_NETWORK_LITE        0x7031
103 #define OPTION_PRODUCT_ETNA_NETWORK_GT          0x7051
104 #define OPTION_PRODUCT_ETNA_NETWORK_EX          0x7071
105 #define OPTION_PRODUCT_ETNA_KOI_MODEM           0x7100
106 #define OPTION_PRODUCT_ETNA_KOI_NETWORK         0x7111
107
108 #define QUALCOMM_OPTION_VENDOR_ID               0x1e0e
109 #define QUALCOMM_OPTION_PRODUCT_ICON_210        0x9000
110
111 //#define QUALCOMM2_OPTION_VENDOR_ID            0x0af0
112 //#define QUALCOMM2_OPTION_PRODUCT_ICON_210     0x6971
113
114 #define HUAWEI_VENDOR_ID                        0x12D1
115 #define HUAWEI_PRODUCT_E600                     0x1001
116 #define HUAWEI_PRODUCT_E220                     0x1003
117 #define HUAWEI_PRODUCT_E220BIS                  0x1004
118 #define HUAWEI_PRODUCT_E1401                    0x1401
119 #define HUAWEI_PRODUCT_E1402                    0x1402
120 #define HUAWEI_PRODUCT_E1403                    0x1403
121 #define HUAWEI_PRODUCT_E1404                    0x1404
122 #define HUAWEI_PRODUCT_E1405                    0x1405
123 #define HUAWEI_PRODUCT_E1406                    0x1406
124 #define HUAWEI_PRODUCT_E1407                    0x1407
125 #define HUAWEI_PRODUCT_E1408                    0x1408
126 #define HUAWEI_PRODUCT_E1409                    0x1409
127 #define HUAWEI_PRODUCT_E140A                    0x140A
128 #define HUAWEI_PRODUCT_E140B                    0x140B
129 #define HUAWEI_PRODUCT_E140C                    0x140C
130 #define HUAWEI_PRODUCT_E140D                    0x140D
131 #define HUAWEI_PRODUCT_E140E                    0x140E
132 #define HUAWEI_PRODUCT_E140F                    0x140F
133 #define HUAWEI_PRODUCT_E1410                    0x1410
134 #define HUAWEI_PRODUCT_E1411                    0x1411
135 #define HUAWEI_PRODUCT_E1412                    0x1412
136 #define HUAWEI_PRODUCT_E1413                    0x1413
137 #define HUAWEI_PRODUCT_E1414                    0x1414
138 #define HUAWEI_PRODUCT_E1415                    0x1415
139 #define HUAWEI_PRODUCT_E1416                    0x1416
140 #define HUAWEI_PRODUCT_E1417                    0x1417
141 #define HUAWEI_PRODUCT_E1418                    0x1418
142 #define HUAWEI_PRODUCT_E1419                    0x1419
143 #define HUAWEI_PRODUCT_E141A                    0x141A
144 #define HUAWEI_PRODUCT_E141B                    0x141B
145 #define HUAWEI_PRODUCT_E141C                    0x141C
146 #define HUAWEI_PRODUCT_E141D                    0x141D
147 #define HUAWEI_PRODUCT_E141E                    0x141E
148 #define HUAWEI_PRODUCT_E141F                    0x141F
149 #define HUAWEI_PRODUCT_E1420                    0x1420
150 #define HUAWEI_PRODUCT_E1421                    0x1421
151 #define HUAWEI_PRODUCT_E1422                    0x1422
152 #define HUAWEI_PRODUCT_E1423                    0x1423
153 #define HUAWEI_PRODUCT_E1424                    0x1424
154 #define HUAWEI_PRODUCT_E1425                    0x1425
155 #define HUAWEI_PRODUCT_E1426                    0x1426
156 #define HUAWEI_PRODUCT_E1427                    0x1427
157 #define HUAWEI_PRODUCT_E1428                    0x1428
158 #define HUAWEI_PRODUCT_E1429                    0x1429
159 #define HUAWEI_PRODUCT_E142A                    0x142A
160 #define HUAWEI_PRODUCT_E142B                    0x142B
161 #define HUAWEI_PRODUCT_E142C                    0x142C
162 #define HUAWEI_PRODUCT_E142D                    0x142D
163 #define HUAWEI_PRODUCT_E142E                    0x142E
164 #define HUAWEI_PRODUCT_E142F                    0x142F
165 #define HUAWEI_PRODUCT_E1430                    0x1430
166 #define HUAWEI_PRODUCT_E1431                    0x1431
167 #define HUAWEI_PRODUCT_E1432                    0x1432
168 #define HUAWEI_PRODUCT_E1433                    0x1433
169 #define HUAWEI_PRODUCT_E1434                    0x1434
170 #define HUAWEI_PRODUCT_E1435                    0x1435
171 #define HUAWEI_PRODUCT_E1436                    0x1436
172 #define HUAWEI_PRODUCT_E1437                    0x1437
173 #define HUAWEI_PRODUCT_E1438                    0x1438
174 #define HUAWEI_PRODUCT_E1439                    0x1439
175 #define HUAWEI_PRODUCT_E143A                    0x143A
176 #define HUAWEI_PRODUCT_E143B                    0x143B
177 #define HUAWEI_PRODUCT_E143C                    0x143C
178 #define HUAWEI_PRODUCT_E143D                    0x143D
179 #define HUAWEI_PRODUCT_E143E                    0x143E
180 #define HUAWEI_PRODUCT_E143F                    0x143F
181
182 #define NOVATELWIRELESS_VENDOR_ID               0x1410
183
184 /* YISO PRODUCTS */
185
186 #define YISO_VENDOR_ID                          0x0EAB
187 #define YISO_PRODUCT_U893                       0xC893
188
189 /* MERLIN EVDO PRODUCTS */
190 #define NOVATELWIRELESS_PRODUCT_V640            0x1100
191 #define NOVATELWIRELESS_PRODUCT_V620            0x1110
192 #define NOVATELWIRELESS_PRODUCT_V740            0x1120
193 #define NOVATELWIRELESS_PRODUCT_V720            0x1130
194
195 /* MERLIN HSDPA/HSPA PRODUCTS */
196 #define NOVATELWIRELESS_PRODUCT_U730            0x1400
197 #define NOVATELWIRELESS_PRODUCT_U740            0x1410
198 #define NOVATELWIRELESS_PRODUCT_U870            0x1420
199 #define NOVATELWIRELESS_PRODUCT_XU870           0x1430
200 #define NOVATELWIRELESS_PRODUCT_X950D           0x1450
201
202 /* EXPEDITE PRODUCTS */
203 #define NOVATELWIRELESS_PRODUCT_EV620           0x2100
204 #define NOVATELWIRELESS_PRODUCT_ES720           0x2110
205 #define NOVATELWIRELESS_PRODUCT_E725            0x2120
206 #define NOVATELWIRELESS_PRODUCT_ES620           0x2130
207 #define NOVATELWIRELESS_PRODUCT_EU730           0x2400
208 #define NOVATELWIRELESS_PRODUCT_EU740           0x2410
209 #define NOVATELWIRELESS_PRODUCT_EU870D          0x2420
210
211 /* OVATION PRODUCTS */
212 #define NOVATELWIRELESS_PRODUCT_MC727           0x4100
213 #define NOVATELWIRELESS_PRODUCT_MC950D          0x4400
214
215 /* FUTURE NOVATEL PRODUCTS */
216 #define NOVATELWIRELESS_PRODUCT_EVDO_FULLSPEED  0X6000
217 #define NOVATELWIRELESS_PRODUCT_EVDO_HIGHSPEED  0X6001
218 #define NOVATELWIRELESS_PRODUCT_HSPA_FULLSPEED  0X7000
219 #define NOVATELWIRELESS_PRODUCT_HSPA_HIGHSPEED  0X7001
220 #define NOVATELWIRELESS_PRODUCT_EVDO_EMBEDDED_FULLSPEED 0X8000
221 #define NOVATELWIRELESS_PRODUCT_EVDO_EMBEDDED_HIGHSPEED 0X8001
222 #define NOVATELWIRELESS_PRODUCT_HSPA_EMBEDDED_FULLSPEED 0X9000
223 #define NOVATELWIRELESS_PRODUCT_HSPA_EMBEDDED_HIGHSPEED 0X9001
224 #define NOVATELWIRELESS_PRODUCT_GLOBAL          0XA001
225
226 /* AMOI PRODUCTS */
227 #define AMOI_VENDOR_ID                          0x1614
228 #define AMOI_PRODUCT_H01                        0x0800
229 #define AMOI_PRODUCT_H01A                       0x7002
230 #define AMOI_PRODUCT_H02                        0x0802
231
232
233 #define DELL_VENDOR_ID                          0x413C
234
235 /* Dell modems */
236 #define DELL_PRODUCT_5700_MINICARD              0x8114
237 #define DELL_PRODUCT_5500_MINICARD              0x8115
238 #define DELL_PRODUCT_5505_MINICARD              0x8116
239 #define DELL_PRODUCT_5700_EXPRESSCARD           0x8117
240 #define DELL_PRODUCT_5510_EXPRESSCARD           0x8118
241
242 #define DELL_PRODUCT_5700_MINICARD_SPRINT       0x8128
243 #define DELL_PRODUCT_5700_MINICARD_TELUS        0x8129
244
245 #define DELL_PRODUCT_5720_MINICARD_VZW          0x8133
246 #define DELL_PRODUCT_5720_MINICARD_SPRINT       0x8134
247 #define DELL_PRODUCT_5720_MINICARD_TELUS        0x8135
248 #define DELL_PRODUCT_5520_MINICARD_CINGULAR     0x8136
249 #define DELL_PRODUCT_5520_MINICARD_GENERIC_L    0x8137
250 #define DELL_PRODUCT_5520_MINICARD_GENERIC_I    0x8138
251
252 #define DELL_PRODUCT_5730_MINICARD_SPRINT       0x8180
253 #define DELL_PRODUCT_5730_MINICARD_TELUS        0x8181
254 #define DELL_PRODUCT_5730_MINICARD_VZW          0x8182
255
256 #define KYOCERA_VENDOR_ID                       0x0c88
257 #define KYOCERA_PRODUCT_KPC650                  0x17da
258 #define KYOCERA_PRODUCT_KPC680                  0x180a
259
260
261
262 #define ANYDATA_VENDOR_ID                       0x16d5
263 #define ANYDATA_PRODUCT_ADU_620UW               0x6202
264 #define ANYDATA_PRODUCT_ADU_E100A               0x6501
265 #define ANYDATA_PRODUCT_ADU_500A                0x6502
266
267
268
269 #define AXESSTEL_VENDOR_ID                      0x1726
270 #define AXESSTEL_PRODUCT_MV110H                 0x1000
271
272 #define ONDA_VENDOR_ID                          0x19d2
273 #define ONDA_PRODUCT_MSA501HS                   0x0001
274 #define ONDA_PRODUCT_ET502HS                    0x0002
275 #define ONDA_PRODUCT_MT503HS                    0x0200
276
277 #define BANDRICH_VENDOR_ID                      0x1A8D
278 #define BANDRICH_PRODUCT_C100_1                 0x1002
279 #define BANDRICH_PRODUCT_C100_2                 0x1003
280 #define BANDRICH_PRODUCT_1004                   0x1004
281 #define BANDRICH_PRODUCT_1005                   0x1005
282 #define BANDRICH_PRODUCT_1006                   0x1006
283 #define BANDRICH_PRODUCT_1007                   0x1007
284 #define BANDRICH_PRODUCT_1008                   0x1008
285 #define BANDRICH_PRODUCT_1009                   0x1009
286 #define BANDRICH_PRODUCT_100A                   0x100a
287
288 #define BANDRICH_PRODUCT_100B                   0x100b
289 #define BANDRICH_PRODUCT_100C                   0x100c
290 #define BANDRICH_PRODUCT_100D                   0x100d
291 #define BANDRICH_PRODUCT_100E                   0x100e
292
293 #define BANDRICH_PRODUCT_100F                   0x100f
294 #define BANDRICH_PRODUCT_1010                   0x1010
295 #define BANDRICH_PRODUCT_1011                   0x1011
296 #define BANDRICH_PRODUCT_1012                   0x1012
297
298 #define AMOI_VENDOR_ID                  0x1614
299 #define AMOI_PRODUCT_9508                       0x0800
300
301 #define QUALCOMM_VENDOR_ID                      0x05C6
302
303 #define MAXON_VENDOR_ID                         0x16d8
304
305 #define TELIT_VENDOR_ID                         0x1bc7
306 #define TELIT_PRODUCT_UC864E                    0x1003
307
308 /* ZTE PRODUCTS */
309 #define ZTE_VENDOR_ID                           0x19d2
310 #define ZTE_PRODUCT_MF628                       0x0015
311 #define ZTE_PRODUCT_MF626                       0x0031
312 #define ZTE_PRODUCT_CDMA_TECH                   0xfffe
313
314 /* Ericsson products */
315 #define ERICSSON_VENDOR_ID                      0x0bdb
316 #define ERICSSON_PRODUCT_F3507G                 0x1900
317
318
319 static struct usb_device_id option_ids[] = {
320         { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_COLT) },
321         { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_RICOLA) },
322         { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_RICOLA_LIGHT) },
323         { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_RICOLA_QUAD) },
324         { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_RICOLA_QUAD_LIGHT) },
325         { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_RICOLA_NDIS) },
326         { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_RICOLA_NDIS_LIGHT) },
327         { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_RICOLA_NDIS_QUAD) },
328         { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_RICOLA_NDIS_QUAD_LIGHT) },
329         { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_COBRA) },
330         { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_COBRA_BUS) },
331         { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_VIPER) },
332         { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_VIPER_BUS) },
333         { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_GT_MAX_READY) },
334         { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_FUJI_MODEM_LIGHT) },
335         { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_FUJI_MODEM_GT) },
336         { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_FUJI_MODEM_EX) },
337         { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_KOI_MODEM) },
338         { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_SCORPION_MODEM) },
339         { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_ETNA_MODEM) },
340         { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_ETNA_MODEM_LITE) },
341         { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_ETNA_MODEM_GT) },
342         { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_ETNA_MODEM_EX) },
343         { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_ETNA_KOI_MODEM) },
344         { USB_DEVICE(QUALCOMM_OPTION_VENDOR_ID, QUALCOMM_OPTION_PRODUCT_ICON_210) },
345 //      { USB_DEVICE(QUALCOMM2_OPTION_VENDOR_ID, QUALCOMM2_OPTION_PRODUCT_ICON_210) },
346         { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E600, 0xff, 0xff, 0xff) },
347         { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E220, 0xff, 0xff, 0xff) },
348         { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E220BIS, 0xff, 0xff, 0xff) },
349         { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1401, 0xff, 0xff, 0xff) },
350         { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1402, 0xff, 0xff, 0xff) },
351         { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1403, 0xff, 0xff, 0xff) },
352         { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1404, 0xff, 0xff, 0xff) },
353         { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1405, 0xff, 0xff, 0xff) },
354         { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1406, 0xff, 0xff, 0xff) },
355         { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1407, 0xff, 0xff, 0xff) },
356         { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1408, 0xff, 0xff, 0xff) },
357         { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1409, 0xff, 0xff, 0xff) },
358         { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E140A, 0xff, 0xff, 0xff) },
359         { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E140B, 0xff, 0xff, 0xff) },
360         { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E140C, 0xff, 0xff, 0xff) },
361         { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E140D, 0xff, 0xff, 0xff) },
362         { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E140E, 0xff, 0xff, 0xff) },
363         { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E140F, 0xff, 0xff, 0xff) },
364         { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1410, 0xff, 0xff, 0xff) },
365         { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1411, 0xff, 0xff, 0xff) },
366         { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1412, 0xff, 0xff, 0xff) },
367         { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1413, 0xff, 0xff, 0xff) },
368         { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1414, 0xff, 0xff, 0xff) },
369         { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1415, 0xff, 0xff, 0xff) },
370         { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1416, 0xff, 0xff, 0xff) },
371         { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1417, 0xff, 0xff, 0xff) },
372         { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1418, 0xff, 0xff, 0xff) },
373         { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1419, 0xff, 0xff, 0xff) },
374         { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E141A, 0xff, 0xff, 0xff) },
375         { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E141B, 0xff, 0xff, 0xff) },
376         { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E141C, 0xff, 0xff, 0xff) },
377         { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E141D, 0xff, 0xff, 0xff) },
378         { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E141E, 0xff, 0xff, 0xff) },
379         { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E141F, 0xff, 0xff, 0xff) },
380         { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1420, 0xff, 0xff, 0xff) },
381         { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1421, 0xff, 0xff, 0xff) },
382         { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1422, 0xff, 0xff, 0xff) },
383         { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1423, 0xff, 0xff, 0xff) },
384         { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1424, 0xff, 0xff, 0xff) },
385         { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1425, 0xff, 0xff, 0xff) },
386         { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1426, 0xff, 0xff, 0xff) },
387         { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1427, 0xff, 0xff, 0xff) },
388         { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1428, 0xff, 0xff, 0xff) },
389         { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1429, 0xff, 0xff, 0xff) },
390         { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E142A, 0xff, 0xff, 0xff) },
391         { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E142B, 0xff, 0xff, 0xff) },
392         { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E142C, 0xff, 0xff, 0xff) },
393         { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E142D, 0xff, 0xff, 0xff) },
394         { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E142E, 0xff, 0xff, 0xff) },
395         { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E142F, 0xff, 0xff, 0xff) },
396         { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1430, 0xff, 0xff, 0xff) },
397         { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1431, 0xff, 0xff, 0xff) },
398         { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1432, 0xff, 0xff, 0xff) },
399         { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1433, 0xff, 0xff, 0xff) },
400         { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1434, 0xff, 0xff, 0xff) },
401         { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1435, 0xff, 0xff, 0xff) },
402         { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1436, 0xff, 0xff, 0xff) },
403         { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1437, 0xff, 0xff, 0xff) },
404         { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1438, 0xff, 0xff, 0xff) },
405         { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1439, 0xff, 0xff, 0xff) },
406         { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E143A, 0xff, 0xff, 0xff) },
407         { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E143B, 0xff, 0xff, 0xff) },
408         { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E143C, 0xff, 0xff, 0xff) },
409         { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E143D, 0xff, 0xff, 0xff) },
410         { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E143E, 0xff, 0xff, 0xff) },
411         { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E143F, 0xff, 0xff, 0xff) },
412         { USB_DEVICE(AMOI_VENDOR_ID, AMOI_PRODUCT_9508) },
413         { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_V640) }, /* Novatel Merlin V640/XV620 */
414         { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_V620) }, /* Novatel Merlin V620/S620 */
415         { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_V740) }, /* Novatel Merlin EX720/V740/X720 */
416         { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_V720) }, /* Novatel Merlin V720/S720/PC720 */
417         { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_U730) }, /* Novatel U730/U740 (VF version) */
418         { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_U740) }, /* Novatel U740 */
419         { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_U870) }, /* Novatel U870 */
420         { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_XU870) }, /* Novatel Merlin XU870 HSDPA/3G */
421         { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_X950D) }, /* Novatel X950D */
422         { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_EV620) }, /* Novatel EV620/ES620 CDMA/EV-DO */
423         { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_ES720) }, /* Novatel ES620/ES720/U720/USB720 */
424         { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_E725) }, /* Novatel E725/E726 */
425         { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_ES620) }, /* Novatel Merlin ES620 SM Bus */
426         { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_EU730) }, /* Novatel EU730 and Vodafone EU740 */
427         { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_EU740) }, /* Novatel non-Vodafone EU740 */
428         { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_EU870D) }, /* Novatel EU850D/EU860D/EU870D */
429         { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_MC950D) }, /* Novatel MC930D/MC950D */
430         { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_MC727) }, /* Novatel MC727/U727/USB727 */
431         { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_EVDO_FULLSPEED) }, /* Novatel EVDO product */
432         { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_HSPA_FULLSPEED) }, /* Novatel HSPA product */
433         { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_EVDO_EMBEDDED_FULLSPEED) }, /* Novatel EVDO Embedded product */
434         { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_HSPA_EMBEDDED_FULLSPEED) }, /* Novatel HSPA Embedded product */
435         { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_EVDO_HIGHSPEED) }, /* Novatel EVDO product */
436         { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_HSPA_HIGHSPEED) }, /* Novatel HSPA product */
437         { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_EVDO_EMBEDDED_HIGHSPEED) }, /* Novatel EVDO Embedded product */
438         { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_HSPA_EMBEDDED_HIGHSPEED) }, /* Novatel HSPA Embedded product */
439         { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_GLOBAL) }, /* Novatel Global product */
440
441         { USB_DEVICE(AMOI_VENDOR_ID, AMOI_PRODUCT_H01) },
442         { USB_DEVICE(AMOI_VENDOR_ID, AMOI_PRODUCT_H01A) },
443         { USB_DEVICE(AMOI_VENDOR_ID, AMOI_PRODUCT_H02) },
444
445         { USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5700_MINICARD) },             /* Dell Wireless 5700 Mobile Broadband CDMA/EVDO Mini-Card == Novatel Expedite EV620 CDMA/EV-DO */
446         { USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5500_MINICARD) },             /* Dell Wireless 5500 Mobile Broadband HSDPA Mini-Card == Novatel Expedite EU740 HSDPA/3G */
447         { USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5505_MINICARD) },             /* Dell Wireless 5505 Mobile Broadband HSDPA Mini-Card == Novatel Expedite EU740 HSDPA/3G */
448         { USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5700_EXPRESSCARD) },          /* Dell Wireless 5700 Mobile Broadband CDMA/EVDO ExpressCard == Novatel Merlin XV620 CDMA/EV-DO */
449         { USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5510_EXPRESSCARD) },          /* Dell Wireless 5510 Mobile Broadband HSDPA ExpressCard == Novatel Merlin XU870 HSDPA/3G */
450         { USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5700_MINICARD_SPRINT) },      /* Dell Wireless 5700 Mobile Broadband CDMA/EVDO Mini-Card == Novatel Expedite E720 CDMA/EV-DO */
451         { USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5700_MINICARD_TELUS) },       /* Dell Wireless 5700 Mobile Broadband CDMA/EVDO Mini-Card == Novatel Expedite ET620 CDMA/EV-DO */
452         { USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5720_MINICARD_VZW) },         /* Dell Wireless 5720 == Novatel EV620 CDMA/EV-DO */
453         { USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5720_MINICARD_SPRINT) },      /* Dell Wireless 5720 == Novatel EV620 CDMA/EV-DO */
454         { USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5720_MINICARD_TELUS) },       /* Dell Wireless 5720 == Novatel EV620 CDMA/EV-DO */
455         { USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5520_MINICARD_CINGULAR) },    /* Dell Wireless HSDPA 5520 == Novatel Expedite EU860D */
456         { USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5520_MINICARD_GENERIC_L) },   /* Dell Wireless HSDPA 5520 */
457         { USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5520_MINICARD_GENERIC_I) },   /* Dell Wireless 5520 Voda I Mobile Broadband (3G HSDPA) Minicard */
458         { USB_DEVICE(DELL_VENDOR_ID, 0x8147) },                                 /* Dell Wireless 5530 Mobile Broadband (3G HSPA) Mini-Card */
459         { USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5730_MINICARD_SPRINT) },      /* Dell Wireless 5730 Mobile Broadband EVDO/HSPA Mini-Card */
460         { USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5730_MINICARD_TELUS) },       /* Dell Wireless 5730 Mobile Broadband EVDO/HSPA Mini-Card */
461         { USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5730_MINICARD_VZW) },         /* Dell Wireless 5730 Mobile Broadband EVDO/HSPA Mini-Card */
462         { USB_DEVICE(ANYDATA_VENDOR_ID, ANYDATA_PRODUCT_ADU_E100A) },   /* ADU-E100, ADU-310 */
463         { USB_DEVICE(ANYDATA_VENDOR_ID, ANYDATA_PRODUCT_ADU_500A) },
464         { USB_DEVICE(ANYDATA_VENDOR_ID, ANYDATA_PRODUCT_ADU_620UW) },
465         { USB_DEVICE(AXESSTEL_VENDOR_ID, AXESSTEL_PRODUCT_MV110H) },
466         { USB_DEVICE(ONDA_VENDOR_ID, ONDA_PRODUCT_MSA501HS) },
467         { USB_DEVICE(ONDA_VENDOR_ID, ONDA_PRODUCT_ET502HS) },
468         { USB_DEVICE(ONDA_VENDOR_ID, 0x0003) },
469         { USB_DEVICE(ONDA_VENDOR_ID, 0x0004) },
470         { USB_DEVICE(ONDA_VENDOR_ID, 0x0005) },
471         { USB_DEVICE(ONDA_VENDOR_ID, 0x0006) },
472         { USB_DEVICE(ONDA_VENDOR_ID, 0x0007) },
473         { USB_DEVICE(ONDA_VENDOR_ID, 0x0008) },
474         { USB_DEVICE(ONDA_VENDOR_ID, 0x0009) },
475         { USB_DEVICE(ONDA_VENDOR_ID, 0x000a) },
476         { USB_DEVICE(ONDA_VENDOR_ID, 0x000b) },
477         { USB_DEVICE(ONDA_VENDOR_ID, 0x000c) },
478         { USB_DEVICE(ONDA_VENDOR_ID, 0x000d) },
479         { USB_DEVICE(ONDA_VENDOR_ID, 0x000e) },
480         { USB_DEVICE(ONDA_VENDOR_ID, 0x000f) },
481         { USB_DEVICE(ONDA_VENDOR_ID, 0x0010) },
482         { USB_DEVICE(ONDA_VENDOR_ID, 0x0011) },
483         { USB_DEVICE(ONDA_VENDOR_ID, 0x0012) },
484         { USB_DEVICE(ONDA_VENDOR_ID, 0x0013) },
485         { USB_DEVICE(ONDA_VENDOR_ID, 0x0014) },
486         { USB_DEVICE(ONDA_VENDOR_ID, 0x0015) },
487         { USB_DEVICE(ONDA_VENDOR_ID, 0x0016) },
488         { USB_DEVICE(ONDA_VENDOR_ID, 0x0017) },
489         { USB_DEVICE(ONDA_VENDOR_ID, 0x0018) },
490         { USB_DEVICE(ONDA_VENDOR_ID, 0x0019) },
491         { USB_DEVICE(ONDA_VENDOR_ID, 0x0020) },
492         { USB_DEVICE(ONDA_VENDOR_ID, 0x0021) },
493         { USB_DEVICE(ONDA_VENDOR_ID, 0x0022) },
494         { USB_DEVICE(ONDA_VENDOR_ID, 0x0023) },
495         { USB_DEVICE(ONDA_VENDOR_ID, 0x0024) },
496         { USB_DEVICE(ONDA_VENDOR_ID, 0x0025) },
497         { USB_DEVICE(ONDA_VENDOR_ID, 0x0026) },
498         { USB_DEVICE(ONDA_VENDOR_ID, 0x0027) },
499         { USB_DEVICE(ONDA_VENDOR_ID, 0x0028) },
500         { USB_DEVICE(ONDA_VENDOR_ID, 0x0029) },
501         { USB_DEVICE(ONDA_VENDOR_ID, ONDA_PRODUCT_MT503HS) },
502         { USB_DEVICE(YISO_VENDOR_ID, YISO_PRODUCT_U893) },
503         { USB_DEVICE(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_C100_1) },
504         { USB_DEVICE(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_C100_2) },
505         { USB_DEVICE(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_1004) },
506         { USB_DEVICE(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_1005) },
507         { USB_DEVICE(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_1006) },
508         { USB_DEVICE(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_1007) },
509         { USB_DEVICE(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_1008) },
510         { USB_DEVICE(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_1009) },
511         { USB_DEVICE(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_100A) },
512         { USB_DEVICE(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_100B) },
513         { USB_DEVICE(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_100C) },
514         { USB_DEVICE(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_100D) },
515         { USB_DEVICE(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_100E) },
516         { USB_DEVICE(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_100F) },
517         { USB_DEVICE(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_1010) },
518         { USB_DEVICE(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_1011) },
519         { USB_DEVICE(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_1012) },
520         { USB_DEVICE(KYOCERA_VENDOR_ID, KYOCERA_PRODUCT_KPC650) },
521         { USB_DEVICE(KYOCERA_VENDOR_ID, KYOCERA_PRODUCT_KPC680) },
522         { USB_DEVICE(QUALCOMM_VENDOR_ID, 0x6000)}, /* ZTE AC8700 */
523         { USB_DEVICE(QUALCOMM_VENDOR_ID, 0x6613)}, /* Onda H600/ZTE MF330 */
524         { USB_DEVICE(MAXON_VENDOR_ID, 0x6280) }, /* BP3-USB & BP3-EXT HSDPA */
525         { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_UC864E) },
526         { USB_DEVICE(ZTE_VENDOR_ID, ZTE_PRODUCT_MF626) },
527         { USB_DEVICE(ZTE_VENDOR_ID, ZTE_PRODUCT_MF628) },
528         { USB_DEVICE(ZTE_VENDOR_ID, ZTE_PRODUCT_CDMA_TECH) },
529         { USB_DEVICE(ERICSSON_VENDOR_ID, ERICSSON_PRODUCT_F3507G) },
530         { } /* Terminating entry */
531 };
532 MODULE_DEVICE_TABLE(usb, option_ids);
533
534 static struct usb_driver option_driver = {
535         .name       = "option",
536         .probe      = usb_serial_probe,
537         .disconnect = usb_serial_disconnect,
538         .id_table   = option_ids,
539         .no_dynamic_id =        1,
540 };
541
542 /* The card has three separate interfaces, which the serial driver
543  * recognizes separately, thus num_port=1.
544  */
545
546 static struct usb_serial_driver option_1port_device = {
547         .driver = {
548                 .owner =        THIS_MODULE,
549                 .name =         "option1",
550         },
551         .description       = "GSM modem (1-port)",
552         .usb_driver        = &option_driver,
553         .id_table          = option_ids,
554         .num_interrupt_in  = NUM_DONT_CARE,
555         .num_bulk_in       = NUM_DONT_CARE,
556         .num_bulk_out      = NUM_DONT_CARE,
557         .num_ports         = 1,
558         .open              = option_open,
559         .close             = option_close,
560         .write             = option_write,
561         .write_room        = option_write_room,
562         .chars_in_buffer   = option_chars_in_buffer,
563         .throttle          = option_rx_throttle,
564         .unthrottle        = option_rx_unthrottle,
565         .ioctl             = option_ioctl,
566         .set_termios       = option_set_termios,
567         .break_ctl         = option_break_ctl,
568         .tiocmget          = option_tiocmget,
569         .tiocmset          = option_tiocmset,
570         .attach            = option_startup,
571         .shutdown          = option_shutdown,
572         .read_int_callback = option_instat_callback,
573 };
574
575 #ifdef CONFIG_USB_DEBUG
576 static int debug;
577 #else
578 #define debug 0
579 #endif
580
581 /* per port private data */
582
583 #define N_IN_URB 4
584 #define N_OUT_URB 1
585 #define IN_BUFLEN 4096
586 #define OUT_BUFLEN 128
587
588 struct option_port_private {
589         /* Input endpoints and buffer for this port */
590         struct urb *in_urbs[N_IN_URB];
591         char in_buffer[N_IN_URB][IN_BUFLEN];
592         /* Output endpoints and buffer for this port */
593         struct urb *out_urbs[N_OUT_URB];
594         char out_buffer[N_OUT_URB][OUT_BUFLEN];
595         unsigned long out_busy;         /* Bit vector of URBs in use */
596
597         /* Settings for the port */
598         int rts_state;  /* Handshaking pins (outputs) */
599         int dtr_state;
600         int cts_state;  /* Handshaking pins (inputs) */
601         int dsr_state;
602         int dcd_state;
603         int ri_state;
604
605         unsigned long tx_start_time[N_OUT_URB];
606 };
607
608 /* Functions used by new usb-serial code. */
609 static int __init option_init(void)
610 {
611         int retval;
612         retval = usb_serial_register(&option_1port_device);
613         if (retval)
614                 goto failed_1port_device_register;
615         retval = usb_register(&option_driver);
616         if (retval)
617                 goto failed_driver_register;
618
619         info(DRIVER_DESC ": " DRIVER_VERSION);
620
621         return 0;
622
623 failed_driver_register:
624         usb_serial_deregister (&option_1port_device);
625 failed_1port_device_register:
626         return retval;
627 }
628
629 static void __exit option_exit(void)
630 {
631         usb_deregister (&option_driver);
632         usb_serial_deregister (&option_1port_device);
633 }
634
635 module_init(option_init);
636 module_exit(option_exit);
637
638 static void option_rx_throttle(struct usb_serial_port *port)
639 {
640         dbg("%s", __FUNCTION__);
641 }
642
643 static void option_rx_unthrottle(struct usb_serial_port *port)
644 {
645         dbg("%s", __FUNCTION__);
646 }
647
648 static void option_break_ctl(struct usb_serial_port *port, int break_state)
649 {
650         /* Unfortunately, I don't know how to send a break */
651         dbg("%s", __FUNCTION__);
652 }
653
654 static void option_set_termios(struct usb_serial_port *port,
655                         struct ktermios *old_termios)
656 {
657         dbg("%s", __FUNCTION__);
658
659         option_send_setup(port);
660 }
661
662 static int option_tiocmget(struct usb_serial_port *port, struct file *file)
663 {
664         unsigned int value;
665         struct option_port_private *portdata;
666
667         portdata = usb_get_serial_port_data(port);
668
669         value = ((portdata->rts_state) ? TIOCM_RTS : 0) |
670                 ((portdata->dtr_state) ? TIOCM_DTR : 0) |
671                 ((portdata->cts_state) ? TIOCM_CTS : 0) |
672                 ((portdata->dsr_state) ? TIOCM_DSR : 0) |
673                 ((portdata->dcd_state) ? TIOCM_CAR : 0) |
674                 ((portdata->ri_state) ? TIOCM_RNG : 0);
675
676         return value;
677 }
678
679 static int option_tiocmset(struct usb_serial_port *port, struct file *file,
680                         unsigned int set, unsigned int clear)
681 {
682         struct option_port_private *portdata;
683
684         portdata = usb_get_serial_port_data(port);
685
686         if (set & TIOCM_RTS)
687                 portdata->rts_state = 1;
688         if (set & TIOCM_DTR)
689                 portdata->dtr_state = 1;
690
691         if (clear & TIOCM_RTS)
692                 portdata->rts_state = 0;
693         if (clear & TIOCM_DTR)
694                 portdata->dtr_state = 0;
695         return option_send_setup(port);
696 }
697
698 static int option_ioctl(struct usb_serial_port *port, struct file *file,
699                         unsigned int cmd, unsigned long arg)
700 {
701         return -ENOIOCTLCMD;
702 }
703
704 /* Write */
705 static int option_write(struct usb_serial_port *port,
706                         const unsigned char *buf, int count)
707 {
708         struct option_port_private *portdata;
709         int i;
710         int left, todo;
711         struct urb *this_urb = NULL; /* spurious */
712         int err;
713
714         portdata = usb_get_serial_port_data(port);
715
716         dbg("%s: write (%d chars)", __FUNCTION__, count);
717
718         i = 0;
719         left = count;
720         for (i=0; left > 0 && i < N_OUT_URB; i++) {
721                 todo = left;
722                 if (todo > OUT_BUFLEN)
723                         todo = OUT_BUFLEN;
724
725                 this_urb = portdata->out_urbs[i];
726                 if (test_and_set_bit(i, &portdata->out_busy)) {
727                         if (time_before(jiffies,
728                                         portdata->tx_start_time[i] + 10 * HZ))
729                                 continue;
730                         usb_unlink_urb(this_urb);
731                         continue;
732                 }
733                 if (this_urb->status != 0)
734                         dbg("usb_write %p failed (err=%d)",
735                                 this_urb, this_urb->status);
736
737                 dbg("%s: endpoint %d buf %d", __FUNCTION__,
738                         usb_pipeendpoint(this_urb->pipe), i);
739
740                 /* send the data */
741                 memcpy (this_urb->transfer_buffer, buf, todo);
742                 this_urb->transfer_buffer_length = todo;
743
744                 this_urb->dev = port->serial->dev;
745                 err = usb_submit_urb(this_urb, GFP_ATOMIC);
746                 if (err) {
747                         dbg("usb_submit_urb %p (write bulk) failed "
748                                 "(%d, has %d)", this_urb,
749                                 err, this_urb->status);
750                         clear_bit(i, &portdata->out_busy);
751                         continue;
752                 }
753                 portdata->tx_start_time[i] = jiffies;
754                 buf += todo;
755                 left -= todo;
756         }
757
758         count -= left;
759         dbg("%s: wrote (did %d)", __FUNCTION__, count);
760         return count;
761 }
762
763 static void option_indat_callback(struct urb *urb)
764 {
765         int err;
766         int endpoint;
767         struct usb_serial_port *port;
768         struct tty_struct *tty;
769         unsigned char *data = urb->transfer_buffer;
770         int status = urb->status;
771
772         dbg("%s: %p", __FUNCTION__, urb);
773
774         endpoint = usb_pipeendpoint(urb->pipe);
775         port = (struct usb_serial_port *) urb->context;
776
777         if (status) {
778                 dbg("%s: nonzero status: %d on endpoint %02x.",
779                     __FUNCTION__, status, endpoint);
780         } else {
781                 tty = port->tty;
782                 if (urb->actual_length) {
783                         tty_buffer_request_room(tty, urb->actual_length);
784                         tty_insert_flip_string(tty, data, urb->actual_length);
785                         tty_flip_buffer_push(tty);
786                 } else {
787                         dbg("%s: empty read urb received", __FUNCTION__);
788                 }
789
790                 /* Resubmit urb so we continue receiving */
791                 if (port->open_count && status != -ESHUTDOWN) {
792                         err = usb_submit_urb(urb, GFP_ATOMIC);
793                         if (err)
794                                 printk(KERN_ERR "%s: resubmit read urb failed. "
795                                         "(%d)", __FUNCTION__, err);
796                 }
797         }
798         return;
799 }
800
801 static void option_outdat_callback(struct urb *urb)
802 {
803         struct usb_serial_port *port;
804         struct option_port_private *portdata;
805         int i;
806
807         dbg("%s", __FUNCTION__);
808
809         port = (struct usb_serial_port *) urb->context;
810
811         usb_serial_port_softint(port);
812
813         portdata = usb_get_serial_port_data(port);
814         for (i = 0; i < N_OUT_URB; ++i) {
815                 if (portdata->out_urbs[i] == urb) {
816                         smp_mb__before_clear_bit();
817                         clear_bit(i, &portdata->out_busy);
818                         break;
819                 }
820         }
821 }
822
823 static void option_instat_callback(struct urb *urb)
824 {
825         int err;
826         int status = urb->status;
827         struct usb_serial_port *port = (struct usb_serial_port *) urb->context;
828         struct option_port_private *portdata = usb_get_serial_port_data(port);
829         struct usb_serial *serial = port->serial;
830
831         dbg("%s", __FUNCTION__);
832         dbg("%s: urb %p port %p has data %p", __FUNCTION__,urb,port,portdata);
833
834         if (status == 0) {
835                 struct usb_ctrlrequest *req_pkt =
836                                 (struct usb_ctrlrequest *)urb->transfer_buffer;
837
838                 if (!req_pkt) {
839                         dbg("%s: NULL req_pkt\n", __FUNCTION__);
840                         return;
841                 }
842                 if ((req_pkt->bRequestType == 0xA1) &&
843                                 (req_pkt->bRequest == 0x20)) {
844                         int old_dcd_state;
845                         unsigned char signals = *((unsigned char *)
846                                         urb->transfer_buffer +
847                                         sizeof(struct usb_ctrlrequest));
848
849                         dbg("%s: signal x%x", __FUNCTION__, signals);
850
851                         old_dcd_state = portdata->dcd_state;
852                         portdata->cts_state = 1;
853                         portdata->dcd_state = ((signals & 0x01) ? 1 : 0);
854                         portdata->dsr_state = ((signals & 0x02) ? 1 : 0);
855                         portdata->ri_state = ((signals & 0x08) ? 1 : 0);
856
857                         if (port->tty && !C_CLOCAL(port->tty) &&
858                                         old_dcd_state && !portdata->dcd_state)
859                                 tty_hangup(port->tty);
860                 } else {
861                         dbg("%s: type %x req %x", __FUNCTION__,
862                                 req_pkt->bRequestType,req_pkt->bRequest);
863                 }
864         } else
865                 dbg("%s: error %d", __FUNCTION__, status);
866
867         /* Resubmit urb so we continue receiving IRQ data */
868         if (status != -ESHUTDOWN) {
869                 urb->dev = serial->dev;
870                 err = usb_submit_urb(urb, GFP_ATOMIC);
871                 if (err)
872                         dbg("%s: resubmit intr urb failed. (%d)",
873                                 __FUNCTION__, err);
874         }
875 }
876
877 static int option_write_room(struct usb_serial_port *port)
878 {
879         struct option_port_private *portdata;
880         int i;
881         int data_len = 0;
882         struct urb *this_urb;
883
884         portdata = usb_get_serial_port_data(port);
885
886         for (i=0; i < N_OUT_URB; i++) {
887                 this_urb = portdata->out_urbs[i];
888                 if (this_urb && !test_bit(i, &portdata->out_busy))
889                         data_len += OUT_BUFLEN;
890         }
891
892         dbg("%s: %d", __FUNCTION__, data_len);
893         return data_len;
894 }
895
896 static int option_chars_in_buffer(struct usb_serial_port *port)
897 {
898         struct option_port_private *portdata;
899         int i;
900         int data_len = 0;
901         struct urb *this_urb;
902
903         portdata = usb_get_serial_port_data(port);
904
905         for (i=0; i < N_OUT_URB; i++) {
906                 this_urb = portdata->out_urbs[i];
907                 if (this_urb && test_bit(i, &portdata->out_busy))
908                         data_len += this_urb->transfer_buffer_length;
909         }
910         dbg("%s: %d", __FUNCTION__, data_len);
911         return data_len;
912 }
913
914 static int option_open(struct usb_serial_port *port, struct file *filp)
915 {
916         struct option_port_private *portdata;
917         struct usb_serial *serial = port->serial;
918         int i, err;
919         struct urb *urb;
920
921         portdata = usb_get_serial_port_data(port);
922
923         dbg("%s", __FUNCTION__);
924
925         /* Set some sane defaults */
926         portdata->rts_state = 1;
927         portdata->dtr_state = 1;
928
929         /* Reset low level data toggle and start reading from endpoints */
930         for (i = 0; i < N_IN_URB; i++) {
931                 urb = portdata->in_urbs[i];
932                 if (! urb)
933                         continue;
934                 if (urb->dev != serial->dev) {
935                         dbg("%s: dev %p != %p", __FUNCTION__,
936                                 urb->dev, serial->dev);
937                         continue;
938                 }
939
940                 /*
941                  * make sure endpoint data toggle is synchronized with the
942                  * device
943                  */
944                 usb_clear_halt(urb->dev, urb->pipe);
945
946                 err = usb_submit_urb(urb, GFP_KERNEL);
947                 if (err) {
948                         dbg("%s: submit urb %d failed (%d) %d",
949                                 __FUNCTION__, i, err,
950                                 urb->transfer_buffer_length);
951                 }
952         }
953
954         /* Reset low level data toggle on out endpoints */
955         for (i = 0; i < N_OUT_URB; i++) {
956                 urb = portdata->out_urbs[i];
957                 if (! urb)
958                         continue;
959                 urb->dev = serial->dev;
960                 /* usb_settoggle(urb->dev, usb_pipeendpoint(urb->pipe),
961                                 usb_pipeout(urb->pipe), 0); */
962         }
963
964         port->tty->low_latency = 1;
965
966         option_send_setup(port);
967
968         return (0);
969 }
970
971 static void option_close(struct usb_serial_port *port, struct file *filp)
972 {
973         int i;
974         struct usb_serial *serial = port->serial;
975         struct option_port_private *portdata;
976
977         dbg("%s", __FUNCTION__);
978         portdata = usb_get_serial_port_data(port);
979
980         portdata->rts_state = 0;
981         portdata->dtr_state = 0;
982
983         if (serial->dev) {
984                 option_send_setup(port);
985
986                 /* Stop reading/writing urbs */
987                 for (i = 0; i < N_IN_URB; i++)
988                         usb_kill_urb(portdata->in_urbs[i]);
989                 for (i = 0; i < N_OUT_URB; i++)
990                         usb_kill_urb(portdata->out_urbs[i]);
991         }
992         port->tty = NULL;
993 }
994
995 /* Helper functions used by option_setup_urbs */
996 static struct urb *option_setup_urb(struct usb_serial *serial, int endpoint,
997                 int dir, void *ctx, char *buf, int len,
998                 void (*callback)(struct urb *))
999 {
1000         struct urb *urb;
1001
1002         if (endpoint == -1)
1003                 return NULL;            /* endpoint not needed */
1004
1005         urb = usb_alloc_urb(0, GFP_KERNEL);             /* No ISO */
1006         if (urb == NULL) {
1007                 dbg("%s: alloc for endpoint %d failed.", __FUNCTION__, endpoint);
1008                 return NULL;
1009         }
1010
1011                 /* Fill URB using supplied data. */
1012         usb_fill_bulk_urb(urb, serial->dev,
1013                       usb_sndbulkpipe(serial->dev, endpoint) | dir,
1014                       buf, len, callback, ctx);
1015
1016         return urb;
1017 }
1018
1019 /* Setup urbs */
1020 static void option_setup_urbs(struct usb_serial *serial)
1021 {
1022         int i,j;
1023         struct usb_serial_port *port;
1024         struct option_port_private *portdata;
1025
1026         dbg("%s", __FUNCTION__);
1027
1028         for (i = 0; i < serial->num_ports; i++) {
1029                 port = serial->port[i];
1030                 portdata = usb_get_serial_port_data(port);
1031
1032         /* Do indat endpoints first */
1033                 for (j = 0; j < N_IN_URB; ++j) {
1034                         portdata->in_urbs[j] = option_setup_urb (serial,
1035                         port->bulk_in_endpointAddress, USB_DIR_IN, port,
1036                         portdata->in_buffer[j], IN_BUFLEN, option_indat_callback);
1037                 }
1038
1039                 /* outdat endpoints */
1040                 for (j = 0; j < N_OUT_URB; ++j) {
1041                         portdata->out_urbs[j] = option_setup_urb (serial,
1042                         port->bulk_out_endpointAddress, USB_DIR_OUT, port,
1043                         portdata->out_buffer[j], OUT_BUFLEN, option_outdat_callback);
1044                 }
1045         }
1046 }
1047
1048 static int option_send_setup(struct usb_serial_port *port)
1049 {
1050         struct usb_serial *serial = port->serial;
1051         struct option_port_private *portdata;
1052
1053         dbg("%s", __FUNCTION__);
1054
1055         if (port->number != 0)
1056                 return 0;
1057
1058         portdata = usb_get_serial_port_data(port);
1059
1060         if (port->tty) {
1061                 int val = 0;
1062                 if (portdata->dtr_state)
1063                         val |= 0x01;
1064                 if (portdata->rts_state)
1065                         val |= 0x02;
1066
1067                 return usb_control_msg(serial->dev,
1068                                 usb_rcvctrlpipe(serial->dev, 0),
1069                                 0x22,0x21,val,0,NULL,0,USB_CTRL_SET_TIMEOUT);
1070         }
1071
1072         return 0;
1073 }
1074
1075 static int option_startup(struct usb_serial *serial)
1076 {
1077         int i, err;
1078         struct usb_serial_port *port;
1079         struct option_port_private *portdata;
1080
1081         dbg("%s", __FUNCTION__);
1082
1083         /* Now setup per port private data */
1084         for (i = 0; i < serial->num_ports; i++) {
1085                 port = serial->port[i];
1086                 portdata = kzalloc(sizeof(*portdata), GFP_KERNEL);
1087                 if (!portdata) {
1088                         dbg("%s: kmalloc for option_port_private (%d) failed!.",
1089                                         __FUNCTION__, i);
1090                         return (1);
1091                 }
1092
1093                 usb_set_serial_port_data(port, portdata);
1094
1095                 if (! port->interrupt_in_urb)
1096                         continue;
1097                 err = usb_submit_urb(port->interrupt_in_urb, GFP_KERNEL);
1098                 if (err)
1099                         dbg("%s: submit irq_in urb failed %d",
1100                                 __FUNCTION__, err);
1101         }
1102
1103         option_setup_urbs(serial);
1104
1105         return (0);
1106 }
1107
1108 static void option_shutdown(struct usb_serial *serial)
1109 {
1110         int i, j;
1111         struct usb_serial_port *port;
1112         struct option_port_private *portdata;
1113
1114         dbg("%s", __FUNCTION__);
1115
1116         /* Stop reading/writing urbs */
1117         for (i = 0; i < serial->num_ports; ++i) {
1118                 port = serial->port[i];
1119                 portdata = usb_get_serial_port_data(port);
1120                 for (j = 0; j < N_IN_URB; j++)
1121                         usb_kill_urb(portdata->in_urbs[j]);
1122                 for (j = 0; j < N_OUT_URB; j++)
1123                         usb_kill_urb(portdata->out_urbs[j]);
1124         }
1125
1126         /* Now free them */
1127         for (i = 0; i < serial->num_ports; ++i) {
1128                 port = serial->port[i];
1129                 portdata = usb_get_serial_port_data(port);
1130
1131                 for (j = 0; j < N_IN_URB; j++) {
1132                         if (portdata->in_urbs[j]) {
1133                                 usb_free_urb(portdata->in_urbs[j]);
1134                                 portdata->in_urbs[j] = NULL;
1135                         }
1136                 }
1137                 for (j = 0; j < N_OUT_URB; j++) {
1138                         if (portdata->out_urbs[j]) {
1139                                 usb_free_urb(portdata->out_urbs[j]);
1140                                 portdata->out_urbs[j] = NULL;
1141                         }
1142                 }
1143         }
1144
1145         /* Now free per port private data */
1146         for (i = 0; i < serial->num_ports; i++) {
1147                 port = serial->port[i];
1148                 kfree(usb_get_serial_port_data(port));
1149         }
1150 }
1151
1152 MODULE_AUTHOR(DRIVER_AUTHOR);
1153 MODULE_DESCRIPTION(DRIVER_DESC);
1154 MODULE_VERSION(DRIVER_VERSION);
1155 MODULE_LICENSE("GPL");
1156
1157 #ifdef CONFIG_USB_DEBUG
1158 module_param(debug, bool, S_IRUGO | S_IWUSR);
1159 MODULE_PARM_DESC(debug, "Debug messages");
1160 #endif
1161
Note: See TracBrowser for help on using the browser.