diff options
Diffstat (limited to 'sys/dev/tx')
-rw-r--r-- | sys/dev/tx/if_tx.c | 42 | ||||
-rw-r--r-- | sys/dev/tx/if_txvar.h | 1 |
2 files changed, 18 insertions, 25 deletions
diff --git a/sys/dev/tx/if_tx.c b/sys/dev/tx/if_tx.c index 106ede8..faf4841 100644 --- a/sys/dev/tx/if_tx.c +++ b/sys/dev/tx/if_tx.c @@ -509,12 +509,11 @@ epic_freebsd_attach(dev) } /* Do OS independent part, including chip wakeup and reset */ - if (epic_common_attach(sc)) { - device_printf(dev, "memory distribution error\n"); + error = epic_common_attach(sc); + if (error) { bus_teardown_intr(dev, sc->irq, sc->sc_ih); bus_release_resource(dev, SYS_RES_IRQ, 0, sc->irq); bus_release_resource(dev, EPIC_RES, EPIC_RID, sc->res); - error = ENXIO; goto fail; } @@ -582,7 +581,9 @@ epic_freebsd_detach(dev) bus_release_resource(dev, SYS_RES_IRQ, 0, sc->irq); bus_release_resource(dev, EPIC_RES, EPIC_RID, sc->res); - free(sc->pool, M_DEVBUF); + free(sc->tx_flist, M_DEVBUF); + free(sc->tx_desc, M_DEVBUF); + free(sc->rx_desc, M_DEVBUF); splx(s); @@ -756,29 +757,22 @@ epic_common_attach(sc) epic_softc_t *sc; { int i; - caddr_t pool; - - i = sizeof(struct epic_frag_list)*TX_RING_SIZE + - sizeof(struct epic_rx_desc)*RX_RING_SIZE + - sizeof(struct epic_tx_desc)*TX_RING_SIZE + PAGE_SIZE, - sc->pool = (epic_softc_t *) malloc(i, M_DEVBUF, M_NOWAIT | M_ZERO); - if (sc->pool == NULL) { - printf(": can't allocate memory for buffers\n"); - return -1; + sc->tx_flist = malloc(sizeof(struct epic_frag_list)*TX_RING_SIZE, + M_DEVBUF, M_NOWAIT | M_ZERO); + sc->tx_desc = malloc(sizeof(struct epic_tx_desc)*TX_RING_SIZE, + M_DEVBUF, M_NOWAIT | M_ZERO); + sc->rx_desc = malloc(sizeof(struct epic_rx_desc)*RX_RING_SIZE, + M_DEVBUF, M_NOWAIT | M_ZERO); + + if (sc->tx_flist == NULL || sc->tx_desc == NULL || sc->rx_desc == NULL){ + device_printf(sc->dev, "Failed to malloc memory\n"); + if (sc->tx_flist) free(sc->tx_flist, M_DEVBUF); + if (sc->tx_desc) free(sc->tx_desc, M_DEVBUF); + if (sc->rx_desc) free(sc->rx_desc, M_DEVBUF); + return (ENOMEM); } - /* Align pool on PAGE_SIZE */ - pool = (caddr_t)sc->pool; - pool = (caddr_t)((uintptr_t)(pool + PAGE_SIZE - 1) & ~(PAGE_SIZE - 1)); - - /* Distribute memory */ - sc->tx_flist = (void *)pool; - pool += sizeof(struct epic_frag_list)*TX_RING_SIZE; - sc->rx_desc = (void *)pool; - pool += sizeof(struct epic_rx_desc)*RX_RING_SIZE; - sc->tx_desc = (void *)pool; - /* Bring the chip out of low-power mode. */ CSR_WRITE_4( sc, GENCTL, GENCTL_SOFT_RESET); DELAY(500); diff --git a/sys/dev/tx/if_txvar.h b/sys/dev/tx/if_txvar.h index c716a99..432f14b 100644 --- a/sys/dev/tx/if_txvar.h +++ b/sys/dev/tx/if_txvar.h @@ -107,7 +107,6 @@ typedef struct { struct mii_softc *physc; u_int32_t phyid; int serinst; - void *pool; } epic_softc_t; struct epic_type { |