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