Commit ac1aa6a2 authored by Anji jonnala's avatar Anji jonnala Committed by Greg Kroah-Hartman

USB: gadget: Initialize ep0 once while registering gadget in ci13xxx_udc

Some of the simulators may cache the ep0 maxpacket size to zero
if the ep0 dQh is not setup before enabling the pullup. Hence
Setup ep0 and initialize the dQh fields once while registering the
gadget(before enabling the pullup).

HSUSB Chipidea link controller spec says ep0 is enabled always
in the HW. Hence disabling and enabling the ep0 as a part of
reset interrupt is unneccesary.
Remove the disable/enable ep0 logic from reset interrupt handling.
Signed-off-by: default avatarAnji jonnala <anjir@codeaurora.org>
Signed-off-by: default avatarPavankumar Kondeti <pkondeti@codeaurora.org>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent 76cd9cfb
...@@ -1634,8 +1634,6 @@ static int _gadget_stop_activity(struct usb_gadget *gadget) ...@@ -1634,8 +1634,6 @@ static int _gadget_stop_activity(struct usb_gadget *gadget)
gadget_for_each_ep(ep, gadget) { gadget_for_each_ep(ep, gadget) {
usb_ep_disable(ep); usb_ep_disable(ep);
} }
usb_ep_disable(&udc->ep0out.ep);
usb_ep_disable(&udc->ep0in.ep);
if (udc->status != NULL) { if (udc->status != NULL) {
usb_ep_free_request(&udc->ep0in.ep, udc->status); usb_ep_free_request(&udc->ep0in.ep, udc->status);
...@@ -1678,18 +1676,10 @@ __acquires(udc->lock) ...@@ -1678,18 +1676,10 @@ __acquires(udc->lock)
if (retval) if (retval)
goto done; goto done;
retval = usb_ep_enable(&udc->ep0out.ep, &ctrl_endpt_out_desc); udc->status = usb_ep_alloc_request(&udc->ep0in.ep, GFP_ATOMIC);
if (retval) if (udc->status == NULL)
goto done; retval = -ENOMEM;
retval = usb_ep_enable(&udc->ep0in.ep, &ctrl_endpt_in_desc);
if (!retval) {
udc->status = usb_ep_alloc_request(&udc->ep0in.ep, GFP_ATOMIC);
if (udc->status == NULL) {
usb_ep_disable(&udc->ep0out.ep);
retval = -ENOMEM;
}
}
spin_lock(udc->lock); spin_lock(udc->lock);
done: done:
...@@ -2120,7 +2110,12 @@ static int ep_enable(struct usb_ep *ep, ...@@ -2120,7 +2110,12 @@ static int ep_enable(struct usb_ep *ep,
(mEp->ep.maxpacket << ffs_nr(QH_MAX_PKT)) & QH_MAX_PKT; (mEp->ep.maxpacket << ffs_nr(QH_MAX_PKT)) & QH_MAX_PKT;
mEp->qh.ptr->td.next |= TD_TERMINATE; /* needed? */ mEp->qh.ptr->td.next |= TD_TERMINATE; /* needed? */
retval |= hw_ep_enable(mEp->num, mEp->dir, mEp->type); /*
* Enable endpoints in the HW other than ep0 as ep0
* is always enabled
*/
if (mEp->num)
retval |= hw_ep_enable(mEp->num, mEp->dir, mEp->type);
spin_unlock_irqrestore(mEp->lock, flags); spin_unlock_irqrestore(mEp->lock, flags);
return retval; return retval;
...@@ -2609,6 +2604,14 @@ int usb_gadget_probe_driver(struct usb_gadget_driver *driver, ...@@ -2609,6 +2604,14 @@ int usb_gadget_probe_driver(struct usb_gadget_driver *driver,
} }
if (retval) if (retval)
goto done; goto done;
spin_unlock_irqrestore(udc->lock, flags);
retval = usb_ep_enable(&udc->ep0out.ep, &ctrl_endpt_out_desc);
if (retval)
return retval;
retval = usb_ep_enable(&udc->ep0in.ep, &ctrl_endpt_in_desc);
if (retval)
return retval;
spin_lock_irqsave(udc->lock, flags);
udc->gadget.ep0 = &udc->ep0in.ep; udc->gadget.ep0 = &udc->ep0in.ep;
/* bind gadget */ /* bind gadget */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment