xref: /openbmc/linux/drivers/usb/serial/option.c (revision c21b37f6)
1 /*
2   USB Driver for GSM modems
3 
4   Copyright (C) 2005  Matthias Urlichs <smurf@smurf.noris.de>
5 
6   This driver is free software; you can redistribute it and/or modify
7   it under the terms of Version 2 of the GNU General Public License as
8   published by the Free Software Foundation.
9 
10   Portions copied from the Keyspan driver by Hugh Blemings <hugh@blemings.org>
11 
12   History: see the git log.
13 
14   Work sponsored by: Sigos GmbH, Germany <info@sigos.de>
15 
16   This driver exists because the "normal" serial driver doesn't work too well
17   with GSM modems. Issues:
18   - data loss -- one single Receive URB is not nearly enough
19   - nonstandard flow (Option devices) control
20   - controlling the baud rate doesn't make sense
21 
22   This driver is named "option" because the most common device it's
23   used for is a PC-Card (with an internal OHCI-USB interface, behind
24   which the GSM interface sits), made by Option Inc.
25 
26   Some of the "one port" devices actually exhibit multiple USB instances
27   on the USB bus. This is not a bug, these ports are used for different
28   device features.
29 */
30 
31 #define DRIVER_VERSION "v0.7.1"
32 #define DRIVER_AUTHOR "Matthias Urlichs <smurf@smurf.noris.de>"
33 #define DRIVER_DESC "USB Driver for GSM modems"
34 
35 #include <linux/kernel.h>
36 #include <linux/jiffies.h>
37 #include <linux/errno.h>
38 #include <linux/tty.h>
39 #include <linux/tty_flip.h>
40 #include <linux/module.h>
41 #include <linux/bitops.h>
42 #include <linux/usb.h>
43 #include <linux/usb/serial.h>
44 
45 /* Function prototypes */
46 static int  option_open(struct usb_serial_port *port, struct file *filp);
47 static void option_close(struct usb_serial_port *port, struct file *filp);
48 static int  option_startup(struct usb_serial *serial);
49 static void option_shutdown(struct usb_serial *serial);
50 static void option_rx_throttle(struct usb_serial_port *port);
51 static void option_rx_unthrottle(struct usb_serial_port *port);
52 static int  option_write_room(struct usb_serial_port *port);
53 
54 static void option_instat_callback(struct urb *urb);
55 
56 static int option_write(struct usb_serial_port *port,
57 			const unsigned char *buf, int count);
58 
59 static int  option_chars_in_buffer(struct usb_serial_port *port);
60 static int  option_ioctl(struct usb_serial_port *port, struct file *file,
61 			unsigned int cmd, unsigned long arg);
62 static void option_set_termios(struct usb_serial_port *port,
63 				struct ktermios *old);
64 static void option_break_ctl(struct usb_serial_port *port, int break_state);
65 static int  option_tiocmget(struct usb_serial_port *port, struct file *file);
66 static int  option_tiocmset(struct usb_serial_port *port, struct file *file,
67 				unsigned int set, unsigned int clear);
68 static int  option_send_setup(struct usb_serial_port *port);
69 
70 /* Vendor and product IDs */
71 #define OPTION_VENDOR_ID			0x0AF0
72 #define OPTION_PRODUCT_COLT			0x5000
73 #define OPTION_PRODUCT_RICOLA			0x6000
74 #define OPTION_PRODUCT_RICOLA_LIGHT		0x6100
75 #define OPTION_PRODUCT_RICOLA_QUAD		0x6200
76 #define OPTION_PRODUCT_RICOLA_QUAD_LIGHT	0x6300
77 #define OPTION_PRODUCT_RICOLA_NDIS		0x6050
78 #define OPTION_PRODUCT_RICOLA_NDIS_LIGHT	0x6150
79 #define OPTION_PRODUCT_RICOLA_NDIS_QUAD		0x6250
80 #define OPTION_PRODUCT_RICOLA_NDIS_QUAD_LIGHT	0x6350
81 #define OPTION_PRODUCT_COBRA			0x6500
82 #define OPTION_PRODUCT_COBRA_BUS		0x6501
83 #define OPTION_PRODUCT_VIPER			0x6600
84 #define OPTION_PRODUCT_VIPER_BUS		0x6601
85 #define OPTION_PRODUCT_GT_MAX_READY		0x6701
86 #define OPTION_PRODUCT_GT_MAX			0x6711
87 #define OPTION_PRODUCT_FUJI_MODEM_LIGHT		0x6721
88 #define OPTION_PRODUCT_FUJI_MODEM_GT		0x6741
89 #define OPTION_PRODUCT_FUJI_MODEM_EX		0x6761
90 #define OPTION_PRODUCT_FUJI_NETWORK_LIGHT	0x6731
91 #define OPTION_PRODUCT_FUJI_NETWORK_GT		0x6751
92 #define OPTION_PRODUCT_FUJI_NETWORK_EX		0x6771
93 #define OPTION_PRODUCT_KOI_MODEM		0x6800
94 #define OPTION_PRODUCT_KOI_NETWORK		0x6811
95 #define OPTION_PRODUCT_SCORPION_MODEM		0x6901
96 #define OPTION_PRODUCT_SCORPION_NETWORK		0x6911
97 #define OPTION_PRODUCT_ETNA_MODEM		0x7001
98 #define OPTION_PRODUCT_ETNA_NETWORK		0x7011
99 #define OPTION_PRODUCT_ETNA_MODEM_LITE		0x7021
100 #define OPTION_PRODUCT_ETNA_MODEM_GT		0x7041
101 #define OPTION_PRODUCT_ETNA_MODEM_EX		0x7061
102 #define OPTION_PRODUCT_ETNA_NETWORK_LITE	0x7031
103 #define OPTION_PRODUCT_ETNA_NETWORK_GT		0x7051
104 #define OPTION_PRODUCT_ETNA_NETWORK_EX		0x7071
105 #define OPTION_PRODUCT_ETNA_KOI_MODEM		0x7100
106 #define OPTION_PRODUCT_ETNA_KOI_NETWORK		0x7111
107 
108 #define HUAWEI_VENDOR_ID			0x12D1
109 #define HUAWEI_PRODUCT_E600			0x1001
110 #define HUAWEI_PRODUCT_E220			0x1003
111 
112 #define NOVATELWIRELESS_VENDOR_ID		0x1410
113 
114 #define ANYDATA_VENDOR_ID			0x16d5
115 #define ANYDATA_PRODUCT_ADU_E100A		0x6501
116 #define ANYDATA_PRODUCT_ADU_500A		0x6502
117 
118 #define BANDRICH_VENDOR_ID			0x1A8D
119 #define BANDRICH_PRODUCT_C100_1			0x1002
120 #define BANDRICH_PRODUCT_C100_2			0x1003
121 
122 #define DELL_VENDOR_ID				0x413C
123 
124 static struct usb_device_id option_ids[] = {
125 	{ USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_COLT) },
126 	{ USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_RICOLA) },
127 	{ USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_RICOLA_LIGHT) },
128 	{ USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_RICOLA_QUAD) },
129 	{ USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_RICOLA_QUAD_LIGHT) },
130 	{ USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_RICOLA_NDIS) },
131 	{ USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_RICOLA_NDIS_LIGHT) },
132 	{ USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_RICOLA_NDIS_QUAD) },
133 	{ USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_RICOLA_NDIS_QUAD_LIGHT) },
134 	{ USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_COBRA) },
135 	{ USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_COBRA_BUS) },
136 	{ USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_VIPER) },
137 	{ USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_VIPER_BUS) },
138 	{ USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_GT_MAX_READY) },
139 	{ USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_GT_MAX) },
140 	{ USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_FUJI_MODEM_LIGHT) },
141 	{ USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_FUJI_MODEM_GT) },
142 	{ USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_FUJI_MODEM_EX) },
143 	{ USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_FUJI_NETWORK_LIGHT) },
144 	{ USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_FUJI_NETWORK_GT) },
145 	{ USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_FUJI_NETWORK_EX) },
146 	{ USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_KOI_MODEM) },
147 	{ USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_KOI_NETWORK) },
148 	{ USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_SCORPION_MODEM) },
149 	{ USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_SCORPION_NETWORK) },
150 	{ USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_ETNA_MODEM) },
151 	{ USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_ETNA_NETWORK) },
152 	{ USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_ETNA_MODEM_LITE) },
153 	{ USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_ETNA_MODEM_GT) },
154 	{ USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_ETNA_MODEM_EX) },
155 	{ USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_ETNA_NETWORK_LITE) },
156 	{ USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_ETNA_NETWORK_GT) },
157 	{ USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_ETNA_NETWORK_EX) },
158 	{ USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_ETNA_KOI_MODEM) },
159 	{ USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_ETNA_KOI_NETWORK) },
160 	{ USB_DEVICE(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E600) },
161 	{ USB_DEVICE(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E220) },
162 	{ USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, 0x1100) }, /* Novatel Merlin XS620/S640 */
163 	{ USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, 0x1110) }, /* Novatel Merlin S620 */
164 	{ USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, 0x1120) }, /* Novatel Merlin EX720 */
165 	{ USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, 0x1130) }, /* Novatel Merlin S720 */
166 	{ USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, 0x1400) }, /* Novatel U730 */
167 	{ USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, 0x1410) }, /* Novatel U740 */
168 	{ USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, 0x1420) }, /* Novatel EU870 */
169 	{ USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, 0x1430) }, /* Novatel Merlin XU870 HSDPA/3G */
170 	{ USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, 0x2100) }, /* Novatel EV620 CDMA/EV-DO */
171 	{ USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, 0x2110) }, /* Novatel Merlin ES620 / Merlin ES720 / Ovation U720 */
172 	{ USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, 0x2130) }, /* Novatel Merlin ES620 SM Bus */
173 	{ USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, 0x2410) }, /* Novatel EU740 */
174 	{ USB_DEVICE(ANYDATA_VENDOR_ID, ANYDATA_PRODUCT_ADU_E100A) },
175 	{ USB_DEVICE(ANYDATA_VENDOR_ID, ANYDATA_PRODUCT_ADU_500A) },
176 	{ USB_DEVICE(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_C100_1) },
177 	{ USB_DEVICE(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_C100_2) },
178 	{ USB_DEVICE(DELL_VENDOR_ID, 0x8118) },		/* Dell Wireless 5510 Mobile Broadband HSDPA ExpressCard */
179 	{ } /* Terminating entry */
180 };
181 MODULE_DEVICE_TABLE(usb, option_ids);
182 
183 static struct usb_driver option_driver = {
184 	.name       = "option",
185 	.probe      = usb_serial_probe,
186 	.disconnect = usb_serial_disconnect,
187 	.id_table   = option_ids,
188 	.no_dynamic_id = 	1,
189 };
190 
191 /* The card has three separate interfaces, which the serial driver
192  * recognizes separately, thus num_port=1.
193  */
194 
195 static struct usb_serial_driver option_1port_device = {
196 	.driver = {
197 		.owner =	THIS_MODULE,
198 		.name =		"option1",
199 	},
200 	.description       = "GSM modem (1-port)",
201 	.usb_driver        = &option_driver,
202 	.id_table          = option_ids,
203 	.num_interrupt_in  = NUM_DONT_CARE,
204 	.num_bulk_in       = NUM_DONT_CARE,
205 	.num_bulk_out      = NUM_DONT_CARE,
206 	.num_ports         = 1,
207 	.open              = option_open,
208 	.close             = option_close,
209 	.write             = option_write,
210 	.write_room        = option_write_room,
211 	.chars_in_buffer   = option_chars_in_buffer,
212 	.throttle          = option_rx_throttle,
213 	.unthrottle        = option_rx_unthrottle,
214 	.ioctl             = option_ioctl,
215 	.set_termios       = option_set_termios,
216 	.break_ctl         = option_break_ctl,
217 	.tiocmget          = option_tiocmget,
218 	.tiocmset          = option_tiocmset,
219 	.attach            = option_startup,
220 	.shutdown          = option_shutdown,
221 	.read_int_callback = option_instat_callback,
222 };
223 
224 #ifdef CONFIG_USB_DEBUG
225 static int debug;
226 #else
227 #define debug 0
228 #endif
229 
230 /* per port private data */
231 
232 #define N_IN_URB 4
233 #define N_OUT_URB 1
234 #define IN_BUFLEN 4096
235 #define OUT_BUFLEN 128
236 
237 struct option_port_private {
238 	/* Input endpoints and buffer for this port */
239 	struct urb *in_urbs[N_IN_URB];
240 	char in_buffer[N_IN_URB][IN_BUFLEN];
241 	/* Output endpoints and buffer for this port */
242 	struct urb *out_urbs[N_OUT_URB];
243 	char out_buffer[N_OUT_URB][OUT_BUFLEN];
244 	unsigned long out_busy;		/* Bit vector of URBs in use */
245 
246 	/* Settings for the port */
247 	int rts_state;	/* Handshaking pins (outputs) */
248 	int dtr_state;
249 	int cts_state;	/* Handshaking pins (inputs) */
250 	int dsr_state;
251 	int dcd_state;
252 	int ri_state;
253 
254 	unsigned long tx_start_time[N_OUT_URB];
255 };
256 
257 /* Functions used by new usb-serial code. */
258 static int __init option_init(void)
259 {
260 	int retval;
261 	retval = usb_serial_register(&option_1port_device);
262 	if (retval)
263 		goto failed_1port_device_register;
264 	retval = usb_register(&option_driver);
265 	if (retval)
266 		goto failed_driver_register;
267 
268 	info(DRIVER_DESC ": " DRIVER_VERSION);
269 
270 	return 0;
271 
272 failed_driver_register:
273 	usb_serial_deregister (&option_1port_device);
274 failed_1port_device_register:
275 	return retval;
276 }
277 
278 static void __exit option_exit(void)
279 {
280 	usb_deregister (&option_driver);
281 	usb_serial_deregister (&option_1port_device);
282 }
283 
284 module_init(option_init);
285 module_exit(option_exit);
286 
287 static void option_rx_throttle(struct usb_serial_port *port)
288 {
289 	dbg("%s", __FUNCTION__);
290 }
291 
292 static void option_rx_unthrottle(struct usb_serial_port *port)
293 {
294 	dbg("%s", __FUNCTION__);
295 }
296 
297 static void option_break_ctl(struct usb_serial_port *port, int break_state)
298 {
299 	/* Unfortunately, I don't know how to send a break */
300 	dbg("%s", __FUNCTION__);
301 }
302 
303 static void option_set_termios(struct usb_serial_port *port,
304 			struct ktermios *old_termios)
305 {
306 	dbg("%s", __FUNCTION__);
307 
308 	option_send_setup(port);
309 }
310 
311 static int option_tiocmget(struct usb_serial_port *port, struct file *file)
312 {
313 	unsigned int value;
314 	struct option_port_private *portdata;
315 
316 	portdata = usb_get_serial_port_data(port);
317 
318 	value = ((portdata->rts_state) ? TIOCM_RTS : 0) |
319 		((portdata->dtr_state) ? TIOCM_DTR : 0) |
320 		((portdata->cts_state) ? TIOCM_CTS : 0) |
321 		((portdata->dsr_state) ? TIOCM_DSR : 0) |
322 		((portdata->dcd_state) ? TIOCM_CAR : 0) |
323 		((portdata->ri_state) ? TIOCM_RNG : 0);
324 
325 	return value;
326 }
327 
328 static int option_tiocmset(struct usb_serial_port *port, struct file *file,
329 			unsigned int set, unsigned int clear)
330 {
331 	struct option_port_private *portdata;
332 
333 	portdata = usb_get_serial_port_data(port);
334 
335 	if (set & TIOCM_RTS)
336 		portdata->rts_state = 1;
337 	if (set & TIOCM_DTR)
338 		portdata->dtr_state = 1;
339 
340 	if (clear & TIOCM_RTS)
341 		portdata->rts_state = 0;
342 	if (clear & TIOCM_DTR)
343 		portdata->dtr_state = 0;
344 	return option_send_setup(port);
345 }
346 
347 static int option_ioctl(struct usb_serial_port *port, struct file *file,
348 			unsigned int cmd, unsigned long arg)
349 {
350 	return -ENOIOCTLCMD;
351 }
352 
353 /* Write */
354 static int option_write(struct usb_serial_port *port,
355 			const unsigned char *buf, int count)
356 {
357 	struct option_port_private *portdata;
358 	int i;
359 	int left, todo;
360 	struct urb *this_urb = NULL; /* spurious */
361 	int err;
362 
363 	portdata = usb_get_serial_port_data(port);
364 
365 	dbg("%s: write (%d chars)", __FUNCTION__, count);
366 
367 	i = 0;
368 	left = count;
369 	for (i=0; left > 0 && i < N_OUT_URB; i++) {
370 		todo = left;
371 		if (todo > OUT_BUFLEN)
372 			todo = OUT_BUFLEN;
373 
374 		this_urb = portdata->out_urbs[i];
375 		if (test_and_set_bit(i, &portdata->out_busy)) {
376 			if (time_before(jiffies,
377 					portdata->tx_start_time[i] + 10 * HZ))
378 				continue;
379 			usb_unlink_urb(this_urb);
380 			continue;
381 		}
382 		if (this_urb->status != 0)
383 			dbg("usb_write %p failed (err=%d)",
384 				this_urb, this_urb->status);
385 
386 		dbg("%s: endpoint %d buf %d", __FUNCTION__,
387 			usb_pipeendpoint(this_urb->pipe), i);
388 
389 		/* send the data */
390 		memcpy (this_urb->transfer_buffer, buf, todo);
391 		this_urb->transfer_buffer_length = todo;
392 
393 		this_urb->dev = port->serial->dev;
394 		err = usb_submit_urb(this_urb, GFP_ATOMIC);
395 		if (err) {
396 			dbg("usb_submit_urb %p (write bulk) failed "
397 				"(%d, has %d)", this_urb,
398 				err, this_urb->status);
399 			clear_bit(i, &portdata->out_busy);
400 			continue;
401 		}
402 		portdata->tx_start_time[i] = jiffies;
403 		buf += todo;
404 		left -= todo;
405 	}
406 
407 	count -= left;
408 	dbg("%s: wrote (did %d)", __FUNCTION__, count);
409 	return count;
410 }
411 
412 static void option_indat_callback(struct urb *urb)
413 {
414 	int err;
415 	int endpoint;
416 	struct usb_serial_port *port;
417 	struct tty_struct *tty;
418 	unsigned char *data = urb->transfer_buffer;
419 	int status = urb->status;
420 
421 	dbg("%s: %p", __FUNCTION__, urb);
422 
423 	endpoint = usb_pipeendpoint(urb->pipe);
424 	port = (struct usb_serial_port *) urb->context;
425 
426 	if (status) {
427 		dbg("%s: nonzero status: %d on endpoint %02x.",
428 		    __FUNCTION__, status, endpoint);
429 	} else {
430 		tty = port->tty;
431 		if (urb->actual_length) {
432 			tty_buffer_request_room(tty, urb->actual_length);
433 			tty_insert_flip_string(tty, data, urb->actual_length);
434 			tty_flip_buffer_push(tty);
435 		} else {
436 			dbg("%s: empty read urb received", __FUNCTION__);
437 		}
438 
439 		/* Resubmit urb so we continue receiving */
440 		if (port->open_count && status != -ESHUTDOWN) {
441 			err = usb_submit_urb(urb, GFP_ATOMIC);
442 			if (err)
443 				printk(KERN_ERR "%s: resubmit read urb failed. "
444 					"(%d)", __FUNCTION__, err);
445 		}
446 	}
447 	return;
448 }
449 
450 static void option_outdat_callback(struct urb *urb)
451 {
452 	struct usb_serial_port *port;
453 	struct option_port_private *portdata;
454 	int i;
455 
456 	dbg("%s", __FUNCTION__);
457 
458 	port = (struct usb_serial_port *) urb->context;
459 
460 	usb_serial_port_softint(port);
461 
462 	portdata = usb_get_serial_port_data(port);
463 	for (i = 0; i < N_OUT_URB; ++i) {
464 		if (portdata->out_urbs[i] == urb) {
465 			smp_mb__before_clear_bit();
466 			clear_bit(i, &portdata->out_busy);
467 			break;
468 		}
469 	}
470 }
471 
472 static void option_instat_callback(struct urb *urb)
473 {
474 	int err;
475 	int status = urb->status;
476 	struct usb_serial_port *port = (struct usb_serial_port *) urb->context;
477 	struct option_port_private *portdata = usb_get_serial_port_data(port);
478 	struct usb_serial *serial = port->serial;
479 
480 	dbg("%s", __FUNCTION__);
481 	dbg("%s: urb %p port %p has data %p", __FUNCTION__,urb,port,portdata);
482 
483 	if (status == 0) {
484 		struct usb_ctrlrequest *req_pkt =
485 				(struct usb_ctrlrequest *)urb->transfer_buffer;
486 
487 		if (!req_pkt) {
488 			dbg("%s: NULL req_pkt\n", __FUNCTION__);
489 			return;
490 		}
491 		if ((req_pkt->bRequestType == 0xA1) &&
492 				(req_pkt->bRequest == 0x20)) {
493 			int old_dcd_state;
494 			unsigned char signals = *((unsigned char *)
495 					urb->transfer_buffer +
496 					sizeof(struct usb_ctrlrequest));
497 
498 			dbg("%s: signal x%x", __FUNCTION__, signals);
499 
500 			old_dcd_state = portdata->dcd_state;
501 			portdata->cts_state = 1;
502 			portdata->dcd_state = ((signals & 0x01) ? 1 : 0);
503 			portdata->dsr_state = ((signals & 0x02) ? 1 : 0);
504 			portdata->ri_state = ((signals & 0x08) ? 1 : 0);
505 
506 			if (port->tty && !C_CLOCAL(port->tty) &&
507 					old_dcd_state && !portdata->dcd_state)
508 				tty_hangup(port->tty);
509 		} else {
510 			dbg("%s: type %x req %x", __FUNCTION__,
511 				req_pkt->bRequestType,req_pkt->bRequest);
512 		}
513 	} else
514 		dbg("%s: error %d", __FUNCTION__, status);
515 
516 	/* Resubmit urb so we continue receiving IRQ data */
517 	if (status != -ESHUTDOWN) {
518 		urb->dev = serial->dev;
519 		err = usb_submit_urb(urb, GFP_ATOMIC);
520 		if (err)
521 			dbg("%s: resubmit intr urb failed. (%d)",
522 				__FUNCTION__, err);
523 	}
524 }
525 
526 static int option_write_room(struct usb_serial_port *port)
527 {
528 	struct option_port_private *portdata;
529 	int i;
530 	int data_len = 0;
531 	struct urb *this_urb;
532 
533 	portdata = usb_get_serial_port_data(port);
534 
535 	for (i=0; i < N_OUT_URB; i++) {
536 		this_urb = portdata->out_urbs[i];
537 		if (this_urb && !test_bit(i, &portdata->out_busy))
538 			data_len += OUT_BUFLEN;
539 	}
540 
541 	dbg("%s: %d", __FUNCTION__, data_len);
542 	return data_len;
543 }
544 
545 static int option_chars_in_buffer(struct usb_serial_port *port)
546 {
547 	struct option_port_private *portdata;
548 	int i;
549 	int data_len = 0;
550 	struct urb *this_urb;
551 
552 	portdata = usb_get_serial_port_data(port);
553 
554 	for (i=0; i < N_OUT_URB; i++) {
555 		this_urb = portdata->out_urbs[i];
556 		if (this_urb && test_bit(i, &portdata->out_busy))
557 			data_len += this_urb->transfer_buffer_length;
558 	}
559 	dbg("%s: %d", __FUNCTION__, data_len);
560 	return data_len;
561 }
562 
563 static int option_open(struct usb_serial_port *port, struct file *filp)
564 {
565 	struct option_port_private *portdata;
566 	struct usb_serial *serial = port->serial;
567 	int i, err;
568 	struct urb *urb;
569 
570 	portdata = usb_get_serial_port_data(port);
571 
572 	dbg("%s", __FUNCTION__);
573 
574 	/* Set some sane defaults */
575 	portdata->rts_state = 1;
576 	portdata->dtr_state = 1;
577 
578 	/* Reset low level data toggle and start reading from endpoints */
579 	for (i = 0; i < N_IN_URB; i++) {
580 		urb = portdata->in_urbs[i];
581 		if (! urb)
582 			continue;
583 		if (urb->dev != serial->dev) {
584 			dbg("%s: dev %p != %p", __FUNCTION__,
585 				urb->dev, serial->dev);
586 			continue;
587 		}
588 
589 		/*
590 		 * make sure endpoint data toggle is synchronized with the
591 		 * device
592 		 */
593 		usb_clear_halt(urb->dev, urb->pipe);
594 
595 		err = usb_submit_urb(urb, GFP_KERNEL);
596 		if (err) {
597 			dbg("%s: submit urb %d failed (%d) %d",
598 				__FUNCTION__, i, err,
599 				urb->transfer_buffer_length);
600 		}
601 	}
602 
603 	/* Reset low level data toggle on out endpoints */
604 	for (i = 0; i < N_OUT_URB; i++) {
605 		urb = portdata->out_urbs[i];
606 		if (! urb)
607 			continue;
608 		urb->dev = serial->dev;
609 		/* usb_settoggle(urb->dev, usb_pipeendpoint(urb->pipe),
610 				usb_pipeout(urb->pipe), 0); */
611 	}
612 
613 	port->tty->low_latency = 1;
614 
615 	option_send_setup(port);
616 
617 	return (0);
618 }
619 
620 static void option_close(struct usb_serial_port *port, struct file *filp)
621 {
622 	int i;
623 	struct usb_serial *serial = port->serial;
624 	struct option_port_private *portdata;
625 
626 	dbg("%s", __FUNCTION__);
627 	portdata = usb_get_serial_port_data(port);
628 
629 	portdata->rts_state = 0;
630 	portdata->dtr_state = 0;
631 
632 	if (serial->dev) {
633 		option_send_setup(port);
634 
635 		/* Stop reading/writing urbs */
636 		for (i = 0; i < N_IN_URB; i++)
637 			usb_kill_urb(portdata->in_urbs[i]);
638 		for (i = 0; i < N_OUT_URB; i++)
639 			usb_kill_urb(portdata->out_urbs[i]);
640 	}
641 	port->tty = NULL;
642 }
643 
644 /* Helper functions used by option_setup_urbs */
645 static struct urb *option_setup_urb(struct usb_serial *serial, int endpoint,
646 		int dir, void *ctx, char *buf, int len,
647 		void (*callback)(struct urb *))
648 {
649 	struct urb *urb;
650 
651 	if (endpoint == -1)
652 		return NULL;		/* endpoint not needed */
653 
654 	urb = usb_alloc_urb(0, GFP_KERNEL);		/* No ISO */
655 	if (urb == NULL) {
656 		dbg("%s: alloc for endpoint %d failed.", __FUNCTION__, endpoint);
657 		return NULL;
658 	}
659 
660 		/* Fill URB using supplied data. */
661 	usb_fill_bulk_urb(urb, serial->dev,
662 		      usb_sndbulkpipe(serial->dev, endpoint) | dir,
663 		      buf, len, callback, ctx);
664 
665 	return urb;
666 }
667 
668 /* Setup urbs */
669 static void option_setup_urbs(struct usb_serial *serial)
670 {
671 	int i,j;
672 	struct usb_serial_port *port;
673 	struct option_port_private *portdata;
674 
675 	dbg("%s", __FUNCTION__);
676 
677 	for (i = 0; i < serial->num_ports; i++) {
678 		port = serial->port[i];
679 		portdata = usb_get_serial_port_data(port);
680 
681 	/* Do indat endpoints first */
682 		for (j = 0; j < N_IN_URB; ++j) {
683 			portdata->in_urbs[j] = option_setup_urb (serial,
684                   	port->bulk_in_endpointAddress, USB_DIR_IN, port,
685                   	portdata->in_buffer[j], IN_BUFLEN, option_indat_callback);
686 		}
687 
688 		/* outdat endpoints */
689 		for (j = 0; j < N_OUT_URB; ++j) {
690 			portdata->out_urbs[j] = option_setup_urb (serial,
691                   	port->bulk_out_endpointAddress, USB_DIR_OUT, port,
692                   	portdata->out_buffer[j], OUT_BUFLEN, option_outdat_callback);
693 		}
694 	}
695 }
696 
697 static int option_send_setup(struct usb_serial_port *port)
698 {
699 	struct usb_serial *serial = port->serial;
700 	struct option_port_private *portdata;
701 
702 	dbg("%s", __FUNCTION__);
703 
704 	if (port->number != 0)
705 		return 0;
706 
707 	portdata = usb_get_serial_port_data(port);
708 
709 	if (port->tty) {
710 		int val = 0;
711 		if (portdata->dtr_state)
712 			val |= 0x01;
713 		if (portdata->rts_state)
714 			val |= 0x02;
715 
716 		return usb_control_msg(serial->dev,
717 				usb_rcvctrlpipe(serial->dev, 0),
718 				0x22,0x21,val,0,NULL,0,USB_CTRL_SET_TIMEOUT);
719 	}
720 
721 	return 0;
722 }
723 
724 static int option_startup(struct usb_serial *serial)
725 {
726 	int i, err;
727 	struct usb_serial_port *port;
728 	struct option_port_private *portdata;
729 
730 	dbg("%s", __FUNCTION__);
731 
732 	/* Now setup per port private data */
733 	for (i = 0; i < serial->num_ports; i++) {
734 		port = serial->port[i];
735 		portdata = kzalloc(sizeof(*portdata), GFP_KERNEL);
736 		if (!portdata) {
737 			dbg("%s: kmalloc for option_port_private (%d) failed!.",
738 					__FUNCTION__, i);
739 			return (1);
740 		}
741 
742 		usb_set_serial_port_data(port, portdata);
743 
744 		if (! port->interrupt_in_urb)
745 			continue;
746 		err = usb_submit_urb(port->interrupt_in_urb, GFP_KERNEL);
747 		if (err)
748 			dbg("%s: submit irq_in urb failed %d",
749 				__FUNCTION__, err);
750 	}
751 
752 	option_setup_urbs(serial);
753 
754 	return (0);
755 }
756 
757 static void option_shutdown(struct usb_serial *serial)
758 {
759 	int i, j;
760 	struct usb_serial_port *port;
761 	struct option_port_private *portdata;
762 
763 	dbg("%s", __FUNCTION__);
764 
765 	/* Stop reading/writing urbs */
766 	for (i = 0; i < serial->num_ports; ++i) {
767 		port = serial->port[i];
768 		portdata = usb_get_serial_port_data(port);
769 		for (j = 0; j < N_IN_URB; j++)
770 			usb_kill_urb(portdata->in_urbs[j]);
771 		for (j = 0; j < N_OUT_URB; j++)
772 			usb_kill_urb(portdata->out_urbs[j]);
773 	}
774 
775 	/* Now free them */
776 	for (i = 0; i < serial->num_ports; ++i) {
777 		port = serial->port[i];
778 		portdata = usb_get_serial_port_data(port);
779 
780 		for (j = 0; j < N_IN_URB; j++) {
781 			if (portdata->in_urbs[j]) {
782 				usb_free_urb(portdata->in_urbs[j]);
783 				portdata->in_urbs[j] = NULL;
784 			}
785 		}
786 		for (j = 0; j < N_OUT_URB; j++) {
787 			if (portdata->out_urbs[j]) {
788 				usb_free_urb(portdata->out_urbs[j]);
789 				portdata->out_urbs[j] = NULL;
790 			}
791 		}
792 	}
793 
794 	/* Now free per port private data */
795 	for (i = 0; i < serial->num_ports; i++) {
796 		port = serial->port[i];
797 		kfree(usb_get_serial_port_data(port));
798 	}
799 }
800 
801 MODULE_AUTHOR(DRIVER_AUTHOR);
802 MODULE_DESCRIPTION(DRIVER_DESC);
803 MODULE_VERSION(DRIVER_VERSION);
804 MODULE_LICENSE("GPL");
805 
806 #ifdef CONFIG_USB_DEBUG
807 module_param(debug, bool, S_IRUGO | S_IWUSR);
808 MODULE_PARM_DESC(debug, "Debug messages");
809 #endif
810 
811