BXE: fixes ECORE sleep loops
authorBarret Rhoden <brho@cs.berkeley.edu>
Wed, 28 Jan 2015 23:44:11 +0000 (18:44 -0500)
committerBarret Rhoden <brho@cs.berkeley.edu>
Tue, 3 Feb 2015 15:12:31 +0000 (10:12 -0500)
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().

kern/drivers/net/bxe/ecore_sp.c
kern/drivers/net/bxe/ecore_sp.h

index 27b2187..7a3c114 100644 (file)
@@ -312,7 +312,7 @@ static inline int ecore_state_wait(struct bxe_adapter *sc, int state,
                        return ECORE_SUCCESS;
                }
 
-               ECORE_WAIT(sc, delay_us);
+               ECORE_WAIT(sc, 1000);
 
                if (sc->panic)
                        return ECORE_IO;
index 467bfc7..5f97f92 100644 (file)
@@ -134,8 +134,10 @@ typedef _Bool bool;
 #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)