linux/drivers/usb/serial/generic.c
<<
>>
Prefs
   1/*
   2 * USB Serial Converter Generic functions
   3 *
   4 * Copyright (C) 2010 - 2013 Johan Hovold (jhovold@gmail.com)
   5 * Copyright (C) 1999 - 2002 Greg Kroah-Hartman (greg@kroah.com)
   6 *
   7 *      This program is free software; you can redistribute it and/or
   8 *      modify it under the terms of the GNU General Public License version
   9 *      2 as published by the Free Software Foundation.
  10 */
  11
  12#include <linux/kernel.h>
  13#include <linux/errno.h>
  14#include <linux/slab.h>
  15#include <linux/sysrq.h>
  16#include <linux/tty.h>
  17#include <linux/tty_flip.h>
  18#include <linux/module.h>
  19#include <linux/moduleparam.h>
  20#include <linux/usb.h>
  21#include <linux/usb/serial.h>
  22#include <linux/uaccess.h>
  23#include <linux/kfifo.h>
  24#include <linux/serial.h>
  25
  26#ifdef CONFIG_USB_SERIAL_GENERIC
  27
  28static __u16 vendor  = 0x05f9;
  29static __u16 product = 0xffff;
  30
  31module_param(vendor, ushort, 0);
  32MODULE_PARM_DESC(vendor, "User specified USB idVendor");
  33
  34module_param(product, ushort, 0);
  35MODULE_PARM_DESC(product, "User specified USB idProduct");
  36
  37static struct usb_device_id generic_device_ids[2]; /* Initially all zeroes. */
  38
  39struct usb_serial_driver usb_serial_generic_device = {
  40        .driver = {
  41                .owner =        THIS_MODULE,
  42                .name =         "generic",
  43        },
  44        .id_table =             generic_device_ids,
  45        .num_ports =            1,
  46        .throttle =             usb_serial_generic_throttle,
  47        .unthrottle =           usb_serial_generic_unthrottle,
  48        .resume =               usb_serial_generic_resume,
  49};
  50
  51static struct usb_serial_driver * const serial_drivers[] = {
  52        &usb_serial_generic_device, NULL
  53};
  54
  55#endif
  56
  57int usb_serial_generic_register(void)
  58{
  59        int retval = 0;
  60
  61#ifdef CONFIG_USB_SERIAL_GENERIC
  62        generic_device_ids[0].idVendor = vendor;
  63        generic_device_ids[0].idProduct = product;
  64        generic_device_ids[0].match_flags =
  65                USB_DEVICE_ID_MATCH_VENDOR | USB_DEVICE_ID_MATCH_PRODUCT;
  66
  67        retval = usb_serial_register_drivers(serial_drivers,
  68                        "usbserial_generic", generic_device_ids);
  69#endif
  70        return retval;
  71}
  72
  73void usb_serial_generic_deregister(void)
  74{
  75#ifdef CONFIG_USB_SERIAL_GENERIC
  76        usb_serial_deregister_drivers(serial_drivers);
  77#endif
  78}
  79
  80int usb_serial_generic_open(struct tty_struct *tty, struct usb_serial_port *port)
  81{
  82        int result = 0;
  83        unsigned long flags;
  84
  85        spin_lock_irqsave(&port->lock, flags);
  86        port->throttled = 0;
  87        port->throttle_req = 0;
  88        spin_unlock_irqrestore(&port->lock, flags);
  89
  90        if (port->bulk_in_size)
  91                result = usb_serial_generic_submit_read_urbs(port, GFP_KERNEL);
  92
  93        return result;
  94}
  95EXPORT_SYMBOL_GPL(usb_serial_generic_open);
  96
  97void usb_serial_generic_close(struct usb_serial_port *port)
  98{
  99        unsigned long flags;
 100        int i;
 101
 102        if (port->bulk_out_size) {
 103                for (i = 0; i < ARRAY_SIZE(port->write_urbs); ++i)
 104                        usb_kill_urb(port->write_urbs[i]);
 105
 106                spin_lock_irqsave(&port->lock, flags);
 107                kfifo_reset_out(&port->write_fifo);
 108                spin_unlock_irqrestore(&port->lock, flags);
 109        }
 110        if (port->bulk_in_size) {
 111                for (i = 0; i < ARRAY_SIZE(port->read_urbs); ++i)
 112                        usb_kill_urb(port->read_urbs[i]);
 113        }
 114}
 115EXPORT_SYMBOL_GPL(usb_serial_generic_close);
 116
 117int usb_serial_generic_prepare_write_buffer(struct usb_serial_port *port,
 118                                                void *dest, size_t size)
 119{
 120        return kfifo_out_locked(&port->write_fifo, dest, size, &port->lock);
 121}
 122
 123/**
 124 * usb_serial_generic_write_start - start writing buffered data
 125 * @port: usb-serial port
 126 * @mem_flags: flags to use for memory allocations
 127 *
 128 * Serialised using USB_SERIAL_WRITE_BUSY flag.
 129 *
 130 * Return: Zero on success or if busy, otherwise a negative errno value.
 131 */
 132int usb_serial_generic_write_start(struct usb_serial_port *port,
 133                                                        gfp_t mem_flags)
 134{
 135        struct urb *urb;
 136        int count, result;
 137        unsigned long flags;
 138        int i;
 139
 140        if (test_and_set_bit_lock(USB_SERIAL_WRITE_BUSY, &port->flags))
 141                return 0;
 142retry:
 143        spin_lock_irqsave(&port->lock, flags);
 144        if (!port->write_urbs_free || !kfifo_len(&port->write_fifo)) {
 145                clear_bit_unlock(USB_SERIAL_WRITE_BUSY, &port->flags);
 146                spin_unlock_irqrestore(&port->lock, flags);
 147                return 0;
 148        }
 149        i = (int)find_first_bit(&port->write_urbs_free,
 150                                                ARRAY_SIZE(port->write_urbs));
 151        spin_unlock_irqrestore(&port->lock, flags);
 152
 153        urb = port->write_urbs[i];
 154        count = port->serial->type->prepare_write_buffer(port,
 155                                                urb->transfer_buffer,
 156                                                port->bulk_out_size);
 157        urb->transfer_buffer_length = count;
 158        usb_serial_debug_data(&port->dev, __func__, count, urb->transfer_buffer);
 159        spin_lock_irqsave(&port->lock, flags);
 160        port->tx_bytes += count;
 161        spin_unlock_irqrestore(&port->lock, flags);
 162
 163        clear_bit(i, &port->write_urbs_free);
 164        result = usb_submit_urb(urb, mem_flags);
 165        if (result) {
 166                dev_err_console(port, "%s - error submitting urb: %d\n",
 167                                                __func__, result);
 168                set_bit(i, &port->write_urbs_free);
 169                spin_lock_irqsave(&port->lock, flags);
 170                port->tx_bytes -= count;
 171                spin_unlock_irqrestore(&port->lock, flags);
 172
 173                clear_bit_unlock(USB_SERIAL_WRITE_BUSY, &port->flags);
 174                return result;
 175        }
 176
 177        goto retry;     /* try sending off another urb */
 178}
 179EXPORT_SYMBOL_GPL(usb_serial_generic_write_start);
 180
 181/**
 182 * usb_serial_generic_write - generic write function
 183 * @tty: tty for the port
 184 * @port: usb-serial port
 185 * @buf: data to write
 186 * @count: number of bytes to write
 187 *
 188 * Return: The number of characters buffered, which may be anything from
 189 * zero to @count, or a negative errno value.
 190 */
 191int usb_serial_generic_write(struct tty_struct *tty,
 192        struct usb_serial_port *port, const unsigned char *buf, int count)
 193{
 194        int result;
 195
 196        if (!port->bulk_out_size)
 197                return -ENODEV;
 198
 199        if (!count)
 200                return 0;
 201
 202        count = kfifo_in_locked(&port->write_fifo, buf, count, &port->lock);
 203        result = usb_serial_generic_write_start(port, GFP_ATOMIC);
 204        if (result)
 205                return result;
 206
 207        return count;
 208}
 209EXPORT_SYMBOL_GPL(usb_serial_generic_write);
 210
 211int usb_serial_generic_write_room(struct tty_struct *tty)
 212{
 213        struct usb_serial_port *port = tty->driver_data;
 214        unsigned long flags;
 215        int room;
 216
 217        if (!port->bulk_out_size)
 218                return 0;
 219
 220        spin_lock_irqsave(&port->lock, flags);
 221        room = kfifo_avail(&port->write_fifo);
 222        spin_unlock_irqrestore(&port->lock, flags);
 223
 224        dev_dbg(&port->dev, "%s - returns %d\n", __func__, room);
 225        return room;
 226}
 227
 228int usb_serial_generic_chars_in_buffer(struct tty_struct *tty)
 229{
 230        struct usb_serial_port *port = tty->driver_data;
 231        unsigned long flags;
 232        int chars;
 233
 234        if (!port->bulk_out_size)
 235                return 0;
 236
 237        spin_lock_irqsave(&port->lock, flags);
 238        chars = kfifo_len(&port->write_fifo) + port->tx_bytes;
 239        spin_unlock_irqrestore(&port->lock, flags);
 240
 241        dev_dbg(&port->dev, "%s - returns %d\n", __func__, chars);
 242        return chars;
 243}
 244EXPORT_SYMBOL_GPL(usb_serial_generic_chars_in_buffer);
 245
 246void usb_serial_generic_wait_until_sent(struct tty_struct *tty, long timeout)
 247{
 248        struct usb_serial_port *port = tty->driver_data;
 249        unsigned int bps;
 250        unsigned long period;
 251        unsigned long expire;
 252
 253        bps = tty_get_baud_rate(tty);
 254        if (!bps)
 255                bps = 9600;     /* B0 */
 256        /*
 257         * Use a poll-period of roughly the time it takes to send one
 258         * character or at least one jiffy.
 259         */
 260        period = max_t(unsigned long, (10 * HZ / bps), 1);
 261        if (timeout)
 262                period = min_t(unsigned long, period, timeout);
 263
 264        dev_dbg(&port->dev, "%s - timeout = %u ms, period = %u ms\n",
 265                                        __func__, jiffies_to_msecs(timeout),
 266                                        jiffies_to_msecs(period));
 267        expire = jiffies + timeout;
 268        while (!port->serial->type->tx_empty(port)) {
 269                schedule_timeout_interruptible(period);
 270                if (signal_pending(current))
 271                        break;
 272                if (timeout && time_after(jiffies, expire))
 273                        break;
 274        }
 275}
 276EXPORT_SYMBOL_GPL(usb_serial_generic_wait_until_sent);
 277
 278static int usb_serial_generic_submit_read_urb(struct usb_serial_port *port,
 279                                                int index, gfp_t mem_flags)
 280{
 281        int res;
 282
 283        if (!test_and_clear_bit(index, &port->read_urbs_free))
 284                return 0;
 285
 286        dev_dbg(&port->dev, "%s - urb %d\n", __func__, index);
 287
 288        res = usb_submit_urb(port->read_urbs[index], mem_flags);
 289        if (res) {
 290                if (res != -EPERM && res != -ENODEV) {
 291                        dev_err(&port->dev,
 292                                        "%s - usb_submit_urb failed: %d\n",
 293                                        __func__, res);
 294                }
 295                set_bit(index, &port->read_urbs_free);
 296                return res;
 297        }
 298
 299        return 0;
 300}
 301
 302int usb_serial_generic_submit_read_urbs(struct usb_serial_port *port,
 303                                        gfp_t mem_flags)
 304{
 305        int res;
 306        int i;
 307
 308        for (i = 0; i < ARRAY_SIZE(port->read_urbs); ++i) {
 309                res = usb_serial_generic_submit_read_urb(port, i, mem_flags);
 310                if (res)
 311                        goto err;
 312        }
 313
 314        return 0;
 315err:
 316        for (; i >= 0; --i)
 317                usb_kill_urb(port->read_urbs[i]);
 318
 319        return res;
 320}
 321EXPORT_SYMBOL_GPL(usb_serial_generic_submit_read_urbs);
 322
 323void usb_serial_generic_process_read_urb(struct urb *urb)
 324{
 325        struct usb_serial_port *port = urb->context;
 326        char *ch = (char *)urb->transfer_buffer;
 327        int i;
 328
 329        if (!urb->actual_length)
 330                return;
 331        /*
 332         * The per character mucking around with sysrq path it too slow for
 333         * stuff like 3G modems, so shortcircuit it in the 99.9999999% of
 334         * cases where the USB serial is not a console anyway.
 335         */
 336        if (!port->port.console || !port->sysrq) {
 337                tty_insert_flip_string(&port->port, ch, urb->actual_length);
 338        } else {
 339                for (i = 0; i < urb->actual_length; i++, ch++) {
 340                        if (!usb_serial_handle_sysrq_char(port, *ch))
 341                                tty_insert_flip_char(&port->port, *ch, TTY_NORMAL);
 342                }
 343        }
 344        tty_flip_buffer_push(&port->port);
 345}
 346EXPORT_SYMBOL_GPL(usb_serial_generic_process_read_urb);
 347
 348void usb_serial_generic_read_bulk_callback(struct urb *urb)
 349{
 350        struct usb_serial_port *port = urb->context;
 351        unsigned char *data = urb->transfer_buffer;
 352        unsigned long flags;
 353        int i;
 354
 355        for (i = 0; i < ARRAY_SIZE(port->read_urbs); ++i) {
 356                if (urb == port->read_urbs[i])
 357                        break;
 358        }
 359        set_bit(i, &port->read_urbs_free);
 360
 361        dev_dbg(&port->dev, "%s - urb %d, len %d\n", __func__, i,
 362                                                        urb->actual_length);
 363        switch (urb->status) {
 364        case 0:
 365                break;
 366        case -ENOENT:
 367        case -ECONNRESET:
 368        case -ESHUTDOWN:
 369                dev_dbg(&port->dev, "%s - urb stopped: %d\n",
 370                                                        __func__, urb->status);
 371                return;
 372        case -EPIPE:
 373                dev_err(&port->dev, "%s - urb stopped: %d\n",
 374                                                        __func__, urb->status);
 375                return;
 376        default:
 377                dev_dbg(&port->dev, "%s - nonzero urb status: %d\n",
 378                                                        __func__, urb->status);
 379                goto resubmit;
 380        }
 381
 382        usb_serial_debug_data(&port->dev, __func__, urb->actual_length, data);
 383        port->serial->type->process_read_urb(urb);
 384
 385resubmit:
 386        /* Throttle the device if requested by tty */
 387        spin_lock_irqsave(&port->lock, flags);
 388        port->throttled = port->throttle_req;
 389        if (!port->throttled) {
 390                spin_unlock_irqrestore(&port->lock, flags);
 391                usb_serial_generic_submit_read_urb(port, i, GFP_ATOMIC);
 392        } else {
 393                spin_unlock_irqrestore(&port->lock, flags);
 394        }
 395}
 396EXPORT_SYMBOL_GPL(usb_serial_generic_read_bulk_callback);
 397
 398void usb_serial_generic_write_bulk_callback(struct urb *urb)
 399{
 400        unsigned long flags;
 401        struct usb_serial_port *port = urb->context;
 402        int i;
 403
 404        for (i = 0; i < ARRAY_SIZE(port->write_urbs); ++i) {
 405                if (port->write_urbs[i] == urb)
 406                        break;
 407        }
 408        spin_lock_irqsave(&port->lock, flags);
 409        port->tx_bytes -= urb->transfer_buffer_length;
 410        set_bit(i, &port->write_urbs_free);
 411        spin_unlock_irqrestore(&port->lock, flags);
 412
 413        switch (urb->status) {
 414        case 0:
 415                break;
 416        case -ENOENT:
 417        case -ECONNRESET:
 418        case -ESHUTDOWN:
 419                dev_dbg(&port->dev, "%s - urb stopped: %d\n",
 420                                                        __func__, urb->status);
 421                return;
 422        case -EPIPE:
 423                dev_err_console(port, "%s - urb stopped: %d\n",
 424                                                        __func__, urb->status);
 425                return;
 426        default:
 427                dev_err_console(port, "%s - nonzero urb status: %d\n",
 428                                                        __func__, urb->status);
 429                goto resubmit;
 430        }
 431
 432resubmit:
 433        usb_serial_generic_write_start(port, GFP_ATOMIC);
 434        usb_serial_port_softint(port);
 435}
 436EXPORT_SYMBOL_GPL(usb_serial_generic_write_bulk_callback);
 437
 438void usb_serial_generic_throttle(struct tty_struct *tty)
 439{
 440        struct usb_serial_port *port = tty->driver_data;
 441        unsigned long flags;
 442
 443        spin_lock_irqsave(&port->lock, flags);
 444        port->throttle_req = 1;
 445        spin_unlock_irqrestore(&port->lock, flags);
 446}
 447EXPORT_SYMBOL_GPL(usb_serial_generic_throttle);
 448
 449void usb_serial_generic_unthrottle(struct tty_struct *tty)
 450{
 451        struct usb_serial_port *port = tty->driver_data;
 452        int was_throttled;
 453
 454        spin_lock_irq(&port->lock);
 455        was_throttled = port->throttled;
 456        port->throttled = port->throttle_req = 0;
 457        spin_unlock_irq(&port->lock);
 458
 459        if (was_throttled)
 460                usb_serial_generic_submit_read_urbs(port, GFP_KERNEL);
 461}
 462EXPORT_SYMBOL_GPL(usb_serial_generic_unthrottle);
 463
 464static bool usb_serial_generic_msr_changed(struct tty_struct *tty,
 465                                unsigned long arg, struct async_icount *cprev)
 466{
 467        struct usb_serial_port *port = tty->driver_data;
 468        struct async_icount cnow;
 469        unsigned long flags;
 470        bool ret;
 471
 472        /*
 473         * Use tty-port initialised flag to detect all hangups including the
 474         * one generated at USB-device disconnect.
 475         */
 476        if (!test_bit(ASYNCB_INITIALIZED, &port->port.flags))
 477                return true;
 478
 479        spin_lock_irqsave(&port->lock, flags);
 480        cnow = port->icount;                            /* atomic copy*/
 481        spin_unlock_irqrestore(&port->lock, flags);
 482
 483        ret =   ((arg & TIOCM_RNG) && (cnow.rng != cprev->rng)) ||
 484                ((arg & TIOCM_DSR) && (cnow.dsr != cprev->dsr)) ||
 485                ((arg & TIOCM_CD)  && (cnow.dcd != cprev->dcd)) ||
 486                ((arg & TIOCM_CTS) && (cnow.cts != cprev->cts));
 487
 488        *cprev = cnow;
 489
 490        return ret;
 491}
 492
 493int usb_serial_generic_tiocmiwait(struct tty_struct *tty, unsigned long arg)
 494{
 495        struct usb_serial_port *port = tty->driver_data;
 496        struct async_icount cnow;
 497        unsigned long flags;
 498        int ret;
 499
 500        spin_lock_irqsave(&port->lock, flags);
 501        cnow = port->icount;                            /* atomic copy */
 502        spin_unlock_irqrestore(&port->lock, flags);
 503
 504        ret = wait_event_interruptible(port->port.delta_msr_wait,
 505                        usb_serial_generic_msr_changed(tty, arg, &cnow));
 506        if (!ret && !test_bit(ASYNCB_INITIALIZED, &port->port.flags))
 507                ret = -EIO;
 508
 509        return ret;
 510}
 511EXPORT_SYMBOL_GPL(usb_serial_generic_tiocmiwait);
 512
 513int usb_serial_generic_get_icount(struct tty_struct *tty,
 514                                        struct serial_icounter_struct *icount)
 515{
 516        struct usb_serial_port *port = tty->driver_data;
 517        struct async_icount cnow;
 518        unsigned long flags;
 519
 520        spin_lock_irqsave(&port->lock, flags);
 521        cnow = port->icount;                            /* atomic copy */
 522        spin_unlock_irqrestore(&port->lock, flags);
 523
 524        icount->cts = cnow.cts;
 525        icount->dsr = cnow.dsr;
 526        icount->rng = cnow.rng;
 527        icount->dcd = cnow.dcd;
 528        icount->tx = cnow.tx;
 529        icount->rx = cnow.rx;
 530        icount->frame = cnow.frame;
 531        icount->parity = cnow.parity;
 532        icount->overrun = cnow.overrun;
 533        icount->brk = cnow.brk;
 534        icount->buf_overrun = cnow.buf_overrun;
 535
 536        return 0;
 537}
 538EXPORT_SYMBOL_GPL(usb_serial_generic_get_icount);
 539
 540#ifdef CONFIG_MAGIC_SYSRQ
 541int usb_serial_handle_sysrq_char(struct usb_serial_port *port, unsigned int ch)
 542{
 543        if (port->sysrq && port->port.console) {
 544                if (ch && time_before(jiffies, port->sysrq)) {
 545                        handle_sysrq(ch);
 546                        port->sysrq = 0;
 547                        return 1;
 548                }
 549                port->sysrq = 0;
 550        }
 551        return 0;
 552}
 553#else
 554int usb_serial_handle_sysrq_char(struct usb_serial_port *port, unsigned int ch)
 555{
 556        return 0;
 557}
 558#endif
 559EXPORT_SYMBOL_GPL(usb_serial_handle_sysrq_char);
 560
 561int usb_serial_handle_break(struct usb_serial_port *port)
 562{
 563        if (!port->sysrq) {
 564                port->sysrq = jiffies + HZ*5;
 565                return 1;
 566        }
 567        port->sysrq = 0;
 568        return 0;
 569}
 570EXPORT_SYMBOL_GPL(usb_serial_handle_break);
 571
 572/**
 573 * usb_serial_handle_dcd_change - handle a change of carrier detect state
 574 * @port: usb-serial port
 575 * @tty: tty for the port
 576 * @status: new carrier detect status, nonzero if active
 577 */
 578void usb_serial_handle_dcd_change(struct usb_serial_port *usb_port,
 579                                struct tty_struct *tty, unsigned int status)
 580{
 581        struct tty_port *port = &usb_port->port;
 582
 583        dev_dbg(&usb_port->dev, "%s - status %d\n", __func__, status);
 584
 585        if (tty) {
 586                struct tty_ldisc *ld = tty_ldisc_ref(tty);
 587
 588                if (ld) {
 589                        if (ld->ops->dcd_change)
 590                                ld->ops->dcd_change(tty, status);
 591                        tty_ldisc_deref(ld);
 592                }
 593        }
 594
 595        if (status)
 596                wake_up_interruptible(&port->open_wait);
 597        else if (tty && !C_CLOCAL(tty))
 598                tty_hangup(tty);
 599}
 600EXPORT_SYMBOL_GPL(usb_serial_handle_dcd_change);
 601
 602int usb_serial_generic_resume(struct usb_serial *serial)
 603{
 604        struct usb_serial_port *port;
 605        int i, c = 0, r;
 606
 607        for (i = 0; i < serial->num_ports; i++) {
 608                port = serial->port[i];
 609                if (!test_bit(ASYNCB_INITIALIZED, &port->port.flags))
 610                        continue;
 611
 612                if (port->bulk_in_size) {
 613                        r = usb_serial_generic_submit_read_urbs(port,
 614                                                                GFP_NOIO);
 615                        if (r < 0)
 616                                c++;
 617                }
 618
 619                if (port->bulk_out_size) {
 620                        r = usb_serial_generic_write_start(port, GFP_NOIO);
 621                        if (r < 0)
 622                                c++;
 623                }
 624        }
 625
 626        return c ? -EIO : 0;
 627}
 628EXPORT_SYMBOL_GPL(usb_serial_generic_resume);
 629