cdc-acm.c 52.8 KB
Newer Older
1
// SPDX-License-Identifier: GPL-2.0+
L
Linus Torvalds 已提交
2 3 4 5
/*
 * cdc-acm.c
 *
 * Copyright (c) 1999 Armin Fuerst	<fuerst@in.tum.de>
P
Pavel Machek 已提交
6
 * Copyright (c) 1999 Pavel Machek	<pavel@ucw.cz>
L
Linus Torvalds 已提交
7 8 9
 * Copyright (c) 1999 Johannes Erdfelt	<johannes@erdfelt.com>
 * Copyright (c) 2000 Vojtech Pavlik	<vojtech@suse.cz>
 * Copyright (c) 2004 Oliver Neukum	<oliver@neukum.name>
10
 * Copyright (c) 2005 David Kubicek	<dave@awk.cz>
11
 * Copyright (c) 2011 Johan Hovold	<jhovold@gmail.com>
L
Linus Torvalds 已提交
12 13 14 15 16 17 18
 *
 * USB Abstract Control Model driver for USB modems and ISDN adapters
 *
 * Sponsored by SuSE
 */

#undef DEBUG
19
#undef VERBOSE_DEBUG
L
Linus Torvalds 已提交
20 21

#include <linux/kernel.h>
22
#include <linux/sched/signal.h>
L
Linus Torvalds 已提交
23 24 25
#include <linux/errno.h>
#include <linux/init.h>
#include <linux/slab.h>
26
#include <linux/log2.h>
L
Linus Torvalds 已提交
27
#include <linux/tty.h>
28
#include <linux/serial.h>
L
Linus Torvalds 已提交
29 30 31
#include <linux/tty_driver.h>
#include <linux/tty_flip.h>
#include <linux/module.h>
32
#include <linux/mutex.h>
A
Alan Cox 已提交
33
#include <linux/uaccess.h>
L
Linus Torvalds 已提交
34
#include <linux/usb.h>
35
#include <linux/usb/cdc.h>
L
Linus Torvalds 已提交
36 37
#include <asm/byteorder.h>
#include <asm/unaligned.h>
38
#include <linux/idr.h>
39
#include <linux/list.h>
L
Linus Torvalds 已提交
40 41 42

#include "cdc-acm.h"

43

44
#define DRIVER_AUTHOR "Armin Fuerst, Pavel Machek, Johannes Erdfelt, Vojtech Pavlik, David Kubicek, Johan Hovold"
L
Linus Torvalds 已提交
45 46 47 48 49
#define DRIVER_DESC "USB Abstract Control Model driver for USB modems and ISDN adapters"

static struct usb_driver acm_driver;
static struct tty_driver *acm_tty_driver;

50 51
static DEFINE_IDR(acm_minors);
static DEFINE_MUTEX(acm_minors_lock);
L
Linus Torvalds 已提交
52

53 54 55
static void acm_tty_set_termios(struct tty_struct *tty,
				struct ktermios *termios_old);

56
/*
57
 * acm_minors accessors
58
 */
L
Linus Torvalds 已提交
59

60
/*
61
 * Look up an ACM structure by minor. If found and not disconnected, increment
62 63
 * its refcount and return it with its mutex held.
 */
64
static struct acm *acm_get_by_minor(unsigned int minor)
65 66 67
{
	struct acm *acm;

68 69
	mutex_lock(&acm_minors_lock);
	acm = idr_find(&acm_minors, minor);
70 71 72 73 74 75 76 77 78 79
	if (acm) {
		mutex_lock(&acm->mutex);
		if (acm->disconnected) {
			mutex_unlock(&acm->mutex);
			acm = NULL;
		} else {
			tty_port_get(&acm->port);
			mutex_unlock(&acm->mutex);
		}
	}
80
	mutex_unlock(&acm_minors_lock);
81 82 83 84 85 86 87 88 89 90
	return acm;
}

/*
 * Try to find an available minor number and if found, associate it with 'acm'.
 */
static int acm_alloc_minor(struct acm *acm)
{
	int minor;

91 92 93
	mutex_lock(&acm_minors_lock);
	minor = idr_alloc(&acm_minors, acm, 0, ACM_TTY_MINORS, GFP_KERNEL);
	mutex_unlock(&acm_minors_lock);
94 95 96 97 98 99 100

	return minor;
}

/* Release the minor number associated with 'acm'.  */
static void acm_release_minor(struct acm *acm)
{
101 102 103
	mutex_lock(&acm_minors_lock);
	idr_remove(&acm_minors, acm->minor);
	mutex_unlock(&acm_minors_lock);
104
}
A
Alan Cox 已提交
105

L
Linus Torvalds 已提交
106 107 108 109
/*
 * Functions for ACM control messages.
 */

110 111
static int acm_ctrl_msg(struct acm *acm, int request, int value,
							void *buf, int len)
L
Linus Torvalds 已提交
112
{
113 114 115 116 117 118 119
	int retval;

	retval = usb_autopm_get_interface(acm->control);
	if (retval)
		return retval;

	retval = usb_control_msg(acm->dev, usb_sndctrlpipe(acm->dev, 0),
L
Linus Torvalds 已提交
120 121 122
		request, USB_RT_ACM, value,
		acm->control->altsetting[0].desc.bInterfaceNumber,
		buf, len, 5000);
123

124
	dev_dbg(&acm->control->dev,
L
Ladislav Michl 已提交
125 126
		"%s - rq 0x%02x, val %#x, len %#x, result %d\n",
		__func__, request, value, len, retval);
127 128 129

	usb_autopm_put_interface(acm->control);

L
Linus Torvalds 已提交
130 131 132 133 134 135
	return retval < 0 ? retval : 0;
}

/* devices aren't required to support these requests.
 * the cdc acm descriptor tells whether they do...
 */
136 137 138 139 140 141 142 143 144
static inline int acm_set_control(struct acm *acm, int control)
{
	if (acm->quirks & QUIRK_CONTROL_LINE_STATE)
		return -EOPNOTSUPP;

	return acm_ctrl_msg(acm, USB_CDC_REQ_SET_CONTROL_LINE_STATE,
			control, NULL, 0);
}

L
Linus Torvalds 已提交
145 146 147 148 149
#define acm_set_line(acm, line) \
	acm_ctrl_msg(acm, USB_CDC_REQ_SET_LINE_CODING, 0, line, sizeof *(line))
#define acm_send_break(acm, ms) \
	acm_ctrl_msg(acm, USB_CDC_REQ_SEND_BREAK, ms, NULL, 0)

L
Ladislav Michl 已提交
150 151 152 153 154 155 156 157 158 159 160
static void acm_kill_urbs(struct acm *acm)
{
	int i;

	usb_kill_urb(acm->ctrlurb);
	for (i = 0; i < ACM_NW; i++)
		usb_kill_urb(acm->wb[i].urb);
	for (i = 0; i < acm->rx_buflimit; i++)
		usb_kill_urb(acm->read_urbs[i]);
}

161 162 163 164 165 166 167 168 169 170
/*
 * Write buffer management.
 * All of these assume proper locks taken by the caller.
 */

static int acm_wb_alloc(struct acm *acm)
{
	int i, wbn;
	struct acm_wb *wb;

171
	wbn = 0;
172 173 174 175 176
	i = 0;
	for (;;) {
		wb = &acm->wb[wbn];
		if (!wb->use) {
			wb->use = 1;
177
			wb->len = 0;
178 179
			return wbn;
		}
180 181
		wbn = (wbn + 1) % ACM_NW;
		if (++i >= ACM_NW)
182 183 184 185 186 187 188
			return -1;
	}
}

static int acm_wb_is_avail(struct acm *acm)
{
	int i, n;
189
	unsigned long flags;
190

191
	n = ACM_NW;
192
	spin_lock_irqsave(&acm->write_lock, flags);
193
	for (i = 0; i < ACM_NW; i++)
194
		n -= acm->wb[i].use;
195
	spin_unlock_irqrestore(&acm->write_lock, flags);
196 197 198 199
	return n;
}

/*
200
 * Finish write. Caller must hold acm->write_lock
201
 */
202
static void acm_write_done(struct acm *acm, struct acm_wb *wb)
203
{
204
	wb->use = 0;
205
	acm->transmitting--;
206
	usb_autopm_put_interface_async(acm->control);
207 208 209 210
}

/*
 * Poke write.
211 212
 *
 * the caller is responsible for locking
213
 */
214 215 216 217 218 219 220 221 222 223 224 225

static int acm_start_wb(struct acm *acm, struct acm_wb *wb)
{
	int rc;

	acm->transmitting++;

	wb->urb->transfer_buffer = wb->buf;
	wb->urb->transfer_dma = wb->dmah;
	wb->urb->transfer_buffer_length = wb->len;
	wb->urb->dev = acm->dev;

226 227
	rc = usb_submit_urb(wb->urb, GFP_ATOMIC);
	if (rc < 0) {
228 229 230
		dev_err(&acm->data->dev,
			"%s - usb_submit_urb(write bulk) failed: %d\n",
			__func__, rc);
231 232 233 234 235
		acm_write_done(acm, wb);
	}
	return rc;
}

236 237 238
/*
 * attributes exported through sysfs
 */
239
static ssize_t bmCapabilities_show
240 241 242 243 244 245 246
(struct device *dev, struct device_attribute *attr, char *buf)
{
	struct usb_interface *intf = to_usb_interface(dev);
	struct acm *acm = usb_get_intfdata(intf);

	return sprintf(buf, "%d", acm->ctrl_caps);
}
247
static DEVICE_ATTR_RO(bmCapabilities);
248

249
static ssize_t wCountryCodes_show
250 251 252 253 254 255 256 257 258
(struct device *dev, struct device_attribute *attr, char *buf)
{
	struct usb_interface *intf = to_usb_interface(dev);
	struct acm *acm = usb_get_intfdata(intf);

	memcpy(buf, acm->country_codes, acm->country_code_size);
	return acm->country_code_size;
}

259
static DEVICE_ATTR_RO(wCountryCodes);
260

261
static ssize_t iCountryCodeRelDate_show
262 263 264 265 266 267 268
(struct device *dev, struct device_attribute *attr, char *buf)
{
	struct usb_interface *intf = to_usb_interface(dev);
	struct acm *acm = usb_get_intfdata(intf);

	return sprintf(buf, "%d", acm->country_rel_date);
}
269

270
static DEVICE_ATTR_RO(iCountryCodeRelDate);
L
Linus Torvalds 已提交
271 272 273 274
/*
 * Interrupt handlers for various ACM device responses
 */

