diff mbox

[U-Boot,V2] usb: gadget: ci_udc: implement usb_ep_ops dequeue callback

Message ID 1440724830-17915-1-git-send-email-Peng.Fan@freescale.com
State Deferred
Delegated to: Łukasz Majewski
Headers show

Commit Message

Peng Fan Aug. 28, 2015, 1:20 a.m. UTC
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.Fan@freescale.com>
Cc: "Łukasz Majewski" <l.majewski@samsung.com>
Cc: Marek Vasut <marex@denx.de>
---

Changes v2:
 discard useless "debug("callback completed\n")" info.

 drivers/usb/gadget/ci_udc.c | 26 ++++++++++++++++++++++++++
 1 file changed, 26 insertions(+)

Comments

Marek Vasut Aug. 29, 2015, 1:57 p.m. UTC | #1
On Friday, August 28, 2015 at 03:20:30 AM, 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.Fan@freescale.com>
> Cc: "Łukasz Majewski" <l.majewski@samsung.com>
> Cc: Marek Vasut <marex@denx.de>
> ---
> 
> Changes v2:
>  discard useless "debug("callback completed\n")" info.

Hi,

I see Stephen had some concerns about V1, but I don't see them addressed.
I would prefer if you sent V2 only after the discussion about the previous
version of the patch reaches a conclusion. Can you please address the
concerns Stephen had there ? Thanks!

Best regards,
Marek Vasut
Fabio Estevam Sept. 9, 2015, 11:04 p.m. UTC | #2
On Thu, Aug 27, 2015 at 10:20 PM, Peng Fan <Peng.Fan@freescale.com> 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.

Managed to get fastboot working with this patch applied, thanks.

$ fastboot getvar bootloader-version -i 0x0525
bootloader-version: U-Boot 2015.10-rc2-23960-g2462cce-dirty
finished. total time: 0.000s

$ fastboot reboot  -i 0x0525 --> board reboots fine.

Tested-by: Fabio Estevam <fabio.estevam@freescale.com>
Marek Vasut Sept. 9, 2015, 11:20 p.m. UTC | #3
On Thursday, September 10, 2015 at 01:04:23 AM, Fabio Estevam wrote:
> On Thu, Aug 27, 2015 at 10:20 PM, Peng Fan <Peng.Fan@freescale.com> 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->deque
> > ue" without implement ci_udc dequeue function, ep->ops->dequeue is NULL,
> > then uboot will hang.
> > 
> > Tested on mx6qsabresd board with fastboot enabled.
> 
> Managed to get fastboot working with this patch applied, thanks.
> 
> $ fastboot getvar bootloader-version -i 0x0525
> bootloader-version: U-Boot 2015.10-rc2-23960-g2462cce-dirty
> finished. total time: 0.000s
> 
> $ fastboot reboot  -i 0x0525 --> board reboots fine.
> 
> Tested-by: Fabio Estevam <fabio.estevam@freescale.com>

Applied, thanks!

Best regards,
Marek Vasut
diff mbox

Patch

diff --git a/drivers/usb/gadget/ci_udc.c b/drivers/usb/gadget/ci_udc.c
index 3e8eb87..c0d23a4 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,30 @@  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);
+	}
+
+	return 0;
+}
+
 static int ci_ep_queue(struct usb_ep *ep,
 		struct usb_request *req, gfp_t gfp_flags)
 {