/*- * Copyright (c) 2009,2010 Oleksandr Tymoshenko * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice unmodified, this list of conditions, and the following * disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ #ifndef __IF_ADAPTERVAR_H__ #define __IF_ADAPTERVAR_H__ /* * FIXME: Fix all this stuff, please */ #define ADAPTER_NPHY 32 #define ADAPTER_TX_RING_COUNT 128 #define ADAPTER_RX_RING_COUNT 128 #define ADAPTER_RX_DMA_SIZE ADAPTER_RX_RING_COUNT * sizeof(struct adapter_desc) #define ADAPTER_TX_DMA_SIZE ADAPTER_TX_RING_COUNT * sizeof(struct adapter_desc) #define ADAPTER_MAXFRAG 8 #define ADAPTER_RING_ALIGN sizeof(struct adapter_desc) #define ADAPTER_RX_ALIGN sizeof(uint32_t) #define ADAPTER_MAXFRAGS 8 /* * FIXME: And this */ /* * Physical address of i-th descriptor in TX/RX ring */ #define ADAPTER_TX_RING_ADDR(sc, i) \ ((sc)->adapter_rdata.adapter_tx_ring_paddr + sizeof(struct adapter_desc) * (i)) #define ADAPTER_RX_RING_ADDR(sc, i) \ ((sc)->adapter_rdata.adapter_rx_ring_paddr + sizeof(struct adapter_desc) * (i)) #define ADAPTER_INC(x,y) (x) = (((x) + 1) % y) #define ADAPTER_LOCK(_sc) mtx_lock(&(_sc)->adapter_mtx) #define ADAPTER_UNLOCK(_sc) mtx_unlock(&(_sc)->adapter_mtx) #define ADAPTER_LOCK_ASSERT(_sc) mtx_assert(&(_sc)->adapter_mtx, MA_OWNED) /* * register space access macros */ #define ADAPTER_WRITE(sc, reg, val) do { \ bus_write_4(sc->adapter_res, (reg), (val)); \ } while (0) #define ADAPTER_READ(sc, reg) bus_read_4(sc->adapter_res, (reg)) #define ADAPTER_SET_BITS(sc, reg, bits) \ ADAPTER_WRITE(sc, reg, ADAPTER_READ(sc, (reg)) | (bits)) #define ADAPTER_CLEAR_BITS(sc, reg, bits) \ ADAPTER_WRITE(sc, reg, ADAPTER_READ(sc, (reg)) & ~(bits)) struct adapter_txdesc { struct mbuf *tx_m; bus_dmamap_t tx_dmamap; }; struct adapter_rxdesc { struct mbuf *rx_m; bus_dmamap_t rx_dmamap; struct adapter_desc *desc; }; struct adapter_chain_data { bus_dma_tag_t adapter_parent_tag; bus_dma_tag_t adapter_tx_tag; struct adapter_txdesc adapter_txdesc[ADAPTER_TX_RING_COUNT]; bus_dma_tag_t adapter_rx_tag; struct adapter_rxdesc adapter_rxdesc[ADAPTER_RX_RING_COUNT]; bus_dma_tag_t adapter_tx_ring_tag; bus_dma_tag_t adapter_rx_ring_tag; bus_dmamap_t adapter_tx_ring_map; bus_dmamap_t adapter_rx_ring_map; bus_dmamap_t adapter_rx_sparemap; /* * FIXME: producers/consumers fields for RX/TX ring */ }; struct adapter_ring_data { struct adapter_desc *adapter_rx_ring; struct adapter_desc *adapter_tx_ring; bus_addr_t adapter_rx_ring_paddr; bus_addr_t adapter_tx_ring_paddr; }; struct adapter_softc { struct ifnet *adapter_ifp; /* interface info */ device_t adapter_dev; struct ifmedia adapter_ifmedia; struct resource *adapter_res; int adapter_rid; struct resource *adapter_irq; void *adapter_intrhand; device_t adapter_miibus; bus_dma_tag_t adapter_parent_tag; bus_dma_tag_t adapter_tag; struct mtx adapter_mtx; struct callout adapter_stat_callout; struct task adapter_link_task; struct adapter_chain_data adapter_cdata; struct adapter_ring_data adapter_rdata; int adapter_link_status; int adapter_detach; uint32_t adapter_intr_status; int adapter_if_flags; }; #endif /* __IF_ADAPTERVAR_H__ */