275
static void acm_process_notification(struct acm *acm, unsigned char *buf)
L
Linus Torvalds 已提交
276 277
{
	int newctrl;
O
Oliver Neukum 已提交
278
	int difference;
279
	unsigned long flags;
280 281
	struct usb_cdc_notification *dr = (struct usb_cdc_notification *)buf;
	unsigned char *data = buf + sizeof(struct usb_cdc_notification);
L
Linus Torvalds 已提交
282 283

	switch (dr->bNotificationType) {
284
	case USB_CDC_NOTIFY_NETWORK_CONNECTION:
L
Ladislav Michl 已提交
285 286
		dev_dbg(&acm->control->dev,
			"%s - network connection: %d\n", __func__, dr->wValue);
287
		break;
L
Linus Torvalds 已提交
288

289
	case USB_CDC_NOTIFY_SERIAL_STATE:
290 291 292 293 294 295
		if (le16_to_cpu(dr->wLength) != 2) {
			dev_dbg(&acm->control->dev,
				"%s - malformed serial state\n", __func__);
			break;
		}

296
		newctrl = get_unaligned_le16(data);
297 298
		dev_dbg(&acm->control->dev,
			"%s - serial state: 0x%x\n", __func__, newctrl);
L
Linus Torvalds 已提交
299

J
Jiri Slaby 已提交
300
		if (!acm->clocal && (acm->ctrlin & ~newctrl & ACM_CTRL_DCD)) {
L
Ladislav Michl 已提交
301 302
			dev_dbg(&acm->control->dev,
				"%s - calling hangup\n", __func__);
J
Jiri Slaby 已提交
303
			tty_port_tty_hangup(&acm->port, false);
304
		}
L
Linus Torvalds 已提交
305

O
Oliver Neukum 已提交
306
		difference = acm->ctrlin ^ newctrl;
307
		spin_lock_irqsave(&acm->read_lock, flags);
308
		acm->ctrlin = newctrl;
O
Oliver Neukum 已提交
309 310 311 312 313 314
		acm->oldcount = acm->iocount;

		if (difference & ACM_CTRL_DSR)
			acm->iocount.dsr++;
		if (difference & ACM_CTRL_DCD)
			acm->iocount.dcd++;
315 316 317 318 319
		if (newctrl & ACM_CTRL_BRK)
			acm->iocount.brk++;
		if (newctrl & ACM_CTRL_RI)
			acm->iocount.rng++;
		if (newctrl & ACM_CTRL_FRAMING)
O
Oliver Neukum 已提交
320
			acm->iocount.frame++;
321
		if (newctrl & ACM_CTRL_PARITY)
O
Oliver Neukum 已提交
322
			acm->iocount.parity++;
323
		if (newctrl & ACM_CTRL_OVERRUN)
O
Oliver Neukum 已提交
324
			acm->iocount.overrun++;
325
		spin_unlock_irqrestore(&acm->read_lock, flags);
O
Oliver Neukum 已提交
326 327 328

		if (difference)
			wake_up_all(&acm->wioctl);
L
Linus Torvalds 已提交
329

O
Oliver Neukum 已提交
330
		break;
L
Linus Torvalds 已提交
331

332
	default:
333
		dev_dbg(&acm->control->dev,
334
			"%s - unknown notification %d received: index %d len %d\n",
335
			__func__,
336
			dr->bNotificationType, dr->wIndex, dr->wLength);
337 338
	}
}
339

340 341 342 343 344 345 346 347 348 349 350 351 352
/* control interface reports status changes with "interrupt" transfers */
static void acm_ctrl_irq(struct urb *urb)
{
	struct acm *acm = urb->context;
	struct usb_cdc_notification *dr = urb->transfer_buffer;
	unsigned int current_size = urb->actual_length;
	unsigned int expected_size, copy_size, alloc_size;
	int retval;
	int status = urb->status;

	switch (status) {
	case 0:
		/* success */
353
		break;
354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404
	case -ECONNRESET:
	case -ENOENT:
	case -ESHUTDOWN:
		/* this urb is terminated, clean up */
		dev_dbg(&acm->control->dev,
			"%s - urb shutting down with status: %d\n",
			__func__, status);
		return;
	default:
		dev_dbg(&acm->control->dev,
			"%s - nonzero urb status received: %d\n",
			__func__, status);
		goto exit;
	}

	usb_mark_last_busy(acm->dev);

	if (acm->nb_index)
		dr = (struct usb_cdc_notification *)acm->notification_buffer;

	/* size = notification-header + (optional) data */
	expected_size = sizeof(struct usb_cdc_notification) +
					le16_to_cpu(dr->wLength);

	if (current_size < expected_size) {
		/* notification is transmitted fragmented, reassemble */
		if (acm->nb_size < expected_size) {
			if (acm->nb_size) {
				kfree(acm->notification_buffer);
				acm->nb_size = 0;
			}
			alloc_size = roundup_pow_of_two(expected_size);
			/*
			 * kmalloc ensures a valid notification_buffer after a
			 * use of kfree in case the previous allocation was too
			 * small. Final freeing is done on disconnect.
			 */
			acm->notification_buffer =
				kmalloc(alloc_size, GFP_ATOMIC);
			if (!acm->notification_buffer)
				goto exit;
			acm->nb_size = alloc_size;
		}

		copy_size = min(current_size,
				expected_size - acm->nb_index);

		memcpy(&acm->notification_buffer[acm->nb_index],
		       urb->transfer_buffer, copy_size);
		acm->nb_index += copy_size;
		current_size = acm->nb_index;
L
Linus Torvalds 已提交
405
	}
406 407 408 409 410 411 412

	if (current_size >= expected_size) {
		/* notification complete */
		acm_process_notification(acm, (unsigned char *)dr);
		acm->nb_index = 0;
	}

L
Linus Torvalds 已提交
413
exit:
414
	retval = usb_submit_urb(urb, GFP_ATOMIC);
415
	if (retval && retval != -EPERM)
L
Ladislav Michl 已提交
416 417
		dev_err(&acm->control->dev,
			"%s - usb_submit_urb failed: %d\n", __func__, retval);
L
Linus Torvalds 已提交
418 419
}

420
static int acm_submit_read_urb(struct acm *acm, int index, gfp_t mem_flags)
L
Linus Torvalds 已提交
421
{
422
	int res;
423

424 425
	if (!test_and_clear_bit(index, &acm->read_urbs_free))
		return 0;
L
Linus Torvalds 已提交
426

427 428
	res = usb_submit_urb(acm->read_urbs[index], mem_flags);
	if (res) {
429
		if (res != -EPERM && res != -ENODEV) {
430
			dev_err(&acm->data->dev,
L
Ladislav Michl 已提交
431 432
				"urb %d failed submission with %d\n",
				index, res);
433 434 435
		}
		set_bit(index, &acm->read_urbs_free);
		return res;
436 437
	} else {
		dev_vdbg(&acm->data->dev, "submitted urb %d\n", index);
438
	}
L
Linus Torvalds 已提交
439

440 441
	return 0;
}
L
Linus Torvalds 已提交
442

443 444 445 446
static int acm_submit_read_urbs(struct acm *acm, gfp_t mem_flags)
{
	int res;
	int i;
447

448 449 450 451
	for (i = 0; i < acm->rx_buflimit; ++i) {
		res = acm_submit_read_urb(acm, i, mem_flags);
		if (res)
			return res;
452
	}
453 454

	return 0;
L
Linus Torvalds 已提交
455 456
}

457
static void acm_process_read_urb(struct acm *acm, struct urb *urb)
L
Linus Torvalds 已提交
458
{
459
	if (!urb->actual_length)
460
		return;
461

J
Jiri Slaby 已提交
462 463
	tty_insert_flip_string(&acm->port, urb->transfer_buffer,
			urb->actual_length);
J
Jiri Slaby 已提交
464
	tty_flip_buffer_push(&acm->port);
465
}
A
Alan Cox 已提交
466

467 468 469 470 471
static void acm_read_bulk_callback(struct urb *urb)
{
	struct acm_rb *rb = urb->context;
	struct acm *acm = rb->instance;
	unsigned long flags;
472
	int status = urb->status;
473

474
	dev_vdbg(&acm->data->dev, "got urb %d, len %d, status %d\n",
L
Ladislav Michl 已提交
475
		rb->index, urb->actual_length, status);
476

L
Ladislav Michl 已提交
477 478
	set_bit(rb->index, &acm->read_urbs_free);

479 480 481 482
	if (!acm->dev) {
		dev_dbg(&acm->data->dev, "%s - disconnected\n", __func__);
		return;
	}
483

L
Ladislav Michl 已提交
484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504
	switch (status) {
	case 0:
		usb_mark_last_busy(acm->dev);
		acm_process_read_urb(acm, urb);
		break;
	case -EPIPE:
		set_bit(EVENT_RX_STALL, &acm->flags);
		schedule_work(&acm->work);
		return;
	case -ENOENT:
	case -ECONNRESET:
	case -ESHUTDOWN:
		dev_dbg(&acm->data->dev,
			"%s - urb shutting down with status: %d\n",
			__func__, status);
		return;
	default:
		dev_dbg(&acm->data->dev,
			"%s - nonzero urb status received: %d\n",
			__func__, status);
		break;
505
	}
506

507 508 509 510 511
	/*
	 * Unthrottle may run on another CPU which needs to see events
	 * in the same order. Submission has an implict barrier
	 */
	smp_mb__before_atomic();
512 513

	/* throttle device if requested by tty */
514
	spin_lock_irqsave(&acm->read_lock, flags);
515
	acm->throttled = acm->throttle_req;
516
	if (!acm->throttled) {
517 518 519 520 521
		spin_unlock_irqrestore(&acm->read_lock, flags);
		acm_submit_read_urb(acm, rb->index, GFP_ATOMIC);
	} else {
		spin_unlock_irqrestore(&acm->read_lock, flags);
	}
L
Linus Torvalds 已提交
522 523 524
}

/* data interface wrote those outgoing bytes */
525
static void acm_write_bulk(struct urb *urb)
L
Linus Torvalds 已提交
526
{
527
	struct acm_wb *wb = urb->context;
528
	struct acm *acm = wb->instance;
529
	unsigned long flags;
530
	int status = urb->status;
L
Linus Torvalds 已提交
531

532
	if (status || (urb->actual_length != urb->transfer_buffer_length))
533
		dev_vdbg(&acm->data->dev, "wrote len %d/%d, status %d\n",
534 535
			urb->actual_length,
			urb->transfer_buffer_length,
536
			status);
L
Linus Torvalds 已提交
537

538
	spin_lock_irqsave(&acm->write_lock, flags);
539
	acm_write_done(acm, wb);
540
	spin_unlock_irqrestore(&acm->write_lock, flags);
L
Ladislav Michl 已提交
541
	set_bit(EVENT_TTY_WAKEUP, &acm->flags);
542
	schedule_work(&acm->work);
L
Linus Torvalds 已提交
543 544
}

D
David Howells 已提交
545
static void acm_softint(struct work_struct *work)
L
Linus Torvalds 已提交
546
{
L
Ladislav Michl 已提交
547
	int i;
D
David Howells 已提交
548
	struct acm *acm = container_of(work, struct acm, work);
549

L
Ladislav Michl 已提交
550 551 552 553 554 555 556 557 558 559 560 561 562 563 564
	if (test_bit(EVENT_RX_STALL, &acm->flags)) {
		if (!(usb_autopm_get_interface(acm->data))) {
			for (i = 0; i < acm->rx_buflimit; i++)
				usb_kill_urb(acm->read_urbs[i]);
			usb_clear_halt(acm->dev, acm->in);
			acm_submit_read_urbs(acm, GFP_KERNEL);
			usb_autopm_put_interface(acm->data);
		}
		clear_bit(EVENT_RX_STALL, &acm->flags);
	}

	if (test_bit(EVENT_TTY_WAKEUP, &acm->flags)) {
		tty_port_tty_wakeup(&acm->port);
		clear_bit(EVENT_TTY_WAKEUP, &acm->flags);
	}
L
Linus Torvalds 已提交
565 566 567 568 569 570
}

/*
 * TTY handlers
 */

571
static int acm_tty_install(struct tty_driver *driver, struct tty_struct *tty)
L
Linus Torvalds 已提交
572 573
{
	struct acm *acm;
574
	int retval;
L
Linus Torvalds 已提交
575

576
	acm = acm_get_by_minor(tty->index);
577 578
	if (!acm)
		return -ENODEV;
579

580
	retval = tty_standard_install(driver, tty);
581 582
	if (retval)
		goto error_init_termios;
A
Alan Cox 已提交
583

584 585 586 587 588 589 590
	/*
	 * Suppress initial echoing for some devices which might send data
	 * immediately after acm driver has been installed.
	 */
	if (acm->quirks & DISABLE_ECHO)
		tty->termios.c_lflag &= ~ECHO;

L
Linus Torvalds 已提交
591 592
	tty->driver_data = acm;

593 594 595 596 597 598 599 600 601 602 603 604 605 606
	return 0;

error_init_termios:
	tty_port_put(&acm->port);
	return retval;
}

