linux/drivers/usb/usb-skeleton.c
<<
>>
Prefs
   1/*
   2 * USB Skeleton driver - 2.2
   3 *
   4 * Copyright (C) 2001-2004 Greg Kroah-Hartman (greg@kroah.com)
   5 *
   6 *      This program is free software; you can redistribute it and/or
   7 *      modify it under the terms of the GNU General Public License as
   8 *      published by the Free Software Foundation, version 2.
   9 *
  10 * This driver is based on the 2.6.3 version of drivers/usb/usb-skeleton.c
  11 * but has been rewritten to be easier to read and use.
  12 *
  13 */
  14
  15#include <linux/kernel.h>
  16#include <linux/errno.h>
  17#include <linux/init.h>
  18#include <linux/slab.h>
  19#include <linux/module.h>
  20#include <linux/kref.h>
  21#include <linux/uaccess.h>
  22#include <linux/usb.h>
  23#include <linux/mutex.h>
  24
  25
  26/* Define these values to match your devices */
  27#define USB_SKEL_VENDOR_ID      0xfff0
  28#define USB_SKEL_PRODUCT_ID     0xfff0
  29
  30/* table of devices that work with this driver */
  31static struct usb_device_id skel_table[] = {
  32        { USB_DEVICE(USB_SKEL_VENDOR_ID, USB_SKEL_PRODUCT_ID) },
  33        { }                                     /* Terminating entry */
  34};
  35MODULE_DEVICE_TABLE(usb, skel_table);
  36
  37
  38/* Get a minor range for your devices from the usb maintainer */
  39#define USB_SKEL_MINOR_BASE     192
  40
  41/* our private defines. if this grows any larger, use your own .h file */
  42#define MAX_TRANSFER            (PAGE_SIZE - 512)
  43/* MAX_TRANSFER is chosen so that the VM is not stressed by
  44   allocations > PAGE_SIZE and the number of packets in a page
  45   is an integer 512 is the largest possible packet on EHCI */
  46#define WRITES_IN_FLIGHT        8
  47/* arbitrarily chosen */
  48
  49/* Structure to hold all of our device specific stuff */
  50struct usb_skel {
  51        struct usb_device       *udev;                  /* the usb device for this device */
  52        struct usb_interface    *interface;             /* the interface for this device */
  53        struct semaphore        limit_sem;              /* limiting the number of writes in progress */
  54        struct usb_anchor       submitted;              /* in case we need to retract our submissions */
  55        struct urb              *bulk_in_urb;           /* the urb to read data with */
  56        unsigned char           *bulk_in_buffer;        /* the buffer to receive data */
  57        size_t                  bulk_in_size;           /* the size of the receive buffer */
  58        size_t                  bulk_in_filled;         /* number of bytes in the buffer */
  59        size_t                  bulk_in_copied;         /* already copied to user space */
  60        __u8                    bulk_in_endpointAddr;   /* the address of the bulk in endpoint */
  61        __u8                    bulk_out_endpointAddr;  /* the address of the bulk out endpoint */
  62        int                     errors;                 /* the last request tanked */
  63        int                     open_count;             /* count the number of openers */
  64        bool                    ongoing_read;           /* a read is going on */
  65        bool                    processed_urb;          /* indicates we haven't processed the urb */
  66        spinlock_t              err_lock;               /* lock for errors */
  67        struct kref             kref;
  68        struct mutex            io_mutex;               /* synchronize I/O with disconnect */
  69        struct completion       bulk_in_completion;     /* to wait for an ongoing read */
  70};
  71#define to_skel_dev(d) container_of(d, struct usb_skel, kref)
  72
  73static struct usb_driver skel_driver;
  74static void skel_draw_down(struct usb_skel *dev);
  75
  76static void skel_delete(struct kref *kref)
  77{
  78        struct usb_skel *dev = to_skel_dev(kref);
  79
  80        usb_free_urb(dev->bulk_in_urb);
  81        usb_put_dev(dev->udev);
  82        kfree(dev->bulk_in_buffer);
  83        kfree(dev);
  84}
  85
  86static int skel_open(struct inode *inode, struct file *file)
  87{
  88        struct usb_skel *dev;
  89        struct usb_interface *interface;
  90        int subminor;
  91        int retval = 0;
  92
  93        subminor = iminor(inode);
  94
  95        interface = usb_find_interface(&skel_driver, subminor);
  96        if (!interface) {
  97                err("%s - error, can't find device for minor %d",
  98                     __func__, subminor);
  99                retval = -ENODEV;
 100                goto exit;
 101        }
 102
 103        dev = usb_get_intfdata(interface);
 104        if (!dev) {
 105                retval = -ENODEV;
 106                goto exit;
 107        }
 108
 109        /* increment our usage count for the device */
 110        kref_get(&dev->kref);
 111
 112        /* lock the device to allow correctly handling errors
 113         * in resumption */
 114        mutex_lock(&dev->io_mutex);
 115
 116        if (!dev->open_count++) {
 117                retval = usb_autopm_get_interface(interface);
 118                        if (retval) {
 119                                dev->open_count--;
 120                                mutex_unlock(&dev->io_mutex);
 121                                kref_put(&dev->kref, skel_delete);
 122                                goto exit;
 123                        }
 124        } /* else { //uncomment this block if you want exclusive open
 125                retval = -EBUSY;
 126                dev->open_count--;
 127                mutex_unlock(&dev->io_mutex);
 128                kref_put(&dev->kref, skel_delete);
 129                goto exit;
 130        } */
 131        /* prevent the device from being autosuspended */
 132
 133        /* save our object in the file's private structure */
 134        file->private_data = dev;
 135        mutex_unlock(&dev->io_mutex);
 136
 137exit:
 138        return retval;
 139}
 140
 141static int skel_release(struct inode *inode, struct file *file)
 142{
 143        struct usb_skel *dev;
 144
 145        dev = (struct usb_skel *)file->private_data;
 146        if (dev == NULL)
 147                return -ENODEV;
 148
 149        /* allow the device to be autosuspended */
 150        mutex_lock(&dev->io_mutex);
 151        if (!--dev->open_count && dev->interface)
 152                usb_autopm_put_interface(dev->interface);
 153        mutex_unlock(&dev->io_mutex);
 154
 155        /* decrement the count on our device */
 156        kref_put(&dev->kref, skel_delete);
 157        return 0;
 158}
 159
 160static int skel_flush(struct file *file, fl_owner_t id)
 161{
 162        struct usb_skel *dev;
 163        int res;
 164
 165        dev = (struct usb_skel *)file->private_data;
 166        if (dev == NULL)
 167                return -ENODEV;
 168
 169        /* wait for io to stop */
 170        mutex_lock(&dev->io_mutex);
 171        skel_draw_down(dev);
 172
 173        /* read out errors, leave subsequent opens a clean slate */
 174        spin_lock_irq(&dev->err_lock);
 175        res = dev->errors ? (dev->errors == -EPIPE ? -EPIPE : -EIO) : 0;
 176        dev->errors = 0;
 177        spin_unlock_irq(&dev->err_lock);
 178
 179        mutex_unlock(&dev->io_mutex);
 180
 181        return res;
 182}
 183
 184static void skel_read_bulk_callback(struct urb *urb)
 185{
 186        struct usb_skel *dev;
 187
 188        dev = urb->context;
 189
 190        spin_lock(&dev->err_lock);
 191        /* sync/async unlink faults aren't errors */
 192        if (urb->status) {
 193                if (!(urb->status == -ENOENT ||
 194                    urb->status == -ECONNRESET ||
 195                    urb->status == -ESHUTDOWN))
 196                        err("%s - nonzero write bulk status received: %d",
 197                            __func__, urb->status);
 198
 199                dev->errors = urb->status;
 200        } else {
 201                dev->bulk_in_filled = urb->actual_length;
 202        }
 203        dev->ongoing_read = 0;
 204        spin_unlock(&dev->err_lock);
 205
 206        complete(&dev->bulk_in_completion);
 207}
 208
 209static int skel_do_read_io(struct usb_skel *dev, size_t count)
 210{
 211        int rv;
 212
 213        /* prepare a read */
 214        usb_fill_bulk_urb(dev->bulk_in_urb,
 215                        dev->udev,
 216                        usb_rcvbulkpipe(dev->udev,
 217                                dev->bulk_in_endpointAddr),
 218                        dev->bulk_in_buffer,
 219                        min(dev->bulk_in_size, count),
 220                        skel_read_bulk_callback,
 221                        dev);
 222        /* tell everybody to leave the URB alone */
 223        spin_lock_irq(&dev->err_lock);
 224        dev->ongoing_read = 1;
 225        spin_unlock_irq(&dev->err_lock);
 226
 227        /* do it */
 228        rv = usb_submit_urb(dev->bulk_in_urb, GFP_KERNEL);
 229        if (rv < 0) {
 230                err("%s - failed submitting read urb, error %d",
 231                        __func__, rv);
 232                dev->bulk_in_filled = 0;
 233                rv = (rv == -ENOMEM) ? rv : -EIO;
 234                spin_lock_irq(&dev->err_lock);
 235                dev->ongoing_read = 0;
 236                spin_unlock_irq(&dev->err_lock);
 237        }
 238
 239        return rv;
 240}
 241
 242static ssize_t skel_read(struct file *file, char *buffer, size_t count,
 243                         loff_t *ppos)
 244{
 245        struct usb_skel *dev;
 246        int rv;
 247        bool ongoing_io;
 248
 249        dev = (struct usb_skel *)file->private_data;
 250
 251        /* if we cannot read at all, return EOF */
 252        if (!dev->bulk_in_urb || !count)
 253                return 0;
 254
 255        /* no concurrent readers */
 256        rv = mutex_lock_interruptible(&dev->io_mutex);
 257        if (rv < 0)
 258                return rv;
 259
 260        if (!dev->interface) {          /* disconnect() was called */
 261                rv = -ENODEV;
 262                goto exit;
 263        }
 264
 265        /* if IO is under way, we must not touch things */
 266retry:
 267        spin_lock_irq(&dev->err_lock);
 268        ongoing_io = dev->ongoing_read;
 269        spin_unlock_irq(&dev->err_lock);
 270
 271        if (ongoing_io) {
 272                /* nonblocking IO shall not wait */
 273                if (file->f_flags & O_NONBLOCK) {
 274                        rv = -EAGAIN;
 275                        goto exit;
 276                }
 277                /*
 278                 * IO may take forever
 279                 * hence wait in an interruptible state
 280                 */
 281                rv = wait_for_completion_interruptible(&dev->bulk_in_completion);
 282                if (rv < 0)
 283                        goto exit;
 284                /*
 285                 * by waiting we also semiprocessed the urb
 286                 * we must finish now
 287                 */
 288                dev->bulk_in_copied = 0;
 289                dev->processed_urb = 1;
 290        }
 291
 292        if (!dev->processed_urb) {
 293                /*
 294                 * the URB hasn't been processed
 295                 * do it now
 296                 */
 297                wait_for_completion(&dev->bulk_in_completion);
 298                dev->bulk_in_copied = 0;
 299                dev->processed_urb = 1;
 300        }
 301
 302        /* errors must be reported */
 303        rv = dev->errors;
 304        if (rv < 0) {
 305                /* any error is reported once */
 306                dev->errors = 0;
 307                /* to preserve notifications about reset */
 308                rv = (rv == -EPIPE) ? rv : -EIO;
 309                /* no data to deliver */
 310                dev->bulk_in_filled = 0;
 311                /* report it */
 312                goto exit;
 313        }
 314
 315        /*
 316         * if the buffer is filled we may satisfy the read
 317         * else we need to start IO
 318         */
 319
 320        if (dev->bulk_in_filled) {
 321                /* we had read data */
 322                size_t available = dev->bulk_in_filled - dev->bulk_in_copied;
 323                size_t chunk = min(available, count);
 324
 325                if (!available) {
 326                        /*
 327                         * all data has been used
 328                         * actual IO needs to be done
 329                         */
 330                        rv = skel_do_read_io(dev, count);
 331                        if (rv < 0)
 332                                goto exit;
 333                        else
 334                                goto retry;
 335                }
 336                /*
 337                 * data is available
 338                 * chunk tells us how much shall be copied
 339                 */
 340
 341                if (copy_to_user(buffer,
 342                                 dev->bulk_in_buffer + dev->bulk_in_copied,
 343                                 chunk))
 344                        rv = -EFAULT;
 345                else
 346                        rv = chunk;
 347
 348                dev->bulk_in_copied += chunk;
 349
 350                /*
 351                 * if we are asked for more than we have,
 352                 * we start IO but don't wait
 353                 */
 354                if (available < count)
 355                        skel_do_read_io(dev, count - chunk);
 356        } else {
 357                /* no data in the buffer */
 358                rv = skel_do_read_io(dev, count);
 359                if (rv < 0)
 360                        goto exit;
 361                else if (!file->f_flags & O_NONBLOCK)
 362                        goto retry;
 363                rv = -EAGAIN;
 364        }
 365exit:
 366        mutex_unlock(&dev->io_mutex);
 367        return rv;
 368}
 369
 370static void skel_write_bulk_callback(struct urb *urb)
 371{
 372        struct usb_skel *dev;
 373
 374        dev = urb->context;
 375
 376        /* sync/async unlink faults aren't errors */
 377        if (urb->status) {
 378                if (!(urb->status == -ENOENT ||
 379                    urb->status == -ECONNRESET ||
 380                    urb->status == -ESHUTDOWN))
 381                        err("%s - nonzero write bulk status received: %d",
 382                            __func__, urb->status);
 383
 384                spin_lock(&dev->err_lock);
 385                dev->errors = urb->status;
 386                spin_unlock(&dev->err_lock);
 387        }
 388
 389        /* free up our allocated buffer */
 390        usb_buffer_free(urb->dev, urb->transfer_buffer_length,
 391                        urb->transfer_buffer, urb->transfer_dma);
 392        up(&dev->limit_sem);
 393}
 394
 395static ssize_t skel_write(struct file *file, const char *user_buffer,
 396                          size_t count, loff_t *ppos)
 397{
 398        struct usb_skel *dev;
 399        int retval = 0;
 400        struct urb *urb = NULL;
 401        char *buf = NULL;
 402        size_t writesize = min(count, (size_t)MAX_TRANSFER);
 403
 404        dev = (struct usb_skel *)file->private_data;
 405
 406        /* verify that we actually have some data to write */
 407        if (count == 0)
 408                goto exit;
 409
 410        /*
 411         * limit the number of URBs in flight to stop a user from using up all
 412         * RAM
 413         */
 414        if (!file->f_flags & O_NONBLOCK) {
 415                if (down_interruptible(&dev->limit_sem)) {
 416                        retval = -ERESTARTSYS;
 417                        goto exit;
 418                }
 419        } else {
 420                if (down_trylock(&dev->limit_sem)) {
 421                        retval = -EAGAIN;
 422                        goto exit;
 423                }
 424        }
 425
 426        spin_lock_irq(&dev->err_lock);
 427        retval = dev->errors;
 428        if (retval < 0) {
 429                /* any error is reported once */
 430                dev->errors = 0;
 431                /* to preserve notifications about reset */
 432                retval = (retval == -EPIPE) ? retval : -EIO;
 433        }
 434        spin_unlock_irq(&dev->err_lock);
 435        if (retval < 0)
 436                goto error;
 437
 438        /* create a urb, and a buffer for it, and copy the data to the urb */
 439        urb = usb_alloc_urb(0, GFP_KERNEL);
 440        if (!urb) {
 441                retval = -ENOMEM;
 442                goto error;
 443        }
 444
 445        buf = usb_buffer_alloc(dev->udev, writesize, GFP_KERNEL,
 446                               &urb->transfer_dma);
 447        if (!buf) {
 448                retval = -ENOMEM;
 449                goto error;
 450        }
 451
 452        if (copy_from_user(buf, user_buffer, writesize)) {
 453                retval = -EFAULT;
 454                goto error;
 455        }
 456
 457        /* this lock makes sure we don't submit URBs to gone devices */
 458        mutex_lock(&dev->io_mutex);
 459        if (!dev->interface) {          /* disconnect() was called */
 460                mutex_unlock(&dev->io_mutex);
 461                retval = -ENODEV;
 462                goto error;
 463        }
 464
 465        /* initialize the urb properly */
 466        usb_fill_bulk_urb(urb, dev->udev,
 467                          usb_sndbulkpipe(dev->udev, dev->bulk_out_endpointAddr),
 468                          buf, writesize, skel_write_bulk_callback, dev);
 469        urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
 470        usb_anchor_urb(urb, &dev->submitted);
 471
 472        /* send the data out the bulk port */
 473        retval = usb_submit_urb(urb, GFP_KERNEL);
 474        mutex_unlock(&dev->io_mutex);
 475        if (retval) {
 476                err("%s - failed submitting write urb, error %d", __func__,
 477                    retval);
 478                goto error_unanchor;
 479        }
 480
 481        /*
 482         * release our reference to this urb, the USB core will eventually free
 483         * it entirely
 484         */
 485        usb_free_urb(urb);
 486
 487
 488        return writesize;
 489
 490error_unanchor:
 491        usb_unanchor_urb(urb);
 492error:
 493        if (urb) {
 494                usb_buffer_free(dev->udev, writesize, buf, urb->transfer_dma);
 495                usb_free_urb(urb);
 496        }
 497        up(&dev->limit_sem);
 498
 499exit:
 500        return retval;
 501}
 502
 503static const struct file_operations skel_fops = {
 504        .owner =        THIS_MODULE,
 505        .read =         skel_read,
 506        .write =        skel_write,
 507        .open =         skel_open,
 508        .release =      skel_release,
 509        .flush =        skel_flush,
 510};
 511
 512/*
 513 * usb class driver info in order to get a minor number from the usb core,
 514 * and to have the device registered with the driver core
 515 */
 516static struct usb_class_driver skel_class = {
 517        .name =         "skel%d",
 518        .fops =         &skel_fops,
 519        .minor_base =   USB_SKEL_MINOR_BASE,
 520};
 521
 522static int skel_probe(struct usb_interface *interface,
 523                      const struct usb_device_id *id)
 524{
 525        struct usb_skel *dev;
 526        struct usb_host_interface *iface_desc;
 527        struct usb_endpoint_descriptor *endpoint;
 528        size_t buffer_size;
 529        int i;
 530        int retval = -ENOMEM;
 531
 532        /* allocate memory for our device state and initialize it */
 533        dev = kzalloc(sizeof(*dev), GFP_KERNEL);
 534        if (!dev) {
 535                err("Out of memory");
 536                goto error;
 537        }
 538        kref_init(&dev->kref);
 539        sema_init(&dev->limit_sem, WRITES_IN_FLIGHT);
 540        mutex_init(&dev->io_mutex);
 541        spin_lock_init(&dev->err_lock);
 542        init_usb_anchor(&dev->submitted);
 543        init_completion(&dev->bulk_in_completion);
 544
 545        dev->udev = usb_get_dev(interface_to_usbdev(interface));
 546        dev->interface = interface;
 547
 548        /* set up the endpoint information */
 549        /* use only the first bulk-in and bulk-out endpoints */
 550        iface_desc = interface->cur_altsetting;
 551        for (i = 0; i < iface_desc->desc.bNumEndpoints; ++i) {
 552                endpoint = &iface_desc->endpoint[i].desc;
 553
 554                if (!dev->bulk_in_endpointAddr &&
 555                    usb_endpoint_is_bulk_in(endpoint)) {
 556                        /* we found a bulk in endpoint */
 557                        buffer_size = le16_to_cpu(endpoint->wMaxPacketSize);
 558                        dev->bulk_in_size = buffer_size;
 559                        dev->bulk_in_endpointAddr = endpoint->bEndpointAddress;
 560                        dev->bulk_in_buffer = kmalloc(buffer_size, GFP_KERNEL);
 561                        if (!dev->bulk_in_buffer) {
 562                                err("Could not allocate bulk_in_buffer");
 563                                goto error;
 564                        }
 565                        dev->bulk_in_urb = usb_alloc_urb(0, GFP_KERNEL);
 566                        if (!dev->bulk_in_urb) {
 567                                err("Could not allocate bulk_in_urb");
 568                                goto error;
 569                        }
 570                }
 571
 572                if (!dev->bulk_out_endpointAddr &&
 573                    usb_endpoint_is_bulk_out(endpoint)) {
 574                        /* we found a bulk out endpoint */
 575                        dev->bulk_out_endpointAddr = endpoint->bEndpointAddress;
 576                }
 577        }
 578        if (!(dev->bulk_in_endpointAddr && dev->bulk_out_endpointAddr)) {
 579                err("Could not find both bulk-in and bulk-out endpoints");
 580                goto error;
 581        }
 582
 583        /* save our data pointer in this interface device */
 584        usb_set_intfdata(interface, dev);
 585
 586        /* we can register the device now, as it is ready */
 587        retval = usb_register_dev(interface, &skel_class);
 588        if (retval) {
 589                /* something prevented us from registering this driver */
 590                err("Not able to get a minor for this device.");
 591                usb_set_intfdata(interface, NULL);
 592                goto error;
 593        }
 594
 595        /* let the user know what node this device is now attached to */
 596        dev_info(&interface->dev,
 597                 "USB Skeleton device now attached to USBSkel-%d",
 598                 interface->minor);
 599        return 0;
 600
 601error:
 602        if (dev)
 603                /* this frees allocated memory */
 604                kref_put(&dev->kref, skel_delete);
 605        return retval;
 606}
 607
 608static void skel_disconnect(struct usb_interface *interface)
 609{
 610        struct usb_skel *dev;
 611        int minor = interface->minor;
 612
 613        dev = usb_get_intfdata(interface);
 614        usb_set_intfdata(interface, NULL);
 615
 616        /* give back our minor */
 617        usb_deregister_dev(interface, &skel_class);
 618
 619        /* prevent more I/O from starting */
 620        mutex_lock(&dev->io_mutex);
 621        dev->interface = NULL;
 622        mutex_unlock(&dev->io_mutex);
 623
 624        usb_kill_anchored_urbs(&dev->submitted);
 625
 626        /* decrement our usage count */
 627        kref_put(&dev->kref, skel_delete);
 628
 629        dev_info(&interface->dev, "USB Skeleton #%d now disconnected", minor);
 630}
 631
 632static void skel_draw_down(struct usb_skel *dev)
 633{
 634        int time;
 635
 636        time = usb_wait_anchor_empty_timeout(&dev->submitted, 1000);
 637        if (!time)
 638                usb_kill_anchored_urbs(&dev->submitted);
 639        usb_kill_urb(dev->bulk_in_urb);
 640}
 641
 642static int skel_suspend(struct usb_interface *intf, pm_message_t message)
 643{
 644        struct usb_skel *dev = usb_get_intfdata(intf);
 645
 646        if (!dev)
 647                return 0;
 648        skel_draw_down(dev);
 649        return 0;
 650}
 651
 652static int skel_resume(struct usb_interface *intf)
 653{
 654        return 0;
 655}
 656
 657static int skel_pre_reset(struct usb_interface *intf)
 658{
 659        struct usb_skel *dev = usb_get_intfdata(intf);
 660
 661        mutex_lock(&dev->io_mutex);
 662        skel_draw_down(dev);
 663
 664        return 0;
 665}
 666
 667static int skel_post_reset(struct usb_interface *intf)
 668{
 669        struct usb_skel *dev = usb_get_intfdata(intf);
 670
 671        /* we are sure no URBs are active - no locking needed */
 672        dev->errors = -EPIPE;
 673        mutex_unlock(&dev->io_mutex);
 674
 675        return 0;
 676}
 677
 678static struct usb_driver skel_driver = {
 679        .name =         "skeleton",
 680        .probe =        skel_probe,
 681        .disconnect =   skel_disconnect,
 682        .suspend =      skel_suspend,
 683        .resume =       skel_resume,
 684        .pre_reset =    skel_pre_reset,
 685        .post_reset =   skel_post_reset,
 686        .id_table =     skel_table,
 687        .supports_autosuspend = 1,
 688};
 689
 690static int __init usb_skel_init(void)
 691{
 692        int result;
 693
 694        /* register this driver with the USB subsystem */
 695        result = usb_register(&skel_driver);
 696        if (result)
 697                err("usb_register failed. Error number %d", result);
 698
 699        return result;
 700}
 701
 702static void __exit usb_skel_exit(void)
 703{
 704        /* deregister this driver with the USB subsystem */
 705        usb_deregister(&skel_driver);
 706}
 707
 708module_init(usb_skel_init);
 709module_exit(usb_skel_exit);
 710
 711MODULE_LICENSE("GPL");
 712