diff options
Diffstat (limited to 'sys/arch/macppc/dev/if_mc.c')
-rw-r--r-- | sys/arch/macppc/dev/if_mc.c | 99 |
1 files changed, 62 insertions, 37 deletions
diff --git a/sys/arch/macppc/dev/if_mc.c b/sys/arch/macppc/dev/if_mc.c index 850579701db..762e01f1372 100644 --- a/sys/arch/macppc/dev/if_mc.c +++ b/sys/arch/macppc/dev/if_mc.c @@ -1,4 +1,4 @@ -/* $OpenBSD: if_mc.c,v 1.7 2007/01/03 06:57:54 gwk Exp $ */ +/* $OpenBSD: if_mc.c,v 1.8 2007/03/23 17:17:23 gwk Exp $ */ /* $NetBSD: if_mc.c,v 1.9.16.1 2006/06/21 14:53:13 yamt Exp $ */ /*- @@ -363,8 +363,8 @@ mc_attach(struct device *parent, struct device *self, void *aux) u_int8_t lladdr[ETHER_ADDR_LEN]; int nseg, error; - if (OF_getprop(ca->ca_node, "local-mac-address", lladdr, ETHER_ADDR_LEN) - != ETHER_ADDR_LEN) { + if (OF_getprop(ca->ca_node, "local-mac-address", lladdr, + ETHER_ADDR_LEN) != ETHER_ADDR_LEN) { printf(": failed to get MAC address.\n"); return; } @@ -373,57 +373,64 @@ mc_attach(struct device *parent, struct device *self, void *aux) ca->ca_reg[2] += ca->ca_baseaddr; ca->ca_reg[4] += ca->ca_baseaddr; - sc->sc_reg = mapiodev(ca->ca_reg[0], ca->ca_reg[1]); - sc->sc_dmat = ca->ca_dmat; - sc->sc_txdma = mapiodev(ca->ca_reg[2], ca->ca_reg[3]); - sc->sc_rxdma = mapiodev(ca->ca_reg[4], ca->ca_reg[5]); + if ((sc->sc_reg = mapiodev(ca->ca_reg[0], ca->ca_reg[1])) == NULL) { + printf(": cannot map registers\n"); + return; + } - sc->sc_txdbdma = dbdma_alloc(sc->sc_dmat, 2); + sc->sc_dmat = ca->ca_dmat; sc->sc_tail = 0; + + if ((sc->sc_txdma = mapiodev(ca->ca_reg[2], ca->ca_reg[3])) == NULL) { + printf(": cannot map TX DMA registers\n"); + goto notxdma; + } + if ((sc->sc_rxdma = mapiodev(ca->ca_reg[4], ca->ca_reg[5])) == NULL) { + printf(": cannot map RX DMA registers\n"); + goto norxdma; + } + if ((sc->sc_txdbdma = dbdma_alloc(sc->sc_dmat, 2)) == NULL) { + printf(": cannot alloc TX DMA descriptors\n"); + goto notxdbdma; + } sc->sc_txdmacmd = sc->sc_txdbdma->d_addr; - sc->sc_rxdbdma = dbdma_alloc(sc->sc_dmat, 8 + 1); + + if ((sc->sc_rxdbdma = dbdma_alloc(sc->sc_dmat, 8 + 1)) == NULL) { + printf(": cannot alloc RX DMA descriptors\n"); + goto norxdbdma; + } sc->sc_rxdmacmd = sc->sc_rxdbdma->d_addr; - error = bus_dmamem_alloc(sc->sc_dmat, MACE_BUFSZ, - PAGE_SIZE, 0, sc->sc_bufseg, 1, &nseg, BUS_DMA_NOWAIT); - if (error) { - printf(": cannot allocate buffers (%d)\n", error); - return; + if ((error = bus_dmamem_alloc(sc->sc_dmat, MACE_BUFSZ, PAGE_SIZE, 0, + sc->sc_bufseg, 1, &nseg, BUS_DMA_NOWAIT))) { + printf(": cannot allocate DMA mem (%d)\n", error); + goto nodmamem; } - error = bus_dmamem_map(sc->sc_dmat, sc->sc_bufseg, nseg, - MACE_BUFSZ, &sc->sc_txbuf, BUS_DMA_NOWAIT); - if (error) { - printf(": cannot map buffers (%d)\n", error); - bus_dmamem_free(sc->sc_dmat, sc->sc_bufseg, 1); - return; + if ((error = bus_dmamem_map(sc->sc_dmat, sc->sc_bufseg, nseg, + MACE_BUFSZ, &sc->sc_txbuf, BUS_DMA_NOWAIT))) { + printf(": cannot map DMA mem (%d)\n", error); + goto nodmamap; } - error = bus_dmamap_create(sc->sc_dmat, MACE_BUFSZ, 1, MACE_BUFSZ, 0, - BUS_DMA_NOWAIT | BUS_DMA_ALLOCNOW, &sc->sc_bufmap); - if (error) { - printf(": cannot create buffer dmamap (%d)\n", error); - bus_dmamem_unmap(sc->sc_dmat, sc->sc_txbuf, MACE_BUFSZ); - bus_dmamem_free(sc->sc_dmat, sc->sc_bufseg, 1); - return; + if ((error = bus_dmamap_create(sc->sc_dmat, MACE_BUFSZ, 1, MACE_BUFSZ, + 0, BUS_DMA_NOWAIT | BUS_DMA_ALLOCNOW, &sc->sc_bufmap))) { + printf(": cannot create DMA map (%d)\n", error); + goto nodmacreate; } - error = bus_dmamap_load(sc->sc_dmat, sc->sc_bufmap, sc->sc_txbuf, - MACE_BUFSZ, NULL, BUS_DMA_NOWAIT); - if (error) { - printf(": cannot load buffers dmamap (%d)\n", error); - bus_dmamap_destroy(sc->sc_dmat, sc->sc_bufmap); - bus_dmamem_unmap(sc->sc_dmat, sc->sc_txbuf, MACE_BUFSZ); - bus_dmamem_free(sc->sc_dmat, sc->sc_bufseg, nseg); - return; + if ((error = bus_dmamap_load(sc->sc_dmat, sc->sc_bufmap, sc->sc_txbuf, + MACE_BUFSZ, NULL, BUS_DMA_NOWAIT))) { + printf(": cannot load DMA map (%d)\n", error); + goto nodmaload; } sc->sc_txbuf_pa = sc->sc_bufmap->dm_segs->ds_addr; sc->sc_rxbuf = sc->sc_txbuf + MACE_BUFLEN * MACE_TXBUFS; sc->sc_rxbuf_pa = sc->sc_txbuf_pa + MACE_BUFLEN * MACE_TXBUFS; - printf(": irq %d,%d,%d", - ca->ca_intr[0], ca->ca_intr[1], ca->ca_intr[2]); + printf(": irq %d,%d,%d", ca->ca_intr[0], ca->ca_intr[1], + ca->ca_intr[2]); /* disable receive DMA */ dbdma_reset(sc->sc_rxdma); @@ -464,6 +471,24 @@ mc_attach(struct device *parent, struct device *self, void *aux) if_attach(ifp); ether_ifattach(ifp); + + return; +nodmaload: + bus_dmamap_destroy(sc->sc_dmat, sc->sc_bufmap); +nodmacreate: + bus_dmamem_unmap(sc->sc_dmat, sc->sc_txbuf, MACE_BUFSZ); +nodmamap: + bus_dmamem_free(sc->sc_dmat, sc->sc_bufseg, 1); +nodmamem: + dbdma_free(sc->sc_rxdbdma); +norxdbdma: + dbdma_free(sc->sc_txdbdma); +notxdbdma: + unmapiodev((void *)ca->ca_reg[4], ca->ca_reg[5]); +norxdma: + unmapiodev((void *)ca->ca_reg[2], ca->ca_reg[3]); +notxdma: + unmapiodev((void *)ca->ca_reg[0], ca->ca_reg[1]); } int |