xref: /openbmc/linux/drivers/usb/class/cdc-acm.c (revision 1da177e4)
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 
943