mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-30 03:27:44 -04:00
usb: fixes for v3.6-rc4
Here's a rather big set of fixes for v3.6-rc4. There are some fixes for bugs which have been pending for a long time and only now were uncovered, like the musb and dwc3 patches. We have some remaining fixes for the ep->desc patch series from Ido, a fix for renesas DMA usage, IRQ check on musb's DMA and an oops fix on musb Host implementation. All patches have been pending on linux-usb for a long time and shouldn't cause any further regressions. -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.12 (GNU/Linux) iQIcBAABAgAGBQJQSNU/AAoJEIaOsuA1yqREFbAP/1+lw35UjkeDGl+BwM+TcEzD T4uboSBeTYsnTQV5ua43g3XVyxxO+1zARFiV9KILKdQDoFAg/N9xUWKQmeyKnhxQ 0plsn1IBqkbXgPBW2r/kUxBsGW4aD1beHtCOLjG0a8iiYqiKCdiPqTN5n2rgAaUL Y8hVOMzN+g0Vo5MTeOBKQLEcytd5qzYS227y3OjXEGFiWK+yFVr1ttaU5/48Ttdy 1LSnRGMF3o0P/EUsC69DkwCOk0tueNKSnS4fdKDJc4Yu6zrJKb6sZ7pe6uWpIwtk +y4HZeySBqUi8sbXG8yUf29ruIgKMYjR2RUU9paJUUdL2H2bQIbzbXAmES9nYEcm bUPBQy35BWBOnWk+M7Ckx/dnBgkjLSx6f38WxPOCA4c1g04c6HpEolWvDrqK2VJp cAatI1sI64n+bI+YtILaPIEACc4cmBsFIifOGCEzRd+xe6CYhmdajrBqc0xg/uTW sci1scsGyX6snswlHKEEKXmiKIa5sXZmoFeNGSYwFVlP8L3uHoL7awFyg0/1uOSx qcgZf0HDYF9zBuciinpULh9XsaPdHTao65nR2x+aA3Gi55Zutgf2GdlH2Pm9VaJk yReFYf4k4O7Msh8BctkQPRePC8h2JikGf4Dnqc2UCcMxTIgK7mfWeYc9+lvEyx6t PPSArOq28sBE8xDFsHCM =F4Vw -----END PGP SIGNATURE----- Merge tag 'fixes-for-v3.6-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/balbi/usb into work-linus usb: fixes for v3.6-rc4 Here's a rather big set of fixes for v3.6-rc4. There are some fixes for bugs which have been pending for a long time and only now were uncovered, like the musb and dwc3 patches. We have some remaining fixes for the ep->desc patch series from Ido, a fix for renesas DMA usage, IRQ check on musb's DMA and an oops fix on musb Host implementation. All patches have been pending on linux-usb for a long time and shouldn't cause any further regressions.
This commit is contained in:
commit
23649aa6f1
234 changed files with 2008 additions and 1370 deletions
|
|
@ -436,16 +436,21 @@ static int __devinit dwc3_probe(struct platform_device *pdev)
|
|||
dev_err(dev, "missing IRQ\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
dwc->xhci_resources[1] = *res;
|
||||
dwc->xhci_resources[1].start = res->start;
|
||||
dwc->xhci_resources[1].end = res->end;
|
||||
dwc->xhci_resources[1].flags = res->flags;
|
||||
dwc->xhci_resources[1].name = res->name;
|
||||
|
||||
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||
if (!res) {
|
||||
dev_err(dev, "missing memory resource\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
dwc->xhci_resources[0] = *res;
|
||||
dwc->xhci_resources[0].start = res->start;
|
||||
dwc->xhci_resources[0].end = dwc->xhci_resources[0].start +
|
||||
DWC3_XHCI_REGS_END;
|
||||
dwc->xhci_resources[0].flags = res->flags;
|
||||
dwc->xhci_resources[0].name = res->name;
|
||||
|
||||
/*
|
||||
* Request memory region but exclude xHCI regs,
|
||||
|
|
|
|||
|
|
@ -720,7 +720,6 @@ static void dwc3_ep0_complete_data(struct dwc3 *dwc,
|
|||
transferred = min_t(u32, ur->length,
|
||||
transfer_size - length);
|
||||
memcpy(ur->buf, dwc->ep0_bounce, transferred);
|
||||
dwc->ep0_bounced = false;
|
||||
} else {
|
||||
transferred = ur->length - length;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -263,8 +263,11 @@ void dwc3_gadget_giveback(struct dwc3_ep *dep, struct dwc3_request *req,
|
|||
if (req->request.status == -EINPROGRESS)
|
||||
req->request.status = status;
|
||||
|
||||
usb_gadget_unmap_request(&dwc->gadget, &req->request,
|
||||
req->direction);
|
||||
if (dwc->ep0_bounced && dep->number == 0)
|
||||
dwc->ep0_bounced = false;
|
||||
else
|
||||
usb_gadget_unmap_request(&dwc->gadget, &req->request,
|
||||
req->direction);
|
||||
|
||||
dev_dbg(dwc->dev, "request %p from %s completed %d/%d ===> %d\n",
|
||||
req, dep->name, req->request.actual,
|
||||
|
|
@ -1026,6 +1029,7 @@ static void __dwc3_gadget_start_isoc(struct dwc3 *dwc,
|
|||
if (list_empty(&dep->request_list)) {
|
||||
dev_vdbg(dwc->dev, "ISOC ep %s run out for requests.\n",
|
||||
dep->name);
|
||||
dep->flags |= DWC3_EP_PENDING_REQUEST;
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
@ -1089,6 +1093,17 @@ static int __dwc3_gadget_ep_queue(struct dwc3_ep *dep, struct dwc3_request *req)
|
|||
if (dep->flags & DWC3_EP_PENDING_REQUEST) {
|
||||
int ret;
|
||||
|
||||
/*
|
||||
* If xfernotready is already elapsed and it is a case
|
||||
* of isoc transfer, then issue END TRANSFER, so that
|
||||
* you can receive xfernotready again and can have
|
||||
* notion of current microframe.
|
||||
*/
|
||||
if (usb_endpoint_xfer_isoc(dep->endpoint.desc)) {
|
||||
dwc3_stop_active_transfer(dwc, dep->number);
|
||||
return 0;
|
||||
}
|
||||
|
||||
ret = __dwc3_gadget_kick_transfer(dep, 0, true);
|
||||
if (ret && ret != -EBUSY) {
|
||||
struct dwc3 *dwc = dep->dwc;
|
||||
|
|
|
|||
|
|
@ -475,8 +475,7 @@ static int at91_ep_enable(struct usb_ep *_ep,
|
|||
unsigned long flags;
|
||||
|
||||
if (!_ep || !ep
|
||||
|| !desc || ep->ep.desc
|
||||
|| _ep->name == ep0name
|
||||
|| !desc || _ep->name == ep0name
|
||||
|| desc->bDescriptorType != USB_DT_ENDPOINT
|
||||
|| (maxpacket = usb_endpoint_maxp(desc)) == 0
|
||||
|| maxpacket > ep->maxpacket) {
|
||||
|
|
@ -530,7 +529,6 @@ ok:
|
|||
tmp |= AT91_UDP_EPEDS;
|
||||
__raw_writel(tmp, ep->creg);
|
||||
|
||||
ep->ep.desc = desc;
|
||||
ep->ep.maxpacket = maxpacket;
|
||||
|
||||
/*
|
||||
|
|
@ -1635,7 +1633,6 @@ static int at91_start(struct usb_gadget *gadget,
|
|||
udc->driver = driver;
|
||||
udc->gadget.dev.driver = &driver->driver;
|
||||
udc->gadget.dev.of_node = udc->pdev->dev.of_node;
|
||||
dev_set_drvdata(&udc->gadget.dev, &driver->driver);
|
||||
udc->enabled = 1;
|
||||
udc->selfpowered = 1;
|
||||
|
||||
|
|
@ -1656,7 +1653,6 @@ static int at91_stop(struct usb_gadget *gadget,
|
|||
spin_unlock_irqrestore(&udc->lock, flags);
|
||||
|
||||
udc->gadget.dev.driver = NULL;
|
||||
dev_set_drvdata(&udc->gadget.dev, NULL);
|
||||
udc->driver = NULL;
|
||||
|
||||
DBG("unbound from %s\n", driver->driver.name);
|
||||
|
|
|
|||
|
|
@ -1916,6 +1916,27 @@ done:
|
|||
return retval;
|
||||
}
|
||||
|
||||
/* usb 3.0 root hub device descriptor */
|
||||
struct {
|
||||
struct usb_bos_descriptor bos;
|
||||
struct usb_ss_cap_descriptor ss_cap;
|
||||
} __packed usb3_bos_desc = {
|
||||
|
||||
.bos = {
|
||||
.bLength = USB_DT_BOS_SIZE,
|
||||
.bDescriptorType = USB_DT_BOS,
|
||||
.wTotalLength = cpu_to_le16(sizeof(usb3_bos_desc)),
|
||||
.bNumDeviceCaps = 1,
|
||||
},
|
||||
.ss_cap = {
|
||||
.bLength = USB_DT_USB_SS_CAP_SIZE,
|
||||
.bDescriptorType = USB_DT_DEVICE_CAPABILITY,
|
||||
.bDevCapabilityType = USB_SS_CAP_TYPE,
|
||||
.wSpeedSupported = cpu_to_le16(USB_5GBPS_OPERATION),
|
||||
.bFunctionalitySupport = ilog2(USB_5GBPS_OPERATION),
|
||||
},
|
||||
};
|
||||
|
||||
static inline void
|
||||
ss_hub_descriptor(struct usb_hub_descriptor *desc)
|
||||
{
|
||||
|
|
@ -2006,6 +2027,18 @@ static int dummy_hub_control(
|
|||
else
|
||||
hub_descriptor((struct usb_hub_descriptor *) buf);
|
||||
break;
|
||||
|
||||
case DeviceRequest | USB_REQ_GET_DESCRIPTOR:
|
||||
if (hcd->speed != HCD_USB3)
|
||||
goto error;
|
||||
|
||||
if ((wValue >> 8) != USB_DT_BOS)
|
||||
goto error;
|
||||
|
||||
memcpy(buf, &usb3_bos_desc, sizeof(usb3_bos_desc));
|
||||
retval = sizeof(usb3_bos_desc);
|
||||
break;
|
||||
|
||||
case GetHubStatus:
|
||||
*(__le32 *) buf = cpu_to_le32(0);
|
||||
break;
|
||||
|
|
@ -2503,10 +2536,8 @@ static int dummy_hcd_probe(struct platform_device *pdev)
|
|||
hs_hcd->has_tt = 1;
|
||||
|
||||
retval = usb_add_hcd(hs_hcd, 0, 0);
|
||||
if (retval != 0) {
|
||||
usb_put_hcd(hs_hcd);
|
||||
return retval;
|
||||
}
|
||||
if (retval)
|
||||
goto put_usb2_hcd;
|
||||
|
||||
if (mod_data.is_super_speed) {
|
||||
ss_hcd = usb_create_shared_hcd(&dummy_hcd, &pdev->dev,
|
||||
|
|
@ -2525,6 +2556,8 @@ static int dummy_hcd_probe(struct platform_device *pdev)
|
|||
put_usb3_hcd:
|
||||
usb_put_hcd(ss_hcd);
|
||||
dealloc_usb2_hcd:
|
||||
usb_remove_hcd(hs_hcd);
|
||||
put_usb2_hcd:
|
||||
usb_put_hcd(hs_hcd);
|
||||
the_controller.hs_hcd = the_controller.ss_hcd = NULL;
|
||||
return retval;
|
||||
|
|
|
|||
|
|
@ -34,11 +34,15 @@
|
|||
/* Debugging ****************************************************************/
|
||||
|
||||
#ifdef VERBOSE_DEBUG
|
||||
#ifndef pr_vdebug
|
||||
# define pr_vdebug pr_debug
|
||||
#endif /* pr_vdebug */
|
||||
# define ffs_dump_mem(prefix, ptr, len) \
|
||||
print_hex_dump_bytes(pr_fmt(prefix ": "), DUMP_PREFIX_NONE, ptr, len)
|
||||
#else
|
||||
#ifndef pr_vdebug
|
||||
# define pr_vdebug(...) do { } while (0)
|
||||
#endif /* pr_vdebug */
|
||||
# define ffs_dump_mem(prefix, ptr, len) do { } while (0)
|
||||
#endif /* VERBOSE_DEBUG */
|
||||
|
||||
|
|
|
|||
|
|
@ -3599,6 +3599,7 @@ static int __devinit s3c_hsotg_probe(struct platform_device *pdev)
|
|||
|
||||
if (hsotg->num_of_eps == 0) {
|
||||
dev_err(dev, "wrong number of EPs (zero)\n");
|
||||
ret = -EINVAL;
|
||||
goto err_supplies;
|
||||
}
|
||||
|
||||
|
|
@ -3606,6 +3607,7 @@ static int __devinit s3c_hsotg_probe(struct platform_device *pdev)
|
|||
GFP_KERNEL);
|
||||
if (!eps) {
|
||||
dev_err(dev, "cannot get memory\n");
|
||||
ret = -ENOMEM;
|
||||
goto err_supplies;
|
||||
}
|
||||
|
||||
|
|
@ -3622,6 +3624,7 @@ static int __devinit s3c_hsotg_probe(struct platform_device *pdev)
|
|||
GFP_KERNEL);
|
||||
if (!hsotg->ctrl_req) {
|
||||
dev_err(dev, "failed to allocate ctrl req\n");
|
||||
ret = -ENOMEM;
|
||||
goto err_ep_mem;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -132,11 +132,15 @@ static unsigned n_ports;
|
|||
|
||||
|
||||
#ifdef VERBOSE_DEBUG
|
||||
#ifndef pr_vdebug
|
||||
#define pr_vdebug(fmt, arg...) \
|
||||
pr_debug(fmt, ##arg)
|
||||
#endif /* pr_vdebug */
|
||||
#else
|
||||
#ifndef pr_vdebig
|
||||
#define pr_vdebug(fmt, arg...) \
|
||||
({ if (0) pr_debug(fmt, ##arg); })
|
||||
#endif /* pr_vdebug */
|
||||
#endif
|
||||
|
||||
/*-------------------------------------------------------------------------*/
|
||||
|
|
|
|||
|
|
@ -2049,7 +2049,7 @@ static int musb_urb_enqueue(
|
|||
* we only have work to do in the former case.
|
||||
*/
|
||||
spin_lock_irqsave(&musb->lock, flags);
|
||||
if (hep->hcpriv) {
|
||||
if (hep->hcpriv || !next_urb(qh)) {
|
||||
/* some concurrent activity submitted another urb to hep...
|
||||
* odd, rare, error prone, but legal.
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -388,7 +388,7 @@ dma_controller_create(struct musb *musb, void __iomem *base)
|
|||
struct platform_device *pdev = to_platform_device(dev);
|
||||
int irq = platform_get_irq_byname(pdev, "dma");
|
||||
|
||||
if (irq == 0) {
|
||||
if (irq <= 0) {
|
||||
dev_err(dev, "No DMA interrupt line!\n");
|
||||
return NULL;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1215,7 +1215,7 @@ static int __devinit tusb_probe(struct platform_device *pdev)
|
|||
ret = platform_device_add(musb);
|
||||
if (ret) {
|
||||
dev_err(&pdev->dev, "failed to register musb device\n");
|
||||
goto err1;
|
||||
goto err2;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
|
|
|||
|
|
@ -818,7 +818,7 @@ static int usbhsf_dma_prepare_push(struct usbhs_pkt *pkt, int *is_done)
|
|||
usbhs_pipe_is_dcp(pipe))
|
||||
goto usbhsf_pio_prepare_push;
|
||||
|
||||
if (len % 4) /* 32bit alignment */
|
||||
if (len & 0x7) /* 8byte alignment */
|
||||
goto usbhsf_pio_prepare_push;
|
||||
|
||||
if ((uintptr_t)(pkt->buf + pkt->actual) & 0x7) /* 8byte alignment */
|
||||
|
|
@ -905,7 +905,7 @@ static int usbhsf_dma_try_pop(struct usbhs_pkt *pkt, int *is_done)
|
|||
/* use PIO if packet is less than pio_dma_border */
|
||||
len = usbhsf_fifo_rcv_len(priv, fifo);
|
||||
len = min(pkt->length - pkt->actual, len);
|
||||
if (len % 4) /* 32bit alignment */
|
||||
if (len & 0x7) /* 8byte alignment */
|
||||
goto usbhsf_pio_prepare_pop_unselect;
|
||||
|
||||
if (len < usbhs_get_dparam(priv, pio_dma_border))
|
||||
|
|
|
|||
Loading…
Reference in a new issue