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