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)
266 dbg("Entering acm_tty_open.\n");
270 acm = acm_table[tty->index];
271 if (!acm || !acm->dev)
276 tty->driver_data = acm;
285 acm->ctrlurb->dev = acm->dev;
286 if (usb_submit_urb(acm->ctrlurb, GFP_KERNEL)) {
287 dbg("usb_submit_urb(ctrl irq) failed");
291 acm->readurb->dev = acm->dev;
292 if (usb_submit_urb(acm->readurb, GFP_KERNEL)) {
293 dbg("usb_submit_urb(read bulk) failed");
294 goto bail_out_and_unlink;
297 if (0 > acm_set_control(acm, acm->ctrlout = ACM_CTRL_DTR | ACM_CTRL_RTS))
300 /* force low_latency on so that our tty_push actually forces the data through,
301 otherwise it is scheduled, and with high data rates data can get lost. */
302 tty->low_latency = 1;
310 usb_kill_urb(acm->readurb);
312 usb_kill_urb(acm->ctrlurb);
319 static void acm_tty_close(struct tty_struct *tty, struct file *filp)
321 struct acm *acm = tty->driver_data;
323 if (!acm || !acm->used)
329 acm_set_control(acm, acm->ctrlout = 0);
330 usb_kill_urb(acm->ctrlurb);
331 usb_kill_urb(acm->writeurb);
332 usb_kill_urb(acm->readurb);
334 tty_unregister_device(acm_tty_driver, acm->minor);
335 acm_table[acm->minor] = NULL;
336 usb_free_urb(acm->ctrlurb);
337 usb_free_urb(acm->readurb);
338 usb_free_urb(acm->writeurb);
345 static int acm_tty_write(struct tty_struct *tty, const unsigned char *buf, int count)
347 struct acm *acm = tty->driver_data;
349 dbg("Entering acm_tty_write to write %d bytes,\n", count);
353 if (!acm->ready_for_write)
358 count = (count > acm->writesize) ? acm->writesize : count;
360 dbg("Get %d bytes...", count);
361 memcpy(acm->write_buffer, buf, count);
362 dbg(" Successfully copied.\n");
364 acm->writeurb->transfer_buffer_length = count;
365 acm->writeurb->dev = acm->dev;
367 acm->ready_for_write = 0;
368 stat = usb_submit_urb(acm->writeurb, GFP_ATOMIC);
370 dbg("usb_submit_urb(write bulk) failed");
371 acm->ready_for_write = 1;
378 static int acm_tty_write_room(struct tty_struct *tty)
380 struct acm *acm = tty->driver_data;
383 return !acm->ready_for_write ? 0 : acm->writesize;
386 static int acm_tty_chars_in_buffer(struct tty_struct *tty)
388 struct acm *acm = tty->driver_data;
391 return !acm->ready_for_write ? acm->writeurb->transfer_buffer_length : 0;
394 static void acm_tty_throttle(struct tty_struct *tty)
396 struct acm *acm = tty->driver_data;
399 spin_lock_bh(&acm->throttle_lock);
401 spin_unlock_bh(&acm->throttle_lock);
404 static void acm_tty_unthrottle(struct tty_struct *tty)
406 struct acm *acm = tty->driver_data;
409 spin_lock_bh(&acm->throttle_lock);
411 spin_unlock_bh(&acm->throttle_lock);
412 if (acm->resubmit_to_unthrottle) {
413 acm->resubmit_to_unthrottle = 0;
414 acm_read_bulk(acm->readurb, NULL);
418 static void acm_tty_break_ctl(struct tty_struct *tty, int state)
420 struct acm *acm = tty->driver_data;
423 if (acm_send_break(acm, state ? 0xffff : 0))
424 dbg("send break failed");
427 static int acm_tty_tiocmget(struct tty_struct *tty, struct file *file)
429 struct acm *acm = tty->driver_data;
434 return (acm->ctrlout & ACM_CTRL_DTR ? TIOCM_DTR : 0) |
435 (acm->ctrlout & ACM_CTRL_RTS ? TIOCM_RTS : 0) |
436 (acm->ctrlin & ACM_CTRL_DSR ? TIOCM_DSR : 0) |
437 (acm->ctrlin & ACM_CTRL_RI ? TIOCM_RI : 0) |
438 (acm->ctrlin & ACM_CTRL_DCD ? TIOCM_CD : 0) |
442 static int acm_tty_tiocmset(struct tty_struct *tty, struct file *file,
443 unsigned int set, unsigned int clear)
445 struct acm *acm = tty->driver_data;
446 unsigned int newctrl;
451 newctrl = acm->ctrlout;
452 set = (set & TIOCM_DTR ? ACM_CTRL_DTR : 0) | (set & TIOCM_RTS ? ACM_CTRL_RTS : 0);
453 clear = (clear & TIOCM_DTR ? ACM_CTRL_DTR : 0) | (clear & TIOCM_RTS ? ACM_CTRL_RTS : 0);
455 newctrl = (newctrl & ~clear) | set;
457 if (acm->ctrlout == newctrl)
459 return acm_set_control(acm, acm->ctrlout = newctrl);
462 static int acm_tty_ioctl(struct tty_struct *tty, struct file *file, unsigned int cmd, unsigned long arg)
464 struct acm *acm = tty->driver_data;
472 static __u32 acm_tty_speed[] = {
473 0, 50, 75, 110, 134, 150, 200, 300, 600,
474 1200, 1800, 2400, 4800, 9600, 19200, 38400,
475 57600, 115200, 230400, 460800, 500000, 576000,
476 921600, 1000000, 1152000, 1500000, 2000000,
477 2500000, 3000000, 3500000, 4000000
480 static __u8 acm_tty_size[] = {
484 static void acm_tty_set_termios(struct tty_struct *tty, struct termios *termios_old)
486 struct acm *acm = tty->driver_data;
487 struct termios *termios = tty->termios;
488 struct acm_line newline;
489 int newctrl = acm->ctrlout;
494 newline.speed = cpu_to_le32p(acm_tty_speed +
495 (termios->c_cflag & CBAUD & ~CBAUDEX) + (termios->c_cflag & CBAUDEX ? 15 : 0));
496 newline.stopbits = termios->c_cflag & CSTOPB ? 2 : 0;
497 newline.parity = termios->c_cflag & PARENB ?
498 (termios->c_cflag & PARODD ? 1 : 2) + (termios->c_cflag & CMSPAR ? 2 : 0) : 0;
499 newline.databits = acm_tty_size[(termios->c_cflag & CSIZE) >> 4];
501 acm->clocal = ((termios->c_cflag & CLOCAL) != 0);
503 if (!newline.speed) {
504 newline.speed = acm->line.speed;
505 newctrl &= ~ACM_CTRL_DTR;
506 } else newctrl |= ACM_CTRL_DTR;
508 if (newctrl != acm->ctrlout)
509 acm_set_control(acm, acm->ctrlout = newctrl);
511 if (memcmp(&acm->line, &newline, sizeof(struct acm_line))) {
512 memcpy(&acm->line, &newline, sizeof(struct acm_line));
513 dbg("set line: %d %d %d %d", newline.speed, newline.stopbits, newline.parity, newline.databits);
514 acm_set_line(acm, &acm->line);
519 * USB probe and disconnect routines.
522 static int acm_probe (struct usb_interface *intf,
523 const struct usb_device_id *id)
525 struct union_desc *union_header = NULL;
526 char *buffer = intf->altsetting->extra;
527 int buflen = intf->altsetting->extralen;
528 struct usb_interface *control_interface;
529 struct usb_interface *data_interface;
530 struct usb_endpoint_descriptor *epctrl;
531 struct usb_endpoint_descriptor *epread;
532 struct usb_endpoint_descriptor *epwrite;
533 struct usb_device *usb_dev = interface_to_usbdev(intf);
536 int ctrlsize,readsize;
538 u8 ac_management_function = 0;
539 u8 call_management_function = 0;
540 int call_interface_num = -1;
541 int data_interface_num;
542 unsigned long quirks;
544 /* handle quirks deadly to normal probing*/
545 quirks = (unsigned long)id->driver_info;
546 if (quirks == NO_UNION_NORMAL) {
547 data_interface = usb_ifnum_to_if(usb_dev, 1);
548 control_interface = usb_ifnum_to_if(usb_dev, 0);
549 goto skip_normal_probe;
554 err("Wierd descriptor references\n");
559 if (intf->cur_altsetting->endpoint->extralen && intf->cur_altsetting->endpoint->extra) {
560 dev_dbg(&intf->dev,"Seeking extra descriptors on endpoint\n");
561 buflen = intf->cur_altsetting->endpoint->extralen;
562 buffer = intf->cur_altsetting->endpoint->extra;
564 err("Zero length descriptor references\n");
570 if (buffer [1] != USB_DT_CS_INTERFACE) {
571 err("skipping garbage\n");
575 switch (buffer [2]) {
576 case CDC_UNION_TYPE: /* we've found it */
578 err("More than one union descriptor, skipping ...");
581 union_header = (struct union_desc *)buffer;
583 case CDC_COUNTRY_TYPE: /* maybe somehow export */
584 break; /* for now we ignore it */
585 case CDC_HEADER_TYPE: /* maybe check version */
586 break; /* for now we ignore it */
587 case CDC_AC_MANAGEMENT_TYPE:
588 ac_management_function = buffer[3];
590 case CDC_CALL_MANAGEMENT_TYPE:
591 call_management_function = buffer[3];
592 call_interface_num = buffer[4];
593 if ((call_management_function & 3) != 3)
594 err("This device cannot do calls on its own. It is no modem.");
598 err("Ignoring extra header, type %d, length %d", buffer[2], buffer[0]);
607 if (call_interface_num > 0) {
608 dev_dbg(&intf->dev,"No union descriptor, using call management descriptor\n");
609 data_interface = usb_ifnum_to_if(usb_dev, (data_interface_num = call_interface_num));
610 control_interface = intf;
612 dev_dbg(&intf->dev,"No union descriptor, giving up\n");
616 control_interface = usb_ifnum_to_if(usb_dev, union_header->bMasterInterface0);
617 data_interface = usb_ifnum_to_if(usb_dev, (data_interface_num = union_header->bSlaveInterface0));
618 if (!control_interface || !data_interface) {
619 dev_dbg(&intf->dev,"no interfaces\n");
624 if (data_interface_num != call_interface_num)
625 dev_dbg(&intf->dev,"Seperate call control interface. That is not fully supported.\n");
629 /*workaround for switched interfaces */
630 if (data_interface->cur_altsetting->desc.bInterfaceClass != CDC_DATA_INTERFACE_TYPE) {
631 if (control_interface->cur_altsetting->desc.bInterfaceClass == CDC_DATA_INTERFACE_TYPE) {
632 struct usb_interface *t;
633 dev_dbg(&intf->dev,"Your device has switched interfaces.\n");
635 t = control_interface;
636 control_interface = data_interface;
643 if (usb_interface_claimed(data_interface)) { /* valid in this context */
644 dev_dbg(&intf->dev,"The data interface isn't available\n");
649 if (data_interface->cur_altsetting->desc.bNumEndpoints < 2)
652 epctrl = &control_interface->cur_altsetting->endpoint[0].desc;
653 epread = &data_interface->cur_altsetting->endpoint[0].desc;
654 epwrite = &data_interface->cur_altsetting->endpoint[1].desc;
657 /* workaround for switched endpoints */
658 if ((epread->bEndpointAddress & USB_DIR_IN) != USB_DIR_IN) {
659 /* descriptors are swapped */
660 struct usb_endpoint_descriptor *t;
661 dev_dbg(&intf->dev,"The data interface has switched endpoints\n");
667 dbg("interfaces are valid");
668 for (minor = 0; minor < ACM_TTY_MINORS && acm_table[minor]; minor++);
670 if (minor == ACM_TTY_MINORS) {
671 err("no more free acm devices");
675 if (!(acm = kmalloc(sizeof(struct acm), GFP_KERNEL))) {
676 dev_dbg(&intf->dev, "out of memory (acm kmalloc)\n");
679 memset(acm, 0, sizeof(struct acm));
681 ctrlsize = le16_to_cpu(epctrl->wMaxPacketSize);
682 readsize = le16_to_cpu(epread->wMaxPacketSize);
683 acm->writesize = le16_to_cpu(epwrite->wMaxPacketSize);
684 acm->control = control_interface;
685 acm->data = data_interface;
688 acm->ctrl_caps = ac_management_function;
689 acm->ctrlsize = ctrlsize;
690 acm->readsize = readsize;
691 acm->bh.func = acm_rx_tasklet;
692 acm->bh.data = (unsigned long) acm;
693 INIT_WORK(&acm->work, acm_softint, acm);
694 spin_lock_init(&acm->throttle_lock);
695 acm->ready_for_write = 1;
697 buf = usb_buffer_alloc(usb_dev, ctrlsize, GFP_KERNEL, &acm->ctrl_dma);
699 dev_dbg(&intf->dev, "out of memory (ctrl buffer alloc)\n");
702 acm->ctrl_buffer = buf;
704 buf = usb_buffer_alloc(usb_dev, readsize, GFP_KERNEL, &acm->read_dma);
706 dev_dbg(&intf->dev, "out of memory (read buffer alloc)\n");
709 acm->read_buffer = buf;
711 buf = usb_buffer_alloc(usb_dev, acm->writesize, GFP_KERNEL, &acm->write_dma);
713 dev_dbg(&intf->dev, "out of memory (write buffer alloc)\n");
716 acm->write_buffer = buf;
718 acm->ctrlurb = usb_alloc_urb(0, GFP_KERNEL);
720 dev_dbg(&intf->dev, "out of memory (ctrlurb kmalloc)\n");
723 acm->readurb = usb_alloc_urb(0, GFP_KERNEL);
725 dev_dbg(&intf->dev, "out of memory (readurb kmalloc)\n");
728 acm->writeurb = usb_alloc_urb(0, GFP_KERNEL);
729 if (!acm->writeurb) {
730 dev_dbg(&intf->dev, "out of memory (writeurb kmalloc)\n");
734 usb_fill_int_urb(acm->ctrlurb, usb_dev, usb_rcvintpipe(usb_dev, epctrl->bEndpointAddress),
735 acm->ctrl_buffer, ctrlsize, acm_ctrl_irq, acm, epctrl->bInterval);
736 acm->ctrlurb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
737 acm->ctrlurb->transfer_dma = acm->ctrl_dma;
739 usb_fill_bulk_urb(acm->readurb, usb_dev, usb_rcvbulkpipe(usb_dev, epread->bEndpointAddress),
740 acm->read_buffer, readsize, acm_read_bulk, acm);
741 acm->readurb->transfer_flags |= URB_NO_FSBR | URB_NO_TRANSFER_DMA_MAP;
742 acm->readurb->transfer_dma = acm->read_dma;
744 usb_fill_bulk_urb(acm->writeurb, usb_dev, usb_sndbulkpipe(usb_dev, epwrite->bEndpointAddress),
745 acm->write_buffer, acm->writesize, acm_write_bulk, acm);
746 acm->writeurb->transfer_flags |= URB_NO_FSBR | URB_NO_TRANSFER_DMA_MAP;
747 acm->writeurb->transfer_dma = acm->write_dma;
749 dev_info(&intf->dev, "ttyACM%d: USB ACM device\n", minor);
751 acm_set_control(acm, acm->ctrlout);
753 acm->line.speed = cpu_to_le32(9600);
754 acm->line.databits = 8;
755 acm_set_line(acm, &acm->line);
757 usb_driver_claim_interface(&acm_driver, data_interface, acm);
759 tty_register_device(acm_tty_driver, minor, &intf->dev);
761 acm_table[minor] = acm;
762 usb_set_intfdata (intf, acm);
766 usb_free_urb(acm->readurb);
768 usb_free_urb(acm->ctrlurb);
770 usb_buffer_free(usb_dev, acm->writesize, acm->write_buffer, acm->write_dma);
772 usb_buffer_free(usb_dev, readsize, acm->read_buffer, acm->read_dma);
774 usb_buffer_free(usb_dev, ctrlsize, acm->ctrl_buffer, acm->ctrl_dma);
781 static void acm_disconnect(struct usb_interface *intf)
783 struct acm *acm = usb_get_intfdata (intf);
784 struct usb_device *usb_dev = interface_to_usbdev(intf);
786 if (!acm || !acm->dev) {
787 dbg("disconnect on nonexisting interface");
793 usb_set_intfdata (intf, NULL);
795 usb_kill_urb(acm->ctrlurb);
796 usb_kill_urb(acm->readurb);
797 usb_kill_urb(acm->writeurb);
799 flush_scheduled_work(); /* wait for acm_softint */
801 usb_buffer_free(usb_dev, acm->writesize, acm->write_buffer, acm->write_dma);
802 usb_buffer_free(usb_dev, acm->readsize, acm->read_buffer, acm->read_dma);
803 usb_buffer_free(usb_dev, acm->ctrlsize, acm->ctrl_buffer, acm->ctrl_dma);
805 usb_driver_release_interface(&acm_driver, acm->data);
808 tty_unregister_device(acm_tty_driver, acm->minor);
809 acm_table[acm->minor] = NULL;
810 usb_free_urb(acm->ctrlurb);
811 usb_free_urb(acm->readurb);
812 usb_free_urb(acm->writeurb);
821 tty_hangup(acm->tty);
825 * USB driver structure.
828 static struct usb_device_id acm_ids[] = {
829 /* quirky and broken devices */
830 { USB_DEVICE(0x0870, 0x0001), /* Metricom GS Modem */
831 .driver_info = NO_UNION_NORMAL, /* has no union descriptor */
833 /* control interfaces with various AT-command sets */
834 { USB_INTERFACE_INFO(USB_CLASS_COMM, 2, 1) },
835 { USB_INTERFACE_INFO(USB_CLASS_COMM, 2, 2) },
836 { USB_INTERFACE_INFO(USB_CLASS_COMM, 2, 3) },
837 { USB_INTERFACE_INFO(USB_CLASS_COMM, 2, 4) },
838 { USB_INTERFACE_INFO(USB_CLASS_COMM, 2, 5) },
839 { USB_INTERFACE_INFO(USB_CLASS_COMM, 2, 6) },
841 /* NOTE: COMM/2/0xff is likely MSFT RNDIS ... NOT a modem!! */
845 MODULE_DEVICE_TABLE (usb, acm_ids);
847 static struct usb_driver acm_driver = {
848 .owner = THIS_MODULE,
851 .disconnect = acm_disconnect,
856 * TTY driver structures.
859 static struct tty_operations acm_ops = {
860 .open = acm_tty_open,
861 .close = acm_tty_close,
862 .write = acm_tty_write,
863 .write_room = acm_tty_write_room,
864 .ioctl = acm_tty_ioctl,
865 .throttle = acm_tty_throttle,
866 .unthrottle = acm_tty_unthrottle,
867 .chars_in_buffer = acm_tty_chars_in_buffer,
868 .break_ctl = acm_tty_break_ctl,
869 .set_termios = acm_tty_set_termios,
870 .tiocmget = acm_tty_tiocmget,
871 .tiocmset = acm_tty_tiocmset,
878 static int __init acm_init(void)
881 acm_tty_driver = alloc_tty_driver(ACM_TTY_MINORS);
884 acm_tty_driver->owner = THIS_MODULE,
885 acm_tty_driver->driver_name = "acm",
886 acm_tty_driver->name = "ttyACM",
887 acm_tty_driver->devfs_name = "usb/acm/",
888 acm_tty_driver->major = ACM_TTY_MAJOR,
889 acm_tty_driver->minor_start = 0,
890 acm_tty_driver->type = TTY_DRIVER_TYPE_SERIAL,
891 acm_tty_driver->subtype = SERIAL_TYPE_NORMAL,
892 acm_tty_driver->flags = TTY_DRIVER_REAL_RAW | TTY_DRIVER_NO_DEVFS,
893 acm_tty_driver->init_termios = tty_std_termios;
894 acm_tty_driver->init_termios.c_cflag = B9600 | CS8 | CREAD | HUPCL | CLOCAL;
895 tty_set_operations(acm_tty_driver, &acm_ops);
897 retval = tty_register_driver(acm_tty_driver);
899 put_tty_driver(acm_tty_driver);
903 retval = usb_register(&acm_driver);
905 tty_unregister_driver(acm_tty_driver);
906 put_tty_driver(acm_tty_driver);
910 info(DRIVER_VERSION ":" DRIVER_DESC);
915 static void __exit acm_exit(void)
917 usb_deregister(&acm_driver);
918 tty_unregister_driver(acm_tty_driver);
919 put_tty_driver(acm_tty_driver);
922 module_init(acm_init);
923 module_exit(acm_exit);
925 MODULE_AUTHOR( DRIVER_AUTHOR );
926 MODULE_DESCRIPTION( DRIVER_DESC );
927 MODULE_LICENSE("GPL");