[RFC v2 2/3] WIP: usb: ehci-hcd: use non-interruptible version of mdelay()

Peter Mamonov pmamonov at gmail.com
Fri Sep 11 10:27:55 PDT 2015


Signed-off-by: Peter Mamonov <pmamonov at gmail.com>
---
 drivers/usb/host/ehci-hcd.c | 12 ++++++++++--
 1 file changed, 10 insertions(+), 2 deletions(-)

diff --git a/drivers/usb/host/ehci-hcd.c b/drivers/usb/host/ehci-hcd.c
index c9bf703..3d89ec5 100644
--- a/drivers/usb/host/ehci-hcd.c
+++ b/drivers/usb/host/ehci-hcd.c
@@ -133,6 +133,14 @@ static struct descriptor {
 	},
 };
 
+static inline void mdelay_ni(unsigned long msecs)
+{
+	uint64_t start = get_time_ns();
+
+	while (!is_timeout_non_interruptible(start, msecs * MSECOND))
+		;
+}
+
 #define ehci_is_TDI()	(ehci->flags & EHCI_HAS_TT)
 
 static int handshake(uint32_t *ptr, uint32_t mask, uint32_t done, int usec)
@@ -673,7 +681,7 @@ ehci_submit_root(struct usb_device *dev, unsigned long pipe, void *buffer,
 				 * root
 				 */
 				ehci_powerup_fixup(ehci);
-				mdelay(50);
+				mdelay_ni(50);
 				ehci->portreset |= 1 << port;
 				/* terminate the reset */
 				ehci_writel(status_reg, reg & ~EHCI_PS_PR);
@@ -736,7 +744,7 @@ ehci_submit_root(struct usb_device *dev, unsigned long pipe, void *buffer,
 		goto unknown;
 	}
 
-	mdelay(1);
+	mdelay_ni(1);
 	len = min3(srclen, (int)le16_to_cpu(req->length), length);
 	if (srcptr != NULL && len > 0)
 		memcpy(buffer, srcptr, len);
-- 
2.1.4




More information about the barebox mailing list