Merge tag 'usb-3.4-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb

Pull USB fixes from Greg Kroah-Hartman:
"Here are a number of small USB fixes for 3.4-rc5.

Nothing major, as before, some USB gadget fixes. There's a crash fix
for a number of ASUS laptops on resume that had been reported by a
number of different people. We think the fix might also pertain to
other machines, as this was a BIOS bug, and they seem to travel to
different models and manufacturers quite easily. Other than that,
some other reported problems fixed as well."

* tag 'usb-3.4-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb:
usb: gadget: udc-core: fix incompatibility with dummy-hcd
usb: gadget: udc-core: fix wrong call order
USB: cdc-wdm: fix race leading leading to memory corruption
USB: EHCI: fix crash during suspend on ASUS computers
usb gadget: uvc: uvc_request_data::length field must be signed
usb: gadget: dummy: do not call pullup() on udc_stop()
usb: musb: davinci.c: add missing unregister
usb: musb: drop __deprecated flag
USB: gadget: storage gadgets send wrong error code for unknown commands
usb: otg: gpio_vbus: Add otg transceiver events and notifiers

Changed files
+47 -12
drivers
include
linux
usb
+5 -2
drivers/usb/class/cdc-wdm.c
··· 157 157 spin_lock(&desc->iuspin); 158 158 desc->werr = urb->status; 159 159 spin_unlock(&desc->iuspin); 160 - clear_bit(WDM_IN_USE, &desc->flags); 161 160 kfree(desc->outbuf); 161 + desc->outbuf = NULL; 162 + clear_bit(WDM_IN_USE, &desc->flags); 162 163 wake_up(&desc->wait); 163 164 } 164 165 ··· 339 338 if (we < 0) 340 339 return -EIO; 341 340 342 - desc->outbuf = buf = kmalloc(count, GFP_KERNEL); 341 + buf = kmalloc(count, GFP_KERNEL); 343 342 if (!buf) { 344 343 rv = -ENOMEM; 345 344 goto outnl; ··· 407 406 req->wIndex = desc->inum; 408 407 req->wLength = cpu_to_le16(count); 409 408 set_bit(WDM_IN_USE, &desc->flags); 409 + desc->outbuf = buf; 410 410 411 411 rv = usb_submit_urb(desc->command, GFP_KERNEL); 412 412 if (rv < 0) { 413 413 kfree(buf); 414 + desc->outbuf = NULL; 414 415 clear_bit(WDM_IN_USE, &desc->flags); 415 416 dev_err(&desc->intf->dev, "Tx URB error: %d\n", rv); 416 417 } else {
+9
drivers/usb/core/hcd-pci.c
··· 493 493 494 494 pci_save_state(pci_dev); 495 495 496 + /* 497 + * Some systems crash if an EHCI controller is in D3 during 498 + * a sleep transition. We have to leave such controllers in D0. 499 + */ 500 + if (hcd->broken_pci_sleep) { 501 + dev_dbg(dev, "Staying in PCI D0\n"); 502 + return retval; 503 + } 504 + 496 505 /* If the root hub is dead rather than suspended, disallow remote 497 506 * wakeup. usb_hc_died() should ensure that both hosts are marked as 498 507 * dying, so we only need to check the primary roothub.
-1
drivers/usb/gadget/dummy_hcd.c
··· 927 927 928 928 dum->driver = NULL; 929 929 930 - dummy_pullup(&dum->gadget, 0); 931 930 return 0; 932 931 } 933 932
+1 -1
drivers/usb/gadget/f_mass_storage.c
··· 2189 2189 common->data_size_from_cmnd = 0; 2190 2190 sprintf(unknown, "Unknown x%02x", common->cmnd[0]); 2191 2191 reply = check_command(common, common->cmnd_size, 2192 - DATA_DIR_UNKNOWN, 0xff, 0, unknown); 2192 + DATA_DIR_UNKNOWN, ~0, 0, unknown); 2193 2193 if (reply == 0) { 2194 2194 common->curlun->sense_data = SS_INVALID_COMMAND; 2195 2195 reply = -EINVAL;
+1 -1
drivers/usb/gadget/file_storage.c
··· 2579 2579 fsg->data_size_from_cmnd = 0; 2580 2580 sprintf(unknown, "Unknown x%02x", fsg->cmnd[0]); 2581 2581 if ((reply = check_command(fsg, fsg->cmnd_size, 2582 - DATA_DIR_UNKNOWN, 0xff, 0, unknown)) == 0) { 2582 + DATA_DIR_UNKNOWN, ~0, 0, unknown)) == 0) { 2583 2583 fsg->curlun->sense_data = SS_INVALID_COMMAND; 2584 2584 reply = -EINVAL; 2585 2585 }
+2 -2
drivers/usb/gadget/udc-core.c
··· 263 263 264 264 if (udc_is_newstyle(udc)) { 265 265 udc->driver->disconnect(udc->gadget); 266 - udc->driver->unbind(udc->gadget); 267 266 usb_gadget_disconnect(udc->gadget); 267 + udc->driver->unbind(udc->gadget); 268 268 usb_gadget_udc_stop(udc->gadget, udc->driver); 269 269 } else { 270 270 usb_gadget_stop(udc->gadget, udc->driver); ··· 415 415 usb_gadget_udc_start(udc->gadget, udc->driver); 416 416 usb_gadget_connect(udc->gadget); 417 417 } else if (sysfs_streq(buf, "disconnect")) { 418 + usb_gadget_disconnect(udc->gadget); 418 419 if (udc_is_newstyle(udc)) 419 420 usb_gadget_udc_stop(udc->gadget, udc->driver); 420 - usb_gadget_disconnect(udc->gadget); 421 421 } else { 422 422 dev_err(dev, "unsupported command '%s'\n", buf); 423 423 return -EINVAL;
+1 -1
drivers/usb/gadget/uvc.h
··· 28 28 29 29 struct uvc_request_data 30 30 { 31 - unsigned int length; 31 + __s32 length; 32 32 __u8 data[60]; 33 33 }; 34 34
+1 -1
drivers/usb/gadget/uvc_v4l2.c
··· 39 39 if (data->length < 0) 40 40 return usb_ep_set_halt(cdev->gadget->ep0); 41 41 42 - req->length = min(uvc->event_length, data->length); 42 + req->length = min_t(unsigned int, uvc->event_length, data->length); 43 43 req->zero = data->length < uvc->event_length; 44 44 req->dma = DMA_ADDR_INVALID; 45 45
+8
drivers/usb/host/ehci-pci.c
··· 144 144 hcd->has_tt = 1; 145 145 tdi_reset(ehci); 146 146 } 147 + if (pdev->subsystem_vendor == PCI_VENDOR_ID_ASUSTEK) { 148 + /* EHCI #1 or #2 on 6 Series/C200 Series chipset */ 149 + if (pdev->device == 0x1c26 || pdev->device == 0x1c2d) { 150 + ehci_info(ehci, "broken D3 during system sleep on ASUS\n"); 151 + hcd->broken_pci_sleep = 1; 152 + device_set_wakeup_capable(&pdev->dev, false); 153 + } 154 + } 147 155 break; 148 156 case PCI_VENDOR_ID_TDI: 149 157 if (pdev->device == PCI_DEVICE_ID_TDI_EHCI) {
+2 -1
drivers/usb/musb/davinci.c
··· 386 386 usb_nop_xceiv_register(); 387 387 musb->xceiv = usb_get_transceiver(); 388 388 if (!musb->xceiv) 389 - return -ENODEV; 389 + goto unregister; 390 390 391 391 musb->mregs += DAVINCI_BASE_OFFSET; 392 392 ··· 444 444 445 445 fail: 446 446 usb_put_transceiver(musb->xceiv); 447 + unregister: 447 448 usb_nop_xceiv_unregister(); 448 449 return -ENODEV; 449 450 }
+1 -1
drivers/usb/musb/musb_core.h
··· 449 449 * We added this flag to forcefully disable double 450 450 * buffering until we get it working. 451 451 */ 452 - unsigned double_buffer_not_ok:1 __deprecated; 452 + unsigned double_buffer_not_ok:1; 453 453 454 454 struct musb_hdrc_config *config; 455 455
+14 -1
drivers/usb/otg/gpio_vbus.c
··· 96 96 struct gpio_vbus_data *gpio_vbus = 97 97 container_of(work, struct gpio_vbus_data, work); 98 98 struct gpio_vbus_mach_info *pdata = gpio_vbus->dev->platform_data; 99 - int gpio; 99 + int gpio, status; 100 100 101 101 if (!gpio_vbus->phy.otg->gadget) 102 102 return; ··· 108 108 */ 109 109 gpio = pdata->gpio_pullup; 110 110 if (is_vbus_powered(pdata)) { 111 + status = USB_EVENT_VBUS; 111 112 gpio_vbus->phy.state = OTG_STATE_B_PERIPHERAL; 113 + gpio_vbus->phy.last_event = status; 112 114 usb_gadget_vbus_connect(gpio_vbus->phy.otg->gadget); 113 115 114 116 /* drawing a "unit load" is *always* OK, except for OTG */ ··· 119 117 /* optionally enable D+ pullup */ 120 118 if (gpio_is_valid(gpio)) 121 119 gpio_set_value(gpio, !pdata->gpio_pullup_inverted); 120 + 121 + atomic_notifier_call_chain(&gpio_vbus->phy.notifier, 122 + status, gpio_vbus->phy.otg->gadget); 122 123 } else { 123 124 /* optionally disable D+ pullup */ 124 125 if (gpio_is_valid(gpio)) ··· 130 125 set_vbus_draw(gpio_vbus, 0); 131 126 132 127 usb_gadget_vbus_disconnect(gpio_vbus->phy.otg->gadget); 128 + status = USB_EVENT_NONE; 133 129 gpio_vbus->phy.state = OTG_STATE_B_IDLE; 130 + gpio_vbus->phy.last_event = status; 131 + 132 + atomic_notifier_call_chain(&gpio_vbus->phy.notifier, 133 + status, gpio_vbus->phy.otg->gadget); 134 134 } 135 135 } 136 136 ··· 297 287 irq, err); 298 288 goto err_irq; 299 289 } 290 + 291 + ATOMIC_INIT_NOTIFIER_HEAD(&gpio_vbus->phy.notifier); 292 + 300 293 INIT_WORK(&gpio_vbus->work, gpio_vbus_work); 301 294 302 295 gpio_vbus->vbus_draw = regulator_get(&pdev->dev, "vbus_draw");
+2
include/linux/usb/hcd.h
··· 126 126 unsigned wireless:1; /* Wireless USB HCD */ 127 127 unsigned authorized_default:1; 128 128 unsigned has_tt:1; /* Integrated TT in root hub */ 129 + unsigned broken_pci_sleep:1; /* Don't put the 130 + controller in PCI-D3 for system sleep */ 129 131 130 132 unsigned int irq; /* irq allocated */ 131 133 void __iomem *regs; /* device memory/io */