Hi Marek, On Thu, Aug 27, 2015 at 01:08:46PM +0200, Marek Vasut wrote: >On Thursday, August 27, 2015 at 01:00:50 PM, Peng Fan wrote: >> Implement endpoint dequeue callback function. >> >> Without this function, uboot will hang when executing fastboot comamnd. >> See following flow: >> "fastboot_tx_write_str->fastboot_tx_write->usb_ep_dequeue->ep->ops->dequeue >> " without implement ci_udc dequeue function, ep->ops->dequeue is NULL, then >> uboot will hang. >> >> Tested on mx6qsabresd board with fastboot enabled. >> >> Signed-off-by: Peng Fan <peng....@freescale.com> >> Cc: "Ćukasz Majewski" <l.majew...@samsung.com> >> Cc: Marek Vasut <ma...@denx.de> >> --- >> drivers/usb/gadget/ci_udc.c | 28 ++++++++++++++++++++++++++++ >> 1 file changed, 28 insertions(+) >> >> diff --git a/drivers/usb/gadget/ci_udc.c b/drivers/usb/gadget/ci_udc.c >> index 3e8eb87..f9374b3 100644 >> --- a/drivers/usb/gadget/ci_udc.c >> +++ b/drivers/usb/gadget/ci_udc.c >> @@ -87,6 +87,7 @@ static int ci_ep_enable(struct usb_ep *ep, >> static int ci_ep_disable(struct usb_ep *ep); >> static int ci_ep_queue(struct usb_ep *ep, >> struct usb_request *req, gfp_t gfp_flags); >> +static int ci_ep_dequeue(struct usb_ep *ep, struct usb_request *req); >> static struct usb_request * >> ci_ep_alloc_request(struct usb_ep *ep, unsigned int gfp_flags); >> static void ci_ep_free_request(struct usb_ep *ep, struct usb_request >> *_req); @@ -99,6 +100,7 @@ static struct usb_ep_ops ci_ep_ops = { >> .enable = ci_ep_enable, >> .disable = ci_ep_disable, >> .queue = ci_ep_queue, >> + .dequeue = ci_ep_dequeue, >> .alloc_request = ci_ep_alloc_request, >> .free_request = ci_ep_free_request, >> }; >> @@ -525,6 +527,32 @@ static void ci_ep_submit_next_request(struct ci_ep >> *ci_ep) writel(bit, &udc->epprime); >> } >> >> +static int ci_ep_dequeue(struct usb_ep *_ep, struct usb_request *_req) >> +{ >> + struct ci_ep *ci_ep = container_of(_ep, struct ci_ep, ep); >> + struct ci_req *ci_req; >> + >> + list_for_each_entry(ci_req, &ci_ep->queue, queue) { >> + if (&ci_req->req == _req) >> + break; >> + } >> + >> + if (&ci_req->req != _req) >> + return -EINVAL; >> + >> + list_del_init(&ci_req->queue); >> + >> + if (ci_req->req.status == -EINPROGRESS) { >> + ci_req->req.status = -ECONNRESET; >> + if (ci_req->req.complete) >> + ci_req->req.complete(_ep, _req); >> + } >> + >> + debug("callback completed\n"); > >Please fix this useless debug() statement, either remove it, or at least >make it print __func__ so one can identify where this came from.
Will remove it and send out v2 with your Reviewed-by Tag. > > >Looks good otherwise: > >Reviewed-by: Marek Vasut <ma...@denx.de> Thanks, Peng. -- _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot