1 // SPDX-License-Identifier: GPL-2.0
3 USB Driver layer for GSM modems
5 Copyright (C) 2005 Matthias Urlichs <smurf@smurf.noris.de>
7 Portions copied from the Keyspan driver by Hugh Blemings <hugh@blemings.org>
9 History: see the git log.
11 Work sponsored by: Sigos GmbH, Germany <info@sigos.de>
13 This driver exists because the "normal" serial driver doesn't work too well
14 with GSM modems. Issues:
15 - data loss -- one single Receive URB is not nearly enough
16 - controlling the baud rate doesn't make sense
19 #define DRIVER_AUTHOR "Matthias Urlichs <smurf@smurf.noris.de>"
20 #define DRIVER_DESC "USB Driver for GSM modems"
22 #include <linux/kernel.h>
23 #include <linux/jiffies.h>
24 #include <linux/errno.h>
25 #include <linux/slab.h>
26 #include <linux/tty.h>
27 #include <linux/tty_flip.h>
28 #include <linux/module.h>
29 #include <linux/bitops.h>
30 #include <linux/uaccess.h>
31 #include <linux/usb.h>
32 #include <linux/usb/cdc.h>
33 #include <linux/usb/serial.h>
34 #include <linux/serial.h>
38 * Generate DTR/RTS signals on the port using the SET_CONTROL_LINE_STATE request
41 static int usb_wwan_send_setup(struct usb_serial_port
*port
)
43 struct usb_serial
*serial
= port
->serial
;
44 struct usb_wwan_port_private
*portdata
;
49 portdata
= usb_get_serial_port_data(port
);
51 if (portdata
->dtr_state
)
52 val
|= USB_CDC_CTRL_DTR
;
53 if (portdata
->rts_state
)
54 val
|= USB_CDC_CTRL_RTS
;
56 ifnum
= serial
->interface
->cur_altsetting
->desc
.bInterfaceNumber
;
58 res
= usb_autopm_get_interface(serial
->interface
);
62 res
= usb_control_msg(serial
->dev
, usb_sndctrlpipe(serial
->dev
, 0),
63 USB_CDC_REQ_SET_CONTROL_LINE_STATE
,
64 USB_DIR_OUT
| USB_TYPE_CLASS
| USB_RECIP_INTERFACE
,
65 val
, ifnum
, NULL
, 0, USB_CTRL_SET_TIMEOUT
);
67 usb_autopm_put_interface(port
->serial
->interface
);
72 void usb_wwan_dtr_rts(struct usb_serial_port
*port
, int on
)
74 struct usb_wwan_port_private
*portdata
;
75 struct usb_wwan_intf_private
*intfdata
;
77 intfdata
= usb_get_serial_data(port
->serial
);
79 if (!intfdata
->use_send_setup
)
82 portdata
= usb_get_serial_port_data(port
);
84 portdata
->rts_state
= on
;
85 portdata
->dtr_state
= on
;
87 usb_wwan_send_setup(port
);
89 EXPORT_SYMBOL(usb_wwan_dtr_rts
);
91 int usb_wwan_tiocmget(struct tty_struct
*tty
)
93 struct usb_serial_port
*port
= tty
->driver_data
;
95 struct usb_wwan_port_private
*portdata
;
97 portdata
= usb_get_serial_port_data(port
);
99 value
= ((portdata
->rts_state
) ? TIOCM_RTS
: 0) |
100 ((portdata
->dtr_state
) ? TIOCM_DTR
: 0) |
101 ((portdata
->cts_state
) ? TIOCM_CTS
: 0) |
102 ((portdata
->dsr_state
) ? TIOCM_DSR
: 0) |
103 ((portdata
->dcd_state
) ? TIOCM_CAR
: 0) |
104 ((portdata
->ri_state
) ? TIOCM_RNG
: 0);
108 EXPORT_SYMBOL(usb_wwan_tiocmget
);
110 int usb_wwan_tiocmset(struct tty_struct
*tty
,
111 unsigned int set
, unsigned int clear
)
113 struct usb_serial_port
*port
= tty
->driver_data
;
114 struct usb_wwan_port_private
*portdata
;
115 struct usb_wwan_intf_private
*intfdata
;
117 portdata
= usb_get_serial_port_data(port
);
118 intfdata
= usb_get_serial_data(port
->serial
);
120 if (!intfdata
->use_send_setup
)
123 /* FIXME: what locks portdata fields ? */
125 portdata
->rts_state
= 1;
127 portdata
->dtr_state
= 1;
129 if (clear
& TIOCM_RTS
)
130 portdata
->rts_state
= 0;
131 if (clear
& TIOCM_DTR
)
132 portdata
->dtr_state
= 0;
133 return usb_wwan_send_setup(port
);
135 EXPORT_SYMBOL(usb_wwan_tiocmset
);
137 int usb_wwan_write(struct tty_struct
*tty
, struct usb_serial_port
*port
,
138 const unsigned char *buf
, int count
)
140 struct usb_wwan_port_private
*portdata
;
141 struct usb_wwan_intf_private
*intfdata
;
144 struct urb
*this_urb
= NULL
; /* spurious */
148 portdata
= usb_get_serial_port_data(port
);
149 intfdata
= usb_get_serial_data(port
->serial
);
151 dev_dbg(&port
->dev
, "%s: write (%d chars)\n", __func__
, count
);
154 for (i
= 0; left
> 0 && i
< N_OUT_URB
; i
++) {
156 if (todo
> OUT_BUFLEN
)
159 this_urb
= portdata
->out_urbs
[i
];
160 if (test_and_set_bit(i
, &portdata
->out_busy
)) {
161 if (time_before(jiffies
,
162 portdata
->tx_start_time
[i
] + 10 * HZ
))
164 usb_unlink_urb(this_urb
);
167 dev_dbg(&port
->dev
, "%s: endpoint %d buf %d\n", __func__
,
168 usb_pipeendpoint(this_urb
->pipe
), i
);
170 err
= usb_autopm_get_interface_async(port
->serial
->interface
);
172 clear_bit(i
, &portdata
->out_busy
);
177 memcpy(this_urb
->transfer_buffer
, buf
, todo
);
178 this_urb
->transfer_buffer_length
= todo
;
180 spin_lock_irqsave(&intfdata
->susp_lock
, flags
);
181 if (intfdata
->suspended
) {
182 usb_anchor_urb(this_urb
, &portdata
->delayed
);
183 spin_unlock_irqrestore(&intfdata
->susp_lock
, flags
);
185 intfdata
->in_flight
++;
186 spin_unlock_irqrestore(&intfdata
->susp_lock
, flags
);
187 err
= usb_submit_urb(this_urb
, GFP_ATOMIC
);
190 "%s: submit urb %d failed: %d\n",
192 clear_bit(i
, &portdata
->out_busy
);
193 spin_lock_irqsave(&intfdata
->susp_lock
, flags
);
194 intfdata
->in_flight
--;
195 spin_unlock_irqrestore(&intfdata
->susp_lock
,
197 usb_autopm_put_interface_async(port
->serial
->interface
);
202 portdata
->tx_start_time
[i
] = jiffies
;
208 dev_dbg(&port
->dev
, "%s: wrote (did %d)\n", __func__
, count
);
211 EXPORT_SYMBOL(usb_wwan_write
);
213 static void usb_wwan_indat_callback(struct urb
*urb
)
217 struct usb_serial_port
*port
;
219 unsigned char *data
= urb
->transfer_buffer
;
220 int status
= urb
->status
;
222 endpoint
= usb_pipeendpoint(urb
->pipe
);
227 dev_dbg(dev
, "%s: nonzero status: %d on endpoint %02x.\n",
228 __func__
, status
, endpoint
);
230 /* don't resubmit on fatal errors */
231 if (status
== -ESHUTDOWN
|| status
== -ENOENT
)
234 if (urb
->actual_length
) {
235 tty_insert_flip_string(&port
->port
, data
,
237 tty_flip_buffer_push(&port
->port
);
239 dev_dbg(dev
, "%s: empty read urb received\n", __func__
);
241 /* Resubmit urb so we continue receiving */
242 err
= usb_submit_urb(urb
, GFP_ATOMIC
);
244 if (err
!= -EPERM
&& err
!= -ENODEV
) {
245 dev_err(dev
, "%s: resubmit read urb failed. (%d)\n",
247 /* busy also in error unless we are killed */
248 usb_mark_last_busy(port
->serial
->dev
);
251 usb_mark_last_busy(port
->serial
->dev
);
255 static void usb_wwan_outdat_callback(struct urb
*urb
)
257 struct usb_serial_port
*port
;
258 struct usb_wwan_port_private
*portdata
;
259 struct usb_wwan_intf_private
*intfdata
;
264 intfdata
= usb_get_serial_data(port
->serial
);
266 usb_serial_port_softint(port
);
267 usb_autopm_put_interface_async(port
->serial
->interface
);
268 portdata
= usb_get_serial_port_data(port
);
269 spin_lock_irqsave(&intfdata
->susp_lock
, flags
);
270 intfdata
->in_flight
--;
271 spin_unlock_irqrestore(&intfdata
->susp_lock
, flags
);
273 for (i
= 0; i
< N_OUT_URB
; ++i
) {
274 if (portdata
->out_urbs
[i
] == urb
) {
275 smp_mb__before_atomic();
276 clear_bit(i
, &portdata
->out_busy
);
282 unsigned int usb_wwan_write_room(struct tty_struct
*tty
)
284 struct usb_serial_port
*port
= tty
->driver_data
;
285 struct usb_wwan_port_private
*portdata
;
287 unsigned int data_len
= 0;
288 struct urb
*this_urb
;
290 portdata
= usb_get_serial_port_data(port
);
292 for (i
= 0; i
< N_OUT_URB
; i
++) {
293 this_urb
= portdata
->out_urbs
[i
];
294 if (this_urb
&& !test_bit(i
, &portdata
->out_busy
))
295 data_len
+= OUT_BUFLEN
;
298 dev_dbg(&port
->dev
, "%s: %u\n", __func__
, data_len
);
301 EXPORT_SYMBOL(usb_wwan_write_room
);
303 unsigned int usb_wwan_chars_in_buffer(struct tty_struct
*tty
)
305 struct usb_serial_port
*port
= tty
->driver_data
;
306 struct usb_wwan_port_private
*portdata
;
308 unsigned int data_len
= 0;
309 struct urb
*this_urb
;
311 portdata
= usb_get_serial_port_data(port
);
313 for (i
= 0; i
< N_OUT_URB
; i
++) {
314 this_urb
= portdata
->out_urbs
[i
];
315 /* FIXME: This locking is insufficient as this_urb may
316 go unused during the test */
317 if (this_urb
&& test_bit(i
, &portdata
->out_busy
))
318 data_len
+= this_urb
->transfer_buffer_length
;
320 dev_dbg(&port
->dev
, "%s: %u\n", __func__
, data_len
);
323 EXPORT_SYMBOL(usb_wwan_chars_in_buffer
);
325 int usb_wwan_open(struct tty_struct
*tty
, struct usb_serial_port
*port
)
327 struct usb_wwan_port_private
*portdata
;
328 struct usb_wwan_intf_private
*intfdata
;
329 struct usb_serial
*serial
= port
->serial
;
333 portdata
= usb_get_serial_port_data(port
);
334 intfdata
= usb_get_serial_data(serial
);
336 if (port
->interrupt_in_urb
) {
337 err
= usb_submit_urb(port
->interrupt_in_urb
, GFP_KERNEL
);
339 dev_err(&port
->dev
, "%s: submit int urb failed: %d\n",
344 /* Start reading from the IN endpoint */
345 for (i
= 0; i
< N_IN_URB
; i
++) {
346 urb
= portdata
->in_urbs
[i
];
349 err
= usb_submit_urb(urb
, GFP_KERNEL
);
352 "%s: submit read urb %d failed: %d\n",
357 spin_lock_irq(&intfdata
->susp_lock
);
358 if (++intfdata
->open_ports
== 1)
359 serial
->interface
->needs_remote_wakeup
= 1;
360 spin_unlock_irq(&intfdata
->susp_lock
);
361 /* this balances a get in the generic USB serial code */
362 usb_autopm_put_interface(serial
->interface
);
366 EXPORT_SYMBOL(usb_wwan_open
);
368 static void unbusy_queued_urb(struct urb
*urb
,
369 struct usb_wwan_port_private
*portdata
)
373 for (i
= 0; i
< N_OUT_URB
; i
++) {
374 if (urb
== portdata
->out_urbs
[i
]) {
375 clear_bit(i
, &portdata
->out_busy
);
381 void usb_wwan_close(struct usb_serial_port
*port
)
384 struct usb_serial
*serial
= port
->serial
;
385 struct usb_wwan_port_private
*portdata
;
386 struct usb_wwan_intf_private
*intfdata
= usb_get_serial_data(serial
);
389 portdata
= usb_get_serial_port_data(port
);
392 * Need to take susp_lock to make sure port is not already being
393 * resumed, but no need to hold it due to the tty-port initialized
396 spin_lock_irq(&intfdata
->susp_lock
);
397 if (--intfdata
->open_ports
== 0)
398 serial
->interface
->needs_remote_wakeup
= 0;
399 spin_unlock_irq(&intfdata
->susp_lock
);
402 urb
= usb_get_from_anchor(&portdata
->delayed
);
405 unbusy_queued_urb(urb
, portdata
);
406 usb_autopm_put_interface_async(serial
->interface
);
409 for (i
= 0; i
< N_IN_URB
; i
++)
410 usb_kill_urb(portdata
->in_urbs
[i
]);
411 for (i
= 0; i
< N_OUT_URB
; i
++)
412 usb_kill_urb(portdata
->out_urbs
[i
]);
413 usb_kill_urb(port
->interrupt_in_urb
);
415 usb_autopm_get_interface_no_resume(serial
->interface
);
417 EXPORT_SYMBOL(usb_wwan_close
);
419 static struct urb
*usb_wwan_setup_urb(struct usb_serial_port
*port
,
421 int dir
, void *ctx
, char *buf
, int len
,
422 void (*callback
) (struct urb
*))
424 struct usb_serial
*serial
= port
->serial
;
425 struct usb_wwan_intf_private
*intfdata
= usb_get_serial_data(serial
);
428 urb
= usb_alloc_urb(0, GFP_KERNEL
); /* No ISO */
432 usb_fill_bulk_urb(urb
, serial
->dev
,
433 usb_sndbulkpipe(serial
->dev
, endpoint
) | dir
,
434 buf
, len
, callback
, ctx
);
436 if (intfdata
->use_zlp
&& dir
== USB_DIR_OUT
)
437 urb
->transfer_flags
|= URB_ZERO_PACKET
;
442 int usb_wwan_port_probe(struct usb_serial_port
*port
)
444 struct usb_wwan_port_private
*portdata
;
449 if (!port
->bulk_in_size
|| !port
->bulk_out_size
)
452 portdata
= kzalloc(sizeof(*portdata
), GFP_KERNEL
);
456 init_usb_anchor(&portdata
->delayed
);
458 for (i
= 0; i
< N_IN_URB
; i
++) {
459 buffer
= (u8
*)__get_free_page(GFP_KERNEL
);
462 portdata
->in_buffer
[i
] = buffer
;
464 urb
= usb_wwan_setup_urb(port
, port
->bulk_in_endpointAddress
,
467 usb_wwan_indat_callback
);
468 portdata
->in_urbs
[i
] = urb
;
471 for (i
= 0; i
< N_OUT_URB
; i
++) {
472 buffer
= kmalloc(OUT_BUFLEN
, GFP_KERNEL
);
474 goto bail_out_error2
;
475 portdata
->out_buffer
[i
] = buffer
;
477 urb
= usb_wwan_setup_urb(port
, port
->bulk_out_endpointAddress
,
480 usb_wwan_outdat_callback
);
481 portdata
->out_urbs
[i
] = urb
;
484 usb_set_serial_port_data(port
, portdata
);
489 for (i
= 0; i
< N_OUT_URB
; i
++) {
490 usb_free_urb(portdata
->out_urbs
[i
]);
491 kfree(portdata
->out_buffer
[i
]);
494 for (i
= 0; i
< N_IN_URB
; i
++) {
495 usb_free_urb(portdata
->in_urbs
[i
]);
496 free_page((unsigned long)portdata
->in_buffer
[i
]);
502 EXPORT_SYMBOL_GPL(usb_wwan_port_probe
);
504 void usb_wwan_port_remove(struct usb_serial_port
*port
)
507 struct usb_wwan_port_private
*portdata
;
509 portdata
= usb_get_serial_port_data(port
);
510 usb_set_serial_port_data(port
, NULL
);
512 for (i
= 0; i
< N_IN_URB
; i
++) {
513 usb_free_urb(portdata
->in_urbs
[i
]);
514 free_page((unsigned long)portdata
->in_buffer
[i
]);
516 for (i
= 0; i
< N_OUT_URB
; i
++) {
517 usb_free_urb(portdata
->out_urbs
[i
]);
518 kfree(portdata
->out_buffer
[i
]);
523 EXPORT_SYMBOL(usb_wwan_port_remove
);
526 static void stop_urbs(struct usb_serial
*serial
)
529 struct usb_serial_port
*port
;
530 struct usb_wwan_port_private
*portdata
;
532 for (i
= 0; i
< serial
->num_ports
; ++i
) {
533 port
= serial
->port
[i
];
534 portdata
= usb_get_serial_port_data(port
);
537 for (j
= 0; j
< N_IN_URB
; j
++)
538 usb_kill_urb(portdata
->in_urbs
[j
]);
539 for (j
= 0; j
< N_OUT_URB
; j
++)
540 usb_kill_urb(portdata
->out_urbs
[j
]);
541 usb_kill_urb(port
->interrupt_in_urb
);
545 int usb_wwan_suspend(struct usb_serial
*serial
, pm_message_t message
)
547 struct usb_wwan_intf_private
*intfdata
= usb_get_serial_data(serial
);
549 spin_lock_irq(&intfdata
->susp_lock
);
550 if (PMSG_IS_AUTO(message
)) {
551 if (intfdata
->in_flight
) {
552 spin_unlock_irq(&intfdata
->susp_lock
);
556 intfdata
->suspended
= 1;
557 spin_unlock_irq(&intfdata
->susp_lock
);
563 EXPORT_SYMBOL(usb_wwan_suspend
);
565 /* Caller must hold susp_lock. */
566 static int usb_wwan_submit_delayed_urbs(struct usb_serial_port
*port
)
568 struct usb_serial
*serial
= port
->serial
;
569 struct usb_wwan_intf_private
*data
= usb_get_serial_data(serial
);
570 struct usb_wwan_port_private
*portdata
;
575 portdata
= usb_get_serial_port_data(port
);
578 urb
= usb_get_from_anchor(&portdata
->delayed
);
582 err
= usb_submit_urb(urb
, GFP_ATOMIC
);
584 dev_err(&port
->dev
, "%s: submit urb failed: %d\n",
587 unbusy_queued_urb(urb
, portdata
);
588 usb_autopm_put_interface_async(serial
->interface
);
600 int usb_wwan_resume(struct usb_serial
*serial
)
603 struct usb_serial_port
*port
;
604 struct usb_wwan_intf_private
*intfdata
= usb_get_serial_data(serial
);
605 struct usb_wwan_port_private
*portdata
;
610 spin_lock_irq(&intfdata
->susp_lock
);
611 for (i
= 0; i
< serial
->num_ports
; i
++) {
612 port
= serial
->port
[i
];
614 if (!tty_port_initialized(&port
->port
))
617 portdata
= usb_get_serial_port_data(port
);
619 if (port
->interrupt_in_urb
) {
620 err
= usb_submit_urb(port
->interrupt_in_urb
,
624 "%s: submit int urb failed: %d\n",
630 err
= usb_wwan_submit_delayed_urbs(port
);
634 for (j
= 0; j
< N_IN_URB
; j
++) {
635 urb
= portdata
->in_urbs
[j
];
636 err
= usb_submit_urb(urb
, GFP_ATOMIC
);
639 "%s: submit read urb %d failed: %d\n",
645 intfdata
->suspended
= 0;
646 spin_unlock_irq(&intfdata
->susp_lock
);
653 EXPORT_SYMBOL(usb_wwan_resume
);
656 MODULE_AUTHOR(DRIVER_AUTHOR
);
657 MODULE_DESCRIPTION(DRIVER_DESC
);
658 MODULE_LICENSE("GPL v2");