From: Remy Bohmer 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: v2010.03-rc1~90 X-Git-Url: https://git.librecmc.org/?a=commitdiff_plain;h=84d36b30181acfb72f22d1105c15574b30ea2fa1;p=oweals%2Fu-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 --- 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; + } /*-------------------------------------------------------------------