113bca4c6SSepherosa Ziehau /* 213bca4c6SSepherosa Ziehau * Copyright (c) 2004 313bca4c6SSepherosa Ziehau * Bill Paul <wpaul@windriver.com>. All rights reserved. 413bca4c6SSepherosa Ziehau * 513bca4c6SSepherosa Ziehau * Redistribution and use in source and binary forms, with or without 613bca4c6SSepherosa Ziehau * modification, are permitted provided that the following conditions 713bca4c6SSepherosa Ziehau * are met: 813bca4c6SSepherosa Ziehau * 1. Redistributions of source code must retain the above copyright 913bca4c6SSepherosa Ziehau * notice, this list of conditions and the following disclaimer. 1013bca4c6SSepherosa Ziehau * 2. Redistributions in binary form must reproduce the above copyright 1113bca4c6SSepherosa Ziehau * notice, this list of conditions and the following disclaimer in the 1213bca4c6SSepherosa Ziehau * documentation and/or other materials provided with the distribution. 1313bca4c6SSepherosa Ziehau * 3. All advertising materials mentioning features or use of this software 1413bca4c6SSepherosa Ziehau * must display the following acknowledgement: 1513bca4c6SSepherosa Ziehau * This product includes software developed by Bill Paul. 1613bca4c6SSepherosa Ziehau * 4. Neither the name of the author nor the names of any co-contributors 1713bca4c6SSepherosa Ziehau * may be used to endorse or promote products derived from this software 1813bca4c6SSepherosa Ziehau * without specific prior written permission. 1913bca4c6SSepherosa Ziehau * 2013bca4c6SSepherosa Ziehau * THIS SOFTWARE IS PROVIDED BY Bill Paul AND CONTRIBUTORS ``AS IS'' AND 2113bca4c6SSepherosa Ziehau * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 2213bca4c6SSepherosa Ziehau * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 2313bca4c6SSepherosa Ziehau * ARE DISCLAIMED. IN NO EVENT SHALL Bill Paul OR THE VOICES IN HIS HEAD 2413bca4c6SSepherosa Ziehau * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 2513bca4c6SSepherosa Ziehau * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 2613bca4c6SSepherosa Ziehau * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 2713bca4c6SSepherosa Ziehau * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 2813bca4c6SSepherosa Ziehau * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 2913bca4c6SSepherosa Ziehau * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF 3013bca4c6SSepherosa Ziehau * THE POSSIBILITY OF SUCH DAMAGE. 3113bca4c6SSepherosa Ziehau * 3213bca4c6SSepherosa Ziehau * $FreeBSD: src/sys/dev/vge/if_vgevar.h,v 1.4 2005/06/10 16:49:16 brooks Exp $ 3313bca4c6SSepherosa Ziehau * $DragonFly: src/sys/dev/netif/vge/if_vgevar.h,v 1.1 2006/05/20 07:15:17 sephe Exp $ 3413bca4c6SSepherosa Ziehau */ 3513bca4c6SSepherosa Ziehau 3613bca4c6SSepherosa Ziehau #if !defined(__i386__) 3713bca4c6SSepherosa Ziehau #define VGE_FIXUP_RX 3813bca4c6SSepherosa Ziehau #endif 3913bca4c6SSepherosa Ziehau 4013bca4c6SSepherosa Ziehau #define VGE_JUMBO_MTU 9000 4113bca4c6SSepherosa Ziehau 4213bca4c6SSepherosa Ziehau #define VGE_IFQ_MAXLEN 64 4313bca4c6SSepherosa Ziehau 4413bca4c6SSepherosa Ziehau #define VGE_TX_DESC_CNT 256 4513bca4c6SSepherosa Ziehau #define VGE_RX_DESC_CNT 256 /* Must be a multiple of 4!! */ 4613bca4c6SSepherosa Ziehau #define VGE_RING_ALIGN 256 4713bca4c6SSepherosa Ziehau #define VGE_RX_LIST_SZ (VGE_RX_DESC_CNT * sizeof(struct vge_rx_desc)) 4813bca4c6SSepherosa Ziehau #define VGE_TX_LIST_SZ (VGE_TX_DESC_CNT * sizeof(struct vge_tx_desc)) 4913bca4c6SSepherosa Ziehau #define VGE_TX_DESC_INC(x) (x = (x + 1) % VGE_TX_DESC_CNT) 5013bca4c6SSepherosa Ziehau #define VGE_RX_DESC_INC(x) (x = (x + 1) % VGE_RX_DESC_CNT) 5113bca4c6SSepherosa Ziehau #define VGE_ADDR_LO(y) ((uint64_t) (y) & 0xFFFFFFFF) 5213bca4c6SSepherosa Ziehau #define VGE_ADDR_HI(y) ((uint64_t) (y) >> 32) 5313bca4c6SSepherosa Ziehau #define VGE_BUFLEN(y) ((y) & 0x7FFF) 5413bca4c6SSepherosa Ziehau #define VGE_OWN(x) (le32toh((x)->vge_sts) & VGE_RDSTS_OWN) 5513bca4c6SSepherosa Ziehau #define VGE_RXBYTES(x) ((le32toh((x)->vge_sts) & \ 5613bca4c6SSepherosa Ziehau VGE_RDSTS_BUFSIZ) >> 16) 5713bca4c6SSepherosa Ziehau #define VGE_MIN_FRAMELEN 60 5813bca4c6SSepherosa Ziehau 5913bca4c6SSepherosa Ziehau #ifdef VGE_FIXUP_RX 6013bca4c6SSepherosa Ziehau #define VGE_ETHER_ALIGN sizeof(uint32_t) 6113bca4c6SSepherosa Ziehau #else 6213bca4c6SSepherosa Ziehau #define VGE_ETHER_ALIGN 0 6313bca4c6SSepherosa Ziehau #endif 6413bca4c6SSepherosa Ziehau 6513bca4c6SSepherosa Ziehau struct vge_type { 6613bca4c6SSepherosa Ziehau uint16_t vge_vid; 6713bca4c6SSepherosa Ziehau uint16_t vge_did; 6813bca4c6SSepherosa Ziehau char *vge_name; 6913bca4c6SSepherosa Ziehau }; 7013bca4c6SSepherosa Ziehau 7113bca4c6SSepherosa Ziehau struct vge_softc; 7213bca4c6SSepherosa Ziehau 7313bca4c6SSepherosa Ziehau struct vge_dmaload_arg { 7413bca4c6SSepherosa Ziehau struct vge_softc *sc; 7513bca4c6SSepherosa Ziehau int vge_idx; 7613bca4c6SSepherosa Ziehau int vge_maxsegs; 7713bca4c6SSepherosa Ziehau struct mbuf *vge_m0; 7813bca4c6SSepherosa Ziehau uint32_t vge_flags; 7913bca4c6SSepherosa Ziehau }; 8013bca4c6SSepherosa Ziehau 8113bca4c6SSepherosa Ziehau struct vge_list_data { 8213bca4c6SSepherosa Ziehau struct mbuf *vge_tx_mbuf[VGE_TX_DESC_CNT]; 8313bca4c6SSepherosa Ziehau struct mbuf *vge_rx_mbuf[VGE_RX_DESC_CNT]; 8413bca4c6SSepherosa Ziehau int vge_tx_prodidx; 8513bca4c6SSepherosa Ziehau int vge_rx_prodidx; 8613bca4c6SSepherosa Ziehau int vge_tx_considx; 8713bca4c6SSepherosa Ziehau int vge_tx_free; 8813bca4c6SSepherosa Ziehau bus_dmamap_t vge_tx_dmamap[VGE_TX_DESC_CNT]; 8913bca4c6SSepherosa Ziehau bus_dmamap_t vge_rx_dmamap[VGE_RX_DESC_CNT]; 9013bca4c6SSepherosa Ziehau bus_dma_tag_t vge_mtag; /* mbuf mapping tag */ 9113bca4c6SSepherosa Ziehau bus_dma_tag_t vge_rx_list_tag; 9213bca4c6SSepherosa Ziehau bus_dmamap_t vge_rx_list_map; 9313bca4c6SSepherosa Ziehau struct vge_rx_desc *vge_rx_list; 9413bca4c6SSepherosa Ziehau bus_addr_t vge_rx_list_addr; 9513bca4c6SSepherosa Ziehau bus_dma_tag_t vge_tx_list_tag; 9613bca4c6SSepherosa Ziehau bus_dmamap_t vge_tx_list_map; 9713bca4c6SSepherosa Ziehau struct vge_tx_desc *vge_tx_list; 9813bca4c6SSepherosa Ziehau bus_addr_t vge_tx_list_addr; 9913bca4c6SSepherosa Ziehau }; 10013bca4c6SSepherosa Ziehau 10113bca4c6SSepherosa Ziehau struct vge_softc { 10213bca4c6SSepherosa Ziehau struct arpcom arpcom; 10313bca4c6SSepherosa Ziehau bus_space_handle_t vge_bhandle; /* bus space handle */ 10413bca4c6SSepherosa Ziehau bus_space_tag_t vge_btag; /* bus space tag */ 10513bca4c6SSepherosa Ziehau int vge_res_rid; 10613bca4c6SSepherosa Ziehau int vge_irq_rid; 10713bca4c6SSepherosa Ziehau struct resource *vge_res; 10813bca4c6SSepherosa Ziehau struct resource *vge_irq; 10913bca4c6SSepherosa Ziehau void *vge_intrhand; 11013bca4c6SSepherosa Ziehau device_t vge_miibus; 11113bca4c6SSepherosa Ziehau bus_dma_tag_t vge_parent_tag; 11213bca4c6SSepherosa Ziehau bus_dma_tag_t vge_tag; 11313bca4c6SSepherosa Ziehau uint8_t vge_type; 11413bca4c6SSepherosa Ziehau int vge_if_flags; 11513bca4c6SSepherosa Ziehau int vge_rx_consumed; 11613bca4c6SSepherosa Ziehau int vge_link; 11713bca4c6SSepherosa Ziehau int vge_camidx; 11813bca4c6SSepherosa Ziehau struct mbuf *vge_head; 11913bca4c6SSepherosa Ziehau struct mbuf *vge_tail; 12013bca4c6SSepherosa Ziehau 121*4e5366b5SSepherosa Ziehau struct ifpoll_compat vge_npoll; 12213bca4c6SSepherosa Ziehau struct vge_list_data vge_ldata; 12313bca4c6SSepherosa Ziehau 12413bca4c6SSepherosa Ziehau int suspended; /* 0 = normal 1 = suspended */ 12513bca4c6SSepherosa Ziehau }; 12613bca4c6SSepherosa Ziehau 12713bca4c6SSepherosa Ziehau #define VGE_LOCK(_sc) mtx_lock(&(_sc)->vge_mtx) 12813bca4c6SSepherosa Ziehau #define VGE_UNLOCK(_sc) mtx_unlock(&(_sc)->vge_mtx) 12913bca4c6SSepherosa Ziehau #define VGE_LOCK_ASSERT(_sc) mtx_assert(&(_sc)->vge_mtx, MA_OWNED) 13013bca4c6SSepherosa Ziehau 13113bca4c6SSepherosa Ziehau /* 13213bca4c6SSepherosa Ziehau * register space access macros 13313bca4c6SSepherosa Ziehau */ 13413bca4c6SSepherosa Ziehau #define CSR_WRITE_STREAM_4(sc, reg, val) \ 13513bca4c6SSepherosa Ziehau bus_space_write_stream_4(sc->vge_btag, sc->vge_bhandle, reg, val) 13613bca4c6SSepherosa Ziehau #define CSR_WRITE_4(sc, reg, val) \ 13713bca4c6SSepherosa Ziehau bus_space_write_4(sc->vge_btag, sc->vge_bhandle, reg, val) 13813bca4c6SSepherosa Ziehau #define CSR_WRITE_2(sc, reg, val) \ 13913bca4c6SSepherosa Ziehau bus_space_write_2(sc->vge_btag, sc->vge_bhandle, reg, val) 14013bca4c6SSepherosa Ziehau #define CSR_WRITE_1(sc, reg, val) \ 14113bca4c6SSepherosa Ziehau bus_space_write_1(sc->vge_btag, sc->vge_bhandle, reg, val) 14213bca4c6SSepherosa Ziehau 14313bca4c6SSepherosa Ziehau #define CSR_READ_4(sc, reg) \ 14413bca4c6SSepherosa Ziehau bus_space_read_4(sc->vge_btag, sc->vge_bhandle, reg) 14513bca4c6SSepherosa Ziehau #define CSR_READ_2(sc, reg) \ 14613bca4c6SSepherosa Ziehau bus_space_read_2(sc->vge_btag, sc->vge_bhandle, reg) 14713bca4c6SSepherosa Ziehau #define CSR_READ_1(sc, reg) \ 14813bca4c6SSepherosa Ziehau bus_space_read_1(sc->vge_btag, sc->vge_bhandle, reg) 14913bca4c6SSepherosa Ziehau 15013bca4c6SSepherosa Ziehau #define CSR_SETBIT_1(sc, reg, x) \ 15113bca4c6SSepherosa Ziehau CSR_WRITE_1(sc, reg, CSR_READ_1(sc, reg) | (x)) 15213bca4c6SSepherosa Ziehau #define CSR_SETBIT_2(sc, reg, x) \ 15313bca4c6SSepherosa Ziehau CSR_WRITE_2(sc, reg, CSR_READ_2(sc, reg) | (x)) 15413bca4c6SSepherosa Ziehau #define CSR_SETBIT_4(sc, reg, x) \ 15513bca4c6SSepherosa Ziehau CSR_WRITE_4(sc, reg, CSR_READ_4(sc, reg) | (x)) 15613bca4c6SSepherosa Ziehau 15713bca4c6SSepherosa Ziehau #define CSR_CLRBIT_1(sc, reg, x) \ 15813bca4c6SSepherosa Ziehau CSR_WRITE_1(sc, reg, CSR_READ_1(sc, reg) & ~(x)) 15913bca4c6SSepherosa Ziehau #define CSR_CLRBIT_2(sc, reg, x) \ 16013bca4c6SSepherosa Ziehau CSR_WRITE_2(sc, reg, CSR_READ_2(sc, reg) & ~(x)) 16113bca4c6SSepherosa Ziehau #define CSR_CLRBIT_4(sc, reg, x) \ 16213bca4c6SSepherosa Ziehau CSR_WRITE_4(sc, reg, CSR_READ_4(sc, reg) & ~(x)) 16313bca4c6SSepherosa Ziehau 16413bca4c6SSepherosa Ziehau #define VGE_TIMEOUT 10000 165