Merge "USB: msm72k_udc: Flush both control out and in requests on _dequeue"
diff --git a/drivers/usb/gadget/msm72k_udc.c b/drivers/usb/gadget/msm72k_udc.c
index 923be08..e35a60e 100644
--- a/drivers/usb/gadget/msm72k_udc.c
+++ b/drivers/usb/gadget/msm72k_udc.c
@@ -1259,6 +1259,9 @@
 	struct msm_request *req, *next_req = NULL;
 	unsigned long flags;
 
+	if (!ept->req)
+		return;
+
 	/* inactive endpoints have nothing to do here */
 	if (ept->ep.maxpacket == 0)
 		return;
@@ -2206,6 +2209,9 @@
 	struct msm_endpoint *ep = to_msm_endpoint(_ep);
 	struct usb_info *ui = ep->ui;
 
+	if (!atomic_read(&ui->softconnect))
+		return -ENODEV;
+
 	if (ep == &ui->ep0in) {
 		struct msm_request *r = to_msm_request(req);
 		if (!req->length)
@@ -2233,6 +2239,13 @@
 	struct msm_request *temp_req;
 	unsigned long flags;
 
+	if (ep->num == 0) {
+		/* Flush both out and in control endpoints */
+		flush_endpoint(&ui->ep0out);
+		flush_endpoint(&ui->ep0in);
+		return 0;
+	}
+
 	if (!(ui && req && ep->req))
 		return -EINVAL;