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