diff options
| -rw-r--r-- | drivers/usb/core/devices.c | 154 |
1 files changed, 82 insertions, 72 deletions
diff --git a/drivers/usb/core/devices.c b/drivers/usb/core/devices.c index 87c794d60aa0..83d9dc379d96 100644 --- a/drivers/usb/core/devices.c +++ b/drivers/usb/core/devices.c | |||
| @@ -89,7 +89,7 @@ static const char *format_string_serialnumber = | |||
| 89 | static const char *format_bandwidth = | 89 | static const char *format_bandwidth = |
| 90 | /* B: Alloc=ddd/ddd us (xx%), #Int=ddd, #Iso=ddd */ | 90 | /* B: Alloc=ddd/ddd us (xx%), #Int=ddd, #Iso=ddd */ |
| 91 | "B: Alloc=%3d/%3d us (%2d%%), #Int=%3d, #Iso=%3d\n"; | 91 | "B: Alloc=%3d/%3d us (%2d%%), #Int=%3d, #Iso=%3d\n"; |
| 92 | 92 | ||
| 93 | static const char *format_device1 = | 93 | static const char *format_device1 = |
| 94 | /* D: Ver=xx.xx Cls=xx(sssss) Sub=xx Prot=xx MxPS=dd #Cfgs=dd */ | 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"; | 95 | "D: Ver=%2x.%02x Cls=%02x(%-5s) Sub=%02x Prot=%02x MxPS=%2d #Cfgs=%3d\n"; |
| @@ -101,7 +101,7 @@ static const char *format_device2 = | |||
| 101 | static const char *format_config = | 101 | static const char *format_config = |
| 102 | /* C: #Ifs=dd Cfg#=dd Atr=xx MPwr=dddmA */ | 102 | /* C: #Ifs=dd Cfg#=dd Atr=xx MPwr=dddmA */ |
| 103 | "C:%c #Ifs=%2d Cfg#=%2d Atr=%02x MxPwr=%3dmA\n"; | 103 | "C:%c #Ifs=%2d Cfg#=%2d Atr=%02x MxPwr=%3dmA\n"; |
| 104 | 104 | ||
| 105 | static const char *format_iad = | 105 | static const char *format_iad = |
| 106 | /* A: FirstIf#=dd IfCount=dd Cls=xx(sssss) Sub=xx Prot=xx */ | 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"; | 107 | "A: FirstIf#=%2d IfCount=%2d Cls=%02x(%-5s) Sub=%02x Prot=%02x\n"; |
| @@ -122,7 +122,7 @@ static const char *format_endpt = | |||
| 122 | */ | 122 | */ |
| 123 | 123 | ||
| 124 | static DECLARE_WAIT_QUEUE_HEAD(deviceconndiscwq); | 124 | static DECLARE_WAIT_QUEUE_HEAD(deviceconndiscwq); |
| 125 | static unsigned int conndiscevcnt = 0; | 125 | static unsigned int conndiscevcnt; |
| 126 | 126 | ||
| 127 | /* this struct stores the poll state for <mountpoint>/devices pollers */ | 127 | /* this struct stores the poll state for <mountpoint>/devices pollers */ |
| 128 | struct usb_device_status { | 128 | struct usb_device_status { |
| @@ -172,12 +172,8 @@ static const char *class_decode(const int class) | |||
| 172 | return clas_info[ix].class_name; | 172 | return clas_info[ix].class_name; |
| 173 | } | 173 | } |
| 174 | 174 | ||
| 175 | static char *usb_dump_endpoint_descriptor( | 175 | static char *usb_dump_endpoint_descriptor(int speed, char *start, char *end, |
| 176 | int speed, | 176 | const struct usb_endpoint_descriptor *desc) |
| 177 | char *start, | ||
| 178 | char *end, | ||
| 179 | const struct usb_endpoint_descriptor *desc | ||
| 180 | ) | ||
| 181 | { | 177 | { |
| 182 | char dir, unit, *type; | 178 | char dir, unit, *type; |
| 183 | unsigned interval, bandwidth = 1; | 179 | unsigned interval, bandwidth = 1; |
| @@ -235,22 +231,24 @@ static char *usb_dump_endpoint_descriptor( | |||
| 235 | 231 | ||
| 236 | start += sprintf(start, format_endpt, desc->bEndpointAddress, dir, | 232 | start += sprintf(start, format_endpt, desc->bEndpointAddress, dir, |
| 237 | desc->bmAttributes, type, | 233 | desc->bmAttributes, type, |
| 238 | (le16_to_cpu(desc->wMaxPacketSize) & 0x07ff) * bandwidth, | 234 | (le16_to_cpu(desc->wMaxPacketSize) & 0x07ff) * |
| 235 | bandwidth, | ||
| 239 | interval, unit); | 236 | interval, unit); |
| 240 | return start; | 237 | return start; |
| 241 | } | 238 | } |
| 242 | 239 | ||
| 243 | static char *usb_dump_interface_descriptor(char *start, char *end, | 240 | static char *usb_dump_interface_descriptor(char *start, char *end, |
| 244 | const struct usb_interface_cache *intfc, | 241 | const struct usb_interface_cache *intfc, |
| 245 | const struct usb_interface *iface, | 242 | const struct usb_interface *iface, |
| 246 | int setno) | 243 | int setno) |
| 247 | { | 244 | { |
| 248 | const struct usb_interface_descriptor *desc = &intfc->altsetting[setno].desc; | 245 | const struct usb_interface_descriptor *desc; |
| 249 | const char *driver_name = ""; | 246 | const char *driver_name = ""; |
| 250 | int active = 0; | 247 | int active = 0; |
| 251 | 248 | ||
| 252 | if (start > end) | 249 | if (start > end) |
| 253 | return start; | 250 | return start; |
| 251 | desc = &intfc->altsetting[setno].desc; | ||
| 254 | if (iface) { | 252 | if (iface) { |
| 255 | driver_name = (iface->dev.driver | 253 | driver_name = (iface->dev.driver |
| 256 | ? iface->dev.driver->name | 254 | ? iface->dev.driver->name |
| @@ -270,14 +268,10 @@ static char *usb_dump_interface_descriptor(char *start, char *end, | |||
| 270 | return start; | 268 | return start; |
| 271 | } | 269 | } |
| 272 | 270 | ||
| 273 | static char *usb_dump_interface( | 271 | static char *usb_dump_interface(int speed, char *start, char *end, |
| 274 | int speed, | 272 | const struct usb_interface_cache *intfc, |
| 275 | char *start, | 273 | const struct usb_interface *iface, int setno) |
| 276 | char *end, | 274 | { |
| 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]; | 275 | const struct usb_host_interface *desc = &intfc->altsetting[setno]; |
| 282 | int i; | 276 | int i; |
| 283 | 277 | ||
| @@ -292,7 +286,7 @@ static char *usb_dump_interface( | |||
| 292 | } | 286 | } |
| 293 | 287 | ||
| 294 | static char *usb_dump_iad_descriptor(char *start, char *end, | 288 | static char *usb_dump_iad_descriptor(char *start, char *end, |
| 295 | const struct usb_interface_assoc_descriptor *iad) | 289 | const struct usb_interface_assoc_descriptor *iad) |
| 296 | { | 290 | { |
| 297 | if (start > end) | 291 | if (start > end) |
| 298 | return start; | 292 | return start; |
| @@ -311,13 +305,15 @@ static char *usb_dump_iad_descriptor(char *start, char *end, | |||
| 311 | * 1. marking active interface altsettings (code lists all, but should mark | 305 | * 1. marking active interface altsettings (code lists all, but should mark |
| 312 | * which ones are active, if any) | 306 | * which ones are active, if any) |
| 313 | */ | 307 | */ |
| 314 | 308 | static char *usb_dump_config_descriptor(char *start, char *end, | |
| 315 | static char *usb_dump_config_descriptor(char *start, char *end, const struct usb_config_descriptor *desc, int active) | 309 | const struct usb_config_descriptor *desc, |
| 310 | int active) | ||
| 316 | { | 311 | { |
| 317 | if (start > end) | 312 | if (start > end) |
| 318 | return start; | 313 | return start; |
| 319 | start += sprintf(start, format_config, | 314 | start += sprintf(start, format_config, |
| 320 | active ? '*' : ' ', /* mark active/actual/current cfg. */ | 315 | /* mark active/actual/current cfg. */ |
| 316 | active ? '*' : ' ', | ||
| 321 | desc->bNumInterfaces, | 317 | desc->bNumInterfaces, |
| 322 | desc->bConfigurationValue, | 318 | desc->bConfigurationValue, |
| 323 | desc->bmAttributes, | 319 | desc->bmAttributes, |
| @@ -325,13 +321,8 @@ static char *usb_dump_config_descriptor(char *start, char *end, const struct usb | |||
| 325 | return start; | 321 | return start; |
| 326 | } | 322 | } |
| 327 | 323 | ||
| 328 | static char *usb_dump_config ( | 324 | static char *usb_dump_config(int speed, char *start, char *end, |
| 329 | int speed, | 325 | const struct usb_host_config *config, int active) |
| 330 | char *start, | ||
| 331 | char *end, | ||
| 332 | const struct usb_host_config *config, | ||
| 333 | int active | ||
| 334 | ) | ||
| 335 | { | 326 | { |
| 336 | int i, j; | 327 | int i, j; |
| 337 | struct usb_interface_cache *intfc; | 328 | struct usb_interface_cache *intfc; |
| @@ -339,7 +330,8 @@ static char *usb_dump_config ( | |||
| 339 | 330 | ||
| 340 | if (start > end) | 331 | if (start > end) |
| 341 | return start; | 332 | return start; |
| 342 | if (!config) /* getting these some in 2.3.7; none in 2.3.6 */ | 333 | if (!config) |
| 334 | /* getting these some in 2.3.7; none in 2.3.6 */ | ||
| 343 | return start + sprintf(start, "(null Cfg. desc.)\n"); | 335 | return start + sprintf(start, "(null Cfg. desc.)\n"); |
| 344 | start = usb_dump_config_descriptor(start, end, &config->desc, active); | 336 | start = usb_dump_config_descriptor(start, end, &config->desc, active); |
| 345 | for (i = 0; i < USB_MAXIADS; i++) { | 337 | for (i = 0; i < USB_MAXIADS; i++) { |
| @@ -364,7 +356,8 @@ static char *usb_dump_config ( | |||
| 364 | /* | 356 | /* |
| 365 | * Dump the different USB descriptors. | 357 | * Dump the different USB descriptors. |
| 366 | */ | 358 | */ |
| 367 | static char *usb_dump_device_descriptor(char *start, char *end, const struct usb_device_descriptor *desc) | 359 | static char *usb_dump_device_descriptor(char *start, char *end, |
| 360 | const struct usb_device_descriptor *desc) | ||
| 368 | { | 361 | { |
| 369 | u16 bcdUSB = le16_to_cpu(desc->bcdUSB); | 362 | u16 bcdUSB = le16_to_cpu(desc->bcdUSB); |
| 370 | u16 bcdDevice = le16_to_cpu(desc->bcdDevice); | 363 | u16 bcdDevice = le16_to_cpu(desc->bcdDevice); |
| @@ -374,7 +367,7 @@ static char *usb_dump_device_descriptor(char *start, char *end, const struct usb | |||
| 374 | start += sprintf(start, format_device1, | 367 | start += sprintf(start, format_device1, |
| 375 | bcdUSB >> 8, bcdUSB & 0xff, | 368 | bcdUSB >> 8, bcdUSB & 0xff, |
| 376 | desc->bDeviceClass, | 369 | desc->bDeviceClass, |
| 377 | class_decode (desc->bDeviceClass), | 370 | class_decode(desc->bDeviceClass), |
| 378 | desc->bDeviceSubClass, | 371 | desc->bDeviceSubClass, |
| 379 | desc->bDeviceProtocol, | 372 | desc->bDeviceProtocol, |
| 380 | desc->bMaxPacketSize0, | 373 | desc->bMaxPacketSize0, |
| @@ -391,12 +384,14 @@ static char *usb_dump_device_descriptor(char *start, char *end, const struct usb | |||
| 391 | /* | 384 | /* |
| 392 | * Dump the different strings that this device holds. | 385 | * Dump the different strings that this device holds. |
| 393 | */ | 386 | */ |
| 394 | static char *usb_dump_device_strings(char *start, char *end, struct usb_device *dev) | 387 | static char *usb_dump_device_strings(char *start, char *end, |
| 388 | struct usb_device *dev) | ||
| 395 | { | 389 | { |
| 396 | if (start > end) | 390 | if (start > end) |
| 397 | return start; | 391 | return start; |
| 398 | if (dev->manufacturer) | 392 | if (dev->manufacturer) |
| 399 | start += sprintf(start, format_string_manufacturer, dev->manufacturer); | 393 | start += sprintf(start, format_string_manufacturer, |
| 394 | dev->manufacturer); | ||
| 400 | if (start > end) | 395 | if (start > end) |
| 401 | goto out; | 396 | goto out; |
| 402 | if (dev->product) | 397 | if (dev->product) |
| @@ -405,7 +400,8 @@ static char *usb_dump_device_strings(char *start, char *end, struct usb_device * | |||
| 405 | goto out; | 400 | goto out; |
| 406 | #ifdef ALLOW_SERIAL_NUMBER | 401 | #ifdef ALLOW_SERIAL_NUMBER |
| 407 | if (dev->serial) | 402 | if (dev->serial) |
| 408 | start += sprintf(start, format_string_serialnumber, dev->serial); | 403 | start += sprintf(start, format_string_serialnumber, |
| 404 | dev->serial); | ||
| 409 | #endif | 405 | #endif |
| 410 | out: | 406 | out: |
| 411 | return start; | 407 | return start; |
| @@ -417,12 +413,12 @@ static char *usb_dump_desc(char *start, char *end, struct usb_device *dev) | |||
| 417 | 413 | ||
| 418 | if (start > end) | 414 | if (start > end) |
| 419 | return start; | 415 | return start; |
| 420 | 416 | ||
| 421 | start = usb_dump_device_descriptor(start, end, &dev->descriptor); | 417 | start = usb_dump_device_descriptor(start, end, &dev->descriptor); |
| 422 | 418 | ||
| 423 | if (start > end) | 419 | if (start > end) |
| 424 | return start; | 420 | return start; |
| 425 | 421 | ||
| 426 | start = usb_dump_device_strings(start, end, dev); | 422 | start = usb_dump_device_strings(start, end, dev); |
| 427 | 423 | ||
| 428 | for (i = 0; i < dev->descriptor.bNumConfigurations; i++) { | 424 | for (i = 0; i < dev->descriptor.bNumConfigurations; i++) { |
| @@ -439,7 +435,8 @@ static char *usb_dump_desc(char *start, char *end, struct usb_device *dev) | |||
| 439 | 435 | ||
| 440 | #ifdef PROC_EXTRA /* TBD: may want to add this code later */ | 436 | #ifdef PROC_EXTRA /* TBD: may want to add this code later */ |
| 441 | 437 | ||
| 442 | static char *usb_dump_hub_descriptor(char *start, char *end, const struct usb_hub_descriptor * desc) | 438 | static char *usb_dump_hub_descriptor(char *start, char *end, |
| 439 | const struct usb_hub_descriptor *desc) | ||
| 443 | { | 440 | { |
| 444 | int leng = USB_DT_HUB_NONVAR_SIZE; | 441 | int leng = USB_DT_HUB_NONVAR_SIZE; |
| 445 | unsigned char *ptr = (unsigned char *)desc; | 442 | unsigned char *ptr = (unsigned char *)desc; |
| @@ -455,13 +452,16 @@ static char *usb_dump_hub_descriptor(char *start, char *end, const struct usb_hu | |||
| 455 | return start; | 452 | return start; |
| 456 | } | 453 | } |
| 457 | 454 | ||
| 458 | static char *usb_dump_string(char *start, char *end, const struct usb_device *dev, char *id, int index) | 455 | static char *usb_dump_string(char *start, char *end, |
| 456 | const struct usb_device *dev, char *id, int index) | ||
| 459 | { | 457 | { |
| 460 | if (start > end) | 458 | if (start > end) |
| 461 | return start; | 459 | return start; |
| 462 | start += sprintf(start, "Interface:"); | 460 | start += sprintf(start, "Interface:"); |
| 463 | if (index <= dev->maxstring && dev->stringindex && dev->stringindex[index]) | 461 | if (index <= dev->maxstring && dev->stringindex && |
| 464 | start += sprintf(start, "%s: %.100s ", id, dev->stringindex[index]); | 462 | dev->stringindex[index]) |
| 463 | start += sprintf(start, "%s: %.100s ", id, | ||
| 464 | dev->stringindex[index]); | ||
| 465 | return start; | 465 | return start; |
| 466 | } | 466 | } |
| 467 | 467 | ||
| @@ -476,8 +476,10 @@ static char *usb_dump_string(char *start, char *end, const struct usb_device *de | |||
| 476 | * file_offset - the offset into the devices file on completion | 476 | * file_offset - the offset into the devices file on completion |
| 477 | * The caller must own the device lock. | 477 | * The caller must own the device lock. |
| 478 | */ | 478 | */ |
| 479 | static ssize_t usb_device_dump(char __user **buffer, size_t *nbytes, loff_t *skip_bytes, loff_t *file_offset, | 479 | static ssize_t usb_device_dump(char __user **buffer, size_t *nbytes, |
| 480 | struct usb_device *usbdev, struct usb_bus *bus, int level, int index, int count) | 480 | loff_t *skip_bytes, loff_t *file_offset, |
| 481 | struct usb_device *usbdev, struct usb_bus *bus, | ||
| 482 | int level, int index, int count) | ||
| 481 | { | 483 | { |
| 482 | int chix; | 484 | int chix; |
| 483 | int ret, cnt = 0; | 485 | int ret, cnt = 0; |
| @@ -485,17 +487,19 @@ static ssize_t usb_device_dump(char __user **buffer, size_t *nbytes, loff_t *ski | |||
| 485 | char *pages_start, *data_end, *speed; | 487 | char *pages_start, *data_end, *speed; |
| 486 | unsigned int length; | 488 | unsigned int length; |
| 487 | ssize_t total_written = 0; | 489 | ssize_t total_written = 0; |
| 488 | 490 | ||
| 489 | /* don't bother with anything else if we're not writing any data */ | 491 | /* don't bother with anything else if we're not writing any data */ |
| 490 | if (*nbytes <= 0) | 492 | if (*nbytes <= 0) |
| 491 | return 0; | 493 | return 0; |
| 492 | 494 | ||
| 493 | if (level > MAX_TOPO_LEVEL) | 495 | if (level > MAX_TOPO_LEVEL) |
| 494 | return 0; | 496 | return 0; |
| 495 | /* allocate 2^1 pages = 8K (on i386); should be more than enough for one device */ | 497 | /* allocate 2^1 pages = 8K (on i386); |
| 496 | if (!(pages_start = (char*) __get_free_pages(GFP_KERNEL,1))) | 498 | * should be more than enough for one device */ |
| 497 | return -ENOMEM; | 499 | pages_start = (char *)__get_free_pages(GFP_KERNEL, 1); |
| 498 | 500 | if (!pages_start) | |
| 501 | return -ENOMEM; | ||
| 502 | |||
| 499 | if (usbdev->parent && usbdev->parent->devnum != -1) | 503 | if (usbdev->parent && usbdev->parent->devnum != -1) |
| 500 | parent_devnum = usbdev->parent->devnum; | 504 | parent_devnum = usbdev->parent->devnum; |
| 501 | /* | 505 | /* |
| @@ -541,15 +545,16 @@ static ssize_t usb_device_dump(char __user **buffer, size_t *nbytes, loff_t *ski | |||
| 541 | bus->bandwidth_allocated, max, | 545 | bus->bandwidth_allocated, max, |
| 542 | (100 * bus->bandwidth_allocated + max / 2) | 546 | (100 * bus->bandwidth_allocated + max / 2) |
| 543 | / max, | 547 | / max, |
| 544 | bus->bandwidth_int_reqs, | 548 | bus->bandwidth_int_reqs, |
| 545 | bus->bandwidth_isoc_reqs); | 549 | bus->bandwidth_isoc_reqs); |
| 546 | 550 | ||
| 547 | } | 551 | } |
| 548 | data_end = usb_dump_desc(data_end, pages_start + (2 * PAGE_SIZE) - 256, usbdev); | 552 | data_end = usb_dump_desc(data_end, pages_start + (2 * PAGE_SIZE) - 256, |
| 549 | 553 | usbdev); | |
| 554 | |||
| 550 | if (data_end > (pages_start + (2 * PAGE_SIZE) - 256)) | 555 | if (data_end > (pages_start + (2 * PAGE_SIZE) - 256)) |
| 551 | data_end += sprintf(data_end, "(truncated)\n"); | 556 | data_end += sprintf(data_end, "(truncated)\n"); |
| 552 | 557 | ||
| 553 | length = data_end - pages_start; | 558 | length = data_end - pages_start; |
| 554 | /* if we can start copying some data to the user */ | 559 | /* if we can start copying some data to the user */ |
| 555 | if (length > *skip_bytes) { | 560 | if (length > *skip_bytes) { |
| @@ -567,17 +572,18 @@ static ssize_t usb_device_dump(char __user **buffer, size_t *nbytes, loff_t *ski | |||
| 567 | *skip_bytes = 0; | 572 | *skip_bytes = 0; |
| 568 | } else | 573 | } else |
| 569 | *skip_bytes -= length; | 574 | *skip_bytes -= length; |
| 570 | 575 | ||
| 571 | free_pages((unsigned long)pages_start, 1); | 576 | free_pages((unsigned long)pages_start, 1); |
| 572 | 577 | ||
| 573 | /* Now look at all of this device's children. */ | 578 | /* Now look at all of this device's children. */ |
| 574 | for (chix = 0; chix < usbdev->maxchild; chix++) { | 579 | for (chix = 0; chix < usbdev->maxchild; chix++) { |
| 575 | struct usb_device *childdev = usbdev->children[chix]; | 580 | struct usb_device *childdev = usbdev->children[chix]; |
| 576 | 581 | ||
| 577 | if (childdev) { | 582 | if (childdev) { |
| 578 | usb_lock_device(childdev); | 583 | usb_lock_device(childdev); |
| 579 | ret = usb_device_dump(buffer, nbytes, skip_bytes, file_offset, childdev, | 584 | ret = usb_device_dump(buffer, nbytes, skip_bytes, |
| 580 | bus, level + 1, chix, ++cnt); | 585 | file_offset, childdev, bus, |
| 586 | level + 1, chix, ++cnt); | ||
| 581 | usb_unlock_device(childdev); | 587 | usb_unlock_device(childdev); |
| 582 | if (ret == -EFAULT) | 588 | if (ret == -EFAULT) |
| 583 | return total_written; | 589 | return total_written; |
| @@ -587,7 +593,8 @@ static ssize_t usb_device_dump(char __user **buffer, size_t *nbytes, loff_t *ski | |||
| 587 | return total_written; | 593 | return total_written; |
| 588 | } | 594 | } |
| 589 | 595 | ||
| 590 | static ssize_t usb_device_read(struct file *file, char __user *buf, size_t nbytes, loff_t *ppos) | 596 | static ssize_t usb_device_read(struct file *file, char __user *buf, |
| 597 | size_t nbytes, loff_t *ppos) | ||
| 591 | { | 598 | { |
| 592 | struct usb_bus *bus; | 599 | struct usb_bus *bus; |
| 593 | ssize_t ret, total_written = 0; | 600 | ssize_t ret, total_written = 0; |
| @@ -607,7 +614,8 @@ static ssize_t usb_device_read(struct file *file, char __user *buf, size_t nbyte | |||
| 607 | if (!bus->root_hub) | 614 | if (!bus->root_hub) |
| 608 | continue; | 615 | continue; |
| 609 | usb_lock_device(bus->root_hub); | 616 | usb_lock_device(bus->root_hub); |
| 610 | ret = usb_device_dump(&buf, &nbytes, &skip_bytes, ppos, bus->root_hub, bus, 0, 0, 0); | 617 | ret = usb_device_dump(&buf, &nbytes, &skip_bytes, ppos, |
| 618 | bus->root_hub, bus, 0, 0, 0); | ||
| 611 | usb_unlock_device(bus->root_hub); | 619 | usb_unlock_device(bus->root_hub); |
| 612 | if (ret < 0) { | 620 | if (ret < 0) { |
| 613 | mutex_unlock(&usb_bus_list_lock); | 621 | mutex_unlock(&usb_bus_list_lock); |
| @@ -620,7 +628,8 @@ static ssize_t usb_device_read(struct file *file, char __user *buf, size_t nbyte | |||
| 620 | } | 628 | } |
| 621 | 629 | ||
| 622 | /* Kernel lock for "lastev" protection */ | 630 | /* Kernel lock for "lastev" protection */ |
| 623 | static unsigned int usb_device_poll(struct file *file, struct poll_table_struct *wait) | 631 | static unsigned int usb_device_poll(struct file *file, |
| 632 | struct poll_table_struct *wait) | ||
| 624 | { | 633 | { |
| 625 | struct usb_device_status *st = file->private_data; | 634 | struct usb_device_status *st = file->private_data; |
| 626 | unsigned int mask = 0; | 635 | unsigned int mask = 0; |
| @@ -629,7 +638,8 @@ static unsigned int usb_device_poll(struct file *file, struct poll_table_struct | |||
| 629 | if (!st) { | 638 | if (!st) { |
| 630 | st = kmalloc(sizeof(struct usb_device_status), GFP_KERNEL); | 639 | st = kmalloc(sizeof(struct usb_device_status), GFP_KERNEL); |
| 631 | 640 | ||
| 632 | /* we may have dropped BKL - need to check for having lost the race */ | 641 | /* we may have dropped BKL - |
| 642 | * need to check for having lost the race */ | ||
| 633 | if (file->private_data) { | 643 | if (file->private_data) { |
| 634 | kfree(st); | 644 | kfree(st); |
| 635 | st = file->private_data; | 645 | st = file->private_data; |
| @@ -652,7 +662,7 @@ static unsigned int usb_device_poll(struct file *file, struct poll_table_struct | |||
| 652 | } | 662 | } |
| 653 | lost_race: | 663 | lost_race: |
| 654 | if (file->f_mode & FMODE_READ) | 664 | if (file->f_mode & FMODE_READ) |
| 655 | poll_wait(file, &deviceconndiscwq, wait); | 665 | poll_wait(file, &deviceconndiscwq, wait); |
| 656 | if (st->lastev != conndiscevcnt) | 666 | if (st->lastev != conndiscevcnt) |
| 657 | mask |= POLLIN; | 667 | mask |= POLLIN; |
| 658 | st->lastev = conndiscevcnt; | 668 | st->lastev = conndiscevcnt; |
| @@ -662,18 +672,18 @@ lost_race: | |||
| 662 | 672 | ||
| 663 | static int usb_device_open(struct inode *inode, struct file *file) | 673 | static int usb_device_open(struct inode *inode, struct file *file) |
| 664 | { | 674 | { |
| 665 | file->private_data = NULL; | 675 | file->private_data = NULL; |
| 666 | return 0; | 676 | return 0; |
| 667 | } | 677 | } |
| 668 | 678 | ||
| 669 | static int usb_device_release(struct inode *inode, struct file *file) | 679 | static int usb_device_release(struct inode *inode, struct file *file) |
| 670 | { | 680 | { |
| 671 | kfree(file->private_data); | 681 | kfree(file->private_data); |
| 672 | file->private_data = NULL; | 682 | file->private_data = NULL; |
| 673 | return 0; | 683 | return 0; |
| 674 | } | 684 | } |
| 675 | 685 | ||
| 676 | static loff_t usb_device_lseek(struct file * file, loff_t offset, int orig) | 686 | static loff_t usb_device_lseek(struct file *file, loff_t offset, int orig) |
| 677 | { | 687 | { |
| 678 | loff_t ret; | 688 | loff_t ret; |
| 679 | 689 | ||