static int acm_tty_open(struct tty_struct *tty, struct file *filp)
{
	struct acm *acm = tty->driver_data;

	return tty_port_open(&acm->port, tty, filp);
}

607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625
static void acm_port_dtr_rts(struct tty_port *port, int raise)
{
	struct acm *acm = container_of(port, struct acm, port);
	int val;
	int res;

	if (raise)
		val = ACM_CTRL_DTR | ACM_CTRL_RTS;
	else
		val = 0;

	/* FIXME: add missing ctrlout locking throughout driver */
	acm->ctrlout = val;

	res = acm_set_control(acm, val);
	if (res && (acm->ctrl_caps & USB_CDC_CAP_LINE))
		dev_err(&acm->control->dev, "failed to set dtr/rts\n");
}

626 627 628 629
static int acm_port_activate(struct tty_port *port, struct tty_struct *tty)
{
	struct acm *acm = container_of(port, struct acm, port);
	int retval = -ENODEV;
630
	int i;
631

O
Oliver Neukum 已提交
632
	mutex_lock(&acm->mutex);
633 634 635 636 637 638 639 640 641 642 643 644 645
	if (acm->disconnected)
		goto disconnected;

	retval = usb_autopm_get_interface(acm->control);
	if (retval)
		goto error_get_interface;

	/*
	 * FIXME: Why do we need this? Allocating 64K of physically contiguous
	 * memory is really nasty...
	 */
	set_bit(TTY_NO_WRITE_SPLIT, &tty->flags);
	acm->control->needs_remote_wakeup = 1;
O
Oliver Neukum 已提交
646

L
Linus Torvalds 已提交
647
	acm->ctrlurb->dev = acm->dev;
648 649
	retval = usb_submit_urb(acm->ctrlurb, GFP_KERNEL);
	if (retval) {
650 651
		dev_err(&acm->control->dev,
			"%s - usb_submit_urb(ctrl irq) failed\n", __func__);
652
		goto error_submit_urb;
L
Linus Torvalds 已提交
653 654
	}

655 656
	acm_tty_set_termios(tty, NULL);

657 658 659 660 661 662 663 664
	/*
	 * Unthrottle device in case the TTY was closed while throttled.
	 */
	spin_lock_irq(&acm->read_lock);
	acm->throttled = 0;
	acm->throttle_req = 0;
	spin_unlock_irq(&acm->read_lock);

665 666
	retval = acm_submit_read_urbs(acm, GFP_KERNEL);
	if (retval)
667
		goto error_submit_read_urbs;
668

669 670
	usb_autopm_put_interface(acm->control);

O
Oliver Neukum 已提交
671
	mutex_unlock(&acm->mutex);
L
Linus Torvalds 已提交
672

673 674 675
	return 0;

error_submit_read_urbs:
676 677
	for (i = 0; i < acm->rx_buflimit; i++)
		usb_kill_urb(acm->read_urbs[i]);
678 679
	usb_kill_urb(acm->ctrlurb);
error_submit_urb:
680
	usb_autopm_put_interface(acm->control);
681 682 683
error_get_interface:
disconnected:
	mutex_unlock(&acm->mutex);
684 685

	return usb_translate_errors(retval);
L
Linus Torvalds 已提交
686 687
}

688
static void acm_port_destruct(struct tty_port *port)
689
{
690 691 692
	struct acm *acm = container_of(port, struct acm, port);

	acm_release_minor(acm);
693
	usb_put_intf(acm->control);
694
	kfree(acm->country_codes);
695 696 697
	kfree(acm);
}

698
static void acm_port_shutdown(struct tty_port *port)
A
Alan Cox 已提交
699
{
700
	struct acm *acm = container_of(port, struct acm, port);
701 702
	struct urb *urb;
	struct acm_wb *wb;
703

704 705 706 707 708 709 710 711 712 713 714
	/*
	 * Need to grab write_lock to prevent race with resume, but no need to
	 * hold it due to the tty-port initialised flag.
	 */
	spin_lock_irq(&acm->write_lock);
	spin_unlock_irq(&acm->write_lock);

	usb_autopm_get_interface_no_resume(acm->control);
	acm->control->needs_remote_wakeup = 0;
	usb_autopm_put_interface(acm->control);

715 716 717 718 719 720 721
	for (;;) {
		urb = usb_get_from_anchor(&acm->delayed);
		if (!urb)
			break;
		wb = urb->context;
		wb->use = 0;
		usb_autopm_put_interface_async(acm->control);
A
Alan Cox 已提交
722
	}
723

L
Ladislav Michl 已提交
724
	acm_kill_urbs(acm);
725 726 727 728 729
}

static void acm_tty_cleanup(struct tty_struct *tty)
{
	struct acm *acm = tty->driver_data;
730

731
	tty_port_put(&acm->port);
A
Alan Cox 已提交
732 733 734 735 736
}

static void acm_tty_hangup(struct tty_struct *tty)
{
	struct acm *acm = tty->driver_data;
737

A
Alan Cox 已提交
738 739 740
	tty_port_hangup(&acm->port);
}

L
Linus Torvalds 已提交
741 742 743
static void acm_tty_close(struct tty_struct *tty, struct file *filp)
{
	struct acm *acm = tty->driver_data;
744

745
	tty_port_close(&acm->port, tty, filp);
L
Linus Torvalds 已提交
746 747
}

748 749
static int acm_tty_write(struct tty_struct *tty,
					const unsigned char *buf, int count)
L
Linus Torvalds 已提交
750 751 752
{
	struct acm *acm = tty->driver_data;
	int stat;
753 754 755 756
	unsigned long flags;
	int wbn;
	struct acm_wb *wb;

L
Linus Torvalds 已提交
757 758 759
	if (!count)
		return 0;

760
	dev_vdbg(&acm->data->dev, "%d bytes from tty layer\n", count);
761

762
	spin_lock_irqsave(&acm->write_lock, flags);
763 764
	wbn = acm_wb_alloc(acm);
	if (wbn < 0) {
765 766 767 768
		spin_unlock_irqrestore(&acm->write_lock, flags);
		return 0;
	}
	wb = &acm->wb[wbn];
L
Linus Torvalds 已提交
769

770 771 772 773 774 775
	if (!acm->dev) {
		wb->use = 0;
		spin_unlock_irqrestore(&acm->write_lock, flags);
		return -ENODEV;
	}

776
	count = (count > acm->writesize) ? acm->writesize : count;
777
	dev_vdbg(&acm->data->dev, "writing %d bytes\n", count);
778 779
	memcpy(wb->buf, buf, count);
	wb->len = count;
780

781 782 783 784 785 786 787
	stat = usb_autopm_get_interface_async(acm->control);
	if (stat) {
		wb->use = 0;
		spin_unlock_irqrestore(&acm->write_lock, flags);
		return stat;
	}

788
	if (acm->susp_count) {
789
		usb_anchor_urb(wb->urb, &acm->delayed);
790
		spin_unlock_irqrestore(&acm->write_lock, flags);
791
		return count;
792 793 794
	}

	stat = acm_start_wb(acm, wb);
795
	spin_unlock_irqrestore(&acm->write_lock, flags);
L
Linus Torvalds 已提交
796

797
	if (stat < 0)
L
Linus Torvalds 已提交
798 799 800 801 802 803 804
		return stat;
	return count;
}

static int acm_tty_write_room(struct tty_struct *tty)
{
	struct acm *acm = tty->driver_data;
805 806 807 808
	/*
	 * Do not let the line discipline to know that we have a reserve,
	 * or it might get too enthusiastic.
	 */
809
	return acm_wb_is_avail(acm) ? acm->writesize : 0;
L
Linus Torvalds 已提交
810 811 812 813 814
}

static int acm_tty_chars_in_buffer(struct tty_struct *tty)
{
	struct acm *acm = tty->driver_data;
815 816 817 818 819
	/*
	 * if the device was unplugged then any remaining characters fell out
	 * of the connector ;)
	 */
	if (acm->disconnected)
A
Alan Cox 已提交
820
		return 0;
821 822 823
	/*
	 * This is inaccurate (overcounts), but it works.
	 */
824
	return (ACM_NW - acm_wb_is_avail(acm)) * acm->writesize;
L
Linus Torvalds 已提交
825 826 827 828 829
}

static void acm_tty_throttle(struct tty_struct *tty)
{
	struct acm *acm = tty->driver_data;
830 831 832 833

	spin_lock_irq(&acm->read_lock);
	acm->throttle_req = 1;
	spin_unlock_irq(&acm->read_lock);
L
Linus Torvalds 已提交
834 835 836 837 838
}

static void acm_tty_unthrottle(struct tty_struct *tty)
{
	struct acm *acm = tty->driver_data;
839 840 841 842 843 844 845 846 847 848
	unsigned int was_throttled;

	spin_lock_irq(&acm->read_lock);
	was_throttled = acm->throttled;
	acm->throttled = 0;
	acm->throttle_req = 0;
	spin_unlock_irq(&acm->read_lock);

	if (was_throttled)
		acm_submit_read_urbs(acm, GFP_KERNEL);
L
Linus Torvalds 已提交
849 850
}

A
Alan Cox 已提交
851
static int acm_tty_break_ctl(struct tty_struct *tty, int state)
L
Linus Torvalds 已提交
852 853
{
	struct acm *acm = tty->driver_data;
A
Alan Cox 已提交
854
	int retval;
855

A
Alan Cox 已提交
856 857
	retval = acm_send_break(acm, state ? 0xffff : 0);
	if (retval < 0)
L
Ladislav Michl 已提交
858 859
		dev_dbg(&acm->control->dev,
			"%s - send break failed\n", __func__);
A
Alan Cox 已提交
860
	return retval;
L
Linus Torvalds 已提交
861 862
}

863
static int acm_tty_tiocmget(struct tty_struct *tty)
L
Linus Torvalds 已提交
864 865 866 867 868 869 870 871 872 873 874
{
	struct acm *acm = tty->driver_data;

	return (acm->ctrlout & ACM_CTRL_DTR ? TIOCM_DTR : 0) |
	       (acm->ctrlout & ACM_CTRL_RTS ? TIOCM_RTS : 0) |
	       (acm->ctrlin  & ACM_CTRL_DSR ? TIOCM_DSR : 0) |
	       (acm->ctrlin  & ACM_CTRL_RI  ? TIOCM_RI  : 0) |
	       (acm->ctrlin  & ACM_CTRL_DCD ? TIOCM_CD  : 0) |
	       TIOCM_CTS;
}

875
static int acm_tty_tiocmset(struct tty_struct *tty,
L
Linus Torvalds 已提交
876 877 878 879 880 881
			    unsigned int set, unsigned int clear)
{
	struct acm *acm = tty->driver_data;
	unsigned int newctrl;

	newctrl = acm->ctrlout;
882 883 884 885
	set = (set & TIOCM_DTR ? ACM_CTRL_DTR : 0) |
					(set & TIOCM_RTS ? ACM_CTRL_RTS : 0);
	clear = (clear & TIOCM_DTR ? ACM_CTRL_DTR : 0) |
					(clear & TIOCM_RTS ? ACM_CTRL_RTS : 0);
L
Linus Torvalds 已提交
886 887 888 889 890 891 892 893

	newctrl = (newctrl & ~clear) | set;

	if (acm->ctrlout == newctrl)
		return 0;
	return acm_set_control(acm, acm->ctrlout = newctrl);
}

