BXE: use separate lists for 9ns and BSD stuff
The old prev list was supposed to be for something else. We'll just use our
own TAILQ for the ctlr list.
diff --git a/kern/drivers/net/bxe/bxe.c b/kern/drivers/net/bxe/bxe.c
index 81ccc42..22e361e 100644
--- a/kern/drivers/net/bxe/bxe.c
+++ b/kern/drivers/net/bxe/bxe.c
@@ -250,9 +250,9 @@
};
#endif
-qlock_t bxe_prev_mtx;
-struct bxe_prev_list bxe_prev_list = LIST_HEAD_INITIALIZER(bxe_prev_list);
+#define BXE_PREV_WAIT_NEEDED 1
+qlock_t bxe_prev_mtx;
struct bxe_prev_list_node {
LIST_ENTRY(bxe_prev_list_node) node;
uint8_t bus;
@@ -261,7 +261,7 @@
uint8_t aer; /* XXX automatic error recovery */
uint8_t undi;
};
-//static LIST_HEAD(, bxe_prev_list_node) bxe_prev_list = LIST_HEAD_INITIALIZER(bxe_prev_list);
+static LIST_HEAD(, bxe_prev_list_node) bxe_prev_list = LIST_HEAD_INITIALIZER(bxe_prev_list);
/* Tunable device values... */
@@ -15636,7 +15636,7 @@
BLOGD(sc, DBG_LOAD,
"Marked path %d/%d/%d - finished previous unload\n",
sc->pcie_bus, sc->pcie_device, SC_PATH(sc));
- // LIST_INSERT_HEAD(&bxe_prev_list, tmp, node);
+ LIST_INSERT_HEAD(&bxe_prev_list, tmp, node);
qunlock(&bxe_prev_mtx);
diff --git a/kern/drivers/net/bxe/bxe.h b/kern/drivers/net/bxe/bxe.h
index 9de3bd0..9913779 100644
--- a/kern/drivers/net/bxe/bxe.h
+++ b/kern/drivers/net/bxe/bxe.h
@@ -1320,7 +1320,7 @@
* has a first element of 'void *if_softc' (which is us). XXX
*/
if_t ifp;
- LIST_ENTRY(bxe_adapter) node;
+ TAILQ_ENTRY(bxe_adapter) link9ns;
/* OS defined structs */
struct net_device *netdev;
struct pci_device *pcidev;
@@ -2274,10 +2274,8 @@
void bxe_dump_mbuf_data(struct bxe_adapter *sc, char *pTag,
struct mbuf *m, uint8_t contents);
-/* Defined in bxe.c, init'd in bxereset or something in bxe_dev.c */
+/* Declared in bxe.c, init'd in pnp */
extern qlock_t bxe_prev_mtx;
-LIST_HEAD(bxe_prev_list, bxe_adapter);
-extern struct bxe_prev_list bxe_prev_list;
/***********/
/* INLINES */
diff --git a/kern/drivers/net/bxe/bxe_dev.c b/kern/drivers/net/bxe/bxe_dev.c
index 0283204..0e1fecb 100644
--- a/kern/drivers/net/bxe/bxe_dev.c
+++ b/kern/drivers/net/bxe/bxe_dev.c
@@ -26,6 +26,10 @@
/* We're required to print out stats at some point. Here are a couple from
* igbe, as an example. */
+spinlock_t bxe_adapter_tq_lock = SPINLOCK_INITIALIZER;
+TAILQ_HEAD(bxe_adapter_tq, bxe_adapter);
+struct bxe_adapter_tq bxe_adapter_tq = TAILQ_HEAD_INITIALIZER(bxe_adapter_tq);
+
static char *statistics[Nstatistics] = {
"CRC Error",
"Alignment Error",
@@ -372,10 +376,9 @@
continue;
}
- /* BSD used mutexes for this list for other reasons */
- qlock(&bxe_prev_mtx);
- LIST_INSERT_HEAD(&bxe_prev_list, ctlr, node);
- qunlock(&bxe_prev_mtx);
+ spin_lock(&bxe_adapter_tq_lock);
+ TAILQ_INSERT_TAIL(&bxe_adapter_tq, ctlr, link9ns);
+ spin_unlock(&bxe_adapter_tq_lock);
}
}
@@ -390,15 +393,15 @@
* MMIO/port setup */
run_once(bxepci());
- qlock(&bxe_prev_mtx);
- LIST_FOREACH(ctlr, &bxe_prev_list, node) {
+ spin_lock(&bxe_adapter_tq_lock);
+ TAILQ_FOREACH(ctlr, &bxe_adapter_tq, link9ns) {
/* just take the first inactive ctlr on the list */
if (ctlr->active)
continue;
ctlr->active = 1;
break;
}
- qunlock(&bxe_prev_mtx);
+ spin_unlock(&bxe_adapter_tq_lock);
if (ctlr == NULL)
return -1;