diff options
author | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2017-03-09 04:12:54 -0500 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2017-03-09 04:12:54 -0500 |
commit | 88767cc1971d9b6d48698246e6c778e8b8d307cf (patch) | |
tree | 5697eef95418403861b2eb4f5e7b54534c1a6a60 | |
parent | c1ae3cfa0e89fa1a7ecc4c99031f5e9ae99d9201 (diff) | |
parent | 35b2719e72d375f3e32c819858165668d948d5f2 (diff) |
Merge tag 'fixes-for-v4.11-rc2' of git://git.kernel.org/pub/scm/linux/kernel/git/balbi/usb into usb-linus
Felipe writes:
usb: fixes for v4.11-rc2
dwc3 got a few fixes this time around:
Fixed an old bug where a broken endpoint descriptor passed in via
userspace through f_fs could prevent dwc3 from working because when
calculating max bursts, we could overwrite top 16 bits of a register.
Also fixed a bug on dwc3's ep_dequeue implementation which wasn't
properly incrementing our TRB dequeue pointer.
dwc3 on omap got two fixes: one for system suspend/resume and another
added a missing break statement on dwc3_omap_set_mailbox().
Apart from these, we have a set of smaller fixes including memory leak
in configfs, build warning fix in atmel udc and a revert of a broken
patch that went in during the merge window
-rw-r--r-- | drivers/usb/dwc3/dwc3-omap.c | 3 | ||||
-rw-r--r-- | drivers/usb/dwc3/gadget.c | 76 | ||||
-rw-r--r-- | drivers/usb/dwc3/gadget.h | 14 | ||||
-rw-r--r-- | drivers/usb/gadget/configfs.c | 1 | ||||
-rw-r--r-- | drivers/usb/gadget/function/f_fs.c | 17 | ||||
-rw-r--r-- | drivers/usb/gadget/function/f_uvc.c | 7 | ||||
-rw-r--r-- | drivers/usb/gadget/legacy/inode.c | 4 | ||||
-rw-r--r-- | drivers/usb/gadget/udc/atmel_usba_udc.c | 4 | ||||
-rw-r--r-- | drivers/usb/gadget/udc/dummy_hcd.c | 2 | ||||
-rw-r--r-- | drivers/usb/gadget/udc/net2280.c | 25 | ||||
-rw-r--r-- | drivers/usb/gadget/udc/pxa27x_udc.c | 5 |
11 files changed, 114 insertions, 44 deletions
diff --git a/drivers/usb/dwc3/dwc3-omap.c b/drivers/usb/dwc3/dwc3-omap.c index 2092e46b1380..f8d0747810e7 100644 --- a/drivers/usb/dwc3/dwc3-omap.c +++ b/drivers/usb/dwc3/dwc3-omap.c | |||
@@ -250,6 +250,7 @@ static void dwc3_omap_set_mailbox(struct dwc3_omap *omap, | |||
250 | val = dwc3_omap_read_utmi_ctrl(omap); | 250 | val = dwc3_omap_read_utmi_ctrl(omap); |
251 | val |= USBOTGSS_UTMI_OTG_CTRL_IDDIG; | 251 | val |= USBOTGSS_UTMI_OTG_CTRL_IDDIG; |
252 | dwc3_omap_write_utmi_ctrl(omap, val); | 252 | dwc3_omap_write_utmi_ctrl(omap, val); |
253 | break; | ||
253 | 254 | ||
254 | case OMAP_DWC3_VBUS_OFF: | 255 | case OMAP_DWC3_VBUS_OFF: |
255 | val = dwc3_omap_read_utmi_ctrl(omap); | 256 | val = dwc3_omap_read_utmi_ctrl(omap); |
@@ -392,7 +393,7 @@ static void dwc3_omap_set_utmi_mode(struct dwc3_omap *omap) | |||
392 | { | 393 | { |
393 | u32 reg; | 394 | u32 reg; |
394 | struct device_node *node = omap->dev->of_node; | 395 | struct device_node *node = omap->dev->of_node; |
395 | int utmi_mode = 0; | 396 | u32 utmi_mode = 0; |
396 | 397 | ||
397 | reg = dwc3_omap_read_utmi_ctrl(omap); | 398 | reg = dwc3_omap_read_utmi_ctrl(omap); |
398 | 399 | ||
diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c index 4db97ecae885..0d75158e43fe 100644 --- a/drivers/usb/dwc3/gadget.c +++ b/drivers/usb/dwc3/gadget.c | |||
@@ -1342,6 +1342,68 @@ static int dwc3_gadget_ep_dequeue(struct usb_ep *ep, | |||
1342 | if (r == req) { | 1342 | if (r == req) { |
1343 | /* wait until it is processed */ | 1343 | /* wait until it is processed */ |
1344 | dwc3_stop_active_transfer(dwc, dep->number, true); | 1344 | dwc3_stop_active_transfer(dwc, dep->number, true); |
1345 | |||
1346 | /* | ||
1347 | * If request was already started, this means we had to | ||
1348 | * stop the transfer. With that we also need to ignore | ||
1349 | * all TRBs used by the request, however TRBs can only | ||
1350 | * be modified after completion of END_TRANSFER | ||
1351 | * command. So what we do here is that we wait for | ||
1352 | * END_TRANSFER completion and only after that, we jump | ||
1353 | * over TRBs by clearing HWO and incrementing dequeue | ||
1354 | * pointer. | ||
1355 | * | ||
1356 | * Note that we have 2 possible types of transfers here: | ||
1357 | * | ||
1358 | * i) Linear buffer request | ||
1359 | * ii) SG-list based request | ||
1360 | * | ||
1361 | * SG-list based requests will have r->num_pending_sgs | ||
1362 | * set to a valid number (> 0). Linear requests, | ||
1363 | * normally use a single TRB. | ||
1364 | * | ||
1365 | * For each of these two cases, if r->unaligned flag is | ||
1366 | * set, one extra TRB has been used to align transfer | ||
1367 | * size to wMaxPacketSize. | ||
1368 | * | ||
1369 | * All of these cases need to be taken into | ||
1370 | * consideration so we don't mess up our TRB ring | ||
1371 | * pointers. | ||
1372 | */ | ||
1373 | wait_event_lock_irq(dep->wait_end_transfer, | ||
1374 | !(dep->flags & DWC3_EP_END_TRANSFER_PENDING), | ||
1375 | dwc->lock); | ||
1376 | |||
1377 | if (!r->trb) | ||
1378 | goto out1; | ||
1379 | |||
1380 | if (r->num_pending_sgs) { | ||
1381 | struct dwc3_trb *trb; | ||
1382 | int i = 0; | ||
1383 | |||
1384 | for (i = 0; i < r->num_pending_sgs; i++) { | ||
1385 | trb = r->trb + i; | ||
1386 | trb->ctrl &= ~DWC3_TRB_CTRL_HWO; | ||
1387 | dwc3_ep_inc_deq(dep); | ||
1388 | } | ||
1389 | |||
1390 | if (r->unaligned) { | ||
1391 | trb = r->trb + r->num_pending_sgs + 1; | ||
1392 | trb->ctrl &= ~DWC3_TRB_CTRL_HWO; | ||
1393 | dwc3_ep_inc_deq(dep); | ||
1394 | } | ||
1395 | } else { | ||
1396 | struct dwc3_trb *trb = r->trb; | ||
1397 | |||
1398 | trb->ctrl &= ~DWC3_TRB_CTRL_HWO; | ||
1399 | dwc3_ep_inc_deq(dep); | ||
1400 | |||
1401 | if (r->unaligned) { | ||
1402 | trb = r->trb + 1; | ||
1403 | trb->ctrl &= ~DWC3_TRB_CTRL_HWO; | ||
1404 | dwc3_ep_inc_deq(dep); | ||
1405 | } | ||
1406 | } | ||
1345 | goto out1; | 1407 | goto out1; |
1346 | } | 1408 | } |
1347 | dev_err(dwc->dev, "request %p was not queued to %s\n", | 1409 | dev_err(dwc->dev, "request %p was not queued to %s\n", |
@@ -1352,6 +1414,7 @@ static int dwc3_gadget_ep_dequeue(struct usb_ep *ep, | |||
1352 | 1414 | ||
1353 | out1: | 1415 | out1: |
1354 | /* giveback the request */ | 1416 | /* giveback the request */ |
1417 | dep->queued_requests--; | ||
1355 | dwc3_gadget_giveback(dep, req, -ECONNRESET); | 1418 | dwc3_gadget_giveback(dep, req, -ECONNRESET); |
1356 | 1419 | ||
1357 | out0: | 1420 | out0: |
@@ -2126,12 +2189,12 @@ static int __dwc3_cleanup_done_trbs(struct dwc3 *dwc, struct dwc3_ep *dep, | |||
2126 | return 1; | 2189 | return 1; |
2127 | } | 2190 | } |
2128 | 2191 | ||
2129 | if ((trb->ctrl & DWC3_TRB_CTRL_HWO) && status != -ESHUTDOWN) | ||
2130 | return 1; | ||
2131 | |||
2132 | count = trb->size & DWC3_TRB_SIZE_MASK; | 2192 | count = trb->size & DWC3_TRB_SIZE_MASK; |
2133 | req->remaining += count; | 2193 | req->remaining += count; |
2134 | 2194 | ||
2195 | if ((trb->ctrl & DWC3_TRB_CTRL_HWO) && status != -ESHUTDOWN) | ||
2196 | return 1; | ||
2197 | |||
2135 | if (dep->direction) { | 2198 | if (dep->direction) { |
2136 | if (count) { | 2199 | if (count) { |
2137 | trb_status = DWC3_TRB_SIZE_TRBSTS(trb->size); | 2200 | trb_status = DWC3_TRB_SIZE_TRBSTS(trb->size); |
@@ -3228,15 +3291,10 @@ void dwc3_gadget_exit(struct dwc3 *dwc) | |||
3228 | 3291 | ||
3229 | int dwc3_gadget_suspend(struct dwc3 *dwc) | 3292 | int dwc3_gadget_suspend(struct dwc3 *dwc) |
3230 | { | 3293 | { |
3231 | int ret; | ||
3232 | |||
3233 | if (!dwc->gadget_driver) | 3294 | if (!dwc->gadget_driver) |
3234 | return 0; | 3295 | return 0; |
3235 | 3296 | ||
3236 | ret = dwc3_gadget_run_stop(dwc, false, false); | 3297 | dwc3_gadget_run_stop(dwc, false, false); |
3237 | if (ret < 0) | ||
3238 | return ret; | ||
3239 | |||
3240 | dwc3_disconnect_gadget(dwc); | 3298 | dwc3_disconnect_gadget(dwc); |
3241 | __dwc3_gadget_stop(dwc); | 3299 | __dwc3_gadget_stop(dwc); |
3242 | 3300 | ||
diff --git a/drivers/usb/dwc3/gadget.h b/drivers/usb/dwc3/gadget.h index 3129bcf74d7d..265e223ab645 100644 --- a/drivers/usb/dwc3/gadget.h +++ b/drivers/usb/dwc3/gadget.h | |||
@@ -28,23 +28,23 @@ struct dwc3; | |||
28 | #define gadget_to_dwc(g) (container_of(g, struct dwc3, gadget)) | 28 | #define gadget_to_dwc(g) (container_of(g, struct dwc3, gadget)) |
29 | 29 | ||
30 | /* DEPCFG parameter 1 */ | 30 | /* DEPCFG parameter 1 */ |
31 | #define DWC3_DEPCFG_INT_NUM(n) ((n) << 0) | 31 | #define DWC3_DEPCFG_INT_NUM(n) (((n) & 0x1f) << 0) |
32 | #define DWC3_DEPCFG_XFER_COMPLETE_EN (1 << 8) | 32 | #define DWC3_DEPCFG_XFER_COMPLETE_EN (1 << 8) |
33 | #define DWC3_DEPCFG_XFER_IN_PROGRESS_EN (1 << 9) | 33 | #define DWC3_DEPCFG_XFER_IN_PROGRESS_EN (1 << 9) |
34 | #define DWC3_DEPCFG_XFER_NOT_READY_EN (1 << 10) | 34 | #define DWC3_DEPCFG_XFER_NOT_READY_EN (1 << 10) |
35 | #define DWC3_DEPCFG_FIFO_ERROR_EN (1 << 11) | 35 | #define DWC3_DEPCFG_FIFO_ERROR_EN (1 << 11) |
36 | #define DWC3_DEPCFG_STREAM_EVENT_EN (1 << 13) | 36 | #define DWC3_DEPCFG_STREAM_EVENT_EN (1 << 13) |
37 | #define DWC3_DEPCFG_BINTERVAL_M1(n) ((n) << 16) | 37 | #define DWC3_DEPCFG_BINTERVAL_M1(n) (((n) & 0xff) << 16) |
38 | #define DWC3_DEPCFG_STREAM_CAPABLE (1 << 24) | 38 | #define DWC3_DEPCFG_STREAM_CAPABLE (1 << 24) |
39 | #define DWC3_DEPCFG_EP_NUMBER(n) ((n) << 25) | 39 | #define DWC3_DEPCFG_EP_NUMBER(n) (((n) & 0x1f) << 25) |
40 | #define DWC3_DEPCFG_BULK_BASED (1 << 30) | 40 | #define DWC3_DEPCFG_BULK_BASED (1 << 30) |
41 | #define DWC3_DEPCFG_FIFO_BASED (1 << 31) | 41 | #define DWC3_DEPCFG_FIFO_BASED (1 << 31) |
42 | 42 | ||
43 | /* DEPCFG parameter 0 */ | 43 | /* DEPCFG parameter 0 */ |
44 | #define DWC3_DEPCFG_EP_TYPE(n) ((n) << 1) | 44 | #define DWC3_DEPCFG_EP_TYPE(n) (((n) & 0x3) << 1) |
45 | #define DWC3_DEPCFG_MAX_PACKET_SIZE(n) ((n) << 3) | 45 | #define DWC3_DEPCFG_MAX_PACKET_SIZE(n) (((n) & 0x7ff) << 3) |
46 | #define DWC3_DEPCFG_FIFO_NUMBER(n) ((n) << 17) | 46 | #define DWC3_DEPCFG_FIFO_NUMBER(n) (((n) & 0x1f) << 17) |
47 | #define DWC3_DEPCFG_BURST_SIZE(n) ((n) << 22) | 47 | #define DWC3_DEPCFG_BURST_SIZE(n) (((n) & 0xf) << 22) |
48 | #define DWC3_DEPCFG_DATA_SEQ_NUM(n) ((n) << 26) | 48 | #define DWC3_DEPCFG_DATA_SEQ_NUM(n) ((n) << 26) |
49 | /* This applies for core versions earlier than 1.94a */ | 49 | /* This applies for core versions earlier than 1.94a */ |
50 | #define DWC3_DEPCFG_IGN_SEQ_NUM (1 << 31) | 50 | #define DWC3_DEPCFG_IGN_SEQ_NUM (1 << 31) |
diff --git a/drivers/usb/gadget/configfs.c b/drivers/usb/gadget/configfs.c index 78c44979dde3..cbff3b02840d 100644 --- a/drivers/usb/gadget/configfs.c +++ b/drivers/usb/gadget/configfs.c | |||
@@ -269,6 +269,7 @@ static ssize_t gadget_dev_desc_UDC_store(struct config_item *item, | |||
269 | ret = unregister_gadget(gi); | 269 | ret = unregister_gadget(gi); |
270 | if (ret) | 270 | if (ret) |
271 | goto err; | 271 | goto err; |
272 | kfree(name); | ||
272 | } else { | 273 | } else { |
273 | if (gi->composite.gadget_driver.udc_name) { | 274 | if (gi->composite.gadget_driver.udc_name) { |
274 | ret = -EBUSY; | 275 | ret = -EBUSY; |
diff --git a/drivers/usb/gadget/function/f_fs.c b/drivers/usb/gadget/function/f_fs.c index a5b7cd615698..a0085571824d 100644 --- a/drivers/usb/gadget/function/f_fs.c +++ b/drivers/usb/gadget/function/f_fs.c | |||
@@ -1834,11 +1834,14 @@ static int ffs_func_eps_enable(struct ffs_function *func) | |||
1834 | spin_lock_irqsave(&func->ffs->eps_lock, flags); | 1834 | spin_lock_irqsave(&func->ffs->eps_lock, flags); |
1835 | while(count--) { | 1835 | while(count--) { |
1836 | struct usb_endpoint_descriptor *ds; | 1836 | struct usb_endpoint_descriptor *ds; |
1837 | struct usb_ss_ep_comp_descriptor *comp_desc = NULL; | ||
1838 | int needs_comp_desc = false; | ||
1837 | int desc_idx; | 1839 | int desc_idx; |
1838 | 1840 | ||
1839 | if (ffs->gadget->speed == USB_SPEED_SUPER) | 1841 | if (ffs->gadget->speed == USB_SPEED_SUPER) { |
1840 | desc_idx = 2; | 1842 | desc_idx = 2; |
1841 | else if (ffs->gadget->speed == USB_SPEED_HIGH) | 1843 | needs_comp_desc = true; |
1844 | } else if (ffs->gadget->speed == USB_SPEED_HIGH) | ||
1842 | desc_idx = 1; | 1845 | desc_idx = 1; |
1843 | else | 1846 | else |
1844 | desc_idx = 0; | 1847 | desc_idx = 0; |
@@ -1855,6 +1858,14 @@ static int ffs_func_eps_enable(struct ffs_function *func) | |||
1855 | 1858 | ||
1856 | ep->ep->driver_data = ep; | 1859 | ep->ep->driver_data = ep; |
1857 | ep->ep->desc = ds; | 1860 | ep->ep->desc = ds; |
1861 | |||
1862 | comp_desc = (struct usb_ss_ep_comp_descriptor *)(ds + | ||
1863 | USB_DT_ENDPOINT_SIZE); | ||
1864 | ep->ep->maxburst = comp_desc->bMaxBurst + 1; | ||
1865 | |||
1866 | if (needs_comp_desc) | ||
1867 | ep->ep->comp_desc = comp_desc; | ||
1868 | |||
1858 | ret = usb_ep_enable(ep->ep); | 1869 | ret = usb_ep_enable(ep->ep); |
1859 | if (likely(!ret)) { | 1870 | if (likely(!ret)) { |
1860 | epfile->ep = ep; | 1871 | epfile->ep = ep; |
@@ -2253,7 +2264,7 @@ static int __ffs_data_do_os_desc(enum ffs_os_desc_type type, | |||
2253 | 2264 | ||
2254 | if (len < sizeof(*d) || | 2265 | if (len < sizeof(*d) || |
2255 | d->bFirstInterfaceNumber >= ffs->interfaces_count || | 2266 | d->bFirstInterfaceNumber >= ffs->interfaces_count || |
2256 | d->Reserved1) | 2267 | !d->Reserved1) |
2257 | return -EINVAL; | 2268 | return -EINVAL; |
2258 | for (i = 0; i < ARRAY_SIZE(d->Reserved2); ++i) | 2269 | for (i = 0; i < ARRAY_SIZE(d->Reserved2); ++i) |
2259 | if (d->Reserved2[i]) | 2270 | if (d->Reserved2[i]) |
diff --git a/drivers/usb/gadget/function/f_uvc.c b/drivers/usb/gadget/function/f_uvc.c index 27ed51b5082f..29b41b5dee04 100644 --- a/drivers/usb/gadget/function/f_uvc.c +++ b/drivers/usb/gadget/function/f_uvc.c | |||
@@ -258,13 +258,6 @@ uvc_function_setup(struct usb_function *f, const struct usb_ctrlrequest *ctrl) | |||
258 | memcpy(&uvc_event->req, ctrl, sizeof(uvc_event->req)); | 258 | memcpy(&uvc_event->req, ctrl, sizeof(uvc_event->req)); |
259 | v4l2_event_queue(&uvc->vdev, &v4l2_event); | 259 | v4l2_event_queue(&uvc->vdev, &v4l2_event); |
260 | 260 | ||
261 | /* Pass additional setup data to userspace */ | ||
262 | if (uvc->event_setup_out && uvc->event_length) { | ||
263 | uvc->control_req->length = uvc->event_length; | ||
264 | return usb_ep_queue(uvc->func.config->cdev->gadget->ep0, | ||
265 | uvc->control_req, GFP_ATOMIC); | ||
266 | } | ||
267 | |||
268 | return 0; | 261 | return 0; |
269 | } | 262 | } |
270 | 263 | ||
diff --git a/drivers/usb/gadget/legacy/inode.c b/drivers/usb/gadget/legacy/inode.c index a2615d64d07c..0513dfa008e6 100644 --- a/drivers/usb/gadget/legacy/inode.c +++ b/drivers/usb/gadget/legacy/inode.c | |||
@@ -1782,8 +1782,10 @@ dev_config (struct file *fd, const char __user *buf, size_t len, loff_t *ptr) | |||
1782 | 1782 | ||
1783 | spin_lock_irq (&dev->lock); | 1783 | spin_lock_irq (&dev->lock); |
1784 | value = -EINVAL; | 1784 | value = -EINVAL; |
1785 | if (dev->buf) | 1785 | if (dev->buf) { |
1786 | kfree(kbuf); | ||
1786 | goto fail; | 1787 | goto fail; |
1788 | } | ||
1787 | dev->buf = kbuf; | 1789 | dev->buf = kbuf; |
1788 | 1790 | ||
1789 | /* full or low speed config */ | 1791 | /* full or low speed config */ |
diff --git a/drivers/usb/gadget/udc/atmel_usba_udc.c b/drivers/usb/gadget/udc/atmel_usba_udc.c index 11bbce28bc23..2035906b8ced 100644 --- a/drivers/usb/gadget/udc/atmel_usba_udc.c +++ b/drivers/usb/gadget/udc/atmel_usba_udc.c | |||
@@ -610,7 +610,7 @@ usba_ep_enable(struct usb_ep *_ep, const struct usb_endpoint_descriptor *desc) | |||
610 | { | 610 | { |
611 | struct usba_ep *ep = to_usba_ep(_ep); | 611 | struct usba_ep *ep = to_usba_ep(_ep); |
612 | struct usba_udc *udc = ep->udc; | 612 | struct usba_udc *udc = ep->udc; |
613 | unsigned long flags, ept_cfg, maxpacket; | 613 | unsigned long flags, maxpacket; |
614 | unsigned int nr_trans; | 614 | unsigned int nr_trans; |
615 | 615 | ||
616 | DBG(DBG_GADGET, "%s: ep_enable: desc=%p\n", ep->ep.name, desc); | 616 | DBG(DBG_GADGET, "%s: ep_enable: desc=%p\n", ep->ep.name, desc); |
@@ -630,7 +630,7 @@ usba_ep_enable(struct usb_ep *_ep, const struct usb_endpoint_descriptor *desc) | |||
630 | ep->is_in = 0; | 630 | ep->is_in = 0; |
631 | 631 | ||
632 | DBG(DBG_ERR, "%s: EPT_CFG = 0x%lx (maxpacket = %lu)\n", | 632 | DBG(DBG_ERR, "%s: EPT_CFG = 0x%lx (maxpacket = %lu)\n", |
633 | ep->ep.name, ept_cfg, maxpacket); | 633 | ep->ep.name, ep->ept_cfg, maxpacket); |
634 | 634 | ||
635 | if (usb_endpoint_dir_in(desc)) { | 635 | if (usb_endpoint_dir_in(desc)) { |
636 | ep->is_in = 1; | 636 | ep->is_in = 1; |
diff --git a/drivers/usb/gadget/udc/dummy_hcd.c b/drivers/usb/gadget/udc/dummy_hcd.c index c60abe3a68f9..8cabc5944d5f 100644 --- a/drivers/usb/gadget/udc/dummy_hcd.c +++ b/drivers/usb/gadget/udc/dummy_hcd.c | |||
@@ -1031,6 +1031,8 @@ static int dummy_udc_probe(struct platform_device *pdev) | |||
1031 | int rc; | 1031 | int rc; |
1032 | 1032 | ||
1033 | dum = *((void **)dev_get_platdata(&pdev->dev)); | 1033 | dum = *((void **)dev_get_platdata(&pdev->dev)); |
1034 | /* Clear usb_gadget region for new registration to udc-core */ | ||
1035 | memzero_explicit(&dum->gadget, sizeof(struct usb_gadget)); | ||
1034 | dum->gadget.name = gadget_name; | 1036 | dum->gadget.name = gadget_name; |
1035 | dum->gadget.ops = &dummy_ops; | 1037 | dum->gadget.ops = &dummy_ops; |
1036 | dum->gadget.max_speed = USB_SPEED_SUPER; | 1038 | dum->gadget.max_speed = USB_SPEED_SUPER; |
diff --git a/drivers/usb/gadget/udc/net2280.c b/drivers/usb/gadget/udc/net2280.c index 85504419ab31..3828c2ec8623 100644 --- a/drivers/usb/gadget/udc/net2280.c +++ b/drivers/usb/gadget/udc/net2280.c | |||
@@ -1146,15 +1146,15 @@ static int scan_dma_completions(struct net2280_ep *ep) | |||
1146 | */ | 1146 | */ |
1147 | while (!list_empty(&ep->queue)) { | 1147 | while (!list_empty(&ep->queue)) { |
1148 | struct net2280_request *req; | 1148 | struct net2280_request *req; |
1149 | u32 tmp; | 1149 | u32 req_dma_count; |
1150 | 1150 | ||
1151 | req = list_entry(ep->queue.next, | 1151 | req = list_entry(ep->queue.next, |
1152 | struct net2280_request, queue); | 1152 | struct net2280_request, queue); |
1153 | if (!req->valid) | 1153 | if (!req->valid) |
1154 | break; | 1154 | break; |
1155 | rmb(); | 1155 | rmb(); |
1156 | tmp = le32_to_cpup(&req->td->dmacount); | 1156 | req_dma_count = le32_to_cpup(&req->td->dmacount); |
1157 | if ((tmp & BIT(VALID_BIT)) != 0) | 1157 | if ((req_dma_count & BIT(VALID_BIT)) != 0) |
1158 | break; | 1158 | break; |
1159 | 1159 | ||
1160 | /* SHORT_PACKET_TRANSFERRED_INTERRUPT handles "usb-short" | 1160 | /* SHORT_PACKET_TRANSFERRED_INTERRUPT handles "usb-short" |
@@ -1163,40 +1163,41 @@ static int scan_dma_completions(struct net2280_ep *ep) | |||
1163 | */ | 1163 | */ |
1164 | if (unlikely(req->td->dmadesc == 0)) { | 1164 | if (unlikely(req->td->dmadesc == 0)) { |
1165 | /* paranoia */ | 1165 | /* paranoia */ |
1166 | tmp = readl(&ep->dma->dmacount); | 1166 | u32 const ep_dmacount = readl(&ep->dma->dmacount); |
1167 | if (tmp & DMA_BYTE_COUNT_MASK) | 1167 | |
1168 | if (ep_dmacount & DMA_BYTE_COUNT_MASK) | ||
1168 | break; | 1169 | break; |
1169 | /* single transfer mode */ | 1170 | /* single transfer mode */ |
1170 | dma_done(ep, req, tmp, 0); | 1171 | dma_done(ep, req, req_dma_count, 0); |
1171 | num_completed++; | 1172 | num_completed++; |
1172 | break; | 1173 | break; |
1173 | } else if (!ep->is_in && | 1174 | } else if (!ep->is_in && |
1174 | (req->req.length % ep->ep.maxpacket) && | 1175 | (req->req.length % ep->ep.maxpacket) && |
1175 | !(ep->dev->quirks & PLX_PCIE)) { | 1176 | !(ep->dev->quirks & PLX_PCIE)) { |
1176 | 1177 | ||
1177 | tmp = readl(&ep->regs->ep_stat); | 1178 | u32 const ep_stat = readl(&ep->regs->ep_stat); |
1178 | /* AVOID TROUBLE HERE by not issuing short reads from | 1179 | /* AVOID TROUBLE HERE by not issuing short reads from |
1179 | * your gadget driver. That helps avoids errata 0121, | 1180 | * your gadget driver. That helps avoids errata 0121, |
1180 | * 0122, and 0124; not all cases trigger the warning. | 1181 | * 0122, and 0124; not all cases trigger the warning. |
1181 | */ | 1182 | */ |
1182 | if ((tmp & BIT(NAK_OUT_PACKETS)) == 0) { | 1183 | if ((ep_stat & BIT(NAK_OUT_PACKETS)) == 0) { |
1183 | ep_warn(ep->dev, "%s lost packet sync!\n", | 1184 | ep_warn(ep->dev, "%s lost packet sync!\n", |
1184 | ep->ep.name); | 1185 | ep->ep.name); |
1185 | req->req.status = -EOVERFLOW; | 1186 | req->req.status = -EOVERFLOW; |
1186 | } else { | 1187 | } else { |
1187 | tmp = readl(&ep->regs->ep_avail); | 1188 | u32 const ep_avail = readl(&ep->regs->ep_avail); |
1188 | if (tmp) { | 1189 | if (ep_avail) { |
1189 | /* fifo gets flushed later */ | 1190 | /* fifo gets flushed later */ |
1190 | ep->out_overflow = 1; | 1191 | ep->out_overflow = 1; |
1191 | ep_dbg(ep->dev, | 1192 | ep_dbg(ep->dev, |
1192 | "%s dma, discard %d len %d\n", | 1193 | "%s dma, discard %d len %d\n", |
1193 | ep->ep.name, tmp, | 1194 | ep->ep.name, ep_avail, |
1194 | req->req.length); | 1195 | req->req.length); |
1195 | req->req.status = -EOVERFLOW; | 1196 | req->req.status = -EOVERFLOW; |
1196 | } | 1197 | } |
1197 | } | 1198 | } |
1198 | } | 1199 | } |
1199 | dma_done(ep, req, tmp, 0); | 1200 | dma_done(ep, req, req_dma_count, 0); |
1200 | num_completed++; | 1201 | num_completed++; |
1201 | } | 1202 | } |
1202 | 1203 | ||
diff --git a/drivers/usb/gadget/udc/pxa27x_udc.c b/drivers/usb/gadget/udc/pxa27x_udc.c index e1335ad5bce9..832c4fdbe985 100644 --- a/drivers/usb/gadget/udc/pxa27x_udc.c +++ b/drivers/usb/gadget/udc/pxa27x_udc.c | |||
@@ -2534,9 +2534,10 @@ static int pxa_udc_remove(struct platform_device *_dev) | |||
2534 | usb_del_gadget_udc(&udc->gadget); | 2534 | usb_del_gadget_udc(&udc->gadget); |
2535 | pxa_cleanup_debugfs(udc); | 2535 | pxa_cleanup_debugfs(udc); |
2536 | 2536 | ||
2537 | if (!IS_ERR_OR_NULL(udc->transceiver)) | 2537 | if (!IS_ERR_OR_NULL(udc->transceiver)) { |
2538 | usb_unregister_notifier(udc->transceiver, &pxa27x_udc_phy); | 2538 | usb_unregister_notifier(udc->transceiver, &pxa27x_udc_phy); |
2539 | usb_put_phy(udc->transceiver); | 2539 | usb_put_phy(udc->transceiver); |
2540 | } | ||
2540 | 2541 | ||
2541 | udc->transceiver = NULL; | 2542 | udc->transceiver = NULL; |
2542 | the_controller = NULL; | 2543 | the_controller = NULL; |