894 895 896 897 898 899 900
static int get_serial_info(struct acm *acm, struct serial_struct __user *info)
{
	struct serial_struct tmp;

	memset(&tmp, 0, sizeof(tmp));
	tmp.xmit_fifo_size = acm->writesize;
	tmp.baud_base = le32_to_cpu(acm->line.dwDTERate);
901 902 903 904
	tmp.close_delay	= acm->port.close_delay / 10;
	tmp.closing_wait = acm->port.closing_wait == ASYNC_CLOSING_WAIT_NONE ?
				ASYNC_CLOSING_WAIT_NONE :
				acm->port.closing_wait / 10;
905 906 907 908 909 910 911

	if (copy_to_user(info, &tmp, sizeof(tmp)))
		return -EFAULT;
	else
		return 0;
}

912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942
static int set_serial_info(struct acm *acm,
				struct serial_struct __user *newinfo)
{
	struct serial_struct new_serial;
	unsigned int closing_wait, close_delay;
	int retval = 0;

	if (copy_from_user(&new_serial, newinfo, sizeof(new_serial)))
		return -EFAULT;

	close_delay = new_serial.close_delay * 10;
	closing_wait = new_serial.closing_wait == ASYNC_CLOSING_WAIT_NONE ?
			ASYNC_CLOSING_WAIT_NONE : new_serial.closing_wait * 10;

	mutex_lock(&acm->port.mutex);

	if (!capable(CAP_SYS_ADMIN)) {
		if ((close_delay != acm->port.close_delay) ||
		    (closing_wait != acm->port.closing_wait))
			retval = -EPERM;
		else
			retval = -EOPNOTSUPP;
	} else {
		acm->port.close_delay  = close_delay;
		acm->port.closing_wait = closing_wait;
	}

	mutex_unlock(&acm->port.mutex);
	return retval;
}

O
Oliver Neukum 已提交
943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985
static int wait_serial_change(struct acm *acm, unsigned long arg)
{
	int rv = 0;
	DECLARE_WAITQUEUE(wait, current);
	struct async_icount old, new;

	do {
		spin_lock_irq(&acm->read_lock);
		old = acm->oldcount;
		new = acm->iocount;
		acm->oldcount = new;
		spin_unlock_irq(&acm->read_lock);

		if ((arg & TIOCM_DSR) &&
			old.dsr != new.dsr)
			break;
		if ((arg & TIOCM_CD)  &&
			old.dcd != new.dcd)
			break;
		if ((arg & TIOCM_RI) &&
			old.rng != new.rng)
			break;

		add_wait_queue(&acm->wioctl, &wait);
		set_current_state(TASK_INTERRUPTIBLE);
		schedule();
		remove_wait_queue(&acm->wioctl, &wait);
		if (acm->disconnected) {
			if (arg & TIOCM_CD)
				break;
			else
				rv = -ENODEV;
		} else {
			if (signal_pending(current))
				rv = -ERESTARTSYS;
		}
	} while (!rv);

	

	return rv;
}

986 987
static int acm_tty_get_icount(struct tty_struct *tty,
					struct serial_icounter_struct *icount)
O
Oliver Neukum 已提交
988
{
989
	struct acm *acm = tty->driver_data;
O
Oliver Neukum 已提交
990

991 992 993 994 995 996 997
	icount->dsr = acm->iocount.dsr;
	icount->rng = acm->iocount.rng;
	icount->dcd = acm->iocount.dcd;
	icount->frame = acm->iocount.frame;
	icount->overrun = acm->iocount.overrun;
	icount->parity = acm->iocount.parity;
	icount->brk = acm->iocount.brk;
O
Oliver Neukum 已提交
998

999
	return 0;
O
Oliver Neukum 已提交
1000 1001
}

1002
static int acm_tty_ioctl(struct tty_struct *tty,
1003
					unsigned int cmd, unsigned long arg)
L
Linus Torvalds 已提交
1004
{
1005 1006 1007 1008 1009 1010
	struct acm *acm = tty->driver_data;
	int rv = -ENOIOCTLCMD;

	switch (cmd) {
	case TIOCGSERIAL: /* gets serial port data */
		rv = get_serial_info(acm, (struct serial_struct __user *) arg);
1011 1012 1013
		break;
	case TIOCSSERIAL:
		rv = set_serial_info(acm, (struct serial_struct __user *) arg);
1014
		break;
O
Oliver Neukum 已提交
1015
	case TIOCMIWAIT:
1016 1017 1018 1019 1020
		rv = usb_autopm_get_interface(acm->control);
		if (rv < 0) {
			rv = -EIO;
			break;
		}
O
Oliver Neukum 已提交
1021
		rv = wait_serial_change(acm, arg);
1022
		usb_autopm_put_interface(acm->control);
O
Oliver Neukum 已提交
1023
		break;
1024 1025 1026
	}

	return rv;
L
Linus Torvalds 已提交
1027 1028
}

1029 1030
static void acm_tty_set_termios(struct tty_struct *tty,
						struct ktermios *termios_old)
L
Linus Torvalds 已提交
1031 1032
{
	struct acm *acm = tty->driver_data;
1033
	struct ktermios *termios = &tty->termios;
L
Linus Torvalds 已提交
1034 1035 1036
	struct usb_cdc_line_coding newline;
	int newctrl = acm->ctrlout;

1037
	newline.dwDTERate = cpu_to_le32(tty_get_baud_rate(tty));
L
Linus Torvalds 已提交
1038 1039
	newline.bCharFormat = termios->c_cflag & CSTOPB ? 2 : 0;
	newline.bParityType = termios->c_cflag & PARENB ?
1040 1041
				(termios->c_cflag & PARODD ? 1 : 2) +
				(termios->c_cflag & CMSPAR ? 2 : 0) : 0;
1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056
	switch (termios->c_cflag & CSIZE) {
	case CS5:
		newline.bDataBits = 5;
		break;
	case CS6:
		newline.bDataBits = 6;
		break;
	case CS7:
		newline.bDataBits = 7;
		break;
	case CS8:
	default:
		newline.bDataBits = 8;
		break;
	}
1057
	/* FIXME: Needs to clear unsupported bits in the termios */
L
Linus Torvalds 已提交
1058 1059
	acm->clocal = ((termios->c_cflag & CLOCAL) != 0);

1060
	if (C_BAUD(tty) == B0) {
L
Linus Torvalds 已提交
1061 1062
		newline.dwDTERate = acm->line.dwDTERate;
		newctrl &= ~ACM_CTRL_DTR;
1063
	} else if (termios_old && (termios_old->c_cflag & CBAUD) == B0) {
1064
		newctrl |=  ACM_CTRL_DTR;
1065
	}
L
Linus Torvalds 已提交
1066 1067 1068 1069 1070 1071

	if (newctrl != acm->ctrlout)
		acm_set_control(acm, acm->ctrlout = newctrl);

	if (memcmp(&acm->line, &newline, sizeof newline)) {
		memcpy(&acm->line, &newline, sizeof newline);
1072 1073 1074
		dev_dbg(&acm->control->dev, "%s - set line: %d %d %d %d\n",
			__func__,
			le32_to_cpu(newline.dwDTERate),
L
Linus Torvalds 已提交
1075 1076 1077 1078 1079 1080
			newline.bCharFormat, newline.bParityType,
			newline.bDataBits);
		acm_set_line(acm, &acm->line);
	}
}

1081
static const struct tty_port_operations acm_port_ops = {
1082
	.dtr_rts = acm_port_dtr_rts,
1083 1084 1085 1086 1087
	.shutdown = acm_port_shutdown,
	.activate = acm_port_activate,
	.destruct = acm_port_destruct,
};

L
Linus Torvalds 已提交
1088 1089 1090 1091
/*
 * USB probe and disconnect routines.
 */

1092
/* Little helpers: write/read buffers free */
1093 1094 1095 1096 1097
static void acm_write_buffers_free(struct acm *acm)
{
	int i;
	struct acm_wb *wb;

1098
	for (wb = &acm->wb[0], i = 0; i < ACM_NW; i++, wb++)
1099
		usb_free_coherent(acm->dev, acm->writesize, wb->buf, wb->dmah);
1100 1101
}

1102 1103
static void acm_read_buffers_free(struct acm *acm)
{
1104
	int i;
1105

1106
	for (i = 0; i < acm->rx_buflimit; i++)
1107
		usb_free_coherent(acm->dev, acm->readsize,
1108
			  acm->read_buffers[i].base, acm->read_buffers[i].dma);
1109 1110
}

1111 1112 1113 1114 1115 1116
/* Little helper: write buffers allocate */
static int acm_write_buffers_alloc(struct acm *acm)
{
	int i;
	struct acm_wb *wb;

1117
	for (wb = &acm->wb[0], i = 0; i < ACM_NW; i++, wb++) {
1118
		wb->buf = usb_alloc_coherent(acm->dev, acm->writesize, GFP_KERNEL,
1119 1120 1121 1122 1123
		    &wb->dmah);
		if (!wb->buf) {
			while (i != 0) {
				--i;
				--wb;
1124
				usb_free_coherent(acm->dev, acm->writesize,
1125 1126 1127 1128 1129 1130 1131 1132
				    wb->buf, wb->dmah);
			}
			return -ENOMEM;
		}
	}
	return 0;
}

A
Alan Cox 已提交
1133 1134
static int acm_probe(struct usb_interface *intf,
		     const struct usb_device_id *id)
