diff options
Diffstat (limited to 'drivers/usb/core/hcd.c')
| -rw-r--r-- | drivers/usb/core/hcd.c | 33 |
1 files changed, 13 insertions, 20 deletions
diff --git a/drivers/usb/core/hcd.c b/drivers/usb/core/hcd.c index 3c711db55d86..81fa8506825d 100644 --- a/drivers/usb/core/hcd.c +++ b/drivers/usb/core/hcd.c | |||
| @@ -279,9 +279,9 @@ static const u8 hs_rh_config_descriptor [] = { | |||
| 279 | * helper routine for returning string descriptors in UTF-16LE | 279 | * helper routine for returning string descriptors in UTF-16LE |
| 280 | * input can actually be ISO-8859-1; ASCII is its 7-bit subset | 280 | * input can actually be ISO-8859-1; ASCII is its 7-bit subset |
| 281 | */ | 281 | */ |
| 282 | static int ascii2utf (char *s, u8 *utf, int utfmax) | 282 | static unsigned ascii2utf(char *s, u8 *utf, int utfmax) |
| 283 | { | 283 | { |
| 284 | int retval; | 284 | unsigned retval; |
| 285 | 285 | ||
| 286 | for (retval = 0; *s && utfmax > 1; utfmax -= 2, retval += 2) { | 286 | for (retval = 0; *s && utfmax > 1; utfmax -= 2, retval += 2) { |
| 287 | *utf++ = *s++; | 287 | *utf++ = *s++; |
| @@ -304,19 +304,15 @@ static int ascii2utf (char *s, u8 *utf, int utfmax) | |||
| 304 | * Produces either a manufacturer, product or serial number string for the | 304 | * Produces either a manufacturer, product or serial number string for the |
| 305 | * virtual root hub device. | 305 | * virtual root hub device. |
| 306 | */ | 306 | */ |
| 307 | static int rh_string ( | 307 | static unsigned rh_string(int id, struct usb_hcd *hcd, u8 *data, unsigned len) |
| 308 | int id, | 308 | { |
| 309 | struct usb_hcd *hcd, | ||
| 310 | u8 *data, | ||
| 311 | int len | ||
| 312 | ) { | ||
| 313 | char buf [100]; | 309 | char buf [100]; |
| 314 | 310 | ||
| 315 | // language ids | 311 | // language ids |
| 316 | if (id == 0) { | 312 | if (id == 0) { |
| 317 | buf[0] = 4; buf[1] = 3; /* 4 bytes string data */ | 313 | buf[0] = 4; buf[1] = 3; /* 4 bytes string data */ |
| 318 | buf[2] = 0x09; buf[3] = 0x04; /* MSFT-speak for "en-us" */ | 314 | buf[2] = 0x09; buf[3] = 0x04; /* MSFT-speak for "en-us" */ |
| 319 | len = min (len, 4); | 315 | len = min_t(unsigned, len, 4); |
| 320 | memcpy (data, buf, len); | 316 | memcpy (data, buf, len); |
| 321 | return len; | 317 | return len; |
| 322 | 318 | ||
| @@ -332,10 +328,7 @@ static int rh_string ( | |||
| 332 | } else if (id == 3) { | 328 | } else if (id == 3) { |
| 333 | snprintf (buf, sizeof buf, "%s %s %s", init_utsname()->sysname, | 329 | snprintf (buf, sizeof buf, "%s %s %s", init_utsname()->sysname, |
| 334 | init_utsname()->release, hcd->driver->description); | 330 | init_utsname()->release, hcd->driver->description); |
| 335 | 331 | } | |
| 336 | // unsupported IDs --> "protocol stall" | ||
| 337 | } else | ||
| 338 | return -EPIPE; | ||
| 339 | 332 | ||
| 340 | switch (len) { /* All cases fall through */ | 333 | switch (len) { /* All cases fall through */ |
| 341 | default: | 334 | default: |
| @@ -360,9 +353,8 @@ static int rh_call_control (struct usb_hcd *hcd, struct urb *urb) | |||
| 360 | u8 tbuf [sizeof (struct usb_hub_descriptor)] | 353 | u8 tbuf [sizeof (struct usb_hub_descriptor)] |
| 361 | __attribute__((aligned(4))); | 354 | __attribute__((aligned(4))); |
| 362 | const u8 *bufp = tbuf; | 355 | const u8 *bufp = tbuf; |
| 363 | int len = 0; | 356 | unsigned len = 0; |
| 364 | int status; | 357 | int status; |
| 365 | int n; | ||
| 366 | u8 patch_wakeup = 0; | 358 | u8 patch_wakeup = 0; |
| 367 | u8 patch_protocol = 0; | 359 | u8 patch_protocol = 0; |
| 368 | 360 | ||
| @@ -456,10 +448,11 @@ static int rh_call_control (struct usb_hcd *hcd, struct urb *urb) | |||
| 456 | patch_wakeup = 1; | 448 | patch_wakeup = 1; |
| 457 | break; | 449 | break; |
| 458 | case USB_DT_STRING << 8: | 450 | case USB_DT_STRING << 8: |
| 459 | n = rh_string (wValue & 0xff, hcd, ubuf, wLength); | 451 | if ((wValue & 0xff) < 4) |
| 460 | if (n < 0) | 452 | urb->actual_length = rh_string(wValue & 0xff, |
| 453 | hcd, ubuf, wLength); | ||
| 454 | else /* unsupported IDs --> "protocol stall" */ | ||
| 461 | goto error; | 455 | goto error; |
| 462 | urb->actual_length = n; | ||
| 463 | break; | 456 | break; |
| 464 | default: | 457 | default: |
| 465 | goto error; | 458 | goto error; |
| @@ -629,7 +622,7 @@ static int rh_queue_status (struct usb_hcd *hcd, struct urb *urb) | |||
| 629 | { | 622 | { |
| 630 | int retval; | 623 | int retval; |
| 631 | unsigned long flags; | 624 | unsigned long flags; |
| 632 | int len = 1 + (urb->dev->maxchild / 8); | 625 | unsigned len = 1 + (urb->dev->maxchild / 8); |
| 633 | 626 | ||
| 634 | spin_lock_irqsave (&hcd_root_hub_lock, flags); | 627 | spin_lock_irqsave (&hcd_root_hub_lock, flags); |
| 635 | if (hcd->status_urb || urb->transfer_buffer_length < len) { | 628 | if (hcd->status_urb || urb->transfer_buffer_length < len) { |
| @@ -901,7 +894,7 @@ static int register_root_hub(struct usb_hcd *hcd) | |||
| 901 | 894 | ||
| 902 | mutex_lock(&usb_bus_list_lock); | 895 | mutex_lock(&usb_bus_list_lock); |
| 903 | 896 | ||
| 904 | usb_dev->ep0.desc.wMaxPacketSize = __constant_cpu_to_le16(64); | 897 | usb_dev->ep0.desc.wMaxPacketSize = cpu_to_le16(64); |
| 905 | retval = usb_get_device_descriptor(usb_dev, USB_DT_DEVICE_SIZE); | 898 | retval = usb_get_device_descriptor(usb_dev, USB_DT_DEVICE_SIZE); |
| 906 | if (retval != sizeof usb_dev->descriptor) { | 899 | if (retval != sizeof usb_dev->descriptor) { |
| 907 | mutex_unlock(&usb_bus_list_lock); | 900 | mutex_unlock(&usb_bus_list_lock); |
