USB: EHCI: log a warning if ehci-hcd is not loaded first
[GitHub/mt8127/android_kernel_alcatel_ttab.git] / drivers / usb / serial / option.c
CommitLineData
58cfe911 1/*
14f76cc7 2 USB Driver for GSM modems
58cfe911
MU
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
b3fdab59 12 History: see the git log.
ba460e48
MU
13
14 Work sponsored by: Sigos GmbH, Germany <info@sigos.de>
15
14f76cc7
MU
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
7c1c2f73 19 - nonstandard flow (Option devices) control
14f76cc7
MU
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.
58cfe911 29*/
ba460e48 30
5f760040 31#define DRIVER_VERSION "v0.7.2"
58cfe911 32#define DRIVER_AUTHOR "Matthias Urlichs <smurf@smurf.noris.de>"
14f76cc7 33#define DRIVER_DESC "USB Driver for GSM modems"
58cfe911 34
58cfe911
MU
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>
59c2afa0 41#include <linux/bitops.h>
58cfe911 42#include <linux/usb.h>
a969888c 43#include <linux/usb/serial.h>
58cfe911
MU
44
45/* Function prototypes */
19e58fae
AC
46static int option_open(struct tty_struct *tty, struct usb_serial_port *port,
47 struct file *filp);
48static void option_close(struct tty_struct *tty, struct usb_serial_port *port,
49 struct file *filp);
7bb75aee
AM
50static int option_startup(struct usb_serial *serial);
51static void option_shutdown(struct usb_serial *serial);
95da310e 52static int option_write_room(struct tty_struct *tty);
58cfe911 53
7d12e780 54static void option_instat_callback(struct urb *urb);
58cfe911 55
95da310e 56static int option_write(struct tty_struct *tty, struct usb_serial_port *port,
7bb75aee 57 const unsigned char *buf, int count);
95da310e
AC
58static int option_chars_in_buffer(struct tty_struct *tty);
59static void option_set_termios(struct tty_struct *tty,
60 struct usb_serial_port *port, struct ktermios *old);
61static int option_tiocmget(struct tty_struct *tty, struct file *file);
62static int option_tiocmset(struct tty_struct *tty, struct file *file,
7bb75aee 63 unsigned int set, unsigned int clear);
95da310e 64static int option_send_setup(struct tty_struct *tty, struct usb_serial_port *port);
58cfe911
MU
65
66/* Vendor and product IDs */
fd978bfa
GKH
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
fd978bfa
GKH
82#define OPTION_PRODUCT_FUJI_MODEM_LIGHT 0x6721
83#define OPTION_PRODUCT_FUJI_MODEM_GT 0x6741
84#define OPTION_PRODUCT_FUJI_MODEM_EX 0x6761
fd978bfa 85#define OPTION_PRODUCT_KOI_MODEM 0x6800
fd978bfa 86#define OPTION_PRODUCT_SCORPION_MODEM 0x6901
fd978bfa 87#define OPTION_PRODUCT_ETNA_MODEM 0x7001
fd978bfa
GKH
88#define OPTION_PRODUCT_ETNA_MODEM_LITE 0x7021
89#define OPTION_PRODUCT_ETNA_MODEM_GT 0x7041
90#define OPTION_PRODUCT_ETNA_MODEM_EX 0x7061
fd978bfa 91#define OPTION_PRODUCT_ETNA_KOI_MODEM 0x7100
fd978bfa
GKH
92
93#define HUAWEI_VENDOR_ID 0x12D1
94#define HUAWEI_PRODUCT_E600 0x1001
95#define HUAWEI_PRODUCT_E220 0x1003
a3209a0e 96#define HUAWEI_PRODUCT_E220BIS 0x1004
aad8a278 97#define HUAWEI_PRODUCT_E1401 0x1401
98#define HUAWEI_PRODUCT_E1403 0x1403
99#define HUAWEI_PRODUCT_E1405 0x1405
100#define HUAWEI_PRODUCT_E1406 0x1406
101#define HUAWEI_PRODUCT_E1408 0x1408
102#define HUAWEI_PRODUCT_E1409 0x1409
103#define HUAWEI_PRODUCT_E1410 0x1410
104#define HUAWEI_PRODUCT_E1411 0x1411
105#define HUAWEI_PRODUCT_E1412 0x1412
106#define HUAWEI_PRODUCT_E1413 0x1413
107#define HUAWEI_PRODUCT_E1414 0x1414
108#define HUAWEI_PRODUCT_E1415 0x1415
109#define HUAWEI_PRODUCT_E1416 0x1416
110#define HUAWEI_PRODUCT_E1417 0x1417
111#define HUAWEI_PRODUCT_E1418 0x1418
112#define HUAWEI_PRODUCT_E1419 0x1419
fd978bfa
GKH
113
114#define NOVATELWIRELESS_VENDOR_ID 0x1410
72ab6414
DD
115
116/* MERLIN EVDO PRODUCTS */
117#define NOVATELWIRELESS_PRODUCT_V640 0x1100
118#define NOVATELWIRELESS_PRODUCT_V620 0x1110
119#define NOVATELWIRELESS_PRODUCT_V740 0x1120
120#define NOVATELWIRELESS_PRODUCT_V720 0x1130
121
122/* MERLIN HSDPA/HSPA PRODUCTS */
123#define NOVATELWIRELESS_PRODUCT_U730 0x1400
124#define NOVATELWIRELESS_PRODUCT_U740 0x1410
125#define NOVATELWIRELESS_PRODUCT_U870 0x1420
126#define NOVATELWIRELESS_PRODUCT_XU870 0x1430
127#define NOVATELWIRELESS_PRODUCT_X950D 0x1450
128
129/* EXPEDITE PRODUCTS */
130#define NOVATELWIRELESS_PRODUCT_EV620 0x2100
131#define NOVATELWIRELESS_PRODUCT_ES720 0x2110
132#define NOVATELWIRELESS_PRODUCT_E725 0x2120
a1d9bc12 133#define NOVATELWIRELESS_PRODUCT_ES620 0x2130
72ab6414
DD
134#define NOVATELWIRELESS_PRODUCT_EU730 0x2400
135#define NOVATELWIRELESS_PRODUCT_EU740 0x2410
136#define NOVATELWIRELESS_PRODUCT_EU870D 0x2420
137
138/* OVATION PRODUCTS */
139#define NOVATELWIRELESS_PRODUCT_MC727 0x4100
140#define NOVATELWIRELESS_PRODUCT_MC950D 0x4400
141
142/* FUTURE NOVATEL PRODUCTS */
143#define NOVATELWIRELESS_PRODUCT_EVDO_1 0x6000
144#define NOVATELWIRELESS_PRODUCT_HSPA_1 0x7000
145#define NOVATELWIRELESS_PRODUCT_EMBEDDED_1 0x8000
146#define NOVATELWIRELESS_PRODUCT_GLOBAL_1 0x9000
147#define NOVATELWIRELESS_PRODUCT_EVDO_2 0x6001
148#define NOVATELWIRELESS_PRODUCT_HSPA_2 0x7001
149#define NOVATELWIRELESS_PRODUCT_EMBEDDED_2 0x8001
150#define NOVATELWIRELESS_PRODUCT_GLOBAL_2 0x9001
151
32147be4 152/* AMOI PRODUCTS */
153#define AMOI_VENDOR_ID 0x1614
154#define AMOI_PRODUCT_H01 0x0800
155#define AMOI_PRODUCT_H01A 0x7002
156#define AMOI_PRODUCT_H02 0x0802
157
96443218 158#define DELL_VENDOR_ID 0x413C
fd978bfa 159
564d61d3 160#define KYOCERA_VENDOR_ID 0x0c88
640c1bce 161#define KYOCERA_PRODUCT_KPC650 0x17da
564d61d3
DW
162#define KYOCERA_PRODUCT_KPC680 0x180a
163
fd978bfa 164#define ANYDATA_VENDOR_ID 0x16d5
f8033827 165#define ANYDATA_PRODUCT_ADU_620UW 0x6202
46269db9
AG
166#define ANYDATA_PRODUCT_ADU_E100A 0x6501
167#define ANYDATA_PRODUCT_ADU_500A 0x6502
58cfe911 168
85fb62a0
DK
169#define AXESSTEL_VENDOR_ID 0x1726
170#define AXESSTEL_PRODUCT_MV110H 0x1000
171
4c7d3137 172#define ONDA_VENDOR_ID 0x19d2
1b2d23d4 173#define ONDA_PRODUCT_MSA501HS 0x0001
4c7d3137 174#define ONDA_PRODUCT_ET502HS 0x0002
175
3f6e5846
LL
176#define BANDRICH_VENDOR_ID 0x1A8D
177#define BANDRICH_PRODUCT_C100_1 0x1002
178#define BANDRICH_PRODUCT_C100_2 0x1003
bf3fc828
LL
179#define BANDRICH_PRODUCT_1004 0x1004
180#define BANDRICH_PRODUCT_1005 0x1005
181#define BANDRICH_PRODUCT_1006 0x1006
182#define BANDRICH_PRODUCT_1007 0x1007
183#define BANDRICH_PRODUCT_1008 0x1008
184#define BANDRICH_PRODUCT_1009 0x1009
185#define BANDRICH_PRODUCT_100A 0x100a
186
187#define BANDRICH_PRODUCT_100B 0x100b
188#define BANDRICH_PRODUCT_100C 0x100c
189#define BANDRICH_PRODUCT_100D 0x100d
190#define BANDRICH_PRODUCT_100E 0x100e
191
192#define BANDRICH_PRODUCT_100F 0x100f
193#define BANDRICH_PRODUCT_1010 0x1010
194#define BANDRICH_PRODUCT_1011 0x1011
195#define BANDRICH_PRODUCT_1012 0x1012
3f6e5846 196
a1d9bc12
MU
197#define AMOI_VENDOR_ID 0x1614
198#define AMOI_PRODUCT_9508 0x0800
199
d726fb75
KL
200#define QUALCOMM_VENDOR_ID 0x05C6
201
80d97098
JC
202#define MAXON_VENDOR_ID 0x16d8
203
ee53b0ca
GKH
204#define TELIT_VENDOR_ID 0x1bc7
205#define TELIT_PRODUCT_UC864E 0x1003
206
6188a83f
OM
207/* ZTE PRODUCTS */
208#define ZTE_VENDOR_ID 0x19d2
209#define ZTE_PRODUCT_MF628 0x0015
884579d0 210#define ZTE_PRODUCT_CDMA_TECH 0xfffe
6188a83f 211
b064eca9
DW
212/* Ericsson products */
213#define ERICSSON_VENDOR_ID 0x0bdb
214#define ERICSSON_PRODUCT_F3507G 0x1900
215
58cfe911 216static struct usb_device_id option_ids[] = {
fd978bfa
GKH
217 { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_COLT) },
218 { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_RICOLA) },
219 { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_RICOLA_LIGHT) },
220 { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_RICOLA_QUAD) },
221 { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_RICOLA_QUAD_LIGHT) },
222 { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_RICOLA_NDIS) },
223 { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_RICOLA_NDIS_LIGHT) },
224 { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_RICOLA_NDIS_QUAD) },
225 { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_RICOLA_NDIS_QUAD_LIGHT) },
14f76cc7 226 { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_COBRA) },
fd978bfa
GKH
227 { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_COBRA_BUS) },
228 { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_VIPER) },
229 { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_VIPER_BUS) },
230 { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_GT_MAX_READY) },
fd978bfa
GKH
231 { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_FUJI_MODEM_LIGHT) },
232 { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_FUJI_MODEM_GT) },
233 { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_FUJI_MODEM_EX) },
fd978bfa 234 { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_KOI_MODEM) },
fd978bfa 235 { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_SCORPION_MODEM) },
fd978bfa 236 { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_ETNA_MODEM) },
fd978bfa
GKH
237 { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_ETNA_MODEM_LITE) },
238 { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_ETNA_MODEM_GT) },
239 { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_ETNA_MODEM_EX) },
fd978bfa 240 { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_ETNA_KOI_MODEM) },
a7f3872c 241 { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E600, 0xff, 0xff, 0xff) },
b5ce18af
JVJ
242 { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E220, 0xff, 0xff, 0xff) },
243 { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E220BIS, 0xff, 0xff, 0xff) },
a7f3872c
MK
244 { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1401, 0xff, 0xff, 0xff) },
245 { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1403, 0xff, 0xff, 0xff) },
246 { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1405, 0xff, 0xff, 0xff) },
247 { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1406, 0xff, 0xff, 0xff) },
248 { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1408, 0xff, 0xff, 0xff) },
249 { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1409, 0xff, 0xff, 0xff) },
250 { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1410, 0xff, 0xff, 0xff) },
251 { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1411, 0xff, 0xff, 0xff) },
252 { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1412, 0xff, 0xff, 0xff) },
253 { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1413, 0xff, 0xff, 0xff) },
254 { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1414, 0xff, 0xff, 0xff) },
255 { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1415, 0xff, 0xff, 0xff) },
256 { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1416, 0xff, 0xff, 0xff) },
257 { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1417, 0xff, 0xff, 0xff) },
258 { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1418, 0xff, 0xff, 0xff) },
259 { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1419, 0xff, 0xff, 0xff) },
a1d9bc12 260 { USB_DEVICE(AMOI_VENDOR_ID, AMOI_PRODUCT_9508) },
72ab6414
DD
261 { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_V640) }, /* Novatel Merlin V640/XV620 */
262 { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_V620) }, /* Novatel Merlin V620/S620 */
263 { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_V740) }, /* Novatel Merlin EX720/V740/X720 */
264 { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_V720) }, /* Novatel Merlin V720/S720/PC720 */
265 { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_U730) }, /* Novatel U730/U740 (VF version) */
266 { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_U740) }, /* Novatel U740 */
267 { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_U870) }, /* Novatel U870 */
268 { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_XU870) }, /* Novatel Merlin XU870 HSDPA/3G */
269 { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_X950D) }, /* Novatel X950D */
270 { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_EV620) }, /* Novatel EV620/ES620 CDMA/EV-DO */
271 { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_ES720) }, /* Novatel ES620/ES720/U720/USB720 */
272 { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_E725) }, /* Novatel E725/E726 */
a1d9bc12 273 { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_ES620) }, /* Novatel Merlin ES620 SM Bus */
72ab6414
DD
274 { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_EU730) }, /* Novatel EU730 and Vodafone EU740 */
275 { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_EU740) }, /* Novatel non-Vodafone EU740 */
276 { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_EU870D) }, /* Novatel EU850D/EU860D/EU870D */
277 { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_MC950D) }, /* Novatel MC930D/MC950D */
278 { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_MC727) }, /* Novatel MC727/U727/USB727 */
72ab6414
DD
279 { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_EVDO_1) }, /* Novatel EVDO product */
280 { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_HSPA_1) }, /* Novatel HSPA product */
281 { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_EMBEDDED_1) }, /* Novatel Embedded product */
282 { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_GLOBAL_1) }, /* Novatel Global product */
283 { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_EVDO_2) }, /* Novatel EVDO product */
284 { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_HSPA_2) }, /* Novatel HSPA product */
285 { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_EMBEDDED_2) }, /* Novatel Embedded product */
286 { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_GLOBAL_2) }, /* Novatel Global product */
287
32147be4 288 { USB_DEVICE(AMOI_VENDOR_ID, AMOI_PRODUCT_H01) },
289 { USB_DEVICE(AMOI_VENDOR_ID, AMOI_PRODUCT_H01A) },
290 { USB_DEVICE(AMOI_VENDOR_ID, AMOI_PRODUCT_H02) },
291
96443218
FL
292 { USB_DEVICE(DELL_VENDOR_ID, 0x8114) }, /* Dell Wireless 5700 Mobile Broadband CDMA/EVDO Mini-Card == Novatel Expedite EV620 CDMA/EV-DO */
293 { USB_DEVICE(DELL_VENDOR_ID, 0x8115) }, /* Dell Wireless 5500 Mobile Broadband HSDPA Mini-Card == Novatel Expedite EU740 HSDPA/3G */
294 { USB_DEVICE(DELL_VENDOR_ID, 0x8116) }, /* Dell Wireless 5505 Mobile Broadband HSDPA Mini-Card == Novatel Expedite EU740 HSDPA/3G */
295 { USB_DEVICE(DELL_VENDOR_ID, 0x8117) }, /* Dell Wireless 5700 Mobile Broadband CDMA/EVDO ExpressCard == Novatel Merlin XV620 CDMA/EV-DO */
296 { USB_DEVICE(DELL_VENDOR_ID, 0x8118) }, /* Dell Wireless 5510 Mobile Broadband HSDPA ExpressCard == Novatel Merlin XU870 HSDPA/3G */
297 { USB_DEVICE(DELL_VENDOR_ID, 0x8128) }, /* Dell Wireless 5700 Mobile Broadband CDMA/EVDO Mini-Card == Novatel Expedite E720 CDMA/EV-DO */
59036e94 298 { USB_DEVICE(DELL_VENDOR_ID, 0x8129) }, /* Dell Wireless 5700 Mobile Broadband CDMA/EVDO Mini-Card == Novatel Expedite ET620 CDMA/EV-DO */
aa59e053
SB
299 { USB_DEVICE(DELL_VENDOR_ID, 0x8133) }, /* Dell Wireless 5720 == Novatel EV620 CDMA/EV-DO */
300 { USB_DEVICE(DELL_VENDOR_ID, 0x8136) }, /* Dell Wireless HSDPA 5520 == Novatel Expedite EU860D */
2c4cd1f1 301 { USB_DEVICE(DELL_VENDOR_ID, 0x8137) }, /* Dell Wireless HSDPA 5520 */
96cb15cf 302 { USB_DEVICE(DELL_VENDOR_ID, 0x8138) }, /* Dell Wireless 5520 Voda I Mobile Broadband (3G HSDPA) Minicard */
b064eca9 303 { USB_DEVICE(DELL_VENDOR_ID, 0x8147) }, /* Dell Wireless 5530 Mobile Broadband (3G HSPA) Mini-Card */
46269db9
AG
304 { USB_DEVICE(ANYDATA_VENDOR_ID, ANYDATA_PRODUCT_ADU_E100A) },
305 { USB_DEVICE(ANYDATA_VENDOR_ID, ANYDATA_PRODUCT_ADU_500A) },
f8033827 306 { USB_DEVICE(ANYDATA_VENDOR_ID, ANYDATA_PRODUCT_ADU_620UW) },
85fb62a0 307 { USB_DEVICE(AXESSTEL_VENDOR_ID, AXESSTEL_PRODUCT_MV110H) },
1b2d23d4 308 { USB_DEVICE(ONDA_VENDOR_ID, ONDA_PRODUCT_MSA501HS) },
4c7d3137 309 { USB_DEVICE(ONDA_VENDOR_ID, ONDA_PRODUCT_ET502HS) },
3f6e5846
LL
310 { USB_DEVICE(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_C100_1) },
311 { USB_DEVICE(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_C100_2) },
bf3fc828
LL
312 { USB_DEVICE(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_1004) },
313 { USB_DEVICE(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_1005) },
314 { USB_DEVICE(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_1006) },
315 { USB_DEVICE(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_1007) },
316 { USB_DEVICE(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_1008) },
317 { USB_DEVICE(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_1009) },
318 { USB_DEVICE(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_100A) },
319 { USB_DEVICE(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_100B) },
320 { USB_DEVICE(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_100C) },
321 { USB_DEVICE(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_100D) },
322 { USB_DEVICE(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_100E) },
323 { USB_DEVICE(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_100F) },
324 { USB_DEVICE(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_1010) },
325 { USB_DEVICE(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_1011) },
326 { USB_DEVICE(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_1012) },
640c1bce 327 { USB_DEVICE(KYOCERA_VENDOR_ID, KYOCERA_PRODUCT_KPC650) },
564d61d3 328 { USB_DEVICE(KYOCERA_VENDOR_ID, KYOCERA_PRODUCT_KPC680) },
d2e2affb 329 { USB_DEVICE(QUALCOMM_VENDOR_ID, 0x6000)}, /* ZTE AC8700 */
d726fb75 330 { USB_DEVICE(QUALCOMM_VENDOR_ID, 0x6613)}, /* Onda H600/ZTE MF330 */
80d97098 331 { USB_DEVICE(MAXON_VENDOR_ID, 0x6280) }, /* BP3-USB & BP3-EXT HSDPA */
ee53b0ca 332 { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_UC864E) },
6188a83f 333 { USB_DEVICE(ZTE_VENDOR_ID, ZTE_PRODUCT_MF628) },
884579d0 334 { USB_DEVICE(ZTE_VENDOR_ID, ZTE_PRODUCT_CDMA_TECH) },
b064eca9 335 { USB_DEVICE(ERICSSON_VENDOR_ID, ERICSSON_PRODUCT_F3507G) },
14f76cc7
MU
336 { } /* Terminating entry */
337};
58cfe911
MU
338MODULE_DEVICE_TABLE(usb, option_ids);
339
340static struct usb_driver option_driver = {
58cfe911
MU
341 .name = "option",
342 .probe = usb_serial_probe,
343 .disconnect = usb_serial_disconnect,
344 .id_table = option_ids,
ba9dc657 345 .no_dynamic_id = 1,
58cfe911
MU
346};
347
c30fe7f7 348/* The card has three separate interfaces, which the serial driver
58cfe911
MU
349 * recognizes separately, thus num_port=1.
350 */
14f76cc7
MU
351
352static struct usb_serial_driver option_1port_device = {
353 .driver = {
354 .owner = THIS_MODULE,
02b2ac5b 355 .name = "option1",
14f76cc7
MU
356 },
357 .description = "GSM modem (1-port)",
d9b1b787 358 .usb_driver = &option_driver,
b656b2cb 359 .id_table = option_ids,
14f76cc7 360 .num_ports = 1,
ba460e48
MU
361 .open = option_open,
362 .close = option_close,
363 .write = option_write,
364 .write_room = option_write_room,
365 .chars_in_buffer = option_chars_in_buffer,
ba460e48 366 .set_termios = option_set_termios,
ba460e48
MU
367 .tiocmget = option_tiocmget,
368 .tiocmset = option_tiocmset,
369 .attach = option_startup,
370 .shutdown = option_shutdown,
371 .read_int_callback = option_instat_callback,
58cfe911
MU
372};
373
374static int debug;
ba460e48 375
58cfe911
MU
376/* per port private data */
377
ba460e48
MU
378#define N_IN_URB 4
379#define N_OUT_URB 1
b27c73dc 380#define IN_BUFLEN 4096
ba460e48 381#define OUT_BUFLEN 128
58cfe911
MU
382
383struct option_port_private {
384 /* Input endpoints and buffer for this port */
ba460e48 385 struct urb *in_urbs[N_IN_URB];
2129c4e1 386 u8 *in_buffer[N_IN_URB];
58cfe911 387 /* Output endpoints and buffer for this port */
ba460e48 388 struct urb *out_urbs[N_OUT_URB];
2129c4e1 389 u8 *out_buffer[N_OUT_URB];
59c2afa0 390 unsigned long out_busy; /* Bit vector of URBs in use */
58cfe911
MU
391
392 /* Settings for the port */
ba460e48
MU
393 int rts_state; /* Handshaking pins (outputs) */
394 int dtr_state;
395 int cts_state; /* Handshaking pins (inputs) */
396 int dsr_state;
397 int dcd_state;
398 int ri_state;
399
400 unsigned long tx_start_time[N_OUT_URB];
58cfe911
MU
401};
402
58cfe911 403/* Functions used by new usb-serial code. */
7bb75aee 404static int __init option_init(void)
58cfe911
MU
405{
406 int retval;
14f76cc7
MU
407 retval = usb_serial_register(&option_1port_device);
408 if (retval)
409 goto failed_1port_device_register;
58cfe911
MU
410 retval = usb_register(&option_driver);
411 if (retval)
412 goto failed_driver_register;
413
414 info(DRIVER_DESC ": " DRIVER_VERSION);
415
416 return 0;
417
418failed_driver_register:
19e58fae 419 usb_serial_deregister(&option_1port_device);
14f76cc7 420failed_1port_device_register:
58cfe911
MU
421 return retval;
422}
423
7bb75aee 424static void __exit option_exit(void)
58cfe911 425{
19e58fae
AC
426 usb_deregister(&option_driver);
427 usb_serial_deregister(&option_1port_device);
58cfe911
MU
428}
429
430module_init(option_init);
431module_exit(option_exit);
432
95da310e
AC
433static void option_set_termios(struct tty_struct *tty,
434 struct usb_serial_port *port, struct ktermios *old_termios)
58cfe911 435{
441b62c1 436 dbg("%s", __func__);
e650d8ae 437 /* Doesn't support option setting */
95da310e
AC
438 tty_termios_copy_hw(tty->termios, old_termios);
439 option_send_setup(tty, port);
58cfe911
MU
440}
441
95da310e 442static int option_tiocmget(struct tty_struct *tty, struct file *file)
58cfe911 443{
95da310e 444 struct usb_serial_port *port = tty->driver_data;
ba460e48
MU
445 unsigned int value;
446 struct option_port_private *portdata;
58cfe911
MU
447
448 portdata = usb_get_serial_port_data(port);
449
450 value = ((portdata->rts_state) ? TIOCM_RTS : 0) |
451 ((portdata->dtr_state) ? TIOCM_DTR : 0) |
452 ((portdata->cts_state) ? TIOCM_CTS : 0) |
453 ((portdata->dsr_state) ? TIOCM_DSR : 0) |
454 ((portdata->dcd_state) ? TIOCM_CAR : 0) |
455 ((portdata->ri_state) ? TIOCM_RNG : 0);
456
457 return value;
458}
459
95da310e 460static int option_tiocmset(struct tty_struct *tty, struct file *file,
7bb75aee 461 unsigned int set, unsigned int clear)
58cfe911 462{
95da310e 463 struct usb_serial_port *port = tty->driver_data;
ba460e48 464 struct option_port_private *portdata;
58cfe911
MU
465
466 portdata = usb_get_serial_port_data(port);
467
e2984494 468 /* FIXME: what locks portdata fields ? */
58cfe911
MU
469 if (set & TIOCM_RTS)
470 portdata->rts_state = 1;
471 if (set & TIOCM_DTR)
472 portdata->dtr_state = 1;
473
474 if (clear & TIOCM_RTS)
475 portdata->rts_state = 0;
476 if (clear & TIOCM_DTR)
477 portdata->dtr_state = 0;
95da310e 478 return option_send_setup(tty, port);
58cfe911
MU
479}
480
481/* Write */
95da310e 482static int option_write(struct tty_struct *tty, struct usb_serial_port *port,
7bb75aee 483 const unsigned char *buf, int count)
58cfe911 484{
ba460e48
MU
485 struct option_port_private *portdata;
486 int i;
487 int left, todo;
488 struct urb *this_urb = NULL; /* spurious */
489 int err;
58cfe911
MU
490
491 portdata = usb_get_serial_port_data(port);
492
441b62c1 493 dbg("%s: write (%d chars)", __func__, count);
58cfe911 494
58cfe911
MU
495 i = 0;
496 left = count;
19e58fae 497 for (i = 0; left > 0 && i < N_OUT_URB; i++) {
58cfe911
MU
498 todo = left;
499 if (todo > OUT_BUFLEN)
500 todo = OUT_BUFLEN;
501
ba460e48 502 this_urb = portdata->out_urbs[i];
59c2afa0 503 if (test_and_set_bit(i, &portdata->out_busy)) {
7bb75aee
AM
504 if (time_before(jiffies,
505 portdata->tx_start_time[i] + 10 * HZ))
58cfe911 506 continue;
58cfe911 507 usb_unlink_urb(this_urb);
ba460e48 508 continue;
58cfe911 509 }
ba460e48 510 if (this_urb->status != 0)
7bb75aee
AM
511 dbg("usb_write %p failed (err=%d)",
512 this_urb, this_urb->status);
58cfe911 513
441b62c1 514 dbg("%s: endpoint %d buf %d", __func__,
7bb75aee 515 usb_pipeendpoint(this_urb->pipe), i);
58cfe911 516
ba460e48 517 /* send the data */
19e58fae 518 memcpy(this_urb->transfer_buffer, buf, todo);
58cfe911
MU
519 this_urb->transfer_buffer_length = todo;
520
58cfe911
MU
521 this_urb->dev = port->serial->dev;
522 err = usb_submit_urb(this_urb, GFP_ATOMIC);
523 if (err) {
7bb75aee
AM
524 dbg("usb_submit_urb %p (write bulk) failed "
525 "(%d, has %d)", this_urb,
526 err, this_urb->status);
59c2afa0 527 clear_bit(i, &portdata->out_busy);
58cfe911
MU
528 continue;
529 }
530 portdata->tx_start_time[i] = jiffies;
531 buf += todo;
532 left -= todo;
533 }
534
535 count -= left;
441b62c1 536 dbg("%s: wrote (did %d)", __func__, count);
58cfe911
MU
537 return count;
538}
539
7d12e780 540static void option_indat_callback(struct urb *urb)
58cfe911 541{
33f0f88f 542 int err;
58cfe911
MU
543 int endpoint;
544 struct usb_serial_port *port;
545 struct tty_struct *tty;
546 unsigned char *data = urb->transfer_buffer;
d6977b51 547 int status = urb->status;
58cfe911 548
441b62c1 549 dbg("%s: %p", __func__, urb);
58cfe911
MU
550
551 endpoint = usb_pipeendpoint(urb->pipe);
cdc97792 552 port = urb->context;
58cfe911 553
d6977b51 554 if (status) {
58cfe911 555 dbg("%s: nonzero status: %d on endpoint %02x.",
441b62c1 556 __func__, status, endpoint);
58cfe911 557 } else {
4a90f09b 558 tty = tty_port_tty_get(&port->port);
58cfe911 559 if (urb->actual_length) {
33f0f88f
AC
560 tty_buffer_request_room(tty, urb->actual_length);
561 tty_insert_flip_string(tty, data, urb->actual_length);
58cfe911 562 tty_flip_buffer_push(tty);
4a90f09b 563 } else
441b62c1 564 dbg("%s: empty read urb received", __func__);
4a90f09b 565 tty_kref_put(tty);
58cfe911
MU
566
567 /* Resubmit urb so we continue receiving */
95da310e 568 if (port->port.count && status != -ESHUTDOWN) {
58cfe911
MU
569 err = usb_submit_urb(urb, GFP_ATOMIC);
570 if (err)
7bb75aee 571 printk(KERN_ERR "%s: resubmit read urb failed. "
441b62c1 572 "(%d)", __func__, err);
58cfe911
MU
573 }
574 }
575 return;
576}
577
7d12e780 578static void option_outdat_callback(struct urb *urb)
58cfe911
MU
579{
580 struct usb_serial_port *port;
59c2afa0
AS
581 struct option_port_private *portdata;
582 int i;
58cfe911 583
441b62c1 584 dbg("%s", __func__);
58cfe911 585
cdc97792 586 port = urb->context;
58cfe911 587
cf2c7481 588 usb_serial_port_softint(port);
59c2afa0
AS
589
590 portdata = usb_get_serial_port_data(port);
591 for (i = 0; i < N_OUT_URB; ++i) {
592 if (portdata->out_urbs[i] == urb) {
593 smp_mb__before_clear_bit();
594 clear_bit(i, &portdata->out_busy);
595 break;
596 }
597 }
58cfe911
MU
598}
599
7d12e780 600static void option_instat_callback(struct urb *urb)
58cfe911
MU
601{
602 int err;
d6977b51 603 int status = urb->status;
cdc97792 604 struct usb_serial_port *port = urb->context;
58cfe911
MU
605 struct option_port_private *portdata = usb_get_serial_port_data(port);
606 struct usb_serial *serial = port->serial;
607
441b62c1 608 dbg("%s", __func__);
19e58fae 609 dbg("%s: urb %p port %p has data %p", __func__, urb, port, portdata);
58cfe911 610
d6977b51 611 if (status == 0) {
58cfe911
MU
612 struct usb_ctrlrequest *req_pkt =
613 (struct usb_ctrlrequest *)urb->transfer_buffer;
614
615 if (!req_pkt) {
441b62c1 616 dbg("%s: NULL req_pkt\n", __func__);
58cfe911
MU
617 return;
618 }
7bb75aee
AM
619 if ((req_pkt->bRequestType == 0xA1) &&
620 (req_pkt->bRequest == 0x20)) {
58cfe911
MU
621 int old_dcd_state;
622 unsigned char signals = *((unsigned char *)
7bb75aee
AM
623 urb->transfer_buffer +
624 sizeof(struct usb_ctrlrequest));
58cfe911 625
441b62c1 626 dbg("%s: signal x%x", __func__, signals);
58cfe911
MU
627
628 old_dcd_state = portdata->dcd_state;
629 portdata->cts_state = 1;
630 portdata->dcd_state = ((signals & 0x01) ? 1 : 0);
631 portdata->dsr_state = ((signals & 0x02) ? 1 : 0);
632 portdata->ri_state = ((signals & 0x08) ? 1 : 0);
633
4a90f09b
AC
634 if (old_dcd_state && !portdata->dcd_state) {
635 struct tty_struct *tty =
636 tty_port_tty_get(&port->port);
637 if (tty && !C_CLOCAL(tty))
638 tty_hangup(tty);
639 tty_kref_put(tty);
640 }
7bb75aee 641 } else {
441b62c1 642 dbg("%s: type %x req %x", __func__,
19e58fae 643 req_pkt->bRequestType, req_pkt->bRequest);
7bb75aee 644 }
58cfe911 645 } else
441b62c1 646 dbg("%s: error %d", __func__, status);
58cfe911
MU
647
648 /* Resubmit urb so we continue receiving IRQ data */
d6977b51 649 if (status != -ESHUTDOWN) {
58cfe911
MU
650 urb->dev = serial->dev;
651 err = usb_submit_urb(urb, GFP_ATOMIC);
652 if (err)
7bb75aee 653 dbg("%s: resubmit intr urb failed. (%d)",
441b62c1 654 __func__, err);
58cfe911
MU
655 }
656}
657
95da310e 658static int option_write_room(struct tty_struct *tty)
58cfe911 659{
95da310e 660 struct usb_serial_port *port = tty->driver_data;
58cfe911
MU
661 struct option_port_private *portdata;
662 int i;
663 int data_len = 0;
664 struct urb *this_urb;
665
666 portdata = usb_get_serial_port_data(port);
667
a5b6f60c 668
19e58fae 669 for (i = 0; i < N_OUT_URB; i++) {
58cfe911 670 this_urb = portdata->out_urbs[i];
59c2afa0 671 if (this_urb && !test_bit(i, &portdata->out_busy))
58cfe911 672 data_len += OUT_BUFLEN;
ba460e48 673 }
58cfe911 674
441b62c1 675 dbg("%s: %d", __func__, data_len);
58cfe911
MU
676 return data_len;
677}
678
95da310e 679static int option_chars_in_buffer(struct tty_struct *tty)
58cfe911 680{
95da310e 681 struct usb_serial_port *port = tty->driver_data;
58cfe911
MU
682 struct option_port_private *portdata;
683 int i;
684 int data_len = 0;
685 struct urb *this_urb;
686
687 portdata = usb_get_serial_port_data(port);
688
19e58fae 689 for (i = 0; i < N_OUT_URB; i++) {
58cfe911 690 this_urb = portdata->out_urbs[i];
a5b6f60c
AC
691 /* FIXME: This locking is insufficient as this_urb may
692 go unused during the test */
59c2afa0 693 if (this_urb && test_bit(i, &portdata->out_busy))
58cfe911 694 data_len += this_urb->transfer_buffer_length;
ba460e48 695 }
441b62c1 696 dbg("%s: %d", __func__, data_len);
58cfe911
MU
697 return data_len;
698}
699
95da310e
AC
700static int option_open(struct tty_struct *tty,
701 struct usb_serial_port *port, struct file *filp)
58cfe911 702{
ba460e48
MU
703 struct option_port_private *portdata;
704 struct usb_serial *serial = port->serial;
705 int i, err;
706 struct urb *urb;
58cfe911
MU
707
708 portdata = usb_get_serial_port_data(port);
709
441b62c1 710 dbg("%s", __func__);
58cfe911
MU
711
712 /* Set some sane defaults */
713 portdata->rts_state = 1;
714 portdata->dtr_state = 1;
715
716 /* Reset low level data toggle and start reading from endpoints */
717 for (i = 0; i < N_IN_URB; i++) {
718 urb = portdata->in_urbs[i];
19e58fae 719 if (!urb)
58cfe911
MU
720 continue;
721 if (urb->dev != serial->dev) {
441b62c1 722 dbg("%s: dev %p != %p", __func__,
7bb75aee 723 urb->dev, serial->dev);
58cfe911
MU
724 continue;
725 }
726
7bb75aee
AM
727 /*
728 * make sure endpoint data toggle is synchronized with the
729 * device
730 */
58cfe911
MU
731 usb_clear_halt(urb->dev, urb->pipe);
732
733 err = usb_submit_urb(urb, GFP_KERNEL);
734 if (err) {
7bb75aee 735 dbg("%s: submit urb %d failed (%d) %d",
441b62c1 736 __func__, i, err,
58cfe911
MU
737 urb->transfer_buffer_length);
738 }
739 }
740
741 /* Reset low level data toggle on out endpoints */
742 for (i = 0; i < N_OUT_URB; i++) {
743 urb = portdata->out_urbs[i];
19e58fae 744 if (!urb)
58cfe911
MU
745 continue;
746 urb->dev = serial->dev;
7bb75aee
AM
747 /* usb_settoggle(urb->dev, usb_pipeendpoint(urb->pipe),
748 usb_pipeout(urb->pipe), 0); */
58cfe911
MU
749 }
750
95da310e
AC
751 if (tty)
752 tty->low_latency = 1;
58cfe911 753
95da310e 754 option_send_setup(tty, port);
58cfe911 755
19e58fae 756 return 0;
58cfe911
MU
757}
758
95da310e
AC
759static void option_close(struct tty_struct *tty,
760 struct usb_serial_port *port, struct file *filp)
58cfe911 761{
ba460e48
MU
762 int i;
763 struct usb_serial *serial = port->serial;
764 struct option_port_private *portdata;
58cfe911 765
441b62c1 766 dbg("%s", __func__);
58cfe911
MU
767 portdata = usb_get_serial_port_data(port);
768
769 portdata->rts_state = 0;
770 portdata->dtr_state = 0;
771
772 if (serial->dev) {
e33fe4d8
ON
773 mutex_lock(&serial->disc_mutex);
774 if (!serial->disconnected)
95da310e 775 option_send_setup(tty, port);
e33fe4d8 776 mutex_unlock(&serial->disc_mutex);
58cfe911
MU
777
778 /* Stop reading/writing urbs */
779 for (i = 0; i < N_IN_URB; i++)
7d28e74b 780 usb_kill_urb(portdata->in_urbs[i]);
58cfe911 781 for (i = 0; i < N_OUT_URB; i++)
7d28e74b 782 usb_kill_urb(portdata->out_urbs[i]);
58cfe911 783 }
4a90f09b 784 tty_port_tty_set(&port->port, NULL);
58cfe911
MU
785}
786
58cfe911 787/* Helper functions used by option_setup_urbs */
7bb75aee
AM
788static struct urb *option_setup_urb(struct usb_serial *serial, int endpoint,
789 int dir, void *ctx, char *buf, int len,
7d12e780 790 void (*callback)(struct urb *))
58cfe911
MU
791{
792 struct urb *urb;
793
794 if (endpoint == -1)
795 return NULL; /* endpoint not needed */
796
797 urb = usb_alloc_urb(0, GFP_KERNEL); /* No ISO */
798 if (urb == NULL) {
441b62c1 799 dbg("%s: alloc for endpoint %d failed.", __func__, endpoint);
58cfe911
MU
800 return NULL;
801 }
802
803 /* Fill URB using supplied data. */
804 usb_fill_bulk_urb(urb, serial->dev,
805 usb_sndbulkpipe(serial->dev, endpoint) | dir,
806 buf, len, callback, ctx);
807
808 return urb;
809}
810
811/* Setup urbs */
7bb75aee 812static void option_setup_urbs(struct usb_serial *serial)
58cfe911 813{
19e58fae 814 int i, j;
ba460e48
MU
815 struct usb_serial_port *port;
816 struct option_port_private *portdata;
58cfe911 817
441b62c1 818 dbg("%s", __func__);
58cfe911 819
14f76cc7
MU
820 for (i = 0; i < serial->num_ports; i++) {
821 port = serial->port[i];
822 portdata = usb_get_serial_port_data(port);
58cfe911 823
19e58fae 824 /* Do indat endpoints first */
14f76cc7 825 for (j = 0; j < N_IN_URB; ++j) {
19e58fae
AC
826 portdata->in_urbs[j] = option_setup_urb(serial,
827 port->bulk_in_endpointAddress,
828 USB_DIR_IN, port,
829 portdata->in_buffer[j],
830 IN_BUFLEN, option_indat_callback);
14f76cc7 831 }
58cfe911 832
14f76cc7
MU
833 /* outdat endpoints */
834 for (j = 0; j < N_OUT_URB; ++j) {
19e58fae
AC
835 portdata->out_urbs[j] = option_setup_urb(serial,
836 port->bulk_out_endpointAddress,
837 USB_DIR_OUT, port,
838 portdata->out_buffer[j],
839 OUT_BUFLEN, option_outdat_callback);
14f76cc7 840 }
58cfe911
MU
841 }
842}
843
5f760040
CC
844
845/** send RTS/DTR state to the port.
846 *
847 * This is exactly the same as SET_CONTROL_LINE_STATE from the PSTN
848 * CDC.
849*/
95da310e
AC
850static int option_send_setup(struct tty_struct *tty,
851 struct usb_serial_port *port)
58cfe911
MU
852{
853 struct usb_serial *serial = port->serial;
854 struct option_port_private *portdata;
5f760040 855 int ifNum = serial->interface->cur_altsetting->desc.bInterfaceNumber;
441b62c1 856 dbg("%s", __func__);
58cfe911
MU
857
858 portdata = usb_get_serial_port_data(port);
859
95da310e 860 if (tty) {
58cfe911
MU
861 int val = 0;
862 if (portdata->dtr_state)
863 val |= 0x01;
864 if (portdata->rts_state)
865 val |= 0x02;
866
7bb75aee 867 return usb_control_msg(serial->dev,
19e58fae
AC
868 usb_rcvctrlpipe(serial->dev, 0),
869 0x22, 0x21, val, ifNum, NULL, 0, USB_CTRL_SET_TIMEOUT);
58cfe911 870 }
58cfe911
MU
871 return 0;
872}
873
7bb75aee 874static int option_startup(struct usb_serial *serial)
58cfe911 875{
2129c4e1 876 int i, j, err;
ba460e48
MU
877 struct usb_serial_port *port;
878 struct option_port_private *portdata;
2129c4e1 879 u8 *buffer;
58cfe911 880
441b62c1 881 dbg("%s", __func__);
58cfe911
MU
882
883 /* Now setup per port private data */
884 for (i = 0; i < serial->num_ports; i++) {
885 port = serial->port[i];
80b6ca48 886 portdata = kzalloc(sizeof(*portdata), GFP_KERNEL);
58cfe911 887 if (!portdata) {
7bb75aee 888 dbg("%s: kmalloc for option_port_private (%d) failed!.",
441b62c1 889 __func__, i);
19e58fae 890 return 1;
58cfe911 891 }
58cfe911 892
2129c4e1
ON
893 for (j = 0; j < N_IN_URB; j++) {
894 buffer = (u8 *)__get_free_page(GFP_KERNEL);
895 if (!buffer)
896 goto bail_out_error;
897 portdata->in_buffer[j] = buffer;
898 }
899
900 for (j = 0; j < N_OUT_URB; j++) {
901 buffer = kmalloc(OUT_BUFLEN, GFP_KERNEL);
902 if (!buffer)
903 goto bail_out_error2;
904 portdata->out_buffer[j] = buffer;
905 }
906
58cfe911
MU
907 usb_set_serial_port_data(port, portdata);
908
19e58fae 909 if (!port->interrupt_in_urb)
58cfe911
MU
910 continue;
911 err = usb_submit_urb(port->interrupt_in_urb, GFP_KERNEL);
912 if (err)
7bb75aee 913 dbg("%s: submit irq_in urb failed %d",
441b62c1 914 __func__, err);
58cfe911 915 }
58cfe911 916 option_setup_urbs(serial);
19e58fae 917 return 0;
2129c4e1
ON
918
919bail_out_error2:
920 for (j = 0; j < N_OUT_URB; j++)
921 kfree(portdata->out_buffer[j]);
922bail_out_error:
923 for (j = 0; j < N_IN_URB; j++)
924 if (portdata->in_buffer[j])
925 free_page((unsigned long)portdata->in_buffer[j]);
926 kfree(portdata);
927 return 1;
58cfe911
MU
928}
929
7bb75aee 930static void option_shutdown(struct usb_serial *serial)
58cfe911 931{
ba460e48
MU
932 int i, j;
933 struct usb_serial_port *port;
934 struct option_port_private *portdata;
58cfe911 935
441b62c1 936 dbg("%s", __func__);
58cfe911
MU
937
938 /* Stop reading/writing urbs */
939 for (i = 0; i < serial->num_ports; ++i) {
940 port = serial->port[i];
941 portdata = usb_get_serial_port_data(port);
942 for (j = 0; j < N_IN_URB; j++)
7d28e74b 943 usb_kill_urb(portdata->in_urbs[j]);
58cfe911 944 for (j = 0; j < N_OUT_URB; j++)
7d28e74b 945 usb_kill_urb(portdata->out_urbs[j]);
58cfe911
MU
946 }
947
948 /* Now free them */
949 for (i = 0; i < serial->num_ports; ++i) {
950 port = serial->port[i];
951 portdata = usb_get_serial_port_data(port);
952
953 for (j = 0; j < N_IN_URB; j++) {
954 if (portdata->in_urbs[j]) {
955 usb_free_urb(portdata->in_urbs[j]);
19e58fae
AC
956 free_page((unsigned long)
957 portdata->in_buffer[j]);
58cfe911
MU
958 portdata->in_urbs[j] = NULL;
959 }
960 }
961 for (j = 0; j < N_OUT_URB; j++) {
962 if (portdata->out_urbs[j]) {
963 usb_free_urb(portdata->out_urbs[j]);
2129c4e1 964 kfree(portdata->out_buffer[j]);
58cfe911
MU
965 portdata->out_urbs[j] = NULL;
966 }
967 }
968 }
969
970 /* Now free per port private data */
971 for (i = 0; i < serial->num_ports; i++) {
972 port = serial->port[i];
973 kfree(usb_get_serial_port_data(port));
974 }
975}
976
977MODULE_AUTHOR(DRIVER_AUTHOR);
978MODULE_DESCRIPTION(DRIVER_DESC);
979MODULE_VERSION(DRIVER_VERSION);
980MODULE_LICENSE("GPL");
981
982module_param(debug, bool, S_IRUGO | S_IWUSR);
983MODULE_PARM_DESC(debug, "Debug messages");