L
Linus Torvalds 已提交
1135 1136
{
	struct usb_cdc_union_desc *union_header = NULL;
O
Oliver Neukum 已提交
1137
	struct usb_cdc_call_mgmt_descriptor *cmgmd = NULL;
D
David Brownell 已提交
1138
	unsigned char *buffer = intf->altsetting->extra;
L
Linus Torvalds 已提交
1139 1140 1141
	int buflen = intf->altsetting->extralen;
	struct usb_interface *control_interface;
	struct usb_interface *data_interface;
1142 1143 1144
	struct usb_endpoint_descriptor *epctrl = NULL;
	struct usb_endpoint_descriptor *epread = NULL;
	struct usb_endpoint_descriptor *epwrite = NULL;
L
Linus Torvalds 已提交
1145
	struct usb_device *usb_dev = interface_to_usbdev(intf);
O
Oliver Neukum 已提交
1146
	struct usb_cdc_parsed_header h;
L
Linus Torvalds 已提交
1147 1148
	struct acm *acm;
	int minor;
1149
	int ctrlsize, readsize;
L
Linus Torvalds 已提交
1150
	u8 *buf;
O
Oliver Neukum 已提交
1151 1152
	int call_intf_num = -1;
	int data_intf_num = -1;
L
Linus Torvalds 已提交
1153
	unsigned long quirks;
1154
	int num_rx_buf;
1155
	int i;
1156
	int combined_interfaces = 0;
1157 1158
	struct device *tty_dev;
	int rv = -ENOMEM;
1159
	int res;
L
Linus Torvalds 已提交
1160

1161
	/* normal quirks */
L
Linus Torvalds 已提交
1162
	quirks = (unsigned long)id->driver_info;
1163 1164 1165 1166

	if (quirks == IGNORE_DEVICE)
		return -ENODEV;

1167 1168
	memset(&h, 0x00, sizeof(struct usb_cdc_parsed_header));

1169 1170 1171
	num_rx_buf = (quirks == SINGLE_RX_URB) ? 1 : ACM_NR;

	/* handle quirks deadly to normal probing*/
L
Linus Torvalds 已提交
1172 1173 1174
	if (quirks == NO_UNION_NORMAL) {
		data_interface = usb_ifnum_to_if(usb_dev, 1);
		control_interface = usb_ifnum_to_if(usb_dev, 0);
1175 1176 1177
		/* we would crash */
		if (!data_interface || !control_interface)
			return -ENODEV;
L
Linus Torvalds 已提交
1178 1179
		goto skip_normal_probe;
	}
1180

L
Linus Torvalds 已提交
1181 1182
	/* normal probing*/
	if (!buffer) {
1183
		dev_err(&intf->dev, "Weird descriptor references\n");
L
Linus Torvalds 已提交
1184 1185 1186
		return -EINVAL;
	}

1187 1188 1189
	if (!intf->cur_altsetting)
		return -EINVAL;

L
Linus Torvalds 已提交
1190
	if (!buflen) {
1191 1192
		if (intf->cur_altsetting->endpoint &&
				intf->cur_altsetting->endpoint->extralen &&
1193 1194 1195
				intf->cur_altsetting->endpoint->extra) {
			dev_dbg(&intf->dev,
				"Seeking extra descriptors on endpoint\n");
L
Linus Torvalds 已提交
1196 1197 1198
			buflen = intf->cur_altsetting->endpoint->extralen;
			buffer = intf->cur_altsetting->endpoint->extra;
		} else {
1199 1200
			dev_err(&intf->dev,
				"Zero length descriptor references\n");
L
Linus Torvalds 已提交
1201 1202 1203 1204
			return -EINVAL;
		}
	}

O
Oliver Neukum 已提交
1205 1206 1207 1208 1209
	cdc_parse_cdc_header(&h, intf, buffer, buflen);
	union_header = h.usb_cdc_union_desc;
	cmgmd = h.usb_cdc_call_mgmt_descriptor;
	if (cmgmd)
		call_intf_num = cmgmd->bDataInterface;
L
Linus Torvalds 已提交
1210 1211

	if (!union_header) {
O
Oliver Neukum 已提交
1212
		if (call_intf_num > 0) {
1213
			dev_dbg(&intf->dev, "No union descriptor, using call management descriptor\n");
1214
			/* quirks for Droids MuIn LCD */
O
Oliver Neukum 已提交
1215
			if (quirks & NO_DATA_INTERFACE) {
1216
				data_interface = usb_ifnum_to_if(usb_dev, 0);
O
Oliver Neukum 已提交
1217 1218 1219 1220
			} else {
				data_intf_num = call_intf_num;
				data_interface = usb_ifnum_to_if(usb_dev, data_intf_num);
			}
L
Linus Torvalds 已提交
1221 1222
			control_interface = intf;
		} else {
1223 1224 1225 1226 1227 1228 1229 1230 1231
			if (intf->cur_altsetting->desc.bNumEndpoints != 3) {
				dev_dbg(&intf->dev,"No union descriptor, giving up\n");
				return -ENODEV;
			} else {
				dev_warn(&intf->dev,"No union descriptor, testing for castrated device\n");
				combined_interfaces = 1;
				control_interface = data_interface = intf;
				goto look_for_collapsed_interface;
			}
L
Linus Torvalds 已提交
1232 1233
		}
	} else {
O
Oliver Neukum 已提交
1234
		data_intf_num = union_header->bSlaveInterface0;
L
Linus Torvalds 已提交
1235
		control_interface = usb_ifnum_to_if(usb_dev, union_header->bMasterInterface0);
O
Oliver Neukum 已提交
1236
		data_interface = usb_ifnum_to_if(usb_dev, data_intf_num);
1237 1238 1239 1240 1241
	}

	if (!control_interface || !data_interface) {
		dev_dbg(&intf->dev, "no interfaces\n");
		return -ENODEV;
L
Linus Torvalds 已提交
1242
	}
1243 1244
	if (!data_interface->cur_altsetting || !control_interface->cur_altsetting)
		return -ENODEV;
1245

O
Oliver Neukum 已提交
1246
	if (data_intf_num != call_intf_num)
1247
		dev_dbg(&intf->dev, "Separate call control interface. That is not fully supported.\n");
L
Linus Torvalds 已提交
1248

1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259
	if (control_interface == data_interface) {
		/* some broken devices designed for windows work this way */
		dev_warn(&intf->dev,"Control and data interfaces are not separated!\n");
		combined_interfaces = 1;
		/* a popular other OS doesn't use it */
		quirks |= NO_CAP_LINE;
		if (data_interface->cur_altsetting->desc.bNumEndpoints != 3) {
			dev_err(&intf->dev, "This needs exactly 3 endpoints\n");
			return -EINVAL;
		}
look_for_collapsed_interface:
1260 1261 1262 1263 1264 1265
		res = usb_find_common_endpoints(data_interface->cur_altsetting,
				&epread, &epwrite, &epctrl, NULL);
		if (res)
			return res;

		goto made_compressed_probe;
1266 1267
	}

L
Linus Torvalds 已提交
1268 1269 1270
skip_normal_probe:

	/*workaround for switched interfaces */
1271 1272 1273 1274 1275 1276
	if (data_interface->cur_altsetting->desc.bInterfaceClass
						!= CDC_DATA_INTERFACE_TYPE) {
		if (control_interface->cur_altsetting->desc.bInterfaceClass
						== CDC_DATA_INTERFACE_TYPE) {
			dev_dbg(&intf->dev,
				"Your device has switched interfaces.\n");
1277
			swap(control_interface, data_interface);
L
Linus Torvalds 已提交
1278 1279 1280 1281
		} else {
			return -EINVAL;
		}
	}
1282 1283

	/* Accept probe requests only for the control interface */
1284
	if (!combined_interfaces && intf != control_interface)
1285
		return -ENODEV;
1286

1287 1288
	if (!combined_interfaces && usb_interface_claimed(data_interface)) {
		/* valid in this context */
1289
		dev_dbg(&intf->dev, "The data interface isn't available\n");
L
Linus Torvalds 已提交
1290 1291 1292 1293
		return -EBUSY;
	}


1294 1295
	if (data_interface->cur_altsetting->desc.bNumEndpoints < 2 ||
	    control_interface->cur_altsetting->desc.bNumEndpoints == 0)
L
Linus Torvalds 已提交
1296 1297 1298 1299 1300 1301 1302 1303
		return -EINVAL;

	epctrl = &control_interface->cur_altsetting->endpoint[0].desc;
	epread = &data_interface->cur_altsetting->endpoint[0].desc;
	epwrite = &data_interface->cur_altsetting->endpoint[1].desc;


	/* workaround for switched endpoints */
1304
	if (!usb_endpoint_dir_in(epread)) {
L
Linus Torvalds 已提交
1305
		/* descriptors are swapped */
1306 1307
		dev_dbg(&intf->dev,
			"The data interface has switched endpoints\n");
1308
		swap(epread, epwrite);
L
Linus Torvalds 已提交
1309
	}
1310
made_compressed_probe:
1311
	dev_dbg(&intf->dev, "interfaces are valid\n");
L
Linus Torvalds 已提交
1312

1313
	acm = kzalloc(sizeof(struct acm), GFP_KERNEL);
1314
	if (acm == NULL)
L
Linus Torvalds 已提交
1315 1316
		goto alloc_fail;

1317 1318 1319
	tty_port_init(&acm->port);
	acm->port.ops = &acm_port_ops;

1320
	minor = acm_alloc_minor(acm);
O
Oliver Neukum 已提交
1321 1322
	if (minor < 0)
		goto alloc_fail1;
1323

1324 1325
	ctrlsize = usb_endpoint_maxp(epctrl);
	readsize = usb_endpoint_maxp(epread) *
1326
				(quirks == SINGLE_RX_URB ? 1 : 2);
1327
	acm->combined_interfaces = combined_interfaces;
1328
	acm->writesize = usb_endpoint_maxp(epwrite) * 20;
L
Linus Torvalds 已提交
1329 1330 1331 1332
	acm->control = control_interface;
	acm->data = data_interface;
	acm->minor = minor;
	acm->dev = usb_dev;
O
Oliver Neukum 已提交
1333 1334
	if (h.usb_cdc_acm_descriptor)
		acm->ctrl_caps = h.usb_cdc_acm_descriptor->bmCapabilities;
1335 1336
	if (quirks & NO_CAP_LINE)
		acm->ctrl_caps &= ~USB_CDC_CAP_LINE;
L
Linus Torvalds 已提交
1337 1338
	acm->ctrlsize = ctrlsize;
	acm->readsize = readsize;
1339
	acm->rx_buflimit = num_rx_buf;
D
David Howells 已提交
1340
	INIT_WORK(&acm->work, acm_softint);
O
Oliver Neukum 已提交
1341
	init_waitqueue_head(&acm->wioctl);
1342
	spin_lock_init(&acm->write_lock);
1343
	spin_lock_init(&acm->read_lock);
O
Oliver Neukum 已提交
1344
	mutex_init(&acm->mutex);
1345
	if (usb_endpoint_xfer_int(epread)) {
1346
		acm->bInterval = epread->bInterval;
1347 1348 1349 1350 1351 1352 1353 1354
		acm->in = usb_rcvintpipe(usb_dev, epread->bEndpointAddress);
	} else {
		acm->in = usb_rcvbulkpipe(usb_dev, epread->bEndpointAddress);
	}
	if (usb_endpoint_xfer_int(epwrite))
		acm->out = usb_sndintpipe(usb_dev, epwrite->bEndpointAddress);
	else
		acm->out = usb_sndbulkpipe(usb_dev, epwrite->bEndpointAddress);
1355
	init_usb_anchor(&acm->delayed);
1356
	acm->quirks = quirks;
L
Linus Torvalds 已提交
1357

1358
	buf = usb_alloc_coherent(usb_dev, ctrlsize, GFP_KERNEL, &acm->ctrl_dma);
1359
	if (!buf)
1360
		goto alloc_fail1;
L
Linus Torvalds 已提交
1361 1362
	acm->ctrl_buffer = buf;

1363
	if (acm_write_buffers_alloc(acm) < 0)
1364
		goto alloc_fail2;
L
Linus Torvalds 已提交
1365 1366

	acm->ctrlurb = usb_alloc_urb(0, GFP_KERNEL);
1367
	if (!acm->ctrlurb)
1368
		goto alloc_fail3;
1369

1370
	for (i = 0; i < num_rx_buf; i++) {
1371 1372
		struct acm_rb *rb = &(acm->read_buffers[i]);
		struct urb *urb;
1373

1374 1375
		rb->base = usb_alloc_coherent(acm->dev, readsize, GFP_KERNEL,
								&rb->dma);
1376
		if (!rb->base)
1377
			goto alloc_fail4;
1378 1379
		rb->index = i;
		rb->instance = acm;
1380

1381
		urb = usb_alloc_urb(0, GFP_KERNEL);
1382
		if (!urb)
1383
			goto alloc_fail4;
1384

1385 1386
		urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
		urb->transfer_dma = rb->dma;
1387
		if (usb_endpoint_xfer_int(epread))
1388
			usb_fill_int_urb(urb, acm->dev, acm->in, rb->base,
1389 1390 1391
					 acm->readsize,
					 acm_read_bulk_callback, rb,
					 acm->bInterval);
1392 1393
		else
			usb_fill_bulk_urb(urb, acm->dev, acm->in, rb->base,
1394 1395
					  acm->readsize,
					  acm_read_bulk_callback, rb);
1396

1397 1398
		acm->read_urbs[i] = urb;
		__set_bit(i, &acm->read_urbs_free);
1399
	}
1400
	for (i = 0; i < ACM_NW; i++) {
1401 1402
		struct acm_wb *snd = &(acm->wb[i]);

1403
		snd->urb = usb_alloc_urb(0, GFP_KERNEL);
1404
		if (snd->urb == NULL)
1405
			goto alloc_fail5;
1406

1407
		if (usb_endpoint_xfer_int(epwrite))
1408
			usb_fill_int_urb(snd->urb, usb_dev, acm->out,
1409 1410
				NULL, acm->writesize, acm_write_bulk, snd, epwrite->bInterval);
		else
1411
			usb_fill_bulk_urb(snd->urb, usb_dev, acm->out,
1412
				NULL, acm->writesize, acm_write_bulk, snd);
1413
		snd->urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
1414 1415
		if (quirks & SEND_ZERO_PACKET)
			snd->urb->transfer_flags |= URB_ZERO_PACKET;
1416
		snd->instance = acm;
L
Linus Torvalds 已提交
1417 1418
	}

1419
	usb_set_intfdata(intf, acm);
1420 1421 1422

	i = device_create_file(&intf->dev, &dev_attr_bmCapabilities);
	if (i < 0)
1423
		goto alloc_fail5;
1424

O
Oliver Neukum 已提交
1425 1426 1427 1428
	if (h.usb_cdc_country_functional_desc) { /* export the country data */
		struct usb_cdc_country_functional_desc * cfd =
					h.usb_cdc_country_functional_desc;

1429 1430 1431 1432
		acm->country_codes = kmalloc(cfd->bLength - 4, GFP_KERNEL);
		if (!acm->country_codes)
			goto skip_countries;
		acm->country_code_size = cfd->bLength - 4;
1433 1434
		memcpy(acm->country_codes, (u8 *)&cfd->wCountyCode0,
							cfd->bLength - 4);
1435 1436 1437 1438 1439
		acm->country_rel_date = cfd->iCountryCodeRelDate;

		i = device_create_file(&intf->dev, &dev_attr_wCountryCodes);
		if (i < 0) {
			kfree(acm->country_codes);
1440 1441
			acm->country_codes = NULL;
			acm->country_code_size = 0;
1442 1443 1444
			goto skip_countries;
		}

1445 1446
		i = device_create_file(&intf->dev,
						&dev_attr_iCountryCodeRelDate);
1447
		if (i < 0) {
1448
			device_remove_file(&intf->dev, &dev_attr_wCountryCodes);
1449
			kfree(acm->country_codes);
1450 1451
			acm->country_codes = NULL;
			acm->country_code_size = 0;
1452 1453 1454 1455 1456
			goto skip_countries;
		}
	}

skip_countries:
1457
	usb_fill_int_urb(acm->ctrlurb, usb_dev,
1458 1459 1460
			 usb_rcvintpipe(usb_dev, epctrl->bEndpointAddress),
			 acm->ctrl_buffer, ctrlsize, acm_ctrl_irq, acm,
			 /* works around buggy devices */
1461
			 epctrl->bInterval ? epctrl->bInterval : 16);
L
Linus Torvalds 已提交
1462 1463
	acm->ctrlurb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
	acm->ctrlurb->transfer_dma = acm->ctrl_dma;
1464 1465 1466
	acm->notification_buffer = NULL;
	acm->nb_index = 0;
	acm->nb_size = 0;
L
Linus Torvalds 已提交
1467 1468 1469 1470 1471 1472 1473 1474

	dev_info(&intf->dev, "ttyACM%d: USB ACM device\n", minor);

	acm->line.dwDTERate = cpu_to_le32(9600);
	acm->line.bDataBits = 8;
	acm_set_line(acm, &acm->line);

	usb_driver_claim_interface(&acm_driver, data_interface, acm);
D
David Brownell 已提交
1475
	usb_set_intfdata(data_interface, acm);
L
Linus Torvalds 已提交
1476

1477
	usb_get_intf(control_interface);
1478
	tty_dev = tty_port_register_device(&acm->port, acm_tty_driver, minor,
J
Jiri Slaby 已提交
1479
			&control_interface->dev);
1480 1481
	if (IS_ERR(tty_dev)) {
		rv = PTR_ERR(tty_dev);
1482
		goto alloc_fail6;
1483
	}
L
Linus Torvalds 已提交
1484

1485
	if (quirks & CLEAR_HALT_CONDITIONS) {
1486 1487
		usb_clear_halt(usb_dev, acm->in);
		usb_clear_halt(usb_dev, acm->out);
1488 1489
	}

1490
	return 0;
1491
alloc_fail6:
1492 1493 1494 1495 1496
	if (acm->country_codes) {
		device_remove_file(&acm->control->dev,
				&dev_attr_wCountryCodes);
		device_remove_file(&acm->control->dev,
				&dev_attr_iCountryCodeRelDate);
O
Oliver Neukum 已提交
1497
		kfree(acm->country_codes);
1498 1499
	}
	device_remove_file(&acm->control->dev, &dev_attr_bmCapabilities);
1500
alloc_fail5:
1501
	usb_set_intfdata(intf, NULL);
1502 1503
	for (i = 0; i < ACM_NW; i++)
		usb_free_urb(acm->wb[i].urb);
1504
alloc_fail4:
1505
	for (i = 0; i < num_rx_buf; i++)
1506
		usb_free_urb(acm->read_urbs[i]);
1507
	acm_read_buffers_free(acm);
L
Linus Torvalds 已提交
1508
	usb_free_urb(acm->ctrlurb);
1509
alloc_fail3:
1510
	acm_write_buffers_free(acm);
L
Linus Torvalds 已提交
1511
alloc_fail2:
1512
	usb_free_coherent(usb_dev, ctrlsize, acm->ctrl_buffer, acm->ctrl_dma);
O
Oliver Neukum 已提交
1513
alloc_fail1:
1514
	tty_port_put(&acm->port);
L
Linus Torvalds 已提交
1515
alloc_fail:
1516
	return rv;
L
Linus Torvalds 已提交
1517 1518 1519 1520
}

