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