Linux 2.6.17.7
[linux/fpc-iii.git] / drivers / usb / class / cdc-acm.c
blob6dd339f4c0fc52a933e3eb101f18bc88b94160f7
1 /*
2 * cdc-acm.c
4 * Copyright (c) 1999 Armin Fuerst <fuerst@in.tum.de>
5 * Copyright (c) 1999 Pavel Machek <pavel@suse.cz>
6 * Copyright (c) 1999 Johannes Erdfelt <johannes@erdfelt.com>
7 * Copyright (c) 2000 Vojtech Pavlik <vojtech@suse.cz>
8 * Copyright (c) 2004 Oliver Neukum <oliver@neukum.name>
9 * Copyright (c) 2005 David Kubicek <dave@awk.cz>
11 * USB Abstract Control Model driver for USB modems and ISDN adapters
13 * Sponsored by SuSE
15 * ChangeLog:
16 * v0.9 - thorough cleaning, URBification, almost a rewrite
17 * v0.10 - some more cleanups
18 * v0.11 - fixed flow control, read error doesn't stop reads
19 * v0.12 - added TIOCM ioctls, added break handling, made struct acm kmalloced
20 * v0.13 - added termios, added hangup
21 * v0.14 - sized down struct acm
22 * v0.15 - fixed flow control again - characters could be lost
23 * v0.16 - added code for modems with swapped data and control interfaces
24 * v0.17 - added new style probing
25 * v0.18 - fixed new style probing for devices with more configurations
26 * v0.19 - fixed CLOCAL handling (thanks to Richard Shih-Ping Chan)
27 * v0.20 - switched to probing on interface (rather than device) class
28 * v0.21 - revert to probing on device for devices with multiple configs
29 * v0.22 - probe only the control interface. if usbcore doesn't choose the
30 * config we want, sysadmin changes bConfigurationValue in sysfs.
31 * v0.23 - use softirq for rx processing, as needed by tty layer
32 * v0.24 - change probe method to evaluate CDC union descriptor
33 * v0.25 - downstream tasks paralelized to maximize throughput
37 * This program is free software; you can redistribute it and/or modify
38 * it under the terms of the GNU General Public License as published by
39 * the Free Software Foundation; either version 2 of the License, or
40 * (at your option) any later version.
42 * This program is distributed in the hope that it will be useful,
43 * but WITHOUT ANY WARRANTY; without even the implied warranty of
44 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
45 * GNU General Public License for more details.
47 * You should have received a copy of the GNU General Public License
48 * along with this program; if not, write to the Free Software
49 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
52 #undef DEBUG
54 #include <linux/kernel.h>
55 #include <linux/errno.h>
56 #include <linux/init.h>
57 #include <linux/slab.h>
58 #include <linux/tty.h>
59 #include <linux/tty_driver.h>
60 #include <linux/tty_flip.h>
61 #include <linux/module.h>
62 #include <linux/smp_lock.h>
63 #include <linux/mutex.h>
64 #include <asm/uaccess.h>
65 #include <linux/usb.h>
66 #include <linux/usb_cdc.h>
67 #include <asm/byteorder.h>
68 #include <asm/unaligned.h>
69 #include <linux/list.h>
71 #include "cdc-acm.h"
74 * Version Information
76 #define DRIVER_VERSION "v0.25"
77 #define DRIVER_AUTHOR "Armin Fuerst, Pavel Machek, Johannes Erdfelt, Vojtech Pavlik, David Kubicek"
78 #define DRIVER_DESC "USB Abstract Control Model driver for USB modems and ISDN adapters"
80 static struct usb_driver acm_driver;
81 static struct tty_driver *acm_tty_driver;
82 static struct acm *acm_table[ACM_TTY_MINORS];
84 static DEFINE_MUTEX(open_mutex);
86 #define ACM_READY(acm) (acm && acm->dev && acm->used)
89 * Functions for ACM control messages.
92 static int acm_ctrl_msg(struct acm *acm, int request, int value, void *buf, int len)
94 int retval = usb_control_msg(acm->dev, usb_sndctrlpipe(acm->dev, 0),
95 request, USB_RT_ACM, value,
96 acm->control->altsetting[0].desc.bInterfaceNumber,
97 buf, len, 5000);
98 dbg("acm_control_msg: rq: 0x%02x val: %#x len: %#x result: %d", request, value, len, retval);
99 return retval < 0 ? retval : 0;
102 /* devices aren't required to support these requests.
103 * the cdc acm descriptor tells whether they do...
105 #define acm_set_control(acm, control) \
106 acm_ctrl_msg(acm, USB_CDC_REQ_SET_CONTROL_LINE_STATE, control, NULL, 0)
107 #define acm_set_line(acm, line) \
108 acm_ctrl_msg(acm, USB_CDC_REQ_SET_LINE_CODING, 0, line, sizeof *(line))
109 #define acm_send_break(acm, ms) \
110 acm_ctrl_msg(acm, USB_CDC_REQ_SEND_BREAK, ms, NULL, 0)
113 * Write buffer management.
114 * All of these assume proper locks taken by the caller.
117 static int acm_wb_alloc(struct acm *acm)
119 int i, wbn;
120 struct acm_wb *wb;
122 wbn = acm->write_current;
123 i = 0;
124 for (;;) {
125 wb = &acm->wb[wbn];
126 if (!wb->use) {
127 wb->use = 1;
128 return wbn;
130 wbn = (wbn + 1) % ACM_NWB;
131 if (++i >= ACM_NWB)
132 return -1;
136 static void acm_wb_free(struct acm *acm, int wbn)
138 acm->wb[wbn].use = 0;
141 static int acm_wb_is_avail(struct acm *acm)
143 int i, n;
145 n = 0;
146 for (i = 0; i < ACM_NWB; i++) {
147 if (!acm->wb[i].use)
148 n++;
150 return n;
153 static inline int acm_wb_is_used(struct acm *acm, int wbn)
155 return acm->wb[wbn].use;
159 * Finish write.
161 static void acm_write_done(struct acm *acm)
163 unsigned long flags;
164 int wbn;
166 spin_lock_irqsave(&acm->write_lock, flags);
167 acm->write_ready = 1;
168 wbn = acm->write_current;
169 acm_wb_free(acm, wbn);
170 acm->write_current = (wbn + 1) % ACM_NWB;
171 spin_unlock_irqrestore(&acm->write_lock, flags);
175 * Poke write.
177 static int acm_write_start(struct acm *acm)
179 unsigned long flags;
180 int wbn;
181 struct acm_wb *wb;
182 int rc;
184 spin_lock_irqsave(&acm->write_lock, flags);
185 if (!acm->dev) {
186 spin_unlock_irqrestore(&acm->write_lock, flags);
187 return -ENODEV;
190 if (!acm->write_ready) {
191 spin_unlock_irqrestore(&acm->write_lock, flags);
192 return 0; /* A white lie */
195 wbn = acm->write_current;
196 if (!acm_wb_is_used(acm, wbn)) {
197 spin_unlock_irqrestore(&acm->write_lock, flags);
198 return 0;
200 wb = &acm->wb[wbn];
202 acm->write_ready = 0;
203 spin_unlock_irqrestore(&acm->write_lock, flags);
205 acm->writeurb->transfer_buffer = wb->buf;
206 acm->writeurb->transfer_dma = wb->dmah;
207 acm->writeurb->transfer_buffer_length = wb->len;
208 acm->writeurb->dev = acm->dev;
210 if ((rc = usb_submit_urb(acm->writeurb, GFP_ATOMIC)) < 0) {
211 dbg("usb_submit_urb(write bulk) failed: %d", rc);
212 acm_write_done(acm);
214 return rc;
218 * Interrupt handlers for various ACM device responses
221 /* control interface reports status changes with "interrupt" transfers */
222 static void acm_ctrl_irq(struct urb *urb, struct pt_regs *regs)
224 struct acm *acm = urb->context;
225 struct usb_cdc_notification *dr = urb->transfer_buffer;
226 unsigned char *data;
227 int newctrl;
228 int status;
230 switch (urb->status) {
231 case 0:
232 /* success */
233 break;
234 case -ECONNRESET:
235 case -ENOENT:
236 case -ESHUTDOWN:
237 /* this urb is terminated, clean up */
238 dbg("%s - urb shutting down with status: %d", __FUNCTION__, urb->status);
239 return;
240 default:
241 dbg("%s - nonzero urb status received: %d", __FUNCTION__, urb->status);
242 goto exit;
245 if (!ACM_READY(acm))
246 goto exit;
248 data = (unsigned char *)(dr + 1);
249 switch (dr->bNotificationType) {
251 case USB_CDC_NOTIFY_NETWORK_CONNECTION:
253 dbg("%s network", dr->wValue ? "connected to" : "disconnected from");
254 break;
256 case USB_CDC_NOTIFY_SERIAL_STATE:
258 newctrl = le16_to_cpu(get_unaligned((__le16 *) data));
260 if (acm->tty && !acm->clocal && (acm->ctrlin & ~newctrl & ACM_CTRL_DCD)) {
261 dbg("calling hangup");
262 tty_hangup(acm->tty);
265 acm->ctrlin = newctrl;
267 dbg("input control lines: dcd%c dsr%c break%c ring%c framing%c parity%c overrun%c",
268 acm->ctrlin & ACM_CTRL_DCD ? '+' : '-', acm->ctrlin & ACM_CTRL_DSR ? '+' : '-',
269 acm->ctrlin & ACM_CTRL_BRK ? '+' : '-', acm->ctrlin & ACM_CTRL_RI ? '+' : '-',
270 acm->ctrlin & ACM_CTRL_FRAMING ? '+' : '-', acm->ctrlin & ACM_CTRL_PARITY ? '+' : '-',
271 acm->ctrlin & ACM_CTRL_OVERRUN ? '+' : '-');
273 break;
275 default:
276 dbg("unknown notification %d received: index %d len %d data0 %d data1 %d",
277 dr->bNotificationType, dr->wIndex,
278 dr->wLength, data[0], data[1]);
279 break;
281 exit:
282 status = usb_submit_urb (urb, GFP_ATOMIC);
283 if (status)
284 err ("%s - usb_submit_urb failed with result %d",
285 __FUNCTION__, status);
288 /* data interface returns incoming bytes, or we got unthrottled */
289 static void acm_read_bulk(struct urb *urb, struct pt_regs *regs)
291 struct acm_rb *buf;
292 struct acm_ru *rcv = urb->context;
293 struct acm *acm = rcv->instance;
294 dbg("Entering acm_read_bulk with status %d\n", urb->status);
296 if (!ACM_READY(acm))
297 return;
299 if (urb->status)
300 dev_dbg(&acm->data->dev, "bulk rx status %d\n", urb->status);
302 buf = rcv->buffer;
303 buf->size = urb->actual_length;
305 spin_lock(&acm->read_lock);
306 list_add_tail(&rcv->list, &acm->spare_read_urbs);
307 list_add_tail(&buf->list, &acm->filled_read_bufs);
308 spin_unlock(&acm->read_lock);
310 tasklet_schedule(&acm->urb_task);
313 static void acm_rx_tasklet(unsigned long _acm)
315 struct acm *acm = (void *)_acm;
316 struct acm_rb *buf;
317 struct tty_struct *tty = acm->tty;
318 struct acm_ru *rcv;
319 //unsigned long flags;
320 int i = 0;
321 dbg("Entering acm_rx_tasklet");
323 if (!ACM_READY(acm) || acm->throttle)
324 return;
326 next_buffer:
327 spin_lock(&acm->read_lock);
328 if (list_empty(&acm->filled_read_bufs)) {
329 spin_unlock(&acm->read_lock);
330 goto urbs;
332 buf = list_entry(acm->filled_read_bufs.next,
333 struct acm_rb, list);
334 list_del(&buf->list);
335 spin_unlock(&acm->read_lock);
337 dbg("acm_rx_tasklet: procesing buf 0x%p, size = %d\n", buf, buf->size);
339 tty_buffer_request_room(tty, buf->size);
340 if (!acm->throttle)
341 tty_insert_flip_string(tty, buf->base, buf->size);
342 tty_flip_buffer_push(tty);
344 spin_lock(&acm->throttle_lock);
345 if (acm->throttle) {
346 dbg("Throtteling noticed");
347 memmove(buf->base, buf->base + i, buf->size - i);
348 buf->size -= i;
349 spin_unlock(&acm->throttle_lock);
350 spin_lock(&acm->read_lock);
351 list_add(&buf->list, &acm->filled_read_bufs);
352 spin_unlock(&acm->read_lock);
353 return;
355 spin_unlock(&acm->throttle_lock);
357 spin_lock(&acm->read_lock);
358 list_add(&buf->list, &acm->spare_read_bufs);
359 spin_unlock(&acm->read_lock);
360 goto next_buffer;
362 urbs:
363 while (!list_empty(&acm->spare_read_bufs)) {
364 spin_lock(&acm->read_lock);
365 if (list_empty(&acm->spare_read_urbs)) {
366 spin_unlock(&acm->read_lock);
367 return;
369 rcv = list_entry(acm->spare_read_urbs.next,
370 struct acm_ru, list);
371 list_del(&rcv->list);
372 spin_unlock(&acm->read_lock);
374 buf = list_entry(acm->spare_read_bufs.next,
375 struct acm_rb, list);
376 list_del(&buf->list);
378 rcv->buffer = buf;
380 usb_fill_bulk_urb(rcv->urb, acm->dev,
381 acm->rx_endpoint,
382 buf->base,
383 acm->readsize,
384 acm_read_bulk, rcv);
385 rcv->urb->transfer_dma = buf->dma;
386 rcv->urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
388 dbg("acm_rx_tasklet: sending urb 0x%p, rcv 0x%p, buf 0x%p\n", rcv->urb, rcv, buf);
390 /* This shouldn't kill the driver as unsuccessful URBs are returned to the
391 free-urbs-pool and resubmited ASAP */
392 if (usb_submit_urb(rcv->urb, GFP_ATOMIC) < 0) {
393 list_add(&buf->list, &acm->spare_read_bufs);
394 spin_lock(&acm->read_lock);
395 list_add(&rcv->list, &acm->spare_read_urbs);
396 spin_unlock(&acm->read_lock);
397 return;
402 /* data interface wrote those outgoing bytes */
403 static void acm_write_bulk(struct urb *urb, struct pt_regs *regs)
405 struct acm *acm = (struct acm *)urb->context;
407 dbg("Entering acm_write_bulk with status %d\n", urb->status);
409 acm_write_done(acm);
410 acm_write_start(acm);
411 if (ACM_READY(acm))
412 schedule_work(&acm->work);
415 static void acm_softint(void *private)
417 struct acm *acm = private;
418 dbg("Entering acm_softint.\n");
420 if (!ACM_READY(acm))
421 return;
422 tty_wakeup(acm->tty);
426 * TTY handlers
429 static int acm_tty_open(struct tty_struct *tty, struct file *filp)
431 struct acm *acm;
432 int rv = -EINVAL;
433 int i;
434 dbg("Entering acm_tty_open.\n");
436 mutex_lock(&open_mutex);
438 acm = acm_table[tty->index];
439 if (!acm || !acm->dev)
440 goto err_out;
441 else
442 rv = 0;
444 tty->driver_data = acm;
445 acm->tty = tty;
447 /* force low_latency on so that our tty_push actually forces the data through,
448 otherwise it is scheduled, and with high data rates data can get lost. */
449 tty->low_latency = 1;
451 if (acm->used++) {
452 goto done;
455 acm->ctrlurb->dev = acm->dev;
456 if (usb_submit_urb(acm->ctrlurb, GFP_KERNEL)) {
457 dbg("usb_submit_urb(ctrl irq) failed");
458 goto bail_out;
461 if (0 > acm_set_control(acm, acm->ctrlout = ACM_CTRL_DTR | ACM_CTRL_RTS))
462 goto full_bailout;
464 INIT_LIST_HEAD(&acm->spare_read_urbs);
465 INIT_LIST_HEAD(&acm->spare_read_bufs);
466 INIT_LIST_HEAD(&acm->filled_read_bufs);
467 for (i = 0; i < ACM_NRU; i++) {
468 list_add(&(acm->ru[i].list), &acm->spare_read_urbs);
470 for (i = 0; i < ACM_NRB; i++) {
471 list_add(&(acm->rb[i].list), &acm->spare_read_bufs);
474 tasklet_schedule(&acm->urb_task);
476 done:
477 err_out:
478 mutex_unlock(&open_mutex);
479 return rv;
481 full_bailout:
482 usb_kill_urb(acm->ctrlurb);
483 bail_out:
484 acm->used--;
485 mutex_unlock(&open_mutex);
486 return -EIO;
489 static void acm_tty_unregister(struct acm *acm)
491 int i;
493 tty_unregister_device(acm_tty_driver, acm->minor);
494 usb_put_intf(acm->control);
495 acm_table[acm->minor] = NULL;
496 usb_free_urb(acm->ctrlurb);
497 usb_free_urb(acm->writeurb);
498 for (i = 0; i < ACM_NRU; i++)
499 usb_free_urb(acm->ru[i].urb);
500 kfree(acm);
503 static void acm_tty_close(struct tty_struct *tty, struct file *filp)
505 struct acm *acm = tty->driver_data;
506 int i;
508 if (!acm || !acm->used)
509 return;
511 mutex_lock(&open_mutex);
512 if (!--acm->used) {
513 if (acm->dev) {
514 acm_set_control(acm, acm->ctrlout = 0);
515 usb_kill_urb(acm->ctrlurb);
516 usb_kill_urb(acm->writeurb);
517 for (i = 0; i < ACM_NRU; i++)
518 usb_kill_urb(acm->ru[i].urb);
519 } else
520 acm_tty_unregister(acm);
522 mutex_unlock(&open_mutex);
525 static int acm_tty_write(struct tty_struct *tty, const unsigned char *buf, int count)
527 struct acm *acm = tty->driver_data;
528 int stat;
529 unsigned long flags;
530 int wbn;
531 struct acm_wb *wb;
533 dbg("Entering acm_tty_write to write %d bytes,\n", count);
535 if (!ACM_READY(acm))
536 return -EINVAL;
537 if (!count)
538 return 0;
540 spin_lock_irqsave(&acm->write_lock, flags);
541 if ((wbn = acm_wb_alloc(acm)) < 0) {
542 spin_unlock_irqrestore(&acm->write_lock, flags);
543 acm_write_start(acm);
544 return 0;
546 wb = &acm->wb[wbn];
548 count = (count > acm->writesize) ? acm->writesize : count;
549 dbg("Get %d bytes...", count);
550 memcpy(wb->buf, buf, count);
551 wb->len = count;
552 spin_unlock_irqrestore(&acm->write_lock, flags);
554 if ((stat = acm_write_start(acm)) < 0)
555 return stat;
556 return count;
559 static int acm_tty_write_room(struct tty_struct *tty)
561 struct acm *acm = tty->driver_data;
562 if (!ACM_READY(acm))
563 return -EINVAL;
565 * Do not let the line discipline to know that we have a reserve,
566 * or it might get too enthusiastic.
568 return (acm->write_ready && acm_wb_is_avail(acm)) ? acm->writesize : 0;
571 static int acm_tty_chars_in_buffer(struct tty_struct *tty)
573 struct acm *acm = tty->driver_data;
574 if (!ACM_READY(acm))
575 return -EINVAL;
577 * This is inaccurate (overcounts), but it works.
579 return (ACM_NWB - acm_wb_is_avail(acm)) * acm->writesize;
582 static void acm_tty_throttle(struct tty_struct *tty)
584 struct acm *acm = tty->driver_data;
585 if (!ACM_READY(acm))
586 return;
587 spin_lock_bh(&acm->throttle_lock);
588 acm->throttle = 1;
589 spin_unlock_bh(&acm->throttle_lock);
592 static void acm_tty_unthrottle(struct tty_struct *tty)
594 struct acm *acm = tty->driver_data;
595 if (!ACM_READY(acm))
596 return;
597 spin_lock_bh(&acm->throttle_lock);
598 acm->throttle = 0;
599 spin_unlock_bh(&acm->throttle_lock);
600 tasklet_schedule(&acm->urb_task);
603 static void acm_tty_break_ctl(struct tty_struct *tty, int state)
605 struct acm *acm = tty->driver_data;
606 if (!ACM_READY(acm))
607 return;
608 if (acm_send_break(acm, state ? 0xffff : 0))
609 dbg("send break failed");
612 static int acm_tty_tiocmget(struct tty_struct *tty, struct file *file)
614 struct acm *acm = tty->driver_data;
616 if (!ACM_READY(acm))
617 return -EINVAL;
619 return (acm->ctrlout & ACM_CTRL_DTR ? TIOCM_DTR : 0) |
620 (acm->ctrlout & ACM_CTRL_RTS ? TIOCM_RTS : 0) |
621 (acm->ctrlin & ACM_CTRL_DSR ? TIOCM_DSR : 0) |
622 (acm->ctrlin & ACM_CTRL_RI ? TIOCM_RI : 0) |
623 (acm->ctrlin & ACM_CTRL_DCD ? TIOCM_CD : 0) |
624 TIOCM_CTS;
627 static int acm_tty_tiocmset(struct tty_struct *tty, struct file *file,
628 unsigned int set, unsigned int clear)
630 struct acm *acm = tty->driver_data;
631 unsigned int newctrl;
633 if (!ACM_READY(acm))
634 return -EINVAL;
636 newctrl = acm->ctrlout;
637 set = (set & TIOCM_DTR ? ACM_CTRL_DTR : 0) | (set & TIOCM_RTS ? ACM_CTRL_RTS : 0);
638 clear = (clear & TIOCM_DTR ? ACM_CTRL_DTR : 0) | (clear & TIOCM_RTS ? ACM_CTRL_RTS : 0);
640 newctrl = (newctrl & ~clear) | set;
642 if (acm->ctrlout == newctrl)
643 return 0;
644 return acm_set_control(acm, acm->ctrlout = newctrl);
647 static int acm_tty_ioctl(struct tty_struct *tty, struct file *file, unsigned int cmd, unsigned long arg)
649 struct acm *acm = tty->driver_data;
651 if (!ACM_READY(acm))
652 return -EINVAL;
654 return -ENOIOCTLCMD;
657 static const __u32 acm_tty_speed[] = {
658 0, 50, 75, 110, 134, 150, 200, 300, 600,
659 1200, 1800, 2400, 4800, 9600, 19200, 38400,
660 57600, 115200, 230400, 460800, 500000, 576000,
661 921600, 1000000, 1152000, 1500000, 2000000,
662 2500000, 3000000, 3500000, 4000000
665 static const __u8 acm_tty_size[] = {
666 5, 6, 7, 8
669 static void acm_tty_set_termios(struct tty_struct *tty, struct termios *termios_old)
671 struct acm *acm = tty->driver_data;
672 struct termios *termios = tty->termios;
673 struct usb_cdc_line_coding newline;
674 int newctrl = acm->ctrlout;
676 if (!ACM_READY(acm))
677 return;
679 newline.dwDTERate = cpu_to_le32p(acm_tty_speed +
680 (termios->c_cflag & CBAUD & ~CBAUDEX) + (termios->c_cflag & CBAUDEX ? 15 : 0));
681 newline.bCharFormat = termios->c_cflag & CSTOPB ? 2 : 0;
682 newline.bParityType = termios->c_cflag & PARENB ?
683 (termios->c_cflag & PARODD ? 1 : 2) + (termios->c_cflag & CMSPAR ? 2 : 0) : 0;
684 newline.bDataBits = acm_tty_size[(termios->c_cflag & CSIZE) >> 4];
686 acm->clocal = ((termios->c_cflag & CLOCAL) != 0);
688 if (!newline.dwDTERate) {
689 newline.dwDTERate = acm->line.dwDTERate;
690 newctrl &= ~ACM_CTRL_DTR;
691 } else newctrl |= ACM_CTRL_DTR;
693 if (newctrl != acm->ctrlout)
694 acm_set_control(acm, acm->ctrlout = newctrl);
696 if (memcmp(&acm->line, &newline, sizeof newline)) {
697 memcpy(&acm->line, &newline, sizeof newline);
698 dbg("set line: %d %d %d %d", le32_to_cpu(newline.dwDTERate),
699 newline.bCharFormat, newline.bParityType,
700 newline.bDataBits);
701 acm_set_line(acm, &acm->line);
706 * USB probe and disconnect routines.
709 /* Little helper: write buffers free */
710 static void acm_write_buffers_free(struct acm *acm)
712 int i;
713 struct acm_wb *wb;
715 for (wb = &acm->wb[0], i = 0; i < ACM_NWB; i++, wb++) {
716 usb_buffer_free(acm->dev, acm->writesize, wb->buf, wb->dmah);
720 /* Little helper: write buffers allocate */
721 static int acm_write_buffers_alloc(struct acm *acm)
723 int i;
724 struct acm_wb *wb;
726 for (wb = &acm->wb[0], i = 0; i < ACM_NWB; i++, wb++) {
727 wb->buf = usb_buffer_alloc(acm->dev, acm->writesize, GFP_KERNEL,
728 &wb->dmah);
729 if (!wb->buf) {
730 while (i != 0) {
731 --i;
732 --wb;
733 usb_buffer_free(acm->dev, acm->writesize,
734 wb->buf, wb->dmah);
736 return -ENOMEM;
739 return 0;
742 static int acm_probe (struct usb_interface *intf,
743 const struct usb_device_id *id)
745 struct usb_cdc_union_desc *union_header = NULL;
746 char *buffer = intf->altsetting->extra;
747 int buflen = intf->altsetting->extralen;
748 struct usb_interface *control_interface;
749 struct usb_interface *data_interface;
750 struct usb_endpoint_descriptor *epctrl;
751 struct usb_endpoint_descriptor *epread;
752 struct usb_endpoint_descriptor *epwrite;
753 struct usb_device *usb_dev = interface_to_usbdev(intf);
754 struct acm *acm;
755 int minor;
756 int ctrlsize,readsize;
757 u8 *buf;
758 u8 ac_management_function = 0;
759 u8 call_management_function = 0;
760 int call_interface_num = -1;
761 int data_interface_num;
762 unsigned long quirks;
763 int i;
765 /* handle quirks deadly to normal probing*/
766 quirks = (unsigned long)id->driver_info;
767 if (quirks == NO_UNION_NORMAL) {
768 data_interface = usb_ifnum_to_if(usb_dev, 1);
769 control_interface = usb_ifnum_to_if(usb_dev, 0);
770 goto skip_normal_probe;
773 /* normal probing*/
774 if (!buffer) {
775 err("Wierd descriptor references\n");
776 return -EINVAL;
779 if (!buflen) {
780 if (intf->cur_altsetting->endpoint->extralen && intf->cur_altsetting->endpoint->extra) {
781 dev_dbg(&intf->dev,"Seeking extra descriptors on endpoint\n");
782 buflen = intf->cur_altsetting->endpoint->extralen;
783 buffer = intf->cur_altsetting->endpoint->extra;
784 } else {
785 err("Zero length descriptor references\n");
786 return -EINVAL;
790 while (buflen > 0) {
791 if (buffer [1] != USB_DT_CS_INTERFACE) {
792 err("skipping garbage\n");
793 goto next_desc;
796 switch (buffer [2]) {
797 case USB_CDC_UNION_TYPE: /* we've found it */
798 if (union_header) {
799 err("More than one union descriptor, skipping ...");
800 goto next_desc;
802 union_header = (struct usb_cdc_union_desc *)
803 buffer;
804 break;
805 case USB_CDC_COUNTRY_TYPE: /* maybe somehow export */
806 break; /* for now we ignore it */
807 case USB_CDC_HEADER_TYPE: /* maybe check version */
808 break; /* for now we ignore it */
809 case USB_CDC_ACM_TYPE:
810 ac_management_function = buffer[3];
811 break;
812 case USB_CDC_CALL_MANAGEMENT_TYPE:
813 call_management_function = buffer[3];
814 call_interface_num = buffer[4];
815 if ((call_management_function & 3) != 3)
816 err("This device cannot do calls on its own. It is no modem.");
817 break;
819 default:
820 err("Ignoring extra header, type %d, length %d", buffer[2], buffer[0]);
821 break;
823 next_desc:
824 buflen -= buffer[0];
825 buffer += buffer[0];
828 if (!union_header) {
829 if (call_interface_num > 0) {
830 dev_dbg(&intf->dev,"No union descriptor, using call management descriptor\n");
831 data_interface = usb_ifnum_to_if(usb_dev, (data_interface_num = call_interface_num));
832 control_interface = intf;
833 } else {
834 dev_dbg(&intf->dev,"No union descriptor, giving up\n");
835 return -ENODEV;
837 } else {
838 control_interface = usb_ifnum_to_if(usb_dev, union_header->bMasterInterface0);
839 data_interface = usb_ifnum_to_if(usb_dev, (data_interface_num = union_header->bSlaveInterface0));
840 if (!control_interface || !data_interface) {
841 dev_dbg(&intf->dev,"no interfaces\n");
842 return -ENODEV;
846 if (data_interface_num != call_interface_num)
847 dev_dbg(&intf->dev,"Seperate call control interface. That is not fully supported.\n");
849 skip_normal_probe:
851 /*workaround for switched interfaces */
852 if (data_interface->cur_altsetting->desc.bInterfaceClass != CDC_DATA_INTERFACE_TYPE) {
853 if (control_interface->cur_altsetting->desc.bInterfaceClass == CDC_DATA_INTERFACE_TYPE) {
854 struct usb_interface *t;
855 dev_dbg(&intf->dev,"Your device has switched interfaces.\n");
857 t = control_interface;
858 control_interface = data_interface;
859 data_interface = t;
860 } else {
861 return -EINVAL;
865 if (usb_interface_claimed(data_interface)) { /* valid in this context */
866 dev_dbg(&intf->dev,"The data interface isn't available\n");
867 return -EBUSY;
871 if (data_interface->cur_altsetting->desc.bNumEndpoints < 2)
872 return -EINVAL;
874 epctrl = &control_interface->cur_altsetting->endpoint[0].desc;
875 epread = &data_interface->cur_altsetting->endpoint[0].desc;
876 epwrite = &data_interface->cur_altsetting->endpoint[1].desc;
879 /* workaround for switched endpoints */
880 if ((epread->bEndpointAddress & USB_DIR_IN) != USB_DIR_IN) {
881 /* descriptors are swapped */
882 struct usb_endpoint_descriptor *t;
883 dev_dbg(&intf->dev,"The data interface has switched endpoints\n");
885 t = epread;
886 epread = epwrite;
887 epwrite = t;
889 dbg("interfaces are valid");
890 for (minor = 0; minor < ACM_TTY_MINORS && acm_table[minor]; minor++);
892 if (minor == ACM_TTY_MINORS) {
893 err("no more free acm devices");
894 return -ENODEV;
897 if (!(acm = kzalloc(sizeof(struct acm), GFP_KERNEL))) {
898 dev_dbg(&intf->dev, "out of memory (acm kzalloc)\n");
899 goto alloc_fail;
902 ctrlsize = le16_to_cpu(epctrl->wMaxPacketSize);
903 readsize = le16_to_cpu(epread->wMaxPacketSize)*2;
904 acm->writesize = le16_to_cpu(epwrite->wMaxPacketSize);
905 acm->control = control_interface;
906 acm->data = data_interface;
907 acm->minor = minor;
908 acm->dev = usb_dev;
909 acm->ctrl_caps = ac_management_function;
910 acm->ctrlsize = ctrlsize;
911 acm->readsize = readsize;
912 acm->urb_task.func = acm_rx_tasklet;
913 acm->urb_task.data = (unsigned long) acm;
914 INIT_WORK(&acm->work, acm_softint, acm);
915 spin_lock_init(&acm->throttle_lock);
916 spin_lock_init(&acm->write_lock);
917 spin_lock_init(&acm->read_lock);
918 acm->write_ready = 1;
919 acm->rx_endpoint = usb_rcvbulkpipe(usb_dev, epread->bEndpointAddress);
921 buf = usb_buffer_alloc(usb_dev, ctrlsize, GFP_KERNEL, &acm->ctrl_dma);
922 if (!buf) {
923 dev_dbg(&intf->dev, "out of memory (ctrl buffer alloc)\n");
924 goto alloc_fail2;
926 acm->ctrl_buffer = buf;
928 if (acm_write_buffers_alloc(acm) < 0) {
929 dev_dbg(&intf->dev, "out of memory (write buffer alloc)\n");
930 goto alloc_fail4;
933 acm->ctrlurb = usb_alloc_urb(0, GFP_KERNEL);
934 if (!acm->ctrlurb) {
935 dev_dbg(&intf->dev, "out of memory (ctrlurb kmalloc)\n");
936 goto alloc_fail5;
938 for (i = 0; i < ACM_NRU; i++) {
939 struct acm_ru *rcv = &(acm->ru[i]);
941 if (!(rcv->urb = usb_alloc_urb(0, GFP_KERNEL))) {
942 dev_dbg(&intf->dev, "out of memory (read urbs usb_alloc_urb)\n");
943 goto alloc_fail7;
946 rcv->urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
947 rcv->instance = acm;
949 for (i = 0; i < ACM_NRB; i++) {
950 struct acm_rb *buf = &(acm->rb[i]);
952 // Using usb_buffer_alloc instead of kmalloc as Oliver suggested
953 if (!(buf->base = usb_buffer_alloc(acm->dev, readsize, GFP_KERNEL, &buf->dma))) {
954 dev_dbg(&intf->dev, "out of memory (read bufs usb_buffer_alloc)\n");
955 goto alloc_fail7;
958 acm->writeurb = usb_alloc_urb(0, GFP_KERNEL);
959 if (!acm->writeurb) {
960 dev_dbg(&intf->dev, "out of memory (writeurb kmalloc)\n");
961 goto alloc_fail7;
964 usb_fill_int_urb(acm->ctrlurb, usb_dev, usb_rcvintpipe(usb_dev, epctrl->bEndpointAddress),
965 acm->ctrl_buffer, ctrlsize, acm_ctrl_irq, acm, epctrl->bInterval);
966 acm->ctrlurb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
967 acm->ctrlurb->transfer_dma = acm->ctrl_dma;
969 usb_fill_bulk_urb(acm->writeurb, usb_dev, usb_sndbulkpipe(usb_dev, epwrite->bEndpointAddress),
970 NULL, acm->writesize, acm_write_bulk, acm);
971 acm->writeurb->transfer_flags |= URB_NO_FSBR | URB_NO_TRANSFER_DMA_MAP;
973 dev_info(&intf->dev, "ttyACM%d: USB ACM device\n", minor);
975 acm_set_control(acm, acm->ctrlout);
977 acm->line.dwDTERate = cpu_to_le32(9600);
978 acm->line.bDataBits = 8;
979 acm_set_line(acm, &acm->line);
981 usb_driver_claim_interface(&acm_driver, data_interface, acm);
983 usb_get_intf(control_interface);
984 tty_register_device(acm_tty_driver, minor, &control_interface->dev);
986 acm_table[minor] = acm;
987 usb_set_intfdata (intf, acm);
988 return 0;
990 alloc_fail7:
991 for (i = 0; i < ACM_NRB; i++)
992 usb_buffer_free(usb_dev, acm->readsize, acm->rb[i].base, acm->rb[i].dma);
993 for (i = 0; i < ACM_NRU; i++)
994 usb_free_urb(acm->ru[i].urb);
995 usb_free_urb(acm->ctrlurb);
996 alloc_fail5:
997 acm_write_buffers_free(acm);
998 alloc_fail4:
999 usb_buffer_free(usb_dev, ctrlsize, acm->ctrl_buffer, acm->ctrl_dma);
1000 alloc_fail2:
1001 kfree(acm);
1002 alloc_fail:
1003 return -ENOMEM;
1006 static void acm_disconnect(struct usb_interface *intf)
1008 struct acm *acm = usb_get_intfdata (intf);
1009 struct usb_device *usb_dev = interface_to_usbdev(intf);
1010 int i;
1012 if (!acm || !acm->dev) {
1013 dbg("disconnect on nonexisting interface");
1014 return;
1017 mutex_lock(&open_mutex);
1018 if (!usb_get_intfdata(intf)) {
1019 mutex_unlock(&open_mutex);
1020 return;
1022 acm->dev = NULL;
1023 usb_set_intfdata(acm->control, NULL);
1024 usb_set_intfdata(acm->data, NULL);
1026 tasklet_disable(&acm->urb_task);
1028 usb_kill_urb(acm->ctrlurb);
1029 usb_kill_urb(acm->writeurb);
1030 for (i = 0; i < ACM_NRU; i++)
1031 usb_kill_urb(acm->ru[i].urb);
1033 INIT_LIST_HEAD(&acm->filled_read_bufs);
1034 INIT_LIST_HEAD(&acm->spare_read_bufs);
1036 tasklet_enable(&acm->urb_task);
1038 flush_scheduled_work(); /* wait for acm_softint */
1040 acm_write_buffers_free(acm);
1041 usb_buffer_free(usb_dev, acm->ctrlsize, acm->ctrl_buffer, acm->ctrl_dma);
1042 for (i = 0; i < ACM_NRB; i++)
1043 usb_buffer_free(usb_dev, acm->readsize, acm->rb[i].base, acm->rb[i].dma);
1045 usb_driver_release_interface(&acm_driver, intf == acm->control ? acm->data : intf);
1047 if (!acm->used) {
1048 acm_tty_unregister(acm);
1049 mutex_unlock(&open_mutex);
1050 return;
1053 mutex_unlock(&open_mutex);
1055 if (acm->tty)
1056 tty_hangup(acm->tty);
1060 * USB driver structure.
1063 static struct usb_device_id acm_ids[] = {
1064 /* quirky and broken devices */
1065 { USB_DEVICE(0x0870, 0x0001), /* Metricom GS Modem */
1066 .driver_info = NO_UNION_NORMAL, /* has no union descriptor */
1068 { USB_DEVICE(0x0482, 0x0203), /* KYOCERA AH-K3001V */
1069 .driver_info = NO_UNION_NORMAL, /* has no union descriptor */
1071 /* control interfaces with various AT-command sets */
1072 { USB_INTERFACE_INFO(USB_CLASS_COMM, USB_CDC_SUBCLASS_ACM,
1073 USB_CDC_ACM_PROTO_AT_V25TER) },
1074 { USB_INTERFACE_INFO(USB_CLASS_COMM, USB_CDC_SUBCLASS_ACM,
1075 USB_CDC_ACM_PROTO_AT_PCCA101) },
1076 { USB_INTERFACE_INFO(USB_CLASS_COMM, USB_CDC_SUBCLASS_ACM,
1077 USB_CDC_ACM_PROTO_AT_PCCA101_WAKE) },
1078 { USB_INTERFACE_INFO(USB_CLASS_COMM, USB_CDC_SUBCLASS_ACM,
1079 USB_CDC_ACM_PROTO_AT_GSM) },
1080 { USB_INTERFACE_INFO(USB_CLASS_COMM, USB_CDC_SUBCLASS_ACM,
1081 USB_CDC_ACM_PROTO_AT_3G ) },
1082 { USB_INTERFACE_INFO(USB_CLASS_COMM, USB_CDC_SUBCLASS_ACM,
1083 USB_CDC_ACM_PROTO_AT_CDMA) },
1085 /* NOTE: COMM/ACM/0xff is likely MSFT RNDIS ... NOT a modem!! */
1089 MODULE_DEVICE_TABLE (usb, acm_ids);
1091 static struct usb_driver acm_driver = {
1092 .name = "cdc_acm",
1093 .probe = acm_probe,
1094 .disconnect = acm_disconnect,
1095 .id_table = acm_ids,
1099 * TTY driver structures.
1102 static struct tty_operations acm_ops = {
1103 .open = acm_tty_open,
1104 .close = acm_tty_close,
1105 .write = acm_tty_write,
1106 .write_room = acm_tty_write_room,
1107 .ioctl = acm_tty_ioctl,
1108 .throttle = acm_tty_throttle,
1109 .unthrottle = acm_tty_unthrottle,
1110 .chars_in_buffer = acm_tty_chars_in_buffer,
1111 .break_ctl = acm_tty_break_ctl,
1112 .set_termios = acm_tty_set_termios,
1113 .tiocmget = acm_tty_tiocmget,
1114 .tiocmset = acm_tty_tiocmset,
1118 * Init / exit.
1121 static int __init acm_init(void)
1123 int retval;
1124 acm_tty_driver = alloc_tty_driver(ACM_TTY_MINORS);
1125 if (!acm_tty_driver)
1126 return -ENOMEM;
1127 acm_tty_driver->owner = THIS_MODULE,
1128 acm_tty_driver->driver_name = "acm",
1129 acm_tty_driver->name = "ttyACM",
1130 acm_tty_driver->devfs_name = "usb/acm/",
1131 acm_tty_driver->major = ACM_TTY_MAJOR,
1132 acm_tty_driver->minor_start = 0,
1133 acm_tty_driver->type = TTY_DRIVER_TYPE_SERIAL,
1134 acm_tty_driver->subtype = SERIAL_TYPE_NORMAL,
1135 acm_tty_driver->flags = TTY_DRIVER_REAL_RAW | TTY_DRIVER_NO_DEVFS,
1136 acm_tty_driver->init_termios = tty_std_termios;
1137 acm_tty_driver->init_termios.c_cflag = B9600 | CS8 | CREAD | HUPCL | CLOCAL;
1138 tty_set_operations(acm_tty_driver, &acm_ops);
1140 retval = tty_register_driver(acm_tty_driver);
1141 if (retval) {
1142 put_tty_driver(acm_tty_driver);
1143 return retval;
1146 retval = usb_register(&acm_driver);
1147 if (retval) {
1148 tty_unregister_driver(acm_tty_driver);
1149 put_tty_driver(acm_tty_driver);
1150 return retval;
1153 info(DRIVER_VERSION ":" DRIVER_DESC);
1155 return 0;
1158 static void __exit acm_exit(void)
1160 usb_deregister(&acm_driver);
1161 tty_unregister_driver(acm_tty_driver);
1162 put_tty_driver(acm_tty_driver);
1165 module_init(acm_init);
1166 module_exit(acm_exit);
1168 MODULE_AUTHOR( DRIVER_AUTHOR );
1169 MODULE_DESCRIPTION( DRIVER_DESC );
1170 MODULE_LICENSE("GPL");