static void acm_disconnect(struct usb_interface *intf)
{
1521
	struct acm *acm = usb_get_intfdata(intf);
A
Alan Cox 已提交
1522
	struct tty_struct *tty;
1523
	int i;
1524

D
David Brownell 已提交
1525 1526
	/* sibling interface is already cleaning up */
	if (!acm)
1527
		return;
D
David Brownell 已提交
1528

1529 1530
	mutex_lock(&acm->mutex);
	acm->disconnected = true;
1531
	if (acm->country_codes) {
1532 1533 1534 1535
		device_remove_file(&acm->control->dev,
				&dev_attr_wCountryCodes);
		device_remove_file(&acm->control->dev,
				&dev_attr_iCountryCodeRelDate);
1536
	}
O
Oliver Neukum 已提交
1537
	wake_up_all(&acm->wioctl);
1538
	device_remove_file(&acm->control->dev, &dev_attr_bmCapabilities);
1539 1540
	usb_set_intfdata(acm->control, NULL);
	usb_set_intfdata(acm->data, NULL);
1541 1542 1543 1544 1545 1546 1547
	mutex_unlock(&acm->mutex);

	tty = tty_port_tty_get(&acm->port);
	if (tty) {
		tty_vhangup(tty);
		tty_kref_put(tty);
	}
L
Linus Torvalds 已提交
1548

L
Ladislav Michl 已提交
1549 1550
	acm_kill_urbs(acm);
	cancel_work_sync(&acm->work);
L
Linus Torvalds 已提交
1551

1552 1553
	tty_unregister_device(acm_tty_driver, acm->minor);

1554 1555 1556 1557 1558
	usb_free_urb(acm->ctrlurb);
	for (i = 0; i < ACM_NW; i++)
		usb_free_urb(acm->wb[i].urb);
	for (i = 0; i < acm->rx_buflimit; i++)
		usb_free_urb(acm->read_urbs[i]);
1559
	acm_write_buffers_free(acm);
1560
	usb_free_coherent(acm->dev, acm->ctrlsize, acm->ctrl_buffer, acm->ctrl_dma);
1561
	acm_read_buffers_free(acm);
L
Linus Torvalds 已提交
1562

1563 1564
	kfree(acm->notification_buffer);

1565 1566
	if (!acm->combined_interfaces)
		usb_driver_release_interface(&acm_driver, intf == acm->control ?
1567
					acm->data : acm->control);
L
Linus Torvalds 已提交
1568

1569
	tty_port_put(&acm->port);
L
Linus Torvalds 已提交
1570 1571
}

1572
#ifdef CONFIG_PM
O
Oliver Neukum 已提交
1573 1574 1575
static int acm_suspend(struct usb_interface *intf, pm_message_t message)
{
	struct acm *acm = usb_get_intfdata(intf);
1576 1577
	int cnt;

1578
	spin_lock_irq(&acm->write_lock);
1579
	if (PMSG_IS_AUTO(message)) {
1580
		if (acm->transmitting) {
1581
			spin_unlock_irq(&acm->write_lock);
1582
			return -EBUSY;
1583
		}
1584 1585
	}
	cnt = acm->susp_count++;
1586
	spin_unlock_irq(&acm->write_lock);
O
Oliver Neukum 已提交
1587

1588
	if (cnt)
O
Oliver Neukum 已提交
1589 1590
		return 0;

L
Ladislav Michl 已提交
1591 1592
	acm_kill_urbs(acm);
	cancel_work_sync(&acm->work);
O
Oliver Neukum 已提交
1593 1594 1595 1596 1597 1598 1599

	return 0;
}

static int acm_resume(struct usb_interface *intf)
{
	struct acm *acm = usb_get_intfdata(intf);
1600
	struct urb *urb;
O
Oliver Neukum 已提交
1601 1602
	int rv = 0;

1603
	spin_lock_irq(&acm->write_lock);
1604

1605 1606
	if (--acm->susp_count)
		goto out;
O
Oliver Neukum 已提交
1607

1608
	if (tty_port_initialized(&acm->port)) {
1609
		rv = usb_submit_urb(acm->ctrlurb, GFP_ATOMIC);
1610

1611 1612 1613 1614 1615 1616
		for (;;) {
			urb = usb_get_from_anchor(&acm->delayed);
			if (!urb)
				break;

			acm_start_wb(acm, urb->context);
1617 1618 1619 1620 1621 1622
		}

		/*
		 * delayed error checking because we must
		 * do the write path at all cost
		 */
O
Oliver Neukum 已提交
1623
		if (rv < 0)
1624
			goto out;
O
Oliver Neukum 已提交
1625

1626
		rv = acm_submit_read_urbs(acm, GFP_ATOMIC);
O
Oliver Neukum 已提交
1627
	}
1628
out:
1629
	spin_unlock_irq(&acm->write_lock);
O
Oliver Neukum 已提交
1630 1631 1632

	return rv;
}
1633

1634 1635 1636 1637
static int acm_reset_resume(struct usb_interface *intf)
{
	struct acm *acm = usb_get_intfdata(intf);

1638
	if (tty_port_initialized(&acm->port))
J
Jiri Slaby 已提交
1639
		tty_port_tty_hangup(&acm->port, false);
1640

1641 1642 1643
	return acm_resume(intf);
}

1644
#endif /* CONFIG_PM */
1645

L
Ladislav Michl 已提交
1646 1647 1648 1649 1650
static int acm_pre_reset(struct usb_interface *intf)
{
	struct acm *acm = usb_get_intfdata(intf);

	clear_bit(EVENT_RX_STALL, &acm->flags);
1651
	acm->nb_index = 0; /* pending control transfers are lost */
L
Ladislav Michl 已提交
1652 1653 1654 1655

	return 0;
}

1656 1657 1658 1659 1660
#define NOKIA_PCSUITE_ACM_INFO(x) \
		USB_DEVICE_AND_INTERFACE_INFO(0x0421, x, \
		USB_CLASS_COMM, USB_CDC_SUBCLASS_ACM, \
		USB_CDC_ACM_PROTO_VENDOR)

1661 1662 1663 1664 1665
#define SAMSUNG_PCSUITE_ACM_INFO(x) \
		USB_DEVICE_AND_INTERFACE_INFO(0x04e7, x, \
		USB_CLASS_COMM, USB_CDC_SUBCLASS_ACM, \
		USB_CDC_ACM_PROTO_VENDOR)

L
Linus Torvalds 已提交
1666 1667 1668 1669
/*
 * USB driver structure.
 */

