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