From b5959f8737776d8cc42c4d7614dcd23eb2d99890 Mon Sep 17 00:00:00 2001
From: Mike Lockwood <lockwood@android.com>
Date: Tue, 1 Mar 2011 18:41:20 -0800
Subject: [PATCH] [ARM] usb: msm72k_udc: Fix handling of OUT packets on ep0
 with length > 0

The gadget level completion function was getting called for the ACK packet
instead of the data packet, making it impossible to read the data from the host.

Signed-off-by: Mike Lockwood <lockwood@android.com>
---
 drivers/usb/gadget/msm72k_udc.c | 16 +++++++++++-----
 1 file changed, 11 insertions(+), 5 deletions(-)

diff --git a/drivers/usb/gadget/msm72k_udc.c b/drivers/usb/gadget/msm72k_udc.c
index 9b0e697f972b..ac1b9ecb0de9 100644
--- a/drivers/usb/gadget/msm72k_udc.c
+++ b/drivers/usb/gadget/msm72k_udc.c
@@ -54,6 +54,7 @@ static const char driver_name[] = "msm72k_udc";
 
 #define SETUP_BUF_SIZE      4096
 
+typedef void (*completion_func)(struct usb_ep *ep, struct usb_request *req);
 
 static const char *const ep_name[] = {
 	"ep0out", "ep1out", "ep2out", "ep3out",
@@ -73,9 +74,7 @@ struct msm_request {
 	struct usb_request req;
 
 	/* saved copy of req.complete */
-	void	(*gadget_complete)(struct usb_ep *ep,
-					struct usb_request *req);
-
+	completion_func gadget_complete;
 
 	struct usb_info *ui;
 	struct msm_request *next;
@@ -508,7 +507,7 @@ static void ep0_complete(struct usb_ep *ep, struct usb_request *req)
 	struct usb_info *ui = ept->ui;
 
 	req->complete = r->gadget_complete;
-	r->gadget_complete = 0;
+	r->gadget_complete = NULL;
 	if	(req->complete)
 		req->complete(&ui->ep0in.ep, req);
 }
@@ -516,6 +515,13 @@ static void ep0_complete(struct usb_ep *ep, struct usb_request *req)
 static void ep0_queue_ack_complete(struct usb_ep *ep, struct usb_request *req)
 {
 	struct msm_endpoint *ept = to_msm_endpoint(ep);
+	struct msm_request *r = to_msm_request(req);
+	completion_func gadget_complete = r->gadget_complete;
+
+	if (gadget_complete) {
+		r->gadget_complete = NULL;
+		gadget_complete(ep, req);
+	}
 
 	/* queue up the receive of the ACK response from the host */
 	if (req->status == 0) {
@@ -587,7 +593,7 @@ static void ep0_setup_send(struct usb_info *ui, unsigned length)
 
 	req->length = length;
 	req->complete = ep0_queue_ack_complete;
-	r->gadget_complete = 0;
+	r->gadget_complete = NULL;
 	usb_ept_queue_xfer(ept, req);
 }
 
-- 
GitLab