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;