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