vt: tackle the main part of the selection logic
[GitHub/mt8127/android_kernel_alcatel_ttab.git] / drivers / usb / class / cdc-acm.c
CommitLineData
1da177e4
LT
1/*
2 * cdc-acm.c
3 *
4 * Copyright (c) 1999 Armin Fuerst <fuerst@in.tum.de>
a2531293 5 * Copyright (c) 1999 Pavel Machek <pavel@ucw.cz>
1da177e4
LT
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>
61a87adf 9 * Copyright (c) 2005 David Kubicek <dave@awk.cz>
088c64f8 10 * Copyright (c) 2011 Johan Hovold <jhovold@gmail.com>
1da177e4
LT
11 *
12 * USB Abstract Control Model driver for USB modems and ISDN adapters
13 *
14 * Sponsored by SuSE
15 *
1da177e4
LT
16 * This program is free software; you can redistribute it and/or modify
17 * it under the terms of the GNU General Public License as published by
18 * the Free Software Foundation; either version 2 of the License, or
19 * (at your option) any later version.
20 *
21 * This program is distributed in the hope that it will be useful,
22 * but WITHOUT ANY WARRANTY; without even the implied warranty of
23 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
24 * GNU General Public License for more details.
25 *
26 * You should have received a copy of the GNU General Public License
27 * along with this program; if not, write to the Free Software
28 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
29 */
30
31#undef DEBUG
e5fbab51 32#undef VERBOSE_DEBUG
1da177e4
LT
33
34#include <linux/kernel.h>
35#include <linux/errno.h>
36#include <linux/init.h>
37#include <linux/slab.h>
38#include <linux/tty.h>
7af25b4b 39#include <linux/serial.h>
1da177e4
LT
40#include <linux/tty_driver.h>
41#include <linux/tty_flip.h>
42#include <linux/module.h>
4186ecf8 43#include <linux/mutex.h>
10077d4a 44#include <linux/uaccess.h>
1da177e4 45#include <linux/usb.h>
a8c28f23 46#include <linux/usb/cdc.h>
1da177e4
LT
47#include <asm/byteorder.h>
48#include <asm/unaligned.h>
61a87adf 49#include <linux/list.h>
1da177e4
LT
50
51#include "cdc-acm.h"
52
e5fbab51 53
088c64f8 54#define DRIVER_AUTHOR "Armin Fuerst, Pavel Machek, Johannes Erdfelt, Vojtech Pavlik, David Kubicek, Johan Hovold"
1da177e4
LT
55#define DRIVER_DESC "USB Abstract Control Model driver for USB modems and ISDN adapters"
56
57static struct usb_driver acm_driver;
58static struct tty_driver *acm_tty_driver;
59static struct acm *acm_table[ACM_TTY_MINORS];
60
7fb57a01 61static DEFINE_MUTEX(acm_table_lock);
1da177e4 62
7fb57a01
HS
63/*
64 * acm_table accessors
65 */
1da177e4 66
7fb57a01
HS
67/*
68 * Look up an ACM structure by index. If found and not disconnected, increment
69 * its refcount and return it with its mutex held.
70 */
71static struct acm *acm_get_by_index(unsigned index)
72{
73 struct acm *acm;
74
75 mutex_lock(&acm_table_lock);
76 acm = acm_table[index];
77 if (acm) {
78 mutex_lock(&acm->mutex);
79 if (acm->disconnected) {
80 mutex_unlock(&acm->mutex);
81 acm = NULL;
82 } else {
83 tty_port_get(&acm->port);
84 mutex_unlock(&acm->mutex);
85 }
86 }
87 mutex_unlock(&acm_table_lock);
88 return acm;
89}
90
91/*
92 * Try to find an available minor number and if found, associate it with 'acm'.
93 */
94static int acm_alloc_minor(struct acm *acm)
95{
96 int minor;
97
98 mutex_lock(&acm_table_lock);
99 for (minor = 0; minor < ACM_TTY_MINORS; minor++) {
100 if (!acm_table[minor]) {
101 acm_table[minor] = acm;
102 break;
103 }
104 }
105 mutex_unlock(&acm_table_lock);
106
107 return minor;
108}
109
110/* Release the minor number associated with 'acm'. */
111static void acm_release_minor(struct acm *acm)
112{
113 mutex_lock(&acm_table_lock);
114 acm_table[acm->minor] = NULL;
115 mutex_unlock(&acm_table_lock);
116}
739e0285 117
1da177e4
LT
118/*
119 * Functions for ACM control messages.
120 */
121
6e47e069
AC
122static int acm_ctrl_msg(struct acm *acm, int request, int value,
123 void *buf, int len)
1da177e4
LT
124{
125 int retval = usb_control_msg(acm->dev, usb_sndctrlpipe(acm->dev, 0),
126 request, USB_RT_ACM, value,
127 acm->control->altsetting[0].desc.bInterfaceNumber,
128 buf, len, 5000);
a5cc7ef9
JH
129 dev_dbg(&acm->control->dev,
130 "%s - rq 0x%02x, val %#x, len %#x, result %d\n",
131 __func__, request, value, len, retval);
1da177e4
LT
132 return retval < 0 ? retval : 0;
133}
134
135/* devices aren't required to support these requests.
136 * the cdc acm descriptor tells whether they do...
137 */
138#define acm_set_control(acm, control) \
139 acm_ctrl_msg(acm, USB_CDC_REQ_SET_CONTROL_LINE_STATE, control, NULL, 0)
140#define acm_set_line(acm, line) \
141 acm_ctrl_msg(acm, USB_CDC_REQ_SET_LINE_CODING, 0, line, sizeof *(line))
142#define acm_send_break(acm, ms) \
143 acm_ctrl_msg(acm, USB_CDC_REQ_SEND_BREAK, ms, NULL, 0)
144
884b600f
ON
145/*
146 * Write buffer management.
147 * All of these assume proper locks taken by the caller.
148 */
149
150static int acm_wb_alloc(struct acm *acm)
151{
152 int i, wbn;
153 struct acm_wb *wb;
154
e4cf3aa8 155 wbn = 0;
884b600f
ON
156 i = 0;
157 for (;;) {
158 wb = &acm->wb[wbn];
159 if (!wb->use) {
160 wb->use = 1;
161 return wbn;
162 }
86478944
ON
163 wbn = (wbn + 1) % ACM_NW;
164 if (++i >= ACM_NW)
884b600f
ON
165 return -1;
166 }
167}
168
884b600f
ON
169static int acm_wb_is_avail(struct acm *acm)
170{
171 int i, n;
e5fbab51 172 unsigned long flags;
884b600f 173
86478944 174 n = ACM_NW;
e5fbab51 175 spin_lock_irqsave(&acm->write_lock, flags);
6e47e069 176 for (i = 0; i < ACM_NW; i++)
86478944 177 n -= acm->wb[i].use;
e5fbab51 178 spin_unlock_irqrestore(&acm->write_lock, flags);
884b600f
ON
179 return n;
180}
181
884b600f 182/*
ad0b65ef 183 * Finish write. Caller must hold acm->write_lock
884b600f 184 */
e4cf3aa8 185static void acm_write_done(struct acm *acm, struct acm_wb *wb)
884b600f 186{
e4cf3aa8 187 wb->use = 0;
11ea859d 188 acm->transmitting--;
97d35f95 189 usb_autopm_put_interface_async(acm->control);
884b600f
ON
190}
191
192/*
193 * Poke write.
11ea859d
ON
194 *
195 * the caller is responsible for locking
884b600f 196 */
11ea859d
ON
197
198static int acm_start_wb(struct acm *acm, struct acm_wb *wb)
199{
200 int rc;
201
202 acm->transmitting++;
203
204 wb->urb->transfer_buffer = wb->buf;
205 wb->urb->transfer_dma = wb->dmah;
206 wb->urb->transfer_buffer_length = wb->len;
207 wb->urb->dev = acm->dev;
208
6e47e069
AC
209 rc = usb_submit_urb(wb->urb, GFP_ATOMIC);
210 if (rc < 0) {
a5cc7ef9
JH
211 dev_err(&acm->data->dev,
212 "%s - usb_submit_urb(write bulk) failed: %d\n",
213 __func__, rc);
11ea859d
ON
214 acm_write_done(acm, wb);
215 }
216 return rc;
217}
218
e4cf3aa8 219static int acm_write_start(struct acm *acm, int wbn)
884b600f
ON
220{
221 unsigned long flags;
934da463 222 struct acm_wb *wb = &acm->wb[wbn];
884b600f
ON
223 int rc;
224
225 spin_lock_irqsave(&acm->write_lock, flags);
226 if (!acm->dev) {
934da463 227 wb->use = 0;
884b600f
ON
228 spin_unlock_irqrestore(&acm->write_lock, flags);
229 return -ENODEV;
230 }
231
5e9e75f8 232 dev_vdbg(&acm->data->dev, "%s - susp_count %d\n", __func__,
a5cc7ef9 233 acm->susp_count);
97d35f95 234 usb_autopm_get_interface_async(acm->control);
11ea859d 235 if (acm->susp_count) {
97d35f95
ON
236 if (!acm->delayed_wb)
237 acm->delayed_wb = wb;
238 else
239 usb_autopm_put_interface_async(acm->control);
11ea859d
ON
240 spin_unlock_irqrestore(&acm->write_lock, flags);
241 return 0; /* A white lie */
242 }
243 usb_mark_last_busy(acm->dev);
244
11ea859d 245 rc = acm_start_wb(acm, wb);
884b600f
ON
246 spin_unlock_irqrestore(&acm->write_lock, flags);
247
884b600f 248 return rc;
11ea859d 249
884b600f 250}
c4cabd28
ON
251/*
252 * attributes exported through sysfs
253 */
254static ssize_t show_caps
255(struct device *dev, struct device_attribute *attr, char *buf)
256{
257 struct usb_interface *intf = to_usb_interface(dev);
258 struct acm *acm = usb_get_intfdata(intf);
259
260 return sprintf(buf, "%d", acm->ctrl_caps);
261}
262static DEVICE_ATTR(bmCapabilities, S_IRUGO, show_caps, NULL);
263
264static ssize_t show_country_codes
265(struct device *dev, struct device_attribute *attr, char *buf)
266{
267 struct usb_interface *intf = to_usb_interface(dev);
268 struct acm *acm = usb_get_intfdata(intf);
269
270 memcpy(buf, acm->country_codes, acm->country_code_size);
271 return acm->country_code_size;
272}
273
274static DEVICE_ATTR(wCountryCodes, S_IRUGO, show_country_codes, NULL);
275
276static ssize_t show_country_rel_date
277(struct device *dev, struct device_attribute *attr, char *buf)
278{
279 struct usb_interface *intf = to_usb_interface(dev);
280 struct acm *acm = usb_get_intfdata(intf);
281
282 return sprintf(buf, "%d", acm->country_rel_date);
283}
884b600f 284
c4cabd28 285static DEVICE_ATTR(iCountryCodeRelDate, S_IRUGO, show_country_rel_date, NULL);
1da177e4
LT
286/*
287 * Interrupt handlers for various ACM device responses
288 */
289
290/* control interface reports status changes with "interrupt" transfers */
7d12e780 291static void acm_ctrl_irq(struct urb *urb)
1da177e4
LT
292{
293 struct acm *acm = urb->context;
294 struct usb_cdc_notification *dr = urb->transfer_buffer;
10077d4a 295 struct tty_struct *tty;
1da177e4
LT
296 unsigned char *data;
297 int newctrl;
185d4058
GKH
298 int retval;
299 int status = urb->status;
1da177e4 300
185d4058 301 switch (status) {
1da177e4
LT
302 case 0:
303 /* success */
304 break;
305 case -ECONNRESET:
306 case -ENOENT:
307 case -ESHUTDOWN:
308 /* this urb is terminated, clean up */
a5cc7ef9
JH
309 dev_dbg(&acm->control->dev,
310 "%s - urb shutting down with status: %d\n",
311 __func__, status);
1da177e4
LT
312 return;
313 default:
a5cc7ef9
JH
314 dev_dbg(&acm->control->dev,
315 "%s - nonzero urb status received: %d\n",
316 __func__, status);
1da177e4
LT
317 goto exit;
318 }
319
7e7797e7
JH
320 usb_mark_last_busy(acm->dev);
321
1da177e4
LT
322 data = (unsigned char *)(dr + 1);
323 switch (dr->bNotificationType) {
6e47e069 324 case USB_CDC_NOTIFY_NETWORK_CONNECTION:
a5cc7ef9
JH
325 dev_dbg(&acm->control->dev, "%s - network connection: %d\n",
326 __func__, dr->wValue);
6e47e069 327 break;
1da177e4 328
6e47e069
AC
329 case USB_CDC_NOTIFY_SERIAL_STATE:
330 tty = tty_port_tty_get(&acm->port);
331 newctrl = get_unaligned_le16(data);
1da177e4 332
6e47e069
AC
333 if (tty) {
334 if (!acm->clocal &&
335 (acm->ctrlin & ~newctrl & ACM_CTRL_DCD)) {
a5cc7ef9
JH
336 dev_dbg(&acm->control->dev,
337 "%s - calling hangup\n", __func__);
6e47e069 338 tty_hangup(tty);
1da177e4 339 }
6e47e069
AC
340 tty_kref_put(tty);
341 }
1da177e4 342
6e47e069 343 acm->ctrlin = newctrl;
1da177e4 344
a5cc7ef9
JH
345 dev_dbg(&acm->control->dev,
346 "%s - input control lines: dcd%c dsr%c break%c "
347 "ring%c framing%c parity%c overrun%c\n",
348 __func__,
6e47e069
AC
349 acm->ctrlin & ACM_CTRL_DCD ? '+' : '-',
350 acm->ctrlin & ACM_CTRL_DSR ? '+' : '-',
351 acm->ctrlin & ACM_CTRL_BRK ? '+' : '-',
352 acm->ctrlin & ACM_CTRL_RI ? '+' : '-',
353 acm->ctrlin & ACM_CTRL_FRAMING ? '+' : '-',
354 acm->ctrlin & ACM_CTRL_PARITY ? '+' : '-',
355 acm->ctrlin & ACM_CTRL_OVERRUN ? '+' : '-');
1da177e4
LT
356 break;
357
6e47e069 358 default:
a5cc7ef9
JH
359 dev_dbg(&acm->control->dev,
360 "%s - unknown notification %d received: index %d "
361 "len %d data0 %d data1 %d\n",
362 __func__,
6e47e069
AC
363 dr->bNotificationType, dr->wIndex,
364 dr->wLength, data[0], data[1]);
365 break;
1da177e4
LT
366 }
367exit:
6e47e069 368 retval = usb_submit_urb(urb, GFP_ATOMIC);
185d4058 369 if (retval)
1d9846e5
JH
370 dev_err(&acm->control->dev, "%s - usb_submit_urb failed: %d\n",
371 __func__, retval);
1da177e4
LT
372}
373
088c64f8 374static int acm_submit_read_urb(struct acm *acm, int index, gfp_t mem_flags)
1da177e4 375{
088c64f8 376 int res;
185d4058 377
088c64f8
JH
378 if (!test_and_clear_bit(index, &acm->read_urbs_free))
379 return 0;
1da177e4 380
088c64f8
JH
381 dev_vdbg(&acm->data->dev, "%s - urb %d\n", __func__, index);
382
383 res = usb_submit_urb(acm->read_urbs[index], mem_flags);
384 if (res) {
385 if (res != -EPERM) {
386 dev_err(&acm->data->dev,
387 "%s - usb_submit_urb failed: %d\n",
388 __func__, res);
389 }
390 set_bit(index, &acm->read_urbs_free);
391 return res;
11ea859d 392 }
1da177e4 393
088c64f8
JH
394 return 0;
395}
1da177e4 396
088c64f8
JH
397static int acm_submit_read_urbs(struct acm *acm, gfp_t mem_flags)
398{
399 int res;
400 int i;
61a87adf 401
088c64f8
JH
402 for (i = 0; i < acm->rx_buflimit; ++i) {
403 res = acm_submit_read_urb(acm, i, mem_flags);
404 if (res)
405 return res;
86478944 406 }
088c64f8
JH
407
408 return 0;
1da177e4
LT
409}
410
088c64f8 411static void acm_process_read_urb(struct acm *acm, struct urb *urb)
1da177e4 412{
10077d4a 413 struct tty_struct *tty;
1da177e4 414
088c64f8 415 if (!urb->actual_length)
ca79b7b4 416 return;
61a87adf 417
10077d4a 418 tty = tty_port_tty_get(&acm->port);
088c64f8
JH
419 if (!tty)
420 return;
10077d4a 421
088c64f8
JH
422 tty_insert_flip_string(tty, urb->transfer_buffer, urb->actual_length);
423 tty_flip_buffer_push(tty);
61a87adf 424
10077d4a 425 tty_kref_put(tty);
088c64f8 426}
10077d4a 427
088c64f8
JH
428static void acm_read_bulk_callback(struct urb *urb)
429{
430 struct acm_rb *rb = urb->context;
431 struct acm *acm = rb->instance;
432 unsigned long flags;
61a87adf 433
088c64f8
JH
434 dev_vdbg(&acm->data->dev, "%s - urb %d, len %d\n", __func__,
435 rb->index, urb->actual_length);
436 set_bit(rb->index, &acm->read_urbs_free);
61a87adf 437
088c64f8
JH
438 if (!acm->dev) {
439 dev_dbg(&acm->data->dev, "%s - disconnected\n", __func__);
440 return;
441 }
442 usb_mark_last_busy(acm->dev);
61a87adf 443
088c64f8
JH
444 if (urb->status) {
445 dev_dbg(&acm->data->dev, "%s - non-zero urb status: %d\n",
446 __func__, urb->status);
447 return;
61a87adf 448 }
088c64f8
JH
449 acm_process_read_urb(acm, urb);
450
451 /* throttle device if requested by tty */
11ea859d 452 spin_lock_irqsave(&acm->read_lock, flags);
088c64f8
JH
453 acm->throttled = acm->throttle_req;
454 if (!acm->throttled && !acm->susp_count) {
455 spin_unlock_irqrestore(&acm->read_lock, flags);
456 acm_submit_read_urb(acm, rb->index, GFP_ATOMIC);
457 } else {
458 spin_unlock_irqrestore(&acm->read_lock, flags);
459 }
1da177e4
LT
460}
461
462/* data interface wrote those outgoing bytes */
7d12e780 463static void acm_write_bulk(struct urb *urb)
1da177e4 464{
cdc97792 465 struct acm_wb *wb = urb->context;
e5fbab51 466 struct acm *acm = wb->instance;
ad0b65ef 467 unsigned long flags;
1da177e4 468
4fa4626c
JH
469 if (urb->status || (urb->actual_length != urb->transfer_buffer_length))
470 dev_vdbg(&acm->data->dev, "%s - len %d/%d, status %d\n",
1d9846e5 471 __func__,
e5fbab51
DB
472 urb->actual_length,
473 urb->transfer_buffer_length,
474 urb->status);
1da177e4 475
ad0b65ef 476 spin_lock_irqsave(&acm->write_lock, flags);
e4cf3aa8 477 acm_write_done(acm, wb);
ad0b65ef 478 spin_unlock_irqrestore(&acm->write_lock, flags);
99823f45 479 schedule_work(&acm->work);
1da177e4
LT
480}
481
c4028958 482static void acm_softint(struct work_struct *work)
1da177e4 483{
c4028958 484 struct acm *acm = container_of(work, struct acm, work);
10077d4a 485 struct tty_struct *tty;
e5fbab51 486
1d9846e5
JH
487 dev_vdbg(&acm->data->dev, "%s\n", __func__);
488
10077d4a 489 tty = tty_port_tty_get(&acm->port);
15e5bee3
JH
490 if (!tty)
491 return;
10077d4a
AC
492 tty_wakeup(tty);
493 tty_kref_put(tty);
1da177e4
LT
494}
495
496/*
497 * TTY handlers
498 */
499
7fb57a01 500static int acm_tty_install(struct tty_driver *driver, struct tty_struct *tty)
1da177e4
LT
501{
502 struct acm *acm;
7fb57a01 503 int retval;
1da177e4 504
7fb57a01 505 dev_dbg(tty->dev, "%s\n", __func__);
1da177e4 506
7fb57a01
HS
507 acm = acm_get_by_index(tty->index);
508 if (!acm)
509 return -ENODEV;
a5cc7ef9 510
7fb57a01
HS
511 retval = tty_init_termios(tty);
512 if (retval)
513 goto error_init_termios;
10077d4a 514
1da177e4 515 tty->driver_data = acm;
1da177e4 516
7fb57a01
HS
517 /* Final install (we use the default method) */
518 tty_driver_kref_get(driver);
519 tty->count++;
520 driver->ttys[tty->index] = tty;
521
522 return 0;
523
524error_init_termios:
525 tty_port_put(&acm->port);
526 return retval;
527}
528
529static int acm_tty_open(struct tty_struct *tty, struct file *filp)
530{
531 struct acm *acm = tty->driver_data;
532
533 dev_dbg(tty->dev, "%s\n", __func__);
534
535 return tty_port_open(&acm->port, tty, filp);
536}
537
538static int acm_port_activate(struct tty_port *port, struct tty_struct *tty)
539{
540 struct acm *acm = container_of(port, struct acm, port);
541 int retval = -ENODEV;
542
543 dev_dbg(&acm->control->dev, "%s\n", __func__);
1365baf7
ON
544
545 mutex_lock(&acm->mutex);
7fb57a01
HS
546 if (acm->disconnected)
547 goto disconnected;
548
549 retval = usb_autopm_get_interface(acm->control);
550 if (retval)
551 goto error_get_interface;
552
553 /*
554 * FIXME: Why do we need this? Allocating 64K of physically contiguous
555 * memory is really nasty...
556 */
557 set_bit(TTY_NO_WRITE_SPLIT, &tty->flags);
558 acm->control->needs_remote_wakeup = 1;
1365baf7 559
1da177e4
LT
560 acm->ctrlurb->dev = acm->dev;
561 if (usb_submit_urb(acm->ctrlurb, GFP_KERNEL)) {
a5cc7ef9
JH
562 dev_err(&acm->control->dev,
563 "%s - usb_submit_urb(ctrl irq) failed\n", __func__);
7fb57a01 564 goto error_submit_urb;
1da177e4
LT
565 }
566
7fb57a01
HS
567 acm->ctrlout = ACM_CTRL_DTR | ACM_CTRL_RTS;
568 if (acm_set_control(acm, acm->ctrlout) < 0 &&
ca79b7b4 569 (acm->ctrl_caps & USB_CDC_CAP_LINE))
7fb57a01 570 goto error_set_control;
10077d4a 571
11ea859d 572 usb_autopm_put_interface(acm->control);
1da177e4 573
088c64f8 574 if (acm_submit_read_urbs(acm, GFP_KERNEL))
7fb57a01 575 goto error_submit_read_urbs;
2b626dc1 576
1365baf7 577 mutex_unlock(&acm->mutex);
1da177e4 578
7fb57a01
HS
579 return 0;
580
581error_submit_read_urbs:
582 acm->ctrlout = 0;
583 acm_set_control(acm, acm->ctrlout);
584error_set_control:
585 usb_kill_urb(acm->ctrlurb);
586error_submit_urb:
2b626dc1 587 usb_autopm_put_interface(acm->control);
7fb57a01
HS
588error_get_interface:
589disconnected:
590 mutex_unlock(&acm->mutex);
591 return retval;
1da177e4
LT
592}
593
7fb57a01 594static void acm_port_destruct(struct tty_port *port)
83ef344a 595{
7fb57a01
HS
596 struct acm *acm = container_of(port, struct acm, port);
597
598 dev_dbg(&acm->control->dev, "%s\n", __func__);
61a87adf 599
83ef344a 600 tty_unregister_device(acm_tty_driver, acm->minor);
7fb57a01 601 acm_release_minor(acm);
83ef344a 602 usb_put_intf(acm->control);
c4cabd28 603 kfree(acm->country_codes);
83ef344a 604 kfree(acm);
605}
606
7fb57a01 607static void acm_port_shutdown(struct tty_port *port)
10077d4a 608{
7fb57a01 609 struct acm *acm = container_of(port, struct acm, port);
dab54c9f
JH
610 int i;
611
7fb57a01
HS
612 dev_dbg(&acm->control->dev, "%s\n", __func__);
613
614 mutex_lock(&acm->mutex);
615 if (!acm->disconnected) {
10077d4a
AC
616 usb_autopm_get_interface(acm->control);
617 acm_set_control(acm, acm->ctrlout = 0);
10077d4a
AC
618 usb_kill_urb(acm->ctrlurb);
619 for (i = 0; i < ACM_NW; i++)
620 usb_kill_urb(acm->wb[i].urb);
dab54c9f 621 for (i = 0; i < acm->rx_buflimit; i++)
088c64f8 622 usb_kill_urb(acm->read_urbs[i]);
10077d4a
AC
623 acm->control->needs_remote_wakeup = 0;
624 usb_autopm_put_interface(acm->control);
625 }
7fb57a01
HS
626 mutex_unlock(&acm->mutex);
627}
628
629static void acm_tty_cleanup(struct tty_struct *tty)
630{
631 struct acm *acm = tty->driver_data;
632 dev_dbg(&acm->control->dev, "%s\n", __func__);
633 tty_port_put(&acm->port);
10077d4a
AC
634}
635
636static void acm_tty_hangup(struct tty_struct *tty)
637{
638 struct acm *acm = tty->driver_data;
7fb57a01 639 dev_dbg(&acm->control->dev, "%s\n", __func__);
10077d4a 640 tty_port_hangup(&acm->port);
10077d4a
AC
641}
642
1da177e4
LT
643static void acm_tty_close(struct tty_struct *tty, struct file *filp)
644{
645 struct acm *acm = tty->driver_data;
7fb57a01
HS
646 dev_dbg(&acm->control->dev, "%s\n", __func__);
647 tty_port_close(&acm->port, tty, filp);
1da177e4
LT
648}
649
6e47e069
AC
650static int acm_tty_write(struct tty_struct *tty,
651 const unsigned char *buf, int count)
1da177e4
LT
652{
653 struct acm *acm = tty->driver_data;
654 int stat;
884b600f
ON
655 unsigned long flags;
656 int wbn;
657 struct acm_wb *wb;
658
1da177e4
LT
659 if (!count)
660 return 0;
661
5e9e75f8 662 dev_vdbg(&acm->data->dev, "%s - count %d\n", __func__, count);
a5cc7ef9 663
884b600f 664 spin_lock_irqsave(&acm->write_lock, flags);
6e47e069
AC
665 wbn = acm_wb_alloc(acm);
666 if (wbn < 0) {
884b600f 667 spin_unlock_irqrestore(&acm->write_lock, flags);
884b600f
ON
668 return 0;
669 }
670 wb = &acm->wb[wbn];
1da177e4 671
884b600f 672 count = (count > acm->writesize) ? acm->writesize : count;
5e9e75f8 673 dev_vdbg(&acm->data->dev, "%s - write %d\n", __func__, count);
884b600f
ON
674 memcpy(wb->buf, buf, count);
675 wb->len = count;
676 spin_unlock_irqrestore(&acm->write_lock, flags);
1da177e4 677
6e47e069
AC
678 stat = acm_write_start(acm, wbn);
679 if (stat < 0)
1da177e4 680 return stat;
1da177e4
LT
681 return count;
682}
683
684static int acm_tty_write_room(struct tty_struct *tty)
685{
686 struct acm *acm = tty->driver_data;
884b600f
ON
687 /*
688 * Do not let the line discipline to know that we have a reserve,
689 * or it might get too enthusiastic.
690 */
934da463 691 return acm_wb_is_avail(acm) ? acm->writesize : 0;
1da177e4
LT
692}
693
694static int acm_tty_chars_in_buffer(struct tty_struct *tty)
695{
696 struct acm *acm = tty->driver_data;
7fb57a01
HS
697 /*
698 * if the device was unplugged then any remaining characters fell out
699 * of the connector ;)
700 */
701 if (acm->disconnected)
23198fda 702 return 0;
884b600f
ON
703 /*
704 * This is inaccurate (overcounts), but it works.
705 */
86478944 706 return (ACM_NW - acm_wb_is_avail(acm)) * acm->writesize;
1da177e4
LT
707}
708
709static void acm_tty_throttle(struct tty_struct *tty)
710{
711 struct acm *acm = tty->driver_data;
088c64f8 712
088c64f8
JH
713 spin_lock_irq(&acm->read_lock);
714 acm->throttle_req = 1;
715 spin_unlock_irq(&acm->read_lock);
1da177e4
LT
716}
717
718static void acm_tty_unthrottle(struct tty_struct *tty)
719{
720 struct acm *acm = tty->driver_data;
088c64f8
JH
721 unsigned int was_throttled;
722
088c64f8
JH
723 spin_lock_irq(&acm->read_lock);
724 was_throttled = acm->throttled;
725 acm->throttled = 0;
726 acm->throttle_req = 0;
727 spin_unlock_irq(&acm->read_lock);
728
729 if (was_throttled)
730 acm_submit_read_urbs(acm, GFP_KERNEL);
1da177e4
LT
731}
732
9e98966c 733static int acm_tty_break_ctl(struct tty_struct *tty, int state)
1da177e4
LT
734{
735 struct acm *acm = tty->driver_data;
9e98966c 736 int retval;
7fb57a01 737
9e98966c
AC
738 retval = acm_send_break(acm, state ? 0xffff : 0);
739 if (retval < 0)
a5cc7ef9
JH
740 dev_dbg(&acm->control->dev, "%s - send break failed\n",
741 __func__);
9e98966c 742 return retval;
1da177e4
LT
743}
744
60b33c13 745static int acm_tty_tiocmget(struct tty_struct *tty)
1da177e4
LT
746{
747 struct acm *acm = tty->driver_data;
748
1da177e4
LT
749 return (acm->ctrlout & ACM_CTRL_DTR ? TIOCM_DTR : 0) |
750 (acm->ctrlout & ACM_CTRL_RTS ? TIOCM_RTS : 0) |
751 (acm->ctrlin & ACM_CTRL_DSR ? TIOCM_DSR : 0) |
752 (acm->ctrlin & ACM_CTRL_RI ? TIOCM_RI : 0) |
753 (acm->ctrlin & ACM_CTRL_DCD ? TIOCM_CD : 0) |
754 TIOCM_CTS;
755}
756
20b9d177 757static int acm_tty_tiocmset(struct tty_struct *tty,
1da177e4
LT
758 unsigned int set, unsigned int clear)
759{
760 struct acm *acm = tty->driver_data;
761 unsigned int newctrl;
762
1da177e4 763 newctrl = acm->ctrlout;
6e47e069
AC
764 set = (set & TIOCM_DTR ? ACM_CTRL_DTR : 0) |
765 (set & TIOCM_RTS ? ACM_CTRL_RTS : 0);
766 clear = (clear & TIOCM_DTR ? ACM_CTRL_DTR : 0) |
767 (clear & TIOCM_RTS ? ACM_CTRL_RTS : 0);
1da177e4
LT
768
769 newctrl = (newctrl & ~clear) | set;
770
771 if (acm->ctrlout == newctrl)
772 return 0;
773 return acm_set_control(acm, acm->ctrlout = newctrl);
774}
775
6caa76b7 776static int acm_tty_ioctl(struct tty_struct *tty,
6e47e069 777 unsigned int cmd, unsigned long arg)
1da177e4 778{
1da177e4
LT
779 return -ENOIOCTLCMD;
780}
781
4c4c9432 782static const __u32 acm_tty_speed[] = {
1da177e4
LT
783 0, 50, 75, 110, 134, 150, 200, 300, 600,
784 1200, 1800, 2400, 4800, 9600, 19200, 38400,
785 57600, 115200, 230400, 460800, 500000, 576000,
786 921600, 1000000, 1152000, 1500000, 2000000,
787 2500000, 3000000, 3500000, 4000000
788};
789
4c4c9432 790static const __u8 acm_tty_size[] = {
1da177e4
LT
791 5, 6, 7, 8
792};
793
6e47e069
AC
794static void acm_tty_set_termios(struct tty_struct *tty,
795 struct ktermios *termios_old)
1da177e4
LT
796{
797 struct acm *acm = tty->driver_data;
606d099c 798 struct ktermios *termios = tty->termios;
1da177e4
LT
799 struct usb_cdc_line_coding newline;
800 int newctrl = acm->ctrlout;
801
9b80fee1 802 newline.dwDTERate = cpu_to_le32(tty_get_baud_rate(tty));
1da177e4
LT
803 newline.bCharFormat = termios->c_cflag & CSTOPB ? 2 : 0;
804 newline.bParityType = termios->c_cflag & PARENB ?
6e47e069
AC
805 (termios->c_cflag & PARODD ? 1 : 2) +
806 (termios->c_cflag & CMSPAR ? 2 : 0) : 0;
1da177e4 807 newline.bDataBits = acm_tty_size[(termios->c_cflag & CSIZE) >> 4];
6e47e069 808 /* FIXME: Needs to clear unsupported bits in the termios */
1da177e4
LT
809 acm->clocal = ((termios->c_cflag & CLOCAL) != 0);
810
811 if (!newline.dwDTERate) {
812 newline.dwDTERate = acm->line.dwDTERate;
813 newctrl &= ~ACM_CTRL_DTR;
6e47e069
AC
814 } else
815 newctrl |= ACM_CTRL_DTR;
1da177e4
LT
816
817 if (newctrl != acm->ctrlout)
818 acm_set_control(acm, acm->ctrlout = newctrl);
819
820 if (memcmp(&acm->line, &newline, sizeof newline)) {
821 memcpy(&acm->line, &newline, sizeof newline);
a5cc7ef9
JH
822 dev_dbg(&acm->control->dev, "%s - set line: %d %d %d %d\n",
823 __func__,
824 le32_to_cpu(newline.dwDTERate),
1da177e4
LT
825 newline.bCharFormat, newline.bParityType,
826 newline.bDataBits);
827 acm_set_line(acm, &acm->line);
828 }
829}
830
7fb57a01
HS
831static const struct tty_port_operations acm_port_ops = {
832 .shutdown = acm_port_shutdown,
833 .activate = acm_port_activate,
834 .destruct = acm_port_destruct,
835};
836
1da177e4
LT
837/*
838 * USB probe and disconnect routines.
839 */
840
830f4021 841/* Little helpers: write/read buffers free */
884b600f
ON
842static void acm_write_buffers_free(struct acm *acm)
843{
844 int i;
845 struct acm_wb *wb;
a496c64f 846 struct usb_device *usb_dev = interface_to_usbdev(acm->control);
884b600f 847
6e47e069 848 for (wb = &acm->wb[0], i = 0; i < ACM_NW; i++, wb++)
997ea58e 849 usb_free_coherent(usb_dev, acm->writesize, wb->buf, wb->dmah);
884b600f
ON
850}
851
830f4021
ON
852static void acm_read_buffers_free(struct acm *acm)
853{
854 struct usb_device *usb_dev = interface_to_usbdev(acm->control);
dab54c9f 855 int i;
830f4021 856
dab54c9f 857 for (i = 0; i < acm->rx_buflimit; i++)
997ea58e 858 usb_free_coherent(usb_dev, acm->readsize,
088c64f8 859 acm->read_buffers[i].base, acm->read_buffers[i].dma);
830f4021
ON
860}
861
884b600f
ON
862/* Little helper: write buffers allocate */
863static int acm_write_buffers_alloc(struct acm *acm)
864{
865 int i;
866 struct acm_wb *wb;
867
86478944 868 for (wb = &acm->wb[0], i = 0; i < ACM_NW; i++, wb++) {
997ea58e 869 wb->buf = usb_alloc_coherent(acm->dev, acm->writesize, GFP_KERNEL,
884b600f
ON
870 &wb->dmah);
871 if (!wb->buf) {
872 while (i != 0) {
873 --i;
874 --wb;
997ea58e 875 usb_free_coherent(acm->dev, acm->writesize,
884b600f
ON
876 wb->buf, wb->dmah);
877 }
878 return -ENOMEM;
879 }
880 }
881 return 0;
882}
883
10077d4a
AC
884static int acm_probe(struct usb_interface *intf,
885 const struct usb_device_id *id)
1da177e4
LT
886{
887 struct usb_cdc_union_desc *union_header = NULL;
c4cabd28 888 struct usb_cdc_country_functional_desc *cfd = NULL;
c6dbf554 889 unsigned char *buffer = intf->altsetting->extra;
1da177e4
LT
890 int buflen = intf->altsetting->extralen;
891 struct usb_interface *control_interface;
892 struct usb_interface *data_interface;
a2bfb4a3
ON
893 struct usb_endpoint_descriptor *epctrl = NULL;
894 struct usb_endpoint_descriptor *epread = NULL;
895 struct usb_endpoint_descriptor *epwrite = NULL;
1da177e4
LT
896 struct usb_device *usb_dev = interface_to_usbdev(intf);
897 struct acm *acm;
898 int minor;
6e47e069 899 int ctrlsize, readsize;
1da177e4
LT
900 u8 *buf;
901 u8 ac_management_function = 0;
902 u8 call_management_function = 0;
903 int call_interface_num = -1;
fd5054c1 904 int data_interface_num = -1;
1da177e4 905 unsigned long quirks;
86478944 906 int num_rx_buf;
61a87adf 907 int i;
a2bfb4a3 908 int combined_interfaces = 0;
1da177e4 909
86478944 910 /* normal quirks */
1da177e4 911 quirks = (unsigned long)id->driver_info;
86478944
ON
912 num_rx_buf = (quirks == SINGLE_RX_URB) ? 1 : ACM_NR;
913
914 /* handle quirks deadly to normal probing*/
1da177e4
LT
915 if (quirks == NO_UNION_NORMAL) {
916 data_interface = usb_ifnum_to_if(usb_dev, 1);
917 control_interface = usb_ifnum_to_if(usb_dev, 0);
918 goto skip_normal_probe;
919 }
6e47e069 920
1da177e4
LT
921 /* normal probing*/
922 if (!buffer) {
9908a32e 923 dev_err(&intf->dev, "Weird descriptor references\n");
1da177e4
LT
924 return -EINVAL;
925 }
926
927 if (!buflen) {
577045c0
TG
928 if (intf->cur_altsetting->endpoint &&
929 intf->cur_altsetting->endpoint->extralen &&
6e47e069
AC
930 intf->cur_altsetting->endpoint->extra) {
931 dev_dbg(&intf->dev,
932 "Seeking extra descriptors on endpoint\n");
1da177e4
LT
933 buflen = intf->cur_altsetting->endpoint->extralen;
934 buffer = intf->cur_altsetting->endpoint->extra;
935 } else {
9908a32e
GKH
936 dev_err(&intf->dev,
937 "Zero length descriptor references\n");
1da177e4
LT
938 return -EINVAL;
939 }
940 }
941
942 while (buflen > 0) {
6e47e069 943 if (buffer[1] != USB_DT_CS_INTERFACE) {
9908a32e 944 dev_err(&intf->dev, "skipping garbage\n");
1da177e4
LT
945 goto next_desc;
946 }
947
6e47e069
AC
948 switch (buffer[2]) {
949 case USB_CDC_UNION_TYPE: /* we've found it */
950 if (union_header) {
951 dev_err(&intf->dev, "More than one "
952 "union descriptor, skipping ...\n");
953 goto next_desc;
1da177e4 954 }
6e47e069
AC
955 union_header = (struct usb_cdc_union_desc *)buffer;
956 break;
957 case USB_CDC_COUNTRY_TYPE: /* export through sysfs*/
958 cfd = (struct usb_cdc_country_functional_desc *)buffer;
959 break;
960 case USB_CDC_HEADER_TYPE: /* maybe check version */
961 break; /* for now we ignore it */
962 case USB_CDC_ACM_TYPE:
963 ac_management_function = buffer[3];
964 break;
965 case USB_CDC_CALL_MANAGEMENT_TYPE:
966 call_management_function = buffer[3];
967 call_interface_num = buffer[4];
ce126644 968 if ( (quirks & NOT_A_MODEM) == 0 && (call_management_function & 3) != 3)
6e47e069
AC
969 dev_err(&intf->dev, "This device cannot do calls on its own. It is not a modem.\n");
970 break;
971 default:
972 /* there are LOTS more CDC descriptors that
973 * could legitimately be found here.
974 */
975 dev_dbg(&intf->dev, "Ignoring descriptor: "
976 "type %02x, length %d\n",
977 buffer[2], buffer[0]);
978 break;
979 }
1da177e4
LT
980next_desc:
981 buflen -= buffer[0];
982 buffer += buffer[0];
983 }
984
985 if (!union_header) {
986 if (call_interface_num > 0) {
6e47e069 987 dev_dbg(&intf->dev, "No union descriptor, using call management descriptor\n");
fd5054c1
ES
988 /* quirks for Droids MuIn LCD */
989 if (quirks & NO_DATA_INTERFACE)
990 data_interface = usb_ifnum_to_if(usb_dev, 0);
991 else
992 data_interface = usb_ifnum_to_if(usb_dev, (data_interface_num = call_interface_num));
1da177e4
LT
993 control_interface = intf;
994 } else {
a2bfb4a3
ON
995 if (intf->cur_altsetting->desc.bNumEndpoints != 3) {
996 dev_dbg(&intf->dev,"No union descriptor, giving up\n");
997 return -ENODEV;
998 } else {
999 dev_warn(&intf->dev,"No union descriptor, testing for castrated device\n");
1000 combined_interfaces = 1;
1001 control_interface = data_interface = intf;
1002 goto look_for_collapsed_interface;
1003 }
1da177e4
LT
1004 }
1005 } else {
1006 control_interface = usb_ifnum_to_if(usb_dev, union_header->bMasterInterface0);
1007 data_interface = usb_ifnum_to_if(usb_dev, (data_interface_num = union_header->bSlaveInterface0));
1008 if (!control_interface || !data_interface) {
6e47e069 1009 dev_dbg(&intf->dev, "no interfaces\n");
1da177e4
LT
1010 return -ENODEV;
1011 }
1012 }
6e47e069 1013
1da177e4 1014 if (data_interface_num != call_interface_num)
6e47e069 1015 dev_dbg(&intf->dev, "Separate call control interface. That is not fully supported.\n");
1da177e4 1016
a2bfb4a3
ON
1017 if (control_interface == data_interface) {
1018 /* some broken devices designed for windows work this way */
1019 dev_warn(&intf->dev,"Control and data interfaces are not separated!\n");
1020 combined_interfaces = 1;
1021 /* a popular other OS doesn't use it */
1022 quirks |= NO_CAP_LINE;
1023 if (data_interface->cur_altsetting->desc.bNumEndpoints != 3) {
1024 dev_err(&intf->dev, "This needs exactly 3 endpoints\n");
1025 return -EINVAL;
1026 }
1027look_for_collapsed_interface:
1028 for (i = 0; i < 3; i++) {
1029 struct usb_endpoint_descriptor *ep;
1030 ep = &data_interface->cur_altsetting->endpoint[i].desc;
1031
1032 if (usb_endpoint_is_int_in(ep))
1033 epctrl = ep;
1034 else if (usb_endpoint_is_bulk_out(ep))
1035 epwrite = ep;
1036 else if (usb_endpoint_is_bulk_in(ep))
1037 epread = ep;
1038 else
1039 return -EINVAL;
1040 }
1041 if (!epctrl || !epread || !epwrite)
1042 return -ENODEV;
1043 else
1044 goto made_compressed_probe;
1045 }
1046
1da177e4
LT
1047skip_normal_probe:
1048
1049 /*workaround for switched interfaces */
6e47e069
AC
1050 if (data_interface->cur_altsetting->desc.bInterfaceClass
1051 != CDC_DATA_INTERFACE_TYPE) {
1052 if (control_interface->cur_altsetting->desc.bInterfaceClass
1053 == CDC_DATA_INTERFACE_TYPE) {
1da177e4 1054 struct usb_interface *t;
6e47e069
AC
1055 dev_dbg(&intf->dev,
1056 "Your device has switched interfaces.\n");
1da177e4
LT
1057 t = control_interface;
1058 control_interface = data_interface;
1059 data_interface = t;
1060 } else {
1061 return -EINVAL;
1062 }
1063 }
74da5d68
AS
1064
1065 /* Accept probe requests only for the control interface */
a2bfb4a3 1066 if (!combined_interfaces && intf != control_interface)
74da5d68 1067 return -ENODEV;
6e47e069 1068
a2bfb4a3
ON
1069 if (!combined_interfaces && usb_interface_claimed(data_interface)) {
1070 /* valid in this context */
6e47e069 1071 dev_dbg(&intf->dev, "The data interface isn't available\n");
1da177e4
LT
1072 return -EBUSY;
1073 }
1074
1075
1076 if (data_interface->cur_altsetting->desc.bNumEndpoints < 2)
1077 return -EINVAL;
1078
1079 epctrl = &control_interface->cur_altsetting->endpoint[0].desc;
1080 epread = &data_interface->cur_altsetting->endpoint[0].desc;
1081 epwrite = &data_interface->cur_altsetting->endpoint[1].desc;
1082
1083
1084 /* workaround for switched endpoints */
45aea704 1085 if (!usb_endpoint_dir_in(epread)) {
1da177e4
LT
1086 /* descriptors are swapped */
1087 struct usb_endpoint_descriptor *t;
6e47e069
AC
1088 dev_dbg(&intf->dev,
1089 "The data interface has switched endpoints\n");
1da177e4
LT
1090 t = epread;
1091 epread = epwrite;
1092 epwrite = t;
1093 }
a2bfb4a3 1094made_compressed_probe:
a5cc7ef9 1095 dev_dbg(&intf->dev, "interfaces are valid\n");
1da177e4 1096
6e47e069
AC
1097 acm = kzalloc(sizeof(struct acm), GFP_KERNEL);
1098 if (acm == NULL) {
255ab56c 1099 dev_err(&intf->dev, "out of memory (acm kzalloc)\n");
1da177e4
LT
1100 goto alloc_fail;
1101 }
1da177e4 1102
7fb57a01
HS
1103 minor = acm_alloc_minor(acm);
1104 if (minor == ACM_TTY_MINORS) {
1105 dev_err(&intf->dev, "no more free acm devices\n");
1106 kfree(acm);
1107 return -ENODEV;
1108 }
1109
29cc8897
KM
1110 ctrlsize = usb_endpoint_maxp(epctrl);
1111 readsize = usb_endpoint_maxp(epread) *
6e47e069 1112 (quirks == SINGLE_RX_URB ? 1 : 2);
a2bfb4a3 1113 acm->combined_interfaces = combined_interfaces;
29cc8897 1114 acm->writesize = usb_endpoint_maxp(epwrite) * 20;
1da177e4
LT
1115 acm->control = control_interface;
1116 acm->data = data_interface;
1117 acm->minor = minor;
1118 acm->dev = usb_dev;
1119 acm->ctrl_caps = ac_management_function;
a2bfb4a3
ON
1120 if (quirks & NO_CAP_LINE)
1121 acm->ctrl_caps &= ~USB_CDC_CAP_LINE;
1da177e4
LT
1122 acm->ctrlsize = ctrlsize;
1123 acm->readsize = readsize;
86478944 1124 acm->rx_buflimit = num_rx_buf;
c4028958 1125 INIT_WORK(&acm->work, acm_softint);
884b600f 1126 spin_lock_init(&acm->write_lock);
61a87adf 1127 spin_lock_init(&acm->read_lock);
1365baf7 1128 mutex_init(&acm->mutex);
61a87adf 1129 acm->rx_endpoint = usb_rcvbulkpipe(usb_dev, epread->bEndpointAddress);
cf7fdd57
ON
1130 acm->is_int_ep = usb_endpoint_xfer_int(epread);
1131 if (acm->is_int_ep)
1132 acm->bInterval = epread->bInterval;
739e0285
AC
1133 tty_port_init(&acm->port);
1134 acm->port.ops = &acm_port_ops;
1da177e4 1135
997ea58e 1136 buf = usb_alloc_coherent(usb_dev, ctrlsize, GFP_KERNEL, &acm->ctrl_dma);
1da177e4 1137 if (!buf) {
255ab56c 1138 dev_err(&intf->dev, "out of memory (ctrl buffer alloc)\n");
1da177e4
LT
1139 goto alloc_fail2;
1140 }
1141 acm->ctrl_buffer = buf;
1142
884b600f 1143 if (acm_write_buffers_alloc(acm) < 0) {
255ab56c 1144 dev_err(&intf->dev, "out of memory (write buffer alloc)\n");
1da177e4
LT
1145 goto alloc_fail4;
1146 }
1da177e4
LT
1147
1148 acm->ctrlurb = usb_alloc_urb(0, GFP_KERNEL);
1149 if (!acm->ctrlurb) {
255ab56c 1150 dev_err(&intf->dev, "out of memory (ctrlurb kmalloc)\n");
1da177e4
LT
1151 goto alloc_fail5;
1152 }
86478944 1153 for (i = 0; i < num_rx_buf; i++) {
088c64f8
JH
1154 struct acm_rb *rb = &(acm->read_buffers[i]);
1155 struct urb *urb;
61a87adf 1156
74f5e1ba
JH
1157 rb->base = usb_alloc_coherent(acm->dev, readsize, GFP_KERNEL,
1158 &rb->dma);
1159 if (!rb->base) {
1160 dev_err(&intf->dev, "out of memory "
1161 "(read bufs usb_alloc_coherent)\n");
1162 goto alloc_fail6;
1163 }
088c64f8
JH
1164 rb->index = i;
1165 rb->instance = acm;
74f5e1ba 1166
088c64f8
JH
1167 urb = usb_alloc_urb(0, GFP_KERNEL);
1168 if (!urb) {
255ab56c 1169 dev_err(&intf->dev,
6e47e069 1170 "out of memory (read urbs usb_alloc_urb)\n");
c2572b78 1171 goto alloc_fail6;
61a87adf 1172 }
088c64f8
JH
1173 urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
1174 urb->transfer_dma = rb->dma;
1175 if (acm->is_int_ep) {
1176 usb_fill_int_urb(urb, acm->dev,
1177 acm->rx_endpoint,
1178 rb->base,
1179 acm->readsize,
1180 acm_read_bulk_callback, rb,
1181 acm->bInterval);
1182 } else {
1183 usb_fill_bulk_urb(urb, acm->dev,
1184 acm->rx_endpoint,
1185 rb->base,
1186 acm->readsize,
1187 acm_read_bulk_callback, rb);
1188 }
61a87adf 1189
088c64f8
JH
1190 acm->read_urbs[i] = urb;
1191 __set_bit(i, &acm->read_urbs_free);
61a87adf 1192 }
6e47e069 1193 for (i = 0; i < ACM_NW; i++) {
e4cf3aa8
DE
1194 struct acm_wb *snd = &(acm->wb[i]);
1195
6e47e069
AC
1196 snd->urb = usb_alloc_urb(0, GFP_KERNEL);
1197 if (snd->urb == NULL) {
255ab56c 1198 dev_err(&intf->dev,
59d7fec7 1199 "out of memory (write urbs usb_alloc_urb)\n");
74f5e1ba 1200 goto alloc_fail7;
e4cf3aa8
DE
1201 }
1202
5186ffee
AL
1203 if (usb_endpoint_xfer_int(epwrite))
1204 usb_fill_int_urb(snd->urb, usb_dev,
1205 usb_sndbulkpipe(usb_dev, epwrite->bEndpointAddress),
1206 NULL, acm->writesize, acm_write_bulk, snd, epwrite->bInterval);
1207 else
1208 usb_fill_bulk_urb(snd->urb, usb_dev,
1209 usb_sndbulkpipe(usb_dev, epwrite->bEndpointAddress),
1210 NULL, acm->writesize, acm_write_bulk, snd);
e4cf3aa8
DE
1211 snd->urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
1212 snd->instance = acm;
1da177e4
LT
1213 }
1214
6e47e069 1215 usb_set_intfdata(intf, acm);
c4cabd28
ON
1216
1217 i = device_create_file(&intf->dev, &dev_attr_bmCapabilities);
1218 if (i < 0)
74f5e1ba 1219 goto alloc_fail7;
c4cabd28
ON
1220
1221 if (cfd) { /* export the country data */
1222 acm->country_codes = kmalloc(cfd->bLength - 4, GFP_KERNEL);
1223 if (!acm->country_codes)
1224 goto skip_countries;
1225 acm->country_code_size = cfd->bLength - 4;
6e47e069
AC
1226 memcpy(acm->country_codes, (u8 *)&cfd->wCountyCode0,
1227 cfd->bLength - 4);
c4cabd28
ON
1228 acm->country_rel_date = cfd->iCountryCodeRelDate;
1229
1230 i = device_create_file(&intf->dev, &dev_attr_wCountryCodes);
1231 if (i < 0) {
1232 kfree(acm->country_codes);
e7c8e860
JL
1233 acm->country_codes = NULL;
1234 acm->country_code_size = 0;
c4cabd28
ON
1235 goto skip_countries;
1236 }
1237
6e47e069
AC
1238 i = device_create_file(&intf->dev,
1239 &dev_attr_iCountryCodeRelDate);
c4cabd28 1240 if (i < 0) {
c2572b78 1241 device_remove_file(&intf->dev, &dev_attr_wCountryCodes);
c4cabd28 1242 kfree(acm->country_codes);
e7c8e860
JL
1243 acm->country_codes = NULL;
1244 acm->country_code_size = 0;
c4cabd28
ON
1245 goto skip_countries;
1246 }
1247 }
1248
1249skip_countries:
6e47e069 1250 usb_fill_int_urb(acm->ctrlurb, usb_dev,
a2bfb4a3
ON
1251 usb_rcvintpipe(usb_dev, epctrl->bEndpointAddress),
1252 acm->ctrl_buffer, ctrlsize, acm_ctrl_irq, acm,
1253 /* works around buggy devices */
1254 epctrl->bInterval ? epctrl->bInterval : 0xff);
1da177e4
LT
1255 acm->ctrlurb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
1256 acm->ctrlurb->transfer_dma = acm->ctrl_dma;
1257
1da177e4
LT
1258 dev_info(&intf->dev, "ttyACM%d: USB ACM device\n", minor);
1259
1260 acm_set_control(acm, acm->ctrlout);
1261
1262 acm->line.dwDTERate = cpu_to_le32(9600);
1263 acm->line.bDataBits = 8;
1264 acm_set_line(acm, &acm->line);
1265
1266 usb_driver_claim_interface(&acm_driver, data_interface, acm);
672c4e18 1267 usb_set_intfdata(data_interface, acm);
1da177e4 1268
83ef344a 1269 usb_get_intf(control_interface);
1270 tty_register_device(acm_tty_driver, minor, &control_interface->dev);
1da177e4 1271
c4cabd28 1272 return 0;
74f5e1ba 1273alloc_fail7:
e4cf3aa8
DE
1274 for (i = 0; i < ACM_NW; i++)
1275 usb_free_urb(acm->wb[i].urb);
c2572b78 1276alloc_fail6:
86478944 1277 for (i = 0; i < num_rx_buf; i++)
088c64f8 1278 usb_free_urb(acm->read_urbs[i]);
74f5e1ba 1279 acm_read_buffers_free(acm);
1da177e4
LT
1280 usb_free_urb(acm->ctrlurb);
1281alloc_fail5:
884b600f 1282 acm_write_buffers_free(acm);
1da177e4 1283alloc_fail4:
997ea58e 1284 usb_free_coherent(usb_dev, ctrlsize, acm->ctrl_buffer, acm->ctrl_dma);
1da177e4 1285alloc_fail2:
7fb57a01 1286 acm_release_minor(acm);
1da177e4
LT
1287 kfree(acm);
1288alloc_fail:
1289 return -ENOMEM;
1290}
1291
1365baf7
ON
1292static void stop_data_traffic(struct acm *acm)
1293{
1294 int i;
a5cc7ef9
JH
1295
1296 dev_dbg(&acm->control->dev, "%s\n", __func__);
1365baf7 1297
1365baf7 1298 usb_kill_urb(acm->ctrlurb);
6e47e069 1299 for (i = 0; i < ACM_NW; i++)
e4cf3aa8 1300 usb_kill_urb(acm->wb[i].urb);
1365baf7 1301 for (i = 0; i < acm->rx_buflimit; i++)
088c64f8 1302 usb_kill_urb(acm->read_urbs[i]);
1365baf7
ON
1303
1304 cancel_work_sync(&acm->work);
1305}
1306
1da177e4
LT
1307static void acm_disconnect(struct usb_interface *intf)
1308{
c4cabd28 1309 struct acm *acm = usb_get_intfdata(intf);
1da177e4 1310 struct usb_device *usb_dev = interface_to_usbdev(intf);
10077d4a 1311 struct tty_struct *tty;
7fb57a01
HS
1312 int i;
1313
1314 dev_dbg(&intf->dev, "%s\n", __func__);
1da177e4 1315
672c4e18
DB
1316 /* sibling interface is already cleaning up */
1317 if (!acm)
86067eea 1318 return;
672c4e18 1319
7fb57a01
HS
1320 mutex_lock(&acm->mutex);
1321 acm->disconnected = true;
6e47e069 1322 if (acm->country_codes) {
74da5d68
AS
1323 device_remove_file(&acm->control->dev,
1324 &dev_attr_wCountryCodes);
1325 device_remove_file(&acm->control->dev,
1326 &dev_attr_iCountryCodeRelDate);
c4cabd28 1327 }
74da5d68 1328 device_remove_file(&acm->control->dev, &dev_attr_bmCapabilities);
86067eea
ON
1329 usb_set_intfdata(acm->control, NULL);
1330 usb_set_intfdata(acm->data, NULL);
7fb57a01
HS
1331 mutex_unlock(&acm->mutex);
1332
1333 tty = tty_port_tty_get(&acm->port);
1334 if (tty) {
1335 tty_vhangup(tty);
1336 tty_kref_put(tty);
1337 }
1da177e4 1338
1365baf7 1339 stop_data_traffic(acm);
1da177e4 1340
7fb57a01
HS
1341 usb_free_urb(acm->ctrlurb);
1342 for (i = 0; i < ACM_NW; i++)
1343 usb_free_urb(acm->wb[i].urb);
1344 for (i = 0; i < acm->rx_buflimit; i++)
1345 usb_free_urb(acm->read_urbs[i]);
884b600f 1346 acm_write_buffers_free(acm);
7fb57a01 1347 usb_free_coherent(usb_dev, acm->ctrlsize, acm->ctrl_buffer, acm->ctrl_dma);
830f4021 1348 acm_read_buffers_free(acm);
1da177e4 1349
a2bfb4a3
ON
1350 if (!acm->combined_interfaces)
1351 usb_driver_release_interface(&acm_driver, intf == acm->control ?
830f4021 1352 acm->data : acm->control);
1da177e4 1353
7fb57a01 1354 tty_port_put(&acm->port);
1da177e4
LT
1355}
1356
35758589 1357#ifdef CONFIG_PM
1365baf7
ON
1358static int acm_suspend(struct usb_interface *intf, pm_message_t message)
1359{
1360 struct acm *acm = usb_get_intfdata(intf);
11ea859d
ON
1361 int cnt;
1362
5b1b0b81 1363 if (PMSG_IS_AUTO(message)) {
11ea859d
ON
1364 int b;
1365
088c64f8
JH
1366 spin_lock_irq(&acm->write_lock);
1367 b = acm->transmitting;
1368 spin_unlock_irq(&acm->write_lock);
11ea859d
ON
1369 if (b)
1370 return -EBUSY;
1371 }
1372
1373 spin_lock_irq(&acm->read_lock);
1374 spin_lock(&acm->write_lock);
1375 cnt = acm->susp_count++;
1376 spin_unlock(&acm->write_lock);
1377 spin_unlock_irq(&acm->read_lock);
1365baf7 1378
11ea859d 1379 if (cnt)
1365baf7 1380 return 0;
1365baf7 1381
7fb57a01 1382 if (test_bit(ASYNCB_INITIALIZED, &acm->port.flags))
1365baf7
ON
1383 stop_data_traffic(acm);
1384
1365baf7
ON
1385 return 0;
1386}
1387
1388static int acm_resume(struct usb_interface *intf)
1389{
1390 struct acm *acm = usb_get_intfdata(intf);
97d35f95 1391 struct acm_wb *wb;
1365baf7 1392 int rv = 0;
11ea859d 1393 int cnt;
1365baf7 1394
11ea859d
ON
1395 spin_lock_irq(&acm->read_lock);
1396 acm->susp_count -= 1;
1397 cnt = acm->susp_count;
1398 spin_unlock_irq(&acm->read_lock);
1399
1400 if (cnt)
1365baf7
ON
1401 return 0;
1402
7fb57a01 1403 if (test_bit(ASYNCB_INITIALIZED, &acm->port.flags)) {
1365baf7 1404 rv = usb_submit_urb(acm->ctrlurb, GFP_NOIO);
97d35f95
ON
1405
1406 spin_lock_irq(&acm->write_lock);
1407 if (acm->delayed_wb) {
1408 wb = acm->delayed_wb;
1409 acm->delayed_wb = NULL;
1410 spin_unlock_irq(&acm->write_lock);
f0730924 1411 acm_start_wb(acm, wb);
97d35f95
ON
1412 } else {
1413 spin_unlock_irq(&acm->write_lock);
1414 }
1415
1416 /*
1417 * delayed error checking because we must
1418 * do the write path at all cost
1419 */
1365baf7 1420 if (rv < 0)
11ea859d 1421 goto err_out;
1365baf7 1422
088c64f8 1423 rv = acm_submit_read_urbs(acm, GFP_NOIO);
1365baf7
ON
1424 }
1425
1426err_out:
1365baf7
ON
1427 return rv;
1428}
35758589 1429
a91b0c50
FL
1430static int acm_reset_resume(struct usb_interface *intf)
1431{
1432 struct acm *acm = usb_get_intfdata(intf);
1433 struct tty_struct *tty;
1434
7fb57a01 1435 if (test_bit(ASYNCB_INITIALIZED, &acm->port.flags)) {
a91b0c50
FL
1436 tty = tty_port_tty_get(&acm->port);
1437 if (tty) {
1438 tty_hangup(tty);
1439 tty_kref_put(tty);
1440 }
1441 }
7fb57a01 1442
a91b0c50
FL
1443 return acm_resume(intf);
1444}
1445
35758589 1446#endif /* CONFIG_PM */
c1479a92
AT
1447
1448#define NOKIA_PCSUITE_ACM_INFO(x) \
1449 USB_DEVICE_AND_INTERFACE_INFO(0x0421, x, \
1450 USB_CLASS_COMM, USB_CDC_SUBCLASS_ACM, \
1451 USB_CDC_ACM_PROTO_VENDOR)
1452
4035e456
TG
1453#define SAMSUNG_PCSUITE_ACM_INFO(x) \
1454 USB_DEVICE_AND_INTERFACE_INFO(0x04e7, x, \
1455 USB_CLASS_COMM, USB_CDC_SUBCLASS_ACM, \
1456 USB_CDC_ACM_PROTO_VENDOR)
1457
1da177e4
LT
1458/*
1459 * USB driver structure.
1460 */
1461
6ef4852b 1462static const struct usb_device_id acm_ids[] = {
1da177e4
LT
1463 /* quirky and broken devices */
1464 { USB_DEVICE(0x0870, 0x0001), /* Metricom GS Modem */
1465 .driver_info = NO_UNION_NORMAL, /* has no union descriptor */
1466 },
b0e2a705
AA
1467 { USB_DEVICE(0x0e8d, 0x0003), /* FIREFLY, MediaTek Inc; andrey.arapov@gmail.com */
1468 .driver_info = NO_UNION_NORMAL, /* has no union descriptor */
1469 },
0f9c7b4a
AL
1470 { USB_DEVICE(0x0e8d, 0x3329), /* MediaTek Inc GPS */
1471 .driver_info = NO_UNION_NORMAL, /* has no union descriptor */
1472 },
8753e65e
MO
1473 { USB_DEVICE(0x0482, 0x0203), /* KYOCERA AH-K3001V */
1474 .driver_info = NO_UNION_NORMAL, /* has no union descriptor */
1475 },
91a9c921
CM
1476 { USB_DEVICE(0x079b, 0x000f), /* BT On-Air USB MODEM */
1477 .driver_info = NO_UNION_NORMAL, /* has no union descriptor */
1478 },
7abcf20b
AC
1479 { USB_DEVICE(0x0ace, 0x1602), /* ZyDAS 56K USB MODEM */
1480 .driver_info = SINGLE_RX_URB,
1481 },
86478944
ON
1482 { USB_DEVICE(0x0ace, 0x1608), /* ZyDAS 56K USB MODEM */
1483 .driver_info = SINGLE_RX_URB, /* firmware bug */
1484 },
3dd2ae81
ON
1485 { USB_DEVICE(0x0ace, 0x1611), /* ZyDAS 56K USB MODEM - new version */
1486 .driver_info = SINGLE_RX_URB, /* firmware bug */
1487 },
9be8456c
ON
1488 { USB_DEVICE(0x22b8, 0x7000), /* Motorola Q Phone */
1489 .driver_info = NO_UNION_NORMAL, /* has no union descriptor */
1490 },
6149ed5e
IM
1491 { USB_DEVICE(0x0803, 0x3095), /* Zoom Telephonics Model 3095F USB MODEM */
1492 .driver_info = NO_UNION_NORMAL, /* has no union descriptor */
1493 },
c8fd2c37
ES
1494 { USB_DEVICE(0x0572, 0x1321), /* Conexant USB MODEM CX93010 */
1495 .driver_info = NO_UNION_NORMAL, /* has no union descriptor */
1496 },
c89c60e9
AC
1497 { USB_DEVICE(0x0572, 0x1324), /* Conexant USB MODEM RD02-D400 */
1498 .driver_info = NO_UNION_NORMAL, /* has no union descriptor */
1499 },
cab98a0a
XK
1500 { USB_DEVICE(0x0572, 0x1328), /* Shiro / Aztech USB MODEM UM-3100 */
1501 .driver_info = NO_UNION_NORMAL, /* has no union descriptor */
1502 },
155df65a
DT
1503 { USB_DEVICE(0x22b8, 0x6425), /* Motorola MOTOMAGX phones */
1504 },
6abff5dc
KH
1505 /* Motorola H24 HSPA module: */
1506 { USB_DEVICE(0x22b8, 0x2d91) }, /* modem */
1507 { USB_DEVICE(0x22b8, 0x2d92) }, /* modem + diagnostics */
1508 { USB_DEVICE(0x22b8, 0x2d93) }, /* modem + AT port */
1509 { USB_DEVICE(0x22b8, 0x2d95) }, /* modem + AT port + diagnostics */
1510 { USB_DEVICE(0x22b8, 0x2d96) }, /* modem + NMEA */
1511 { USB_DEVICE(0x22b8, 0x2d97) }, /* modem + diagnostics + NMEA */
1512 { USB_DEVICE(0x22b8, 0x2d99) }, /* modem + AT port + NMEA */
1513 { USB_DEVICE(0x22b8, 0x2d9a) }, /* modem + AT port + diagnostics + NMEA */
1514
c332b4e1
AR
1515 { USB_DEVICE(0x0572, 0x1329), /* Hummingbird huc56s (Conexant) */
1516 .driver_info = NO_UNION_NORMAL, /* union descriptor misplaced on
1517 data interface instead of
1518 communications interface.
1519 Maybe we should define a new
1520 quirk for this. */
1521 },
1f17c502
KK
1522 { USB_DEVICE(0x1bbb, 0x0003), /* Alcatel OT-I650 */
1523 .driver_info = NO_UNION_NORMAL, /* reports zero length descriptor */
1524 },
c3baa19b
RN
1525 { USB_DEVICE(0x1576, 0x03b1), /* Maretron USB100 */
1526 .driver_info = NO_UNION_NORMAL, /* reports zero length descriptor */
1527 },
9be8456c 1528
c1479a92
AT
1529 /* Nokia S60 phones expose two ACM channels. The first is
1530 * a modem and is picked up by the standard AT-command
1531 * information below. The second is 'vendor-specific' but
1532 * is treated as a serial device at the S60 end, so we want
1533 * to expose it on Linux too. */
1534 { NOKIA_PCSUITE_ACM_INFO(0x042D), }, /* Nokia 3250 */
1535 { NOKIA_PCSUITE_ACM_INFO(0x04D8), }, /* Nokia 5500 Sport */
1536 { NOKIA_PCSUITE_ACM_INFO(0x04C9), }, /* Nokia E50 */
1537 { NOKIA_PCSUITE_ACM_INFO(0x0419), }, /* Nokia E60 */
1538 { NOKIA_PCSUITE_ACM_INFO(0x044D), }, /* Nokia E61 */
1539 { NOKIA_PCSUITE_ACM_INFO(0x0001), }, /* Nokia E61i */
1540 { NOKIA_PCSUITE_ACM_INFO(0x0475), }, /* Nokia E62 */
1541 { NOKIA_PCSUITE_ACM_INFO(0x0508), }, /* Nokia E65 */
1542 { NOKIA_PCSUITE_ACM_INFO(0x0418), }, /* Nokia E70 */
1543 { NOKIA_PCSUITE_ACM_INFO(0x0425), }, /* Nokia N71 */
1544 { NOKIA_PCSUITE_ACM_INFO(0x0486), }, /* Nokia N73 */
1545 { NOKIA_PCSUITE_ACM_INFO(0x04DF), }, /* Nokia N75 */
1546 { NOKIA_PCSUITE_ACM_INFO(0x000e), }, /* Nokia N77 */
1547 { NOKIA_PCSUITE_ACM_INFO(0x0445), }, /* Nokia N80 */
1548 { NOKIA_PCSUITE_ACM_INFO(0x042F), }, /* Nokia N91 & N91 8GB */
1549 { NOKIA_PCSUITE_ACM_INFO(0x048E), }, /* Nokia N92 */
1550 { NOKIA_PCSUITE_ACM_INFO(0x0420), }, /* Nokia N93 */
1551 { NOKIA_PCSUITE_ACM_INFO(0x04E6), }, /* Nokia N93i */
1552 { NOKIA_PCSUITE_ACM_INFO(0x04B2), }, /* Nokia 5700 XpressMusic */
1553 { NOKIA_PCSUITE_ACM_INFO(0x0134), }, /* Nokia 6110 Navigator (China) */
1554 { NOKIA_PCSUITE_ACM_INFO(0x046E), }, /* Nokia 6110 Navigator */
1555 { NOKIA_PCSUITE_ACM_INFO(0x002f), }, /* Nokia 6120 classic & */
1556 { NOKIA_PCSUITE_ACM_INFO(0x0088), }, /* Nokia 6121 classic */
1557 { NOKIA_PCSUITE_ACM_INFO(0x00fc), }, /* Nokia 6124 classic */
1558 { NOKIA_PCSUITE_ACM_INFO(0x0042), }, /* Nokia E51 */
1559 { NOKIA_PCSUITE_ACM_INFO(0x00b0), }, /* Nokia E66 */
1560 { NOKIA_PCSUITE_ACM_INFO(0x00ab), }, /* Nokia E71 */
1561 { NOKIA_PCSUITE_ACM_INFO(0x0481), }, /* Nokia N76 */
1562 { NOKIA_PCSUITE_ACM_INFO(0x0007), }, /* Nokia N81 & N81 8GB */
1563 { NOKIA_PCSUITE_ACM_INFO(0x0071), }, /* Nokia N82 */
1564 { NOKIA_PCSUITE_ACM_INFO(0x04F0), }, /* Nokia N95 & N95-3 NAM */
1565 { NOKIA_PCSUITE_ACM_INFO(0x0070), }, /* Nokia N95 8GB */
1566 { NOKIA_PCSUITE_ACM_INFO(0x00e9), }, /* Nokia 5320 XpressMusic */
1567 { NOKIA_PCSUITE_ACM_INFO(0x0099), }, /* Nokia 6210 Navigator, RM-367 */
1568 { NOKIA_PCSUITE_ACM_INFO(0x0128), }, /* Nokia 6210 Navigator, RM-419 */
1569 { NOKIA_PCSUITE_ACM_INFO(0x008f), }, /* Nokia 6220 Classic */
1570 { NOKIA_PCSUITE_ACM_INFO(0x00a0), }, /* Nokia 6650 */
1571 { NOKIA_PCSUITE_ACM_INFO(0x007b), }, /* Nokia N78 */
1572 { NOKIA_PCSUITE_ACM_INFO(0x0094), }, /* Nokia N85 */
1573 { NOKIA_PCSUITE_ACM_INFO(0x003a), }, /* Nokia N96 & N96-3 */
1574 { NOKIA_PCSUITE_ACM_INFO(0x00e9), }, /* Nokia 5320 XpressMusic */
1575 { NOKIA_PCSUITE_ACM_INFO(0x0108), }, /* Nokia 5320 XpressMusic 2G */
1576 { NOKIA_PCSUITE_ACM_INFO(0x01f5), }, /* Nokia N97, RM-505 */
83a4eae9 1577 { NOKIA_PCSUITE_ACM_INFO(0x02e3), }, /* Nokia 5230, RM-588 */
4035e456
TG
1578 { NOKIA_PCSUITE_ACM_INFO(0x0178), }, /* Nokia E63 */
1579 { NOKIA_PCSUITE_ACM_INFO(0x010e), }, /* Nokia E75 */
1580 { NOKIA_PCSUITE_ACM_INFO(0x02d9), }, /* Nokia 6760 Slide */
1581 { NOKIA_PCSUITE_ACM_INFO(0x01d0), }, /* Nokia E52 */
1582 { NOKIA_PCSUITE_ACM_INFO(0x0223), }, /* Nokia E72 */
1583 { NOKIA_PCSUITE_ACM_INFO(0x0275), }, /* Nokia X6 */
1584 { NOKIA_PCSUITE_ACM_INFO(0x026c), }, /* Nokia N97 Mini */
1585 { NOKIA_PCSUITE_ACM_INFO(0x0154), }, /* Nokia 5800 XpressMusic */
1586 { NOKIA_PCSUITE_ACM_INFO(0x04ce), }, /* Nokia E90 */
1587 { NOKIA_PCSUITE_ACM_INFO(0x01d4), }, /* Nokia E55 */
721d92fc 1588 { NOKIA_PCSUITE_ACM_INFO(0x0302), }, /* Nokia N8 */
4061fde2
TG
1589 { NOKIA_PCSUITE_ACM_INFO(0x0335), }, /* Nokia E7 */
1590 { NOKIA_PCSUITE_ACM_INFO(0x03cd), }, /* Nokia C7 */
4035e456 1591 { SAMSUNG_PCSUITE_ACM_INFO(0x6651), }, /* Samsung GTi8510 (INNOV8) */
c1479a92 1592
65e52f41
DP
1593 /* Support for Owen devices */
1594 { USB_DEVICE(0x03eb, 0x0030), }, /* Owen SI30 */
1595
c1479a92
AT
1596 /* NOTE: non-Nokia COMM/ACM/0xff is likely MSFT RNDIS... NOT a modem! */
1597
7c5d8c39 1598 /* Support Lego NXT using pbLua firmware */
ce126644
JC
1599 { USB_DEVICE(0x0694, 0xff00),
1600 .driver_info = NOT_A_MODEM,
7893afc0 1601 },
7c5d8c39 1602
fd5054c1
ES
1603 /* Support for Droids MuIn LCD */
1604 { USB_DEVICE(0x04d8, 0x000b),
1605 .driver_info = NO_DATA_INTERFACE,
1606 },
1607
5b239f0a
PC
1608 /* control interfaces without any protocol set */
1609 { USB_INTERFACE_INFO(USB_CLASS_COMM, USB_CDC_SUBCLASS_ACM,
1610 USB_CDC_PROTO_NONE) },
1611
1da177e4
LT
1612 /* control interfaces with various AT-command sets */
1613 { USB_INTERFACE_INFO(USB_CLASS_COMM, USB_CDC_SUBCLASS_ACM,
1614 USB_CDC_ACM_PROTO_AT_V25TER) },
1615 { USB_INTERFACE_INFO(USB_CLASS_COMM, USB_CDC_SUBCLASS_ACM,
1616 USB_CDC_ACM_PROTO_AT_PCCA101) },
1617 { USB_INTERFACE_INFO(USB_CLASS_COMM, USB_CDC_SUBCLASS_ACM,
1618 USB_CDC_ACM_PROTO_AT_PCCA101_WAKE) },
1619 { USB_INTERFACE_INFO(USB_CLASS_COMM, USB_CDC_SUBCLASS_ACM,
1620 USB_CDC_ACM_PROTO_AT_GSM) },
1621 { USB_INTERFACE_INFO(USB_CLASS_COMM, USB_CDC_SUBCLASS_ACM,
6e47e069 1622 USB_CDC_ACM_PROTO_AT_3G) },
1da177e4
LT
1623 { USB_INTERFACE_INFO(USB_CLASS_COMM, USB_CDC_SUBCLASS_ACM,
1624 USB_CDC_ACM_PROTO_AT_CDMA) },
1625
1da177e4
LT
1626 { }
1627};
1628
6e47e069 1629MODULE_DEVICE_TABLE(usb, acm_ids);
1da177e4
LT
1630
1631static struct usb_driver acm_driver = {
1da177e4
LT
1632 .name = "cdc_acm",
1633 .probe = acm_probe,
1634 .disconnect = acm_disconnect,
35758589 1635#ifdef CONFIG_PM
1365baf7
ON
1636 .suspend = acm_suspend,
1637 .resume = acm_resume,
a91b0c50 1638 .reset_resume = acm_reset_resume,
35758589 1639#endif
1da177e4 1640 .id_table = acm_ids,
35758589 1641#ifdef CONFIG_PM
1365baf7 1642 .supports_autosuspend = 1,
35758589 1643#endif
1da177e4
LT
1644};
1645
1646/*
1647 * TTY driver structures.
1648 */
1649
b68e31d0 1650static const struct tty_operations acm_ops = {
7fb57a01 1651 .install = acm_tty_install,
1da177e4
LT
1652 .open = acm_tty_open,
1653 .close = acm_tty_close,
7fb57a01 1654 .cleanup = acm_tty_cleanup,
10077d4a 1655 .hangup = acm_tty_hangup,
1da177e4
LT
1656 .write = acm_tty_write,
1657 .write_room = acm_tty_write_room,
1658 .ioctl = acm_tty_ioctl,
1659 .throttle = acm_tty_throttle,
1660 .unthrottle = acm_tty_unthrottle,
1661 .chars_in_buffer = acm_tty_chars_in_buffer,
1662 .break_ctl = acm_tty_break_ctl,
1663 .set_termios = acm_tty_set_termios,
1664 .tiocmget = acm_tty_tiocmget,
1665 .tiocmset = acm_tty_tiocmset,
1666};
1667
1668/*
1669 * Init / exit.
1670 */
1671
1672static int __init acm_init(void)
1673{
1674 int retval;
1675 acm_tty_driver = alloc_tty_driver(ACM_TTY_MINORS);
1676 if (!acm_tty_driver)
1677 return -ENOMEM;
1678 acm_tty_driver->owner = THIS_MODULE,
1679 acm_tty_driver->driver_name = "acm",
1680 acm_tty_driver->name = "ttyACM",
1da177e4
LT
1681 acm_tty_driver->major = ACM_TTY_MAJOR,
1682 acm_tty_driver->minor_start = 0,
1683 acm_tty_driver->type = TTY_DRIVER_TYPE_SERIAL,
1684 acm_tty_driver->subtype = SERIAL_TYPE_NORMAL,
331b8319 1685 acm_tty_driver->flags = TTY_DRIVER_REAL_RAW | TTY_DRIVER_DYNAMIC_DEV;
1da177e4 1686 acm_tty_driver->init_termios = tty_std_termios;
6e47e069
AC
1687 acm_tty_driver->init_termios.c_cflag = B9600 | CS8 | CREAD |
1688 HUPCL | CLOCAL;
1da177e4
LT
1689 tty_set_operations(acm_tty_driver, &acm_ops);
1690
1691 retval = tty_register_driver(acm_tty_driver);
1692 if (retval) {
1693 put_tty_driver(acm_tty_driver);
1694 return retval;
1695 }
1696
1697 retval = usb_register(&acm_driver);
1698 if (retval) {
1699 tty_unregister_driver(acm_tty_driver);
1700 put_tty_driver(acm_tty_driver);
1701 return retval;
1702 }
1703
a2c7b935 1704 printk(KERN_INFO KBUILD_MODNAME ": " DRIVER_DESC "\n");
1da177e4
LT
1705
1706 return 0;
1707}
1708
1709static void __exit acm_exit(void)
1710{
1711 usb_deregister(&acm_driver);
1712 tty_unregister_driver(acm_tty_driver);
1713 put_tty_driver(acm_tty_driver);
1714}
1715
1716module_init(acm_init);
1717module_exit(acm_exit);
1718
6e47e069
AC
1719MODULE_AUTHOR(DRIVER_AUTHOR);
1720MODULE_DESCRIPTION(DRIVER_DESC);
1da177e4 1721MODULE_LICENSE("GPL");
e766aeb8 1722MODULE_ALIAS_CHARDEV_MAJOR(ACM_TTY_MAJOR);