bfe_dma_alloc(device_t dev)
{
struct bfe_softc *sc = device_get_softc(dev);
- int error, i, tx_pos, rx_pos;
+ int error, i, tx_pos = 0, rx_pos = 0;
/*
* Parent tag. Apparently the chip cannot handle any DMA address
return(error);
}
- /* tag for mbufs */
+ /* Tag for RX mbufs */
error = bus_dma_tag_create(sc->bfe_parent_tag, ETHER_ALIGN, 0,
BUS_SPACE_MAXADDR, BUS_SPACE_MAXADDR,
NULL, NULL,
MCLBYTES, 1, MCLBYTES,
- BUS_DMA_ALLOCNOW, &sc->bfe_tag);
+ BUS_DMA_ALLOCNOW, &sc->bfe_rxbuf_tag);
if (error) {
- device_printf(dev, "could not allocate dma tag for mbufs\n");
+ device_printf(dev, "could not allocate dma tag for RX mbufs\n");
return(error);
}
- rx_pos = tx_pos = 0;
+ error = bus_dmamap_create(sc->bfe_rxbuf_tag, 0, &sc->bfe_rx_tmpmap);
+ if (error) {
+ device_printf(dev, "could not create RX mbuf tmp map\n");
+ bus_dma_tag_destroy(sc->bfe_rxbuf_tag);
+ sc->bfe_rxbuf_tag = NULL;
+ return error;
+ }
- /* pre allocate dmamaps for RX list */
+ /* Allocate dma maps for RX list */
for (i = 0; i < BFE_RX_LIST_CNT; i++) {
- error = bus_dmamap_create(sc->bfe_tag, 0,
+ error = bus_dmamap_create(sc->bfe_rxbuf_tag, 0,
&sc->bfe_rx_ring[i].bfe_map);
if (error) {
rx_pos = i;
}
rx_pos = BFE_RX_LIST_CNT;
- /* pre allocate dmamaps for TX list */
+ /* Tag for TX mbufs */
+ error = bus_dma_tag_create(sc->bfe_parent_tag, ETHER_ALIGN, 0,
+ BUS_SPACE_MAXADDR, BUS_SPACE_MAXADDR,
+ NULL, NULL,
+ MCLBYTES, 1, MCLBYTES,
+ BUS_DMA_ALLOCNOW, &sc->bfe_txbuf_tag);
+ if (error) {
+ device_printf(dev, "could not allocate dma tag for TX mbufs\n");
+ return(error);
+ }
+
+ /* Allocate dmamaps for TX list */
for (i = 0; i < BFE_TX_LIST_CNT; i++) {
- error = bus_dmamap_create(sc->bfe_tag, 0,
+ error = bus_dmamap_create(sc->bfe_txbuf_tag, 0,
&sc->bfe_tx_ring[i].bfe_map);
if (error) {
tx_pos = i;
return(0);
ring_fail:
- for (i = 0; i < rx_pos; ++i)
- bus_dmamap_destroy(sc->bfe_tag, sc->bfe_rx_ring[i].bfe_map);
- for (i = 0; i < tx_pos; ++i)
- bus_dmamap_destroy(sc->bfe_tag, sc->bfe_tx_ring[i].bfe_map);
+ if (sc->bfe_rxbuf_tag != NULL) {
+ for (i = 0; i < rx_pos; ++i) {
+ bus_dmamap_destroy(sc->bfe_rxbuf_tag,
+ sc->bfe_rx_ring[i].bfe_map);
+ }
+ bus_dmamap_destroy(sc->bfe_rxbuf_tag, sc->bfe_rx_tmpmap);
+ bus_dma_tag_destroy(sc->bfe_rxbuf_tag);
+ sc->bfe_rxbuf_tag = NULL;
+ }
- bus_dma_tag_destroy(sc->bfe_tag);
- sc->bfe_tag = NULL;
+ if (sc->bfe_txbuf_tag != NULL) {
+ for (i = 0; i < tx_pos; ++i) {
+ bus_dmamap_destroy(sc->bfe_txbuf_tag,
+ sc->bfe_tx_ring[i].bfe_map);
+ }
+ bus_dma_tag_destroy(sc->bfe_txbuf_tag);
+ sc->bfe_txbuf_tag = NULL;
+ }
return error;
}
int i;
for (i = 0; i < BFE_TX_LIST_CNT; i++) {
- bus_dmamap_unload(sc->bfe_tag,
+ bus_dmamap_unload(sc->bfe_txbuf_tag,
sc->bfe_tx_ring[i].bfe_map);
if (sc->bfe_tx_ring[i].bfe_mbuf != NULL) {
m_freem(sc->bfe_tx_ring[i].bfe_mbuf);
for (i = 0; i < BFE_RX_LIST_CNT; i++) {
if (sc->bfe_rx_ring[i].bfe_mbuf != NULL) {
- bus_dmamap_unload(sc->bfe_tag,
+ bus_dmamap_unload(sc->bfe_rxbuf_tag,
sc->bfe_rx_ring[i].bfe_map);
m_freem(sc->bfe_rx_ring[i].bfe_mbuf);
sc->bfe_rx_ring[i].bfe_mbuf = NULL;
d = &sc->bfe_rx_list[c];
r = &sc->bfe_rx_ring[c];
/* XXX error? */
- bus_dmamap_load(sc->bfe_tag, r->bfe_map, mtod(m, void *),
+ bus_dmamap_load(sc->bfe_rxbuf_tag, r->bfe_map, mtod(m, void *),
MCLBYTES, bfe_dma_map_desc, d, BUS_DMA_NOWAIT);
- bus_dmamap_sync(sc->bfe_tag, r->bfe_map, BUS_DMASYNC_PREWRITE);
+ bus_dmamap_sync(sc->bfe_rxbuf_tag, r->bfe_map, BUS_DMASYNC_PREWRITE);
ctrl = ETHER_MAX_LEN + 32;
static void
bfe_dma_free(struct bfe_softc *sc)
{
+ int i;
+
if (sc->bfe_tx_tag != NULL) {
bus_dmamap_unload(sc->bfe_tx_tag, sc->bfe_tx_map);
if (sc->bfe_tx_list != NULL) {
sc->bfe_rx_tag = NULL;
}
- if (sc->bfe_tag != NULL) {
- int i;
-
+ if (sc->bfe_txbuf_tag != NULL) {
for (i = 0; i < BFE_TX_LIST_CNT; i++) {
- bus_dmamap_destroy(sc->bfe_tag,
+ bus_dmamap_destroy(sc->bfe_txbuf_tag,
sc->bfe_tx_ring[i].bfe_map);
}
+ bus_dma_tag_destroy(sc->bfe_txbuf_tag);
+ sc->bfe_txbuf_tag = NULL;
+ }
+
+ if (sc->bfe_rxbuf_tag != NULL) {
for (i = 0; i < BFE_RX_LIST_CNT; i++) {
- bus_dmamap_destroy(sc->bfe_tag,
+ bus_dmamap_destroy(sc->bfe_rxbuf_tag,
sc->bfe_rx_ring[i].bfe_map);
}
-
- bus_dma_tag_destroy(sc->bfe_tag);
- sc->bfe_tag = NULL;
+ bus_dmamap_destroy(sc->bfe_rxbuf_tag, sc->bfe_rx_tmpmap);
+ bus_dma_tag_destroy(sc->bfe_rxbuf_tag);
+ sc->bfe_rxbuf_tag = NULL;
}
if (sc->bfe_parent_tag != NULL) {
while (i != chipidx) {
struct bfe_data *r = &sc->bfe_tx_ring[i];
- bus_dmamap_unload(sc->bfe_tag, r->bfe_map);
+ bus_dmamap_unload(sc->bfe_txbuf_tag, r->bfe_map);
if (r->bfe_mbuf != NULL) {
ifp->if_opackets++;
m_freem(r->bfe_mbuf);
r = &sc->bfe_rx_ring[cons];
m = r->bfe_mbuf;
rxheader = mtod(m, struct bfe_rxheader*);
- bus_dmamap_sync(sc->bfe_tag, r->bfe_map, BUS_DMASYNC_POSTREAD);
+ bus_dmamap_sync(sc->bfe_rxbuf_tag, r->bfe_map, BUS_DMASYNC_POSTREAD);
len = rxheader->len;
r->bfe_mbuf = NULL;
- bus_dmamap_unload(sc->bfe_tag, r->bfe_map);
+ bus_dmamap_unload(sc->bfe_rxbuf_tag, r->bfe_map);
flags = rxheader->flags;
len -= ETHER_CRC_LEN;
d->bfe_ctrl |= BFE_DESC_EOT;
}
- error = bus_dmamap_load(sc->bfe_tag, r->bfe_map,
+ error = bus_dmamap_load(sc->bfe_txbuf_tag, r->bfe_map,
mtod(m, void *), m->m_len,
bfe_dma_map_desc, d,
BUS_DMA_NOWAIT);
return (ENOBUFS);
}
- bus_dmamap_sync(sc->bfe_tag, r->bfe_map,
+ bus_dmamap_sync(sc->bfe_txbuf_tag, r->bfe_map,
BUS_DMASYNC_PREWRITE);
frag = cur;