BXE: fixes ECORE sleep loops
It's waiting on something from a taskqueue. The IRQ fires and executes
(hooray!), but the task wouldn't run since we're non-preemptive. The solution
is to kthread_usleep().
diff --git a/kern/drivers/net/bxe/ecore_sp.c b/kern/drivers/net/bxe/ecore_sp.c
index 27b2187..7a3c114 100644
--- a/kern/drivers/net/bxe/ecore_sp.c
+++ b/kern/drivers/net/bxe/ecore_sp.c
@@ -312,7 +312,7 @@
return ECORE_SUCCESS;
}
- ECORE_WAIT(sc, delay_us);
+ ECORE_WAIT(sc, 1000);
if (sc->panic)
return ECORE_IO;
diff --git a/kern/drivers/net/bxe/ecore_sp.h b/kern/drivers/net/bxe/ecore_sp.h
index 467bfc7..5f97f92 100644
--- a/kern/drivers/net/bxe/ecore_sp.h
+++ b/kern/drivers/net/bxe/ecore_sp.h
@@ -134,8 +134,10 @@
#define ECORE_CPU_TO_LE16(x) cpu_to_le16(x)
#define ECORE_CPU_TO_LE32(x) cpu_to_le32(x)
-#define ECORE_WAIT(_s, _t) udelay(1000)
-#define ECORE_MSLEEP(_t) udelay((_t) * 1000)
+/* On BSD wait is a udelay. ECORE uses it to wait for a taskqueue, which won't
+ * run preemptively on Akaros. */
+#define ECORE_WAIT(_s, _t) kthread_usleep((_t))
+#define ECORE_MSLEEP(_t) kthread_usleep((_t) * 1000)
#define ECORE_LIKELY(x) (x)
#define ECORE_UNLIKELY(x) (x)