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