summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonathan Gray <jsg@cvs.openbsd.org>2005-12-17 11:12:55 +0000
committerJonathan Gray <jsg@cvs.openbsd.org>2005-12-17 11:12:55 +0000
commit0d772ba1a2978d65a104b1e7715edea2ea7f6d2b (patch)
tree5a196fa9bbae12e3e230f2d810df1c043bd95416
parenta5b4b4c0d80f50e1207a964e0849d50ea7659e48 (diff)
Don't dynamically assign ring size, simplifies ring structures
and code that deals with rings. We can get away with this as we only have one type of rx and one type of tx ring at a time unlike ral(4). Suggested by and ok damien@
-rw-r--r--sys/dev/pci/if_nfe.c126
-rw-r--r--sys/dev/pci/if_nfevar.h8
2 files changed, 53 insertions, 81 deletions
diff --git a/sys/dev/pci/if_nfe.c b/sys/dev/pci/if_nfe.c
index 9277b1b8f94..ae4a851ae5c 100644
--- a/sys/dev/pci/if_nfe.c
+++ b/sys/dev/pci/if_nfe.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: if_nfe.c,v 1.3 2005/12/17 09:03:14 jsg Exp $ */
+/* $OpenBSD: if_nfe.c,v 1.4 2005/12/17 11:12:54 jsg Exp $ */
/*
* Copyright (c) 2005 Jonathan Gray <jsg@openbsd.org>
*
@@ -68,11 +68,11 @@ int nfe_match(struct device *, void *, void *);
void nfe_attach(struct device *, struct device *, void *);
int nfe_intr(void *);
-int nfe_alloc_rx_ring(struct nfe_softc *, struct nfe_rx_ring *, int);
+int nfe_alloc_rx_ring(struct nfe_softc *, struct nfe_rx_ring *);
void nfe_reset_rx_ring(struct nfe_softc *, struct nfe_rx_ring *);
void nfe_free_rx_ring(struct nfe_softc *, struct nfe_rx_ring *);
int nfe_rxintr(struct nfe_softc *);
-int nfe_alloc_tx_ring(struct nfe_softc *, struct nfe_tx_ring *, int);
+int nfe_alloc_tx_ring(struct nfe_softc *, struct nfe_tx_ring *);
void nfe_reset_tx_ring(struct nfe_softc *, struct nfe_tx_ring *);
void nfe_free_tx_ring(struct nfe_softc *, struct nfe_tx_ring *);
int nfe_txintr(struct nfe_softc *);
@@ -221,19 +221,20 @@ nfe_attach(struct device *parent, struct device *self, void *aux)
/*
* Allocate Tx and Rx rings.
*/
- if (nfe_alloc_tx_ring(sc, &sc->txq, NFE_TX_RING_COUNT) != 0) {
+ if (nfe_alloc_tx_ring(sc, &sc->txq) != 0) {
printf("%s: could not allocate Tx ring\n",
sc->sc_dev.dv_xname);
goto fail1;
}
- if (nfe_alloc_rx_ring(sc, &sc->rxq, NFE_RX_RING_COUNT) != 0) {
+ if (nfe_alloc_rx_ring(sc, &sc->rxq) != 0) {
printf("%s: could not allocate Rx ring\n",
sc->sc_dev.dv_xname);
goto fail2;
}
- NFE_WRITE(sc, NFE_RING_SIZE, sc->rxq.count << 16 | sc->txq.count);
+ NFE_WRITE(sc, NFE_RING_SIZE, NFE_RX_RING_COUNT << 16 |
+ NFE_TX_RING_COUNT);
ifp = &sc->sc_arpcom.ac_if;
ifp->if_softc = sc;
@@ -540,7 +541,7 @@ nfe_reset(struct nfe_softc *sc)
}
int
-nfe_alloc_rx_ring(struct nfe_softc *sc, struct nfe_rx_ring *ring, int count)
+nfe_alloc_rx_ring(struct nfe_softc *sc, struct nfe_rx_ring *ring)
{
struct nfe_rx_data *data;
struct nfe_desc *desc_v1;
@@ -556,18 +557,17 @@ nfe_alloc_rx_ring(struct nfe_softc *sc, struct nfe_rx_ring *ring, int count)
descsize = sizeof(struct nfe_desc);
}
- ring->count = count;
ring->cur = ring->next = 0;
- error = bus_dmamap_create(sc->sc_dmat, count * descsize, 1,
- count * descsize, 0, BUS_DMA_NOWAIT, &ring->map);
+ error = bus_dmamap_create(sc->sc_dmat, NFE_RX_RING_COUNT * descsize, 1,
+ NFE_RX_RING_COUNT * descsize, 0, BUS_DMA_NOWAIT, &ring->map);
if (error != 0) {
printf("%s: could not create desc DMA map\n",
sc->sc_dev.dv_xname);
goto fail;
}
- error = bus_dmamem_alloc(sc->sc_dmat, count * descsize,
+ error = bus_dmamem_alloc(sc->sc_dmat, NFE_RX_RING_COUNT * descsize,
PAGE_SIZE, 0, &ring->seg, 1, &nsegs, BUS_DMA_NOWAIT);
if (error != 0) {
printf("%s: could not allocate DMA memory\n",
@@ -576,7 +576,7 @@ nfe_alloc_rx_ring(struct nfe_softc *sc, struct nfe_rx_ring *ring, int count)
}
error = bus_dmamem_map(sc->sc_dmat, &ring->seg, nsegs,
- count * descsize, (caddr_t *)desc, BUS_DMA_NOWAIT);
+ NFE_RX_RING_COUNT * descsize, (caddr_t *)desc, BUS_DMA_NOWAIT);
if (error != 0) {
printf("%s: could not map desc DMA memory\n",
sc->sc_dev.dv_xname);
@@ -584,30 +584,21 @@ nfe_alloc_rx_ring(struct nfe_softc *sc, struct nfe_rx_ring *ring, int count)
}
error = bus_dmamap_load(sc->sc_dmat, ring->map, *desc,
- count * descsize, NULL, BUS_DMA_NOWAIT);
+ NFE_RX_RING_COUNT * descsize, NULL, BUS_DMA_NOWAIT);
if (error != 0) {
printf("%s: could not load desc DMA map\n",
sc->sc_dev.dv_xname);
goto fail;
}
- memset(*desc, 0, count * descsize);
+ memset(*desc, 0, NFE_RX_RING_COUNT * descsize);
ring->physaddr = ring->map->dm_segs->ds_addr;
- ring->data = malloc(count * sizeof (struct nfe_rx_data), M_DEVBUF,
- M_NOWAIT);
- if (ring->data == NULL) {
- printf("%s: could not allocate soft data\n",
- sc->sc_dev.dv_xname);
- error = ENOMEM;
- goto fail;
- }
-
/*
* Pre-allocate Rx buffers and populate Rx ring.
*/
- memset(ring->data, 0, count * sizeof (struct nfe_rx_data));
- for (i = 0; i < count; i++) {
+
+ for (i = 0; i < NFE_RX_RING_COUNT; i++) {
data = &sc->rxq.data[i];
error = bus_dmamap_create(sc->sc_dmat, MCLBYTES, 1, MCLBYTES,
@@ -677,7 +668,7 @@ nfe_reset_rx_ring(struct nfe_softc *sc, struct nfe_rx_ring *ring)
{
int i;
- for (i = 0; i < ring->count; i++) {
+ for (i = 0; i < NFE_RX_RING_COUNT; i++) {
if (sc->sc_flags & NFE_40BIT_ADDR) {
ring->desc_v3[i].length = htole16(MCLBYTES);
ring->desc_v3[i].flags = htole16(NFE_RX_READY);
@@ -713,26 +704,23 @@ nfe_free_rx_ring(struct nfe_softc *sc, struct nfe_rx_ring *ring)
ring->map->dm_mapsize, BUS_DMASYNC_POSTWRITE);
bus_dmamap_unload(sc->sc_dmat, ring->map);
bus_dmamem_unmap(sc->sc_dmat, (caddr_t)desc,
- ring->count * descsize);
+ NFE_RX_RING_COUNT * descsize);
bus_dmamem_free(sc->sc_dmat, &ring->seg, 1);
}
- if (ring->data != NULL) {
- for (i = 0; i < ring->count; i++) {
- data = &ring->data[i];
-
- if (data->m != NULL) {
- bus_dmamap_sync(sc->sc_dmat, data->map, 0,
- data->map->dm_mapsize,
- BUS_DMASYNC_POSTREAD);
- bus_dmamap_unload(sc->sc_dmat, data->map);
- m_freem(data->m);
- }
+ for (i = 0; i < NFE_RX_RING_COUNT; i++) {
+ data = &ring->data[i];
- if (data->map != NULL)
- bus_dmamap_destroy(sc->sc_dmat, data->map);
+ if (data->m != NULL) {
+ bus_dmamap_sync(sc->sc_dmat, data->map, 0,
+ data->map->dm_mapsize,
+ BUS_DMASYNC_POSTREAD);
+ bus_dmamap_unload(sc->sc_dmat, data->map);
+ m_freem(data->m);
}
- free(ring->data, M_DEVBUF);
+
+ if (data->map != NULL)
+ bus_dmamap_destroy(sc->sc_dmat, data->map);
}
}
@@ -744,7 +732,7 @@ nfe_rxintr(struct nfe_softc *sc)
}
int
-nfe_alloc_tx_ring(struct nfe_softc *sc, struct nfe_tx_ring *ring, int count)
+nfe_alloc_tx_ring(struct nfe_softc *sc, struct nfe_tx_ring *ring)
{
int i, nsegs, error;
void **desc;
@@ -758,12 +746,11 @@ nfe_alloc_tx_ring(struct nfe_softc *sc, struct nfe_tx_ring *ring, int count)
descsize = sizeof(struct nfe_desc);
}
- ring->count = count;
ring->queued = 0;
ring->cur = ring->next = 0;
- error = bus_dmamap_create(sc->sc_dmat, count * descsize, 1,
- count * descsize, 0, BUS_DMA_NOWAIT, &ring->map);
+ error = bus_dmamap_create(sc->sc_dmat, NFE_TX_RING_COUNT * descsize, 1,
+ NFE_TX_RING_COUNT * descsize, 0, BUS_DMA_NOWAIT, &ring->map);
if (error != 0) {
printf("%s: could not create desc DMA map\n",
@@ -771,7 +758,7 @@ nfe_alloc_tx_ring(struct nfe_softc *sc, struct nfe_tx_ring *ring, int count)
goto fail;
}
- error = bus_dmamem_alloc(sc->sc_dmat, count * descsize,
+ error = bus_dmamem_alloc(sc->sc_dmat, NFE_TX_RING_COUNT * descsize,
PAGE_SIZE, 0, &ring->seg, 1, &nsegs, BUS_DMA_NOWAIT);
if (error != 0) {
printf("%s: could not allocate DMA memory\n",
@@ -780,7 +767,7 @@ nfe_alloc_tx_ring(struct nfe_softc *sc, struct nfe_tx_ring *ring, int count)
}
error = bus_dmamem_map(sc->sc_dmat, &ring->seg, nsegs,
- count * sizeof(struct nfe_desc), (caddr_t *)desc,
+ NFE_TX_RING_COUNT * sizeof(struct nfe_desc), (caddr_t *)desc,
BUS_DMA_NOWAIT);
if (error != 0) {
printf("%s: could not map desc DMA memory\n",
@@ -789,27 +776,17 @@ nfe_alloc_tx_ring(struct nfe_softc *sc, struct nfe_tx_ring *ring, int count)
}
error = bus_dmamap_load(sc->sc_dmat, ring->map, *desc,
- count * descsize, NULL, BUS_DMA_NOWAIT);
+ NFE_TX_RING_COUNT * descsize, NULL, BUS_DMA_NOWAIT);
if (error != 0) {
printf("%s: could not load desc DMA map\n",
sc->sc_dev.dv_xname);
goto fail;
}
- memset(desc, 0, count * sizeof(struct nfe_desc));
+ memset(*desc, 0, NFE_TX_RING_COUNT * descsize);
ring->physaddr = ring->map->dm_segs->ds_addr;
- ring->data = malloc(count * sizeof(struct nfe_tx_data), M_DEVBUF,
- M_NOWAIT);
- if (ring->data == NULL) {
- printf("%s: could not allocate soft data\n",
- sc->sc_dev.dv_xname);
- error = ENOMEM;
- goto fail;
- }
-
- memset(ring->data, 0, count * sizeof (struct nfe_tx_data));
- for (i = 0; i < count; i++) {
+ for (i = 0; i < NFE_TX_RING_COUNT; i++) {
error = bus_dmamap_create(sc->sc_dmat, MCLBYTES,
NFE_MAX_SCATTER, MCLBYTES, 0, BUS_DMA_NOWAIT,
&ring->data[i].map);
@@ -833,7 +810,7 @@ nfe_reset_tx_ring(struct nfe_softc *sc, struct nfe_tx_ring *ring)
struct nfe_tx_data *data;
int i;
- for (i = 0; i < ring->count; i++) {
+ for (i = 0; i < NFE_TX_RING_COUNT; i++) {
if (sc->sc_flags & NFE_40BIT_ADDR)
desc = &ring->desc_v3[i];
else
@@ -882,26 +859,23 @@ nfe_free_tx_ring(struct nfe_softc *sc, struct nfe_tx_ring *ring)
ring->map->dm_mapsize, BUS_DMASYNC_POSTWRITE);
bus_dmamap_unload(sc->sc_dmat, ring->map);
bus_dmamem_unmap(sc->sc_dmat, (caddr_t)desc,
- ring->count * descsize);
+ NFE_TX_RING_COUNT * descsize);
bus_dmamem_free(sc->sc_dmat, &ring->seg, 1);
}
- if (ring->data != NULL) {
- for (i = 0; i < ring->count; i++) {
- data = &ring->data[i];
-
- if (data->m != NULL) {
- bus_dmamap_sync(sc->sc_dmat, data->map, 0,
- data->map->dm_mapsize,
- BUS_DMASYNC_POSTWRITE);
- bus_dmamap_unload(sc->sc_dmat, data->map);
- m_freem(data->m);
- }
+ for (i = 0; i < NFE_TX_RING_COUNT; i++) {
+ data = &ring->data[i];
- if (data->map != NULL)
- bus_dmamap_destroy(sc->sc_dmat, data->map);
+ if (data->m != NULL) {
+ bus_dmamap_sync(sc->sc_dmat, data->map, 0,
+ data->map->dm_mapsize,
+ BUS_DMASYNC_POSTWRITE);
+ bus_dmamap_unload(sc->sc_dmat, data->map);
+ m_freem(data->m);
}
- free(ring->data, M_DEVBUF);
+
+ if (data->map != NULL)
+ bus_dmamap_destroy(sc->sc_dmat, data->map);
}
}
diff --git a/sys/dev/pci/if_nfevar.h b/sys/dev/pci/if_nfevar.h
index 4a76db2e7e9..58691c358fe 100644
--- a/sys/dev/pci/if_nfevar.h
+++ b/sys/dev/pci/if_nfevar.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: if_nfevar.h,v 1.2 2005/12/14 22:08:20 jsg Exp $ */
+/* $OpenBSD: if_nfevar.h,v 1.3 2005/12/17 11:12:54 jsg Exp $ */
/*
* Copyright (c) 2005 Jonathan Gray <jsg@openbsd.org>
*
@@ -28,8 +28,7 @@ struct nfe_tx_ring {
bus_addr_t physaddr;
struct nfe_desc *desc_v1;
struct nfe_desc_v3 *desc_v3;
- struct nfe_tx_data *data;
- int count;
+ struct nfe_tx_data data[NFE_TX_RING_COUNT];
int queued;
int cur;
int next;
@@ -47,8 +46,7 @@ struct nfe_rx_ring {
bus_addr_t physaddr;
struct nfe_desc *desc_v1;
struct nfe_desc_v3 *desc_v3;
- struct nfe_rx_data *data;
- int count;
+ struct nfe_rx_data data[NFE_RX_RING_COUNT];
int cur;
int next;
};