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