USB: Let option driver handle Anydata CDMA modems. Remove anydata driver.
[usb.git] / drivers / usb / serial / option.c
blobb020f13b95bb5731583e572ff3db934ae3b8e7d3
1 /*
2 USB Driver for GSM modems
4 Copyright (C) 2005 Matthias Urlichs <smurf@smurf.noris.de>
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.
10 Portions copied from the Keyspan driver by Hugh Blemings <hugh@blemings.org>
12 History: see the git log.
14 Work sponsored by: Sigos GmbH, Germany <info@sigos.de>
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) and multiplex (Sierra) control
20 - controlling the baud rate doesn't make sense
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.
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.
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"
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>
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);
53 static void option_instat_callback(struct urb *urb, struct pt_regs *regs);
55 static int option_write(struct usb_serial_port *port,
56 const unsigned char *buf, int count);
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 termios *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);
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 SIERRAWIRELESS_VENDOR_ID 0x1199
74 #define NOVATELWIRELESS_VENDOR_ID 0x1410
75 #define ANYDATA_VENDOR_ID 0x16d5
77 #define OPTION_PRODUCT_OLD 0x5000
78 #define OPTION_PRODUCT_FUSION 0x6000
79 #define OPTION_PRODUCT_FUSION2 0x6300
80 #define OPTION_PRODUCT_COBRA 0x6500
81 #define OPTION_PRODUCT_COBRA2 0x6600
82 #define HUAWEI_PRODUCT_E600 0x1001
83 #define AUDIOVOX_PRODUCT_AIRCARD 0x0112
84 #define SIERRAWIRELESS_PRODUCT_MC8755 0x6802
85 #define NOVATELWIRELESS_PRODUCT_U740 0x1400
86 #define ANYDATA_PRODUCT_ID 0x6501
88 static struct usb_device_id option_ids[] = {
89 { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_OLD) },
90 { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_FUSION) },
91 { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_FUSION2) },
92 { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_COBRA) },
93 { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_COBRA2) },
94 { USB_DEVICE(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E600) },
95 { USB_DEVICE(AUDIOVOX_VENDOR_ID, AUDIOVOX_PRODUCT_AIRCARD) },
96 { USB_DEVICE(SIERRAWIRELESS_VENDOR_ID, SIERRAWIRELESS_PRODUCT_MC8755) },
97 { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID,NOVATELWIRELESS_PRODUCT_U740) },
98 { USB_DEVICE(ANYDATA_VENDOR_ID, ANYDATA_PRODUCT_ID) },
99 { } /* Terminating entry */
102 static struct usb_device_id option_ids1[] = {
103 { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_OLD) },
104 { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_FUSION) },
105 { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_FUSION2) },
106 { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_COBRA) },
107 { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_COBRA2) },
108 { USB_DEVICE(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E600) },
109 { USB_DEVICE(AUDIOVOX_VENDOR_ID, AUDIOVOX_PRODUCT_AIRCARD) },
110 { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID,NOVATELWIRELESS_PRODUCT_U740) },
111 { USB_DEVICE(ANYDATA_VENDOR_ID, ANYDATA_PRODUCT_ID) },
112 { } /* Terminating entry */
114 static struct usb_device_id option_ids3[] = {
115 { USB_DEVICE(SIERRAWIRELESS_VENDOR_ID, SIERRAWIRELESS_PRODUCT_MC8755) },
116 { } /* Terminating entry */
119 MODULE_DEVICE_TABLE(usb, option_ids);
121 static struct usb_driver option_driver = {
122 .name = "option",
123 .probe = usb_serial_probe,
124 .disconnect = usb_serial_disconnect,
125 .id_table = option_ids,
126 .no_dynamic_id = 1,
129 /* The card has three separate interfaces, which the serial driver
130 * recognizes separately, thus num_port=1.
132 static struct usb_serial_driver option_3port_device = {
133 .driver = {
134 .owner = THIS_MODULE,
135 .name = "option3",
137 .description = "GSM modem (3-port)",
138 .id_table = option_ids3,
139 .num_interrupt_in = NUM_DONT_CARE,
140 .num_bulk_in = NUM_DONT_CARE,
141 .num_bulk_out = NUM_DONT_CARE,
142 .num_ports = 3,
143 .open = option_open,
144 .close = option_close,
145 .write = option_write,
146 .write_room = option_write_room,
147 .chars_in_buffer = option_chars_in_buffer,
148 .throttle = option_rx_throttle,
149 .unthrottle = option_rx_unthrottle,
150 .ioctl = option_ioctl,
151 .set_termios = option_set_termios,
152 .break_ctl = option_break_ctl,
153 .tiocmget = option_tiocmget,
154 .tiocmset = option_tiocmset,
155 .attach = option_startup,
156 .shutdown = option_shutdown,
157 .read_int_callback = option_instat_callback,
160 static struct usb_serial_driver option_1port_device = {
161 .driver = {
162 .owner = THIS_MODULE,
163 .name = "option1",
165 .description = "GSM modem (1-port)",
166 .id_table = option_ids1,
167 .num_interrupt_in = NUM_DONT_CARE,
168 .num_bulk_in = NUM_DONT_CARE,
169 .num_bulk_out = NUM_DONT_CARE,
170 .num_ports = 1,
171 .open = option_open,
172 .close = option_close,
173 .write = option_write,
174 .write_room = option_write_room,
175 .chars_in_buffer = option_chars_in_buffer,
176 .throttle = option_rx_throttle,
177 .unthrottle = option_rx_unthrottle,
178 .ioctl = option_ioctl,
179 .set_termios = option_set_termios,
180 .break_ctl = option_break_ctl,
181 .tiocmget = option_tiocmget,
182 .tiocmset = option_tiocmset,
183 .attach = option_startup,
184 .shutdown = option_shutdown,
185 .read_int_callback = option_instat_callback,
188 #ifdef CONFIG_USB_DEBUG
189 static int debug;
190 #else
191 #define debug 0
192 #endif
194 /* per port private data */
196 #define N_IN_URB 4
197 #define N_OUT_URB 1
198 #define IN_BUFLEN 4096
199 #define OUT_BUFLEN 128
201 struct option_port_private {
202 /* Input endpoints and buffer for this port */
203 struct urb *in_urbs[N_IN_URB];
204 char in_buffer[N_IN_URB][IN_BUFLEN];
205 /* Output endpoints and buffer for this port */
206 struct urb *out_urbs[N_OUT_URB];
207 char out_buffer[N_OUT_URB][OUT_BUFLEN];
209 /* Settings for the port */
210 int rts_state; /* Handshaking pins (outputs) */
211 int dtr_state;
212 int cts_state; /* Handshaking pins (inputs) */
213 int dsr_state;
214 int dcd_state;
215 int ri_state;
217 unsigned long tx_start_time[N_OUT_URB];
220 /* Functions used by new usb-serial code. */
221 static int __init option_init(void)
223 int retval;
224 retval = usb_serial_register(&option_1port_device);
225 if (retval)
226 goto failed_1port_device_register;
227 retval = usb_serial_register(&option_3port_device);
228 if (retval)
229 goto failed_3port_device_register;
230 retval = usb_register(&option_driver);
231 if (retval)
232 goto failed_driver_register;
234 info(DRIVER_DESC ": " DRIVER_VERSION);
236 return 0;
238 failed_driver_register:
239 usb_serial_deregister (&option_3port_device);
240 failed_3port_device_register:
241 usb_serial_deregister (&option_1port_device);
242 failed_1port_device_register:
243 return retval;
246 static void __exit option_exit(void)
248 usb_deregister (&option_driver);
249 usb_serial_deregister (&option_3port_device);
250 usb_serial_deregister (&option_1port_device);
253 module_init(option_init);
254 module_exit(option_exit);
256 static void option_rx_throttle(struct usb_serial_port *port)
258 dbg("%s", __FUNCTION__);
261 static void option_rx_unthrottle(struct usb_serial_port *port)
263 dbg("%s", __FUNCTION__);
266 static void option_break_ctl(struct usb_serial_port *port, int break_state)
268 /* Unfortunately, I don't know how to send a break */
269 dbg("%s", __FUNCTION__);
272 static void option_set_termios(struct usb_serial_port *port,
273 struct termios *old_termios)
275 dbg("%s", __FUNCTION__);
277 option_send_setup(port);
280 static int option_tiocmget(struct usb_serial_port *port, struct file *file)
282 unsigned int value;
283 struct option_port_private *portdata;
285 portdata = usb_get_serial_port_data(port);
287 value = ((portdata->rts_state) ? TIOCM_RTS : 0) |
288 ((portdata->dtr_state) ? TIOCM_DTR : 0) |
289 ((portdata->cts_state) ? TIOCM_CTS : 0) |
290 ((portdata->dsr_state) ? TIOCM_DSR : 0) |
291 ((portdata->dcd_state) ? TIOCM_CAR : 0) |
292 ((portdata->ri_state) ? TIOCM_RNG : 0);
294 return value;
297 static int option_tiocmset(struct usb_serial_port *port, struct file *file,
298 unsigned int set, unsigned int clear)
300 struct option_port_private *portdata;
302 portdata = usb_get_serial_port_data(port);
304 if (set & TIOCM_RTS)
305 portdata->rts_state = 1;
306 if (set & TIOCM_DTR)
307 portdata->dtr_state = 1;
309 if (clear & TIOCM_RTS)
310 portdata->rts_state = 0;
311 if (clear & TIOCM_DTR)
312 portdata->dtr_state = 0;
313 return option_send_setup(port);
316 static int option_ioctl(struct usb_serial_port *port, struct file *file,
317 unsigned int cmd, unsigned long arg)
319 return -ENOIOCTLCMD;
322 /* Write */
323 static int option_write(struct usb_serial_port *port,
324 const unsigned char *buf, int count)
326 struct option_port_private *portdata;
327 int i;
328 int left, todo;
329 struct urb *this_urb = NULL; /* spurious */
330 int err;
332 portdata = usb_get_serial_port_data(port);
334 dbg("%s: write (%d chars)", __FUNCTION__, count);
336 i = 0;
337 left = count;
338 for (i=0; left > 0 && i < N_OUT_URB; i++) {
339 todo = left;
340 if (todo > OUT_BUFLEN)
341 todo = OUT_BUFLEN;
343 this_urb = portdata->out_urbs[i];
344 if (this_urb->status == -EINPROGRESS) {
345 if (time_before(jiffies,
346 portdata->tx_start_time[i] + 10 * HZ))
347 continue;
348 usb_unlink_urb(this_urb);
349 continue;
351 if (this_urb->status != 0)
352 dbg("usb_write %p failed (err=%d)",
353 this_urb, this_urb->status);
355 dbg("%s: endpoint %d buf %d", __FUNCTION__,
356 usb_pipeendpoint(this_urb->pipe), i);
358 /* send the data */
359 memcpy (this_urb->transfer_buffer, buf, todo);
360 this_urb->transfer_buffer_length = todo;
362 this_urb->dev = port->serial->dev;
363 err = usb_submit_urb(this_urb, GFP_ATOMIC);
364 if (err) {
365 dbg("usb_submit_urb %p (write bulk) failed "
366 "(%d, has %d)", this_urb,
367 err, this_urb->status);
368 continue;
370 portdata->tx_start_time[i] = jiffies;
371 buf += todo;
372 left -= todo;
375 count -= left;
376 dbg("%s: wrote (did %d)", __FUNCTION__, count);
377 return count;
380 static void option_indat_callback(struct urb *urb, struct pt_regs *regs)
382 int err;
383 int endpoint;
384 struct usb_serial_port *port;
385 struct tty_struct *tty;
386 unsigned char *data = urb->transfer_buffer;
388 dbg("%s: %p", __FUNCTION__, urb);
390 endpoint = usb_pipeendpoint(urb->pipe);
391 port = (struct usb_serial_port *) urb->context;
393 if (urb->status) {
394 dbg("%s: nonzero status: %d on endpoint %02x.",
395 __FUNCTION__, urb->status, endpoint);
396 } else {
397 tty = port->tty;
398 if (urb->actual_length) {
399 tty_buffer_request_room(tty, urb->actual_length);
400 tty_insert_flip_string(tty, data, urb->actual_length);
401 tty_flip_buffer_push(tty);
402 } else {
403 dbg("%s: empty read urb received", __FUNCTION__);
406 /* Resubmit urb so we continue receiving */
407 if (port->open_count && urb->status != -ESHUTDOWN) {
408 err = usb_submit_urb(urb, GFP_ATOMIC);
409 if (err)
410 printk(KERN_ERR "%s: resubmit read urb failed. "
411 "(%d)", __FUNCTION__, err);
414 return;
417 static void option_outdat_callback(struct urb *urb, struct pt_regs *regs)
419 struct usb_serial_port *port;
421 dbg("%s", __FUNCTION__);
423 port = (struct usb_serial_port *) urb->context;
425 usb_serial_port_softint(port);
428 static void option_instat_callback(struct urb *urb, struct pt_regs *regs)
430 int err;
431 struct usb_serial_port *port = (struct usb_serial_port *) urb->context;
432 struct option_port_private *portdata = usb_get_serial_port_data(port);
433 struct usb_serial *serial = port->serial;
435 dbg("%s", __FUNCTION__);
436 dbg("%s: urb %p port %p has data %p", __FUNCTION__,urb,port,portdata);
438 if (urb->status == 0) {
439 struct usb_ctrlrequest *req_pkt =
440 (struct usb_ctrlrequest *)urb->transfer_buffer;
442 if (!req_pkt) {
443 dbg("%s: NULL req_pkt\n", __FUNCTION__);
444 return;
446 if ((req_pkt->bRequestType == 0xA1) &&
447 (req_pkt->bRequest == 0x20)) {
448 int old_dcd_state;
449 unsigned char signals = *((unsigned char *)
450 urb->transfer_buffer +
451 sizeof(struct usb_ctrlrequest));
453 dbg("%s: signal x%x", __FUNCTION__, signals);
455 old_dcd_state = portdata->dcd_state;
456 portdata->cts_state = 1;
457 portdata->dcd_state = ((signals & 0x01) ? 1 : 0);
458 portdata->dsr_state = ((signals & 0x02) ? 1 : 0);
459 portdata->ri_state = ((signals & 0x08) ? 1 : 0);
461 if (port->tty && !C_CLOCAL(port->tty) &&
462 old_dcd_state && !portdata->dcd_state)
463 tty_hangup(port->tty);
464 } else {
465 dbg("%s: type %x req %x", __FUNCTION__,
466 req_pkt->bRequestType,req_pkt->bRequest);
468 } else
469 dbg("%s: error %d", __FUNCTION__, urb->status);
471 /* Resubmit urb so we continue receiving IRQ data */
472 if (urb->status != -ESHUTDOWN) {
473 urb->dev = serial->dev;
474 err = usb_submit_urb(urb, GFP_ATOMIC);
475 if (err)
476 dbg("%s: resubmit intr urb failed. (%d)",
477 __FUNCTION__, err);
481 static int option_write_room(struct usb_serial_port *port)
483 struct option_port_private *portdata;
484 int i;
485 int data_len = 0;
486 struct urb *this_urb;
488 portdata = usb_get_serial_port_data(port);
490 for (i=0; i < N_OUT_URB; i++) {
491 this_urb = portdata->out_urbs[i];
492 if (this_urb && this_urb->status != -EINPROGRESS)
493 data_len += OUT_BUFLEN;
496 dbg("%s: %d", __FUNCTION__, data_len);
497 return data_len;
500 static int option_chars_in_buffer(struct usb_serial_port *port)
502 struct option_port_private *portdata;
503 int i;
504 int data_len = 0;
505 struct urb *this_urb;
507 portdata = usb_get_serial_port_data(port);
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 += this_urb->transfer_buffer_length;
514 dbg("%s: %d", __FUNCTION__, data_len);
515 return data_len;
518 static int option_open(struct usb_serial_port *port, struct file *filp)
520 struct option_port_private *portdata;
521 struct usb_serial *serial = port->serial;
522 int i, err;
523 struct urb *urb;
525 portdata = usb_get_serial_port_data(port);
527 dbg("%s", __FUNCTION__);
529 /* Set some sane defaults */
530 portdata->rts_state = 1;
531 portdata->dtr_state = 1;
533 /* Reset low level data toggle and start reading from endpoints */
534 for (i = 0; i < N_IN_URB; i++) {
535 urb = portdata->in_urbs[i];
536 if (! urb)
537 continue;
538 if (urb->dev != serial->dev) {
539 dbg("%s: dev %p != %p", __FUNCTION__,
540 urb->dev, serial->dev);
541 continue;
545 * make sure endpoint data toggle is synchronized with the
546 * device
548 usb_clear_halt(urb->dev, urb->pipe);
550 err = usb_submit_urb(urb, GFP_KERNEL);
551 if (err) {
552 dbg("%s: submit urb %d failed (%d) %d",
553 __FUNCTION__, i, err,
554 urb->transfer_buffer_length);
558 /* Reset low level data toggle on out endpoints */
559 for (i = 0; i < N_OUT_URB; i++) {
560 urb = portdata->out_urbs[i];
561 if (! urb)
562 continue;
563 urb->dev = serial->dev;
564 /* usb_settoggle(urb->dev, usb_pipeendpoint(urb->pipe),
565 usb_pipeout(urb->pipe), 0); */
568 port->tty->low_latency = 1;
570 option_send_setup(port);
572 return (0);
575 static inline void stop_urb(struct urb *urb)
577 if (urb && urb->status == -EINPROGRESS)
578 usb_kill_urb(urb);
581 static void option_close(struct usb_serial_port *port, struct file *filp)
583 int i;
584 struct usb_serial *serial = port->serial;
585 struct option_port_private *portdata;
587 dbg("%s", __FUNCTION__);
588 portdata = usb_get_serial_port_data(port);
590 portdata->rts_state = 0;
591 portdata->dtr_state = 0;
593 if (serial->dev) {
594 option_send_setup(port);
596 /* Stop reading/writing urbs */
597 for (i = 0; i < N_IN_URB; i++)
598 stop_urb(portdata->in_urbs[i]);
599 for (i = 0; i < N_OUT_URB; i++)
600 stop_urb(portdata->out_urbs[i]);
602 port->tty = NULL;
605 /* Helper functions used by option_setup_urbs */
606 static struct urb *option_setup_urb(struct usb_serial *serial, int endpoint,
607 int dir, void *ctx, char *buf, int len,
608 void (*callback)(struct urb *, struct pt_regs *regs))
610 struct urb *urb;
612 if (endpoint == -1)
613 return NULL; /* endpoint not needed */
615 urb = usb_alloc_urb(0, GFP_KERNEL); /* No ISO */
616 if (urb == NULL) {
617 dbg("%s: alloc for endpoint %d failed.", __FUNCTION__, endpoint);
618 return NULL;
621 /* Fill URB using supplied data. */
622 usb_fill_bulk_urb(urb, serial->dev,
623 usb_sndbulkpipe(serial->dev, endpoint) | dir,
624 buf, len, callback, ctx);
626 return urb;
629 /* Setup urbs */
630 static void option_setup_urbs(struct usb_serial *serial)
632 int i,j;
633 struct usb_serial_port *port;
634 struct option_port_private *portdata;
636 dbg("%s", __FUNCTION__);
638 for (i = 0; i < serial->num_ports; i++) {
639 port = serial->port[i];
640 portdata = usb_get_serial_port_data(port);
642 /* Do indat endpoints first */
643 for (j = 0; j < N_IN_URB; ++j) {
644 portdata->in_urbs[j] = option_setup_urb (serial,
645 port->bulk_in_endpointAddress, USB_DIR_IN, port,
646 portdata->in_buffer[j], IN_BUFLEN, option_indat_callback);
649 /* outdat endpoints */
650 for (j = 0; j < N_OUT_URB; ++j) {
651 portdata->out_urbs[j] = option_setup_urb (serial,
652 port->bulk_out_endpointAddress, USB_DIR_OUT, port,
653 portdata->out_buffer[j], OUT_BUFLEN, option_outdat_callback);
658 static int option_send_setup(struct usb_serial_port *port)
660 struct usb_serial *serial = port->serial;
661 struct option_port_private *portdata;
663 dbg("%s", __FUNCTION__);
665 portdata = usb_get_serial_port_data(port);
667 if (port->tty) {
668 int val = 0;
669 if (portdata->dtr_state)
670 val |= 0x01;
671 if (portdata->rts_state)
672 val |= 0x02;
674 return usb_control_msg(serial->dev,
675 usb_rcvctrlpipe(serial->dev, 0),
676 0x22,0x21,val,0,NULL,0,USB_CTRL_SET_TIMEOUT);
679 return 0;
682 static int option_startup(struct usb_serial *serial)
684 int i, err;
685 struct usb_serial_port *port;
686 struct option_port_private *portdata;
688 dbg("%s", __FUNCTION__);
690 /* Now setup per port private data */
691 for (i = 0; i < serial->num_ports; i++) {
692 port = serial->port[i];
693 portdata = kzalloc(sizeof(*portdata), GFP_KERNEL);
694 if (!portdata) {
695 dbg("%s: kmalloc for option_port_private (%d) failed!.",
696 __FUNCTION__, i);
697 return (1);
700 usb_set_serial_port_data(port, portdata);
702 if (! port->interrupt_in_urb)
703 continue;
704 err = usb_submit_urb(port->interrupt_in_urb, GFP_KERNEL);
705 if (err)
706 dbg("%s: submit irq_in urb failed %d",
707 __FUNCTION__, err);
710 option_setup_urbs(serial);
712 return (0);
715 static void option_shutdown(struct usb_serial *serial)
717 int i, j;
718 struct usb_serial_port *port;
719 struct option_port_private *portdata;
721 dbg("%s", __FUNCTION__);
723 /* Stop reading/writing urbs */
724 for (i = 0; i < serial->num_ports; ++i) {
725 port = serial->port[i];
726 portdata = usb_get_serial_port_data(port);
727 for (j = 0; j < N_IN_URB; j++)
728 stop_urb(portdata->in_urbs[j]);
729 for (j = 0; j < N_OUT_URB; j++)
730 stop_urb(portdata->out_urbs[j]);
733 /* Now free them */
734 for (i = 0; i < serial->num_ports; ++i) {
735 port = serial->port[i];
736 portdata = usb_get_serial_port_data(port);
738 for (j = 0; j < N_IN_URB; j++) {
739 if (portdata->in_urbs[j]) {
740 usb_free_urb(portdata->in_urbs[j]);
741 portdata->in_urbs[j] = NULL;
744 for (j = 0; j < N_OUT_URB; j++) {
745 if (portdata->out_urbs[j]) {
746 usb_free_urb(portdata->out_urbs[j]);
747 portdata->out_urbs[j] = NULL;
752 /* Now free per port private data */
753 for (i = 0; i < serial->num_ports; i++) {
754 port = serial->port[i];
755 kfree(usb_get_serial_port_data(port));
759 MODULE_AUTHOR(DRIVER_AUTHOR);
760 MODULE_DESCRIPTION(DRIVER_DESC);
761 MODULE_VERSION(DRIVER_VERSION);
762 MODULE_LICENSE("GPL");
764 #ifdef CONFIG_USB_DEBUG
765 module_param(debug, bool, S_IRUGO | S_IWUSR);
766 MODULE_PARM_DESC(debug, "Debug messages");
767 #endif