Linux-2.6.12-rc2
[linux-flexiantxendom0-natty.git] / drivers / usb / class / cdc-acm.c
1 /*
2  * cdc-acm.c
3  *
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  *
10  * USB Abstract Control Model driver for USB modems and ISDN adapters
11  *
12  * Sponsored by SuSE
13  *
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
32  */
33
34 /*
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.
39  *
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.
44  *
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
48  */
49
50 #undef DEBUG
51
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>
66
67 #include "cdc-acm.h"
68
69 /*
70  * Version Information
71  */
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"
75
76 static struct usb_driver acm_driver;
77 static struct tty_driver *acm_tty_driver;
78 static struct acm *acm_table[ACM_TTY_MINORS];
79
80 static DECLARE_MUTEX(open_sem);
81
82 #define ACM_READY(acm)  (acm && acm->dev && acm->used)
83
84 /*
85  * Functions for ACM control messages.
86  */
87
88 static int acm_ctrl_msg(struct acm *acm, int request, int value, void *buf, int len)
89 {
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;
96 }
97
98 /* devices aren't required to support these requests.
99  * the cdc acm descriptor tells whether they do...
100  */
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)
107
108 /*
109  * Interrupt handlers for various ACM device responses
110  */
111
112 /* control interface reports status changes with "interrupt" transfers */
113 static void acm_ctrl_irq(struct urb *urb, struct pt_regs *regs)
114 {
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;
120
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;
134         }
135
136         if (!ACM_READY(acm))
137                 goto exit;
138
139         data = (unsigned char *)(dr + 1);
140         switch (dr->bNotificationType) {
141
142                 case USB_CDC_NOTIFY_NETWORK_CONNECTION:
143
144                         dbg("%s network", dr->wValue ? "connected to" : "disconnected from");
145                         break;
146
147                 case USB_CDC_NOTIFY_SERIAL_STATE:
148
149                         newctrl = le16_to_cpu(get_unaligned((__le16 *) data));
150
151                         if (acm->tty && !acm->clocal && (acm->ctrlin & ~newctrl & ACM_CTRL_DCD)) {
152                                 dbg("calling hangup");
153                                 tty_hangup(acm->tty);
154                         }
155
156                         acm->ctrlin = newctrl;
157
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 ? '+' : '-');
163
164                         break;
165
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;
171         }
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);
177 }
178
179 /* data interface returns incoming bytes, or we got unthrottled */
180 static void acm_read_bulk(struct urb *urb, struct pt_regs *regs)
181 {
182         struct acm *acm = urb->context;
183         dbg("Entering acm_read_bulk with status %d\n", urb->status);
184
185         if (!ACM_READY(acm))
186                 return;
187
188         if (urb->status)
189                 dev_dbg(&acm->data->dev, "bulk rx status %d\n", urb->status);
190
191         /* calling tty_flip_buffer_push() in_irq() isn't allowed */
192         tasklet_schedule(&acm->bh);
193 }
194
195 static void acm_rx_tasklet(unsigned long _acm)
196 {
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");
203
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);
210                         }
211                         tty_insert_flip_char(tty, data[i], 0);
212                 }
213                 dbg("Handed %d bytes to tty layer", i+1);
214                 tty_flip_buffer_push(tty);
215         }
216
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;
225         }
226         spin_unlock(&acm->throttle_lock);
227
228         urb->actual_length = 0;
229         urb->dev = acm->dev;
230
231         i = usb_submit_urb(urb, GFP_ATOMIC);
232         if (i)
233                 dev_dbg(&acm->data->dev, "bulk rx resubmit %d\n", i);
234 }
235
236 /* data interface wrote those outgoing bytes */
237 static void acm_write_bulk(struct urb *urb, struct pt_regs *regs)
238 {
239         struct acm *acm = (struct acm *)urb->context;
240         dbg("Entering acm_write_bulk with status %d\n", urb->status);
241
242         if (!ACM_READY(acm))
243                 goto out;
244
245         if (urb->status)
246                 dbg("nonzero write bulk status received: %d", urb->status);
247
248         schedule_work(&acm->work);
249 out:
250         acm->ready_for_write = 1;
251 }
252
253 static void acm_softint(void *private)
254 {
255         struct acm *acm = private;
256         dbg("Entering acm_softint.\n");
257         
258         if (!ACM_READY(acm))
259                 return;
260         tty_wakeup(acm->tty);
261 }
262
263 /*
264  * TTY handlers
265  */
266
267 static int acm_tty_open(struct tty_struct *tty, struct file *filp)
268 {
269         struct acm *acm;
270         int rv = -EINVAL;
271         dbg("Entering acm_tty_open.\n");
272         
273         down(&open_sem);
274
275         acm = acm_table[tty->index];
276         if (!acm || !acm->dev)
277                 goto err_out;
278         else
279                 rv = 0;
280
281         tty->driver_data = acm;
282         acm->tty = tty;
283
284
285
286         if (acm->used++) {
287                 goto done;
288         }
289
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;
294         }
295
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;
300         }
301
302         if (0 > acm_set_control(acm, acm->ctrlout = ACM_CTRL_DTR | ACM_CTRL_RTS))
303                 goto full_bailout;
304
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;
308
309 done:
310 err_out:
311         up(&open_sem);
312         return rv;
313
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;
322 }
323
324 static void acm_tty_close(struct tty_struct *tty, struct file *filp)
325 {
326         struct acm *acm = tty->driver_data;
327
328         if (!acm || !acm->used)
329                 return;
330
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);
345                 }
346         }
347         up(&open_sem);
348 }
349
350 static int acm_tty_write(struct tty_struct *tty, const unsigned char *buf, int count)
351 {
352         struct acm *acm = tty->driver_data;
353         int stat;
354         dbg("Entering acm_tty_write to write %d bytes,\n", count);
355
356         if (!ACM_READY(acm))
357                 return -EINVAL;
358         if (!acm->ready_for_write)
359                 return 0;
360         if (!count)
361                 return 0;
362
363         count = (count > acm->writesize) ? acm->writesize : count;
364
365         dbg("Get %d bytes...", count);
366         memcpy(acm->write_buffer, buf, count);
367         dbg("  Successfully copied.\n");
368
369         acm->writeurb->transfer_buffer_length = count;
370         acm->writeurb->dev = acm->dev;
371
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;
378         }
379
380         return count;
381 }
382
383 static int acm_tty_write_room(struct tty_struct *tty)
384 {
385         struct acm *acm = tty->driver_data;
386         if (!ACM_READY(acm))
387                 return -EINVAL;
388         return !acm->ready_for_write ? 0 : acm->writesize;
389 }
390
391 static int acm_tty_chars_in_buffer(struct tty_struct *tty)
392 {
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;
397 }
398
399 static void acm_tty_throttle(struct tty_struct *tty)
400 {
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);
407 }
408
409 static void acm_tty_unthrottle(struct tty_struct *tty)
410 {
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);
420         }
421 }
422
423 static void acm_tty_break_ctl(struct tty_struct *tty, int state)
424 {
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");
430 }
431
432 static int acm_tty_tiocmget(struct tty_struct *tty, struct file *file)
433 {
434         struct acm *acm = tty->driver_data;
435
436         if (!ACM_READY(acm))
437                 return -EINVAL;
438
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;
445 }
446
447 static int acm_tty_tiocmset(struct tty_struct *tty, struct file *file,
448                             unsigned int set, unsigned int clear)
449 {
450         struct acm *acm = tty->driver_data;
451         unsigned int newctrl;
452
453         if (!ACM_READY(acm))
454                 return -EINVAL;
455
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);
459
460         newctrl = (newctrl & ~clear) | set;
461
462         if (acm->ctrlout == newctrl)
463                 return 0;
464         return acm_set_control(acm, acm->ctrlout = newctrl);
465 }
466
467 static int acm_tty_ioctl(struct tty_struct *tty, struct file *file, unsigned int cmd, unsigned long arg)
468 {
469         struct acm *acm = tty->driver_data;
470
471         if (!ACM_READY(acm))
472                 return -EINVAL;
473
474         return -ENOIOCTLCMD;
475 }
476
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
483 };
484
485 static __u8 acm_tty_size[] = {
486         5, 6, 7, 8
487 };
488
489 static void acm_tty_set_termios(struct tty_struct *tty, struct termios *termios_old)
490 {
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;
495
496         if (!ACM_READY(acm))
497                 return;
498
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];
505
506         acm->clocal = ((termios->c_cflag & CLOCAL) != 0);
507
508         if (!newline.dwDTERate) {
509                 newline.dwDTERate = acm->line.dwDTERate;
510                 newctrl &= ~ACM_CTRL_DTR;
511         } else  newctrl |=  ACM_CTRL_DTR;
512
513         if (newctrl != acm->ctrlout)
514                 acm_set_control(acm, acm->ctrlout = newctrl);
515
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);
522         }
523 }
524
525 /*
526  * USB probe and disconnect routines.
527  */
528
529 static int acm_probe (struct usb_interface *intf,
530                       const struct usb_device_id *id)
531 {
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;
550
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;
557         }
558         
559         /* normal probing*/
560         if (!buffer) {
561                 err("Wierd descriptor references\n");
562                 return -EINVAL;
563         }
564
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;
573                 }
574         }
575
576         while (buflen > 0) {
577                 if (buffer [1] != USB_DT_CS_INTERFACE) {
578                         err("skipping garbage\n");
579                         goto next_desc;
580                 }
581
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;
587                                 }
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;
604                                 
605                         default:
606                                 err("Ignoring extra header, type %d, length %d", buffer[2], buffer[0]);
607                                 break;
608                         }
609 next_desc:
610                 buflen -= buffer[0];
611                 buffer += buffer[0];
612         }
613
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;
622                 }
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;
629                 }
630         }
631         
632         if (data_interface_num != call_interface_num)
633                 dev_dbg(&intf->dev,"Seperate call control interface. That is not fully supported.\n");
634
635 skip_normal_probe:
636
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");
642
643                         t = control_interface;
644                         control_interface = data_interface;
645                         data_interface = t;
646                 } else {
647                         return -EINVAL;
648                 }
649         }
650         
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;
654         }
655
656
657         if (data_interface->cur_altsetting->desc.bNumEndpoints < 2)
658                 return -EINVAL;
659
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;
663
664
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");
670                 
671                 t = epread;
672                 epread = epwrite;
673                 epwrite = t;
674         }
675         dbg("interfaces are valid");
676         for (minor = 0; minor < ACM_TTY_MINORS && acm_table[minor]; minor++);
677
678         if (minor == ACM_TTY_MINORS) {
679                 err("no more free acm devices");
680                 return -ENODEV;
681         }
682
683         if (!(acm = kmalloc(sizeof(struct acm), GFP_KERNEL))) {
684                 dev_dbg(&intf->dev, "out of memory (acm kmalloc)\n");
685                 goto alloc_fail;
686         }
687         memset(acm, 0, sizeof(struct acm));
688
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;
704
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;
709         }
710         acm->ctrl_buffer = buf;
711
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;
716         }
717         acm->read_buffer = buf;
718
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;
723         }
724         acm->write_buffer = buf;        
725
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;
730         }
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;
735         }
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;
740         }
741
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;
746
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;
751
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;
756
757         dev_info(&intf->dev, "ttyACM%d: USB ACM device\n", minor);
758
759         acm_set_control(acm, acm->ctrlout);
760
761         acm->line.dwDTERate = cpu_to_le32(9600);
762         acm->line.bDataBits = 8;
763         acm_set_line(acm, &acm->line);
764
765         usb_driver_claim_interface(&acm_driver, data_interface, acm);
766
767         tty_register_device(acm_tty_driver, minor, &intf->dev);
768
769         acm_table[minor] = acm;
770         usb_set_intfdata (intf, acm);
771         return 0;
772
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;
787 }
788
789 static void acm_disconnect(struct usb_interface *intf)
790 {
791         struct acm *acm = usb_get_intfdata (intf);
792         struct usb_device *usb_dev = interface_to_usbdev(intf);
793
794         if (!acm || !acm->dev) {
795                 dbg("disconnect on nonexisting interface");
796                 return;
797         }
798
799         down(&open_sem);
800         acm->dev = NULL;
801         usb_set_intfdata (intf, NULL);
802
803         usb_kill_urb(acm->ctrlurb);
804         usb_kill_urb(acm->readurb);
805         usb_kill_urb(acm->writeurb);
806
807         flush_scheduled_work(); /* wait for acm_softint */
808
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);
812
813         usb_driver_release_interface(&acm_driver, acm->data);
814
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;
824         }
825
826         up(&open_sem);
827
828         if (acm->tty)
829                 tty_hangup(acm->tty);
830 }
831
832 /*
833  * USB driver structure.
834  */
835
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 */
840         },
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) },
854
855         /* NOTE:  COMM/ACM/0xff is likely MSFT RNDIS ... NOT a modem!! */
856         { }
857 };
858
859 MODULE_DEVICE_TABLE (usb, acm_ids);
860
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,
867 };
868
869 /*
870  * TTY driver structures.
871  */
872
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,
886 };
887
888 /*
889  * Init / exit.
890  */
891
892 static int __init acm_init(void)
893 {
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);
910
911         retval = tty_register_driver(acm_tty_driver);
912         if (retval) {
913                 put_tty_driver(acm_tty_driver);
914                 return retval;
915         }
916
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;
922         }
923
924         info(DRIVER_VERSION ":" DRIVER_DESC);
925
926         return 0;
927 }
928
929 static void __exit acm_exit(void)
930 {
931         usb_deregister(&acm_driver);
932         tty_unregister_driver(acm_tty_driver);
933         put_tty_driver(acm_tty_driver);
934 }
935
936 module_init(acm_init);
937 module_exit(acm_exit);
938
939 MODULE_AUTHOR( DRIVER_AUTHOR );
940 MODULE_DESCRIPTION( DRIVER_DESC );
941 MODULE_LICENSE("GPL");
942