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
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,
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
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 SIERRAWIRELESS_PRODUCT_MC8755 0x6802
84 #define NOVATELWIRELESS_PRODUCT_U740 0x1400
86 static 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(SIERRAWIRELESS_VENDOR_ID, SIERRAWIRELESS_PRODUCT_MC8755) },
95 { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID,NOVATELWIRELESS_PRODUCT_U740) },
96 { } /* Terminating entry */
99 static 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 { } /* Terminating entry */
110 static struct usb_device_id option_ids3[] = {
111 { USB_DEVICE(SIERRAWIRELESS_VENDOR_ID, SIERRAWIRELESS_PRODUCT_MC8755) },
112 { } /* Terminating entry */
115 MODULE_DEVICE_TABLE(usb, option_ids);
117 static struct usb_driver option_driver = {
119 .probe = usb_serial_probe,
120 .disconnect = usb_serial_disconnect,
121 .id_table = option_ids,
125 /* The card has three separate interfaces, which the serial driver
126 * recognizes separately, thus num_port=1.
128 static struct usb_serial_driver option_3port_device = {
130 .owner = THIS_MODULE,
133 .description = "GSM modem (3-port)",
134 .id_table = option_ids3,
135 .num_interrupt_in = NUM_DONT_CARE,
136 .num_bulk_in = NUM_DONT_CARE,
137 .num_bulk_out = NUM_DONT_CARE,
140 .close = option_close,
141 .write = option_write,
142 .write_room = option_write_room,
143 .chars_in_buffer = option_chars_in_buffer,
144 .throttle = option_rx_throttle,
145 .unthrottle = option_rx_unthrottle,
146 .set_termios = option_set_termios,
147 .break_ctl = option_break_ctl,
148 .tiocmget = option_tiocmget,
149 .tiocmset = option_tiocmset,
150 .attach = option_startup,
151 .shutdown = option_shutdown,
152 .read_int_callback = option_instat_callback,
155 static struct usb_serial_driver option_1port_device = {
157 .owner = THIS_MODULE,
160 .description = "GSM modem (1-port)",
161 .id_table = option_ids1,
162 .num_interrupt_in = NUM_DONT_CARE,
163 .num_bulk_in = NUM_DONT_CARE,
164 .num_bulk_out = NUM_DONT_CARE,
167 .close = option_close,
168 .write = option_write,
169 .write_room = option_write_room,
170 .chars_in_buffer = option_chars_in_buffer,
171 .throttle = option_rx_throttle,
172 .unthrottle = option_rx_unthrottle,
173 .ioctl = option_ioctl,
174 .set_termios = option_set_termios,
175 .break_ctl = option_break_ctl,
176 .tiocmget = option_tiocmget,
177 .tiocmset = option_tiocmset,
178 .attach = option_startup,
179 .shutdown = option_shutdown,
180 .read_int_callback = option_instat_callback,
183 #ifdef CONFIG_USB_DEBUG
189 /* per port private data */
193 #define IN_BUFLEN 4096
194 #define OUT_BUFLEN 128
196 struct option_port_private {
197 /* Input endpoints and buffer for this port */
198 struct urb *in_urbs[N_IN_URB];
199 char in_buffer[N_IN_URB][IN_BUFLEN];
200 /* Output endpoints and buffer for this port */
201 struct urb *out_urbs[N_OUT_URB];
202 char out_buffer[N_OUT_URB][OUT_BUFLEN];
204 /* Settings for the port */
205 int rts_state; /* Handshaking pins (outputs) */
207 int cts_state; /* Handshaking pins (inputs) */
212 unsigned long tx_start_time[N_OUT_URB];
215 /* Functions used by new usb-serial code. */
216 static int __init option_init(void)
219 retval = usb_serial_register(&option_1port_device);
221 goto failed_1port_device_register;
222 retval = usb_serial_register(&option_3port_device);
224 goto failed_3port_device_register;
225 retval = usb_register(&option_driver);
227 goto failed_driver_register;
229 info(DRIVER_DESC ": " DRIVER_VERSION);
233 failed_driver_register:
234 usb_serial_deregister (&option_3port_device);
235 failed_3port_device_register:
236 usb_serial_deregister (&option_1port_device);
237 failed_1port_device_register:
241 static void __exit option_exit(void)
243 usb_deregister (&option_driver);
244 usb_serial_deregister (&option_3port_device);
245 usb_serial_deregister (&option_1port_device);
248 module_init(option_init);
249 module_exit(option_exit);
251 static void option_rx_throttle(struct usb_serial_port *port)
253 dbg("%s", __FUNCTION__);
256 static void option_rx_unthrottle(struct usb_serial_port *port)
258 dbg("%s", __FUNCTION__);
261 static void option_break_ctl(struct usb_serial_port *port, int break_state)
263 /* Unfortunately, I don't know how to send a break */
264 dbg("%s", __FUNCTION__);
267 static void option_set_termios(struct usb_serial_port *port,
268 struct termios *old_termios)
270 dbg("%s", __FUNCTION__);
272 option_send_setup(port);
275 static int option_tiocmget(struct usb_serial_port *port, struct file *file)
278 struct option_port_private *portdata;
280 portdata = usb_get_serial_port_data(port);
282 value = ((portdata->rts_state) ? TIOCM_RTS : 0) |
283 ((portdata->dtr_state) ? TIOCM_DTR : 0) |
284 ((portdata->cts_state) ? TIOCM_CTS : 0) |
285 ((portdata->dsr_state) ? TIOCM_DSR : 0) |
286 ((portdata->dcd_state) ? TIOCM_CAR : 0) |
287 ((portdata->ri_state) ? TIOCM_RNG : 0);
292 static int option_tiocmset(struct usb_serial_port *port, struct file *file,
293 unsigned int set, unsigned int clear)
295 struct option_port_private *portdata;
297 portdata = usb_get_serial_port_data(port);
300 portdata->rts_state = 1;
302 portdata->dtr_state = 1;
304 if (clear & TIOCM_RTS)
305 portdata->rts_state = 0;
306 if (clear & TIOCM_DTR)
307 portdata->dtr_state = 0;
308 return option_send_setup(port);
311 static int option_ioctl(struct usb_serial_port *port, struct file *file,
312 unsigned int cmd, unsigned long arg)
318 static int option_write(struct usb_serial_port *port,
319 const unsigned char *buf, int count)
321 struct option_port_private *portdata;
324 struct urb *this_urb = NULL; /* spurious */
327 portdata = usb_get_serial_port_data(port);
329 dbg("%s: write (%d chars)", __FUNCTION__, count);
333 for (i=0; left > 0 && i < N_OUT_URB; i++) {
335 if (todo > OUT_BUFLEN)
338 this_urb = portdata->out_urbs[i];
339 if (this_urb->status == -EINPROGRESS) {
340 if (time_before(jiffies,
341 portdata->tx_start_time[i] + 10 * HZ))
343 usb_unlink_urb(this_urb);
346 if (this_urb->status != 0)
347 dbg("usb_write %p failed (err=%d)",
348 this_urb, this_urb->status);
350 dbg("%s: endpoint %d buf %d", __FUNCTION__,
351 usb_pipeendpoint(this_urb->pipe), i);
354 memcpy (this_urb->transfer_buffer, buf, todo);
355 this_urb->transfer_buffer_length = todo;
357 this_urb->dev = port->serial->dev;
358 err = usb_submit_urb(this_urb, GFP_ATOMIC);
360 dbg("usb_submit_urb %p (write bulk) failed "
361 "(%d, has %d)", this_urb,
362 err, this_urb->status);
365 portdata->tx_start_time[i] = jiffies;
371 dbg("%s: wrote (did %d)", __FUNCTION__, count);
375 static void option_indat_callback(struct urb *urb, struct pt_regs *regs)
379 struct usb_serial_port *port;
380 struct tty_struct *tty;
381 unsigned char *data = urb->transfer_buffer;
383 dbg("%s: %p", __FUNCTION__, urb);
385 endpoint = usb_pipeendpoint(urb->pipe);
386 port = (struct usb_serial_port *) urb->context;
389 dbg("%s: nonzero status: %d on endpoint %02x.",
390 __FUNCTION__, urb->status, endpoint);
393 if (urb->actual_length) {
394 tty_buffer_request_room(tty, urb->actual_length);
395 tty_insert_flip_string(tty, data, urb->actual_length);
396 tty_flip_buffer_push(tty);
398 dbg("%s: empty read urb received", __FUNCTION__);
401 /* Resubmit urb so we continue receiving */
402 if (port->open_count && urb->status != -ESHUTDOWN) {
403 err = usb_submit_urb(urb, GFP_ATOMIC);
405 printk(KERN_ERR "%s: resubmit read urb failed. "
406 "(%d)", __FUNCTION__, err);
412 static void option_outdat_callback(struct urb *urb, struct pt_regs *regs)
414 struct usb_serial_port *port;
416 dbg("%s", __FUNCTION__);
418 port = (struct usb_serial_port *) urb->context;
420 usb_serial_port_softint(port);
423 static void option_instat_callback(struct urb *urb, struct pt_regs *regs)
426 struct usb_serial_port *port = (struct usb_serial_port *) urb->context;
427 struct option_port_private *portdata = usb_get_serial_port_data(port);
428 struct usb_serial *serial = port->serial;
430 dbg("%s", __FUNCTION__);
431 dbg("%s: urb %p port %p has data %p", __FUNCTION__,urb,port,portdata);
433 if (urb->status == 0) {
434 struct usb_ctrlrequest *req_pkt =
435 (struct usb_ctrlrequest *)urb->transfer_buffer;
438 dbg("%s: NULL req_pkt\n", __FUNCTION__);
441 if ((req_pkt->bRequestType == 0xA1) &&
442 (req_pkt->bRequest == 0x20)) {
444 unsigned char signals = *((unsigned char *)
445 urb->transfer_buffer +
446 sizeof(struct usb_ctrlrequest));
448 dbg("%s: signal x%x", __FUNCTION__, signals);
450 old_dcd_state = portdata->dcd_state;
451 portdata->cts_state = 1;
452 portdata->dcd_state = ((signals & 0x01) ? 1 : 0);
453 portdata->dsr_state = ((signals & 0x02) ? 1 : 0);
454 portdata->ri_state = ((signals & 0x08) ? 1 : 0);
456 if (port->tty && !C_CLOCAL(port->tty) &&
457 old_dcd_state && !portdata->dcd_state)
458 tty_hangup(port->tty);
460 dbg("%s: type %x req %x", __FUNCTION__,
461 req_pkt->bRequestType,req_pkt->bRequest);
464 dbg("%s: error %d", __FUNCTION__, urb->status);
466 /* Resubmit urb so we continue receiving IRQ data */
467 if (urb->status != -ESHUTDOWN) {
468 urb->dev = serial->dev;
469 err = usb_submit_urb(urb, GFP_ATOMIC);
471 dbg("%s: resubmit intr urb failed. (%d)",
476 static int option_write_room(struct usb_serial_port *port)
478 struct option_port_private *portdata;
481 struct urb *this_urb;
483 portdata = usb_get_serial_port_data(port);
485 for (i=0; i < N_OUT_URB; i++) {
486 this_urb = portdata->out_urbs[i];
487 if (this_urb && this_urb->status != -EINPROGRESS)
488 data_len += OUT_BUFLEN;
491 dbg("%s: %d", __FUNCTION__, data_len);
495 static int option_chars_in_buffer(struct usb_serial_port *port)
497 struct option_port_private *portdata;
500 struct urb *this_urb;
502 portdata = usb_get_serial_port_data(port);
504 for (i=0; i < N_OUT_URB; i++) {
505 this_urb = portdata->out_urbs[i];
506 if (this_urb && this_urb->status == -EINPROGRESS)
507 data_len += this_urb->transfer_buffer_length;
509 dbg("%s: %d", __FUNCTION__, data_len);
513 static int option_open(struct usb_serial_port *port, struct file *filp)
515 struct option_port_private *portdata;
516 struct usb_serial *serial = port->serial;
520 portdata = usb_get_serial_port_data(port);
522 dbg("%s", __FUNCTION__);
524 /* Set some sane defaults */
525 portdata->rts_state = 1;
526 portdata->dtr_state = 1;
528 /* Reset low level data toggle and start reading from endpoints */
529 for (i = 0; i < N_IN_URB; i++) {
530 urb = portdata->in_urbs[i];
533 if (urb->dev != serial->dev) {
534 dbg("%s: dev %p != %p", __FUNCTION__,
535 urb->dev, serial->dev);
540 * make sure endpoint data toggle is synchronized with the
543 usb_clear_halt(urb->dev, urb->pipe);
545 err = usb_submit_urb(urb, GFP_KERNEL);
547 dbg("%s: submit urb %d failed (%d) %d",
548 __FUNCTION__, i, err,
549 urb->transfer_buffer_length);
553 /* Reset low level data toggle on out endpoints */
554 for (i = 0; i < N_OUT_URB; i++) {
555 urb = portdata->out_urbs[i];
558 urb->dev = serial->dev;
559 /* usb_settoggle(urb->dev, usb_pipeendpoint(urb->pipe),
560 usb_pipeout(urb->pipe), 0); */
563 port->tty->low_latency = 1;
565 option_send_setup(port);
570 static inline void stop_urb(struct urb *urb)
572 if (urb && urb->status == -EINPROGRESS)
576 static void option_close(struct usb_serial_port *port, struct file *filp)
579 struct usb_serial *serial = port->serial;
580 struct option_port_private *portdata;
582 dbg("%s", __FUNCTION__);
583 portdata = usb_get_serial_port_data(port);
585 portdata->rts_state = 0;
586 portdata->dtr_state = 0;
589 option_send_setup(port);
591 /* Stop reading/writing urbs */
592 for (i = 0; i < N_IN_URB; i++)
593 stop_urb(portdata->in_urbs[i]);
594 for (i = 0; i < N_OUT_URB; i++)
595 stop_urb(portdata->out_urbs[i]);
600 /* Helper functions used by option_setup_urbs */
601 static struct urb *option_setup_urb(struct usb_serial *serial, int endpoint,
602 int dir, void *ctx, char *buf, int len,
603 void (*callback)(struct urb *, struct pt_regs *regs))
608 return NULL; /* endpoint not needed */
610 urb = usb_alloc_urb(0, GFP_KERNEL); /* No ISO */
612 dbg("%s: alloc for endpoint %d failed.", __FUNCTION__, endpoint);
616 /* Fill URB using supplied data. */
617 usb_fill_bulk_urb(urb, serial->dev,
618 usb_sndbulkpipe(serial->dev, endpoint) | dir,
619 buf, len, callback, ctx);
625 static void option_setup_urbs(struct usb_serial *serial)
628 struct usb_serial_port *port;
629 struct option_port_private *portdata;
631 dbg("%s", __FUNCTION__);
634 for (i = 0; i < serial->num_ports; i++) {
635 port = serial->port[i];
636 portdata = usb_get_serial_port_data(port);
638 /* Do indat endpoints first */
639 for (j = 0; j < N_IN_URB; ++j) {
640 portdata->in_urbs[j] = option_setup_urb (serial,
641 port->bulk_in_endpointAddress, USB_DIR_IN, port,
642 portdata->in_buffer[j], IN_BUFLEN, option_indat_callback);
645 /* outdat endpoints */
646 for (j = 0; j < N_OUT_URB; ++j) {
647 portdata->out_urbs[j] = option_setup_urb (serial,
648 port->bulk_out_endpointAddress, USB_DIR_OUT, port,
649 portdata->out_buffer[j], OUT_BUFLEN, option_outdat_callback);
654 static int option_send_setup(struct usb_serial_port *port)
656 struct usb_serial *serial = port->serial;
657 struct option_port_private *portdata;
659 dbg("%s", __FUNCTION__);
661 portdata = usb_get_serial_port_data(port);
665 if (portdata->dtr_state)
667 if (portdata->rts_state)
670 return usb_control_msg(serial->dev,
671 usb_rcvctrlpipe(serial->dev, 0),
672 0x22,0x21,val,0,NULL,0,USB_CTRL_SET_TIMEOUT);
678 static int option_startup(struct usb_serial *serial)
681 struct usb_serial_port *port;
682 struct option_port_private *portdata;
684 dbg("%s", __FUNCTION__);
686 /* Now setup per port private data */
687 for (i = 0; i < serial->num_ports; i++) {
688 port = serial->port[i];
689 portdata = kzalloc(sizeof(*portdata), GFP_KERNEL);
691 dbg("%s: kmalloc for option_port_private (%d) failed!.",
696 usb_set_serial_port_data(port, portdata);
698 if (! port->interrupt_in_urb)
700 err = usb_submit_urb(port->interrupt_in_urb, GFP_KERNEL);
702 dbg("%s: submit irq_in urb failed %d",
706 option_setup_urbs(serial);
711 static void option_shutdown(struct usb_serial *serial)
714 struct usb_serial_port *port;
715 struct option_port_private *portdata;
717 dbg("%s", __FUNCTION__);
719 /* Stop reading/writing urbs */
720 for (i = 0; i < serial->num_ports; ++i) {
721 port = serial->port[i];
722 portdata = usb_get_serial_port_data(port);
723 for (j = 0; j < N_IN_URB; j++)
724 stop_urb(portdata->in_urbs[j]);
725 for (j = 0; j < N_OUT_URB; j++)
726 stop_urb(portdata->out_urbs[j]);
730 for (i = 0; i < serial->num_ports; ++i) {
731 port = serial->port[i];
732 portdata = usb_get_serial_port_data(port);
734 for (j = 0; j < N_IN_URB; j++) {
735 if (portdata->in_urbs[j]) {
736 usb_free_urb(portdata->in_urbs[j]);
737 portdata->in_urbs[j] = NULL;
740 for (j = 0; j < N_OUT_URB; j++) {
741 if (portdata->out_urbs[j]) {
742 usb_free_urb(portdata->out_urbs[j]);
743 portdata->out_urbs[j] = NULL;
748 /* Now free per port private data */
749 for (i = 0; i < serial->num_ports; i++) {
750 port = serial->port[i];
751 kfree(usb_get_serial_port_data(port));
755 MODULE_AUTHOR(DRIVER_AUTHOR);
756 MODULE_DESCRIPTION(DRIVER_DESC);
757 MODULE_VERSION(DRIVER_VERSION);
758 MODULE_LICENSE("GPL");
760 #ifdef CONFIG_USB_DEBUG
761 module_param(debug, bool, S_IRUGO | S_IWUSR);
762 MODULE_PARM_DESC(debug, "Debug messages");