]> bbs.cooldavid.org Git - net-next-2.6.git/blame - drivers/usb/class/cdc-acm.c
+ drivers-usb-serial-sierrac-fix-printk-warning.patch added to -mm tree
[net-next-2.6.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>
5 * Copyright (c) 1999 Pavel Machek <pavel@suse.cz>
6 * Copyright (c) 1999 Johannes Erdfelt <johannes@erdfelt.com>
7 * Copyright (c) 2000 Vojtech Pavlik <vojtech@suse.cz>
8 * Copyright (c) 2004 Oliver Neukum <oliver@neukum.name>
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>
62#include <linux/tty_driver.h>
63#include <linux/tty_flip.h>
64#include <linux/module.h>
4186ecf8 65#include <linux/mutex.h>
10077d4a 66#include <linux/uaccess.h>
1da177e4 67#include <linux/usb.h>
a8c28f23 68#include <linux/usb/cdc.h>
1da177e4
LT
69#include <asm/byteorder.h>
70#include <asm/unaligned.h>
61a87adf 71#include <linux/list.h>
1da177e4
LT
72
73#include "cdc-acm.h"
74
e5fbab51
DB
75
76#define ACM_CLOSE_TIMEOUT 15 /* seconds to let writes drain */
77
1da177e4
LT
78/*
79 * Version Information
80 */
e4cf3aa8 81#define DRIVER_VERSION "v0.26"
61a87adf 82#define DRIVER_AUTHOR "Armin Fuerst, Pavel Machek, Johannes Erdfelt, Vojtech Pavlik, David Kubicek"
1da177e4
LT
83#define DRIVER_DESC "USB Abstract Control Model driver for USB modems and ISDN adapters"
84
85static struct usb_driver acm_driver;
86static struct tty_driver *acm_tty_driver;
87static struct acm *acm_table[ACM_TTY_MINORS];
88
4186ecf8 89static DEFINE_MUTEX(open_mutex);
1da177e4 90
10077d4a 91#define ACM_READY(acm) (acm && acm->dev && acm->port.count)
1da177e4 92
739e0285
AC
93static const struct tty_port_operations acm_port_ops = {
94};
95
e5fbab51
DB
96#ifdef VERBOSE_DEBUG
97#define verbose 1
98#else
99#define verbose 0
100#endif
101
1da177e4
LT
102/*
103 * Functions for ACM control messages.
104 */
105
6e47e069
AC
106static int acm_ctrl_msg(struct acm *acm, int request, int value,
107 void *buf, int len)
1da177e4
LT
108{
109 int retval = usb_control_msg(acm->dev, usb_sndctrlpipe(acm->dev, 0),
110 request, USB_RT_ACM, value,
111 acm->control->altsetting[0].desc.bInterfaceNumber,
112 buf, len, 5000);
6e47e069
AC
113 dbg("acm_control_msg: rq: 0x%02x val: %#x len: %#x result: %d",
114 request, value, len, retval);
1da177e4
LT
115 return retval < 0 ? retval : 0;
116}
117
118/* devices aren't required to support these requests.
119 * the cdc acm descriptor tells whether they do...
120 */
121#define acm_set_control(acm, control) \
122 acm_ctrl_msg(acm, USB_CDC_REQ_SET_CONTROL_LINE_STATE, control, NULL, 0)
123#define acm_set_line(acm, line) \
124 acm_ctrl_msg(acm, USB_CDC_REQ_SET_LINE_CODING, 0, line, sizeof *(line))
125#define acm_send_break(acm, ms) \
126 acm_ctrl_msg(acm, USB_CDC_REQ_SEND_BREAK, ms, NULL, 0)
127
884b600f
ON
128/*
129 * Write buffer management.
130 * All of these assume proper locks taken by the caller.
131 */
132
133static int acm_wb_alloc(struct acm *acm)
134{
135 int i, wbn;
136 struct acm_wb *wb;
137
e4cf3aa8 138 wbn = 0;
884b600f
ON
139 i = 0;
140 for (;;) {
141 wb = &acm->wb[wbn];
142 if (!wb->use) {
143 wb->use = 1;
144 return wbn;
145 }
86478944
ON
146 wbn = (wbn + 1) % ACM_NW;
147 if (++i >= ACM_NW)
884b600f
ON
148 return -1;
149 }
150}
151
884b600f
ON
152static int acm_wb_is_avail(struct acm *acm)
153{
154 int i, n;
e5fbab51 155 unsigned long flags;
884b600f 156
86478944 157 n = ACM_NW;
e5fbab51 158 spin_lock_irqsave(&acm->write_lock, flags);
6e47e069 159 for (i = 0; i < ACM_NW; i++)
86478944 160 n -= acm->wb[i].use;
e5fbab51 161 spin_unlock_irqrestore(&acm->write_lock, flags);
884b600f
ON
162 return n;
163}
164
884b600f 165/*
ad0b65ef 166 * Finish write. Caller must hold acm->write_lock
884b600f 167 */
e4cf3aa8 168static void acm_write_done(struct acm *acm, struct acm_wb *wb)
884b600f 169{
e4cf3aa8 170 wb->use = 0;
11ea859d 171 acm->transmitting--;
884b600f
ON
172}
173
174/*
175 * Poke write.
11ea859d
ON
176 *
177 * the caller is responsible for locking
884b600f 178 */
11ea859d
ON
179
180static int acm_start_wb(struct acm *acm, struct acm_wb *wb)
181{
182 int rc;
183
184 acm->transmitting++;
185
186 wb->urb->transfer_buffer = wb->buf;
187 wb->urb->transfer_dma = wb->dmah;
188 wb->urb->transfer_buffer_length = wb->len;
189 wb->urb->dev = acm->dev;
190
6e47e069
AC
191 rc = usb_submit_urb(wb->urb, GFP_ATOMIC);
192 if (rc < 0) {
11ea859d
ON
193 dbg("usb_submit_urb(write bulk) failed: %d", rc);
194 acm_write_done(acm, wb);
195 }
196 return rc;
197}
198
e4cf3aa8 199static int acm_write_start(struct acm *acm, int wbn)
884b600f
ON
200{
201 unsigned long flags;
934da463 202 struct acm_wb *wb = &acm->wb[wbn];
884b600f
ON
203 int rc;
204
205 spin_lock_irqsave(&acm->write_lock, flags);
206 if (!acm->dev) {
934da463 207 wb->use = 0;
884b600f
ON
208 spin_unlock_irqrestore(&acm->write_lock, flags);
209 return -ENODEV;
210 }
211
11ea859d
ON
212 dbg("%s susp_count: %d", __func__, acm->susp_count);
213 if (acm->susp_count) {
11ea859d 214 acm->delayed_wb = wb;
11ea859d
ON
215 schedule_work(&acm->waker);
216 spin_unlock_irqrestore(&acm->write_lock, flags);
217 return 0; /* A white lie */
218 }
219 usb_mark_last_busy(acm->dev);
220
11ea859d 221 rc = acm_start_wb(acm, wb);
884b600f
ON
222 spin_unlock_irqrestore(&acm->write_lock, flags);
223
884b600f 224 return rc;
11ea859d 225
884b600f 226}
c4cabd28
ON
227/*
228 * attributes exported through sysfs
229 */
230static ssize_t show_caps
231(struct device *dev, struct device_attribute *attr, char *buf)
232{
233 struct usb_interface *intf = to_usb_interface(dev);
234 struct acm *acm = usb_get_intfdata(intf);
235
236 return sprintf(buf, "%d", acm->ctrl_caps);
237}
238static DEVICE_ATTR(bmCapabilities, S_IRUGO, show_caps, NULL);
239
240static ssize_t show_country_codes
241(struct device *dev, struct device_attribute *attr, char *buf)
242{
243 struct usb_interface *intf = to_usb_interface(dev);
244 struct acm *acm = usb_get_intfdata(intf);
245
246 memcpy(buf, acm->country_codes, acm->country_code_size);
247 return acm->country_code_size;
248}
249
250static DEVICE_ATTR(wCountryCodes, S_IRUGO, show_country_codes, NULL);
251
252static ssize_t show_country_rel_date
253(struct device *dev, struct device_attribute *attr, char *buf)
254{
255 struct usb_interface *intf = to_usb_interface(dev);
256 struct acm *acm = usb_get_intfdata(intf);
257
258 return sprintf(buf, "%d", acm->country_rel_date);
259}
884b600f 260
c4cabd28 261static DEVICE_ATTR(iCountryCodeRelDate, S_IRUGO, show_country_rel_date, NULL);
1da177e4
LT
262/*
263 * Interrupt handlers for various ACM device responses
264 */
265
266/* control interface reports status changes with "interrupt" transfers */
7d12e780 267static void acm_ctrl_irq(struct urb *urb)
1da177e4
LT
268{
269 struct acm *acm = urb->context;
270 struct usb_cdc_notification *dr = urb->transfer_buffer;
10077d4a 271 struct tty_struct *tty;
1da177e4
LT
272 unsigned char *data;
273 int newctrl;
185d4058
GKH
274 int retval;
275 int status = urb->status;
1da177e4 276
185d4058 277 switch (status) {
1da177e4
LT
278 case 0:
279 /* success */
280 break;
281 case -ECONNRESET:
282 case -ENOENT:
283 case -ESHUTDOWN:
284 /* this urb is terminated, clean up */
441b62c1 285 dbg("%s - urb shutting down with status: %d", __func__, status);
1da177e4
LT
286 return;
287 default:
441b62c1 288 dbg("%s - nonzero urb status received: %d", __func__, status);
1da177e4
LT
289 goto exit;
290 }
291
292 if (!ACM_READY(acm))
293 goto exit;
294
295 data = (unsigned char *)(dr + 1);
296 switch (dr->bNotificationType) {
6e47e069
AC
297 case USB_CDC_NOTIFY_NETWORK_CONNECTION:
298 dbg("%s network", dr->wValue ?
299 "connected to" : "disconnected from");
300 break;
1da177e4 301
6e47e069
AC
302 case USB_CDC_NOTIFY_SERIAL_STATE:
303 tty = tty_port_tty_get(&acm->port);
304 newctrl = get_unaligned_le16(data);
1da177e4 305
6e47e069
AC
306 if (tty) {
307 if (!acm->clocal &&
308 (acm->ctrlin & ~newctrl & ACM_CTRL_DCD)) {
309 dbg("calling hangup");
310 tty_hangup(tty);
1da177e4 311 }
6e47e069
AC
312 tty_kref_put(tty);
313 }
1da177e4 314
6e47e069 315 acm->ctrlin = newctrl;
1da177e4 316
6e47e069
AC
317 dbg("input control lines: dcd%c dsr%c break%c ring%c framing%c parity%c overrun%c",
318 acm->ctrlin & ACM_CTRL_DCD ? '+' : '-',
319 acm->ctrlin & ACM_CTRL_DSR ? '+' : '-',
320 acm->ctrlin & ACM_CTRL_BRK ? '+' : '-',
321 acm->ctrlin & ACM_CTRL_RI ? '+' : '-',
322 acm->ctrlin & ACM_CTRL_FRAMING ? '+' : '-',
323 acm->ctrlin & ACM_CTRL_PARITY ? '+' : '-',
324 acm->ctrlin & ACM_CTRL_OVERRUN ? '+' : '-');
1da177e4
LT
325 break;
326
6e47e069
AC
327 default:
328 dbg("unknown notification %d received: index %d len %d data0 %d data1 %d",
329 dr->bNotificationType, dr->wIndex,
330 dr->wLength, data[0], data[1]);
331 break;
1da177e4
LT
332 }
333exit:
11ea859d 334 usb_mark_last_busy(acm->dev);
6e47e069 335 retval = usb_submit_urb(urb, GFP_ATOMIC);
185d4058 336 if (retval)
9908a32e
GKH
337 dev_err(&urb->dev->dev, "%s - usb_submit_urb failed with "
338 "result %d", __func__, retval);
1da177e4
LT
339}
340
341/* data interface returns incoming bytes, or we got unthrottled */
7d12e780 342static void acm_read_bulk(struct urb *urb)
1da177e4 343{
61a87adf
DK
344 struct acm_rb *buf;
345 struct acm_ru *rcv = urb->context;
346 struct acm *acm = rcv->instance;
86478944 347 int status = urb->status;
185d4058
GKH
348
349 dbg("Entering acm_read_bulk with status %d", status);
1da177e4 350
11ea859d
ON
351 if (!ACM_READY(acm)) {
352 dev_dbg(&acm->data->dev, "Aborting, acm not ready");
1da177e4 353 return;
11ea859d
ON
354 }
355 usb_mark_last_busy(acm->dev);
1da177e4 356
86478944 357 if (status)
898eb71c 358 dev_dbg(&acm->data->dev, "bulk rx status %d\n", status);
1da177e4 359
61a87adf
DK
360 buf = rcv->buffer;
361 buf->size = urb->actual_length;
362
86478944
ON
363 if (likely(status == 0)) {
364 spin_lock(&acm->read_lock);
11ea859d 365 acm->processing++;
86478944
ON
366 list_add_tail(&rcv->list, &acm->spare_read_urbs);
367 list_add_tail(&buf->list, &acm->filled_read_bufs);
368 spin_unlock(&acm->read_lock);
369 } else {
370 /* we drop the buffer due to an error */
371 spin_lock(&acm->read_lock);
372 list_add_tail(&rcv->list, &acm->spare_read_urbs);
373 list_add(&buf->list, &acm->spare_read_bufs);
374 spin_unlock(&acm->read_lock);
375 /* nevertheless the tasklet must be kicked unconditionally
376 so the queue cannot dry up */
377 }
11ea859d
ON
378 if (likely(!acm->susp_count))
379 tasklet_schedule(&acm->urb_task);
1da177e4
LT
380}
381
382static void acm_rx_tasklet(unsigned long _acm)
383{
384 struct acm *acm = (void *)_acm;
61a87adf 385 struct acm_rb *buf;
10077d4a 386 struct tty_struct *tty;
61a87adf 387 struct acm_ru *rcv;
762f007b 388 unsigned long flags;
ca79b7b4 389 unsigned char throttled;
11ea859d 390
1da177e4
LT
391 dbg("Entering acm_rx_tasklet");
392
10077d4a 393 if (!ACM_READY(acm)) {
11ea859d 394 dbg("acm_rx_tasklet: ACM not ready");
ca79b7b4 395 return;
11ea859d 396 }
ca79b7b4 397
834dbca5 398 spin_lock_irqsave(&acm->throttle_lock, flags);
ca79b7b4 399 throttled = acm->throttle;
834dbca5 400 spin_unlock_irqrestore(&acm->throttle_lock, flags);
10077d4a 401 if (throttled) {
11ea859d 402 dbg("acm_rx_tasklet: throttled");
61a87adf 403 return;
11ea859d 404 }
61a87adf 405
10077d4a
AC
406 tty = tty_port_tty_get(&acm->port);
407
61a87adf 408next_buffer:
762f007b 409 spin_lock_irqsave(&acm->read_lock, flags);
61a87adf 410 if (list_empty(&acm->filled_read_bufs)) {
762f007b 411 spin_unlock_irqrestore(&acm->read_lock, flags);
61a87adf 412 goto urbs;
1da177e4 413 }
61a87adf
DK
414 buf = list_entry(acm->filled_read_bufs.next,
415 struct acm_rb, list);
416 list_del(&buf->list);
762f007b 417 spin_unlock_irqrestore(&acm->read_lock, flags);
61a87adf 418
3dd2ae81 419 dbg("acm_rx_tasklet: procesing buf 0x%p, size = %d", buf, buf->size);
61a87adf 420
10077d4a
AC
421 if (tty) {
422 spin_lock_irqsave(&acm->throttle_lock, flags);
423 throttled = acm->throttle;
424 spin_unlock_irqrestore(&acm->throttle_lock, flags);
425 if (!throttled) {
426 tty_buffer_request_room(tty, buf->size);
427 tty_insert_flip_string(tty, buf->base, buf->size);
428 tty_flip_buffer_push(tty);
429 } else {
430 tty_kref_put(tty);
431 dbg("Throttling noticed");
432 spin_lock_irqsave(&acm->read_lock, flags);
433 list_add(&buf->list, &acm->filled_read_bufs);
434 spin_unlock_irqrestore(&acm->read_lock, flags);
435 return;
436 }
1da177e4 437 }
1da177e4 438
762f007b 439 spin_lock_irqsave(&acm->read_lock, flags);
61a87adf 440 list_add(&buf->list, &acm->spare_read_bufs);
762f007b 441 spin_unlock_irqrestore(&acm->read_lock, flags);
61a87adf
DK
442 goto next_buffer;
443
444urbs:
10077d4a
AC
445 tty_kref_put(tty);
446
61a87adf 447 while (!list_empty(&acm->spare_read_bufs)) {
762f007b 448 spin_lock_irqsave(&acm->read_lock, flags);
61a87adf 449 if (list_empty(&acm->spare_read_urbs)) {
11ea859d 450 acm->processing = 0;
762f007b 451 spin_unlock_irqrestore(&acm->read_lock, flags);
61a87adf
DK
452 return;
453 }
454 rcv = list_entry(acm->spare_read_urbs.next,
455 struct acm_ru, list);
456 list_del(&rcv->list);
762f007b 457 spin_unlock_irqrestore(&acm->read_lock, flags);
61a87adf
DK
458
459 buf = list_entry(acm->spare_read_bufs.next,
460 struct acm_rb, list);
461 list_del(&buf->list);
462
463 rcv->buffer = buf;
464
465 usb_fill_bulk_urb(rcv->urb, acm->dev,
466 acm->rx_endpoint,
467 buf->base,
468 acm->readsize,
469 acm_read_bulk, rcv);
470 rcv->urb->transfer_dma = buf->dma;
471 rcv->urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
472
6e47e069
AC
473 /* This shouldn't kill the driver as unsuccessful URBs are
474 returned to the free-urbs-pool and resubmited ASAP */
11ea859d 475 spin_lock_irqsave(&acm->read_lock, flags);
6e47e069
AC
476 if (acm->susp_count ||
477 usb_submit_urb(rcv->urb, GFP_ATOMIC) < 0) {
61a87adf 478 list_add(&buf->list, &acm->spare_read_bufs);
61a87adf 479 list_add(&rcv->list, &acm->spare_read_urbs);
11ea859d 480 acm->processing = 0;
762f007b 481 spin_unlock_irqrestore(&acm->read_lock, flags);
61a87adf 482 return;
11ea859d
ON
483 } else {
484 spin_unlock_irqrestore(&acm->read_lock, flags);
485 dbg("acm_rx_tasklet: sending urb 0x%p, rcv 0x%p, buf 0x%p", rcv->urb, rcv, buf);
61a87adf
DK
486 }
487 }
11ea859d
ON
488 spin_lock_irqsave(&acm->read_lock, flags);
489 acm->processing = 0;
490 spin_unlock_irqrestore(&acm->read_lock, flags);
1da177e4
LT
491}
492
493/* data interface wrote those outgoing bytes */
7d12e780 494static void acm_write_bulk(struct urb *urb)
1da177e4 495{
cdc97792 496 struct acm_wb *wb = urb->context;
e5fbab51 497 struct acm *acm = wb->instance;
ad0b65ef 498 unsigned long flags;
1da177e4 499
e5fbab51
DB
500 if (verbose || urb->status
501 || (urb->actual_length != urb->transfer_buffer_length))
502 dev_dbg(&acm->data->dev, "tx %d/%d bytes -- > %d\n",
503 urb->actual_length,
504 urb->transfer_buffer_length,
505 urb->status);
1da177e4 506
ad0b65ef 507 spin_lock_irqsave(&acm->write_lock, flags);
e4cf3aa8 508 acm_write_done(acm, wb);
ad0b65ef 509 spin_unlock_irqrestore(&acm->write_lock, flags);
884b600f
ON
510 if (ACM_READY(acm))
511 schedule_work(&acm->work);
e5fbab51
DB
512 else
513 wake_up_interruptible(&acm->drain_wait);
1da177e4
LT
514}
515
c4028958 516static void acm_softint(struct work_struct *work)
1da177e4 517{
c4028958 518 struct acm *acm = container_of(work, struct acm, work);
10077d4a 519 struct tty_struct *tty;
e5fbab51
DB
520
521 dev_vdbg(&acm->data->dev, "tx work\n");
1da177e4
LT
522 if (!ACM_READY(acm))
523 return;
10077d4a
AC
524 tty = tty_port_tty_get(&acm->port);
525 tty_wakeup(tty);
526 tty_kref_put(tty);
1da177e4
LT
527}
528
11ea859d
ON
529static void acm_waker(struct work_struct *waker)
530{
531 struct acm *acm = container_of(waker, struct acm, waker);
11ea859d
ON
532 int rv;
533
534 rv = usb_autopm_get_interface(acm->control);
535 if (rv < 0) {
9908a32e 536 dev_err(&acm->dev->dev, "Autopm failure in %s\n", __func__);
11ea859d
ON
537 return;
538 }
539 if (acm->delayed_wb) {
540 acm_start_wb(acm, acm->delayed_wb);
541 acm->delayed_wb = NULL;
542 }
11ea859d
ON
543 usb_autopm_put_interface(acm->control);
544}
545
1da177e4
LT
546/*
547 * TTY handlers
548 */
549
550static int acm_tty_open(struct tty_struct *tty, struct file *filp)
551{
552 struct acm *acm;
553 int rv = -EINVAL;
61a87adf 554 int i;
3dd2ae81 555 dbg("Entering acm_tty_open.");
4186ecf8
AV
556
557 mutex_lock(&open_mutex);
1da177e4
LT
558
559 acm = acm_table[tty->index];
560 if (!acm || !acm->dev)
561 goto err_out;
562 else
563 rv = 0;
564
28d1dfad 565 set_bit(TTY_NO_WRITE_SPLIT, &tty->flags);
10077d4a 566
1da177e4 567 tty->driver_data = acm;
10077d4a 568 tty_port_tty_set(&acm->port, tty);
1da177e4 569
94409cc1
ON
570 if (usb_autopm_get_interface(acm->control) < 0)
571 goto early_bail;
11ea859d
ON
572 else
573 acm->control->needs_remote_wakeup = 1;
1365baf7
ON
574
575 mutex_lock(&acm->mutex);
10077d4a 576 if (acm->port.count++) {
1365baf7 577 usb_autopm_put_interface(acm->control);
1da177e4 578 goto done;
10077d4a 579 }
1365baf7 580
1da177e4
LT
581 acm->ctrlurb->dev = acm->dev;
582 if (usb_submit_urb(acm->ctrlurb, GFP_KERNEL)) {
583 dbg("usb_submit_urb(ctrl irq) failed");
584 goto bail_out;
585 }
586
ca79b7b4
ON
587 if (0 > acm_set_control(acm, acm->ctrlout = ACM_CTRL_DTR | ACM_CTRL_RTS) &&
588 (acm->ctrl_caps & USB_CDC_CAP_LINE))
1da177e4 589 goto full_bailout;
10077d4a 590
11ea859d 591 usb_autopm_put_interface(acm->control);
1da177e4 592
61a87adf
DK
593 INIT_LIST_HEAD(&acm->spare_read_urbs);
594 INIT_LIST_HEAD(&acm->spare_read_bufs);
595 INIT_LIST_HEAD(&acm->filled_read_bufs);
6e47e069
AC
596
597 for (i = 0; i < acm->rx_buflimit; i++)
61a87adf 598 list_add(&(acm->ru[i].list), &acm->spare_read_urbs);
6e47e069 599 for (i = 0; i < acm->rx_buflimit; i++)
61a87adf 600 list_add(&(acm->rb[i].list), &acm->spare_read_bufs);
61a87adf 601
ca79b7b4
ON
602 acm->throttle = 0;
603
61a87adf 604 tasklet_schedule(&acm->urb_task);
10077d4a 605 rv = tty_port_block_til_ready(&acm->port, tty, filp);
1da177e4 606done:
1365baf7 607 mutex_unlock(&acm->mutex);
74573ee7 608err_out:
94409cc1 609 mutex_unlock(&open_mutex);
1da177e4
LT
610 return rv;
611
612full_bailout:
1da177e4
LT
613 usb_kill_urb(acm->ctrlurb);
614bail_out:
1365baf7 615 usb_autopm_put_interface(acm->control);
10077d4a 616 acm->port.count--;
1365baf7 617 mutex_unlock(&acm->mutex);
94409cc1
ON
618early_bail:
619 mutex_unlock(&open_mutex);
10077d4a 620 tty_port_tty_set(&acm->port, NULL);
1da177e4
LT
621 return -EIO;
622}
623
83ef344a 624static void acm_tty_unregister(struct acm *acm)
625{
10077d4a 626 int i, nr;
61a87adf 627
86478944 628 nr = acm->rx_buflimit;
83ef344a 629 tty_unregister_device(acm_tty_driver, acm->minor);
630 usb_put_intf(acm->control);
631 acm_table[acm->minor] = NULL;
632 usb_free_urb(acm->ctrlurb);
e4cf3aa8
DE
633 for (i = 0; i < ACM_NW; i++)
634 usb_free_urb(acm->wb[i].urb);
86478944 635 for (i = 0; i < nr; i++)
61a87adf 636 usb_free_urb(acm->ru[i].urb);
c4cabd28 637 kfree(acm->country_codes);
83ef344a 638 kfree(acm);
639}
640
e5fbab51
DB
641static int acm_tty_chars_in_buffer(struct tty_struct *tty);
642
10077d4a
AC
643static void acm_port_down(struct acm *acm, int drain)
644{
645 int i, nr = acm->rx_buflimit;
646 mutex_lock(&open_mutex);
647 if (acm->dev) {
648 usb_autopm_get_interface(acm->control);
649 acm_set_control(acm, acm->ctrlout = 0);
650 /* try letting the last writes drain naturally */
651 if (drain) {
652 wait_event_interruptible_timeout(acm->drain_wait,
653 (ACM_NW == acm_wb_is_avail(acm)) || !acm->dev,
654 ACM_CLOSE_TIMEOUT * HZ);
655 }
656 usb_kill_urb(acm->ctrlurb);
657 for (i = 0; i < ACM_NW; i++)
658 usb_kill_urb(acm->wb[i].urb);
659 for (i = 0; i < nr; i++)
660 usb_kill_urb(acm->ru[i].urb);
661 acm->control->needs_remote_wakeup = 0;
662 usb_autopm_put_interface(acm->control);
663 }
664 mutex_unlock(&open_mutex);
665}
666
667static void acm_tty_hangup(struct tty_struct *tty)
668{
669 struct acm *acm = tty->driver_data;
670 tty_port_hangup(&acm->port);
671 acm_port_down(acm, 0);
672}
673
1da177e4
LT
674static void acm_tty_close(struct tty_struct *tty, struct file *filp)
675{
676 struct acm *acm = tty->driver_data;
677
10077d4a
AC
678 /* Perform the closing process and see if we need to do the hardware
679 shutdown */
680 if (tty_port_close_start(&acm->port, tty, filp) == 0)
1da177e4 681 return;
10077d4a
AC
682 acm_port_down(acm, 0);
683 tty_port_close_end(&acm->port, tty);
4186ecf8 684 mutex_lock(&open_mutex);
10077d4a
AC
685 tty_port_tty_set(&acm->port, NULL);
686 if (!acm->dev)
687 acm_tty_unregister(acm);
4186ecf8 688 mutex_unlock(&open_mutex);
1da177e4
LT
689}
690
6e47e069
AC
691static int acm_tty_write(struct tty_struct *tty,
692 const unsigned char *buf, int count)
1da177e4
LT
693{
694 struct acm *acm = tty->driver_data;
695 int stat;
884b600f
ON
696 unsigned long flags;
697 int wbn;
698 struct acm_wb *wb;
699
3dd2ae81 700 dbg("Entering acm_tty_write to write %d bytes,", count);
1da177e4
LT
701
702 if (!ACM_READY(acm))
703 return -EINVAL;
1da177e4
LT
704 if (!count)
705 return 0;
706
884b600f 707 spin_lock_irqsave(&acm->write_lock, flags);
6e47e069
AC
708 wbn = acm_wb_alloc(acm);
709 if (wbn < 0) {
884b600f 710 spin_unlock_irqrestore(&acm->write_lock, flags);
884b600f
ON
711 return 0;
712 }
713 wb = &acm->wb[wbn];
1da177e4 714
884b600f 715 count = (count > acm->writesize) ? acm->writesize : count;
1da177e4 716 dbg("Get %d bytes...", count);
884b600f
ON
717 memcpy(wb->buf, buf, count);
718 wb->len = count;
719 spin_unlock_irqrestore(&acm->write_lock, flags);
1da177e4 720
6e47e069
AC
721 stat = acm_write_start(acm, wbn);
722 if (stat < 0)
1da177e4 723 return stat;
1da177e4
LT
724 return count;
725}
726
727static int acm_tty_write_room(struct tty_struct *tty)
728{
729 struct acm *acm = tty->driver_data;
730 if (!ACM_READY(acm))
731 return -EINVAL;
884b600f
ON
732 /*
733 * Do not let the line discipline to know that we have a reserve,
734 * or it might get too enthusiastic.
735 */
934da463 736 return acm_wb_is_avail(acm) ? acm->writesize : 0;
1da177e4
LT
737}
738
739static int acm_tty_chars_in_buffer(struct tty_struct *tty)
740{
741 struct acm *acm = tty->driver_data;
742 if (!ACM_READY(acm))
743 return -EINVAL;
884b600f
ON
744 /*
745 * This is inaccurate (overcounts), but it works.
746 */
86478944 747 return (ACM_NW - acm_wb_is_avail(acm)) * acm->writesize;
1da177e4
LT
748}
749
750static void acm_tty_throttle(struct tty_struct *tty)
751{
752 struct acm *acm = tty->driver_data;
753 if (!ACM_READY(acm))
754 return;
755 spin_lock_bh(&acm->throttle_lock);
756 acm->throttle = 1;
757 spin_unlock_bh(&acm->throttle_lock);
758}
759
760static void acm_tty_unthrottle(struct tty_struct *tty)
761{
762 struct acm *acm = tty->driver_data;
763 if (!ACM_READY(acm))
764 return;
765 spin_lock_bh(&acm->throttle_lock);
766 acm->throttle = 0;
767 spin_unlock_bh(&acm->throttle_lock);
61a87adf 768 tasklet_schedule(&acm->urb_task);
1da177e4
LT
769}
770
9e98966c 771static int acm_tty_break_ctl(struct tty_struct *tty, int state)
1da177e4
LT
772{
773 struct acm *acm = tty->driver_data;
9e98966c 774 int retval;
1da177e4 775 if (!ACM_READY(acm))
9e98966c
AC
776 return -EINVAL;
777 retval = acm_send_break(acm, state ? 0xffff : 0);
778 if (retval < 0)
1da177e4 779 dbg("send break failed");
9e98966c 780 return retval;
1da177e4
LT
781}
782
783static int acm_tty_tiocmget(struct tty_struct *tty, struct file *file)
784{
785 struct acm *acm = tty->driver_data;
786
787 if (!ACM_READY(acm))
788 return -EINVAL;
789
790 return (acm->ctrlout & ACM_CTRL_DTR ? TIOCM_DTR : 0) |
791 (acm->ctrlout & ACM_CTRL_RTS ? TIOCM_RTS : 0) |
792 (acm->ctrlin & ACM_CTRL_DSR ? TIOCM_DSR : 0) |
793 (acm->ctrlin & ACM_CTRL_RI ? TIOCM_RI : 0) |
794 (acm->ctrlin & ACM_CTRL_DCD ? TIOCM_CD : 0) |
795 TIOCM_CTS;
796}
797
798static int acm_tty_tiocmset(struct tty_struct *tty, struct file *file,
799 unsigned int set, unsigned int clear)
800{
801 struct acm *acm = tty->driver_data;
802 unsigned int newctrl;
803
804 if (!ACM_READY(acm))
805 return -EINVAL;
806
807 newctrl = acm->ctrlout;
6e47e069
AC
808 set = (set & TIOCM_DTR ? ACM_CTRL_DTR : 0) |
809 (set & TIOCM_RTS ? ACM_CTRL_RTS : 0);
810 clear = (clear & TIOCM_DTR ? ACM_CTRL_DTR : 0) |
811 (clear & TIOCM_RTS ? ACM_CTRL_RTS : 0);
1da177e4
LT
812
813 newctrl = (newctrl & ~clear) | set;
814
815 if (acm->ctrlout == newctrl)
816 return 0;
817 return acm_set_control(acm, acm->ctrlout = newctrl);
818}
819
6e47e069
AC
820static int acm_tty_ioctl(struct tty_struct *tty, struct file *file,
821 unsigned int cmd, unsigned long arg)
1da177e4
LT
822{
823 struct acm *acm = tty->driver_data;
824
825 if (!ACM_READY(acm))
826 return -EINVAL;
827
828 return -ENOIOCTLCMD;
829}
830
4c4c9432 831static const __u32 acm_tty_speed[] = {
1da177e4
LT
832 0, 50, 75, 110, 134, 150, 200, 300, 600,
833 1200, 1800, 2400, 4800, 9600, 19200, 38400,
834 57600, 115200, 230400, 460800, 500000, 576000,
835 921600, 1000000, 1152000, 1500000, 2000000,
836 2500000, 3000000, 3500000, 4000000
837};
838
4c4c9432 839static const __u8 acm_tty_size[] = {
1da177e4
LT
840 5, 6, 7, 8
841};
842
6e47e069
AC
843static void acm_tty_set_termios(struct tty_struct *tty,
844 struct ktermios *termios_old)
1da177e4
LT
845{
846 struct acm *acm = tty->driver_data;
606d099c 847 struct ktermios *termios = tty->termios;
1da177e4
LT
848 struct usb_cdc_line_coding newline;
849 int newctrl = acm->ctrlout;
850
851 if (!ACM_READY(acm))
852 return;
853
6e47e069
AC
854 /* FIXME: Needs to support the tty_baud interface */
855 /* FIXME: Broken on sparc */
1da177e4
LT
856 newline.dwDTERate = cpu_to_le32p(acm_tty_speed +
857 (termios->c_cflag & CBAUD & ~CBAUDEX) + (termios->c_cflag & CBAUDEX ? 15 : 0));
858 newline.bCharFormat = termios->c_cflag & CSTOPB ? 2 : 0;
859 newline.bParityType = termios->c_cflag & PARENB ?
6e47e069
AC
860 (termios->c_cflag & PARODD ? 1 : 2) +
861 (termios->c_cflag & CMSPAR ? 2 : 0) : 0;
1da177e4 862 newline.bDataBits = acm_tty_size[(termios->c_cflag & CSIZE) >> 4];
6e47e069 863 /* FIXME: Needs to clear unsupported bits in the termios */
1da177e4
LT
864 acm->clocal = ((termios->c_cflag & CLOCAL) != 0);
865
866 if (!newline.dwDTERate) {
867 newline.dwDTERate = acm->line.dwDTERate;
868 newctrl &= ~ACM_CTRL_DTR;
6e47e069
AC
869 } else
870 newctrl |= ACM_CTRL_DTR;
1da177e4
LT
871
872 if (newctrl != acm->ctrlout)
873 acm_set_control(acm, acm->ctrlout = newctrl);
874
875 if (memcmp(&acm->line, &newline, sizeof newline)) {
876 memcpy(&acm->line, &newline, sizeof newline);
877 dbg("set line: %d %d %d %d", le32_to_cpu(newline.dwDTERate),
878 newline.bCharFormat, newline.bParityType,
879 newline.bDataBits);
880 acm_set_line(acm, &acm->line);
881 }
882}
883
884/*
885 * USB probe and disconnect routines.
886 */
887
830f4021 888/* Little helpers: write/read buffers free */
884b600f
ON
889static void acm_write_buffers_free(struct acm *acm)
890{
891 int i;
892 struct acm_wb *wb;
a496c64f 893 struct usb_device *usb_dev = interface_to_usbdev(acm->control);
884b600f 894
6e47e069 895 for (wb = &acm->wb[0], i = 0; i < ACM_NW; i++, wb++)
a496c64f 896 usb_buffer_free(usb_dev, acm->writesize, wb->buf, wb->dmah);
884b600f
ON
897}
898
830f4021
ON
899static void acm_read_buffers_free(struct acm *acm)
900{
901 struct usb_device *usb_dev = interface_to_usbdev(acm->control);
902 int i, n = acm->rx_buflimit;
903
904 for (i = 0; i < n; i++)
6e47e069
AC
905 usb_buffer_free(usb_dev, acm->readsize,
906 acm->rb[i].base, acm->rb[i].dma);
830f4021
ON
907}
908
884b600f
ON
909/* Little helper: write buffers allocate */
910static int acm_write_buffers_alloc(struct acm *acm)
911{
912 int i;
913 struct acm_wb *wb;
914
86478944 915 for (wb = &acm->wb[0], i = 0; i < ACM_NW; i++, wb++) {
884b600f
ON
916 wb->buf = usb_buffer_alloc(acm->dev, acm->writesize, GFP_KERNEL,
917 &wb->dmah);
918 if (!wb->buf) {
919 while (i != 0) {
920 --i;
921 --wb;
922 usb_buffer_free(acm->dev, acm->writesize,
923 wb->buf, wb->dmah);
924 }
925 return -ENOMEM;
926 }
927 }
928 return 0;
929}
930
10077d4a
AC
931static int acm_probe(struct usb_interface *intf,
932 const struct usb_device_id *id)
1da177e4
LT
933{
934 struct usb_cdc_union_desc *union_header = NULL;
c4cabd28 935 struct usb_cdc_country_functional_desc *cfd = NULL;
c6dbf554 936 unsigned char *buffer = intf->altsetting->extra;
1da177e4
LT
937 int buflen = intf->altsetting->extralen;
938 struct usb_interface *control_interface;
939 struct usb_interface *data_interface;
940 struct usb_endpoint_descriptor *epctrl;
941 struct usb_endpoint_descriptor *epread;
942 struct usb_endpoint_descriptor *epwrite;
943 struct usb_device *usb_dev = interface_to_usbdev(intf);
944 struct acm *acm;
945 int minor;
6e47e069 946 int ctrlsize, readsize;
1da177e4
LT
947 u8 *buf;
948 u8 ac_management_function = 0;
949 u8 call_management_function = 0;
950 int call_interface_num = -1;
951 int data_interface_num;
952 unsigned long quirks;
86478944 953 int num_rx_buf;
61a87adf 954 int i;
1da177e4 955
86478944 956 /* normal quirks */
1da177e4 957 quirks = (unsigned long)id->driver_info;
86478944
ON
958 num_rx_buf = (quirks == SINGLE_RX_URB) ? 1 : ACM_NR;
959
960 /* handle quirks deadly to normal probing*/
1da177e4
LT
961 if (quirks == NO_UNION_NORMAL) {
962 data_interface = usb_ifnum_to_if(usb_dev, 1);
963 control_interface = usb_ifnum_to_if(usb_dev, 0);
964 goto skip_normal_probe;
965 }
6e47e069 966
1da177e4
LT
967 /* normal probing*/
968 if (!buffer) {
9908a32e 969 dev_err(&intf->dev, "Weird descriptor references\n");
1da177e4
LT
970 return -EINVAL;
971 }
972
973 if (!buflen) {
6e47e069
AC
974 if (intf->cur_altsetting->endpoint->extralen &&
975 intf->cur_altsetting->endpoint->extra) {
976 dev_dbg(&intf->dev,
977 "Seeking extra descriptors on endpoint\n");
1da177e4
LT
978 buflen = intf->cur_altsetting->endpoint->extralen;
979 buffer = intf->cur_altsetting->endpoint->extra;
980 } else {
9908a32e
GKH
981 dev_err(&intf->dev,
982 "Zero length descriptor references\n");
1da177e4
LT
983 return -EINVAL;
984 }
985 }
986
987 while (buflen > 0) {
6e47e069 988 if (buffer[1] != USB_DT_CS_INTERFACE) {
9908a32e 989 dev_err(&intf->dev, "skipping garbage\n");
1da177e4
LT
990 goto next_desc;
991 }
992
6e47e069
AC
993 switch (buffer[2]) {
994 case USB_CDC_UNION_TYPE: /* we've found it */
995 if (union_header) {
996 dev_err(&intf->dev, "More than one "
997 "union descriptor, skipping ...\n");
998 goto next_desc;
1da177e4 999 }
6e47e069
AC
1000 union_header = (struct usb_cdc_union_desc *)buffer;
1001 break;
1002 case USB_CDC_COUNTRY_TYPE: /* export through sysfs*/
1003 cfd = (struct usb_cdc_country_functional_desc *)buffer;
1004 break;
1005 case USB_CDC_HEADER_TYPE: /* maybe check version */
1006 break; /* for now we ignore it */
1007 case USB_CDC_ACM_TYPE:
1008 ac_management_function = buffer[3];
1009 break;
1010 case USB_CDC_CALL_MANAGEMENT_TYPE:
1011 call_management_function = buffer[3];
1012 call_interface_num = buffer[4];
1013 if ((call_management_function & 3) != 3)
1014 dev_err(&intf->dev, "This device cannot do calls on its own. It is not a modem.\n");
1015 break;
1016 default:
1017 /* there are LOTS more CDC descriptors that
1018 * could legitimately be found here.
1019 */
1020 dev_dbg(&intf->dev, "Ignoring descriptor: "
1021 "type %02x, length %d\n",
1022 buffer[2], buffer[0]);
1023 break;
1024 }
1da177e4
LT
1025next_desc:
1026 buflen -= buffer[0];
1027 buffer += buffer[0];
1028 }
1029
1030 if (!union_header) {
1031 if (call_interface_num > 0) {
6e47e069 1032 dev_dbg(&intf->dev, "No union descriptor, using call management descriptor\n");
1da177e4
LT
1033 data_interface = usb_ifnum_to_if(usb_dev, (data_interface_num = call_interface_num));
1034 control_interface = intf;
1035 } else {
6e47e069
AC
1036 dev_dbg(&intf->dev,
1037 "No union descriptor, giving up\n");
1da177e4
LT
1038 return -ENODEV;
1039 }
1040 } else {
1041 control_interface = usb_ifnum_to_if(usb_dev, union_header->bMasterInterface0);
1042 data_interface = usb_ifnum_to_if(usb_dev, (data_interface_num = union_header->bSlaveInterface0));
1043 if (!control_interface || !data_interface) {
6e47e069 1044 dev_dbg(&intf->dev, "no interfaces\n");
1da177e4
LT
1045 return -ENODEV;
1046 }
1047 }
6e47e069 1048
1da177e4 1049 if (data_interface_num != call_interface_num)
6e47e069 1050 dev_dbg(&intf->dev, "Separate call control interface. That is not fully supported.\n");
1da177e4
LT
1051
1052skip_normal_probe:
1053
1054 /*workaround for switched interfaces */
6e47e069
AC
1055 if (data_interface->cur_altsetting->desc.bInterfaceClass
1056 != CDC_DATA_INTERFACE_TYPE) {
1057 if (control_interface->cur_altsetting->desc.bInterfaceClass
1058 == CDC_DATA_INTERFACE_TYPE) {
1da177e4 1059 struct usb_interface *t;
6e47e069
AC
1060 dev_dbg(&intf->dev,
1061 "Your device has switched interfaces.\n");
1da177e4
LT
1062 t = control_interface;
1063 control_interface = data_interface;
1064 data_interface = t;
1065 } else {
1066 return -EINVAL;
1067 }
1068 }
74da5d68
AS
1069
1070 /* Accept probe requests only for the control interface */
1071 if (intf != control_interface)
1072 return -ENODEV;
6e47e069 1073
1da177e4 1074 if (usb_interface_claimed(data_interface)) { /* valid in this context */
6e47e069 1075 dev_dbg(&intf->dev, "The data interface isn't available\n");
1da177e4
LT
1076 return -EBUSY;
1077 }
1078
1079
1080 if (data_interface->cur_altsetting->desc.bNumEndpoints < 2)
1081 return -EINVAL;
1082
1083 epctrl = &control_interface->cur_altsetting->endpoint[0].desc;
1084 epread = &data_interface->cur_altsetting->endpoint[0].desc;
1085 epwrite = &data_interface->cur_altsetting->endpoint[1].desc;
1086
1087
1088 /* workaround for switched endpoints */
45aea704 1089 if (!usb_endpoint_dir_in(epread)) {
1da177e4
LT
1090 /* descriptors are swapped */
1091 struct usb_endpoint_descriptor *t;
6e47e069
AC
1092 dev_dbg(&intf->dev,
1093 "The data interface has switched endpoints\n");
1da177e4
LT
1094 t = epread;
1095 epread = epwrite;
1096 epwrite = t;
1097 }
1098 dbg("interfaces are valid");
1099 for (minor = 0; minor < ACM_TTY_MINORS && acm_table[minor]; minor++);
1100
1101 if (minor == ACM_TTY_MINORS) {
9908a32e 1102 dev_err(&intf->dev, "no more free acm devices\n");
1da177e4
LT
1103 return -ENODEV;
1104 }
1105
6e47e069
AC
1106 acm = kzalloc(sizeof(struct acm), GFP_KERNEL);
1107 if (acm == NULL) {
898eb71c 1108 dev_dbg(&intf->dev, "out of memory (acm kzalloc)\n");
1da177e4
LT
1109 goto alloc_fail;
1110 }
1da177e4
LT
1111
1112 ctrlsize = le16_to_cpu(epctrl->wMaxPacketSize);
6e47e069
AC
1113 readsize = le16_to_cpu(epread->wMaxPacketSize) *
1114 (quirks == SINGLE_RX_URB ? 1 : 2);
e4cf3aa8 1115 acm->writesize = le16_to_cpu(epwrite->wMaxPacketSize) * 20;
1da177e4
LT
1116 acm->control = control_interface;
1117 acm->data = data_interface;
1118 acm->minor = minor;
1119 acm->dev = usb_dev;
1120 acm->ctrl_caps = ac_management_function;
1121 acm->ctrlsize = ctrlsize;
1122 acm->readsize = readsize;
86478944 1123 acm->rx_buflimit = num_rx_buf;
61a87adf
DK
1124 acm->urb_task.func = acm_rx_tasklet;
1125 acm->urb_task.data = (unsigned long) acm;
c4028958 1126 INIT_WORK(&acm->work, acm_softint);
11ea859d 1127 INIT_WORK(&acm->waker, acm_waker);
e5fbab51 1128 init_waitqueue_head(&acm->drain_wait);
1da177e4 1129 spin_lock_init(&acm->throttle_lock);
884b600f 1130 spin_lock_init(&acm->write_lock);
61a87adf 1131 spin_lock_init(&acm->read_lock);
1365baf7 1132 mutex_init(&acm->mutex);
61a87adf 1133 acm->rx_endpoint = usb_rcvbulkpipe(usb_dev, epread->bEndpointAddress);
739e0285
AC
1134 tty_port_init(&acm->port);
1135 acm->port.ops = &acm_port_ops;
1da177e4
LT
1136
1137 buf = usb_buffer_alloc(usb_dev, ctrlsize, GFP_KERNEL, &acm->ctrl_dma);
1138 if (!buf) {
898eb71c 1139 dev_dbg(&intf->dev, "out of memory (ctrl buffer alloc)\n");
1da177e4
LT
1140 goto alloc_fail2;
1141 }
1142 acm->ctrl_buffer = buf;
1143
884b600f 1144 if (acm_write_buffers_alloc(acm) < 0) {
898eb71c 1145 dev_dbg(&intf->dev, "out of memory (write buffer alloc)\n");
1da177e4
LT
1146 goto alloc_fail4;
1147 }
1da177e4
LT
1148
1149 acm->ctrlurb = usb_alloc_urb(0, GFP_KERNEL);
1150 if (!acm->ctrlurb) {
898eb71c 1151 dev_dbg(&intf->dev, "out of memory (ctrlurb kmalloc)\n");
1da177e4
LT
1152 goto alloc_fail5;
1153 }
86478944 1154 for (i = 0; i < num_rx_buf; i++) {
61a87adf
DK
1155 struct acm_ru *rcv = &(acm->ru[i]);
1156
6e47e069
AC
1157 rcv->urb = usb_alloc_urb(0, GFP_KERNEL);
1158 if (rcv->urb == NULL) {
1159 dev_dbg(&intf->dev,
1160 "out of memory (read urbs usb_alloc_urb)\n");
61a87adf
DK
1161 goto alloc_fail7;
1162 }
1163
1164 rcv->urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
1165 rcv->instance = acm;
1166 }
86478944 1167 for (i = 0; i < num_rx_buf; i++) {
672c4e18 1168 struct acm_rb *rb = &(acm->rb[i]);
61a87adf 1169
672c4e18
DB
1170 rb->base = usb_buffer_alloc(acm->dev, readsize,
1171 GFP_KERNEL, &rb->dma);
1172 if (!rb->base) {
6e47e069
AC
1173 dev_dbg(&intf->dev,
1174 "out of memory (read bufs usb_buffer_alloc)\n");
61a87adf
DK
1175 goto alloc_fail7;
1176 }
1da177e4 1177 }
6e47e069 1178 for (i = 0; i < ACM_NW; i++) {
e4cf3aa8
DE
1179 struct acm_wb *snd = &(acm->wb[i]);
1180
6e47e069
AC
1181 snd->urb = usb_alloc_urb(0, GFP_KERNEL);
1182 if (snd->urb == NULL) {
1183 dev_dbg(&intf->dev,
1184 "out of memory (write urbs usb_alloc_urb)");
e4cf3aa8
DE
1185 goto alloc_fail7;
1186 }
1187
6e47e069
AC
1188 usb_fill_bulk_urb(snd->urb, usb_dev,
1189 usb_sndbulkpipe(usb_dev, epwrite->bEndpointAddress),
1190 NULL, acm->writesize, acm_write_bulk, snd);
e4cf3aa8
DE
1191 snd->urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
1192 snd->instance = acm;
1da177e4
LT
1193 }
1194
6e47e069 1195 usb_set_intfdata(intf, acm);
c4cabd28
ON
1196
1197 i = device_create_file(&intf->dev, &dev_attr_bmCapabilities);
1198 if (i < 0)
1199 goto alloc_fail8;
1200
1201 if (cfd) { /* export the country data */
1202 acm->country_codes = kmalloc(cfd->bLength - 4, GFP_KERNEL);
1203 if (!acm->country_codes)
1204 goto skip_countries;
1205 acm->country_code_size = cfd->bLength - 4;
6e47e069
AC
1206 memcpy(acm->country_codes, (u8 *)&cfd->wCountyCode0,
1207 cfd->bLength - 4);
c4cabd28
ON
1208 acm->country_rel_date = cfd->iCountryCodeRelDate;
1209
1210 i = device_create_file(&intf->dev, &dev_attr_wCountryCodes);
1211 if (i < 0) {
1212 kfree(acm->country_codes);
1213 goto skip_countries;
1214 }
1215
6e47e069
AC
1216 i = device_create_file(&intf->dev,
1217 &dev_attr_iCountryCodeRelDate);
c4cabd28
ON
1218 if (i < 0) {
1219 kfree(acm->country_codes);
1220 goto skip_countries;
1221 }
1222 }
1223
1224skip_countries:
6e47e069
AC
1225 usb_fill_int_urb(acm->ctrlurb, usb_dev,
1226 usb_rcvintpipe(usb_dev, epctrl->bEndpointAddress),
1227 acm->ctrl_buffer, ctrlsize, acm_ctrl_irq, acm,
1228 epctrl->bInterval);
1da177e4
LT
1229 acm->ctrlurb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
1230 acm->ctrlurb->transfer_dma = acm->ctrl_dma;
1231
1da177e4
LT
1232 dev_info(&intf->dev, "ttyACM%d: USB ACM device\n", minor);
1233
1234 acm_set_control(acm, acm->ctrlout);
1235
1236 acm->line.dwDTERate = cpu_to_le32(9600);
1237 acm->line.bDataBits = 8;
1238 acm_set_line(acm, &acm->line);
1239
1240 usb_driver_claim_interface(&acm_driver, data_interface, acm);
672c4e18 1241 usb_set_intfdata(data_interface, acm);
1da177e4 1242
83ef344a 1243 usb_get_intf(control_interface);
1244 tty_register_device(acm_tty_driver, minor, &control_interface->dev);
1da177e4
LT
1245
1246 acm_table[minor] = acm;
1da177e4 1247
c4cabd28
ON
1248 return 0;
1249alloc_fail8:
e4cf3aa8
DE
1250 for (i = 0; i < ACM_NW; i++)
1251 usb_free_urb(acm->wb[i].urb);
1da177e4 1252alloc_fail7:
830f4021 1253 acm_read_buffers_free(acm);
86478944 1254 for (i = 0; i < num_rx_buf; i++)
61a87adf 1255 usb_free_urb(acm->ru[i].urb);
1da177e4
LT
1256 usb_free_urb(acm->ctrlurb);
1257alloc_fail5:
884b600f 1258 acm_write_buffers_free(acm);
1da177e4 1259alloc_fail4:
1da177e4
LT
1260 usb_buffer_free(usb_dev, ctrlsize, acm->ctrl_buffer, acm->ctrl_dma);
1261alloc_fail2:
1262 kfree(acm);
1263alloc_fail:
1264 return -ENOMEM;
1265}
1266
1365baf7
ON
1267static void stop_data_traffic(struct acm *acm)
1268{
1269 int i;
11ea859d 1270 dbg("Entering stop_data_traffic");
1365baf7
ON
1271
1272 tasklet_disable(&acm->urb_task);
1273
1274 usb_kill_urb(acm->ctrlurb);
6e47e069 1275 for (i = 0; i < ACM_NW; i++)
e4cf3aa8 1276 usb_kill_urb(acm->wb[i].urb);
1365baf7
ON
1277 for (i = 0; i < acm->rx_buflimit; i++)
1278 usb_kill_urb(acm->ru[i].urb);
1279
1365baf7
ON
1280 tasklet_enable(&acm->urb_task);
1281
1282 cancel_work_sync(&acm->work);
11ea859d 1283 cancel_work_sync(&acm->waker);
1365baf7
ON
1284}
1285
1da177e4
LT
1286static void acm_disconnect(struct usb_interface *intf)
1287{
c4cabd28 1288 struct acm *acm = usb_get_intfdata(intf);
1da177e4 1289 struct usb_device *usb_dev = interface_to_usbdev(intf);
10077d4a 1290 struct tty_struct *tty;
1da177e4 1291
672c4e18
DB
1292 /* sibling interface is already cleaning up */
1293 if (!acm)
86067eea 1294 return;
672c4e18
DB
1295
1296 mutex_lock(&open_mutex);
6e47e069 1297 if (acm->country_codes) {
74da5d68
AS
1298 device_remove_file(&acm->control->dev,
1299 &dev_attr_wCountryCodes);
1300 device_remove_file(&acm->control->dev,
1301 &dev_attr_iCountryCodeRelDate);
c4cabd28 1302 }
74da5d68 1303 device_remove_file(&acm->control->dev, &dev_attr_bmCapabilities);
1da177e4 1304 acm->dev = NULL;
86067eea
ON
1305 usb_set_intfdata(acm->control, NULL);
1306 usb_set_intfdata(acm->data, NULL);
1da177e4 1307
1365baf7 1308 stop_data_traffic(acm);
1da177e4 1309
884b600f 1310 acm_write_buffers_free(acm);
6e47e069
AC
1311 usb_buffer_free(usb_dev, acm->ctrlsize, acm->ctrl_buffer,
1312 acm->ctrl_dma);
830f4021 1313 acm_read_buffers_free(acm);
1da177e4 1314
830f4021
ON
1315 usb_driver_release_interface(&acm_driver, intf == acm->control ?
1316 acm->data : acm->control);
1da177e4 1317
10077d4a 1318 if (acm->port.count == 0) {
83ef344a 1319 acm_tty_unregister(acm);
4186ecf8 1320 mutex_unlock(&open_mutex);
1da177e4
LT
1321 return;
1322 }
1323
4186ecf8 1324 mutex_unlock(&open_mutex);
10077d4a
AC
1325 tty = tty_port_tty_get(&acm->port);
1326 if (tty) {
1327 tty_hangup(tty);
1328 tty_kref_put(tty);
1329 }
1da177e4
LT
1330}
1331
35758589 1332#ifdef CONFIG_PM
1365baf7
ON
1333static int acm_suspend(struct usb_interface *intf, pm_message_t message)
1334{
1335 struct acm *acm = usb_get_intfdata(intf);
11ea859d
ON
1336 int cnt;
1337
65bfd296 1338 if (message.event & PM_EVENT_AUTO) {
11ea859d
ON
1339 int b;
1340
1341 spin_lock_irq(&acm->read_lock);
1342 spin_lock(&acm->write_lock);
1343 b = acm->processing + acm->transmitting;
1344 spin_unlock(&acm->write_lock);
1345 spin_unlock_irq(&acm->read_lock);
1346 if (b)
1347 return -EBUSY;
1348 }
1349
1350 spin_lock_irq(&acm->read_lock);
1351 spin_lock(&acm->write_lock);
1352 cnt = acm->susp_count++;
1353 spin_unlock(&acm->write_lock);
1354 spin_unlock_irq(&acm->read_lock);
1365baf7 1355
11ea859d 1356 if (cnt)
1365baf7
ON
1357 return 0;
1358 /*
1359 we treat opened interfaces differently,
1360 we must guard against open
1361 */
1362 mutex_lock(&acm->mutex);
1363
10077d4a 1364 if (acm->port.count)
1365baf7
ON
1365 stop_data_traffic(acm);
1366
1367 mutex_unlock(&acm->mutex);
1368 return 0;
1369}
1370
1371static int acm_resume(struct usb_interface *intf)
1372{
1373 struct acm *acm = usb_get_intfdata(intf);
1374 int rv = 0;
11ea859d 1375 int cnt;
1365baf7 1376
11ea859d
ON
1377 spin_lock_irq(&acm->read_lock);
1378 acm->susp_count -= 1;
1379 cnt = acm->susp_count;
1380 spin_unlock_irq(&acm->read_lock);
1381
1382 if (cnt)
1365baf7
ON
1383 return 0;
1384
1385 mutex_lock(&acm->mutex);
10077d4a 1386 if (acm->port.count) {
1365baf7
ON
1387 rv = usb_submit_urb(acm->ctrlurb, GFP_NOIO);
1388 if (rv < 0)
11ea859d 1389 goto err_out;
1365baf7
ON
1390
1391 tasklet_schedule(&acm->urb_task);
1392 }
1393
1394err_out:
1395 mutex_unlock(&acm->mutex);
1396 return rv;
1397}
35758589
ON
1398
1399#endif /* CONFIG_PM */
1da177e4
LT
1400/*
1401 * USB driver structure.
1402 */
1403
1404static struct usb_device_id acm_ids[] = {
1405 /* quirky and broken devices */
1406 { USB_DEVICE(0x0870, 0x0001), /* Metricom GS Modem */
1407 .driver_info = NO_UNION_NORMAL, /* has no union descriptor */
1408 },
b0e2a705
AA
1409 { USB_DEVICE(0x0e8d, 0x0003), /* FIREFLY, MediaTek Inc; andrey.arapov@gmail.com */
1410 .driver_info = NO_UNION_NORMAL, /* has no union descriptor */
1411 },
0f9c7b4a
AL
1412 { USB_DEVICE(0x0e8d, 0x3329), /* MediaTek Inc GPS */
1413 .driver_info = NO_UNION_NORMAL, /* has no union descriptor */
1414 },
8753e65e
MO
1415 { USB_DEVICE(0x0482, 0x0203), /* KYOCERA AH-K3001V */
1416 .driver_info = NO_UNION_NORMAL, /* has no union descriptor */
1417 },
91a9c921
CM
1418 { USB_DEVICE(0x079b, 0x000f), /* BT On-Air USB MODEM */
1419 .driver_info = NO_UNION_NORMAL, /* has no union descriptor */
1420 },
7abcf20b
AC
1421 { USB_DEVICE(0x0ace, 0x1602), /* ZyDAS 56K USB MODEM */
1422 .driver_info = SINGLE_RX_URB,
1423 },
86478944
ON
1424 { USB_DEVICE(0x0ace, 0x1608), /* ZyDAS 56K USB MODEM */
1425 .driver_info = SINGLE_RX_URB, /* firmware bug */
1426 },
3dd2ae81
ON
1427 { USB_DEVICE(0x0ace, 0x1611), /* ZyDAS 56K USB MODEM - new version */
1428 .driver_info = SINGLE_RX_URB, /* firmware bug */
1429 },
9be8456c
ON
1430 { USB_DEVICE(0x22b8, 0x7000), /* Motorola Q Phone */
1431 .driver_info = NO_UNION_NORMAL, /* has no union descriptor */
1432 },
6149ed5e
IM
1433 { USB_DEVICE(0x0803, 0x3095), /* Zoom Telephonics Model 3095F USB MODEM */
1434 .driver_info = NO_UNION_NORMAL, /* has no union descriptor */
1435 },
c8fd2c37
ES
1436 { USB_DEVICE(0x0572, 0x1321), /* Conexant USB MODEM CX93010 */
1437 .driver_info = NO_UNION_NORMAL, /* has no union descriptor */
1438 },
c89c60e9
AC
1439 { USB_DEVICE(0x0572, 0x1324), /* Conexant USB MODEM RD02-D400 */
1440 .driver_info = NO_UNION_NORMAL, /* has no union descriptor */
1441 },
cab98a0a
XK
1442 { USB_DEVICE(0x0572, 0x1328), /* Shiro / Aztech USB MODEM UM-3100 */
1443 .driver_info = NO_UNION_NORMAL, /* has no union descriptor */
1444 },
155df65a
DT
1445 { USB_DEVICE(0x22b8, 0x6425), /* Motorola MOTOMAGX phones */
1446 },
c332b4e1
AR
1447 { USB_DEVICE(0x0572, 0x1329), /* Hummingbird huc56s (Conexant) */
1448 .driver_info = NO_UNION_NORMAL, /* union descriptor misplaced on
1449 data interface instead of
1450 communications interface.
1451 Maybe we should define a new
1452 quirk for this. */
1453 },
9be8456c 1454
1da177e4
LT
1455 /* control interfaces with various AT-command sets */
1456 { USB_INTERFACE_INFO(USB_CLASS_COMM, USB_CDC_SUBCLASS_ACM,
1457 USB_CDC_ACM_PROTO_AT_V25TER) },
1458 { USB_INTERFACE_INFO(USB_CLASS_COMM, USB_CDC_SUBCLASS_ACM,
1459 USB_CDC_ACM_PROTO_AT_PCCA101) },
1460 { USB_INTERFACE_INFO(USB_CLASS_COMM, USB_CDC_SUBCLASS_ACM,
1461 USB_CDC_ACM_PROTO_AT_PCCA101_WAKE) },
1462 { USB_INTERFACE_INFO(USB_CLASS_COMM, USB_CDC_SUBCLASS_ACM,
1463 USB_CDC_ACM_PROTO_AT_GSM) },
1464 { USB_INTERFACE_INFO(USB_CLASS_COMM, USB_CDC_SUBCLASS_ACM,
6e47e069 1465 USB_CDC_ACM_PROTO_AT_3G) },
1da177e4
LT
1466 { USB_INTERFACE_INFO(USB_CLASS_COMM, USB_CDC_SUBCLASS_ACM,
1467 USB_CDC_ACM_PROTO_AT_CDMA) },
1468
1469 /* NOTE: COMM/ACM/0xff is likely MSFT RNDIS ... NOT a modem!! */
1470 { }
1471};
1472
6e47e069 1473MODULE_DEVICE_TABLE(usb, acm_ids);
1da177e4
LT
1474
1475static struct usb_driver acm_driver = {
1da177e4
LT
1476 .name = "cdc_acm",
1477 .probe = acm_probe,
1478 .disconnect = acm_disconnect,
35758589 1479#ifdef CONFIG_PM
1365baf7
ON
1480 .suspend = acm_suspend,
1481 .resume = acm_resume,
35758589 1482#endif
1da177e4 1483 .id_table = acm_ids,
35758589 1484#ifdef CONFIG_PM
1365baf7 1485 .supports_autosuspend = 1,
35758589 1486#endif
1da177e4
LT
1487};
1488
1489/*
1490 * TTY driver structures.
1491 */
1492
b68e31d0 1493static const struct tty_operations acm_ops = {
1da177e4
LT
1494 .open = acm_tty_open,
1495 .close = acm_tty_close,
10077d4a 1496 .hangup = acm_tty_hangup,
1da177e4
LT
1497 .write = acm_tty_write,
1498 .write_room = acm_tty_write_room,
1499 .ioctl = acm_tty_ioctl,
1500 .throttle = acm_tty_throttle,
1501 .unthrottle = acm_tty_unthrottle,
1502 .chars_in_buffer = acm_tty_chars_in_buffer,
1503 .break_ctl = acm_tty_break_ctl,
1504 .set_termios = acm_tty_set_termios,
1505 .tiocmget = acm_tty_tiocmget,
1506 .tiocmset = acm_tty_tiocmset,
1507};
1508
1509/*
1510 * Init / exit.
1511 */
1512
1513static int __init acm_init(void)
1514{
1515 int retval;
1516 acm_tty_driver = alloc_tty_driver(ACM_TTY_MINORS);
1517 if (!acm_tty_driver)
1518 return -ENOMEM;
1519 acm_tty_driver->owner = THIS_MODULE,
1520 acm_tty_driver->driver_name = "acm",
1521 acm_tty_driver->name = "ttyACM",
1da177e4
LT
1522 acm_tty_driver->major = ACM_TTY_MAJOR,
1523 acm_tty_driver->minor_start = 0,
1524 acm_tty_driver->type = TTY_DRIVER_TYPE_SERIAL,
1525 acm_tty_driver->subtype = SERIAL_TYPE_NORMAL,
331b8319 1526 acm_tty_driver->flags = TTY_DRIVER_REAL_RAW | TTY_DRIVER_DYNAMIC_DEV;
1da177e4 1527 acm_tty_driver->init_termios = tty_std_termios;
6e47e069
AC
1528 acm_tty_driver->init_termios.c_cflag = B9600 | CS8 | CREAD |
1529 HUPCL | CLOCAL;
1da177e4
LT
1530 tty_set_operations(acm_tty_driver, &acm_ops);
1531
1532 retval = tty_register_driver(acm_tty_driver);
1533 if (retval) {
1534 put_tty_driver(acm_tty_driver);
1535 return retval;
1536 }
1537
1538 retval = usb_register(&acm_driver);
1539 if (retval) {
1540 tty_unregister_driver(acm_tty_driver);
1541 put_tty_driver(acm_tty_driver);
1542 return retval;
1543 }
1544
5909f6ea
GKH
1545 printk(KERN_INFO KBUILD_MODNAME ": " DRIVER_VERSION ":"
1546 DRIVER_DESC "\n");
1da177e4
LT
1547
1548 return 0;
1549}
1550
1551static void __exit acm_exit(void)
1552{
1553 usb_deregister(&acm_driver);
1554 tty_unregister_driver(acm_tty_driver);
1555 put_tty_driver(acm_tty_driver);
1556}
1557
1558module_init(acm_init);
1559module_exit(acm_exit);
1560
6e47e069
AC
1561MODULE_AUTHOR(DRIVER_AUTHOR);
1562MODULE_DESCRIPTION(DRIVER_DESC);
1da177e4 1563MODULE_LICENSE("GPL");
e766aeb8 1564MODULE_ALIAS_CHARDEV_MAJOR(ACM_TTY_MAJOR);