linux/drivers/usb/core/devices.c
<<
>>
Prefs
   1/*
   2 * devices.c
   3 * (C) Copyright 1999 Randy Dunlap.
   4 * (C) Copyright 1999,2000 Thomas Sailer <sailer@ife.ee.ethz.ch>.
   5 *     (proc file per device)
   6 * (C) Copyright 1999 Deti Fliegl (new USB architecture)
   7 *
   8 * This program is free software; you can redistribute it and/or modify
   9 * it under the terms of the GNU General Public License as published by
  10 * the Free Software Foundation; either version 2 of the License, or
  11 * (at your option) any later version.
  12 *
  13 * This program is distributed in the hope that it will be useful,
  14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  16 * GNU General Public License for more details.
  17 *
  18 * You should have received a copy of the GNU General Public License
  19 * along with this program; if not, write to the Free Software
  20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  21 *
  22 *************************************************************
  23 *
  24 * <mountpoint>/devices contains USB topology, device, config, class,
  25 * interface, & endpoint data.
  26 *
  27 * I considered using /dev/bus/usb/device# for each device
  28 * as it is attached or detached, but I didn't like this for some
  29 * reason -- maybe it's just too deep of a directory structure.
  30 * I also don't like looking in multiple places to gather and view
  31 * the data.  Having only one file for ./devices also prevents race
  32 * conditions that could arise if a program was reading device info
  33 * for devices that are being removed (unplugged).  (That is, the
  34 * program may find a directory for devnum_12 then try to open it,
  35 * but it was just unplugged, so the directory is now deleted.
  36 * But programs would just have to be prepared for situations like
  37 * this in any plug-and-play environment.)
  38 *
  39 * 1999-12-16: Thomas Sailer <sailer@ife.ee.ethz.ch>
  40 *   Converted the whole proc stuff to real
  41 *   read methods. Now not the whole device list needs to fit
  42 *   into one page, only the device list for one bus.
  43 *   Added a poll method to /sys/kernel/debug/usb/devices, to wake
  44 *   up an eventual usbd
  45 * 2000-01-04: Thomas Sailer <sailer@ife.ee.ethz.ch>
  46 *   Turned into its own filesystem
  47 * 2000-07-05: Ashley Montanaro <ashley@compsoc.man.ac.uk>
  48 *   Converted file reading routine to dump to buffer once
  49 *   per device, not per bus
  50 */
  51
  52#include <linux/fs.h>
  53#include <linux/mm.h>
  54#include <linux/gfp.h>
  55#include <linux/poll.h>
  56#include <linux/usb.h>
  57#include <linux/usbdevice_fs.h>
  58#include <linux/usb/hcd.h>
  59#include <linux/mutex.h>
  60#include <linux/uaccess.h>
  61
  62#include "usb.h"
  63
  64/* Define ALLOW_SERIAL_NUMBER if you want to see the serial number of devices */
  65#define ALLOW_SERIAL_NUMBER
  66
  67static const char format_topo[] =
  68/* T:  Bus=dd Lev=dd Prnt=dd Port=dd Cnt=dd Dev#=ddd Spd=dddd MxCh=dd */
  69"\nT:  Bus=%2.2d Lev=%2.2d Prnt=%2.2d Port=%2.2d Cnt=%2.2d Dev#=%3d Spd=%-4s MxCh=%2d\n";
  70
  71static const char format_string_manufacturer[] =
  72/* S:  Manufacturer=xxxx */
  73  "S:  Manufacturer=%.100s\n";
  74
  75static const char format_string_product[] =
  76/* S:  Product=xxxx */
  77  "S:  Product=%.100s\n";
  78
  79#ifdef ALLOW_SERIAL_NUMBER
  80static const char format_string_serialnumber[] =
  81/* S:  SerialNumber=xxxx */
  82  "S:  SerialNumber=%.100s\n";
  83#endif
  84
  85static const char format_bandwidth[] =
  86/* B:  Alloc=ddd/ddd us (xx%), #Int=ddd, #Iso=ddd */
  87  "B:  Alloc=%3d/%3d us (%2d%%), #Int=%3d, #Iso=%3d\n";
  88
  89static const char format_device1[] =
  90/* D:  Ver=xx.xx Cls=xx(sssss) Sub=xx Prot=xx MxPS=dd #Cfgs=dd */
  91  "D:  Ver=%2x.%02x Cls=%02x(%-5s) Sub=%02x Prot=%02x MxPS=%2d #Cfgs=%3d\n";
  92
  93static const char format_device2[] =
  94/* P:  Vendor=xxxx ProdID=xxxx Rev=xx.xx */
  95  "P:  Vendor=%04x ProdID=%04x Rev=%2x.%02x\n";
  96
  97static const char format_config[] =
  98/* C:  #Ifs=dd Cfg#=dd Atr=xx MPwr=dddmA */
  99  "C:%c #Ifs=%2d Cfg#=%2d Atr=%02x MxPwr=%3dmA\n";
 100
 101static const char format_iad[] =
 102/* A:  FirstIf#=dd IfCount=dd Cls=xx(sssss) Sub=xx Prot=xx */
 103  "A:  FirstIf#=%2d IfCount=%2d Cls=%02x(%-5s) Sub=%02x Prot=%02x\n";
 104
 105static const char format_iface[] =
 106/* I:  If#=dd Alt=dd #EPs=dd Cls=xx(sssss) Sub=xx Prot=xx Driver=xxxx*/
 107  "I:%c If#=%2d Alt=%2d #EPs=%2d Cls=%02x(%-5s) Sub=%02x Prot=%02x Driver=%s\n";
 108
 109static const char format_endpt[] =
 110/* E:  Ad=xx(s) Atr=xx(ssss) MxPS=dddd Ivl=D?s */
 111  "E:  Ad=%02x(%c) Atr=%02x(%-4s) MxPS=%4d Ivl=%d%cs\n";
 112
 113/*
 114 * Wait for an connect/disconnect event to happen. We initialize
 115 * the event counter with an odd number, and each event will increment
 116 * the event counter by two, so it will always _stay_ odd. That means
 117 * that it will never be zero, so "event 0" will never match a current
 118 * event, and thus 'poll' will always trigger as readable for the first
 119 * time it gets called.
 120 */
 121static struct device_connect_event {
 122        atomic_t count;
 123        wait_queue_head_t wait;
 124} device_event = {
 125        .count = ATOMIC_INIT(1),
 126        .wait = __WAIT_QUEUE_HEAD_INITIALIZER(device_event.wait)
 127};
 128
 129struct class_info {
 130        int class;
 131        char *class_name;
 132};
 133
 134static const struct class_info clas_info[] = {
 135        /* max. 5 chars. per name string */
 136        {USB_CLASS_PER_INTERFACE,       ">ifc"},
 137        {USB_CLASS_AUDIO,               "audio"},
 138        {USB_CLASS_COMM,                "comm."},
 139        {USB_CLASS_HID,                 "HID"},
 140        {USB_CLASS_PHYSICAL,            "PID"},
 141        {USB_CLASS_STILL_IMAGE,         "still"},
 142        {USB_CLASS_PRINTER,             "print"},
 143        {USB_CLASS_MASS_STORAGE,        "stor."},
 144        {USB_CLASS_HUB,                 "hub"},
 145        {USB_CLASS_CDC_DATA,            "data"},
 146        {USB_CLASS_CSCID,               "scard"},
 147        {USB_CLASS_CONTENT_SEC,         "c-sec"},
 148        {USB_CLASS_VIDEO,               "video"},
 149        {USB_CLASS_WIRELESS_CONTROLLER, "wlcon"},
 150        {USB_CLASS_MISC,                "misc"},
 151        {USB_CLASS_APP_SPEC,            "app."},
 152        {USB_CLASS_VENDOR_SPEC,         "vend."},
 153        {-1,                            "unk."}         /* leave as last */
 154};
 155
 156/*****************************************************************/
 157
 158void usbfs_conn_disc_event(void)
 159{
 160        atomic_add(2, &device_event.count);
 161        wake_up(&device_event.wait);
 162}
 163
 164static const char *class_decode(const int class)
 165{
 166        int ix;
 167
 168        for (ix = 0; clas_info[ix].class != -1; ix++)
 169                if (clas_info[ix].class == class)
 170                        break;
 171        return clas_info[ix].class_name;
 172}
 173
 174static char *usb_dump_endpoint_descriptor(int speed, char *start, char *end,
 175                                const struct usb_endpoint_descriptor *desc)
 176{
 177        char dir, unit, *type;
 178        unsigned interval, bandwidth = 1;
 179
 180        if (start > end)
 181                return start;
 182
 183        dir = usb_endpoint_dir_in(desc) ? 'I' : 'O';
 184
 185        if (speed == USB_SPEED_HIGH)
 186                bandwidth = usb_endpoint_maxp_mult(desc);
 187
 188        /* this isn't checking for illegal values */
 189        switch (usb_endpoint_type(desc)) {
 190        case USB_ENDPOINT_XFER_CONTROL:
 191                type = "Ctrl";
 192                if (speed == USB_SPEED_HIGH)    /* uframes per NAK */
 193                        interval = desc->bInterval;
 194                else
 195                        interval = 0;
 196                dir = 'B';                      /* ctrl is bidirectional */
 197                break;
 198        case USB_ENDPOINT_XFER_ISOC:
 199                type = "Isoc";
 200                interval = 1 << (desc->bInterval - 1);
 201                break;
 202        case USB_ENDPOINT_XFER_BULK:
 203                type = "Bulk";
 204                if (speed == USB_SPEED_HIGH && dir == 'O') /* uframes per NAK */
 205                        interval = desc->bInterval;
 206                else
 207                        interval = 0;
 208                break;
 209        case USB_ENDPOINT_XFER_INT:
 210                type = "Int.";
 211                if (speed == USB_SPEED_HIGH || speed >= USB_SPEED_SUPER)
 212                        interval = 1 << (desc->bInterval - 1);
 213                else
 214                        interval = desc->bInterval;
 215                break;
 216        default:        /* "can't happen" */
 217                return start;
 218        }
 219        interval *= (speed == USB_SPEED_HIGH ||
 220                     speed >= USB_SPEED_SUPER) ? 125 : 1000;
 221        if (interval % 1000)
 222                unit = 'u';
 223        else {
 224                unit = 'm';
 225                interval /= 1000;
 226        }
 227
 228        start += sprintf(start, format_endpt, desc->bEndpointAddress, dir,
 229                         desc->bmAttributes, type,
 230                         usb_endpoint_maxp(desc) *
 231                         bandwidth,
 232                         interval, unit);
 233        return start;
 234}
 235
 236static char *usb_dump_interface_descriptor(char *start, char *end,
 237                                        const struct usb_interface_cache *intfc,
 238                                        const struct usb_interface *iface,
 239                                        int setno)
 240{
 241        const struct usb_interface_descriptor *desc;
 242        const char *driver_name = "";
 243        int active = 0;
 244
 245        if (start > end)
 246                return start;
 247        desc = &intfc->altsetting[setno].desc;
 248        if (iface) {
 249                driver_name = (iface->dev.driver
 250                                ? iface->dev.driver->name
 251                                : "(none)");
 252                active = (desc == &iface->cur_altsetting->desc);
 253        }
 254        start += sprintf(start, format_iface,
 255                         active ? '*' : ' ',    /* mark active altsetting */
 256                         desc->bInterfaceNumber,
 257                         desc->bAlternateSetting,
 258                         desc->bNumEndpoints,
 259                         desc->bInterfaceClass,
 260                         class_decode(desc->bInterfaceClass),
 261                         desc->bInterfaceSubClass,
 262                         desc->bInterfaceProtocol,
 263                         driver_name);
 264        return start;
 265}
 266
 267static char *usb_dump_interface(int speed, char *start, char *end,
 268                                const struct usb_interface_cache *intfc,
 269                                const struct usb_interface *iface, int setno)
 270{
 271        const struct usb_host_interface *desc = &intfc->altsetting[setno];
 272        int i;
 273
 274        start = usb_dump_interface_descriptor(start, end, intfc, iface, setno);
 275        for (i = 0; i < desc->desc.bNumEndpoints; i++) {
 276                if (start > end)
 277                        return start;
 278                start = usb_dump_endpoint_descriptor(speed,
 279                                start, end, &desc->endpoint[i].desc);
 280        }
 281        return start;
 282}
 283
 284static char *usb_dump_iad_descriptor(char *start, char *end,
 285                        const struct usb_interface_assoc_descriptor *iad)
 286{
 287        if (start > end)
 288                return start;
 289        start += sprintf(start, format_iad,
 290                         iad->bFirstInterface,
 291                         iad->bInterfaceCount,
 292                         iad->bFunctionClass,
 293                         class_decode(iad->bFunctionClass),
 294                         iad->bFunctionSubClass,
 295                         iad->bFunctionProtocol);
 296        return start;
 297}
 298
 299/* TBD:
 300 * 0. TBDs
 301 * 1. marking active interface altsettings (code lists all, but should mark
 302 *    which ones are active, if any)
 303 */
 304static char *usb_dump_config_descriptor(char *start, char *end,
 305                                const struct usb_config_descriptor *desc,
 306                                int active, int speed)
 307{
 308        int mul;
 309
 310        if (start > end)
 311                return start;
 312        if (speed >= USB_SPEED_SUPER)
 313                mul = 8;
 314        else
 315                mul = 2;
 316        start += sprintf(start, format_config,
 317                         /* mark active/actual/current cfg. */
 318                         active ? '*' : ' ',
 319                         desc->bNumInterfaces,
 320                         desc->bConfigurationValue,
 321                         desc->bmAttributes,
 322                         desc->bMaxPower * mul);
 323        return start;
 324}
 325
 326static char *usb_dump_config(int speed, char *start, char *end,
 327                             const struct usb_host_config *config, int active)
 328{
 329        int i, j;
 330        struct usb_interface_cache *intfc;
 331        struct usb_interface *interface;
 332
 333        if (start > end)
 334                return start;
 335        if (!config)
 336                /* getting these some in 2.3.7; none in 2.3.6 */
 337                return start + sprintf(start, "(null Cfg. desc.)\n");
 338        start = usb_dump_config_descriptor(start, end, &config->desc, active,
 339                        speed);
 340        for (i = 0; i < USB_MAXIADS; i++) {
 341                if (config->intf_assoc[i] == NULL)
 342                        break;
 343                start = usb_dump_iad_descriptor(start, end,
 344                                        config->intf_assoc[i]);
 345        }
 346        for (i = 0; i < config->desc.bNumInterfaces; i++) {
 347                intfc = config->intf_cache[i];
 348                interface = config->interface[i];
 349                for (j = 0; j < intfc->num_altsetting; j++) {
 350                        if (start > end)
 351                                return start;
 352                        start = usb_dump_interface(speed,
 353                                start, end, intfc, interface, j);
 354                }
 355        }
 356        return start;
 357}
 358
 359/*
 360 * Dump the different USB descriptors.
 361 */
 362static char *usb_dump_device_descriptor(char *start, char *end,
 363                                const struct usb_device_descriptor *desc)
 364{
 365        u16 bcdUSB = le16_to_cpu(desc->bcdUSB);
 366        u16 bcdDevice = le16_to_cpu(desc->bcdDevice);
 367
 368        if (start > end)
 369                return start;
 370        start += sprintf(start, format_device1,
 371                          bcdUSB >> 8, bcdUSB & 0xff,
 372                          desc->bDeviceClass,
 373                          class_decode(desc->bDeviceClass),
 374                          desc->bDeviceSubClass,
 375                          desc->bDeviceProtocol,
 376                          desc->bMaxPacketSize0,
 377                          desc->bNumConfigurations);
 378        if (start > end)
 379                return start;
 380        start += sprintf(start, format_device2,
 381                         le16_to_cpu(desc->idVendor),
 382                         le16_to_cpu(desc->idProduct),
 383                         bcdDevice >> 8, bcdDevice & 0xff);
 384        return start;
 385}
 386
 387/*
 388 * Dump the different strings that this device holds.
 389 */
 390static char *usb_dump_device_strings(char *start, char *end,
 391                                     struct usb_device *dev)
 392{
 393        if (start > end)
 394                return start;
 395        if (dev->manufacturer)
 396                start += sprintf(start, format_string_manufacturer,
 397                                 dev->manufacturer);
 398        if (start > end)
 399                goto out;
 400        if (dev->product)
 401                start += sprintf(start, format_string_product, dev->product);
 402        if (start > end)
 403                goto out;
 404#ifdef ALLOW_SERIAL_NUMBER
 405        if (dev->serial)
 406                start += sprintf(start, format_string_serialnumber,
 407                                 dev->serial);
 408#endif
 409 out:
 410        return start;
 411}
 412
 413static char *usb_dump_desc(char *start, char *end, struct usb_device *dev)
 414{
 415        int i;
 416
 417        if (start > end)
 418                return start;
 419
 420        start = usb_dump_device_descriptor(start, end, &dev->descriptor);
 421
 422        if (start > end)
 423                return start;
 424
 425        start = usb_dump_device_strings(start, end, dev);
 426
 427        for (i = 0; i < dev->descriptor.bNumConfigurations; i++) {
 428                if (start > end)
 429                        return start;
 430                start = usb_dump_config(dev->speed,
 431                                start, end, dev->config + i,
 432                                /* active ? */
 433                                (dev->config + i) == dev->actconfig);
 434        }
 435        return start;
 436}
 437
 438
 439#ifdef PROC_EXTRA /* TBD: may want to add this code later */
 440
 441static char *usb_dump_hub_descriptor(char *start, char *end,
 442                                     const struct usb_hub_descriptor *desc)
 443{
 444        int leng = USB_DT_HUB_NONVAR_SIZE;
 445        unsigned char *ptr = (unsigned char *)desc;
 446
 447        if (start > end)
 448                return start;
 449        start += sprintf(start, "Interface:");
 450        while (leng && start <= end) {
 451                start += sprintf(start, " %02x", *ptr);
 452                ptr++; leng--;
 453        }
 454        *start++ = '\n';
 455        return start;
 456}
 457
 458static char *usb_dump_string(char *start, char *end,
 459                             const struct usb_device *dev, char *id, int index)
 460{
 461        if (start > end)
 462                return start;
 463        start += sprintf(start, "Interface:");
 464        if (index <= dev->maxstring && dev->stringindex &&
 465            dev->stringindex[index])
 466                start += sprintf(start, "%s: %.100s ", id,
 467                                 dev->stringindex[index]);
 468        return start;
 469}
 470
 471#endif /* PROC_EXTRA */
 472
 473/*****************************************************************/
 474
 475/* This is a recursive function. Parameters:
 476 * buffer - the user-space buffer to write data into
 477 * nbytes - the maximum number of bytes to write
 478 * skip_bytes - the number of bytes to skip before writing anything
 479 * file_offset - the offset into the devices file on completion
 480 * The caller must own the device lock.
 481 */
 482static ssize_t usb_device_dump(char __user **buffer, size_t *nbytes,
 483                               loff_t *skip_bytes, loff_t *file_offset,
 484                               struct usb_device *usbdev, struct usb_bus *bus,
 485                               int level, int index, int count)
 486{
 487        int chix;
 488        int ret, cnt = 0;
 489        int parent_devnum = 0;
 490        char *pages_start, *data_end, *speed;
 491        unsigned int length;
 492        ssize_t total_written = 0;
 493        struct usb_device *childdev = NULL;
 494
 495        /* don't bother with anything else if we're not writing any data */
 496        if (*nbytes <= 0)
 497                return 0;
 498
 499        if (level > MAX_TOPO_LEVEL)
 500                return 0;
 501        /* allocate 2^1 pages = 8K (on i386);
 502         * should be more than enough for one device */
 503        pages_start = (char *)__get_free_pages(GFP_NOIO, 1);
 504        if (!pages_start)
 505                return -ENOMEM;
 506
 507        if (usbdev->parent && usbdev->parent->devnum != -1)
 508                parent_devnum = usbdev->parent->devnum;
 509        /*
 510         * So the root hub's parent is 0 and any device that is
 511         * plugged into the root hub has a parent of 0.
 512         */
 513        switch (usbdev->speed) {
 514        case USB_SPEED_LOW:
 515                speed = "1.5"; break;
 516        case USB_SPEED_UNKNOWN:         /* usb 1.1 root hub code */
 517        case USB_SPEED_FULL:
 518                speed = "12"; break;
 519        case USB_SPEED_WIRELESS:        /* Wireless has no real fixed speed */
 520        case USB_SPEED_HIGH:
 521                speed = "480"; break;
 522        case USB_SPEED_SUPER:
 523                speed = "5000"; break;
 524        case USB_SPEED_SUPER_PLUS:
 525                speed = "10000"; break;
 526        default:
 527                speed = "??";
 528        }
 529        data_end = pages_start + sprintf(pages_start, format_topo,
 530                        bus->busnum, level, parent_devnum,
 531                        index, count, usbdev->devnum,
 532                        speed, usbdev->maxchild);
 533        /*
 534         * level = topology-tier level;
 535         * parent_devnum = parent device number;
 536         * index = parent's connector number;
 537         * count = device count at this level
 538         */
 539        /* If this is the root hub, display the bandwidth information */
 540        if (level == 0) {
 541                int     max;
 542
 543                /* super/high speed reserves 80%, full/low reserves 90% */
 544                if (usbdev->speed == USB_SPEED_HIGH ||
 545                    usbdev->speed >= USB_SPEED_SUPER)
 546                        max = 800;
 547                else
 548                        max = FRAME_TIME_MAX_USECS_ALLOC;
 549
 550                /* report "average" periodic allocation over a microsecond.
 551                 * the schedules are actually bursty, HCDs need to deal with
 552                 * that and just compute/report this average.
 553                 */
 554                data_end += sprintf(data_end, format_bandwidth,
 555                                bus->bandwidth_allocated, max,
 556                                (100 * bus->bandwidth_allocated + max / 2)
 557                                        / max,
 558                                bus->bandwidth_int_reqs,
 559                                bus->bandwidth_isoc_reqs);
 560
 561        }
 562        data_end = usb_dump_desc(data_end, pages_start + (2 * PAGE_SIZE) - 256,
 563                                 usbdev);
 564
 565        if (data_end > (pages_start + (2 * PAGE_SIZE) - 256))
 566                data_end += sprintf(data_end, "(truncated)\n");
 567
 568        length = data_end - pages_start;
 569        /* if we can start copying some data to the user */
 570        if (length > *skip_bytes) {
 571                length -= *skip_bytes;
 572                if (length > *nbytes)
 573                        length = *nbytes;
 574                if (copy_to_user(*buffer, pages_start + *skip_bytes, length)) {
 575                        free_pages((unsigned long)pages_start, 1);
 576                        return -EFAULT;
 577                }
 578                *nbytes -= length;
 579                *file_offset += length;
 580                total_written += length;
 581                *buffer += length;
 582                *skip_bytes = 0;
 583        } else
 584                *skip_bytes -= length;
 585
 586        free_pages((unsigned long)pages_start, 1);
 587
 588        /* Now look at all of this device's children. */
 589        usb_hub_for_each_child(usbdev, chix, childdev) {
 590                usb_lock_device(childdev);
 591                ret = usb_device_dump(buffer, nbytes, skip_bytes,
 592                                      file_offset, childdev, bus,
 593                                      level + 1, chix - 1, ++cnt);
 594                usb_unlock_device(childdev);
 595                if (ret == -EFAULT)
 596                        return total_written;
 597                total_written += ret;
 598        }
 599        return total_written;
 600}
 601
 602static ssize_t usb_device_read(struct file *file, char __user *buf,
 603                               size_t nbytes, loff_t *ppos)
 604{
 605        struct usb_bus *bus;
 606        ssize_t ret, total_written = 0;
 607        loff_t skip_bytes = *ppos;
 608        int id;
 609
 610        if (*ppos < 0)
 611                return -EINVAL;
 612        if (nbytes <= 0)
 613                return 0;
 614        if (!access_ok(VERIFY_WRITE, buf, nbytes))
 615                return -EFAULT;
 616
 617        mutex_lock(&usb_bus_idr_lock);
 618        /* print devices for all busses */
 619        idr_for_each_entry(&usb_bus_idr, bus, id) {
 620                /* recurse through all children of the root hub */
 621                if (!bus_to_hcd(bus)->rh_registered)
 622                        continue;
 623                usb_lock_device(bus->root_hub);
 624                ret = usb_device_dump(&buf, &nbytes, &skip_bytes, ppos,
 625                                      bus->root_hub, bus, 0, 0, 0);
 626                usb_unlock_device(bus->root_hub);
 627                if (ret < 0) {
 628                        mutex_unlock(&usb_bus_idr_lock);
 629                        return ret;
 630                }
 631                total_written += ret;
 632        }
 633        mutex_unlock(&usb_bus_idr_lock);
 634        return total_written;
 635}
 636
 637/* Kernel lock for "lastev" protection */
 638static unsigned int usb_device_poll(struct file *file,
 639                                    struct poll_table_struct *wait)
 640{
 641        unsigned int event_count;
 642
 643        poll_wait(file, &device_event.wait, wait);
 644
 645        event_count = atomic_read(&device_event.count);
 646        if (file->f_version != event_count) {
 647                file->f_version = event_count;
 648                return POLLIN | POLLRDNORM;
 649        }
 650
 651        return 0;
 652}
 653
 654const struct file_operations usbfs_devices_fops = {
 655        .llseek =       no_seek_end_llseek,
 656        .read =         usb_device_read,
 657        .poll =         usb_device_poll,
 658};
 659