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>
10 * USB Abstract Control Model driver for USB modems and ISDN adapters
15 * v0.9 - thorough cleaning, URBification, almost a rewrite
16 * v0.10 - some more cleanups
17 * v0.11 - fixed flow control, read error doesn't stop reads
18 * v0.12 - added TIOCM ioctls, added break handling, made struct acm kmalloced
19 * v0.13 - added termios, added hangup
20 * v0.14 - sized down struct acm
21 * v0.15 - fixed flow control again - characters could be lost
22 * v0.16 - added code for modems with swapped data and control interfaces
23 * v0.17 - added new style probing
24 * v0.18 - fixed new style probing for devices with more configurations
25 * v0.19 - fixed CLOCAL handling (thanks to Richard Shih-Ping Chan)
26 * v0.20 - switched to probing on interface (rather than device) class
27 * v0.21 - revert to probing on device for devices with multiple configs
28 * v0.22 - probe only the control interface. if usbcore doesn't choose the
29 * config we want, sysadmin changes bConfigurationValue in sysfs.
30 * v0.23 - use softirq for rx processing, as needed by tty layer
31 * v0.24 - change probe method to evaluate CDC union descriptor
35 * This program is free software; you can redistribute it and/or modify
36 * it under the terms of the GNU General Public License as published by
37 * the Free Software Foundation; either version 2 of the License, or
38 * (at your option) any later version.
40 * This program is distributed in the hope that it will be useful,
41 * but WITHOUT ANY WARRANTY; without even the implied warranty of
42 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
43 * GNU General Public License for more details.
45 * You should have received a copy of the GNU General Public License
46 * along with this program; if not, write to the Free Software
47 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
52 #include <linux/kernel.h>
53 #include <linux/errno.h>
54 #include <linux/init.h>
55 #include <linux/slab.h>
56 #include <linux/tty.h>
57 #include <linux/tty_driver.h>
58 #include <linux/tty_flip.h>
59 #include <linux/module.h>
60 #include <linux/smp_lock.h>
61 #include <asm/uaccess.h>
62 #include <linux/usb.h>
63 #include <asm/byteorder.h>
64 #include <asm/unaligned.h>
71 #define DRIVER_VERSION "v0.23"
72 #define DRIVER_AUTHOR "Armin Fuerst, Pavel Machek, Johannes Erdfelt, Vojtech Pavlik"
73 #define DRIVER_DESC "USB Abstract Control Model driver for USB modems and ISDN adapters"
75 static struct usb_driver acm_driver;
76 static struct tty_driver *acm_tty_driver;
77 static struct acm *acm_table[ACM_TTY_MINORS];
79 static DECLARE_MUTEX(open_sem);
81 #define ACM_READY(acm) (acm && acm->dev && acm->used)
84 * Functions for ACM control messages.
87 static int acm_ctrl_msg(struct acm *acm, int request, int value, void *buf, int len)
89 int retval = usb_control_msg(acm->dev, usb_sndctrlpipe(acm->dev, 0),
90 request, USB_RT_ACM, value,
91 acm->control->altsetting[0].desc.bInterfaceNumber,
93 dbg("acm_control_msg: rq: 0x%02x val: %#x len: %#x result: %d", request, value, len, retval);
94 return retval < 0 ? retval : 0;
97 /* devices aren't required to support these requests.
98 * the cdc acm descriptor tells whether they do...
100 #define acm_set_control(acm, control) acm_ctrl_msg(acm, ACM_REQ_SET_CONTROL, control, NULL, 0)
101 #define acm_set_line(acm, line) acm_ctrl_msg(acm, ACM_REQ_SET_LINE, 0, line, sizeof(struct acm_line))
102 #define acm_send_break(acm, ms) acm_ctrl_msg(acm, ACM_REQ_SEND_BREAK, ms, NULL, 0)
105 * Interrupt handlers for various ACM device responses
108 /* control interface reports status changes with "interrupt" transfers */
109 static void acm_ctrl_irq(struct urb *urb, struct pt_regs *regs)
111 struct acm *acm = urb->context;
112 struct usb_ctrlrequest *dr = urb->transfer_buffer;
117 switch (urb->status) {
124 /* this urb is terminated, clean up */
125 dbg("%s - urb shutting down with status: %d", __FUNCTION__, urb->status);
128 dbg("%s - nonzero urb status received: %d", __FUNCTION__, urb->status);
135 data = (unsigned char *)(dr + 1);
136 switch (dr->bRequest) {
138 case ACM_IRQ_NETWORK:
140 dbg("%s network", dr->wValue ? "connected to" : "disconnected from");
143 case ACM_IRQ_LINE_STATE:
145 newctrl = le16_to_cpu(get_unaligned((__le16 *) data));
147 if (acm->tty && !acm->clocal && (acm->ctrlin & ~newctrl & ACM_CTRL_DCD)) {
148 dbg("calling hangup");
149 tty_hangup(acm->tty);
152 acm->ctrlin = newctrl;
154 dbg("input control lines: dcd%c dsr%c break%c ring%c framing%c parity%c overrun%c",
155 acm->ctrlin & ACM_CTRL_DCD ? '+' : '-', acm->ctrlin & ACM_CTRL_DSR ? '+' : '-',
156 acm->ctrlin & ACM_CTRL_BRK ? '+' : '-', acm->ctrlin & ACM_CTRL_RI ? '+' : '-',
157 acm->ctrlin & ACM_CTRL_FRAMING ? '+' : '-', acm->ctrlin & ACM_CTRL_PARITY ? '+' : '-',
158 acm->ctrlin & ACM_CTRL_OVERRUN ? '+' : '-');
163 dbg("unknown control event received: request %d index %d len %d data0 %d data1 %d",
164 dr->bRequest, dr->wIndex, dr->wLength, data[0], data[1]);
168 status = usb_submit_urb (urb, GFP_ATOMIC);
170 err ("%s - usb_submit_urb failed with result %d",
171 __FUNCTION__, status);
174 /* data interface returns incoming bytes, or we got unthrottled */
175 static void acm_read_bulk(struct urb *urb, struct pt_regs *regs)
177 struct acm *acm = urb->context;
178 dbg("Entering acm_read_bulk with status %d\n", urb->status);
184 dev_dbg(&acm->data->dev, "bulk rx status %d\n", urb->status);
186 /* calling tty_flip_buffer_push() in_irq() isn't allowed */
187 tasklet_schedule(&acm->bh);
190 static void acm_rx_tasklet(unsigned long _acm)
192 struct acm *acm = (void *)_acm;
193 struct urb *urb = acm->readurb;
194 struct tty_struct *tty = acm->tty;
195 unsigned char *data = urb->transfer_buffer;
197 dbg("Entering acm_rx_tasklet");
199 if (urb->actual_length > 0 && !acm->throttle) {
200 for (i = 0; i < urb->actual_length && !acm->throttle; i++) {
201 /* if we insert more than TTY_FLIPBUF_SIZE characters,
203 if (tty->flip.count >= TTY_FLIPBUF_SIZE) {
204 tty_flip_buffer_push(tty);
206 tty_insert_flip_char(tty, data[i], 0);
208 dbg("Handed %d bytes to tty layer", i+1);
209 tty_flip_buffer_push(tty);
212 spin_lock(&acm->throttle_lock);
214 dbg("Throtteling noticed");
215 memmove(data, data + i, urb->actual_length - i);
216 urb->actual_length -= i;
217 acm->resubmit_to_unthrottle = 1;
218 spin_unlock(&acm->throttle_lock);
221 spin_unlock(&acm->throttle_lock);
223 urb->actual_length = 0;
226 i = usb_submit_urb(urb, GFP_ATOMIC);
228 dev_dbg(&acm->data->dev, "bulk rx resubmit %d\n", i);
231 /* data interface wrote those outgoing bytes */
232 static void acm_write_bulk(struct urb *urb, struct pt_regs *regs)
234 struct acm *acm = (struct acm *)urb->context;
235 dbg("Entering acm_write_bulk with status %d\n", urb->status);
241 dbg("nonzero write bulk status received: %d", urb->status);
243 schedule_work(&acm->work);
245 acm->ready_for_write = 1;
248 static void acm_softint(void *private)
250 struct acm *acm = private;
251 dbg("Entering acm_softint.\n");
255 tty_wakeup(acm->tty);
262 static int acm_tty_open(struct tty_struct *tty, struct file *filp)
264 struct acm *acm = acm_table[tty->index];
265 dbg("Entering acm_tty_open.\n");
267 if (!acm || !acm->dev)
270 tty->driver_data = acm;
279 acm->ctrlurb->dev = acm->dev;
280 if (usb_submit_urb(acm->ctrlurb, GFP_KERNEL)) {
281 dbg("usb_submit_urb(ctrl irq) failed");
285 acm->readurb->dev = acm->dev;
286 if (usb_submit_urb(acm->readurb, GFP_KERNEL)) {
287 dbg("usb_submit_urb(read bulk) failed");
288 goto bail_out_and_unlink;
291 if (0 > acm_set_control(acm, acm->ctrlout = ACM_CTRL_DTR | ACM_CTRL_RTS))
294 /* force low_latency on so that our tty_push actually forces the data through,
295 otherwise it is scheduled, and with high data rates data can get lost. */
296 tty->low_latency = 1;
304 usb_kill_urb(acm->readurb);
306 usb_kill_urb(acm->ctrlurb);
312 static void acm_tty_close(struct tty_struct *tty, struct file *filp)
314 struct acm *acm = tty->driver_data;
316 if (!acm || !acm->used)
322 acm_set_control(acm, acm->ctrlout = 0);
323 usb_kill_urb(acm->ctrlurb);
324 usb_kill_urb(acm->writeurb);
325 usb_kill_urb(acm->readurb);
327 tty_unregister_device(acm_tty_driver, acm->minor);
328 acm_table[acm->minor] = NULL;
329 usb_free_urb(acm->ctrlurb);
330 usb_free_urb(acm->readurb);
331 usb_free_urb(acm->writeurb);
338 static int acm_tty_write(struct tty_struct *tty, const unsigned char *buf, int count)
340 struct acm *acm = tty->driver_data;
342 dbg("Entering acm_tty_write to write %d bytes,\n", count);
346 if (!acm->ready_for_write)
351 count = (count > acm->writesize) ? acm->writesize : count;
353 dbg("Get %d bytes...", count);
354 memcpy(acm->write_buffer, buf, count);
355 dbg(" Successfully copied.\n");
357 acm->writeurb->transfer_buffer_length = count;
358 acm->writeurb->dev = acm->dev;
360 acm->ready_for_write = 0;
361 stat = usb_submit_urb(acm->writeurb, GFP_ATOMIC);
363 dbg("usb_submit_urb(write bulk) failed");
364 acm->ready_for_write = 1;
371 static int acm_tty_write_room(struct tty_struct *tty)
373 struct acm *acm = tty->driver_data;
376 return !acm->ready_for_write ? 0 : acm->writesize;
379 static int acm_tty_chars_in_buffer(struct tty_struct *tty)
381 struct acm *acm = tty->driver_data;
384 return !acm->ready_for_write ? acm->writeurb->transfer_buffer_length : 0;
387 static void acm_tty_throttle(struct tty_struct *tty)
389 struct acm *acm = tty->driver_data;
392 spin_lock_bh(&acm->throttle_lock);
394 spin_unlock_bh(&acm->throttle_lock);
397 static void acm_tty_unthrottle(struct tty_struct *tty)
399 struct acm *acm = tty->driver_data;
402 spin_lock_bh(&acm->throttle_lock);
404 spin_unlock_bh(&acm->throttle_lock);
405 if (acm->resubmit_to_unthrottle) {
406 acm->resubmit_to_unthrottle = 0;
407 acm_read_bulk(acm->readurb, NULL);
411 static void acm_tty_break_ctl(struct tty_struct *tty, int state)
413 struct acm *acm = tty->driver_data;
416 if (acm_send_break(acm, state ? 0xffff : 0))
417 dbg("send break failed");
420 static int acm_tty_tiocmget(struct tty_struct *tty, struct file *file)
422 struct acm *acm = tty->driver_data;
427 return (acm->ctrlout & ACM_CTRL_DTR ? TIOCM_DTR : 0) |
428 (acm->ctrlout & ACM_CTRL_RTS ? TIOCM_RTS : 0) |
429 (acm->ctrlin & ACM_CTRL_DSR ? TIOCM_DSR : 0) |
430 (acm->ctrlin & ACM_CTRL_RI ? TIOCM_RI : 0) |
431 (acm->ctrlin & ACM_CTRL_DCD ? TIOCM_CD : 0) |
435 static int acm_tty_tiocmset(struct tty_struct *tty, struct file *file,
436 unsigned int set, unsigned int clear)
438 struct acm *acm = tty->driver_data;
439 unsigned int newctrl;
444 newctrl = acm->ctrlout;
445 set = (set & TIOCM_DTR ? ACM_CTRL_DTR : 0) | (set & TIOCM_RTS ? ACM_CTRL_RTS : 0);
446 clear = (clear & TIOCM_DTR ? ACM_CTRL_DTR : 0) | (clear & TIOCM_RTS ? ACM_CTRL_RTS : 0);
448 newctrl = (newctrl & ~clear) | set;
450 if (acm->ctrlout == newctrl)
452 return acm_set_control(acm, acm->ctrlout = newctrl);
455 static int acm_tty_ioctl(struct tty_struct *tty, struct file *file, unsigned int cmd, unsigned long arg)
457 struct acm *acm = tty->driver_data;
465 static __u32 acm_tty_speed[] = {
466 0, 50, 75, 110, 134, 150, 200, 300, 600,
467 1200, 1800, 2400, 4800, 9600, 19200, 38400,
468 57600, 115200, 230400, 460800, 500000, 576000,
469 921600, 1000000, 1152000, 1500000, 2000000,
470 2500000, 3000000, 3500000, 4000000
473 static __u8 acm_tty_size[] = {
477 static void acm_tty_set_termios(struct tty_struct *tty, struct termios *termios_old)
479 struct acm *acm = tty->driver_data;
480 struct termios *termios = tty->termios;
481 struct acm_line newline;
482 int newctrl = acm->ctrlout;
487 newline.speed = cpu_to_le32p(acm_tty_speed +
488 (termios->c_cflag & CBAUD & ~CBAUDEX) + (termios->c_cflag & CBAUDEX ? 15 : 0));
489 newline.stopbits = termios->c_cflag & CSTOPB ? 2 : 0;
490 newline.parity = termios->c_cflag & PARENB ?
491 (termios->c_cflag & PARODD ? 1 : 2) + (termios->c_cflag & CMSPAR ? 2 : 0) : 0;
492 newline.databits = acm_tty_size[(termios->c_cflag & CSIZE) >> 4];
494 acm->clocal = ((termios->c_cflag & CLOCAL) != 0);
496 if (!newline.speed) {
497 newline.speed = acm->line.speed;
498 newctrl &= ~ACM_CTRL_DTR;
499 } else newctrl |= ACM_CTRL_DTR;
501 if (newctrl != acm->ctrlout)
502 acm_set_control(acm, acm->ctrlout = newctrl);
504 if (memcmp(&acm->line, &newline, sizeof(struct acm_line))) {
505 memcpy(&acm->line, &newline, sizeof(struct acm_line));
506 dbg("set line: %d %d %d %d", newline.speed, newline.stopbits, newline.parity, newline.databits);
507 acm_set_line(acm, &acm->line);
512 * USB probe and disconnect routines.
515 static int acm_probe (struct usb_interface *intf,
516 const struct usb_device_id *id)
518 struct union_desc *union_header = NULL;
519 char *buffer = intf->altsetting->extra;
520 int buflen = intf->altsetting->extralen;
521 struct usb_interface *control_interface;
522 struct usb_interface *data_interface;
523 struct usb_endpoint_descriptor *epctrl;
524 struct usb_endpoint_descriptor *epread;
525 struct usb_endpoint_descriptor *epwrite;
526 struct usb_device *usb_dev = interface_to_usbdev(intf);
529 int ctrlsize,readsize;
531 u8 ac_management_function = 0;
532 u8 call_management_function = 0;
533 int call_interface_num = -1;
534 int data_interface_num;
537 err("Wierd descriptor references");
542 if (intf->cur_altsetting->endpoint->extralen && intf->cur_altsetting->endpoint->extra) {
543 dev_dbg(&intf->dev,"Seeking extra descriptors on endpoint");
544 buflen = intf->cur_altsetting->endpoint->extralen;
545 buffer = intf->cur_altsetting->endpoint->extra;
547 err("Zero length descriptor references");
553 if (buffer [1] != USB_DT_CS_INTERFACE) {
554 err("skipping garbage");
558 switch (buffer [2]) {
559 case CDC_UNION_TYPE: /* we've found it */
561 err("More than one union descriptor, skipping ...");
564 union_header = (struct union_desc *)buffer;
566 case CDC_COUNTRY_TYPE: /* maybe somehow export */
567 break; /* for now we ignore it */
568 case CDC_HEADER_TYPE: /* maybe check version */
569 break; /* for now we ignore it */
570 case CDC_AC_MANAGEMENT_TYPE:
571 ac_management_function = buffer[3];
573 case CDC_CALL_MANAGEMENT_TYPE:
574 call_management_function = buffer[3];
575 call_interface_num = buffer[4];
576 if ((call_management_function & 3) != 3)
577 err("This device cannot do calls on its own. It is no modem.");
581 err("Ignoring extra header, type %d, length %d", buffer[2], buffer[0]);
590 if (call_interface_num > 0) {
591 dev_dbg(&intf->dev,"No union descriptor, using call management descriptor\n");
592 data_interface = usb_ifnum_to_if(usb_dev, (data_interface_num = call_interface_num));
593 control_interface = intf;
595 dev_dbg(&intf->dev,"No union descriptor, giving up\n");
599 control_interface = usb_ifnum_to_if(usb_dev, union_header->bMasterInterface0);
600 data_interface = usb_ifnum_to_if(usb_dev, (data_interface_num = union_header->bSlaveInterface0));
601 if (!control_interface || !data_interface) {
602 dev_dbg(&intf->dev,"no interfaces\n");
607 if (data_interface_num != call_interface_num)
608 dev_dbg(&intf->dev,"Seperate call control interface. That is not fully supported.");
610 if (usb_interface_claimed(data_interface)) { /* valid in this context */
611 dev_dbg(&intf->dev,"The data interface isn't available\n");
615 /*workaround for switched interfaces */
616 if (data_interface->cur_altsetting->desc.bInterfaceClass != CDC_DATA_INTERFACE_TYPE) {
617 if (control_interface->cur_altsetting->desc.bInterfaceClass == CDC_DATA_INTERFACE_TYPE) {
618 struct usb_interface *t;
619 dev_dbg(&intf->dev,"Your device has switched interfaces.\n");
621 t = control_interface;
622 control_interface = data_interface;
628 if (data_interface->cur_altsetting->desc.bNumEndpoints < 2)
631 epctrl = &control_interface->cur_altsetting->endpoint[0].desc;
632 epread = &data_interface->cur_altsetting->endpoint[0].desc;
633 epwrite = &data_interface->cur_altsetting->endpoint[1].desc;
636 /* workaround for switched endpoints */
637 if ((epread->bEndpointAddress & USB_DIR_IN) != USB_DIR_IN) {
638 /* descriptors are swapped */
639 struct usb_endpoint_descriptor *t;
640 dev_dbg(&intf->dev,"The data interface has switched endpoints\n");
646 dbg("interfaces are valid");
647 for (minor = 0; minor < ACM_TTY_MINORS && acm_table[minor]; minor++);
649 if (minor == ACM_TTY_MINORS) {
650 err("no more free acm devices");
654 if (!(acm = kmalloc(sizeof(struct acm), GFP_KERNEL))) {
655 dev_dbg(&intf->dev, "out of memory (acm kmalloc)\n");
658 memset(acm, 0, sizeof(struct acm));
660 ctrlsize = epctrl->wMaxPacketSize;
661 readsize = epread->wMaxPacketSize;
662 acm->writesize = epwrite->wMaxPacketSize;
663 acm->control = control_interface;
664 acm->data = data_interface;
667 acm->ctrl_caps = ac_management_function;
668 acm->ctrlsize = ctrlsize;
669 acm->readsize = readsize;
670 acm->bh.func = acm_rx_tasklet;
671 acm->bh.data = (unsigned long) acm;
672 INIT_WORK(&acm->work, acm_softint, acm);
673 spin_lock_init(&acm->throttle_lock);
674 acm->ready_for_write = 1;
676 buf = usb_buffer_alloc(usb_dev, ctrlsize, GFP_KERNEL, &acm->ctrl_dma);
678 dev_dbg(&intf->dev, "out of memory (ctrl buffer alloc)\n");
681 acm->ctrl_buffer = buf;
683 buf = usb_buffer_alloc(usb_dev, readsize, GFP_KERNEL, &acm->read_dma);
685 dev_dbg(&intf->dev, "out of memory (read buffer alloc)\n");
688 acm->read_buffer = buf;
690 buf = usb_buffer_alloc(usb_dev, acm->writesize, GFP_KERNEL, &acm->write_dma);
692 dev_dbg(&intf->dev, "out of memory (write buffer alloc)\n");
695 acm->write_buffer = buf;
697 acm->ctrlurb = usb_alloc_urb(0, GFP_KERNEL);
699 dev_dbg(&intf->dev, "out of memory (ctrlurb kmalloc)\n");
702 acm->readurb = usb_alloc_urb(0, GFP_KERNEL);
704 dev_dbg(&intf->dev, "out of memory (readurb kmalloc)\n");
707 acm->writeurb = usb_alloc_urb(0, GFP_KERNEL);
708 if (!acm->writeurb) {
709 dev_dbg(&intf->dev, "out of memory (writeurb kmalloc)\n");
713 usb_fill_int_urb(acm->ctrlurb, usb_dev, usb_rcvintpipe(usb_dev, epctrl->bEndpointAddress),
714 acm->ctrl_buffer, ctrlsize, acm_ctrl_irq, acm, epctrl->bInterval);
715 acm->ctrlurb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
716 acm->ctrlurb->transfer_dma = acm->ctrl_dma;
718 usb_fill_bulk_urb(acm->readurb, usb_dev, usb_rcvbulkpipe(usb_dev, epread->bEndpointAddress),
719 acm->read_buffer, readsize, acm_read_bulk, acm);
720 acm->readurb->transfer_flags |= URB_NO_FSBR | URB_NO_TRANSFER_DMA_MAP;
721 acm->readurb->transfer_dma = acm->read_dma;
723 usb_fill_bulk_urb(acm->writeurb, usb_dev, usb_sndbulkpipe(usb_dev, epwrite->bEndpointAddress),
724 acm->write_buffer, acm->writesize, acm_write_bulk, acm);
725 acm->writeurb->transfer_flags |= URB_NO_FSBR | URB_NO_TRANSFER_DMA_MAP;
726 acm->writeurb->transfer_dma = acm->write_dma;
728 dev_info(&intf->dev, "ttyACM%d: USB ACM device\n", minor);
730 acm_set_control(acm, acm->ctrlout);
732 acm->line.speed = cpu_to_le32(9600);
733 acm->line.databits = 8;
734 acm_set_line(acm, &acm->line);
736 usb_driver_claim_interface(&acm_driver, data_interface, acm);
738 tty_register_device(acm_tty_driver, minor, &intf->dev);
740 acm_table[minor] = acm;
741 usb_set_intfdata (intf, acm);
745 usb_free_urb(acm->readurb);
747 usb_free_urb(acm->ctrlurb);
749 usb_buffer_free(usb_dev, acm->writesize, acm->write_buffer, acm->write_dma);
751 usb_buffer_free(usb_dev, readsize, acm->read_buffer, acm->read_dma);
753 usb_buffer_free(usb_dev, ctrlsize, acm->ctrl_buffer, acm->ctrl_dma);
760 static void acm_disconnect(struct usb_interface *intf)
762 struct acm *acm = usb_get_intfdata (intf);
763 struct usb_device *usb_dev = interface_to_usbdev(intf);
765 if (!acm || !acm->dev) {
766 dbg("disconnect on nonexisting interface");
772 usb_set_intfdata (intf, NULL);
774 usb_kill_urb(acm->ctrlurb);
775 usb_kill_urb(acm->readurb);
776 usb_kill_urb(acm->writeurb);
778 flush_scheduled_work(); /* wait for acm_softint */
780 usb_buffer_free(usb_dev, acm->writesize, acm->write_buffer, acm->write_dma);
781 usb_buffer_free(usb_dev, acm->readsize, acm->read_buffer, acm->read_dma);
782 usb_buffer_free(usb_dev, acm->ctrlsize, acm->ctrl_buffer, acm->ctrl_dma);
784 usb_driver_release_interface(&acm_driver, acm->data);
787 tty_unregister_device(acm_tty_driver, acm->minor);
788 acm_table[acm->minor] = NULL;
789 usb_free_urb(acm->ctrlurb);
790 usb_free_urb(acm->readurb);
791 usb_free_urb(acm->writeurb);
800 tty_hangup(acm->tty);
804 * USB driver structure.
807 static struct usb_device_id acm_ids[] = {
808 /* control interfaces with various AT-command sets */
809 { USB_INTERFACE_INFO(USB_CLASS_COMM, 2, 1) },
810 { USB_INTERFACE_INFO(USB_CLASS_COMM, 2, 2) },
811 { USB_INTERFACE_INFO(USB_CLASS_COMM, 2, 3) },
812 { USB_INTERFACE_INFO(USB_CLASS_COMM, 2, 4) },
813 { USB_INTERFACE_INFO(USB_CLASS_COMM, 2, 5) },
814 { USB_INTERFACE_INFO(USB_CLASS_COMM, 2, 6) },
816 /* NOTE: COMM/2/0xff is likely MSFT RNDIS ... NOT a modem!! */
820 MODULE_DEVICE_TABLE (usb, acm_ids);
822 static struct usb_driver acm_driver = {
823 .owner = THIS_MODULE,
826 .disconnect = acm_disconnect,
831 * TTY driver structures.
834 static struct tty_operations acm_ops = {
835 .open = acm_tty_open,
836 .close = acm_tty_close,
837 .write = acm_tty_write,
838 .write_room = acm_tty_write_room,
839 .ioctl = acm_tty_ioctl,
840 .throttle = acm_tty_throttle,
841 .unthrottle = acm_tty_unthrottle,
842 .chars_in_buffer = acm_tty_chars_in_buffer,
843 .break_ctl = acm_tty_break_ctl,
844 .set_termios = acm_tty_set_termios,
845 .tiocmget = acm_tty_tiocmget,
846 .tiocmset = acm_tty_tiocmset,
853 static int __init acm_init(void)
856 acm_tty_driver = alloc_tty_driver(ACM_TTY_MINORS);
859 acm_tty_driver->owner = THIS_MODULE,
860 acm_tty_driver->driver_name = "acm",
861 acm_tty_driver->name = "ttyACM",
862 acm_tty_driver->devfs_name = "usb/acm/",
863 acm_tty_driver->major = ACM_TTY_MAJOR,
864 acm_tty_driver->minor_start = 0,
865 acm_tty_driver->type = TTY_DRIVER_TYPE_SERIAL,
866 acm_tty_driver->subtype = SERIAL_TYPE_NORMAL,
867 acm_tty_driver->flags = TTY_DRIVER_REAL_RAW | TTY_DRIVER_NO_DEVFS,
868 acm_tty_driver->init_termios = tty_std_termios;
869 acm_tty_driver->init_termios.c_cflag = B9600 | CS8 | CREAD | HUPCL | CLOCAL;
870 tty_set_operations(acm_tty_driver, &acm_ops);
872 retval = tty_register_driver(acm_tty_driver);
874 put_tty_driver(acm_tty_driver);
878 retval = usb_register(&acm_driver);
880 tty_unregister_driver(acm_tty_driver);
881 put_tty_driver(acm_tty_driver);
885 info(DRIVER_VERSION ":" DRIVER_DESC);
890 static void __exit acm_exit(void)
892 usb_deregister(&acm_driver);
893 tty_unregister_driver(acm_tty_driver);
894 put_tty_driver(acm_tty_driver);
897 module_init(acm_init);
898 module_exit(acm_exit);
900 MODULE_AUTHOR( DRIVER_AUTHOR );
901 MODULE_DESCRIPTION( DRIVER_DESC );
902 MODULE_LICENSE("GPL");