Linux-2.6.12-rc2
[linux-2.6/linux-acpi-2.6/ibm-acpi-2.6.git] / drivers / usb / class / cdc-acm.c
blob6d1f9b6aecff7d68bb57b2a2b5a2274e4f3e624c
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>
10 * USB Abstract Control Model driver for USB modems and ISDN adapters
12 * Sponsored by SuSE
14 * ChangeLog:
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
50 #undef DEBUG
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 <linux/usb_cdc.h>
64 #include <asm/byteorder.h>
65 #include <asm/unaligned.h>
67 #include "cdc-acm.h"
70 * Version Information
72 #define DRIVER_VERSION "v0.23"
73 #define DRIVER_AUTHOR "Armin Fuerst, Pavel Machek, Johannes Erdfelt, Vojtech Pavlik"
74 #define DRIVER_DESC "USB Abstract Control Model driver for USB modems and ISDN adapters"
76 static struct usb_driver acm_driver;
77 static struct tty_driver *acm_tty_driver;
78 static struct acm *acm_table[ACM_TTY_MINORS];
80 static DECLARE_MUTEX(open_sem);
82 #define ACM_READY(acm) (acm && acm->dev && acm->used)
85 * Functions for ACM control messages.
88 static int acm_ctrl_msg(struct acm *acm, int request, int value, void *buf, int len)
90 int retval = usb_control_msg(acm->dev, usb_sndctrlpipe(acm->dev, 0),
91 request, USB_RT_ACM, value,
92 acm->control->altsetting[0].desc.bInterfaceNumber,
93 buf, len, 5000);
94 dbg("acm_control_msg: rq: 0x%02x val: %#x len: %#x result: %d", request, value, len, retval);
95 return retval < 0 ? retval : 0;
98 /* devices aren't required to support these requests.
99 * the cdc acm descriptor tells whether they do...
101 #define acm_set_control(acm, control) \
102 acm_ctrl_msg(acm, USB_CDC_REQ_SET_CONTROL_LINE_STATE, control, NULL, 0)
103 #define acm_set_line(acm, line) \
104 acm_ctrl_msg(acm, USB_CDC_REQ_SET_LINE_CODING, 0, line, sizeof *(line))
105 #define acm_send_break(acm, ms) \
106 acm_ctrl_msg(acm, USB_CDC_REQ_SEND_BREAK, ms, NULL, 0)
109 * Interrupt handlers for various ACM device responses
112 /* control interface reports status changes with "interrupt" transfers */
113 static void acm_ctrl_irq(struct urb *urb, struct pt_regs *regs)
115 struct acm *acm = urb->context;
116 struct usb_cdc_notification *dr = urb->transfer_buffer;
117 unsigned char *data;
118 int newctrl;
119 int status;
121 switch (urb->status) {
122 case 0:
123 /* success */
124 break;
125 case -ECONNRESET:
126 case -ENOENT:
127 case -ESHUTDOWN:
128 /* this urb is terminated, clean up */
129 dbg("%s - urb shutting down with status: %d", __FUNCTION__, urb->status);
130 return;
131 default:
132 dbg("%s - nonzero urb status received: %d", __FUNCTION__, urb->status);
133 goto exit;
136 if (!ACM_READY(acm))
137 goto exit;
139 data = (unsigned char *)(dr + 1);
140 switch (dr->bNotificationType) {
142 case USB_CDC_NOTIFY_NETWORK_CONNECTION:
144 dbg("%s network", dr->wValue ? "connected to" : "disconnected from");
145 break;
147 case USB_CDC_NOTIFY_SERIAL_STATE:
149 newctrl = le16_to_cpu(get_unaligned((__le16 *) data));
151 if (acm->tty && !acm->clocal && (acm->ctrlin & ~newctrl & ACM_CTRL_DCD)) {
152 dbg("calling hangup");
153 tty_hangup(acm->tty);
156 acm->ctrlin = newctrl;
158 dbg("input control lines: dcd%c dsr%c break%c ring%c framing%c parity%c overrun%c",
159 acm->ctrlin & ACM_CTRL_DCD ? '+' : '-', acm->ctrlin & ACM_CTRL_DSR ? '+' : '-',
160 acm->ctrlin & ACM_CTRL_BRK ? '+' : '-', acm->ctrlin & ACM_CTRL_RI ? '+' : '-',
161 acm->ctrlin & ACM_CTRL_FRAMING ? '+' : '-', acm->ctrlin & ACM_CTRL_PARITY ? '+' : '-',
162 acm->ctrlin & ACM_CTRL_OVERRUN ? '+' : '-');
164 break;
166 default:
167 dbg("unknown notification %d received: index %d len %d data0 %d data1 %d",
168 dr->bNotificationType, dr->wIndex,
169 dr->wLength, data[0], data[1]);
170 break;
172 exit:
173 status = usb_submit_urb (urb, GFP_ATOMIC);
174 if (status)
175 err ("%s - usb_submit_urb failed with result %d",
176 __FUNCTION__, status);
179 /* data interface returns incoming bytes, or we got unthrottled */
180 static void acm_read_bulk(struct urb *urb, struct pt_regs *regs)
182 struct acm *acm = urb->context;
183 dbg("Entering acm_read_bulk with status %d\n", urb->status);
185 if (!ACM_READY(acm))
186 return;
188 if (urb->status)
189 dev_dbg(&acm->data->dev, "bulk rx status %d\n", urb->status);
191 /* calling tty_flip_buffer_push() in_irq() isn't allowed */
192 tasklet_schedule(&acm->bh);
195 static void acm_rx_tasklet(unsigned long _acm)
197 struct acm *acm = (void *)_acm;
198 struct urb *urb = acm->readurb;
199 struct tty_struct *tty = acm->tty;
200 unsigned char *data = urb->transfer_buffer;
201 int i = 0;
202 dbg("Entering acm_rx_tasklet");
204 if (urb->actual_length > 0 && !acm->throttle) {
205 for (i = 0; i < urb->actual_length && !acm->throttle; i++) {
206 /* if we insert more than TTY_FLIPBUF_SIZE characters,
207 * we drop them. */
208 if (tty->flip.count >= TTY_FLIPBUF_SIZE) {
209 tty_flip_buffer_push(tty);
211 tty_insert_flip_char(tty, data[i], 0);
213 dbg("Handed %d bytes to tty layer", i+1);
214 tty_flip_buffer_push(tty);
217 spin_lock(&acm->throttle_lock);
218 if (acm->throttle) {
219 dbg("Throtteling noticed");
220 memmove(data, data + i, urb->actual_length - i);
221 urb->actual_length -= i;
222 acm->resubmit_to_unthrottle = 1;
223 spin_unlock(&acm->throttle_lock);
224 return;
226 spin_unlock(&acm->throttle_lock);
228 urb->actual_length = 0;
229 urb->dev = acm->dev;
231 i = usb_submit_urb(urb, GFP_ATOMIC);
232 if (i)
233 dev_dbg(&acm->data->dev, "bulk rx resubmit %d\n", i);
236 /* data interface wrote those outgoing bytes */
237 static void acm_write_bulk(struct urb *urb, struct pt_regs *regs)
239 struct acm *acm = (struct acm *)urb->context;
240 dbg("Entering acm_write_bulk with status %d\n", urb->status);
242 if (!ACM_READY(acm))
243 goto out;
245 if (urb->status)
246 dbg("nonzero write bulk status received: %d", urb->status);
248 schedule_work(&acm->work);
249 out:
250 acm->ready_for_write = 1;
253 static void acm_softint(void *private)
255 struct acm *acm = private;
256 dbg("Entering acm_softint.\n");
258 if (!ACM_READY(acm))
259 return;
260 tty_wakeup(acm->tty);
264 * TTY handlers
267 static int acm_tty_open(struct tty_struct *tty, struct file *filp)
269 struct acm *acm;
270 int rv = -EINVAL;
271 dbg("Entering acm_tty_open.\n");
273 down(&open_sem);
275 acm = acm_table[tty->index];
276 if (!acm || !acm->dev)
277 goto err_out;
278 else
279 rv = 0;
281 tty->driver_data = acm;
282 acm->tty = tty;
286 if (acm->used++) {
287 goto done;
290 acm->ctrlurb->dev = acm->dev;
291 if (usb_submit_urb(acm->ctrlurb, GFP_KERNEL)) {
292 dbg("usb_submit_urb(ctrl irq) failed");
293 goto bail_out;
296 acm->readurb->dev = acm->dev;
297 if (usb_submit_urb(acm->readurb, GFP_KERNEL)) {
298 dbg("usb_submit_urb(read bulk) failed");
299 goto bail_out_and_unlink;
302 if (0 > acm_set_control(acm, acm->ctrlout = ACM_CTRL_DTR | ACM_CTRL_RTS))
303 goto full_bailout;
305 /* force low_latency on so that our tty_push actually forces the data through,
306 otherwise it is scheduled, and with high data rates data can get lost. */
307 tty->low_latency = 1;
309 done:
310 err_out:
311 up(&open_sem);
312 return rv;
314 full_bailout:
315 usb_kill_urb(acm->readurb);
316 bail_out_and_unlink:
317 usb_kill_urb(acm->ctrlurb);
318 bail_out:
319 acm->used--;
320 up(&open_sem);
321 return -EIO;
324 static void acm_tty_close(struct tty_struct *tty, struct file *filp)
326 struct acm *acm = tty->driver_data;
328 if (!acm || !acm->used)
329 return;
331 down(&open_sem);
332 if (!--acm->used) {
333 if (acm->dev) {
334 acm_set_control(acm, acm->ctrlout = 0);
335 usb_kill_urb(acm->ctrlurb);
336 usb_kill_urb(acm->writeurb);
337 usb_kill_urb(acm->readurb);
338 } else {
339 tty_unregister_device(acm_tty_driver, acm->minor);
340 acm_table[acm->minor] = NULL;
341 usb_free_urb(acm->ctrlurb);
342 usb_free_urb(acm->readurb);
343 usb_free_urb(acm->writeurb);
344 kfree(acm);
347 up(&open_sem);
350 static int acm_tty_write(struct tty_struct *tty, const unsigned char *buf, int count)
352 struct acm *acm = tty->driver_data;
353 int stat;
354 dbg("Entering acm_tty_write to write %d bytes,\n", count);
356 if (!ACM_READY(acm))
357 return -EINVAL;
358 if (!acm->ready_for_write)
359 return 0;
360 if (!count)
361 return 0;
363 count = (count > acm->writesize) ? acm->writesize : count;
365 dbg("Get %d bytes...", count);
366 memcpy(acm->write_buffer, buf, count);
367 dbg(" Successfully copied.\n");
369 acm->writeurb->transfer_buffer_length = count;
370 acm->writeurb->dev = acm->dev;
372 acm->ready_for_write = 0;
373 stat = usb_submit_urb(acm->writeurb, GFP_ATOMIC);
374 if (stat < 0) {
375 dbg("usb_submit_urb(write bulk) failed");
376 acm->ready_for_write = 1;
377 return stat;
380 return count;
383 static int acm_tty_write_room(struct tty_struct *tty)
385 struct acm *acm = tty->driver_data;
386 if (!ACM_READY(acm))
387 return -EINVAL;
388 return !acm->ready_for_write ? 0 : acm->writesize;
391 static int acm_tty_chars_in_buffer(struct tty_struct *tty)
393 struct acm *acm = tty->driver_data;
394 if (!ACM_READY(acm))
395 return -EINVAL;
396 return !acm->ready_for_write ? acm->writeurb->transfer_buffer_length : 0;
399 static void acm_tty_throttle(struct tty_struct *tty)
401 struct acm *acm = tty->driver_data;
402 if (!ACM_READY(acm))
403 return;
404 spin_lock_bh(&acm->throttle_lock);
405 acm->throttle = 1;
406 spin_unlock_bh(&acm->throttle_lock);
409 static void acm_tty_unthrottle(struct tty_struct *tty)
411 struct acm *acm = tty->driver_data;
412 if (!ACM_READY(acm))
413 return;
414 spin_lock_bh(&acm->throttle_lock);
415 acm->throttle = 0;
416 spin_unlock_bh(&acm->throttle_lock);
417 if (acm->resubmit_to_unthrottle) {
418 acm->resubmit_to_unthrottle = 0;
419 acm_read_bulk(acm->readurb, NULL);
423 static void acm_tty_break_ctl(struct tty_struct *tty, int state)
425 struct acm *acm = tty->driver_data;
426 if (!ACM_READY(acm))
427 return;
428 if (acm_send_break(acm, state ? 0xffff : 0))
429 dbg("send break failed");
432 static int acm_tty_tiocmget(struct tty_struct *tty, struct file *file)
434 struct acm *acm = tty->driver_data;
436 if (!ACM_READY(acm))
437 return -EINVAL;
439 return (acm->ctrlout & ACM_CTRL_DTR ? TIOCM_DTR : 0) |
440 (acm->ctrlout & ACM_CTRL_RTS ? TIOCM_RTS : 0) |
441 (acm->ctrlin & ACM_CTRL_DSR ? TIOCM_DSR : 0) |
442 (acm->ctrlin & ACM_CTRL_RI ? TIOCM_RI : 0) |
443 (acm->ctrlin & ACM_CTRL_DCD ? TIOCM_CD : 0) |
444 TIOCM_CTS;
447 static int acm_tty_tiocmset(struct tty_struct *tty, struct file *file,
448 unsigned int set, unsigned int clear)
450 struct acm *acm = tty->driver_data;
451 unsigned int newctrl;
453 if (!ACM_READY(acm))
454 return -EINVAL;
456 newctrl = acm->ctrlout;
457 set = (set & TIOCM_DTR ? ACM_CTRL_DTR : 0) | (set & TIOCM_RTS ? ACM_CTRL_RTS : 0);
458 clear = (clear & TIOCM_DTR ? ACM_CTRL_DTR : 0) | (clear & TIOCM_RTS ? ACM_CTRL_RTS : 0);
460 newctrl = (newctrl & ~clear) | set;
462 if (acm->ctrlout == newctrl)
463 return 0;
464 return acm_set_control(acm, acm->ctrlout = newctrl);
467 static int acm_tty_ioctl(struct tty_struct *tty, struct file *file, unsigned int cmd, unsigned long arg)
469 struct acm *acm = tty->driver_data;
471 if (!ACM_READY(acm))
472 return -EINVAL;
474 return -ENOIOCTLCMD;
477 static __u32 acm_tty_speed[] = {
478 0, 50, 75, 110, 134, 150, 200, 300, 600,
479 1200, 1800, 2400, 4800, 9600, 19200, 38400,
480 57600, 115200, 230400, 460800, 500000, 576000,
481 921600, 1000000, 1152000, 1500000, 2000000,
482 2500000, 3000000, 3500000, 4000000
485 static __u8 acm_tty_size[] = {
486 5, 6, 7, 8
489 static void acm_tty_set_termios(struct tty_struct *tty, struct termios *termios_old)
491 struct acm *acm = tty->driver_data;
492 struct termios *termios = tty->termios;
493 struct usb_cdc_line_coding newline;
494 int newctrl = acm->ctrlout;
496 if (!ACM_READY(acm))
497 return;
499 newline.dwDTERate = cpu_to_le32p(acm_tty_speed +
500 (termios->c_cflag & CBAUD & ~CBAUDEX) + (termios->c_cflag & CBAUDEX ? 15 : 0));
501 newline.bCharFormat = termios->c_cflag & CSTOPB ? 2 : 0;
502 newline.bParityType = termios->c_cflag & PARENB ?
503 (termios->c_cflag & PARODD ? 1 : 2) + (termios->c_cflag & CMSPAR ? 2 : 0) : 0;
504 newline.bDataBits = acm_tty_size[(termios->c_cflag & CSIZE) >> 4];
506 acm->clocal = ((termios->c_cflag & CLOCAL) != 0);
508 if (!newline.dwDTERate) {
509 newline.dwDTERate = acm->line.dwDTERate;
510 newctrl &= ~ACM_CTRL_DTR;
511 } else newctrl |= ACM_CTRL_DTR;
513 if (newctrl != acm->ctrlout)
514 acm_set_control(acm, acm->ctrlout = newctrl);
516 if (memcmp(&acm->line, &newline, sizeof newline)) {
517 memcpy(&acm->line, &newline, sizeof newline);
518 dbg("set line: %d %d %d %d", le32_to_cpu(newline.dwDTERate),
519 newline.bCharFormat, newline.bParityType,
520 newline.bDataBits);
521 acm_set_line(acm, &acm->line);
526 * USB probe and disconnect routines.
529 static int acm_probe (struct usb_interface *intf,
530 const struct usb_device_id *id)
532 struct usb_cdc_union_desc *union_header = NULL;
533 char *buffer = intf->altsetting->extra;
534 int buflen = intf->altsetting->extralen;
535 struct usb_interface *control_interface;
536 struct usb_interface *data_interface;
537 struct usb_endpoint_descriptor *epctrl;
538 struct usb_endpoint_descriptor *epread;
539 struct usb_endpoint_descriptor *epwrite;
540 struct usb_device *usb_dev = interface_to_usbdev(intf);
541 struct acm *acm;
542 int minor;
543 int ctrlsize,readsize;
544 u8 *buf;
545 u8 ac_management_function = 0;
546 u8 call_management_function = 0;
547 int call_interface_num = -1;
548 int data_interface_num;
549 unsigned long quirks;
551 /* handle quirks deadly to normal probing*/
552 quirks = (unsigned long)id->driver_info;
553 if (quirks == NO_UNION_NORMAL) {
554 data_interface = usb_ifnum_to_if(usb_dev, 1);
555 control_interface = usb_ifnum_to_if(usb_dev, 0);
556 goto skip_normal_probe;
559 /* normal probing*/
560 if (!buffer) {
561 err("Wierd descriptor references\n");
562 return -EINVAL;
565 if (!buflen) {
566 if (intf->cur_altsetting->endpoint->extralen && intf->cur_altsetting->endpoint->extra) {
567 dev_dbg(&intf->dev,"Seeking extra descriptors on endpoint\n");
568 buflen = intf->cur_altsetting->endpoint->extralen;
569 buffer = intf->cur_altsetting->endpoint->extra;
570 } else {
571 err("Zero length descriptor references\n");
572 return -EINVAL;
576 while (buflen > 0) {
577 if (buffer [1] != USB_DT_CS_INTERFACE) {
578 err("skipping garbage\n");
579 goto next_desc;
582 switch (buffer [2]) {
583 case USB_CDC_UNION_TYPE: /* we've found it */
584 if (union_header) {
585 err("More than one union descriptor, skipping ...");
586 goto next_desc;
588 union_header = (struct usb_cdc_union_desc *)
589 buffer;
590 break;
591 case USB_CDC_COUNTRY_TYPE: /* maybe somehow export */
592 break; /* for now we ignore it */
593 case USB_CDC_HEADER_TYPE: /* maybe check version */
594 break; /* for now we ignore it */
595 case USB_CDC_ACM_TYPE:
596 ac_management_function = buffer[3];
597 break;
598 case USB_CDC_CALL_MANAGEMENT_TYPE:
599 call_management_function = buffer[3];
600 call_interface_num = buffer[4];
601 if ((call_management_function & 3) != 3)
602 err("This device cannot do calls on its own. It is no modem.");
603 break;
605 default:
606 err("Ignoring extra header, type %d, length %d", buffer[2], buffer[0]);
607 break;
609 next_desc:
610 buflen -= buffer[0];
611 buffer += buffer[0];
614 if (!union_header) {
615 if (call_interface_num > 0) {
616 dev_dbg(&intf->dev,"No union descriptor, using call management descriptor\n");
617 data_interface = usb_ifnum_to_if(usb_dev, (data_interface_num = call_interface_num));
618 control_interface = intf;
619 } else {
620 dev_dbg(&intf->dev,"No union descriptor, giving up\n");
621 return -ENODEV;
623 } else {
624 control_interface = usb_ifnum_to_if(usb_dev, union_header->bMasterInterface0);
625 data_interface = usb_ifnum_to_if(usb_dev, (data_interface_num = union_header->bSlaveInterface0));
626 if (!control_interface || !data_interface) {
627 dev_dbg(&intf->dev,"no interfaces\n");
628 return -ENODEV;
632 if (data_interface_num != call_interface_num)
633 dev_dbg(&intf->dev,"Seperate call control interface. That is not fully supported.\n");
635 skip_normal_probe:
637 /*workaround for switched interfaces */
638 if (data_interface->cur_altsetting->desc.bInterfaceClass != CDC_DATA_INTERFACE_TYPE) {
639 if (control_interface->cur_altsetting->desc.bInterfaceClass == CDC_DATA_INTERFACE_TYPE) {
640 struct usb_interface *t;
641 dev_dbg(&intf->dev,"Your device has switched interfaces.\n");
643 t = control_interface;
644 control_interface = data_interface;
645 data_interface = t;
646 } else {
647 return -EINVAL;
651 if (usb_interface_claimed(data_interface)) { /* valid in this context */
652 dev_dbg(&intf->dev,"The data interface isn't available\n");
653 return -EBUSY;
657 if (data_interface->cur_altsetting->desc.bNumEndpoints < 2)
658 return -EINVAL;
660 epctrl = &control_interface->cur_altsetting->endpoint[0].desc;
661 epread = &data_interface->cur_altsetting->endpoint[0].desc;
662 epwrite = &data_interface->cur_altsetting->endpoint[1].desc;
665 /* workaround for switched endpoints */
666 if ((epread->bEndpointAddress & USB_DIR_IN) != USB_DIR_IN) {
667 /* descriptors are swapped */
668 struct usb_endpoint_descriptor *t;
669 dev_dbg(&intf->dev,"The data interface has switched endpoints\n");
671 t = epread;
672 epread = epwrite;
673 epwrite = t;
675 dbg("interfaces are valid");
676 for (minor = 0; minor < ACM_TTY_MINORS && acm_table[minor]; minor++);
678 if (minor == ACM_TTY_MINORS) {
679 err("no more free acm devices");
680 return -ENODEV;
683 if (!(acm = kmalloc(sizeof(struct acm), GFP_KERNEL))) {
684 dev_dbg(&intf->dev, "out of memory (acm kmalloc)\n");
685 goto alloc_fail;
687 memset(acm, 0, sizeof(struct acm));
689 ctrlsize = le16_to_cpu(epctrl->wMaxPacketSize);
690 readsize = le16_to_cpu(epread->wMaxPacketSize);
691 acm->writesize = le16_to_cpu(epwrite->wMaxPacketSize);
692 acm->control = control_interface;
693 acm->data = data_interface;
694 acm->minor = minor;
695 acm->dev = usb_dev;
696 acm->ctrl_caps = ac_management_function;
697 acm->ctrlsize = ctrlsize;
698 acm->readsize = readsize;
699 acm->bh.func = acm_rx_tasklet;
700 acm->bh.data = (unsigned long) acm;
701 INIT_WORK(&acm->work, acm_softint, acm);
702 spin_lock_init(&acm->throttle_lock);
703 acm->ready_for_write = 1;
705 buf = usb_buffer_alloc(usb_dev, ctrlsize, GFP_KERNEL, &acm->ctrl_dma);
706 if (!buf) {
707 dev_dbg(&intf->dev, "out of memory (ctrl buffer alloc)\n");
708 goto alloc_fail2;
710 acm->ctrl_buffer = buf;
712 buf = usb_buffer_alloc(usb_dev, readsize, GFP_KERNEL, &acm->read_dma);
713 if (!buf) {
714 dev_dbg(&intf->dev, "out of memory (read buffer alloc)\n");
715 goto alloc_fail3;
717 acm->read_buffer = buf;
719 buf = usb_buffer_alloc(usb_dev, acm->writesize, GFP_KERNEL, &acm->write_dma);
720 if (!buf) {
721 dev_dbg(&intf->dev, "out of memory (write buffer alloc)\n");
722 goto alloc_fail4;
724 acm->write_buffer = buf;
726 acm->ctrlurb = usb_alloc_urb(0, GFP_KERNEL);
727 if (!acm->ctrlurb) {
728 dev_dbg(&intf->dev, "out of memory (ctrlurb kmalloc)\n");
729 goto alloc_fail5;
731 acm->readurb = usb_alloc_urb(0, GFP_KERNEL);
732 if (!acm->readurb) {
733 dev_dbg(&intf->dev, "out of memory (readurb kmalloc)\n");
734 goto alloc_fail6;
736 acm->writeurb = usb_alloc_urb(0, GFP_KERNEL);
737 if (!acm->writeurb) {
738 dev_dbg(&intf->dev, "out of memory (writeurb kmalloc)\n");
739 goto alloc_fail7;
742 usb_fill_int_urb(acm->ctrlurb, usb_dev, usb_rcvintpipe(usb_dev, epctrl->bEndpointAddress),
743 acm->ctrl_buffer, ctrlsize, acm_ctrl_irq, acm, epctrl->bInterval);
744 acm->ctrlurb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
745 acm->ctrlurb->transfer_dma = acm->ctrl_dma;
747 usb_fill_bulk_urb(acm->readurb, usb_dev, usb_rcvbulkpipe(usb_dev, epread->bEndpointAddress),
748 acm->read_buffer, readsize, acm_read_bulk, acm);
749 acm->readurb->transfer_flags |= URB_NO_FSBR | URB_NO_TRANSFER_DMA_MAP;
750 acm->readurb->transfer_dma = acm->read_dma;
752 usb_fill_bulk_urb(acm->writeurb, usb_dev, usb_sndbulkpipe(usb_dev, epwrite->bEndpointAddress),
753 acm->write_buffer, acm->writesize, acm_write_bulk, acm);
754 acm->writeurb->transfer_flags |= URB_NO_FSBR | URB_NO_TRANSFER_DMA_MAP;
755 acm->writeurb->transfer_dma = acm->write_dma;
757 dev_info(&intf->dev, "ttyACM%d: USB ACM device\n", minor);
759 acm_set_control(acm, acm->ctrlout);
761 acm->line.dwDTERate = cpu_to_le32(9600);
762 acm->line.bDataBits = 8;
763 acm_set_line(acm, &acm->line);
765 usb_driver_claim_interface(&acm_driver, data_interface, acm);
767 tty_register_device(acm_tty_driver, minor, &intf->dev);
769 acm_table[minor] = acm;
770 usb_set_intfdata (intf, acm);
771 return 0;
773 alloc_fail7:
774 usb_free_urb(acm->readurb);
775 alloc_fail6:
776 usb_free_urb(acm->ctrlurb);
777 alloc_fail5:
778 usb_buffer_free(usb_dev, acm->writesize, acm->write_buffer, acm->write_dma);
779 alloc_fail4:
780 usb_buffer_free(usb_dev, readsize, acm->read_buffer, acm->read_dma);
781 alloc_fail3:
782 usb_buffer_free(usb_dev, ctrlsize, acm->ctrl_buffer, acm->ctrl_dma);
783 alloc_fail2:
784 kfree(acm);
785 alloc_fail:
786 return -ENOMEM;
789 static void acm_disconnect(struct usb_interface *intf)
791 struct acm *acm = usb_get_intfdata (intf);
792 struct usb_device *usb_dev = interface_to_usbdev(intf);
794 if (!acm || !acm->dev) {
795 dbg("disconnect on nonexisting interface");
796 return;
799 down(&open_sem);
800 acm->dev = NULL;
801 usb_set_intfdata (intf, NULL);
803 usb_kill_urb(acm->ctrlurb);
804 usb_kill_urb(acm->readurb);
805 usb_kill_urb(acm->writeurb);
807 flush_scheduled_work(); /* wait for acm_softint */
809 usb_buffer_free(usb_dev, acm->writesize, acm->write_buffer, acm->write_dma);
810 usb_buffer_free(usb_dev, acm->readsize, acm->read_buffer, acm->read_dma);
811 usb_buffer_free(usb_dev, acm->ctrlsize, acm->ctrl_buffer, acm->ctrl_dma);
813 usb_driver_release_interface(&acm_driver, acm->data);
815 if (!acm->used) {
816 tty_unregister_device(acm_tty_driver, acm->minor);
817 acm_table[acm->minor] = NULL;
818 usb_free_urb(acm->ctrlurb);
819 usb_free_urb(acm->readurb);
820 usb_free_urb(acm->writeurb);
821 kfree(acm);
822 up(&open_sem);
823 return;
826 up(&open_sem);
828 if (acm->tty)
829 tty_hangup(acm->tty);
833 * USB driver structure.
836 static struct usb_device_id acm_ids[] = {
837 /* quirky and broken devices */
838 { USB_DEVICE(0x0870, 0x0001), /* Metricom GS Modem */
839 .driver_info = NO_UNION_NORMAL, /* has no union descriptor */
841 /* control interfaces with various AT-command sets */
842 { USB_INTERFACE_INFO(USB_CLASS_COMM, USB_CDC_SUBCLASS_ACM,
843 USB_CDC_ACM_PROTO_AT_V25TER) },
844 { USB_INTERFACE_INFO(USB_CLASS_COMM, USB_CDC_SUBCLASS_ACM,
845 USB_CDC_ACM_PROTO_AT_PCCA101) },
846 { USB_INTERFACE_INFO(USB_CLASS_COMM, USB_CDC_SUBCLASS_ACM,
847 USB_CDC_ACM_PROTO_AT_PCCA101_WAKE) },
848 { USB_INTERFACE_INFO(USB_CLASS_COMM, USB_CDC_SUBCLASS_ACM,
849 USB_CDC_ACM_PROTO_AT_GSM) },
850 { USB_INTERFACE_INFO(USB_CLASS_COMM, USB_CDC_SUBCLASS_ACM,
851 USB_CDC_ACM_PROTO_AT_3G ) },
852 { USB_INTERFACE_INFO(USB_CLASS_COMM, USB_CDC_SUBCLASS_ACM,
853 USB_CDC_ACM_PROTO_AT_CDMA) },
855 /* NOTE: COMM/ACM/0xff is likely MSFT RNDIS ... NOT a modem!! */
859 MODULE_DEVICE_TABLE (usb, acm_ids);
861 static struct usb_driver acm_driver = {
862 .owner = THIS_MODULE,
863 .name = "cdc_acm",
864 .probe = acm_probe,
865 .disconnect = acm_disconnect,
866 .id_table = acm_ids,
870 * TTY driver structures.
873 static struct tty_operations acm_ops = {
874 .open = acm_tty_open,
875 .close = acm_tty_close,
876 .write = acm_tty_write,
877 .write_room = acm_tty_write_room,
878 .ioctl = acm_tty_ioctl,
879 .throttle = acm_tty_throttle,
880 .unthrottle = acm_tty_unthrottle,
881 .chars_in_buffer = acm_tty_chars_in_buffer,
882 .break_ctl = acm_tty_break_ctl,
883 .set_termios = acm_tty_set_termios,
884 .tiocmget = acm_tty_tiocmget,
885 .tiocmset = acm_tty_tiocmset,
889 * Init / exit.
892 static int __init acm_init(void)
894 int retval;
895 acm_tty_driver = alloc_tty_driver(ACM_TTY_MINORS);
896 if (!acm_tty_driver)
897 return -ENOMEM;
898 acm_tty_driver->owner = THIS_MODULE,
899 acm_tty_driver->driver_name = "acm",
900 acm_tty_driver->name = "ttyACM",
901 acm_tty_driver->devfs_name = "usb/acm/",
902 acm_tty_driver->major = ACM_TTY_MAJOR,
903 acm_tty_driver->minor_start = 0,
904 acm_tty_driver->type = TTY_DRIVER_TYPE_SERIAL,
905 acm_tty_driver->subtype = SERIAL_TYPE_NORMAL,
906 acm_tty_driver->flags = TTY_DRIVER_REAL_RAW | TTY_DRIVER_NO_DEVFS,
907 acm_tty_driver->init_termios = tty_std_termios;
908 acm_tty_driver->init_termios.c_cflag = B9600 | CS8 | CREAD | HUPCL | CLOCAL;
909 tty_set_operations(acm_tty_driver, &acm_ops);
911 retval = tty_register_driver(acm_tty_driver);
912 if (retval) {
913 put_tty_driver(acm_tty_driver);
914 return retval;
917 retval = usb_register(&acm_driver);
918 if (retval) {
919 tty_unregister_driver(acm_tty_driver);
920 put_tty_driver(acm_tty_driver);
921 return retval;
924 info(DRIVER_VERSION ":" DRIVER_DESC);
926 return 0;
929 static void __exit acm_exit(void)
931 usb_deregister(&acm_driver);
932 tty_unregister_driver(acm_tty_driver);
933 put_tty_driver(acm_tty_driver);
936 module_init(acm_init);
937 module_exit(acm_exit);
939 MODULE_AUTHOR( DRIVER_AUTHOR );
940 MODULE_DESCRIPTION( DRIVER_DESC );
941 MODULE_LICENSE("GPL");