linux/drivers/usb/serial/generic.c
<<
>>
Prefs
   1/*
   2 * USB Serial Converter Generic functions
   3 *
   4 * Copyright (C) 2010 - 2011 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
  13#include <linux/kernel.h>
  14#include <linux/errno.h>
  15#include <linux/slab.h>
  16#include <linux/sysrq.h>
  17#include <linux/tty.h>
  18#include <linux/tty_flip.h>
  19#include <linux/module.h>
  20#include <linux/moduleparam.h>
  21#include <linux/usb.h>
  22#include <linux/usb/serial.h>
  23#include <linux/uaccess.h>
  24#include <linux/kfifo.h>
  25#include <linux/serial.h>
  26
  27static int debug;
  28
  29#ifdef CONFIG_USB_SERIAL_GENERIC
  30
  31static __u16 vendor  = 0x05f9;
  32static __u16 product = 0xffff;
  33
  34module_param(vendor, ushort, 0);
  35MODULE_PARM_DESC(vendor, "User specified USB idVendor");
  36
  37module_param(product, ushort, 0);
  38MODULE_PARM_DESC(product, "User specified USB idProduct");
  39
  40static struct usb_device_id generic_device_ids[2]; /* Initially all zeroes. */
  41
  42/* All of the device info needed for the Generic Serial Converter */
  43struct usb_serial_driver usb_serial_generic_device = {
  44        .driver = {
  45                .owner =        THIS_MODULE,
  46                .name =         "generic",
  47        },
  48        .id_table =             generic_device_ids,
  49        .num_ports =            1,
  50        .disconnect =           usb_serial_generic_disconnect,
  51        .release =              usb_serial_generic_release,
  52        .throttle =             usb_serial_generic_throttle,
  53        .unthrottle =           usb_serial_generic_unthrottle,
  54        .resume =               usb_serial_generic_resume,
  55};
  56
  57static struct usb_serial_driver * const serial_drivers[] = {
  58        &usb_serial_generic_device, NULL
  59};
  60
  61#endif
  62
  63int usb_serial_generic_register(int _debug)
  64{
  65        int retval = 0;
  66
  67        debug = _debug;
  68#ifdef CONFIG_USB_SERIAL_GENERIC
  69        generic_device_ids[0].idVendor = vendor;
  70        generic_device_ids[0].idProduct = product;
  71        generic_device_ids[0].match_flags =
  72                USB_DEVICE_ID_MATCH_VENDOR | USB_DEVICE_ID_MATCH_PRODUCT;
  73
  74        /* register our generic driver with ourselves */
  75        retval = usb_serial_register_drivers(serial_drivers,
  76                        "usbserial_generic", generic_device_ids);
  77#endif
  78        return retval;
  79}
  80
  81void usb_serial_generic_deregister(void)
  82{
  83#ifdef CONFIG_USB_SERIAL_GENERIC
  84        /* remove our generic driver */
  85        usb_serial_deregister_drivers(serial_drivers);
  86#endif
  87}
  88
  89int usb_serial_generic_open(struct tty_struct *tty, struct usb_serial_port *port)
  90{
  91        int result = 0;
  92        unsigned long flags;
  93
  94        /* clear the throttle flags */
  95        spin_lock_irqsave(&port->lock, flags);
  96        port->throttled = 0;
  97        port->throttle_req = 0;
  98        spin_unlock_irqrestore(&port->lock, flags);
  99
 100        /* if we have a bulk endpoint, start reading from it */
 101        if (port->bulk_in_size)
 102                result = usb_serial_generic_submit_read_urbs(port, GFP_KERNEL);
 103
 104        return result;
 105}
 106EXPORT_SYMBOL_GPL(usb_serial_generic_open);
 107
 108static void generic_cleanup(struct usb_serial_port *port)
 109{
 110        struct usb_serial *serial = port->serial;
 111        unsigned long flags;
 112        int i;
 113
 114        if (serial->dev) {
 115                /* shutdown any bulk transfers that might be going on */
 116                if (port->bulk_out_size) {
 117                        for (i = 0; i < ARRAY_SIZE(port->write_urbs); ++i)
 118                                usb_kill_urb(port->write_urbs[i]);
 119
 120                        spin_lock_irqsave(&port->lock, flags);
 121                        kfifo_reset_out(&port->write_fifo);
 122                        spin_unlock_irqrestore(&port->lock, flags);
 123                }
 124                if (port->bulk_in_size) {
 125                        for (i = 0; i < ARRAY_SIZE(port->read_urbs); ++i)
 126                                usb_kill_urb(port->read_urbs[i]);
 127                }
 128        }
 129}
 130
 131void usb_serial_generic_close(struct usb_serial_port *port)
 132{
 133        generic_cleanup(port);
 134}
 135EXPORT_SYMBOL_GPL(usb_serial_generic_close);
 136
 137int usb_serial_generic_prepare_write_buffer(struct usb_serial_port *port,
 138                                                void *dest, size_t size)
 139{
 140        return kfifo_out_locked(&port->write_fifo, dest, size, &port->lock);
 141}
 142
 143/**
 144 * usb_serial_generic_write_start - kick off an URB write
 145 * @port:       Pointer to the &struct usb_serial_port data
 146 *
 147 * Returns zero on success, or a negative errno value
 148 */
 149static int usb_serial_generic_write_start(struct usb_serial_port *port)
 150{
 151        struct urb *urb;
 152        int count, result;
 153        unsigned long flags;
 154        int i;
 155
 156        if (test_and_set_bit_lock(USB_SERIAL_WRITE_BUSY, &port->flags))
 157                return 0;
 158retry:
 159        spin_lock_irqsave(&port->lock, flags);
 160        if (!port->write_urbs_free || !kfifo_len(&port->write_fifo)) {
 161                clear_bit_unlock(USB_SERIAL_WRITE_BUSY, &port->flags);
 162                spin_unlock_irqrestore(&port->lock, flags);
 163                return 0;
 164        }
 165        i = (int)find_first_bit(&port->write_urbs_free,
 166                                                ARRAY_SIZE(port->write_urbs));
 167        spin_unlock_irqrestore(&port->lock, flags);
 168
 169        urb = port->write_urbs[i];
 170        count = port->serial->type->prepare_write_buffer(port,
 171                                                urb->transfer_buffer,
 172                                                port->bulk_out_size);
 173        urb->transfer_buffer_length = count;
 174        usb_serial_debug_data(debug, &port->dev, __func__, count,
 175                                                urb->transfer_buffer);
 176        spin_lock_irqsave(&port->lock, flags);
 177        port->tx_bytes += count;
 178        spin_unlock_irqrestore(&port->lock, flags);
 179
 180        clear_bit(i, &port->write_urbs_free);
 181        result = usb_submit_urb(urb, GFP_ATOMIC);
 182        if (result) {
 183                dev_err_console(port, "%s - error submitting urb: %d\n",
 184                                                __func__, result);
 185                set_bit(i, &port->write_urbs_free);
 186                spin_lock_irqsave(&port->lock, flags);
 187                port->tx_bytes -= count;
 188                spin_unlock_irqrestore(&port->lock, flags);
 189
 190                clear_bit_unlock(USB_SERIAL_WRITE_BUSY, &port->flags);
 191                return result;
 192        }
 193
 194        /* Try sending off another urb, unless in irq context (in which case
 195         * there will be no free urb). */
 196        if (!in_irq())
 197                goto retry;
 198
 199        clear_bit_unlock(USB_SERIAL_WRITE_BUSY, &port->flags);
 200
 201        return 0;
 202}
 203
 204/**
 205 * usb_serial_generic_write - generic write function for serial USB devices
 206 * @tty:        Pointer to &struct tty_struct for the device
 207 * @port:       Pointer to the &usb_serial_port structure for the device
 208 * @buf:        Pointer to the data to write
 209 * @count:      Number of bytes to write
 210 *
 211 * Returns the number of characters actually written, which may be anything
 212 * from zero to @count. If an error occurs, it returns the negative errno
 213 * value.
 214 */
 215int usb_serial_generic_write(struct tty_struct *tty,
 216        struct usb_serial_port *port, const unsigned char *buf, int count)
 217{
 218        int result;
 219
 220        /* only do something if we have a bulk out endpoint */
 221        if (!port->bulk_out_size)
 222                return -ENODEV;
 223
 224        if (!count)
 225                return 0;
 226
 227        count = kfifo_in_locked(&port->write_fifo, buf, count, &port->lock);
 228        result = usb_serial_generic_write_start(port);
 229        if (result)
 230                return result;
 231
 232        return count;
 233}
 234EXPORT_SYMBOL_GPL(usb_serial_generic_write);
 235
 236int usb_serial_generic_write_room(struct tty_struct *tty)
 237{
 238        struct usb_serial_port *port = tty->driver_data;
 239        unsigned long flags;
 240        int room;
 241
 242        if (!port->bulk_out_size)
 243                return 0;
 244
 245        spin_lock_irqsave(&port->lock, flags);
 246        room = kfifo_avail(&port->write_fifo);
 247        spin_unlock_irqrestore(&port->lock, flags);
 248
 249        dev_dbg(&port->dev, "%s - returns %d\n", __func__, room);
 250        return room;
 251}
 252
 253int usb_serial_generic_chars_in_buffer(struct tty_struct *tty)
 254{
 255        struct usb_serial_port *port = tty->driver_data;
 256        unsigned long flags;
 257        int chars;
 258
 259        if (!port->bulk_out_size)
 260                return 0;
 261
 262        spin_lock_irqsave(&port->lock, flags);
 263        chars = kfifo_len(&port->write_fifo) + port->tx_bytes;
 264        spin_unlock_irqrestore(&port->lock, flags);
 265
 266        dev_dbg(&port->dev, "%s - returns %d\n", __func__, chars);
 267        return chars;
 268}
 269
 270static int usb_serial_generic_submit_read_urb(struct usb_serial_port *port,
 271                                                int index, gfp_t mem_flags)
 272{
 273        int res;
 274
 275        if (!test_and_clear_bit(index, &port->read_urbs_free))
 276                return 0;
 277
 278        dev_dbg(&port->dev, "%s - port %d, urb %d\n", __func__,
 279                port->number, index);
 280
 281        res = usb_submit_urb(port->read_urbs[index], mem_flags);
 282        if (res) {
 283                if (res != -EPERM) {
 284                        dev_err(&port->dev,
 285                                        "%s - usb_submit_urb failed: %d\n",
 286                                        __func__, res);
 287                }
 288                set_bit(index, &port->read_urbs_free);
 289                return res;
 290        }
 291
 292        return 0;
 293}
 294
 295int usb_serial_generic_submit_read_urbs(struct usb_serial_port *port,
 296                                        gfp_t mem_flags)
 297{
 298        int res;
 299        int i;
 300
 301        for (i = 0; i < ARRAY_SIZE(port->read_urbs); ++i) {
 302                res = usb_serial_generic_submit_read_urb(port, i, mem_flags);
 303                if (res)
 304                        goto err;
 305        }
 306
 307        return 0;
 308err:
 309        for (; i >= 0; --i)
 310                usb_kill_urb(port->read_urbs[i]);
 311
 312        return res;
 313}
 314EXPORT_SYMBOL_GPL(usb_serial_generic_submit_read_urbs);
 315
 316void usb_serial_generic_process_read_urb(struct urb *urb)
 317{
 318        struct usb_serial_port *port = urb->context;
 319        struct tty_struct *tty;
 320        char *ch = (char *)urb->transfer_buffer;
 321        int i;
 322
 323        if (!urb->actual_length)
 324                return;
 325
 326        tty = tty_port_tty_get(&port->port);
 327        if (!tty)
 328                return;
 329
 330        /* The per character mucking around with sysrq path it too slow for
 331           stuff like 3G modems, so shortcircuit it in the 99.9999999% of cases
 332           where the USB serial is not a console anyway */
 333        if (!port->port.console || !port->sysrq)
 334                tty_insert_flip_string(tty, ch, urb->actual_length);
 335        else {
 336                for (i = 0; i < urb->actual_length; i++, ch++) {
 337                        if (!usb_serial_handle_sysrq_char(port, *ch))
 338                                tty_insert_flip_char(tty, *ch, TTY_NORMAL);
 339                }
 340        }
 341        tty_flip_buffer_push(tty);
 342        tty_kref_put(tty);
 343}
 344EXPORT_SYMBOL_GPL(usb_serial_generic_process_read_urb);
 345
 346void usb_serial_generic_read_bulk_callback(struct urb *urb)
 347{
 348        struct usb_serial_port *port = urb->context;
 349        unsigned char *data = urb->transfer_buffer;
 350        unsigned long flags;
 351        int i;
 352
 353        for (i = 0; i < ARRAY_SIZE(port->read_urbs); ++i) {
 354                if (urb == port->read_urbs[i])
 355                        break;
 356        }
 357        set_bit(i, &port->read_urbs_free);
 358
 359        dev_dbg(&port->dev, "%s - port %d, urb %d, len %d\n",
 360                __func__, port->number, i, urb->actual_length);
 361
 362        if (urb->status) {
 363                dev_dbg(&port->dev, "%s - non-zero urb status: %d\n",
 364                        __func__, urb->status);
 365                return;
 366        }
 367
 368        usb_serial_debug_data(debug, &port->dev, __func__,
 369                                                urb->actual_length, data);
 370        port->serial->type->process_read_urb(urb);
 371
 372        /* Throttle the device if requested by tty */
 373        spin_lock_irqsave(&port->lock, flags);
 374        port->throttled = port->throttle_req;
 375        if (!port->throttled) {
 376                spin_unlock_irqrestore(&port->lock, flags);
 377                usb_serial_generic_submit_read_urb(port, i, GFP_ATOMIC);
 378        } else
 379                spin_unlock_irqrestore(&port->lock, flags);
 380}
 381EXPORT_SYMBOL_GPL(usb_serial_generic_read_bulk_callback);
 382
 383void usb_serial_generic_write_bulk_callback(struct urb *urb)
 384{
 385        unsigned long flags;
 386        struct usb_serial_port *port = urb->context;
 387        int status = urb->status;
 388        int i;
 389
 390        for (i = 0; i < ARRAY_SIZE(port->write_urbs); ++i)
 391                if (port->write_urbs[i] == urb)
 392                        break;
 393
 394        spin_lock_irqsave(&port->lock, flags);
 395        port->tx_bytes -= urb->transfer_buffer_length;
 396        set_bit(i, &port->write_urbs_free);
 397        spin_unlock_irqrestore(&port->lock, flags);
 398
 399        if (status) {
 400                dev_dbg(&port->dev, "%s - non-zero urb status: %d\n",
 401                        __func__, status);
 402
 403                spin_lock_irqsave(&port->lock, flags);
 404                kfifo_reset_out(&port->write_fifo);
 405                spin_unlock_irqrestore(&port->lock, flags);
 406        } else {
 407                usb_serial_generic_write_start(port);
 408        }
 409
 410        usb_serial_port_softint(port);
 411}
 412EXPORT_SYMBOL_GPL(usb_serial_generic_write_bulk_callback);
 413
 414void usb_serial_generic_throttle(struct tty_struct *tty)
 415{
 416        struct usb_serial_port *port = tty->driver_data;
 417        unsigned long flags;
 418
 419        /* Set the throttle request flag. It will be picked up
 420         * by usb_serial_generic_read_bulk_callback(). */
 421        spin_lock_irqsave(&port->lock, flags);
 422        port->throttle_req = 1;
 423        spin_unlock_irqrestore(&port->lock, flags);
 424}
 425EXPORT_SYMBOL_GPL(usb_serial_generic_throttle);
 426
 427void usb_serial_generic_unthrottle(struct tty_struct *tty)
 428{
 429        struct usb_serial_port *port = tty->driver_data;
 430        int was_throttled;
 431
 432        /* Clear the throttle flags */
 433        spin_lock_irq(&port->lock);
 434        was_throttled = port->throttled;
 435        port->throttled = port->throttle_req = 0;
 436        spin_unlock_irq(&port->lock);
 437
 438        if (was_throttled)
 439                usb_serial_generic_submit_read_urbs(port, GFP_KERNEL);
 440}
 441EXPORT_SYMBOL_GPL(usb_serial_generic_unthrottle);
 442
 443#ifdef CONFIG_MAGIC_SYSRQ
 444int usb_serial_handle_sysrq_char(struct usb_serial_port *port, unsigned int ch)
 445{
 446        if (port->sysrq && port->port.console) {
 447                if (ch && time_before(jiffies, port->sysrq)) {
 448                        handle_sysrq(ch);
 449                        port->sysrq = 0;
 450                        return 1;
 451                }
 452                port->sysrq = 0;
 453        }
 454        return 0;
 455}
 456#else
 457int usb_serial_handle_sysrq_char(struct usb_serial_port *port, unsigned int ch)
 458{
 459        return 0;
 460}
 461#endif
 462EXPORT_SYMBOL_GPL(usb_serial_handle_sysrq_char);
 463
 464int usb_serial_handle_break(struct usb_serial_port *port)
 465{
 466        if (!port->sysrq) {
 467                port->sysrq = jiffies + HZ*5;
 468                return 1;
 469        }
 470        port->sysrq = 0;
 471        return 0;
 472}
 473EXPORT_SYMBOL_GPL(usb_serial_handle_break);
 474
 475/**
 476 *      usb_serial_handle_dcd_change - handle a change of carrier detect state
 477 *      @port: usb_serial_port structure for the open port
 478 *      @tty: tty_struct structure for the port
 479 *      @status: new carrier detect status, nonzero if active
 480 */
 481void usb_serial_handle_dcd_change(struct usb_serial_port *usb_port,
 482                                struct tty_struct *tty, unsigned int status)
 483{
 484        struct tty_port *port = &usb_port->port;
 485
 486        dev_dbg(&usb_port->dev, "%s - port %d, status %d\n", __func__,
 487                usb_port->number, status);
 488
 489        if (status)
 490                wake_up_interruptible(&port->open_wait);
 491        else if (tty && !C_CLOCAL(tty))
 492                tty_hangup(tty);
 493}
 494EXPORT_SYMBOL_GPL(usb_serial_handle_dcd_change);
 495
 496int usb_serial_generic_resume(struct usb_serial *serial)
 497{
 498        struct usb_serial_port *port;
 499        int i, c = 0, r;
 500
 501        for (i = 0; i < serial->num_ports; i++) {
 502                port = serial->port[i];
 503                if (!test_bit(ASYNCB_INITIALIZED, &port->port.flags))
 504                        continue;
 505
 506                if (port->bulk_in_size) {
 507                        r = usb_serial_generic_submit_read_urbs(port,
 508                                                                GFP_NOIO);
 509                        if (r < 0)
 510                                c++;
 511                }
 512
 513                if (port->bulk_out_size) {
 514                        r = usb_serial_generic_write_start(port);
 515                        if (r < 0)
 516                                c++;
 517                }
 518        }
 519
 520        return c ? -EIO : 0;
 521}
 522EXPORT_SYMBOL_GPL(usb_serial_generic_resume);
 523
 524void usb_serial_generic_disconnect(struct usb_serial *serial)
 525{
 526        int i;
 527
 528        /* stop reads and writes on all ports */
 529        for (i = 0; i < serial->num_ports; ++i)
 530                generic_cleanup(serial->port[i]);
 531}
 532EXPORT_SYMBOL_GPL(usb_serial_generic_disconnect);
 533
 534void usb_serial_generic_release(struct usb_serial *serial)
 535{
 536}
 537