summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Gwynne <dlg@cvs.openbsd.org>2007-04-21 12:40:43 +0000
committerDavid Gwynne <dlg@cvs.openbsd.org>2007-04-21 12:40:43 +0000
commit802451b558493b5138f2f2d17a4d9d4efbe18599 (patch)
tree2cd51716e982c885c150eade7b27211aab8ab71b
parent5d224da271a37f683833417eea65e984b4488b57 (diff)
allocate a small list of tx and rx descriptors on interface up and down.
-rw-r--r--sys/dev/pci/if_tht.c24
1 files changed, 22 insertions, 2 deletions
diff --git a/sys/dev/pci/if_tht.c b/sys/dev/pci/if_tht.c
index 415469ae71c..c16795732b5 100644
--- a/sys/dev/pci/if_tht.c
+++ b/sys/dev/pci/if_tht.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: if_tht.c,v 1.39 2007/04/21 12:36:06 dlg Exp $ */
+/* $OpenBSD: if_tht.c,v 1.40 2007/04/21 12:40:42 dlg Exp $ */
/*
* Copyright (c) 2007 David Gwynne <dlg@openbsd.org>
@@ -345,6 +345,9 @@ struct tht_softc {
u_int16_t sc_lladdr[3];
+ struct tht_pkt_list sc_tx_list;
+ struct tht_pkt_list sc_rx_list;
+
struct tht_fifo sc_txt;
struct tht_fifo sc_rxf;
struct tht_fifo sc_rxd;
@@ -721,8 +724,13 @@ tht_up(struct tht_softc *sc)
return;
}
- if (tht_fifo_alloc(sc, &sc->sc_txt, &tht_txt_desc) != 0)
+ if (tht_pkt_alloc(sc, &sc->sc_tx_list, 64, THT_TXT_SGL_LEN) != 0)
return;
+ if (tht_pkt_alloc(sc, &sc->sc_rx_list, 64, THT_RXF_SGL_LEN) != 0)
+ goto free_tx_list;
+
+ if (tht_fifo_alloc(sc, &sc->sc_txt, &tht_txt_desc) != 0)
+ goto free_rx_list;
if (tht_fifo_alloc(sc, &sc->sc_rxf, &tht_rxf_desc) != 0)
goto free_txt;
if (tht_fifo_alloc(sc, &sc->sc_rxd, &tht_rxd_desc) != 0)
@@ -730,6 +738,8 @@ tht_up(struct tht_softc *sc)
if (tht_fifo_alloc(sc, &sc->sc_txf, &tht_txf_desc) != 0)
goto free_rxd;
+ /* populate rxf fifo */
+
ifp->if_flags |= IFF_RUNNING;
ifp->if_flags &= ~IFF_OACTIVE;
@@ -745,6 +755,11 @@ free_txt:
tht_fifo_free(sc, &sc->sc_txt);
tht_sw_reset(sc);
+
+free_rx_list:
+ tht_pkt_free(sc, &sc->sc_rx_list);
+free_tx_list:
+ tht_pkt_free(sc, &sc->sc_tx_list);
}
void
@@ -769,6 +784,11 @@ tht_down(struct tht_softc *sc)
tht_fifo_free(sc, &sc->sc_rxd);
tht_fifo_free(sc, &sc->sc_rxf);
tht_fifo_free(sc, &sc->sc_txt);
+
+ /* free mbufs that were on the rxf fifo */
+
+ tht_pkt_free(sc, &sc->sc_rx_list);
+ tht_pkt_free(sc, &sc->sc_tx_list);
}
void