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