xref: /linux/drivers/usb/serial/option.c (revision b233b28eac0cc37d07c2d007ea08c86c778c5af4)
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			0x1900
298 
299 static struct usb_device_id option_ids[] = {
300 	{ USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_COLT) },
301 	{ USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_RICOLA) },
302 	{ USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_RICOLA_LIGHT) },
303 	{ USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_RICOLA_QUAD) },
304 	{ USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_RICOLA_QUAD_LIGHT) },
305 	{ USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_RICOLA_NDIS) },
306 	{ USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_RICOLA_NDIS_LIGHT) },
307 	{ USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_RICOLA_NDIS_QUAD) },
308 	{ USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_RICOLA_NDIS_QUAD_LIGHT) },
309 	{ USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_COBRA) },
310 	{ USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_COBRA_BUS) },
311 	{ USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_VIPER) },
312 	{ USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_VIPER_BUS) },
313 	{ USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_GT_MAX_READY) },
314 	{ USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_FUJI_MODEM_LIGHT) },
315 	{ USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_FUJI_MODEM_GT) },
316 	{ USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_FUJI_MODEM_EX) },
317 	{ USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_KOI_MODEM) },
318 	{ USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_SCORPION_MODEM) },
319 	{ USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_ETNA_MODEM) },
320 	{ USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_ETNA_MODEM_LITE) },
321 	{ USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_ETNA_MODEM_GT) },
322 	{ USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_ETNA_MODEM_EX) },
323 	{ USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_ETNA_KOI_MODEM) },
324 	{ USB_DEVICE(QUANTA_VENDOR_ID, QUANTA_PRODUCT_Q101) },
325 	{ USB_DEVICE(QUANTA_VENDOR_ID, QUANTA_PRODUCT_Q111) },
326 	{ USB_DEVICE(QUANTA_VENDOR_ID, QUANTA_PRODUCT_GLX) },
327 	{ USB_DEVICE(QUANTA_VENDOR_ID, QUANTA_PRODUCT_GKE) },
328 	{ USB_DEVICE(QUANTA_VENDOR_ID, QUANTA_PRODUCT_GLE) },
329 	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E600, 0xff, 0xff, 0xff) },
330 	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E220, 0xff, 0xff, 0xff) },
331 	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E220BIS, 0xff, 0xff, 0xff) },
332 	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1401, 0xff, 0xff, 0xff) },
333 	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1402, 0xff, 0xff, 0xff) },
334 	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1403, 0xff, 0xff, 0xff) },
335 	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1404, 0xff, 0xff, 0xff) },
336 	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1405, 0xff, 0xff, 0xff) },
337 	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1406, 0xff, 0xff, 0xff) },
338 	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1407, 0xff, 0xff, 0xff) },
339 	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1408, 0xff, 0xff, 0xff) },
340 	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1409, 0xff, 0xff, 0xff) },
341 	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E140A, 0xff, 0xff, 0xff) },
342 	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E140B, 0xff, 0xff, 0xff) },
343 	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E140C, 0xff, 0xff, 0xff) },
344 	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E140D, 0xff, 0xff, 0xff) },
345 	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E140E, 0xff, 0xff, 0xff) },
346 	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E140F, 0xff, 0xff, 0xff) },
347 	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1410, 0xff, 0xff, 0xff) },
348 	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1411, 0xff, 0xff, 0xff) },
349 	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1412, 0xff, 0xff, 0xff) },
350 	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1413, 0xff, 0xff, 0xff) },
351 	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1414, 0xff, 0xff, 0xff) },
352 	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1415, 0xff, 0xff, 0xff) },
353 	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1416, 0xff, 0xff, 0xff) },
354 	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1417, 0xff, 0xff, 0xff) },
355 	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1418, 0xff, 0xff, 0xff) },
356 	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1419, 0xff, 0xff, 0xff) },
357 	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E141A, 0xff, 0xff, 0xff) },
358 	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E141B, 0xff, 0xff, 0xff) },
359 	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E141C, 0xff, 0xff, 0xff) },
360 	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E141D, 0xff, 0xff, 0xff) },
361 	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E141E, 0xff, 0xff, 0xff) },
362 	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E141F, 0xff, 0xff, 0xff) },
363 	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1420, 0xff, 0xff, 0xff) },
364 	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1421, 0xff, 0xff, 0xff) },
365 	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1422, 0xff, 0xff, 0xff) },
366 	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1423, 0xff, 0xff, 0xff) },
367 	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1424, 0xff, 0xff, 0xff) },
368 	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1425, 0xff, 0xff, 0xff) },
369 	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1426, 0xff, 0xff, 0xff) },
370 	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1427, 0xff, 0xff, 0xff) },
371 	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1428, 0xff, 0xff, 0xff) },
372 	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1429, 0xff, 0xff, 0xff) },
373 	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E142A, 0xff, 0xff, 0xff) },
374 	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E142B, 0xff, 0xff, 0xff) },
375 	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E142C, 0xff, 0xff, 0xff) },
376 	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E142D, 0xff, 0xff, 0xff) },
377 	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E142E, 0xff, 0xff, 0xff) },
378 	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E142F, 0xff, 0xff, 0xff) },
379 	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1430, 0xff, 0xff, 0xff) },
380 	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1431, 0xff, 0xff, 0xff) },
381 	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1432, 0xff, 0xff, 0xff) },
382 	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1433, 0xff, 0xff, 0xff) },
383 	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1434, 0xff, 0xff, 0xff) },
384 	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1435, 0xff, 0xff, 0xff) },
385 	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1436, 0xff, 0xff, 0xff) },
386 	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1437, 0xff, 0xff, 0xff) },
387 	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1438, 0xff, 0xff, 0xff) },
388 	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1439, 0xff, 0xff, 0xff) },
389 	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E143A, 0xff, 0xff, 0xff) },
390 	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E143B, 0xff, 0xff, 0xff) },
391 	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E143C, 0xff, 0xff, 0xff) },
392 	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E143D, 0xff, 0xff, 0xff) },
393 	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E143E, 0xff, 0xff, 0xff) },
394 	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E143F, 0xff, 0xff, 0xff) },
395 	{ USB_DEVICE(AMOI_VENDOR_ID, AMOI_PRODUCT_9508) },
396 	{ USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_V640) }, /* Novatel Merlin V640/XV620 */
397 	{ USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_V620) }, /* Novatel Merlin V620/S620 */
398 	{ USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_V740) }, /* Novatel Merlin EX720/V740/X720 */
399 	{ USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_V720) }, /* Novatel Merlin V720/S720/PC720 */
400 	{ USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_U730) }, /* Novatel U730/U740 (VF version) */
401 	{ USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_U740) }, /* Novatel U740 */
402 	{ USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_U870) }, /* Novatel U870 */
403 	{ USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_XU870) }, /* Novatel Merlin XU870 HSDPA/3G */
404 	{ USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_X950D) }, /* Novatel X950D */
405 	{ USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_EV620) }, /* Novatel EV620/ES620 CDMA/EV-DO */
406 	{ USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_ES720) }, /* Novatel ES620/ES720/U720/USB720 */
407 	{ USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_E725) }, /* Novatel E725/E726 */
408 	{ USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_ES620) }, /* Novatel Merlin ES620 SM Bus */
409 	{ USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_EU730) }, /* Novatel EU730 and Vodafone EU740 */
410 	{ USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_EU740) }, /* Novatel non-Vodafone EU740 */
411 	{ USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_EU870D) }, /* Novatel EU850D/EU860D/EU870D */
412 	{ USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_MC950D) }, /* Novatel MC930D/MC950D */
413 	{ USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_MC727) }, /* Novatel MC727/U727/USB727 */
414 	{ USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_EVDO_FULLSPEED) }, /* Novatel EVDO product */
415 	{ USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_HSPA_FULLSPEED) }, /* Novatel HSPA product */
416 	{ USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_EVDO_EMBEDDED_FULLSPEED) }, /* Novatel EVDO Embedded product */
417 	{ USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_HSPA_EMBEDDED_FULLSPEED) }, /* Novatel HSPA Embedded product */
418 	{ USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_EVDO_HIGHSPEED) }, /* Novatel EVDO product */
419 	{ USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_HSPA_HIGHSPEED) }, /* Novatel HSPA product */
420 	{ USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_EVDO_EMBEDDED_HIGHSPEED) }, /* Novatel EVDO Embedded product */
421 	{ USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_HSPA_EMBEDDED_HIGHSPEED) }, /* Novatel HSPA Embedded product */
422 	{ USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_GLOBAL) }, /* Novatel Global product */
423 
424 	{ USB_DEVICE(AMOI_VENDOR_ID, AMOI_PRODUCT_H01) },
425 	{ USB_DEVICE(AMOI_VENDOR_ID, AMOI_PRODUCT_H01A) },
426 	{ USB_DEVICE(AMOI_VENDOR_ID, AMOI_PRODUCT_H02) },
427 
428 	{ USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5700_MINICARD) },		/* Dell Wireless 5700 Mobile Broadband CDMA/EVDO Mini-Card == Novatel Expedite EV620 CDMA/EV-DO */
429 	{ USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5500_MINICARD) },		/* Dell Wireless 5500 Mobile Broadband HSDPA Mini-Card == Novatel Expedite EU740 HSDPA/3G */
430 	{ USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5505_MINICARD) },		/* Dell Wireless 5505 Mobile Broadband HSDPA Mini-Card == Novatel Expedite EU740 HSDPA/3G */
431 	{ USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5700_EXPRESSCARD) },		/* Dell Wireless 5700 Mobile Broadband CDMA/EVDO ExpressCard == Novatel Merlin XV620 CDMA/EV-DO */
432 	{ USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5510_EXPRESSCARD) },		/* Dell Wireless 5510 Mobile Broadband HSDPA ExpressCard == Novatel Merlin XU870 HSDPA/3G */
433 	{ 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 */
434 	{ 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 */
435 	{ USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5720_MINICARD_VZW) }, 	/* Dell Wireless 5720 == Novatel EV620 CDMA/EV-DO */
436 	{ USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5720_MINICARD_SPRINT) }, 	/* Dell Wireless 5720 == Novatel EV620 CDMA/EV-DO */
437 	{ USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5720_MINICARD_TELUS) }, 	/* Dell Wireless 5720 == Novatel EV620 CDMA/EV-DO */
438 	{ USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5520_MINICARD_CINGULAR) },	/* Dell Wireless HSDPA 5520 == Novatel Expedite EU860D */
439 	{ USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5520_MINICARD_GENERIC_L) },	/* Dell Wireless HSDPA 5520 */
440 	{ USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5520_MINICARD_GENERIC_I) },	/* Dell Wireless 5520 Voda I Mobile Broadband (3G HSDPA) Minicard */
441 	{ USB_DEVICE(DELL_VENDOR_ID, 0x8147) },					/* Dell Wireless 5530 Mobile Broadband (3G HSPA) Mini-Card */
442 	{ USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5730_MINICARD_SPRINT) },	/* Dell Wireless 5730 Mobile Broadband EVDO/HSPA Mini-Card */
443 	{ USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5730_MINICARD_TELUS) },	/* Dell Wireless 5730 Mobile Broadband EVDO/HSPA Mini-Card */
444 	{ USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5730_MINICARD_VZW) }, 	/* Dell Wireless 5730 Mobile Broadband EVDO/HSPA Mini-Card */
445 	{ USB_DEVICE(ANYDATA_VENDOR_ID, ANYDATA_PRODUCT_ADU_E100A) },	/* ADU-E100, ADU-310 */
446 	{ USB_DEVICE(ANYDATA_VENDOR_ID, ANYDATA_PRODUCT_ADU_500A) },
447 	{ USB_DEVICE(ANYDATA_VENDOR_ID, ANYDATA_PRODUCT_ADU_620UW) },
448 	{ USB_DEVICE(AXESSTEL_VENDOR_ID, AXESSTEL_PRODUCT_MV110H) },
449 	{ USB_DEVICE(ONDA_VENDOR_ID, ONDA_PRODUCT_MSA501HS) },
450 	{ USB_DEVICE(ONDA_VENDOR_ID, ONDA_PRODUCT_ET502HS) },
451 	{ USB_DEVICE(ONDA_VENDOR_ID, 0x0003) },
452 	{ USB_DEVICE(ONDA_VENDOR_ID, 0x0004) },
453 	{ USB_DEVICE(ONDA_VENDOR_ID, 0x0005) },
454 	{ USB_DEVICE(ONDA_VENDOR_ID, 0x0006) },
455 	{ USB_DEVICE(ONDA_VENDOR_ID, 0x0007) },
456 	{ USB_DEVICE(ONDA_VENDOR_ID, 0x0008) },
457 	{ USB_DEVICE(ONDA_VENDOR_ID, 0x0009) },
458 	{ USB_DEVICE(ONDA_VENDOR_ID, 0x000a) },
459 	{ USB_DEVICE(ONDA_VENDOR_ID, 0x000b) },
460 	{ USB_DEVICE(ONDA_VENDOR_ID, 0x000c) },
461 	{ USB_DEVICE(ONDA_VENDOR_ID, 0x000d) },
462 	{ USB_DEVICE(ONDA_VENDOR_ID, 0x000e) },
463 	{ USB_DEVICE(ONDA_VENDOR_ID, 0x000f) },
464 	{ USB_DEVICE(ONDA_VENDOR_ID, 0x0010) },
465 	{ USB_DEVICE(ONDA_VENDOR_ID, 0x0011) },
466 	{ USB_DEVICE(ONDA_VENDOR_ID, 0x0012) },
467 	{ USB_DEVICE(ONDA_VENDOR_ID, 0x0013) },
468 	{ USB_DEVICE(ONDA_VENDOR_ID, 0x0014) },
469 	{ USB_DEVICE(ONDA_VENDOR_ID, 0x0015) },
470 	{ USB_DEVICE(ONDA_VENDOR_ID, 0x0016) },
471 	{ USB_DEVICE(ONDA_VENDOR_ID, 0x0017) },
472 	{ USB_DEVICE(ONDA_VENDOR_ID, 0x0018) },
473 	{ USB_DEVICE(ONDA_VENDOR_ID, 0x0019) },
474 	{ USB_DEVICE(ONDA_VENDOR_ID, 0x0020) },
475 	{ USB_DEVICE(ONDA_VENDOR_ID, 0x0021) },
476 	{ USB_DEVICE(ONDA_VENDOR_ID, 0x0022) },
477 	{ USB_DEVICE(ONDA_VENDOR_ID, 0x0023) },
478 	{ USB_DEVICE(ONDA_VENDOR_ID, 0x0024) },
479 	{ USB_DEVICE(ONDA_VENDOR_ID, 0x0025) },
480 	{ USB_DEVICE(ONDA_VENDOR_ID, 0x0026) },
481 	{ USB_DEVICE(ONDA_VENDOR_ID, 0x0027) },
482 	{ USB_DEVICE(ONDA_VENDOR_ID, 0x0028) },
483 	{ USB_DEVICE(ONDA_VENDOR_ID, 0x0029) },
484 	{ USB_DEVICE(ONDA_VENDOR_ID, ONDA_PRODUCT_MT503HS) },
485 	{ USB_DEVICE(YISO_VENDOR_ID, YISO_PRODUCT_U893) },
486 	{ USB_DEVICE(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_C100_1) },
487 	{ USB_DEVICE(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_C100_2) },
488 	{ USB_DEVICE(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_1004) },
489 	{ USB_DEVICE(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_1005) },
490 	{ USB_DEVICE(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_1006) },
491 	{ USB_DEVICE(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_1007) },
492 	{ USB_DEVICE(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_1008) },
493 	{ USB_DEVICE(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_1009) },
494 	{ USB_DEVICE(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_100A) },
495 	{ USB_DEVICE(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_100B) },
496 	{ USB_DEVICE(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_100C) },
497 	{ USB_DEVICE(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_100D) },
498 	{ USB_DEVICE(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_100E) },
499 	{ USB_DEVICE(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_100F) },
500 	{ USB_DEVICE(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_1010) },
501 	{ USB_DEVICE(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_1011) },
502 	{ USB_DEVICE(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_1012) },
503 	{ USB_DEVICE(KYOCERA_VENDOR_ID, KYOCERA_PRODUCT_KPC650) },
504 	{ USB_DEVICE(KYOCERA_VENDOR_ID, KYOCERA_PRODUCT_KPC680) },
505 	{ USB_DEVICE(QUALCOMM_VENDOR_ID, 0x6000)}, /* ZTE AC8700 */
506 	{ USB_DEVICE(QUALCOMM_VENDOR_ID, 0x6613)}, /* Onda H600/ZTE MF330 */
507 	{ USB_DEVICE(MAXON_VENDOR_ID, 0x6280) }, /* BP3-USB & BP3-EXT HSDPA */
508 	{ USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_UC864E) },
509 	{ USB_DEVICE(ZTE_VENDOR_ID, ZTE_PRODUCT_MF626) },
510 	{ USB_DEVICE(ZTE_VENDOR_ID, ZTE_PRODUCT_MF628) },
511 	{ USB_DEVICE(ZTE_VENDOR_ID, ZTE_PRODUCT_CDMA_TECH) },
512 	{ USB_DEVICE(ERICSSON_VENDOR_ID, ERICSSON_PRODUCT_F3507G) },
513 	{ } /* Terminating entry */
514 };
515 MODULE_DEVICE_TABLE(usb, option_ids);
516 
517 static struct usb_driver option_driver = {
518 	.name       = "option",
519 	.probe      = usb_serial_probe,
520 	.disconnect = usb_serial_disconnect,
521 	.id_table   = option_ids,
522 	.no_dynamic_id = 	1,
523 };
524 
525 /* The card has three separate interfaces, which the serial driver
526  * recognizes separately, thus num_port=1.
527  */
528 
529 static struct usb_serial_driver option_1port_device = {
530 	.driver = {
531 		.owner =	THIS_MODULE,
532 		.name =		"option1",
533 	},
534 	.description       = "GSM modem (1-port)",
535 	.usb_driver        = &option_driver,
536 	.id_table          = option_ids,
537 	.num_ports         = 1,
538 	.open              = option_open,
539 	.close             = option_close,
540 	.write             = option_write,
541 	.write_room        = option_write_room,
542 	.chars_in_buffer   = option_chars_in_buffer,
543 	.set_termios       = option_set_termios,
544 	.tiocmget          = option_tiocmget,
545 	.tiocmset          = option_tiocmset,
546 	.attach            = option_startup,
547 	.shutdown          = option_shutdown,
548 	.read_int_callback = option_instat_callback,
549 };
550 
551 static int debug;
552 
553 /* per port private data */
554 
555 #define N_IN_URB 4
556 #define N_OUT_URB 4
557 #define IN_BUFLEN 4096
558 #define OUT_BUFLEN 4096
559 
560 struct option_port_private {
561 	/* Input endpoints and buffer for this port */
562 	struct urb *in_urbs[N_IN_URB];
563 	u8 *in_buffer[N_IN_URB];
564 	/* Output endpoints and buffer for this port */
565 	struct urb *out_urbs[N_OUT_URB];
566 	u8 *out_buffer[N_OUT_URB];
567 	unsigned long out_busy;		/* Bit vector of URBs in use */
568 
569 	/* Settings for the port */
570 	int rts_state;	/* Handshaking pins (outputs) */
571 	int dtr_state;
572 	int cts_state;	/* Handshaking pins (inputs) */
573 	int dsr_state;
574 	int dcd_state;
575 	int ri_state;
576 
577 	unsigned long tx_start_time[N_OUT_URB];
578 };
579 
580 /* Functions used by new usb-serial code. */
581 static int __init option_init(void)
582 {
583 	int retval;
584 	retval = usb_serial_register(&option_1port_device);
585 	if (retval)
586 		goto failed_1port_device_register;
587 	retval = usb_register(&option_driver);
588 	if (retval)
589 		goto failed_driver_register;
590 
591 	printk(KERN_INFO KBUILD_MODNAME ": " DRIVER_VERSION ":"
592 	       DRIVER_DESC "\n");
593 
594 	return 0;
595 
596 failed_driver_register:
597 	usb_serial_deregister(&option_1port_device);
598 failed_1port_device_register:
599 	return retval;
600 }
601 
602 static void __exit option_exit(void)
603 {
604 	usb_deregister(&option_driver);
605 	usb_serial_deregister(&option_1port_device);
606 }
607 
608 module_init(option_init);
609 module_exit(option_exit);
610 
611 static void option_set_termios(struct tty_struct *tty,
612 		struct usb_serial_port *port, struct ktermios *old_termios)
613 {
614 	dbg("%s", __func__);
615 	/* Doesn't support option setting */
616 	tty_termios_copy_hw(tty->termios, old_termios);
617 	option_send_setup(tty, port);
618 }
619 
620 static int option_tiocmget(struct tty_struct *tty, struct file *file)
621 {
622 	struct usb_serial_port *port = tty->driver_data;
623 	unsigned int value;
624 	struct option_port_private *portdata;
625 
626 	portdata = usb_get_serial_port_data(port);
627 
628 	value = ((portdata->rts_state) ? TIOCM_RTS : 0) |
629 		((portdata->dtr_state) ? TIOCM_DTR : 0) |
630 		((portdata->cts_state) ? TIOCM_CTS : 0) |
631 		((portdata->dsr_state) ? TIOCM_DSR : 0) |
632 		((portdata->dcd_state) ? TIOCM_CAR : 0) |
633 		((portdata->ri_state) ? TIOCM_RNG : 0);
634 
635 	return value;
636 }
637 
638 static int option_tiocmset(struct tty_struct *tty, struct file *file,
639 			unsigned int set, unsigned int clear)
640 {
641 	struct usb_serial_port *port = tty->driver_data;
642 	struct option_port_private *portdata;
643 
644 	portdata = usb_get_serial_port_data(port);
645 
646 	/* FIXME: what locks portdata fields ? */
647 	if (set & TIOCM_RTS)
648 		portdata->rts_state = 1;
649 	if (set & TIOCM_DTR)
650 		portdata->dtr_state = 1;
651 
652 	if (clear & TIOCM_RTS)
653 		portdata->rts_state = 0;
654 	if (clear & TIOCM_DTR)
655 		portdata->dtr_state = 0;
656 	return option_send_setup(tty, port);
657 }
658 
659 /* Write */
660 static int option_write(struct tty_struct *tty, struct usb_serial_port *port,
661 			const unsigned char *buf, int count)
662 {
663 	struct option_port_private *portdata;
664 	int i;
665 	int left, todo;
666 	struct urb *this_urb = NULL; /* spurious */
667 	int err;
668 
669 	portdata = usb_get_serial_port_data(port);
670 
671 	dbg("%s: write (%d chars)", __func__, count);
672 
673 	i = 0;
674 	left = count;
675 	for (i = 0; left > 0 && i < N_OUT_URB; i++) {
676 		todo = left;
677 		if (todo > OUT_BUFLEN)
678 			todo = OUT_BUFLEN;
679 
680 		this_urb = portdata->out_urbs[i];
681 		if (test_and_set_bit(i, &portdata->out_busy)) {
682 			if (time_before(jiffies,
683 					portdata->tx_start_time[i] + 10 * HZ))
684 				continue;
685 			usb_unlink_urb(this_urb);
686 			continue;
687 		}
688 		dbg("%s: endpoint %d buf %d", __func__,
689 			usb_pipeendpoint(this_urb->pipe), i);
690 
691 		/* send the data */
692 		memcpy(this_urb->transfer_buffer, buf, todo);
693 		this_urb->transfer_buffer_length = todo;
694 
695 		this_urb->dev = port->serial->dev;
696 		err = usb_submit_urb(this_urb, GFP_ATOMIC);
697 		if (err) {
698 			dbg("usb_submit_urb %p (write bulk) failed "
699 				"(%d)", this_urb, err);
700 			clear_bit(i, &portdata->out_busy);
701 			continue;
702 		}
703 		portdata->tx_start_time[i] = jiffies;
704 		buf += todo;
705 		left -= todo;
706 	}
707 
708 	count -= left;
709 	dbg("%s: wrote (did %d)", __func__, count);
710 	return count;
711 }
712 
713 static void option_indat_callback(struct urb *urb)
714 {
715 	int err;
716 	int endpoint;
717 	struct usb_serial_port *port;
718 	struct tty_struct *tty;
719 	unsigned char *data = urb->transfer_buffer;
720 	int status = urb->status;
721 
722 	dbg("%s: %p", __func__, urb);
723 
724 	endpoint = usb_pipeendpoint(urb->pipe);
725 	port =  urb->context;
726 
727 	if (status) {
728 		dbg("%s: nonzero status: %d on endpoint %02x.",
729 		    __func__, status, endpoint);
730 	} else {
731 		tty = tty_port_tty_get(&port->port);
732 		if (urb->actual_length) {
733 			tty_buffer_request_room(tty, urb->actual_length);
734 			tty_insert_flip_string(tty, data, urb->actual_length);
735 			tty_flip_buffer_push(tty);
736 		} else
737 			dbg("%s: empty read urb received", __func__);
738 		tty_kref_put(tty);
739 
740 		/* Resubmit urb so we continue receiving */
741 		if (port->port.count && status != -ESHUTDOWN) {
742 			err = usb_submit_urb(urb, GFP_ATOMIC);
743 			if (err)
744 				printk(KERN_ERR "%s: resubmit read urb failed. "
745 					"(%d)", __func__, err);
746 		}
747 	}
748 	return;
749 }
750 
751 static void option_outdat_callback(struct urb *urb)
752 {
753 	struct usb_serial_port *port;
754 	struct option_port_private *portdata;
755 	int i;
756 
757 	dbg("%s", __func__);
758 
759 	port =  urb->context;
760 
761 	usb_serial_port_softint(port);
762 
763 	portdata = usb_get_serial_port_data(port);
764 	for (i = 0; i < N_OUT_URB; ++i) {
765 		if (portdata->out_urbs[i] == urb) {
766 			smp_mb__before_clear_bit();
767 			clear_bit(i, &portdata->out_busy);
768 			break;
769 		}
770 	}
771 }
772 
773 static void option_instat_callback(struct urb *urb)
774 {
775 	int err;
776 	int status = urb->status;
777 	struct usb_serial_port *port =  urb->context;
778 	struct option_port_private *portdata = usb_get_serial_port_data(port);
779 	struct usb_serial *serial = port->serial;
780 
781 	dbg("%s", __func__);
782 	dbg("%s: urb %p port %p has data %p", __func__, urb, port, portdata);
783 
784 	if (status == 0) {
785 		struct usb_ctrlrequest *req_pkt =
786 				(struct usb_ctrlrequest *)urb->transfer_buffer;
787 
788 		if (!req_pkt) {
789 			dbg("%s: NULL req_pkt\n", __func__);
790 			return;
791 		}
792 		if ((req_pkt->bRequestType == 0xA1) &&
793 				(req_pkt->bRequest == 0x20)) {
794 			int old_dcd_state;
795 			unsigned char signals = *((unsigned char *)
796 					urb->transfer_buffer +
797 					sizeof(struct usb_ctrlrequest));
798 
799 			dbg("%s: signal x%x", __func__, signals);
800 
801 			old_dcd_state = portdata->dcd_state;
802 			portdata->cts_state = 1;
803 			portdata->dcd_state = ((signals & 0x01) ? 1 : 0);
804 			portdata->dsr_state = ((signals & 0x02) ? 1 : 0);
805 			portdata->ri_state = ((signals & 0x08) ? 1 : 0);
806 
807 			if (old_dcd_state && !portdata->dcd_state) {
808 				struct tty_struct *tty =
809 						tty_port_tty_get(&port->port);
810 				if (tty && !C_CLOCAL(tty))
811 					tty_hangup(tty);
812 				tty_kref_put(tty);
813 			}
814 		} else {
815 			dbg("%s: type %x req %x", __func__,
816 				req_pkt->bRequestType, req_pkt->bRequest);
817 		}
818 	} else
819 		dbg("%s: error %d", __func__, status);
820 
821 	/* Resubmit urb so we continue receiving IRQ data */
822 	if (status != -ESHUTDOWN) {
823 		urb->dev = serial->dev;
824 		err = usb_submit_urb(urb, GFP_ATOMIC);
825 		if (err)
826 			dbg("%s: resubmit intr urb failed. (%d)",
827 				__func__, err);
828 	}
829 }
830 
831 static int option_write_room(struct tty_struct *tty)
832 {
833 	struct usb_serial_port *port = tty->driver_data;
834 	struct option_port_private *portdata;
835 	int i;
836 	int data_len = 0;
837 	struct urb *this_urb;
838 
839 	portdata = usb_get_serial_port_data(port);
840 
841 
842 	for (i = 0; i < N_OUT_URB; i++) {
843 		this_urb = portdata->out_urbs[i];
844 		if (this_urb && !test_bit(i, &portdata->out_busy))
845 			data_len += OUT_BUFLEN;
846 	}
847 
848 	dbg("%s: %d", __func__, data_len);
849 	return data_len;
850 }
851 
852 static int option_chars_in_buffer(struct tty_struct *tty)
853 {
854 	struct usb_serial_port *port = tty->driver_data;
855 	struct option_port_private *portdata;
856 	int i;
857 	int data_len = 0;
858 	struct urb *this_urb;
859 
860 	portdata = usb_get_serial_port_data(port);
861 
862 	for (i = 0; i < N_OUT_URB; i++) {
863 		this_urb = portdata->out_urbs[i];
864 		/* FIXME: This locking is insufficient as this_urb may
865 		   go unused during the test */
866 		if (this_urb && test_bit(i, &portdata->out_busy))
867 			data_len += this_urb->transfer_buffer_length;
868 	}
869 	dbg("%s: %d", __func__, data_len);
870 	return data_len;
871 }
872 
873 static int option_open(struct tty_struct *tty,
874 			struct usb_serial_port *port, struct file *filp)
875 {
876 	struct option_port_private *portdata;
877 	struct usb_serial *serial = port->serial;
878 	int i, err;
879 	struct urb *urb;
880 
881 	portdata = usb_get_serial_port_data(port);
882 
883 	dbg("%s", __func__);
884 
885 	/* Set some sane defaults */
886 	portdata->rts_state = 1;
887 	portdata->dtr_state = 1;
888 
889 	/* Reset low level data toggle and start reading from endpoints */
890 	for (i = 0; i < N_IN_URB; i++) {
891 		urb = portdata->in_urbs[i];
892 		if (!urb)
893 			continue;
894 		if (urb->dev != serial->dev) {
895 			dbg("%s: dev %p != %p", __func__,
896 				urb->dev, serial->dev);
897 			continue;
898 		}
899 
900 		/*
901 		 * make sure endpoint data toggle is synchronized with the
902 		 * device
903 		 */
904 		usb_clear_halt(urb->dev, urb->pipe);
905 
906 		err = usb_submit_urb(urb, GFP_KERNEL);
907 		if (err) {
908 			dbg("%s: submit urb %d failed (%d) %d",
909 				__func__, i, err,
910 				urb->transfer_buffer_length);
911 		}
912 	}
913 
914 	/* Reset low level data toggle on out endpoints */
915 	for (i = 0; i < N_OUT_URB; i++) {
916 		urb = portdata->out_urbs[i];
917 		if (!urb)
918 			continue;
919 		urb->dev = serial->dev;
920 		/* usb_settoggle(urb->dev, usb_pipeendpoint(urb->pipe),
921 				usb_pipeout(urb->pipe), 0); */
922 	}
923 
924 	if (tty)
925 		tty->low_latency = 1;
926 
927 	option_send_setup(tty, port);
928 
929 	return 0;
930 }
931 
932 static void option_close(struct tty_struct *tty,
933 			struct usb_serial_port *port, struct file *filp)
934 {
935 	int i;
936 	struct usb_serial *serial = port->serial;
937 	struct option_port_private *portdata;
938 
939 	dbg("%s", __func__);
940 	portdata = usb_get_serial_port_data(port);
941 
942 	portdata->rts_state = 0;
943 	portdata->dtr_state = 0;
944 
945 	if (serial->dev) {
946 		mutex_lock(&serial->disc_mutex);
947 		if (!serial->disconnected)
948 			option_send_setup(tty, port);
949 		mutex_unlock(&serial->disc_mutex);
950 
951 		/* Stop reading/writing urbs */
952 		for (i = 0; i < N_IN_URB; i++)
953 			usb_kill_urb(portdata->in_urbs[i]);
954 		for (i = 0; i < N_OUT_URB; i++)
955 			usb_kill_urb(portdata->out_urbs[i]);
956 	}
957 	tty_port_tty_set(&port->port, NULL);
958 }
959 
960 /* Helper functions used by option_setup_urbs */
961 static struct urb *option_setup_urb(struct usb_serial *serial, int endpoint,
962 		int dir, void *ctx, char *buf, int len,
963 		void (*callback)(struct urb *))
964 {
965 	struct urb *urb;
966 
967 	if (endpoint == -1)
968 		return NULL;		/* endpoint not needed */
969 
970 	urb = usb_alloc_urb(0, GFP_KERNEL);		/* No ISO */
971 	if (urb == NULL) {
972 		dbg("%s: alloc for endpoint %d failed.", __func__, endpoint);
973 		return NULL;
974 	}
975 
976 		/* Fill URB using supplied data. */
977 	usb_fill_bulk_urb(urb, serial->dev,
978 		      usb_sndbulkpipe(serial->dev, endpoint) | dir,
979 		      buf, len, callback, ctx);
980 
981 	return urb;
982 }
983 
984 /* Setup urbs */
985 static void option_setup_urbs(struct usb_serial *serial)
986 {
987 	int i, j;
988 	struct usb_serial_port *port;
989 	struct option_port_private *portdata;
990 
991 	dbg("%s", __func__);
992 
993 	for (i = 0; i < serial->num_ports; i++) {
994 		port = serial->port[i];
995 		portdata = usb_get_serial_port_data(port);
996 
997 		/* Do indat endpoints first */
998 		for (j = 0; j < N_IN_URB; ++j) {
999 			portdata->in_urbs[j] = option_setup_urb(serial,
1000 					port->bulk_in_endpointAddress,
1001 					USB_DIR_IN, port,
1002 					portdata->in_buffer[j],
1003 					IN_BUFLEN, option_indat_callback);
1004 		}
1005 
1006 		/* outdat endpoints */
1007 		for (j = 0; j < N_OUT_URB; ++j) {
1008 			portdata->out_urbs[j] = option_setup_urb(serial,
1009 					port->bulk_out_endpointAddress,
1010 					USB_DIR_OUT, port,
1011 					portdata->out_buffer[j],
1012 					OUT_BUFLEN, option_outdat_callback);
1013 		}
1014 	}
1015 }
1016 
1017 
1018 /** send RTS/DTR state to the port.
1019  *
1020  * This is exactly the same as SET_CONTROL_LINE_STATE from the PSTN
1021  * CDC.
1022 */
1023 static int option_send_setup(struct tty_struct *tty,
1024 						struct usb_serial_port *port)
1025 {
1026 	struct usb_serial *serial = port->serial;
1027 	struct option_port_private *portdata;
1028 	int ifNum = serial->interface->cur_altsetting->desc.bInterfaceNumber;
1029 	dbg("%s", __func__);
1030 
1031 	portdata = usb_get_serial_port_data(port);
1032 
1033 	if (tty) {
1034 		int val = 0;
1035 		if (portdata->dtr_state)
1036 			val |= 0x01;
1037 		if (portdata->rts_state)
1038 			val |= 0x02;
1039 
1040 		return usb_control_msg(serial->dev,
1041 			usb_rcvctrlpipe(serial->dev, 0),
1042 			0x22, 0x21, val, ifNum, NULL, 0, USB_CTRL_SET_TIMEOUT);
1043 	}
1044 	return 0;
1045 }
1046 
1047 static int option_startup(struct usb_serial *serial)
1048 {
1049 	int i, j, err;
1050 	struct usb_serial_port *port;
1051 	struct option_port_private *portdata;
1052 	u8 *buffer;
1053 
1054 	dbg("%s", __func__);
1055 
1056 	/* Now setup per port private data */
1057 	for (i = 0; i < serial->num_ports; i++) {
1058 		port = serial->port[i];
1059 		portdata = kzalloc(sizeof(*portdata), GFP_KERNEL);
1060 		if (!portdata) {
1061 			dbg("%s: kmalloc for option_port_private (%d) failed!.",
1062 					__func__, i);
1063 			return 1;
1064 		}
1065 
1066 		for (j = 0; j < N_IN_URB; j++) {
1067 			buffer = (u8 *)__get_free_page(GFP_KERNEL);
1068 			if (!buffer)
1069 				goto bail_out_error;
1070 			portdata->in_buffer[j] = buffer;
1071 		}
1072 
1073 		for (j = 0; j < N_OUT_URB; j++) {
1074 			buffer = kmalloc(OUT_BUFLEN, GFP_KERNEL);
1075 			if (!buffer)
1076 				goto bail_out_error2;
1077 			portdata->out_buffer[j] = buffer;
1078 		}
1079 
1080 		usb_set_serial_port_data(port, portdata);
1081 
1082 		if (!port->interrupt_in_urb)
1083 			continue;
1084 		err = usb_submit_urb(port->interrupt_in_urb, GFP_KERNEL);
1085 		if (err)
1086 			dbg("%s: submit irq_in urb failed %d",
1087 				__func__, err);
1088 	}
1089 	option_setup_urbs(serial);
1090 	return 0;
1091 
1092 bail_out_error2:
1093 	for (j = 0; j < N_OUT_URB; j++)
1094 		kfree(portdata->out_buffer[j]);
1095 bail_out_error:
1096 	for (j = 0; j < N_IN_URB; j++)
1097 		if (portdata->in_buffer[j])
1098 			free_page((unsigned long)portdata->in_buffer[j]);
1099 	kfree(portdata);
1100 	return 1;
1101 }
1102 
1103 static void option_shutdown(struct usb_serial *serial)
1104 {
1105 	int i, j;
1106 	struct usb_serial_port *port;
1107 	struct option_port_private *portdata;
1108 
1109 	dbg("%s", __func__);
1110 
1111 	/* Stop reading/writing urbs */
1112 	for (i = 0; i < serial->num_ports; ++i) {
1113 		port = serial->port[i];
1114 		portdata = usb_get_serial_port_data(port);
1115 		for (j = 0; j < N_IN_URB; j++)
1116 			usb_kill_urb(portdata->in_urbs[j]);
1117 		for (j = 0; j < N_OUT_URB; j++)
1118 			usb_kill_urb(portdata->out_urbs[j]);
1119 	}
1120 
1121 	/* Now free them */
1122 	for (i = 0; i < serial->num_ports; ++i) {
1123 		port = serial->port[i];
1124 		portdata = usb_get_serial_port_data(port);
1125 
1126 		for (j = 0; j < N_IN_URB; j++) {
1127 			if (portdata->in_urbs[j]) {
1128 				usb_free_urb(portdata->in_urbs[j]);
1129 				free_page((unsigned long)
1130 					portdata->in_buffer[j]);
1131 				portdata->in_urbs[j] = NULL;
1132 			}
1133 		}
1134 		for (j = 0; j < N_OUT_URB; j++) {
1135 			if (portdata->out_urbs[j]) {
1136 				usb_free_urb(portdata->out_urbs[j]);
1137 				kfree(portdata->out_buffer[j]);
1138 				portdata->out_urbs[j] = NULL;
1139 			}
1140 		}
1141 	}
1142 
1143 	/* Now free per port private data */
1144 	for (i = 0; i < serial->num_ports; i++) {
1145 		port = serial->port[i];
1146 		kfree(usb_get_serial_port_data(port));
1147 	}
1148 }
1149 
1150 MODULE_AUTHOR(DRIVER_AUTHOR);
1151 MODULE_DESCRIPTION(DRIVER_DESC);
1152 MODULE_VERSION(DRIVER_VERSION);
1153 MODULE_LICENSE("GPL");
1154 
1155 module_param(debug, bool, S_IRUGO | S_IWUSR);
1156 MODULE_PARM_DESC(debug, "Debug messages");
1157