2 USB Driver layer 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 - controlling the baud rate doesn't make sense
22 #define DRIVER_AUTHOR "Matthias Urlichs <smurf@smurf.noris.de>"
23 #define DRIVER_DESC "USB Driver for GSM modems"
25 #include <linux/kernel.h>
26 #include <linux/jiffies.h>
27 #include <linux/errno.h>
28 #include <linux/slab.h>
29 #include <linux/tty.h>
30 #include <linux/tty_flip.h>
31 #include <linux/module.h>
32 #include <linux/bitops.h>
33 #include <linux/uaccess.h>
34 #include <linux/usb.h>
35 #include <linux/usb/serial.h>
36 #include <linux/serial.h>
39 void usb_wwan_dtr_rts(struct usb_serial_port
*port
, int on
)
41 struct usb_wwan_port_private
*portdata
;
42 struct usb_wwan_intf_private
*intfdata
;
44 intfdata
= port
->serial
->private;
46 if (!intfdata
->send_setup
)
49 portdata
= usb_get_serial_port_data(port
);
51 portdata
->rts_state
= on
;
52 portdata
->dtr_state
= on
;
54 intfdata
->send_setup(port
);
56 EXPORT_SYMBOL(usb_wwan_dtr_rts
);
58 void usb_wwan_set_termios(struct tty_struct
*tty
,
59 struct usb_serial_port
*port
,
60 struct ktermios
*old_termios
)
62 struct usb_wwan_intf_private
*intfdata
= port
->serial
->private;
64 /* Doesn't support option setting */
65 tty_termios_copy_hw(&tty
->termios
, old_termios
);
67 if (intfdata
->send_setup
)
68 intfdata
->send_setup(port
);
70 EXPORT_SYMBOL(usb_wwan_set_termios
);
72 int usb_wwan_tiocmget(struct tty_struct
*tty
)
74 struct usb_serial_port
*port
= tty
->driver_data
;
76 struct usb_wwan_port_private
*portdata
;
78 portdata
= usb_get_serial_port_data(port
);
80 value
= ((portdata
->rts_state
) ? TIOCM_RTS
: 0) |
81 ((portdata
->dtr_state
) ? TIOCM_DTR
: 0) |
82 ((portdata
->cts_state
) ? TIOCM_CTS
: 0) |
83 ((portdata
->dsr_state
) ? TIOCM_DSR
: 0) |
84 ((portdata
->dcd_state
) ? TIOCM_CAR
: 0) |
85 ((portdata
->ri_state
) ? TIOCM_RNG
: 0);
89 EXPORT_SYMBOL(usb_wwan_tiocmget
);
91 int usb_wwan_tiocmset(struct tty_struct
*tty
,
92 unsigned int set
, unsigned int clear
)
94 struct usb_serial_port
*port
= tty
->driver_data
;
95 struct usb_wwan_port_private
*portdata
;
96 struct usb_wwan_intf_private
*intfdata
;
98 portdata
= usb_get_serial_port_data(port
);
99 intfdata
= port
->serial
->private;
101 if (!intfdata
->send_setup
)
104 /* FIXME: what locks portdata fields ? */
106 portdata
->rts_state
= 1;
108 portdata
->dtr_state
= 1;
110 if (clear
& TIOCM_RTS
)
111 portdata
->rts_state
= 0;
112 if (clear
& TIOCM_DTR
)
113 portdata
->dtr_state
= 0;
114 return intfdata
->send_setup(port
);
116 EXPORT_SYMBOL(usb_wwan_tiocmset
);
118 static int get_serial_info(struct usb_serial_port
*port
,
119 struct serial_struct __user
*retinfo
)
121 struct serial_struct tmp
;
126 memset(&tmp
, 0, sizeof(tmp
));
127 tmp
.line
= port
->minor
;
128 tmp
.port
= port
->port_number
;
129 tmp
.baud_base
= tty_get_baud_rate(port
->port
.tty
);
130 tmp
.close_delay
= port
->port
.close_delay
/ 10;
131 tmp
.closing_wait
= port
->port
.closing_wait
== ASYNC_CLOSING_WAIT_NONE
?
132 ASYNC_CLOSING_WAIT_NONE
:
133 port
->port
.closing_wait
/ 10;
135 if (copy_to_user(retinfo
, &tmp
, sizeof(*retinfo
)))
140 static int set_serial_info(struct usb_serial_port
*port
,
141 struct serial_struct __user
*newinfo
)
143 struct serial_struct new_serial
;
144 unsigned int closing_wait
, close_delay
;
147 if (copy_from_user(&new_serial
, newinfo
, sizeof(new_serial
)))
150 close_delay
= new_serial
.close_delay
* 10;
151 closing_wait
= new_serial
.closing_wait
== ASYNC_CLOSING_WAIT_NONE
?
152 ASYNC_CLOSING_WAIT_NONE
: new_serial
.closing_wait
* 10;
154 mutex_lock(&port
->port
.mutex
);
156 if (!capable(CAP_SYS_ADMIN
)) {
157 if ((close_delay
!= port
->port
.close_delay
) ||
158 (closing_wait
!= port
->port
.closing_wait
))
161 retval
= -EOPNOTSUPP
;
163 port
->port
.close_delay
= close_delay
;
164 port
->port
.closing_wait
= closing_wait
;
167 mutex_unlock(&port
->port
.mutex
);
171 int usb_wwan_ioctl(struct tty_struct
*tty
,
172 unsigned int cmd
, unsigned long arg
)
174 struct usb_serial_port
*port
= tty
->driver_data
;
176 dev_dbg(&port
->dev
, "%s cmd 0x%04x\n", __func__
, cmd
);
180 return get_serial_info(port
,
181 (struct serial_struct __user
*) arg
);
183 return set_serial_info(port
,
184 (struct serial_struct __user
*) arg
);
189 dev_dbg(&port
->dev
, "%s arg not supported\n", __func__
);
193 EXPORT_SYMBOL(usb_wwan_ioctl
);
196 int usb_wwan_write(struct tty_struct
*tty
, struct usb_serial_port
*port
,
197 const unsigned char *buf
, int count
)
199 struct usb_wwan_port_private
*portdata
;
200 struct usb_wwan_intf_private
*intfdata
;
203 struct urb
*this_urb
= NULL
; /* spurious */
207 portdata
= usb_get_serial_port_data(port
);
208 intfdata
= port
->serial
->private;
210 dev_dbg(&port
->dev
, "%s: write (%d chars)\n", __func__
, count
);
214 for (i
= 0; left
> 0 && i
< N_OUT_URB
; i
++) {
216 if (todo
> OUT_BUFLEN
)
219 this_urb
= portdata
->out_urbs
[i
];
220 if (test_and_set_bit(i
, &portdata
->out_busy
)) {
221 if (time_before(jiffies
,
222 portdata
->tx_start_time
[i
] + 10 * HZ
))
224 usb_unlink_urb(this_urb
);
227 dev_dbg(&port
->dev
, "%s: endpoint %d buf %d\n", __func__
,
228 usb_pipeendpoint(this_urb
->pipe
), i
);
230 err
= usb_autopm_get_interface_async(port
->serial
->interface
);
235 memcpy(this_urb
->transfer_buffer
, buf
, todo
);
236 this_urb
->transfer_buffer_length
= todo
;
238 spin_lock_irqsave(&intfdata
->susp_lock
, flags
);
239 if (intfdata
->suspended
) {
240 usb_anchor_urb(this_urb
, &portdata
->delayed
);
241 spin_unlock_irqrestore(&intfdata
->susp_lock
, flags
);
243 intfdata
->in_flight
++;
244 spin_unlock_irqrestore(&intfdata
->susp_lock
, flags
);
245 err
= usb_submit_urb(this_urb
, GFP_ATOMIC
);
248 "usb_submit_urb %p (write bulk) failed (%d)\n",
250 clear_bit(i
, &portdata
->out_busy
);
251 spin_lock_irqsave(&intfdata
->susp_lock
, flags
);
252 intfdata
->in_flight
--;
253 spin_unlock_irqrestore(&intfdata
->susp_lock
,
255 usb_autopm_put_interface_async(port
->serial
->interface
);
260 portdata
->tx_start_time
[i
] = jiffies
;
266 dev_dbg(&port
->dev
, "%s: wrote (did %d)\n", __func__
, count
);
269 EXPORT_SYMBOL(usb_wwan_write
);
271 static void usb_wwan_indat_callback(struct urb
*urb
)
275 struct usb_serial_port
*port
;
277 unsigned char *data
= urb
->transfer_buffer
;
278 int status
= urb
->status
;
280 endpoint
= usb_pipeendpoint(urb
->pipe
);
285 dev_dbg(dev
, "%s: nonzero status: %d on endpoint %02x.\n",
286 __func__
, status
, endpoint
);
288 if (urb
->actual_length
) {
289 tty_insert_flip_string(&port
->port
, data
,
291 tty_flip_buffer_push(&port
->port
);
293 dev_dbg(dev
, "%s: empty read urb received\n", __func__
);
295 /* Resubmit urb so we continue receiving */
296 err
= usb_submit_urb(urb
, GFP_ATOMIC
);
299 dev_err(dev
, "%s: resubmit read urb failed. (%d)\n",
301 /* busy also in error unless we are killed */
302 usb_mark_last_busy(port
->serial
->dev
);
305 usb_mark_last_busy(port
->serial
->dev
);
309 static void usb_wwan_outdat_callback(struct urb
*urb
)
311 struct usb_serial_port
*port
;
312 struct usb_wwan_port_private
*portdata
;
313 struct usb_wwan_intf_private
*intfdata
;
317 intfdata
= port
->serial
->private;
319 usb_serial_port_softint(port
);
320 usb_autopm_put_interface_async(port
->serial
->interface
);
321 portdata
= usb_get_serial_port_data(port
);
322 spin_lock(&intfdata
->susp_lock
);
323 intfdata
->in_flight
--;
324 spin_unlock(&intfdata
->susp_lock
);
326 for (i
= 0; i
< N_OUT_URB
; ++i
) {
327 if (portdata
->out_urbs
[i
] == urb
) {
328 smp_mb__before_clear_bit();
329 clear_bit(i
, &portdata
->out_busy
);
335 int usb_wwan_write_room(struct tty_struct
*tty
)
337 struct usb_serial_port
*port
= tty
->driver_data
;
338 struct usb_wwan_port_private
*portdata
;
341 struct urb
*this_urb
;
343 portdata
= usb_get_serial_port_data(port
);
345 for (i
= 0; i
< N_OUT_URB
; i
++) {
346 this_urb
= portdata
->out_urbs
[i
];
347 if (this_urb
&& !test_bit(i
, &portdata
->out_busy
))
348 data_len
+= OUT_BUFLEN
;
351 dev_dbg(&port
->dev
, "%s: %d\n", __func__
, data_len
);
354 EXPORT_SYMBOL(usb_wwan_write_room
);
356 int usb_wwan_chars_in_buffer(struct tty_struct
*tty
)
358 struct usb_serial_port
*port
= tty
->driver_data
;
359 struct usb_wwan_port_private
*portdata
;
362 struct urb
*this_urb
;
364 portdata
= usb_get_serial_port_data(port
);
366 for (i
= 0; i
< N_OUT_URB
; i
++) {
367 this_urb
= portdata
->out_urbs
[i
];
368 /* FIXME: This locking is insufficient as this_urb may
369 go unused during the test */
370 if (this_urb
&& test_bit(i
, &portdata
->out_busy
))
371 data_len
+= this_urb
->transfer_buffer_length
;
373 dev_dbg(&port
->dev
, "%s: %d\n", __func__
, data_len
);
376 EXPORT_SYMBOL(usb_wwan_chars_in_buffer
);
378 int usb_wwan_open(struct tty_struct
*tty
, struct usb_serial_port
*port
)
380 struct usb_wwan_port_private
*portdata
;
381 struct usb_wwan_intf_private
*intfdata
;
382 struct usb_serial
*serial
= port
->serial
;
386 portdata
= usb_get_serial_port_data(port
);
387 intfdata
= serial
->private;
389 /* Start reading from the IN endpoint */
390 for (i
= 0; i
< N_IN_URB
; i
++) {
391 urb
= portdata
->in_urbs
[i
];
394 err
= usb_submit_urb(urb
, GFP_KERNEL
);
396 dev_dbg(&port
->dev
, "%s: submit urb %d failed (%d) %d\n",
397 __func__
, i
, err
, urb
->transfer_buffer_length
);
401 if (intfdata
->send_setup
)
402 intfdata
->send_setup(port
);
404 serial
->interface
->needs_remote_wakeup
= 1;
405 spin_lock_irq(&intfdata
->susp_lock
);
406 portdata
->opened
= 1;
407 spin_unlock_irq(&intfdata
->susp_lock
);
408 /* this balances a get in the generic USB serial code */
409 usb_autopm_put_interface(serial
->interface
);
413 EXPORT_SYMBOL(usb_wwan_open
);
415 void usb_wwan_close(struct usb_serial_port
*port
)
418 struct usb_serial
*serial
= port
->serial
;
419 struct usb_wwan_port_private
*portdata
;
420 struct usb_wwan_intf_private
*intfdata
= port
->serial
->private;
422 portdata
= usb_get_serial_port_data(port
);
424 /* Stop reading/writing urbs */
425 spin_lock_irq(&intfdata
->susp_lock
);
426 portdata
->opened
= 0;
427 spin_unlock_irq(&intfdata
->susp_lock
);
429 for (i
= 0; i
< N_IN_URB
; i
++)
430 usb_kill_urb(portdata
->in_urbs
[i
]);
431 for (i
= 0; i
< N_OUT_URB
; i
++)
432 usb_kill_urb(portdata
->out_urbs
[i
]);
434 /* balancing - important as an error cannot be handled*/
435 usb_autopm_get_interface_no_resume(serial
->interface
);
436 serial
->interface
->needs_remote_wakeup
= 0;
438 EXPORT_SYMBOL(usb_wwan_close
);
440 /* Helper functions used by usb_wwan_setup_urbs */
441 static struct urb
*usb_wwan_setup_urb(struct usb_serial_port
*port
,
443 int dir
, void *ctx
, char *buf
, int len
,
444 void (*callback
) (struct urb
*))
446 struct usb_serial
*serial
= port
->serial
;
449 urb
= usb_alloc_urb(0, GFP_KERNEL
); /* No ISO */
453 /* Fill URB using supplied data. */
454 usb_fill_bulk_urb(urb
, serial
->dev
,
455 usb_sndbulkpipe(serial
->dev
, endpoint
) | dir
,
456 buf
, len
, callback
, ctx
);
461 int usb_wwan_port_probe(struct usb_serial_port
*port
)
463 struct usb_wwan_port_private
*portdata
;
469 portdata
= kzalloc(sizeof(*portdata
), GFP_KERNEL
);
473 init_usb_anchor(&portdata
->delayed
);
475 for (i
= 0; i
< N_IN_URB
; i
++) {
476 if (!port
->bulk_in_size
)
479 buffer
= (u8
*)__get_free_page(GFP_KERNEL
);
482 portdata
->in_buffer
[i
] = buffer
;
484 urb
= usb_wwan_setup_urb(port
, port
->bulk_in_endpointAddress
,
487 usb_wwan_indat_callback
);
488 portdata
->in_urbs
[i
] = urb
;
491 for (i
= 0; i
< N_OUT_URB
; i
++) {
492 if (!port
->bulk_out_size
)
495 buffer
= kmalloc(OUT_BUFLEN
, GFP_KERNEL
);
497 goto bail_out_error2
;
498 portdata
->out_buffer
[i
] = buffer
;
500 urb
= usb_wwan_setup_urb(port
, port
->bulk_out_endpointAddress
,
503 usb_wwan_outdat_callback
);
504 portdata
->out_urbs
[i
] = urb
;
507 usb_set_serial_port_data(port
, portdata
);
509 if (port
->interrupt_in_urb
) {
510 err
= usb_submit_urb(port
->interrupt_in_urb
, GFP_KERNEL
);
512 dev_dbg(&port
->dev
, "%s: submit irq_in urb failed %d\n",
519 for (i
= 0; i
< N_OUT_URB
; i
++) {
520 usb_free_urb(portdata
->out_urbs
[i
]);
521 kfree(portdata
->out_buffer
[i
]);
524 for (i
= 0; i
< N_IN_URB
; i
++) {
525 usb_free_urb(portdata
->in_urbs
[i
]);
526 free_page((unsigned long)portdata
->in_buffer
[i
]);
532 EXPORT_SYMBOL_GPL(usb_wwan_port_probe
);
534 int usb_wwan_port_remove(struct usb_serial_port
*port
)
537 struct usb_wwan_port_private
*portdata
;
539 portdata
= usb_get_serial_port_data(port
);
540 usb_set_serial_port_data(port
, NULL
);
542 /* Stop reading/writing urbs and free them */
543 for (i
= 0; i
< N_IN_URB
; i
++) {
544 usb_kill_urb(portdata
->in_urbs
[i
]);
545 usb_free_urb(portdata
->in_urbs
[i
]);
546 free_page((unsigned long)portdata
->in_buffer
[i
]);
548 for (i
= 0; i
< N_OUT_URB
; i
++) {
549 usb_kill_urb(portdata
->out_urbs
[i
]);
550 usb_free_urb(portdata
->out_urbs
[i
]);
551 kfree(portdata
->out_buffer
[i
]);
554 /* Now free port private data */
558 EXPORT_SYMBOL(usb_wwan_port_remove
);
561 static void stop_read_write_urbs(struct usb_serial
*serial
)
564 struct usb_serial_port
*port
;
565 struct usb_wwan_port_private
*portdata
;
567 /* Stop reading/writing urbs */
568 for (i
= 0; i
< serial
->num_ports
; ++i
) {
569 port
= serial
->port
[i
];
570 portdata
= usb_get_serial_port_data(port
);
573 for (j
= 0; j
< N_IN_URB
; j
++)
574 usb_kill_urb(portdata
->in_urbs
[j
]);
575 for (j
= 0; j
< N_OUT_URB
; j
++)
576 usb_kill_urb(portdata
->out_urbs
[j
]);
580 int usb_wwan_suspend(struct usb_serial
*serial
, pm_message_t message
)
582 struct usb_wwan_intf_private
*intfdata
= serial
->private;
585 if (PMSG_IS_AUTO(message
)) {
586 spin_lock_irq(&intfdata
->susp_lock
);
587 b
= intfdata
->in_flight
;
588 spin_unlock_irq(&intfdata
->susp_lock
);
594 spin_lock_irq(&intfdata
->susp_lock
);
595 intfdata
->suspended
= 1;
596 spin_unlock_irq(&intfdata
->susp_lock
);
597 stop_read_write_urbs(serial
);
601 EXPORT_SYMBOL(usb_wwan_suspend
);
603 static void unbusy_queued_urb(struct urb
*urb
, struct usb_wwan_port_private
*portdata
)
607 for (i
= 0; i
< N_OUT_URB
; i
++) {
608 if (urb
== portdata
->out_urbs
[i
]) {
609 clear_bit(i
, &portdata
->out_busy
);
615 static void play_delayed(struct usb_serial_port
*port
)
617 struct usb_wwan_intf_private
*data
;
618 struct usb_wwan_port_private
*portdata
;
622 portdata
= usb_get_serial_port_data(port
);
623 data
= port
->serial
->private;
624 while ((urb
= usb_get_from_anchor(&portdata
->delayed
))) {
625 err
= usb_submit_urb(urb
, GFP_ATOMIC
);
629 /* we have to throw away the rest */
631 unbusy_queued_urb(urb
, portdata
);
632 usb_autopm_put_interface_no_suspend(port
->serial
->interface
);
633 } while ((urb
= usb_get_from_anchor(&portdata
->delayed
)));
639 int usb_wwan_resume(struct usb_serial
*serial
)
642 struct usb_serial_port
*port
;
643 struct usb_wwan_intf_private
*intfdata
= serial
->private;
644 struct usb_wwan_port_private
*portdata
;
648 /* get the interrupt URBs resubmitted unconditionally */
649 for (i
= 0; i
< serial
->num_ports
; i
++) {
650 port
= serial
->port
[i
];
651 if (!port
->interrupt_in_urb
) {
652 dev_dbg(&port
->dev
, "%s: No interrupt URB for port\n", __func__
);
655 err
= usb_submit_urb(port
->interrupt_in_urb
, GFP_NOIO
);
656 dev_dbg(&port
->dev
, "Submitted interrupt URB for port (result %d)\n", err
);
658 dev_err(&port
->dev
, "%s: Error %d for interrupt URB\n",
664 for (i
= 0; i
< serial
->num_ports
; i
++) {
666 port
= serial
->port
[i
];
667 portdata
= usb_get_serial_port_data(port
);
669 /* skip closed ports */
670 spin_lock_irq(&intfdata
->susp_lock
);
671 if (!portdata
|| !portdata
->opened
) {
672 spin_unlock_irq(&intfdata
->susp_lock
);
676 for (j
= 0; j
< N_IN_URB
; j
++) {
677 urb
= portdata
->in_urbs
[j
];
678 err
= usb_submit_urb(urb
, GFP_ATOMIC
);
680 dev_err(&port
->dev
, "%s: Error %d for bulk URB %d\n",
682 spin_unlock_irq(&intfdata
->susp_lock
);
687 spin_unlock_irq(&intfdata
->susp_lock
);
689 spin_lock_irq(&intfdata
->susp_lock
);
690 intfdata
->suspended
= 0;
691 spin_unlock_irq(&intfdata
->susp_lock
);
695 EXPORT_SYMBOL(usb_wwan_resume
);
698 MODULE_AUTHOR(DRIVER_AUTHOR
);
699 MODULE_DESCRIPTION(DRIVER_DESC
);
700 MODULE_LICENSE("GPL");