USB: usb_control_msg wait for driver ISR to set status.
authorRemy Bohmer <linux@bohmer.net>
Mon, 1 Feb 2010 18:40:47 +0000 (19:40 +0100)
committerRemy Bohmer <linux@bohmer.net>
Wed, 3 Feb 2010 21:06:59 +0000 (22:06 +0100)
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>
common/usb.c

index eef4b34a740ec1a4f9325bca26174de2453a94a3..10e23de6a410b3c5c05692723393896fdd93b340 100644 (file)
@@ -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;
+
 }
 
 /*-------------------------------------------------------------------