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