Hi, On Thu, Feb 28, 2013 at 04:51:29PM +0530, Pratyush Anand wrote: > On 2/28/2013 4:18 PM, Felipe Balbi wrote: > >>+ if (list_empty(&dep->req_queued)) > >>>+ dep->flags &= ~DWC3_EP_BUSY; > >not sure this is correct. Whenever req_queue isn't empty, we call > >dwc3_stop_active_transfer() which will clear DWC3_EP_BUSY flag. > > Yes, if we clear DWC3_EP_BUSY in dwc3_stop_active_transfer then its > fine. But we do not do that. Probably , error was introduced when > "End Transfer" completion interrupt handling was removed.
> static int dwc3_gadget_ep_dequeue(struct usb_ep *ep,
> struct usb_request *request)
> {
[...]
> if (r != req) {
> list_for_each_entry(r, &dep->req_queued, list) {
> if (r == req)
> break;
> }
> if (r == req) {
> /* wait until it is processed */
> dwc3_stop_active_transfer(dwc, dep->number);
^
look here
> goto out1;
> }
> dev_err(dwc->dev, "request %p was not queued to %s\n",
> request, ep->name);
> ret = -EINVAL;
> goto out0;
> }
>
> out1:
> /* giveback the request */
> dwc3_gadget_giveback(dep, req, -ECONNRESET);
>
> out0:
> spin_unlock_irqrestore(&dwc->lock, flags);
>
> return ret;
> }
>
> static void dwc3_stop_active_transfer(struct dwc3 *dwc, u32 epnum)
> {
[...]
> cmd = DWC3_DEPCMD_ENDTRANSFER;
> cmd |= DWC3_DEPCMD_HIPRI_FORCERM | DWC3_DEPCMD_CMDIOC;
> cmd |= DWC3_DEPCMD_PARAM(dep->resource_index);
> memset(¶ms, 0, sizeof(params));
> ret = dwc3_send_gadget_ep_cmd(dwc, dep->number, cmd, ¶ms);
> WARN_ON_ONCE(ret);
> dep->resource_index = 0;
> dep->flags &= ~DWC3_EP_BUSY;
^
and here
> udelay(100);
> }
??
--
balbi
signature.asc
Description: Digital signature
