xref: /linux/drivers/usb/class/cdc-acm.c (revision d67b569f5f620c0fb95d5212642746b7ba9d29e4)
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  * Write buffer management.
110  * All of these assume proper locks taken by the caller.
111  */
112 
113 static int acm_wb_alloc(struct acm *acm)
114 {
115 	int i, wbn;
116 	struct acm_wb *wb;
117 
118 	wbn = acm->write_current;
119 	i = 0;
120 	for (;;) {
121 		wb = &acm->wb[wbn];
122 		if (!wb->use) {
123 			wb->use = 1;
124 			return wbn;
125 		}
126 		wbn = (wbn + 1) % ACM_NWB;
127 		if (++i >= ACM_NWB)
128 			return -1;
129 	}
130 }
131 
132 static void acm_wb_free(struct acm *acm, int wbn)
133 {
134 	acm->wb[wbn].use = 0;
135 }
136 
137 static int acm_wb_is_avail(struct acm *acm)
138 {
139 	int i, n;
140 
141 	n = 0;
142 	for (i = 0; i < ACM_NWB; i++) {
143 		if (!acm->wb[i].use)
144 			n++;
145 	}
146 	return n;
147 }
148 
149 static inline int acm_wb_is_used(struct acm *acm, int wbn)
150 {
151 	return acm->wb[wbn].use;
152 }
153 
154 /*
155  * Finish write.
156  */
157 static void acm_write_done(struct acm *acm)
158 {
159 	unsigned long flags;
160 	int wbn;
161 
162 	spin_lock_irqsave(&acm->write_lock, flags);
163 	acm->write_ready = 1;
164 	wbn = acm->write_current;
165 	acm_wb_free(acm, wbn);
166 	acm->write_current = (wbn + 1) % ACM_NWB;
167 	spin_unlock_irqrestore(&acm->write_lock, flags);
168 }
169 
170 /*
171  * Poke write.
172  */
173 static int acm_write_start(struct acm *acm)
174 {
175 	unsigned long flags;
176 	int wbn;
177 	struct acm_wb *wb;
178 	int rc;
179 
180 	spin_lock_irqsave(&acm->write_lock, flags);
181 	if (!acm->dev) {
182 		spin_unlock_irqrestore(&acm->write_lock, flags);
183 		return -ENODEV;
184 	}
185 
186 	if (!acm->write_ready) {
187 		spin_unlock_irqrestore(&acm->write_lock, flags);
188 		return 0;	/* A white lie */
189 	}
190 
191 	wbn = acm->write_current;
192 	if (!acm_wb_is_used(acm, wbn)) {
193 		spin_unlock_irqrestore(&acm->write_lock, flags);
194 		return 0;
195 	}
196 	wb = &acm->wb[wbn];
197 
198 	acm->write_ready = 0;
199 	spin_unlock_irqrestore(&acm->write_lock, flags);
200 
201 	acm->writeurb->transfer_buffer = wb->buf;
202 	acm->writeurb->transfer_dma = wb->dmah;
203 	acm->writeurb->transfer_buffer_length = wb->len;
204 	acm->writeurb->dev = acm->dev;
205 
206 	if ((rc = usb_submit_urb(acm->writeurb, GFP_ATOMIC)) < 0) {
207 		dbg("usb_submit_urb(write bulk) failed: %d", rc);
208 		acm_write_done(acm);
209 	}
210 	return rc;
211 }
212 
213 /*
214  * Interrupt handlers for various ACM device responses
215  */
216 
217 /* control interface reports status changes with "interrupt" transfers */
218 static void acm_ctrl_irq(struct urb *urb, struct pt_regs *regs)
219 {
220 	struct acm *acm = urb->context;
221 	struct usb_cdc_notification *dr = urb->transfer_buffer;
222 	unsigned char *data;
223 	int newctrl;
224 	int status;
225 
226 	switch (urb->status) {
227 	case 0:
228 		/* success */
229 		break;
230 	case -ECONNRESET:
231 	case -ENOENT:
232 	case -ESHUTDOWN:
233 		/* this urb is terminated, clean up */
234 		dbg("%s - urb shutting down with status: %d", __FUNCTION__, urb->status);
235 		return;
236 	default:
237 		dbg("%s - nonzero urb status received: %d", __FUNCTION__, urb->status);
238 		goto exit;
239 	}
240 
241 	if (!ACM_READY(acm))
242 		goto exit;
243 
244 	data = (unsigned char *)(dr + 1);
245 	switch (dr->bNotificationType) {
246 
247 		case USB_CDC_NOTIFY_NETWORK_CONNECTION:
248 
249 			dbg("%s network", dr->wValue ? "connected to" : "disconnected from");
250 			break;
251 
252 		case USB_CDC_NOTIFY_SERIAL_STATE:
253 
254 			newctrl = le16_to_cpu(get_unaligned((__le16 *) data));
255 
256 			if (acm->tty && !acm->clocal && (acm->ctrlin & ~newctrl & ACM_CTRL_DCD)) {
257 				dbg("calling hangup");
258 				tty_hangup(acm->tty);
259 			}
260 
261 			acm->ctrlin = newctrl;
262 
263 			dbg("input control lines: dcd%c dsr%c break%c ring%c framing%c parity%c overrun%c",
264 				acm->ctrlin & ACM_CTRL_DCD ? '+' : '-',	acm->ctrlin & ACM_CTRL_DSR ? '+' : '-',
265 				acm->ctrlin & ACM_CTRL_BRK ? '+' : '-',	acm->ctrlin & ACM_CTRL_RI  ? '+' : '-',
266 				acm->ctrlin & ACM_CTRL_FRAMING ? '+' : '-',	acm->ctrlin & ACM_CTRL_PARITY ? '+' : '-',
267 				acm->ctrlin & ACM_CTRL_OVERRUN ? '+' : '-');
268 
269 			break;
270 
271 		default:
272 			dbg("unknown notification %d received: index %d len %d data0 %d data1 %d",
273 				dr->bNotificationType, dr->wIndex,
274 				dr->wLength, data[0], data[1]);
275 			break;
276 	}
277 exit:
278 	status = usb_submit_urb (urb, GFP_ATOMIC);
279 	if (status)
280 		err ("%s - usb_submit_urb failed with result %d",
281 		     __FUNCTION__, status);
282 }
283 
284 /* data interface returns incoming bytes, or we got unthrottled */
285 static void acm_read_bulk(struct urb *urb, struct pt_regs *regs)
286 {
287 	struct acm *acm = urb->context;
288 	dbg("Entering acm_read_bulk with status %d\n", urb->status);
289 
290 	if (!ACM_READY(acm))
291 		return;
292 
293 	if (urb->status)
294 		dev_dbg(&acm->data->dev, "bulk rx status %d\n", urb->status);
295 
296 	/* calling tty_flip_buffer_push() in_irq() isn't allowed */
297 	tasklet_schedule(&acm->bh);
298 }
299 
300 static void acm_rx_tasklet(unsigned long _acm)
301 {
302 	struct acm *acm = (void *)_acm;
303 	struct urb *urb = acm->readurb;
304 	struct tty_struct *tty = acm->tty;
305 	unsigned char *data = urb->transfer_buffer;
306 	int i = 0;
307 	dbg("Entering acm_rx_tasklet");
308 
309 	if (urb->actual_length > 0 && !acm->throttle)  {
310 		for (i = 0; i < urb->actual_length && !acm->throttle; i++) {
311 			/* if we insert more than TTY_FLIPBUF_SIZE characters,
312 			 * we drop them. */
313 			if (tty->flip.count >= TTY_FLIPBUF_SIZE) {
314 				tty_flip_buffer_push(tty);
315 			}
316 			tty_insert_flip_char(tty, data[i], 0);
317 		}
318 		dbg("Handed %d bytes to tty layer", i+1);
319 		tty_flip_buffer_push(tty);
320 	}
321 
322 	spin_lock(&acm->throttle_lock);
323 	if (acm->throttle) {
324 		dbg("Throtteling noticed");
325 		memmove(data, data + i, urb->actual_length - i);
326 		urb->actual_length -= i;
327 		acm->resubmit_to_unthrottle = 1;
328 		spin_unlock(&acm->throttle_lock);
329 		return;
330 	}
331 	spin_unlock(&acm->throttle_lock);
332 
333 	urb->actual_length = 0;
334 	urb->dev = acm->dev;
335 
336 	i = usb_submit_urb(urb, GFP_ATOMIC);
337 	if (i)
338 		dev_dbg(&acm->data->dev, "bulk rx resubmit %d\n", i);
339 }
340 
341 /* data interface wrote those outgoing bytes */
342 static void acm_write_bulk(struct urb *urb, struct pt_regs *regs)
343 {
344 	struct acm *acm = (struct acm *)urb->context;
345 
346 	dbg("Entering acm_write_bulk with status %d\n", urb->status);
347 
348 	acm_write_done(acm);
349 	acm_write_start(acm);
350 	if (ACM_READY(acm))
351 		schedule_work(&acm->work);
352 }
353 
354 static void acm_softint(void *private)
355 {
356 	struct acm *acm = private;
357 	dbg("Entering acm_softint.\n");
358 
359 	if (!ACM_READY(acm))
360 		return;
361 	tty_wakeup(acm->tty);
362 }
363 
364 /*
365  * TTY handlers
366  */
367 
368 static int acm_tty_open(struct tty_struct *tty, struct file *filp)
369 {
370 	struct acm *acm;
371 	int rv = -EINVAL;
372 	dbg("Entering acm_tty_open.\n");
373 
374 	down(&open_sem);
375 
376 	acm = acm_table[tty->index];
377 	if (!acm || !acm->dev)
378 		goto err_out;
379 	else
380 		rv = 0;
381 
382 	tty->driver_data = acm;
383 	acm->tty = tty;
384 
385 
386 
387 	if (acm->used++) {
388 		goto done;
389         }
390 
391 	acm->ctrlurb->dev = acm->dev;
392 	if (usb_submit_urb(acm->ctrlurb, GFP_KERNEL)) {
393 		dbg("usb_submit_urb(ctrl irq) failed");
394 		goto bail_out;
395 	}
396 
397 	acm->readurb->dev = acm->dev;
398 	if (usb_submit_urb(acm->readurb, GFP_KERNEL)) {
399 		dbg("usb_submit_urb(read bulk) failed");
400 		goto bail_out_and_unlink;
401 	}
402 
403 	if (0 > acm_set_control(acm, acm->ctrlout = ACM_CTRL_DTR | ACM_CTRL_RTS))
404 		goto full_bailout;
405 
406 	/* force low_latency on so that our tty_push actually forces the data through,
407 	   otherwise it is scheduled, and with high data rates data can get lost. */
408 	tty->low_latency = 1;
409 
410 done:
411 err_out:
412 	up(&open_sem);
413 	return rv;
414 
415 full_bailout:
416 	usb_kill_urb(acm->readurb);
417 bail_out_and_unlink:
418 	usb_kill_urb(acm->ctrlurb);
419 bail_out:
420 	acm->used--;
421 	up(&open_sem);
422 	return -EIO;
423 }
424 
425 static void acm_tty_close(struct tty_struct *tty, struct file *filp)
426 {
427 	struct acm *acm = tty->driver_data;
428 
429 	if (!acm || !acm->used)
430 		return;
431 
432 	down(&open_sem);
433 	if (!--acm->used) {
434 		if (acm->dev) {
435 			acm_set_control(acm, acm->ctrlout = 0);
436 			usb_kill_urb(acm->ctrlurb);
437 			usb_kill_urb(acm->writeurb);
438 			usb_kill_urb(acm->readurb);
439 		} else {
440 			tty_unregister_device(acm_tty_driver, acm->minor);
441 			acm_table[acm->minor] = NULL;
442 			usb_free_urb(acm->ctrlurb);
443 			usb_free_urb(acm->readurb);
444 			usb_free_urb(acm->writeurb);
445 			kfree(acm);
446 		}
447 	}
448 	up(&open_sem);
449 }
450 
451 static int acm_tty_write(struct tty_struct *tty, const unsigned char *buf, int count)
452 {
453 	struct acm *acm = tty->driver_data;
454 	int stat;
455 	unsigned long flags;
456 	int wbn;
457 	struct acm_wb *wb;
458 
459 	dbg("Entering acm_tty_write to write %d bytes,\n", count);
460 
461 	if (!ACM_READY(acm))
462 		return -EINVAL;
463 	if (!count)
464 		return 0;
465 
466 	spin_lock_irqsave(&acm->write_lock, flags);
467 	if ((wbn = acm_wb_alloc(acm)) < 0) {
468 		spin_unlock_irqrestore(&acm->write_lock, flags);
469 		acm_write_start(acm);
470 		return 0;
471 	}
472 	wb = &acm->wb[wbn];
473 
474 	count = (count > acm->writesize) ? acm->writesize : count;
475 	dbg("Get %d bytes...", count);
476 	memcpy(wb->buf, buf, count);
477 	wb->len = count;
478 	spin_unlock_irqrestore(&acm->write_lock, flags);
479 
480 	if ((stat = acm_write_start(acm)) < 0)
481 		return stat;
482 	return count;
483 }
484 
485 static int acm_tty_write_room(struct tty_struct *tty)
486 {
487 	struct acm *acm = tty->driver_data;
488 	if (!ACM_READY(acm))
489 		return -EINVAL;
490 	/*
491 	 * Do not let the line discipline to know that we have a reserve,
492 	 * or it might get too enthusiastic.
493 	 */
494 	return (acm->write_ready && acm_wb_is_avail(acm)) ? acm->writesize : 0;
495 }
496 
497 static int acm_tty_chars_in_buffer(struct tty_struct *tty)
498 {
499 	struct acm *acm = tty->driver_data;
500 	if (!ACM_READY(acm))
501 		return -EINVAL;
502 	/*
503 	 * This is inaccurate (overcounts), but it works.
504 	 */
505 	return (ACM_NWB - acm_wb_is_avail(acm)) * acm->writesize;
506 }
507 
508 static void acm_tty_throttle(struct tty_struct *tty)
509 {
510 	struct acm *acm = tty->driver_data;
511 	if (!ACM_READY(acm))
512 		return;
513 	spin_lock_bh(&acm->throttle_lock);
514 	acm->throttle = 1;
515 	spin_unlock_bh(&acm->throttle_lock);
516 }
517 
518 static void acm_tty_unthrottle(struct tty_struct *tty)
519 {
520 	struct acm *acm = tty->driver_data;
521 	if (!ACM_READY(acm))
522 		return;
523 	spin_lock_bh(&acm->throttle_lock);
524 	acm->throttle = 0;
525 	spin_unlock_bh(&acm->throttle_lock);
526 	if (acm->resubmit_to_unthrottle) {
527 		acm->resubmit_to_unthrottle = 0;
528 		acm_read_bulk(acm->readurb, NULL);
529 	}
530 }
531 
532 static void acm_tty_break_ctl(struct tty_struct *tty, int state)
533 {
534 	struct acm *acm = tty->driver_data;
535 	if (!ACM_READY(acm))
536 		return;
537 	if (acm_send_break(acm, state ? 0xffff : 0))
538 		dbg("send break failed");
539 }
540 
541 static int acm_tty_tiocmget(struct tty_struct *tty, struct file *file)
542 {
543 	struct acm *acm = tty->driver_data;
544 
545 	if (!ACM_READY(acm))
546 		return -EINVAL;
547 
548 	return (acm->ctrlout & ACM_CTRL_DTR ? TIOCM_DTR : 0) |
549 	       (acm->ctrlout & ACM_CTRL_RTS ? TIOCM_RTS : 0) |
550 	       (acm->ctrlin  & ACM_CTRL_DSR ? TIOCM_DSR : 0) |
551 	       (acm->ctrlin  & ACM_CTRL_RI  ? TIOCM_RI  : 0) |
552 	       (acm->ctrlin  & ACM_CTRL_DCD ? TIOCM_CD  : 0) |
553 	       TIOCM_CTS;
554 }
555 
556 static int acm_tty_tiocmset(struct tty_struct *tty, struct file *file,
557 			    unsigned int set, unsigned int clear)
558 {
559 	struct acm *acm = tty->driver_data;
560 	unsigned int newctrl;
561 
562 	if (!ACM_READY(acm))
563 		return -EINVAL;
564 
565 	newctrl = acm->ctrlout;
566 	set = (set & TIOCM_DTR ? ACM_CTRL_DTR : 0) | (set & TIOCM_RTS ? ACM_CTRL_RTS : 0);
567 	clear = (clear & TIOCM_DTR ? ACM_CTRL_DTR : 0) | (clear & TIOCM_RTS ? ACM_CTRL_RTS : 0);
568 
569 	newctrl = (newctrl & ~clear) | set;
570 
571 	if (acm->ctrlout == newctrl)
572 		return 0;
573 	return acm_set_control(acm, acm->ctrlout = newctrl);
574 }
575 
576 static int acm_tty_ioctl(struct tty_struct *tty, struct file *file, unsigned int cmd, unsigned long arg)
577 {
578 	struct acm *acm = tty->driver_data;
579 
580 	if (!ACM_READY(acm))
581 		return -EINVAL;
582 
583 	return -ENOIOCTLCMD;
584 }
585 
586 static __u32 acm_tty_speed[] = {
587 	0, 50, 75, 110, 134, 150, 200, 300, 600,
588 	1200, 1800, 2400, 4800, 9600, 19200, 38400,
589 	57600, 115200, 230400, 460800, 500000, 576000,
590 	921600, 1000000, 1152000, 1500000, 2000000,
591 	2500000, 3000000, 3500000, 4000000
592 };
593 
594 static __u8 acm_tty_size[] = {
595 	5, 6, 7, 8
596 };
597 
598 static void acm_tty_set_termios(struct tty_struct *tty, struct termios *termios_old)
599 {
600 	struct acm *acm = tty->driver_data;
601 	struct termios *termios = tty->termios;
602 	struct usb_cdc_line_coding newline;
603 	int newctrl = acm->ctrlout;
604 
605 	if (!ACM_READY(acm))
606 		return;
607 
608 	newline.dwDTERate = cpu_to_le32p(acm_tty_speed +
609 		(termios->c_cflag & CBAUD & ~CBAUDEX) + (termios->c_cflag & CBAUDEX ? 15 : 0));
610 	newline.bCharFormat = termios->c_cflag & CSTOPB ? 2 : 0;
611 	newline.bParityType = termios->c_cflag & PARENB ?
612 		(termios->c_cflag & PARODD ? 1 : 2) + (termios->c_cflag & CMSPAR ? 2 : 0) : 0;
613 	newline.bDataBits = acm_tty_size[(termios->c_cflag & CSIZE) >> 4];
614 
615 	acm->clocal = ((termios->c_cflag & CLOCAL) != 0);
616 
617 	if (!newline.dwDTERate) {
618 		newline.dwDTERate = acm->line.dwDTERate;
619 		newctrl &= ~ACM_CTRL_DTR;
620 	} else  newctrl |=  ACM_CTRL_DTR;
621 
622 	if (newctrl != acm->ctrlout)
623 		acm_set_control(acm, acm->ctrlout = newctrl);
624 
625 	if (memcmp(&acm->line, &newline, sizeof newline)) {
626 		memcpy(&acm->line, &newline, sizeof newline);
627 		dbg("set line: %d %d %d %d", le32_to_cpu(newline.dwDTERate),
628 			newline.bCharFormat, newline.bParityType,
629 			newline.bDataBits);
630 		acm_set_line(acm, &acm->line);
631 	}
632 }
633 
634 /*
635  * USB probe and disconnect routines.
636  */
637 
638 /* Little helper: write buffers free */
639 static void acm_write_buffers_free(struct acm *acm)
640 {
641 	int i;
642 	struct acm_wb *wb;
643 
644 	for (wb = &acm->wb[0], i = 0; i < ACM_NWB; i++, wb++) {
645 		usb_buffer_free(acm->dev, acm->writesize, wb->buf, wb->dmah);
646 	}
647 }
648 
649 /* Little helper: write buffers allocate */
650 static int acm_write_buffers_alloc(struct acm *acm)
651 {
652 	int i;
653 	struct acm_wb *wb;
654 
655 	for (wb = &acm->wb[0], i = 0; i < ACM_NWB; i++, wb++) {
656 		wb->buf = usb_buffer_alloc(acm->dev, acm->writesize, GFP_KERNEL,
657 		    &wb->dmah);
658 		if (!wb->buf) {
659 			while (i != 0) {
660 				--i;
661 				--wb;
662 				usb_buffer_free(acm->dev, acm->writesize,
663 				    wb->buf, wb->dmah);
664 			}
665 			return -ENOMEM;
666 		}
667 	}
668 	return 0;
669 }
670 
671 static int acm_probe (struct usb_interface *intf,
672 		      const struct usb_device_id *id)
673 {
674 	struct usb_cdc_union_desc *union_header = NULL;
675 	char *buffer = intf->altsetting->extra;
676 	int buflen = intf->altsetting->extralen;
677 	struct usb_interface *control_interface;
678 	struct usb_interface *data_interface;
679 	struct usb_endpoint_descriptor *epctrl;
680 	struct usb_endpoint_descriptor *epread;
681 	struct usb_endpoint_descriptor *epwrite;
682 	struct usb_device *usb_dev = interface_to_usbdev(intf);
683 	struct acm *acm;
684 	int minor;
685 	int ctrlsize,readsize;
686 	u8 *buf;
687 	u8 ac_management_function = 0;
688 	u8 call_management_function = 0;
689 	int call_interface_num = -1;
690 	int data_interface_num;
691 	unsigned long quirks;
692 
693 	/* handle quirks deadly to normal probing*/
694 	quirks = (unsigned long)id->driver_info;
695 	if (quirks == NO_UNION_NORMAL) {
696 		data_interface = usb_ifnum_to_if(usb_dev, 1);
697 		control_interface = usb_ifnum_to_if(usb_dev, 0);
698 		goto skip_normal_probe;
699 	}
700 
701 	/* normal probing*/
702 	if (!buffer) {
703 		err("Wierd descriptor references\n");
704 		return -EINVAL;
705 	}
706 
707 	if (!buflen) {
708 		if (intf->cur_altsetting->endpoint->extralen && intf->cur_altsetting->endpoint->extra) {
709 			dev_dbg(&intf->dev,"Seeking extra descriptors on endpoint\n");
710 			buflen = intf->cur_altsetting->endpoint->extralen;
711 			buffer = intf->cur_altsetting->endpoint->extra;
712 		} else {
713 			err("Zero length descriptor references\n");
714 			return -EINVAL;
715 		}
716 	}
717 
718 	while (buflen > 0) {
719 		if (buffer [1] != USB_DT_CS_INTERFACE) {
720 			err("skipping garbage\n");
721 			goto next_desc;
722 		}
723 
724 		switch (buffer [2]) {
725 			case USB_CDC_UNION_TYPE: /* we've found it */
726 				if (union_header) {
727 					err("More than one union descriptor, skipping ...");
728 					goto next_desc;
729 				}
730 				union_header = (struct usb_cdc_union_desc *)
731 							buffer;
732 				break;
733 			case USB_CDC_COUNTRY_TYPE: /* maybe somehow export */
734 				break; /* for now we ignore it */
735 			case USB_CDC_HEADER_TYPE: /* maybe check version */
736 				break; /* for now we ignore it */
737 			case USB_CDC_ACM_TYPE:
738 				ac_management_function = buffer[3];
739 				break;
740 			case USB_CDC_CALL_MANAGEMENT_TYPE:
741 				call_management_function = buffer[3];
742 				call_interface_num = buffer[4];
743 				if ((call_management_function & 3) != 3)
744 					err("This device cannot do calls on its own. It is no modem.");
745 				break;
746 
747 			default:
748 				err("Ignoring extra header, type %d, length %d", buffer[2], buffer[0]);
749 				break;
750 			}
751 next_desc:
752 		buflen -= buffer[0];
753 		buffer += buffer[0];
754 	}
755 
756 	if (!union_header) {
757 		if (call_interface_num > 0) {
758 			dev_dbg(&intf->dev,"No union descriptor, using call management descriptor\n");
759 			data_interface = usb_ifnum_to_if(usb_dev, (data_interface_num = call_interface_num));
760 			control_interface = intf;
761 		} else {
762 			dev_dbg(&intf->dev,"No union descriptor, giving up\n");
763 			return -ENODEV;
764 		}
765 	} else {
766 		control_interface = usb_ifnum_to_if(usb_dev, union_header->bMasterInterface0);
767 		data_interface = usb_ifnum_to_if(usb_dev, (data_interface_num = union_header->bSlaveInterface0));
768 		if (!control_interface || !data_interface) {
769 			dev_dbg(&intf->dev,"no interfaces\n");
770 			return -ENODEV;
771 		}
772 	}
773 
774 	if (data_interface_num != call_interface_num)
775 		dev_dbg(&intf->dev,"Seperate call control interface. That is not fully supported.\n");
776 
777 skip_normal_probe:
778 
779 	/*workaround for switched interfaces */
780 	if (data_interface->cur_altsetting->desc.bInterfaceClass != CDC_DATA_INTERFACE_TYPE) {
781 		if (control_interface->cur_altsetting->desc.bInterfaceClass == CDC_DATA_INTERFACE_TYPE) {
782 			struct usb_interface *t;
783 			dev_dbg(&intf->dev,"Your device has switched interfaces.\n");
784 
785 			t = control_interface;
786 			control_interface = data_interface;
787 			data_interface = t;
788 		} else {
789 			return -EINVAL;
790 		}
791 	}
792 
793 	if (usb_interface_claimed(data_interface)) { /* valid in this context */
794 		dev_dbg(&intf->dev,"The data interface isn't available\n");
795 		return -EBUSY;
796 	}
797 
798 
799 	if (data_interface->cur_altsetting->desc.bNumEndpoints < 2)
800 		return -EINVAL;
801 
802 	epctrl = &control_interface->cur_altsetting->endpoint[0].desc;
803 	epread = &data_interface->cur_altsetting->endpoint[0].desc;
804 	epwrite = &data_interface->cur_altsetting->endpoint[1].desc;
805 
806 
807 	/* workaround for switched endpoints */
808 	if ((epread->bEndpointAddress & USB_DIR_IN) != USB_DIR_IN) {
809 		/* descriptors are swapped */
810 		struct usb_endpoint_descriptor *t;
811 		dev_dbg(&intf->dev,"The data interface has switched endpoints\n");
812 
813 		t = epread;
814 		epread = epwrite;
815 		epwrite = t;
816 	}
817 	dbg("interfaces are valid");
818 	for (minor = 0; minor < ACM_TTY_MINORS && acm_table[minor]; minor++);
819 
820 	if (minor == ACM_TTY_MINORS) {
821 		err("no more free acm devices");
822 		return -ENODEV;
823 	}
824 
825 	if (!(acm = kmalloc(sizeof(struct acm), GFP_KERNEL))) {
826 		dev_dbg(&intf->dev, "out of memory (acm kmalloc)\n");
827 		goto alloc_fail;
828 	}
829 	memset(acm, 0, sizeof(struct acm));
830 
831 	ctrlsize = le16_to_cpu(epctrl->wMaxPacketSize);
832 	readsize = le16_to_cpu(epread->wMaxPacketSize);
833 	acm->writesize = le16_to_cpu(epwrite->wMaxPacketSize);
834 	acm->control = control_interface;
835 	acm->data = data_interface;
836 	acm->minor = minor;
837 	acm->dev = usb_dev;
838 	acm->ctrl_caps = ac_management_function;
839 	acm->ctrlsize = ctrlsize;
840 	acm->readsize = readsize;
841 	acm->bh.func = acm_rx_tasklet;
842 	acm->bh.data = (unsigned long) acm;
843 	INIT_WORK(&acm->work, acm_softint, acm);
844 	spin_lock_init(&acm->throttle_lock);
845 	spin_lock_init(&acm->write_lock);
846 	acm->write_ready = 1;
847 
848 	buf = usb_buffer_alloc(usb_dev, ctrlsize, GFP_KERNEL, &acm->ctrl_dma);
849 	if (!buf) {
850 		dev_dbg(&intf->dev, "out of memory (ctrl buffer alloc)\n");
851 		goto alloc_fail2;
852 	}
853 	acm->ctrl_buffer = buf;
854 
855 	buf = usb_buffer_alloc(usb_dev, readsize, GFP_KERNEL, &acm->read_dma);
856 	if (!buf) {
857 		dev_dbg(&intf->dev, "out of memory (read buffer alloc)\n");
858 		goto alloc_fail3;
859 	}
860 	acm->read_buffer = buf;
861 
862 	if (acm_write_buffers_alloc(acm) < 0) {
863 		dev_dbg(&intf->dev, "out of memory (write buffer alloc)\n");
864 		goto alloc_fail4;
865 	}
866 
867 	acm->ctrlurb = usb_alloc_urb(0, GFP_KERNEL);
868 	if (!acm->ctrlurb) {
869 		dev_dbg(&intf->dev, "out of memory (ctrlurb kmalloc)\n");
870 		goto alloc_fail5;
871 	}
872 	acm->readurb = usb_alloc_urb(0, GFP_KERNEL);
873 	if (!acm->readurb) {
874 		dev_dbg(&intf->dev, "out of memory (readurb kmalloc)\n");
875 		goto alloc_fail6;
876 	}
877 	acm->writeurb = usb_alloc_urb(0, GFP_KERNEL);
878 	if (!acm->writeurb) {
879 		dev_dbg(&intf->dev, "out of memory (writeurb kmalloc)\n");
880 		goto alloc_fail7;
881 	}
882 
883 	usb_fill_int_urb(acm->ctrlurb, usb_dev, usb_rcvintpipe(usb_dev, epctrl->bEndpointAddress),
884 			 acm->ctrl_buffer, ctrlsize, acm_ctrl_irq, acm, epctrl->bInterval);
885 	acm->ctrlurb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
886 	acm->ctrlurb->transfer_dma = acm->ctrl_dma;
887 
888 	usb_fill_bulk_urb(acm->readurb, usb_dev, usb_rcvbulkpipe(usb_dev, epread->bEndpointAddress),
889 			  acm->read_buffer, readsize, acm_read_bulk, acm);
890 	acm->readurb->transfer_flags |= URB_NO_FSBR | URB_NO_TRANSFER_DMA_MAP;
891 	acm->readurb->transfer_dma = acm->read_dma;
892 
893 	usb_fill_bulk_urb(acm->writeurb, usb_dev, usb_sndbulkpipe(usb_dev, epwrite->bEndpointAddress),
894 			  NULL, acm->writesize, acm_write_bulk, acm);
895 	acm->writeurb->transfer_flags |= URB_NO_FSBR | URB_NO_TRANSFER_DMA_MAP;
896 	/* acm->writeurb->transfer_dma = 0; */
897 
898 	dev_info(&intf->dev, "ttyACM%d: USB ACM device\n", minor);
899 
900 	acm_set_control(acm, acm->ctrlout);
901 
902 	acm->line.dwDTERate = cpu_to_le32(9600);
903 	acm->line.bDataBits = 8;
904 	acm_set_line(acm, &acm->line);
905 
906 	usb_driver_claim_interface(&acm_driver, data_interface, acm);
907 
908 	tty_register_device(acm_tty_driver, minor, &intf->dev);
909 
910 	acm_table[minor] = acm;
911 	usb_set_intfdata (intf, acm);
912 	return 0;
913 
914 alloc_fail7:
915 	usb_free_urb(acm->readurb);
916 alloc_fail6:
917 	usb_free_urb(acm->ctrlurb);
918 alloc_fail5:
919 	acm_write_buffers_free(acm);
920 alloc_fail4:
921 	usb_buffer_free(usb_dev, readsize, acm->read_buffer, acm->read_dma);
922 alloc_fail3:
923 	usb_buffer_free(usb_dev, ctrlsize, acm->ctrl_buffer, acm->ctrl_dma);
924 alloc_fail2:
925 	kfree(acm);
926 alloc_fail:
927 	return -ENOMEM;
928 }
929 
930 static void acm_disconnect(struct usb_interface *intf)
931 {
932 	struct acm *acm = usb_get_intfdata (intf);
933 	struct usb_device *usb_dev = interface_to_usbdev(intf);
934 
935 	if (!acm || !acm->dev) {
936 		dbg("disconnect on nonexisting interface");
937 		return;
938 	}
939 
940 	down(&open_sem);
941 	acm->dev = NULL;
942 	usb_set_intfdata (intf, NULL);
943 
944 	usb_kill_urb(acm->ctrlurb);
945 	usb_kill_urb(acm->readurb);
946 	usb_kill_urb(acm->writeurb);
947 
948 	flush_scheduled_work(); /* wait for acm_softint */
949 
950 	acm_write_buffers_free(acm);
951 	usb_buffer_free(usb_dev, acm->readsize, acm->read_buffer, acm->read_dma);
952 	usb_buffer_free(usb_dev, acm->ctrlsize, acm->ctrl_buffer, acm->ctrl_dma);
953 
954 	usb_driver_release_interface(&acm_driver, acm->data);
955 
956 	if (!acm->used) {
957 		tty_unregister_device(acm_tty_driver, acm->minor);
958 		acm_table[acm->minor] = NULL;
959 		usb_free_urb(acm->ctrlurb);
960 		usb_free_urb(acm->readurb);
961 		usb_free_urb(acm->writeurb);
962 		kfree(acm);
963 		up(&open_sem);
964 		return;
965 	}
966 
967 	up(&open_sem);
968 
969 	if (acm->tty)
970 		tty_hangup(acm->tty);
971 }
972 
973 /*
974  * USB driver structure.
975  */
976 
977 static struct usb_device_id acm_ids[] = {
978 	/* quirky and broken devices */
979 	{ USB_DEVICE(0x0870, 0x0001), /* Metricom GS Modem */
980 	.driver_info = NO_UNION_NORMAL, /* has no union descriptor */
981 	},
982 	/* control interfaces with various AT-command sets */
983 	{ USB_INTERFACE_INFO(USB_CLASS_COMM, USB_CDC_SUBCLASS_ACM,
984 		USB_CDC_ACM_PROTO_AT_V25TER) },
985 	{ USB_INTERFACE_INFO(USB_CLASS_COMM, USB_CDC_SUBCLASS_ACM,
986 		USB_CDC_ACM_PROTO_AT_PCCA101) },
987 	{ USB_INTERFACE_INFO(USB_CLASS_COMM, USB_CDC_SUBCLASS_ACM,
988 		USB_CDC_ACM_PROTO_AT_PCCA101_WAKE) },
989 	{ USB_INTERFACE_INFO(USB_CLASS_COMM, USB_CDC_SUBCLASS_ACM,
990 		USB_CDC_ACM_PROTO_AT_GSM) },
991 	{ USB_INTERFACE_INFO(USB_CLASS_COMM, USB_CDC_SUBCLASS_ACM,
992 		USB_CDC_ACM_PROTO_AT_3G	) },
993 	{ USB_INTERFACE_INFO(USB_CLASS_COMM, USB_CDC_SUBCLASS_ACM,
994 		USB_CDC_ACM_PROTO_AT_CDMA) },
995 
996 	/* NOTE:  COMM/ACM/0xff is likely MSFT RNDIS ... NOT a modem!! */
997 	{ }
998 };
999 
1000 MODULE_DEVICE_TABLE (usb, acm_ids);
1001 
1002 static struct usb_driver acm_driver = {
1003 	.owner =	THIS_MODULE,
1004 	.name =		"cdc_acm",
1005 	.probe =	acm_probe,
1006 	.disconnect =	acm_disconnect,
1007 	.id_table =	acm_ids,
1008 };
1009 
1010 /*
1011  * TTY driver structures.
1012  */
1013 
1014 static struct tty_operations acm_ops = {
1015 	.open =			acm_tty_open,
1016 	.close =		acm_tty_close,
1017 	.write =		acm_tty_write,
1018 	.write_room =		acm_tty_write_room,
1019 	.ioctl =		acm_tty_ioctl,
1020 	.throttle =		acm_tty_throttle,
1021 	.unthrottle =		acm_tty_unthrottle,
1022 	.chars_in_buffer =	acm_tty_chars_in_buffer,
1023 	.break_ctl =		acm_tty_break_ctl,
1024 	.set_termios =		acm_tty_set_termios,
1025 	.tiocmget =		acm_tty_tiocmget,
1026 	.tiocmset =		acm_tty_tiocmset,
1027 };
1028 
1029 /*
1030  * Init / exit.
1031  */
1032 
1033 static int __init acm_init(void)
1034 {
1035 	int retval;
1036 	acm_tty_driver = alloc_tty_driver(ACM_TTY_MINORS);
1037 	if (!acm_tty_driver)
1038 		return -ENOMEM;
1039 	acm_tty_driver->owner = THIS_MODULE,
1040 	acm_tty_driver->driver_name = "acm",
1041 	acm_tty_driver->name = "ttyACM",
1042 	acm_tty_driver->devfs_name = "usb/acm/",
1043 	acm_tty_driver->major = ACM_TTY_MAJOR,
1044 	acm_tty_driver->minor_start = 0,
1045 	acm_tty_driver->type = TTY_DRIVER_TYPE_SERIAL,
1046 	acm_tty_driver->subtype = SERIAL_TYPE_NORMAL,
1047 	acm_tty_driver->flags = TTY_DRIVER_REAL_RAW | TTY_DRIVER_NO_DEVFS,
1048 	acm_tty_driver->init_termios = tty_std_termios;
1049 	acm_tty_driver->init_termios.c_cflag = B9600 | CS8 | CREAD | HUPCL | CLOCAL;
1050 	tty_set_operations(acm_tty_driver, &acm_ops);
1051 
1052 	retval = tty_register_driver(acm_tty_driver);
1053 	if (retval) {
1054 		put_tty_driver(acm_tty_driver);
1055 		return retval;
1056 	}
1057 
1058 	retval = usb_register(&acm_driver);
1059 	if (retval) {
1060 		tty_unregister_driver(acm_tty_driver);
1061 		put_tty_driver(acm_tty_driver);
1062 		return retval;
1063 	}
1064 
1065 	info(DRIVER_VERSION ":" DRIVER_DESC);
1066 
1067 	return 0;
1068 }
1069 
1070 static void __exit acm_exit(void)
1071 {
1072 	usb_deregister(&acm_driver);
1073 	tty_unregister_driver(acm_tty_driver);
1074 	put_tty_driver(acm_tty_driver);
1075 }
1076 
1077 module_init(acm_init);
1078 module_exit(acm_exit);
1079 
1080 MODULE_AUTHOR( DRIVER_AUTHOR );
1081 MODULE_DESCRIPTION( DRIVER_DESC );
1082 MODULE_LICENSE("GPL");
1083 
1084