From: Remy Bohmer <linux@bohmer.net>
Date: Mon, 1 Feb 2010 18:40:47 +0000 (+0100)
Subject: USB: usb_control_msg wait for driver ISR to set status.
X-Git-Tag: v2025.01-rc5-pxa1908~20489
X-Git-Url: http://git.dujemihanovic.xyz/img/html/static/gitweb.css?a=commitdiff_plain;h=84d36b30181acfb72f22d1105c15574b30ea2fa1;p=u-boot.git

USB: usb_control_msg wait for driver ISR to set status.

This patch changes usb_control_msg back to the state prior to commit
48867208444cb2a82e2af9c3249e90b7ed4a1751.

The USB driver ISR routine may update the status.

Signed-off-by: Daniel Hellstrom <daniel@gaisler.com>
---

diff --git a/common/usb.c b/common/usb.c
index eef4b34a74..10e23de6a4 100644
--- a/common/usb.c
+++ b/common/usb.c
@@ -197,16 +197,21 @@ int usb_control_msg(struct usb_device *dev, unsigned int pipe,
 	if (timeout == 0)
 		return (int)size;
 
-	if (dev->status != 0) {
-		/*
-		 * Let's wait a while for the timeout to elapse.
-		 * It has no real use, but it keeps the interface happy.
-		 */
-		wait_ms(timeout);
-		return -1;
+	/*
+	 * Wait for status to update until timeout expires, USB driver
+	 * interrupt handler may set the status when the USB operation has
+	 * been completed.
+	 */
+	while (timeout--) {
+		if (!((volatile unsigned long)dev->status & USB_ST_NOT_PROC))
+			break;
+		wait_ms(1);
 	}
+	if (dev->status)
+		return -1;
 
 	return dev->act_len;
+
 }
 
 /*-------------------------------------------------------------------