1670
static const struct usb_device_id acm_ids[] = {
L
Linus Torvalds 已提交
1671
	/* quirky and broken devices */
1672 1673
	{ USB_DEVICE(0x076d, 0x0006), /* Denso Cradle CU-321 */
	.driver_info = NO_UNION_NORMAL, },/* has no union descriptor */
1674 1675
	{ USB_DEVICE(0x17ef, 0x7000), /* Lenovo USB modem */
	.driver_info = NO_UNION_NORMAL, },/* has no union descriptor */
L
Linus Torvalds 已提交
1676 1677 1678
	{ USB_DEVICE(0x0870, 0x0001), /* Metricom GS Modem */
	.driver_info = NO_UNION_NORMAL, /* has no union descriptor */
	},
1679 1680 1681
	{ USB_DEVICE(0x0e8d, 0x0003), /* FIREFLY, MediaTek Inc; andrey.arapov@gmail.com */
	.driver_info = NO_UNION_NORMAL, /* has no union descriptor */
	},
1682 1683 1684
	{ USB_DEVICE(0x0e8d, 0x2000), /* MediaTek Inc Preloader */
	.driver_info = DISABLE_ECHO, /* DISABLE ECHO in termios flag */
	},
A
Andrew Lunn 已提交
1685 1686 1687
	{ USB_DEVICE(0x0e8d, 0x3329), /* MediaTek Inc GPS */
	.driver_info = NO_UNION_NORMAL, /* has no union descriptor */
	},
1688 1689 1690
	{ USB_DEVICE(0x0482, 0x0203), /* KYOCERA AH-K3001V */
	.driver_info = NO_UNION_NORMAL, /* has no union descriptor */
	},
1691 1692 1693
	{ USB_DEVICE(0x079b, 0x000f), /* BT On-Air USB MODEM */
	.driver_info = NO_UNION_NORMAL, /* has no union descriptor */
	},
A
Alan Cox 已提交
1694 1695 1696
	{ USB_DEVICE(0x0ace, 0x1602), /* ZyDAS 56K USB MODEM */
	.driver_info = SINGLE_RX_URB,
	},
1697 1698 1699
	{ USB_DEVICE(0x0ace, 0x1608), /* ZyDAS 56K USB MODEM */
	.driver_info = SINGLE_RX_URB, /* firmware bug */
	},
1700 1701 1702
	{ USB_DEVICE(0x0ace, 0x1611), /* ZyDAS 56K USB MODEM - new version */
	.driver_info = SINGLE_RX_URB, /* firmware bug */
	},
1703 1704 1705
	{ USB_DEVICE(0x11ca, 0x0201), /* VeriFone Mx870 Gadget Serial */
	.driver_info = SINGLE_RX_URB,
	},
1706 1707 1708
	{ USB_DEVICE(0x1965, 0x0018), /* Uniden UBC125XLT */
	.driver_info = NO_UNION_NORMAL, /* has no union descriptor */
	},
O
Oliver Neukum 已提交
1709 1710 1711
	{ USB_DEVICE(0x22b8, 0x7000), /* Motorola Q Phone */
	.driver_info = NO_UNION_NORMAL, /* has no union descriptor */
	},
1712 1713 1714
	{ USB_DEVICE(0x0803, 0x3095), /* Zoom Telephonics Model 3095F USB MODEM */
	.driver_info = NO_UNION_NORMAL, /* has no union descriptor */
	},
1715 1716 1717
	{ USB_DEVICE(0x0572, 0x1321), /* Conexant USB MODEM CX93010 */
	.driver_info = NO_UNION_NORMAL, /* has no union descriptor */
	},
1718 1719 1720
	{ USB_DEVICE(0x0572, 0x1324), /* Conexant USB MODEM RD02-D400 */
	.driver_info = NO_UNION_NORMAL, /* has no union descriptor */
	},
1721 1722 1723
	{ USB_DEVICE(0x0572, 0x1328), /* Shiro / Aztech USB MODEM UM-3100 */
	.driver_info = NO_UNION_NORMAL, /* has no union descriptor */
	},
1724 1725 1726
	{ USB_DEVICE(0x0572, 0x1349), /* Hiro (Conexant) USB MODEM H50228 */
	.driver_info = NO_UNION_NORMAL, /* has no union descriptor */
	},
1727 1728
	{ USB_DEVICE(0x20df, 0x0001), /* Simtec Electronics Entropy Key */
	.driver_info = QUIRK_CONTROL_LINE_STATE, },
1729
	{ USB_DEVICE(0x2184, 0x001c) },	/* GW Instek AFG-2225 */
1730
	{ USB_DEVICE(0x2184, 0x0036) },	/* GW Instek AFG-125 */
1731 1732
	{ USB_DEVICE(0x22b8, 0x6425), /* Motorola MOTOMAGX phones */
	},
1733 1734
	/* Motorola H24 HSPA module: */
	{ USB_DEVICE(0x22b8, 0x2d91) }, /* modem                                */
1735 1736 1737 1738 1739 1740 1741 1742 1743 1744 1745 1746 1747 1748 1749 1750 1751 1752 1753 1754 1755
	{ USB_DEVICE(0x22b8, 0x2d92),   /* modem           + diagnostics        */
	.driver_info = NO_UNION_NORMAL, /* handle only modem interface          */
	},
	{ USB_DEVICE(0x22b8, 0x2d93),   /* modem + AT port                      */
	.driver_info = NO_UNION_NORMAL, /* handle only modem interface          */
	},
	{ USB_DEVICE(0x22b8, 0x2d95),   /* modem + AT port + diagnostics        */
	.driver_info = NO_UNION_NORMAL, /* handle only modem interface          */
	},
	{ USB_DEVICE(0x22b8, 0x2d96),   /* modem                         + NMEA */
	.driver_info = NO_UNION_NORMAL, /* handle only modem interface          */
	},
	{ USB_DEVICE(0x22b8, 0x2d97),   /* modem           + diagnostics + NMEA */
	.driver_info = NO_UNION_NORMAL, /* handle only modem interface          */
	},
	{ USB_DEVICE(0x22b8, 0x2d99),   /* modem + AT port               + NMEA */
	.driver_info = NO_UNION_NORMAL, /* handle only modem interface          */
	},
	{ USB_DEVICE(0x22b8, 0x2d9a),   /* modem + AT port + diagnostics + NMEA */
	.driver_info = NO_UNION_NORMAL, /* handle only modem interface          */
	},
1756

1757 1758 1759 1760 1761 1762 1763
	{ USB_DEVICE(0x0572, 0x1329), /* Hummingbird huc56s (Conexant) */
	.driver_info = NO_UNION_NORMAL, /* union descriptor misplaced on
					   data interface instead of
					   communications interface.
					   Maybe we should define a new
					   quirk for this. */
	},
1764 1765 1766
	{ USB_DEVICE(0x0572, 0x1340), /* Conexant CX93010-2x UCMxx */
	.driver_info = NO_UNION_NORMAL,
	},
1767 1768 1769
	{ USB_DEVICE(0x05f9, 0x4002), /* PSC Scanning, Magellan 800i */
	.driver_info = NO_UNION_NORMAL,
	},
1770 1771 1772
	{ USB_DEVICE(0x1bbb, 0x0003), /* Alcatel OT-I650 */
	.driver_info = NO_UNION_NORMAL, /* reports zero length descriptor */
	},
1773 1774 1775
	{ USB_DEVICE(0x1576, 0x03b1), /* Maretron USB100 */
	.driver_info = NO_UNION_NORMAL, /* reports zero length descriptor */
	},
1776 1777 1778
	{ USB_DEVICE(0xfff0, 0x0100), /* DATECS FP-2000 */
	.driver_info = NO_UNION_NORMAL, /* reports zero length descriptor */
	},
1779 1780 1781
	{ USB_DEVICE(0x09d8, 0x0320), /* Elatec GmbH TWN3 */
	.driver_info = NO_UNION_NORMAL, /* has misplaced union descriptor */
	},
1782 1783 1784
	{ USB_DEVICE(0x0ca6, 0xa050), /* Castles VEGA3000 */
	.driver_info = NO_UNION_NORMAL, /* reports zero length descriptor */
	},
O
Oliver Neukum 已提交
1785

1786 1787 1788 1789
	{ USB_DEVICE(0x2912, 0x0001), /* ATOL FPrint */
	.driver_info = CLEAR_HALT_CONDITIONS,
	},

1790 1791 1792 1793 1794 1795 1796 1797 1798 1799 1800 1801 1802 1803 1804 1805 1806 1807 1808 1809 1810 1811 1812 1813 1814 1815 1816 1817 1818 1819 1820 1821 1822 1823 1824 1825 1826 1827 1828 1829 1830 1831 1832 1833 1834 1835 1836 1837
	/* Nokia S60 phones expose two ACM channels. The first is
	 * a modem and is picked up by the standard AT-command
	 * information below. The second is 'vendor-specific' but
	 * is treated as a serial device at the S60 end, so we want
	 * to expose it on Linux too. */
	{ NOKIA_PCSUITE_ACM_INFO(0x042D), }, /* Nokia 3250 */
	{ NOKIA_PCSUITE_ACM_INFO(0x04D8), }, /* Nokia 5500 Sport */
	{ NOKIA_PCSUITE_ACM_INFO(0x04C9), }, /* Nokia E50 */
	{ NOKIA_PCSUITE_ACM_INFO(0x0419), }, /* Nokia E60 */
	{ NOKIA_PCSUITE_ACM_INFO(0x044D), }, /* Nokia E61 */
	{ NOKIA_PCSUITE_ACM_INFO(0x0001), }, /* Nokia E61i */
	{ NOKIA_PCSUITE_ACM_INFO(0x0475), }, /* Nokia E62 */
	{ NOKIA_PCSUITE_ACM_INFO(0x0508), }, /* Nokia E65 */
	{ NOKIA_PCSUITE_ACM_INFO(0x0418), }, /* Nokia E70 */
	{ NOKIA_PCSUITE_ACM_INFO(0x0425), }, /* Nokia N71 */
	{ NOKIA_PCSUITE_ACM_INFO(0x0486), }, /* Nokia N73 */
	{ NOKIA_PCSUITE_ACM_INFO(0x04DF), }, /* Nokia N75 */
	{ NOKIA_PCSUITE_ACM_INFO(0x000e), }, /* Nokia N77 */
	{ NOKIA_PCSUITE_ACM_INFO(0x0445), }, /* Nokia N80 */
	{ NOKIA_PCSUITE_ACM_INFO(0x042F), }, /* Nokia N91 & N91 8GB */
	{ NOKIA_PCSUITE_ACM_INFO(0x048E), }, /* Nokia N92 */
	{ NOKIA_PCSUITE_ACM_INFO(0x0420), }, /* Nokia N93 */
	{ NOKIA_PCSUITE_ACM_INFO(0x04E6), }, /* Nokia N93i  */
	{ NOKIA_PCSUITE_ACM_INFO(0x04B2), }, /* Nokia 5700 XpressMusic */
	{ NOKIA_PCSUITE_ACM_INFO(0x0134), }, /* Nokia 6110 Navigator (China) */
	{ NOKIA_PCSUITE_ACM_INFO(0x046E), }, /* Nokia 6110 Navigator */
	{ NOKIA_PCSUITE_ACM_INFO(0x002f), }, /* Nokia 6120 classic &  */
	{ NOKIA_PCSUITE_ACM_INFO(0x0088), }, /* Nokia 6121 classic */
	{ NOKIA_PCSUITE_ACM_INFO(0x00fc), }, /* Nokia 6124 classic */
	{ NOKIA_PCSUITE_ACM_INFO(0x0042), }, /* Nokia E51 */
	{ NOKIA_PCSUITE_ACM_INFO(0x00b0), }, /* Nokia E66 */
	{ NOKIA_PCSUITE_ACM_INFO(0x00ab), }, /* Nokia E71 */
	{ NOKIA_PCSUITE_ACM_INFO(0x0481), }, /* Nokia N76 */
	{ NOKIA_PCSUITE_ACM_INFO(0x0007), }, /* Nokia N81 & N81 8GB */
	{ NOKIA_PCSUITE_ACM_INFO(0x0071), }, /* Nokia N82 */
	{ NOKIA_PCSUITE_ACM_INFO(0x04F0), }, /* Nokia N95 & N95-3 NAM */
	{ NOKIA_PCSUITE_ACM_INFO(0x0070), }, /* Nokia N95 8GB  */
	{ NOKIA_PCSUITE_ACM_INFO(0x00e9), }, /* Nokia 5320 XpressMusic */
	{ NOKIA_PCSUITE_ACM_INFO(0x0099), }, /* Nokia 6210 Navigator, RM-367 */
	{ NOKIA_PCSUITE_ACM_INFO(0x0128), }, /* Nokia 6210 Navigator, RM-419 */
	{ NOKIA_PCSUITE_ACM_INFO(0x008f), }, /* Nokia 6220 Classic */
	{ NOKIA_PCSUITE_ACM_INFO(0x00a0), }, /* Nokia 6650 */
	{ NOKIA_PCSUITE_ACM_INFO(0x007b), }, /* Nokia N78 */
	{ NOKIA_PCSUITE_ACM_INFO(0x0094), }, /* Nokia N85 */
	{ NOKIA_PCSUITE_ACM_INFO(0x003a), }, /* Nokia N96 & N96-3  */
	{ NOKIA_PCSUITE_ACM_INFO(0x00e9), }, /* Nokia 5320 XpressMusic */
	{ NOKIA_PCSUITE_ACM_INFO(0x0108), }, /* Nokia 5320 XpressMusic 2G */
	{ NOKIA_PCSUITE_ACM_INFO(0x01f5), }, /* Nokia N97, RM-505 */
1838
	{ NOKIA_PCSUITE_ACM_INFO(0x02e3), }, /* Nokia 5230, RM-588 */
1839 1840 1841 1842 1843 1844 1845 1846 1847 1848
	{ NOKIA_PCSUITE_ACM_INFO(0x0178), }, /* Nokia E63 */
	{ NOKIA_PCSUITE_ACM_INFO(0x010e), }, /* Nokia E75 */
	{ NOKIA_PCSUITE_ACM_INFO(0x02d9), }, /* Nokia 6760 Slide */
	{ NOKIA_PCSUITE_ACM_INFO(0x01d0), }, /* Nokia E52 */
	{ NOKIA_PCSUITE_ACM_INFO(0x0223), }, /* Nokia E72 */
	{ NOKIA_PCSUITE_ACM_INFO(0x0275), }, /* Nokia X6 */
	{ NOKIA_PCSUITE_ACM_INFO(0x026c), }, /* Nokia N97 Mini */
	{ NOKIA_PCSUITE_ACM_INFO(0x0154), }, /* Nokia 5800 XpressMusic */
	{ NOKIA_PCSUITE_ACM_INFO(0x04ce), }, /* Nokia E90 */
	{ NOKIA_PCSUITE_ACM_INFO(0x01d4), }, /* Nokia E55 */
1849
	{ NOKIA_PCSUITE_ACM_INFO(0x0302), }, /* Nokia N8 */
1850 1851
	{ NOKIA_PCSUITE_ACM_INFO(0x0335), }, /* Nokia E7 */
	{ NOKIA_PCSUITE_ACM_INFO(0x03cd), }, /* Nokia C7 */
1852
	{ SAMSUNG_PCSUITE_ACM_INFO(0x6651), }, /* Samsung GTi8510 (INNOV8) */
1853

D
Denis Pershin 已提交
1854 1855 1856
	/* Support for Owen devices */
	{ USB_DEVICE(0x03eb, 0x0030), }, /* Owen SI30 */

1857 1858
	/* NOTE: non-Nokia COMM/ACM/0xff is likely MSFT RNDIS... NOT a modem! */

1859 1860 1861 1862 1863
	/* Support for Droids MuIn LCD */
	{ USB_DEVICE(0x04d8, 0x000b),
	.driver_info = NO_DATA_INTERFACE,
	},

1864 1865 1866 1867 1868 1869 1870 1871 1872
#if IS_ENABLED(CONFIG_INPUT_IMS_PCU)
	{ USB_DEVICE(0x04d8, 0x0082),	/* Application mode */
	.driver_info = IGNORE_DEVICE,
	},
	{ USB_DEVICE(0x04d8, 0x0083),	/* Bootloader mode */
	.driver_info = IGNORE_DEVICE,
	},
#endif

1873 1874 1875 1876 1877
	/*Samsung phone in firmware update mode */
	{ USB_DEVICE(0x04e8, 0x685d),
	.driver_info = IGNORE_DEVICE,
	},

1878 1879 1880 1881 1882
	/* Exclude Infineon Flash Loader utility */
	{ USB_DEVICE(0x058b, 0x0041),
	.driver_info = IGNORE_DEVICE,
	},

1883 1884 1885 1886 1887 1888 1889
	{ USB_DEVICE(0x1bc7, 0x0021), /* Telit 3G ACM only composition */
	.driver_info = SEND_ZERO_PACKET,
	},
	{ USB_DEVICE(0x1bc7, 0x0023), /* Telit 3G ACM + ECM composition */
	.driver_info = SEND_ZERO_PACKET,
	},

1890 1891 1892 1893
	/* control interfaces without any protocol set */
	{ USB_INTERFACE_INFO(USB_CLASS_COMM, USB_CDC_SUBCLASS_ACM,
		USB_CDC_PROTO_NONE) },

L
Linus Torvalds 已提交
1894 1895 1896 1897 1898 1899 1900 1901 1902 1903
	/* control interfaces with various AT-command sets */
	{ USB_INTERFACE_INFO(USB_CLASS_COMM, USB_CDC_SUBCLASS_ACM,
		USB_CDC_ACM_PROTO_AT_V25TER) },
	{ USB_INTERFACE_INFO(USB_CLASS_COMM, USB_CDC_SUBCLASS_ACM,
		USB_CDC_ACM_PROTO_AT_PCCA101) },
	{ USB_INTERFACE_INFO(USB_CLASS_COMM, USB_CDC_SUBCLASS_ACM,
		USB_CDC_ACM_PROTO_AT_PCCA101_WAKE) },
	{ USB_INTERFACE_INFO(USB_CLASS_COMM, USB_CDC_SUBCLASS_ACM,
		USB_CDC_ACM_PROTO_AT_GSM) },
	{ USB_INTERFACE_INFO(USB_CLASS_COMM, USB_CDC_SUBCLASS_ACM,
1904
		USB_CDC_ACM_PROTO_AT_3G) },
L
Linus Torvalds 已提交
1905 1906 1907
	{ USB_INTERFACE_INFO(USB_CLASS_COMM, USB_CDC_SUBCLASS_ACM,
		USB_CDC_ACM_PROTO_AT_CDMA) },

1908 1909 1910 1911
	{ USB_DEVICE(0x1519, 0x0452), /* Intel 7260 modem */
	.driver_info = SEND_ZERO_PACKET,
	},

L
Linus Torvalds 已提交
1912 1913 1914
	{ }
};

