1*5d686fbbSSepherosa Ziehau /* 2*5d686fbbSSepherosa Ziehau * Copyright (c) 2004 3*5d686fbbSSepherosa Ziehau * Joerg Sonnenberger <joerg@bec.de>. All rights reserved. 4*5d686fbbSSepherosa Ziehau * 5*5d686fbbSSepherosa Ziehau * Copyright (c) 1997, 1998-2003 6*5d686fbbSSepherosa Ziehau * Bill Paul <wpaul@ctr.columbia.edu>. All rights reserved. 7*5d686fbbSSepherosa Ziehau * 8*5d686fbbSSepherosa Ziehau * Redistribution and use in source and binary forms, with or without 9*5d686fbbSSepherosa Ziehau * modification, are permitted provided that the following conditions 10*5d686fbbSSepherosa Ziehau * are met: 11*5d686fbbSSepherosa Ziehau * 1. Redistributions of source code must retain the above copyright 12*5d686fbbSSepherosa Ziehau * notice, this list of conditions and the following disclaimer. 13*5d686fbbSSepherosa Ziehau * 2. Redistributions in binary form must reproduce the above copyright 14*5d686fbbSSepherosa Ziehau * notice, this list of conditions and the following disclaimer in the 15*5d686fbbSSepherosa Ziehau * documentation and/or other materials provided with the distribution. 16*5d686fbbSSepherosa Ziehau * 3. All advertising materials mentioning features or use of this software 17*5d686fbbSSepherosa Ziehau * must display the following acknowledgement: 18*5d686fbbSSepherosa Ziehau * This product includes software developed by Bill Paul. 19*5d686fbbSSepherosa Ziehau * 4. Neither the name of the author nor the names of any co-contributors 20*5d686fbbSSepherosa Ziehau * may be used to endorse or promote products derived from this software 21*5d686fbbSSepherosa Ziehau * without specific prior written permission. 22*5d686fbbSSepherosa Ziehau * 23*5d686fbbSSepherosa Ziehau * THIS SOFTWARE IS PROVIDED BY Bill Paul AND CONTRIBUTORS ``AS IS'' AND 24*5d686fbbSSepherosa Ziehau * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 25*5d686fbbSSepherosa Ziehau * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 26*5d686fbbSSepherosa Ziehau * ARE DISCLAIMED. IN NO EVENT SHALL Bill Paul OR THE VOICES IN HIS HEAD 27*5d686fbbSSepherosa Ziehau * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 28*5d686fbbSSepherosa Ziehau * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 29*5d686fbbSSepherosa Ziehau * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 30*5d686fbbSSepherosa Ziehau * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 31*5d686fbbSSepherosa Ziehau * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 32*5d686fbbSSepherosa Ziehau * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF 33*5d686fbbSSepherosa Ziehau * THE POSSIBILITY OF SUCH DAMAGE. 34*5d686fbbSSepherosa Ziehau * 35*5d686fbbSSepherosa Ziehau * $FreeBSD: src/sys/pci/if_rlreg.h,v 1.42 2004/05/24 19:39:23 jhb Exp $ 36*5d686fbbSSepherosa Ziehau * $DragonFly: src/sys/dev/netif/re/if_revar.h,v 1.1 2006/11/14 13:35:49 sephe Exp $ 37*5d686fbbSSepherosa Ziehau */ 38*5d686fbbSSepherosa Ziehau 39*5d686fbbSSepherosa Ziehau struct re_chain_data { 40*5d686fbbSSepherosa Ziehau uint16_t cur_rx; 41*5d686fbbSSepherosa Ziehau caddr_t re_rx_buf; 42*5d686fbbSSepherosa Ziehau caddr_t re_rx_buf_ptr; 43*5d686fbbSSepherosa Ziehau bus_dmamap_t re_rx_dmamap; 44*5d686fbbSSepherosa Ziehau 45*5d686fbbSSepherosa Ziehau struct mbuf *re_tx_chain[RE_TX_LIST_CNT]; 46*5d686fbbSSepherosa Ziehau bus_dmamap_t re_tx_dmamap[RE_TX_LIST_CNT]; 47*5d686fbbSSepherosa Ziehau uint8_t last_tx; 48*5d686fbbSSepherosa Ziehau uint8_t cur_tx; 49*5d686fbbSSepherosa Ziehau }; 50*5d686fbbSSepherosa Ziehau 51*5d686fbbSSepherosa Ziehau #define RE_INC(x) (x = (x + 1) % RE_TX_LIST_CNT) 52*5d686fbbSSepherosa Ziehau #define RE_CUR_TXADDR(x) ((x->re_cdata.cur_tx * 4) + RE_TXADDR0) 53*5d686fbbSSepherosa Ziehau #define RE_CUR_TXSTAT(x) ((x->re_cdata.cur_tx * 4) + RE_TXSTAT0) 54*5d686fbbSSepherosa Ziehau #define RE_CUR_TXMBUF(x) (x->re_cdata.re_tx_chain[x->re_cdata.cur_tx]) 55*5d686fbbSSepherosa Ziehau #define RE_CUR_DMAMAP(x) (x->re_cdata.re_tx_dmamap[x->re_cdata.cur_tx]) 56*5d686fbbSSepherosa Ziehau #define RE_LAST_TXADDR(x) ((x->re_cdata.last_tx * 4) + RE_TXADDR0) 57*5d686fbbSSepherosa Ziehau #define RE_LAST_TXSTAT(x) ((x->re_cdata.last_tx * 4) + RE_TXSTAT0) 58*5d686fbbSSepherosa Ziehau #define RE_LAST_TXMBUF(x) (x->re_cdata.re_tx_chain[x->re_cdata.last_tx]) 59*5d686fbbSSepherosa Ziehau #define RE_LAST_DMAMAP(x) (x->re_cdata.re_tx_dmamap[x->re_cdata.last_tx]) 60*5d686fbbSSepherosa Ziehau 61*5d686fbbSSepherosa Ziehau struct re_type { 62*5d686fbbSSepherosa Ziehau uint16_t re_vid; 63*5d686fbbSSepherosa Ziehau uint16_t re_did; 64*5d686fbbSSepherosa Ziehau int re_basetype; 65*5d686fbbSSepherosa Ziehau const char *re_name; 66*5d686fbbSSepherosa Ziehau }; 67*5d686fbbSSepherosa Ziehau 68*5d686fbbSSepherosa Ziehau struct re_hwrev { 69*5d686fbbSSepherosa Ziehau uint32_t re_rev; 70*5d686fbbSSepherosa Ziehau int re_type; 71*5d686fbbSSepherosa Ziehau const char *re_desc; 72*5d686fbbSSepherosa Ziehau }; 73*5d686fbbSSepherosa Ziehau 74*5d686fbbSSepherosa Ziehau #define RE_8139CPLUS 3 75*5d686fbbSSepherosa Ziehau #define RE_8169 4 76*5d686fbbSSepherosa Ziehau 77*5d686fbbSSepherosa Ziehau #define RE_ISCPLUS(x) ((x)->re_type == RE_8139CPLUS || \ 78*5d686fbbSSepherosa Ziehau (x)->re_type == RE_8169) 79*5d686fbbSSepherosa Ziehau 80*5d686fbbSSepherosa Ziehau struct re_softc; 81*5d686fbbSSepherosa Ziehau 82*5d686fbbSSepherosa Ziehau struct re_dmaload_arg { 83*5d686fbbSSepherosa Ziehau struct re_softc *sc; 84*5d686fbbSSepherosa Ziehau int re_idx; 85*5d686fbbSSepherosa Ziehau int re_maxsegs; 86*5d686fbbSSepherosa Ziehau uint32_t re_flags; 87*5d686fbbSSepherosa Ziehau struct re_desc *re_ring; 88*5d686fbbSSepherosa Ziehau }; 89*5d686fbbSSepherosa Ziehau 90*5d686fbbSSepherosa Ziehau struct re_list_data { 91*5d686fbbSSepherosa Ziehau struct mbuf *re_tx_mbuf[RE_TX_DESC_CNT]; 92*5d686fbbSSepherosa Ziehau struct mbuf *re_rx_mbuf[RE_TX_DESC_CNT]; 93*5d686fbbSSepherosa Ziehau int re_tx_prodidx; 94*5d686fbbSSepherosa Ziehau int re_rx_prodidx; 95*5d686fbbSSepherosa Ziehau int re_tx_considx; 96*5d686fbbSSepherosa Ziehau int re_tx_free; 97*5d686fbbSSepherosa Ziehau bus_dmamap_t re_tx_dmamap[RE_TX_DESC_CNT]; 98*5d686fbbSSepherosa Ziehau bus_dmamap_t re_rx_dmamap[RE_RX_DESC_CNT]; 99*5d686fbbSSepherosa Ziehau bus_dma_tag_t re_mtag; /* mbuf mapping tag */ 100*5d686fbbSSepherosa Ziehau bus_dma_tag_t re_stag; /* stats mapping tag */ 101*5d686fbbSSepherosa Ziehau bus_dmamap_t re_smap; /* stats map */ 102*5d686fbbSSepherosa Ziehau struct re_stats *re_stats; 103*5d686fbbSSepherosa Ziehau bus_addr_t re_stats_addr; 104*5d686fbbSSepherosa Ziehau bus_dma_tag_t re_rx_list_tag; 105*5d686fbbSSepherosa Ziehau bus_dmamap_t re_rx_list_map; 106*5d686fbbSSepherosa Ziehau struct re_desc *re_rx_list; 107*5d686fbbSSepherosa Ziehau bus_addr_t re_rx_list_addr; 108*5d686fbbSSepherosa Ziehau bus_dma_tag_t re_tx_list_tag; 109*5d686fbbSSepherosa Ziehau bus_dmamap_t re_tx_list_map; 110*5d686fbbSSepherosa Ziehau struct re_desc *re_tx_list; 111*5d686fbbSSepherosa Ziehau bus_addr_t re_tx_list_addr; 112*5d686fbbSSepherosa Ziehau }; 113*5d686fbbSSepherosa Ziehau 114*5d686fbbSSepherosa Ziehau struct re_softc { 115*5d686fbbSSepherosa Ziehau struct arpcom arpcom; /* interface info */ 116*5d686fbbSSepherosa Ziehau #ifdef RE_DIAG 117*5d686fbbSSepherosa Ziehau device_t re_dev; 118*5d686fbbSSepherosa Ziehau #endif 119*5d686fbbSSepherosa Ziehau bus_space_handle_t re_bhandle; /* bus space handle */ 120*5d686fbbSSepherosa Ziehau bus_space_tag_t re_btag; /* bus space tag */ 121*5d686fbbSSepherosa Ziehau struct resource *re_res; 122*5d686fbbSSepherosa Ziehau struct resource *re_irq; 123*5d686fbbSSepherosa Ziehau void *re_intrhand; 124*5d686fbbSSepherosa Ziehau device_t re_miibus; 125*5d686fbbSSepherosa Ziehau bus_dma_tag_t re_parent_tag; 126*5d686fbbSSepherosa Ziehau bus_dma_tag_t re_tag; 127*5d686fbbSSepherosa Ziehau uint8_t re_type; 128*5d686fbbSSepherosa Ziehau int re_eecmd_read; 129*5d686fbbSSepherosa Ziehau uint8_t re_stats_no_timeout; 130*5d686fbbSSepherosa Ziehau int re_txthresh; 131*5d686fbbSSepherosa Ziehau struct re_chain_data re_cdata; 132*5d686fbbSSepherosa Ziehau struct re_list_data re_ldata; 133*5d686fbbSSepherosa Ziehau struct callout re_timer; 134*5d686fbbSSepherosa Ziehau struct mbuf *re_head; 135*5d686fbbSSepherosa Ziehau struct mbuf *re_tail; 136*5d686fbbSSepherosa Ziehau uint32_t re_hwrev; 137*5d686fbbSSepherosa Ziehau uint32_t re_rxlenmask; 138*5d686fbbSSepherosa Ziehau int re_txstart; 139*5d686fbbSSepherosa Ziehau int re_testmode; 140*5d686fbbSSepherosa Ziehau int suspended; /* 0 = normal 1 = suspended */ 141*5d686fbbSSepherosa Ziehau int re_link; 142*5d686fbbSSepherosa Ziehau int re_eewidth; 143*5d686fbbSSepherosa Ziehau #ifdef DEVICE_POLLING 144*5d686fbbSSepherosa Ziehau int rxcycles; 145*5d686fbbSSepherosa Ziehau #endif 146*5d686fbbSSepherosa Ziehau 147*5d686fbbSSepherosa Ziehau struct sysctl_ctx_list re_sysctl_ctx; 148*5d686fbbSSepherosa Ziehau struct sysctl_oid *re_sysctl_tree; 149*5d686fbbSSepherosa Ziehau uint16_t re_intrs; 150*5d686fbbSSepherosa Ziehau uint16_t re_tx_ack; 151*5d686fbbSSepherosa Ziehau 152*5d686fbbSSepherosa Ziehau #ifndef BURN_BRIDGES 153*5d686fbbSSepherosa Ziehau uint32_t saved_maps[5]; /* pci data */ 154*5d686fbbSSepherosa Ziehau uint32_t saved_biosaddr; 155*5d686fbbSSepherosa Ziehau uint8_t saved_intline; 156*5d686fbbSSepherosa Ziehau uint8_t saved_cachelnsz; 157*5d686fbbSSepherosa Ziehau uint8_t saved_lattimer; 158*5d686fbbSSepherosa Ziehau #endif 159*5d686fbbSSepherosa Ziehau }; 160*5d686fbbSSepherosa Ziehau 161*5d686fbbSSepherosa Ziehau #define RE_TX_MODERATION_IS_ENABLED(sc) \ 162*5d686fbbSSepherosa Ziehau ((sc)->re_tx_ack == RE_ISR_TIMEOUT_EXPIRED) 163*5d686fbbSSepherosa Ziehau 164*5d686fbbSSepherosa Ziehau #define RE_DISABLE_TX_MODERATION(sc) do { \ 165*5d686fbbSSepherosa Ziehau (sc)->re_tx_ack = RE_ISR_TX_OK; \ 166*5d686fbbSSepherosa Ziehau (sc)->re_intrs = RE_INTRS | RE_ISR_TX_OK; \ 167*5d686fbbSSepherosa Ziehau } while (0) 168*5d686fbbSSepherosa Ziehau 169*5d686fbbSSepherosa Ziehau #define RE_ENABLE_TX_MODERATION(sc) do { \ 170*5d686fbbSSepherosa Ziehau (sc)->re_tx_ack = RE_ISR_TIMEOUT_EXPIRED; \ 171*5d686fbbSSepherosa Ziehau (sc)->re_intrs = RE_INTRS; \ 172*5d686fbbSSepherosa Ziehau } while (0) 173*5d686fbbSSepherosa Ziehau 174*5d686fbbSSepherosa Ziehau /* 175*5d686fbbSSepherosa Ziehau * register space access macros 176*5d686fbbSSepherosa Ziehau */ 177*5d686fbbSSepherosa Ziehau #define CSR_WRITE_STREAM_4(sc, reg, val) \ 178*5d686fbbSSepherosa Ziehau bus_space_write_stream_4(sc->re_btag, sc->re_bhandle, reg, val) 179*5d686fbbSSepherosa Ziehau #define CSR_WRITE_4(sc, reg, val) \ 180*5d686fbbSSepherosa Ziehau bus_space_write_4(sc->re_btag, sc->re_bhandle, reg, val) 181*5d686fbbSSepherosa Ziehau #define CSR_WRITE_2(sc, reg, val) \ 182*5d686fbbSSepherosa Ziehau bus_space_write_2(sc->re_btag, sc->re_bhandle, reg, val) 183*5d686fbbSSepherosa Ziehau #define CSR_WRITE_1(sc, reg, val) \ 184*5d686fbbSSepherosa Ziehau bus_space_write_1(sc->re_btag, sc->re_bhandle, reg, val) 185*5d686fbbSSepherosa Ziehau 186*5d686fbbSSepherosa Ziehau #define CSR_READ_4(sc, reg) \ 187*5d686fbbSSepherosa Ziehau bus_space_read_4(sc->re_btag, sc->re_bhandle, reg) 188*5d686fbbSSepherosa Ziehau #define CSR_READ_2(sc, reg) \ 189*5d686fbbSSepherosa Ziehau bus_space_read_2(sc->re_btag, sc->re_bhandle, reg) 190*5d686fbbSSepherosa Ziehau #define CSR_READ_1(sc, reg) \ 191*5d686fbbSSepherosa Ziehau bus_space_read_1(sc->re_btag, sc->re_bhandle, reg) 192*5d686fbbSSepherosa Ziehau 193*5d686fbbSSepherosa Ziehau #define CSR_SETBIT_1(sc, reg, val) \ 194*5d686fbbSSepherosa Ziehau CSR_WRITE_1(sc, reg, CSR_READ_1(sc, reg) | (val)) 195*5d686fbbSSepherosa Ziehau #define CSR_CLRBIT_1(sc, reg, val) \ 196*5d686fbbSSepherosa Ziehau CSR_WRITE_1(sc, reg, CSR_READ_1(sc, reg) & ~(val)) 197