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