1915
MODULE_DEVICE_TABLE(usb, acm_ids);
L
Linus Torvalds 已提交
1916 1917 1918 1919 1920

static struct usb_driver acm_driver = {
	.name =		"cdc_acm",
	.probe =	acm_probe,
	.disconnect =	acm_disconnect,
1921
#ifdef CONFIG_PM
O
Oliver Neukum 已提交
1922 1923
	.suspend =	acm_suspend,
	.resume =	acm_resume,
1924
	.reset_resume =	acm_reset_resume,
1925
#endif
L
Ladislav Michl 已提交
1926
	.pre_reset =	acm_pre_reset,
L
Linus Torvalds 已提交
1927
	.id_table =	acm_ids,
1928
#ifdef CONFIG_PM
O
Oliver Neukum 已提交
1929
	.supports_autosuspend = 1,
1930
#endif
1931
	.disable_hub_initiated_lpm = 1,
L
Linus Torvalds 已提交
1932 1933 1934 1935 1936 1937
};

/*
 * TTY driver structures.
 */

J
Jeff Dike 已提交
1938
static const struct tty_operations acm_ops = {
1939
	.install =		acm_tty_install,
L
Linus Torvalds 已提交
1940 1941
	.open =			acm_tty_open,
	.close =		acm_tty_close,
1942
	.cleanup =		acm_tty_cleanup,
A
Alan Cox 已提交
1943
	.hangup =		acm_tty_hangup,
L
Linus Torvalds 已提交
1944 1945 1946 1947 1948 1949 1950 1951 1952 1953
	.write =		acm_tty_write,
	.write_room =		acm_tty_write_room,
	.ioctl =		acm_tty_ioctl,
	.throttle =		acm_tty_throttle,
	.unthrottle =		acm_tty_unthrottle,
	.chars_in_buffer =	acm_tty_chars_in_buffer,
	.break_ctl =		acm_tty_break_ctl,
	.set_termios =		acm_tty_set_termios,
	.tiocmget =		acm_tty_tiocmget,
	.tiocmset =		acm_tty_tiocmset,
1954
	.get_icount =		acm_tty_get_icount,
L
Linus Torvalds 已提交
1955 1956 1957 1958 1959 1960 1961 1962 1963 1964 1965 1966 1967 1968 1969 1970 1971 1972
};

/*
 * Init / exit.
 */

static int __init acm_init(void)
{
	int retval;
	acm_tty_driver = alloc_tty_driver(ACM_TTY_MINORS);
	if (!acm_tty_driver)
		return -ENOMEM;
	acm_tty_driver->driver_name = "acm",
	acm_tty_driver->name = "ttyACM",
	acm_tty_driver->major = ACM_TTY_MAJOR,
	acm_tty_driver->minor_start = 0,
	acm_tty_driver->type = TTY_DRIVER_TYPE_SERIAL,
	acm_tty_driver->subtype = SERIAL_TYPE_NORMAL,
1973
	acm_tty_driver->flags = TTY_DRIVER_REAL_RAW | TTY_DRIVER_DYNAMIC_DEV;
L
Linus Torvalds 已提交
1974
	acm_tty_driver->init_termios = tty_std_termios;
1975 1976
	acm_tty_driver->init_termios.c_cflag = B9600 | CS8 | CREAD |
								HUPCL | CLOCAL;
L
Linus Torvalds 已提交
1977 1978 1979 1980 1981 1982 1983 1984 1985 1986 1987 1988 1989 1990 1991
	tty_set_operations(acm_tty_driver, &acm_ops);

	retval = tty_register_driver(acm_tty_driver);
	if (retval) {
		put_tty_driver(acm_tty_driver);
		return retval;
	}

	retval = usb_register(&acm_driver);
	if (retval) {
		tty_unregister_driver(acm_tty_driver);
		put_tty_driver(acm_tty_driver);
		return retval;
	}

1992
	printk(KERN_INFO KBUILD_MODNAME ": " DRIVER_DESC "\n");
L
Linus Torvalds 已提交
1993 1994 1995 1996 1997 1998 1999 2000 2001

	return 0;
}

static void __exit acm_exit(void)
{
	usb_deregister(&acm_driver);
	tty_unregister_driver(acm_tty_driver);
	put_tty_driver(acm_tty_driver);
2002
	idr_destroy(&acm_minors);
L
Linus Torvalds 已提交
2003 2004 2005 2006 2007
}

module_init(acm_init);
module_exit(acm_exit);

2008 2009
MODULE_AUTHOR(DRIVER_AUTHOR);
MODULE_DESCRIPTION(DRIVER_DESC);
L
Linus Torvalds 已提交
2010
MODULE_LICENSE("GPL");
2011
MODULE_ALIAS_CHARDEV_MAJOR(ACM_TTY_MAJOR);