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)