diff options
| -rw-r--r-- | drivers/usb/dwc3/ep0.c | 7 | ||||
| -rw-r--r-- | drivers/usb/gadget/function/f_printer.c | 7 | ||||
| -rw-r--r-- | drivers/usb/gadget/udc/Kconfig | 1 | ||||
| -rw-r--r-- | drivers/usb/gadget/udc/core.c | 3 | ||||
| -rw-r--r-- | drivers/usb/gadget/udc/dummy_hcd.c | 9 |
5 files changed, 19 insertions, 8 deletions
diff --git a/drivers/usb/dwc3/ep0.c b/drivers/usb/dwc3/ep0.c index 827e376bfa97..75e6cb044eb2 100644 --- a/drivers/usb/dwc3/ep0.c +++ b/drivers/usb/dwc3/ep0.c | |||
| @@ -990,6 +990,8 @@ static void __dwc3_ep0_do_control_data(struct dwc3 *dwc, | |||
| 990 | DWC3_TRBCTL_CONTROL_DATA, | 990 | DWC3_TRBCTL_CONTROL_DATA, |
| 991 | true); | 991 | true); |
| 992 | 992 | ||
| 993 | req->trb = &dwc->ep0_trb[dep->trb_enqueue - 1]; | ||
| 994 | |||
| 993 | /* Now prepare one extra TRB to align transfer size */ | 995 | /* Now prepare one extra TRB to align transfer size */ |
| 994 | dwc3_ep0_prepare_one_trb(dep, dwc->bounce_addr, | 996 | dwc3_ep0_prepare_one_trb(dep, dwc->bounce_addr, |
| 995 | maxpacket - rem, | 997 | maxpacket - rem, |
| @@ -1015,6 +1017,8 @@ static void __dwc3_ep0_do_control_data(struct dwc3 *dwc, | |||
| 1015 | DWC3_TRBCTL_CONTROL_DATA, | 1017 | DWC3_TRBCTL_CONTROL_DATA, |
| 1016 | true); | 1018 | true); |
| 1017 | 1019 | ||
| 1020 | req->trb = &dwc->ep0_trb[dep->trb_enqueue - 1]; | ||
| 1021 | |||
| 1018 | /* Now prepare one extra TRB to align transfer size */ | 1022 | /* Now prepare one extra TRB to align transfer size */ |
| 1019 | dwc3_ep0_prepare_one_trb(dep, dwc->bounce_addr, | 1023 | dwc3_ep0_prepare_one_trb(dep, dwc->bounce_addr, |
| 1020 | 0, DWC3_TRBCTL_CONTROL_DATA, | 1024 | 0, DWC3_TRBCTL_CONTROL_DATA, |
| @@ -1029,6 +1033,9 @@ static void __dwc3_ep0_do_control_data(struct dwc3 *dwc, | |||
| 1029 | dwc3_ep0_prepare_one_trb(dep, req->request.dma, | 1033 | dwc3_ep0_prepare_one_trb(dep, req->request.dma, |
| 1030 | req->request.length, DWC3_TRBCTL_CONTROL_DATA, | 1034 | req->request.length, DWC3_TRBCTL_CONTROL_DATA, |
| 1031 | false); | 1035 | false); |
| 1036 | |||
| 1037 | req->trb = &dwc->ep0_trb[dep->trb_enqueue]; | ||
| 1038 | |||
| 1032 | ret = dwc3_ep0_start_trans(dep); | 1039 | ret = dwc3_ep0_start_trans(dep); |
| 1033 | } | 1040 | } |
| 1034 | 1041 | ||
diff --git a/drivers/usb/gadget/function/f_printer.c b/drivers/usb/gadget/function/f_printer.c index 8df244fc9d80..ea0da35a44e2 100644 --- a/drivers/usb/gadget/function/f_printer.c +++ b/drivers/usb/gadget/function/f_printer.c | |||
| @@ -555,6 +555,7 @@ printer_write(struct file *fd, const char __user *buf, size_t len, loff_t *ptr) | |||
| 555 | size_t size; /* Amount of data in a TX request. */ | 555 | size_t size; /* Amount of data in a TX request. */ |
| 556 | size_t bytes_copied = 0; | 556 | size_t bytes_copied = 0; |
| 557 | struct usb_request *req; | 557 | struct usb_request *req; |
| 558 | int value; | ||
| 558 | 559 | ||
| 559 | DBG(dev, "printer_write trying to send %d bytes\n", (int)len); | 560 | DBG(dev, "printer_write trying to send %d bytes\n", (int)len); |
| 560 | 561 | ||
| @@ -634,7 +635,11 @@ printer_write(struct file *fd, const char __user *buf, size_t len, loff_t *ptr) | |||
| 634 | return -EAGAIN; | 635 | return -EAGAIN; |
| 635 | } | 636 | } |
| 636 | 637 | ||
| 637 | if (usb_ep_queue(dev->in_ep, req, GFP_ATOMIC)) { | 638 | /* here, we unlock, and only unlock, to avoid deadlock. */ |
| 639 | spin_unlock(&dev->lock); | ||
| 640 | value = usb_ep_queue(dev->in_ep, req, GFP_ATOMIC); | ||
| 641 | spin_lock(&dev->lock); | ||
| 642 | if (value) { | ||
| 638 | list_add(&req->list, &dev->tx_reqs); | 643 | list_add(&req->list, &dev->tx_reqs); |
| 639 | spin_unlock_irqrestore(&dev->lock, flags); | 644 | spin_unlock_irqrestore(&dev->lock, flags); |
| 640 | mutex_unlock(&dev->lock_printer_io); | 645 | mutex_unlock(&dev->lock_printer_io); |
diff --git a/drivers/usb/gadget/udc/Kconfig b/drivers/usb/gadget/udc/Kconfig index 7cd5c969fcbe..1e9567091d86 100644 --- a/drivers/usb/gadget/udc/Kconfig +++ b/drivers/usb/gadget/udc/Kconfig | |||
| @@ -273,6 +273,7 @@ config USB_SNP_CORE | |||
| 273 | config USB_SNP_UDC_PLAT | 273 | config USB_SNP_UDC_PLAT |
| 274 | tristate "Synopsys USB 2.0 Device controller" | 274 | tristate "Synopsys USB 2.0 Device controller" |
| 275 | depends on USB_GADGET && OF && HAS_DMA | 275 | depends on USB_GADGET && OF && HAS_DMA |
| 276 | depends on EXTCON || EXTCON=n | ||
| 276 | select USB_GADGET_DUALSPEED | 277 | select USB_GADGET_DUALSPEED |
| 277 | select USB_SNP_CORE | 278 | select USB_SNP_CORE |
| 278 | default ARCH_BCM_IPROC | 279 | default ARCH_BCM_IPROC |
diff --git a/drivers/usb/gadget/udc/core.c b/drivers/usb/gadget/udc/core.c index 75c51ca4ee0f..d41d07aae0ce 100644 --- a/drivers/usb/gadget/udc/core.c +++ b/drivers/usb/gadget/udc/core.c | |||
| @@ -1320,8 +1320,7 @@ static int udc_bind_to_driver(struct usb_udc *udc, struct usb_gadget_driver *dri | |||
| 1320 | udc->dev.driver = &driver->driver; | 1320 | udc->dev.driver = &driver->driver; |
| 1321 | udc->gadget->dev.driver = &driver->driver; | 1321 | udc->gadget->dev.driver = &driver->driver; |
| 1322 | 1322 | ||
| 1323 | if (driver->max_speed < udc->gadget->max_speed) | 1323 | usb_gadget_udc_set_speed(udc, driver->max_speed); |
| 1324 | usb_gadget_udc_set_speed(udc, driver->max_speed); | ||
| 1325 | 1324 | ||
| 1326 | ret = driver->bind(udc->gadget, driver); | 1325 | ret = driver->bind(udc->gadget, driver); |
| 1327 | if (ret) | 1326 | if (ret) |
diff --git a/drivers/usb/gadget/udc/dummy_hcd.c b/drivers/usb/gadget/udc/dummy_hcd.c index a030d7923d7d..b1e21b3be6e1 100644 --- a/drivers/usb/gadget/udc/dummy_hcd.c +++ b/drivers/usb/gadget/udc/dummy_hcd.c | |||
| @@ -375,11 +375,10 @@ static void set_link_state_by_speed(struct dummy_hcd *dum_hcd) | |||
| 375 | USB_PORT_STAT_CONNECTION) == 0) | 375 | USB_PORT_STAT_CONNECTION) == 0) |
| 376 | dum_hcd->port_status |= | 376 | dum_hcd->port_status |= |
| 377 | (USB_PORT_STAT_C_CONNECTION << 16); | 377 | (USB_PORT_STAT_C_CONNECTION << 16); |
| 378 | if ((dum_hcd->port_status & | 378 | if ((dum_hcd->port_status & USB_PORT_STAT_ENABLE) && |
| 379 | USB_PORT_STAT_ENABLE) == 1 && | 379 | (dum_hcd->port_status & |
| 380 | (dum_hcd->port_status & | 380 | USB_PORT_STAT_LINK_STATE) == USB_SS_PORT_LS_U0 && |
| 381 | USB_SS_PORT_LS_U0) == 1 && | 381 | dum_hcd->rh_state != DUMMY_RH_SUSPENDED) |
| 382 | dum_hcd->rh_state != DUMMY_RH_SUSPENDED) | ||
| 383 | dum_hcd->active = 1; | 382 | dum_hcd->active = 1; |
| 384 | } | 383 | } |
| 385 | } else { | 384 | } else { |
