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