aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/usb/dwc3/ep0.c7
-rw-r--r--drivers/usb/gadget/function/f_printer.c7
-rw-r--r--drivers/usb/gadget/udc/Kconfig1
-rw-r--r--drivers/usb/gadget/udc/core.c3
-rw-r--r--drivers/usb/gadget/udc/dummy_hcd.c9
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
273config USB_SNP_UDC_PLAT 273config 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 {