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) 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
);
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 NOVATELWIRELESS_VENDOR_ID 0x1410
74 #define ANYDATA_VENDOR_ID 0x16d5
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
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(NOVATELWIRELESS_VENDOR_ID
,NOVATELWIRELESS_PRODUCT_U740
) },
95 { USB_DEVICE(ANYDATA_VENDOR_ID
, ANYDATA_PRODUCT_ID
) },
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 { USB_DEVICE(ANYDATA_VENDOR_ID
, ANYDATA_PRODUCT_ID
) },
109 { } /* Terminating entry */
112 MODULE_DEVICE_TABLE(usb
, option_ids
);
114 static struct usb_driver option_driver
= {
116 .probe
= usb_serial_probe
,
117 .disconnect
= usb_serial_disconnect
,
118 .id_table
= option_ids
,
122 /* The card has three separate interfaces, which the serial driver
123 * recognizes separately, thus num_port=1.
126 static struct usb_serial_driver option_1port_device
= {
128 .owner
= THIS_MODULE
,
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
,
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
,
154 #ifdef CONFIG_USB_DEBUG
160 /* per port private data */
164 #define IN_BUFLEN 4096
165 #define OUT_BUFLEN 128
167 struct 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
];
175 /* Settings for the port */
176 int rts_state
; /* Handshaking pins (outputs) */
178 int cts_state
; /* Handshaking pins (inputs) */
183 unsigned long tx_start_time
[N_OUT_URB
];
186 /* Functions used by new usb-serial code. */
187 static int __init
option_init(void)
190 retval
= usb_serial_register(&option_1port_device
);
192 goto failed_1port_device_register
;
193 retval
= usb_register(&option_driver
);
195 goto failed_driver_register
;
197 info(DRIVER_DESC
": " DRIVER_VERSION
);
201 failed_driver_register
:
202 usb_serial_deregister (&option_1port_device
);
203 failed_1port_device_register
:
207 static void __exit
option_exit(void)
209 usb_deregister (&option_driver
);
210 usb_serial_deregister (&option_1port_device
);
213 module_init(option_init
);
214 module_exit(option_exit
);
216 static void option_rx_throttle(struct usb_serial_port
*port
)
218 dbg("%s", __FUNCTION__
);
221 static void option_rx_unthrottle(struct usb_serial_port
*port
)
223 dbg("%s", __FUNCTION__
);
226 static void option_break_ctl(struct usb_serial_port
*port
, int break_state
)
228 /* Unfortunately, I don't know how to send a break */
229 dbg("%s", __FUNCTION__
);
232 static void option_set_termios(struct usb_serial_port
*port
,
233 struct termios
*old_termios
)
235 dbg("%s", __FUNCTION__
);
237 option_send_setup(port
);
240 static int option_tiocmget(struct usb_serial_port
*port
, struct file
*file
)
243 struct option_port_private
*portdata
;
245 portdata
= usb_get_serial_port_data(port
);
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);
257 static int option_tiocmset(struct usb_serial_port
*port
, struct file
*file
,
258 unsigned int set
, unsigned int clear
)
260 struct option_port_private
*portdata
;
262 portdata
= usb_get_serial_port_data(port
);
265 portdata
->rts_state
= 1;
267 portdata
->dtr_state
= 1;
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
);
276 static int option_ioctl(struct usb_serial_port
*port
, struct file
*file
,
277 unsigned int cmd
, unsigned long arg
)
283 static int option_write(struct usb_serial_port
*port
,
284 const unsigned char *buf
, int count
)
286 struct option_port_private
*portdata
;
289 struct urb
*this_urb
= NULL
; /* spurious */
292 portdata
= usb_get_serial_port_data(port
);
294 dbg("%s: write (%d chars)", __FUNCTION__
, count
);
298 for (i
=0; left
> 0 && i
< N_OUT_URB
; i
++) {
300 if (todo
> OUT_BUFLEN
)
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
))
308 usb_unlink_urb(this_urb
);
311 if (this_urb
->status
!= 0)
312 dbg("usb_write %p failed (err=%d)",
313 this_urb
, this_urb
->status
);
315 dbg("%s: endpoint %d buf %d", __FUNCTION__
,
316 usb_pipeendpoint(this_urb
->pipe
), i
);
319 memcpy (this_urb
->transfer_buffer
, buf
, todo
);
320 this_urb
->transfer_buffer_length
= todo
;
322 this_urb
->dev
= port
->serial
->dev
;
323 err
= usb_submit_urb(this_urb
, GFP_ATOMIC
);
325 dbg("usb_submit_urb %p (write bulk) failed "
326 "(%d, has %d)", this_urb
,
327 err
, this_urb
->status
);
330 portdata
->tx_start_time
[i
] = jiffies
;
336 dbg("%s: wrote (did %d)", __FUNCTION__
, count
);
340 static void option_indat_callback(struct urb
*urb
)
344 struct usb_serial_port
*port
;
345 struct tty_struct
*tty
;
346 unsigned char *data
= urb
->transfer_buffer
;
348 dbg("%s: %p", __FUNCTION__
, urb
);
350 endpoint
= usb_pipeendpoint(urb
->pipe
);
351 port
= (struct usb_serial_port
*) urb
->context
;
354 dbg("%s: nonzero status: %d on endpoint %02x.",
355 __FUNCTION__
, urb
->status
, endpoint
);
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
);
363 dbg("%s: empty read urb received", __FUNCTION__
);
366 /* Resubmit urb so we continue receiving */
367 if (port
->open_count
&& urb
->status
!= -ESHUTDOWN
) {
368 err
= usb_submit_urb(urb
, GFP_ATOMIC
);
370 printk(KERN_ERR
"%s: resubmit read urb failed. "
371 "(%d)", __FUNCTION__
, err
);
377 static void option_outdat_callback(struct urb
*urb
)
379 struct usb_serial_port
*port
;
381 dbg("%s", __FUNCTION__
);
383 port
= (struct usb_serial_port
*) urb
->context
;
385 usb_serial_port_softint(port
);
388 static void option_instat_callback(struct urb
*urb
)
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
;
395 dbg("%s", __FUNCTION__
);
396 dbg("%s: urb %p port %p has data %p", __FUNCTION__
,urb
,port
,portdata
);
398 if (urb
->status
== 0) {
399 struct usb_ctrlrequest
*req_pkt
=
400 (struct usb_ctrlrequest
*)urb
->transfer_buffer
;
403 dbg("%s: NULL req_pkt\n", __FUNCTION__
);
406 if ((req_pkt
->bRequestType
== 0xA1) &&
407 (req_pkt
->bRequest
== 0x20)) {
409 unsigned char signals
= *((unsigned char *)
410 urb
->transfer_buffer
+
411 sizeof(struct usb_ctrlrequest
));
413 dbg("%s: signal x%x", __FUNCTION__
, signals
);
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);
421 if (port
->tty
&& !C_CLOCAL(port
->tty
) &&
422 old_dcd_state
&& !portdata
->dcd_state
)
423 tty_hangup(port
->tty
);
425 dbg("%s: type %x req %x", __FUNCTION__
,
426 req_pkt
->bRequestType
,req_pkt
->bRequest
);
429 dbg("%s: error %d", __FUNCTION__
, urb
->status
);
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
);
436 dbg("%s: resubmit intr urb failed. (%d)",
441 static int option_write_room(struct usb_serial_port
*port
)
443 struct option_port_private
*portdata
;
446 struct urb
*this_urb
;
448 portdata
= usb_get_serial_port_data(port
);
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
;
456 dbg("%s: %d", __FUNCTION__
, data_len
);
460 static int option_chars_in_buffer(struct usb_serial_port
*port
)
462 struct option_port_private
*portdata
;
465 struct urb
*this_urb
;
467 portdata
= usb_get_serial_port_data(port
);
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
;
474 dbg("%s: %d", __FUNCTION__
, data_len
);
478 static int option_open(struct usb_serial_port
*port
, struct file
*filp
)
480 struct option_port_private
*portdata
;
481 struct usb_serial
*serial
= port
->serial
;
485 portdata
= usb_get_serial_port_data(port
);
487 dbg("%s", __FUNCTION__
);
489 /* Set some sane defaults */
490 portdata
->rts_state
= 1;
491 portdata
->dtr_state
= 1;
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
];
498 if (urb
->dev
!= serial
->dev
) {
499 dbg("%s: dev %p != %p", __FUNCTION__
,
500 urb
->dev
, serial
->dev
);
505 * make sure endpoint data toggle is synchronized with the
508 usb_clear_halt(urb
->dev
, urb
->pipe
);
510 err
= usb_submit_urb(urb
, GFP_KERNEL
);
512 dbg("%s: submit urb %d failed (%d) %d",
513 __FUNCTION__
, i
, err
,
514 urb
->transfer_buffer_length
);
518 /* Reset low level data toggle on out endpoints */
519 for (i
= 0; i
< N_OUT_URB
; i
++) {
520 urb
= portdata
->out_urbs
[i
];
523 urb
->dev
= serial
->dev
;
524 /* usb_settoggle(urb->dev, usb_pipeendpoint(urb->pipe),
525 usb_pipeout(urb->pipe), 0); */
528 port
->tty
->low_latency
= 1;
530 option_send_setup(port
);
535 static inline void stop_urb(struct urb
*urb
)
537 if (urb
&& urb
->status
== -EINPROGRESS
)
541 static void option_close(struct usb_serial_port
*port
, struct file
*filp
)
544 struct usb_serial
*serial
= port
->serial
;
545 struct option_port_private
*portdata
;
547 dbg("%s", __FUNCTION__
);
548 portdata
= usb_get_serial_port_data(port
);
550 portdata
->rts_state
= 0;
551 portdata
->dtr_state
= 0;
554 option_send_setup(port
);
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
]);
565 /* Helper functions used by option_setup_urbs */
566 static 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
*))
573 return NULL
; /* endpoint not needed */
575 urb
= usb_alloc_urb(0, GFP_KERNEL
); /* No ISO */
577 dbg("%s: alloc for endpoint %d failed.", __FUNCTION__
, endpoint
);
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
);
590 static void option_setup_urbs(struct usb_serial
*serial
)
593 struct usb_serial_port
*port
;
594 struct option_port_private
*portdata
;
596 dbg("%s", __FUNCTION__
);
598 for (i
= 0; i
< serial
->num_ports
; i
++) {
599 port
= serial
->port
[i
];
600 portdata
= usb_get_serial_port_data(port
);
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
);
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
);
618 static int option_send_setup(struct usb_serial_port
*port
)
620 struct usb_serial
*serial
= port
->serial
;
621 struct option_port_private
*portdata
;
623 dbg("%s", __FUNCTION__
);
625 portdata
= usb_get_serial_port_data(port
);
629 if (portdata
->dtr_state
)
631 if (portdata
->rts_state
)
634 return usb_control_msg(serial
->dev
,
635 usb_rcvctrlpipe(serial
->dev
, 0),
636 0x22,0x21,val
,0,NULL
,0,USB_CTRL_SET_TIMEOUT
);
642 static int option_startup(struct usb_serial
*serial
)
645 struct usb_serial_port
*port
;
646 struct option_port_private
*portdata
;
648 dbg("%s", __FUNCTION__
);
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
);
655 dbg("%s: kmalloc for option_port_private (%d) failed!.",
660 usb_set_serial_port_data(port
, portdata
);
662 if (! port
->interrupt_in_urb
)
664 err
= usb_submit_urb(port
->interrupt_in_urb
, GFP_KERNEL
);
666 dbg("%s: submit irq_in urb failed %d",
670 option_setup_urbs(serial
);
675 static void option_shutdown(struct usb_serial
*serial
)
678 struct usb_serial_port
*port
;
679 struct option_port_private
*portdata
;
681 dbg("%s", __FUNCTION__
);
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
]);
694 for (i
= 0; i
< serial
->num_ports
; ++i
) {
695 port
= serial
->port
[i
];
696 portdata
= usb_get_serial_port_data(port
);
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
;
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
;
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
));
719 MODULE_AUTHOR(DRIVER_AUTHOR
);
720 MODULE_DESCRIPTION(DRIVER_DESC
);
721 MODULE_VERSION(DRIVER_VERSION
);
722 MODULE_LICENSE("GPL");
724 #ifdef CONFIG_USB_DEBUG
725 module_param(debug
, bool, S_IRUGO
| S_IWUSR
);
726 MODULE_PARM_DESC(debug
, "Debug messages");