15d686fbbSSepherosa Ziehau /* 25d686fbbSSepherosa Ziehau * Copyright (c) 2004 35d686fbbSSepherosa Ziehau * Joerg Sonnenberger <joerg@bec.de>. All rights reserved. 45d686fbbSSepherosa Ziehau * 55d686fbbSSepherosa Ziehau * Copyright (c) 1997, 1998-2003 65d686fbbSSepherosa Ziehau * Bill Paul <wpaul@ctr.columbia.edu>. All rights reserved. 75d686fbbSSepherosa Ziehau * 85d686fbbSSepherosa Ziehau * Redistribution and use in source and binary forms, with or without 95d686fbbSSepherosa Ziehau * modification, are permitted provided that the following conditions 105d686fbbSSepherosa Ziehau * are met: 115d686fbbSSepherosa Ziehau * 1. Redistributions of source code must retain the above copyright 125d686fbbSSepherosa Ziehau * notice, this list of conditions and the following disclaimer. 135d686fbbSSepherosa Ziehau * 2. Redistributions in binary form must reproduce the above copyright 145d686fbbSSepherosa Ziehau * notice, this list of conditions and the following disclaimer in the 155d686fbbSSepherosa Ziehau * documentation and/or other materials provided with the distribution. 165d686fbbSSepherosa Ziehau * 3. All advertising materials mentioning features or use of this software 175d686fbbSSepherosa Ziehau * must display the following acknowledgement: 185d686fbbSSepherosa Ziehau * This product includes software developed by Bill Paul. 195d686fbbSSepherosa Ziehau * 4. Neither the name of the author nor the names of any co-contributors 205d686fbbSSepherosa Ziehau * may be used to endorse or promote products derived from this software 215d686fbbSSepherosa Ziehau * without specific prior written permission. 225d686fbbSSepherosa Ziehau * 235d686fbbSSepherosa Ziehau * THIS SOFTWARE IS PROVIDED BY Bill Paul AND CONTRIBUTORS ``AS IS'' AND 245d686fbbSSepherosa Ziehau * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 255d686fbbSSepherosa Ziehau * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 265d686fbbSSepherosa Ziehau * ARE DISCLAIMED. IN NO EVENT SHALL Bill Paul OR THE VOICES IN HIS HEAD 275d686fbbSSepherosa Ziehau * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 285d686fbbSSepherosa Ziehau * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 295d686fbbSSepherosa Ziehau * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 305d686fbbSSepherosa Ziehau * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 315d686fbbSSepherosa Ziehau * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 325d686fbbSSepherosa Ziehau * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF 335d686fbbSSepherosa Ziehau * THE POSSIBILITY OF SUCH DAMAGE. 345d686fbbSSepherosa Ziehau * 355d686fbbSSepherosa Ziehau * $FreeBSD: src/sys/pci/if_rlreg.h,v 1.42 2004/05/24 19:39:23 jhb Exp $ 36*1bdb2a81SSepherosa Ziehau * $DragonFly: src/sys/dev/netif/re/if_revar.h,v 1.15 2008/10/07 11:57:18 sephe Exp $ 375d686fbbSSepherosa Ziehau */ 385d686fbbSSepherosa Ziehau 3953d4588aSSepherosa Ziehau #define RE_RX_DESC_CNT_DEF 64 4053d4588aSSepherosa Ziehau #define RE_TX_DESC_CNT_DEF 64 4153d4588aSSepherosa Ziehau #define RE_RX_DESC_CNT_MAX 1024 4253d4588aSSepherosa Ziehau #define RE_TX_DESC_CNT_MAX 1024 4353d4588aSSepherosa Ziehau 4453d4588aSSepherosa Ziehau #define RE_RX_LIST_SZ(sc) ((sc)->re_rx_desc_cnt * sizeof(struct re_desc)) 4553d4588aSSepherosa Ziehau #define RE_TX_LIST_SZ(sc) ((sc)->re_tx_desc_cnt * sizeof(struct re_desc)) 46998e7079SSepherosa Ziehau #define RE_RING_ALIGN 256 47998e7079SSepherosa Ziehau #define RE_IFQ_MAXLEN 512 48998e7079SSepherosa Ziehau #define RE_MAXSEGS 16 49998e7079SSepherosa Ziehau #define RE_TXDESC_SPARE 4 50998e7079SSepherosa Ziehau 5153d4588aSSepherosa Ziehau #define RE_RXDESC_INC(sc, x) (x = (x + 1) % (sc)->re_rx_desc_cnt) 5253d4588aSSepherosa Ziehau #define RE_TXDESC_INC(sc, x) (x = (x + 1) % (sc)->re_tx_desc_cnt) 53998e7079SSepherosa Ziehau #define RE_OWN(x) (le32toh((x)->re_cmdstat) & RE_RDESC_STAT_OWN) 54998e7079SSepherosa Ziehau #define RE_RXBYTES(x) (le32toh((x)->re_cmdstat) & sc->re_rxlenmask) 55998e7079SSepherosa Ziehau #define RE_PKTSZ(x) ((x)/* >> 3*/) 56998e7079SSepherosa Ziehau 57998e7079SSepherosa Ziehau #define RE_ADDR_LO(y) ((uint64_t) (y) & 0xFFFFFFFF) 58998e7079SSepherosa Ziehau #define RE_ADDR_HI(y) ((uint64_t) (y) >> 32) 59998e7079SSepherosa Ziehau 60998e7079SSepherosa Ziehau #define RE_JUMBO_FRAMELEN 7440 61998e7079SSepherosa Ziehau #define RE_JUMBO_MTU (RE_JUMBO_FRAMELEN-ETHER_HDR_LEN-ETHER_CRC_LEN) 62998e7079SSepherosa Ziehau #define RE_FRAMELEN_2K 2048 63998e7079SSepherosa Ziehau #define RE_FRAMELEN(mtu) (mtu + ETHER_HDR_LEN + ETHER_CRC_LEN) 64998e7079SSepherosa Ziehau #define RE_SWCSUM_LIM_8169 2038 65998e7079SSepherosa Ziehau 66998e7079SSepherosa Ziehau #define RE_TIMEOUT 1000 67998e7079SSepherosa Ziehau 685d686fbbSSepherosa Ziehau struct re_type { 695d686fbbSSepherosa Ziehau uint16_t re_vid; 705d686fbbSSepherosa Ziehau uint16_t re_did; 715d686fbbSSepherosa Ziehau int re_basetype; 725d686fbbSSepherosa Ziehau const char *re_name; 735d686fbbSSepherosa Ziehau }; 745d686fbbSSepherosa Ziehau 755d686fbbSSepherosa Ziehau struct re_hwrev { 765d686fbbSSepherosa Ziehau uint32_t re_rev; 777caafb85SSepherosa Ziehau int re_type; /* RE_{8139CPLUS,8169} */ 787caafb85SSepherosa Ziehau uint32_t re_flags; /* see RE_F_ */ 79043ecbf0SSepherosa Ziehau int re_swcsum_lim; 80089dc1b7SSepherosa Ziehau int re_maxmtu; 815d686fbbSSepherosa Ziehau }; 825d686fbbSSepherosa Ziehau 835d686fbbSSepherosa Ziehau #define RE_8139CPLUS 3 845d686fbbSSepherosa Ziehau #define RE_8169 4 855d686fbbSSepherosa Ziehau 865d686fbbSSepherosa Ziehau struct re_dmaload_arg { 873580fc56SSepherosa Ziehau int re_nsegs; 883580fc56SSepherosa Ziehau bus_dma_segment_t *re_segs; 895d686fbbSSepherosa Ziehau }; 905d686fbbSSepherosa Ziehau 915d686fbbSSepherosa Ziehau struct re_list_data { 9253d4588aSSepherosa Ziehau struct mbuf **re_tx_mbuf; 9353d4588aSSepherosa Ziehau struct mbuf **re_rx_mbuf; 9453d4588aSSepherosa Ziehau bus_addr_t *re_rx_paddr; 955d686fbbSSepherosa Ziehau int re_tx_prodidx; 965d686fbbSSepherosa Ziehau int re_rx_prodidx; 975d686fbbSSepherosa Ziehau int re_tx_considx; 985d686fbbSSepherosa Ziehau int re_tx_free; 9953d4588aSSepherosa Ziehau bus_dmamap_t *re_tx_dmamap; 10053d4588aSSepherosa Ziehau bus_dmamap_t *re_rx_dmamap; 1013580fc56SSepherosa Ziehau bus_dmamap_t re_rx_spare; 1025d686fbbSSepherosa Ziehau bus_dma_tag_t re_mtag; /* mbuf mapping tag */ 1035d686fbbSSepherosa Ziehau bus_dma_tag_t re_stag; /* stats mapping tag */ 1045d686fbbSSepherosa Ziehau bus_dmamap_t re_smap; /* stats map */ 1055d686fbbSSepherosa Ziehau struct re_stats *re_stats; 1065d686fbbSSepherosa Ziehau bus_addr_t re_stats_addr; 1075d686fbbSSepherosa Ziehau bus_dma_tag_t re_rx_list_tag; 1085d686fbbSSepherosa Ziehau bus_dmamap_t re_rx_list_map; 1095d686fbbSSepherosa Ziehau struct re_desc *re_rx_list; 1105d686fbbSSepherosa Ziehau bus_addr_t re_rx_list_addr; 1115d686fbbSSepherosa Ziehau bus_dma_tag_t re_tx_list_tag; 1125d686fbbSSepherosa Ziehau bus_dmamap_t re_tx_list_map; 1135d686fbbSSepherosa Ziehau struct re_desc *re_tx_list; 1145d686fbbSSepherosa Ziehau bus_addr_t re_tx_list_addr; 1155d686fbbSSepherosa Ziehau }; 1165d686fbbSSepherosa Ziehau 1175d686fbbSSepherosa Ziehau struct re_softc { 1185d686fbbSSepherosa Ziehau struct arpcom arpcom; /* interface info */ 1195d686fbbSSepherosa Ziehau #ifdef RE_DIAG 1205d686fbbSSepherosa Ziehau device_t re_dev; 1215d686fbbSSepherosa Ziehau #endif 1225d686fbbSSepherosa Ziehau bus_space_handle_t re_bhandle; /* bus space handle */ 1235d686fbbSSepherosa Ziehau bus_space_tag_t re_btag; /* bus space tag */ 1245d686fbbSSepherosa Ziehau struct resource *re_res; 1255d686fbbSSepherosa Ziehau struct resource *re_irq; 1265d686fbbSSepherosa Ziehau void *re_intrhand; 1275d686fbbSSepherosa Ziehau device_t re_miibus; 1285d686fbbSSepherosa Ziehau bus_dma_tag_t re_parent_tag; 1295d686fbbSSepherosa Ziehau bus_dma_tag_t re_tag; 1305d686fbbSSepherosa Ziehau uint8_t re_type; 1315d686fbbSSepherosa Ziehau int re_eecmd_read; 1325d686fbbSSepherosa Ziehau uint8_t re_stats_no_timeout; 1335d686fbbSSepherosa Ziehau int re_txthresh; 134089dc1b7SSepherosa Ziehau uint32_t re_hwrev; 1355d686fbbSSepherosa Ziehau struct re_list_data re_ldata; 1365d686fbbSSepherosa Ziehau struct callout re_timer; 1375d686fbbSSepherosa Ziehau struct mbuf *re_head; 1385d686fbbSSepherosa Ziehau struct mbuf *re_tail; 1396070c764SSepherosa Ziehau int re_drop_rxfrag; 1407caafb85SSepherosa Ziehau uint32_t re_flags; /* see RE_F_ */ 1415d686fbbSSepherosa Ziehau uint32_t re_rxlenmask; 1425d686fbbSSepherosa Ziehau int re_txstart; 1435d686fbbSSepherosa Ziehau int re_testmode; 1445d686fbbSSepherosa Ziehau int suspended; /* 0 = normal 1 = suspended */ 1455d686fbbSSepherosa Ziehau int re_link; 1465d686fbbSSepherosa Ziehau int re_eewidth; 147043ecbf0SSepherosa Ziehau int re_swcsum_lim; 148089dc1b7SSepherosa Ziehau int re_maxmtu; 14953d4588aSSepherosa Ziehau int re_rx_desc_cnt; 15053d4588aSSepherosa Ziehau int re_tx_desc_cnt; 151957a8760SSepherosa Ziehau int re_bus_speed; 1525d686fbbSSepherosa Ziehau #ifdef DEVICE_POLLING 1535d686fbbSSepherosa Ziehau int rxcycles; 1545d686fbbSSepherosa Ziehau #endif 1555d686fbbSSepherosa Ziehau 1565d686fbbSSepherosa Ziehau struct sysctl_ctx_list re_sysctl_ctx; 1575d686fbbSSepherosa Ziehau struct sysctl_oid *re_sysctl_tree; 1585d686fbbSSepherosa Ziehau uint16_t re_intrs; 1595d686fbbSSepherosa Ziehau uint16_t re_tx_ack; 160*1bdb2a81SSepherosa Ziehau uint16_t re_rx_ack; 1615d686fbbSSepherosa Ziehau 1625d686fbbSSepherosa Ziehau #ifndef BURN_BRIDGES 1635d686fbbSSepherosa Ziehau uint32_t saved_maps[5]; /* pci data */ 1645d686fbbSSepherosa Ziehau uint32_t saved_biosaddr; 1655d686fbbSSepherosa Ziehau uint8_t saved_intline; 1665d686fbbSSepherosa Ziehau uint8_t saved_cachelnsz; 1675d686fbbSSepherosa Ziehau uint8_t saved_lattimer; 1685d686fbbSSepherosa Ziehau #endif 1695d686fbbSSepherosa Ziehau }; 1705d686fbbSSepherosa Ziehau 1717caafb85SSepherosa Ziehau #define RE_F_HASMPC 0x1 172610fc460SSepherosa Ziehau #define RE_F_PCIE 0x2 173957a8760SSepherosa Ziehau #define RE_F_PCI64 0x4 174931d6f1fSSepherosa Ziehau #define RE_F_HASIM 0x8 175043ecbf0SSepherosa Ziehau 1765d686fbbSSepherosa Ziehau /* 1775d686fbbSSepherosa Ziehau * register space access macros 1785d686fbbSSepherosa Ziehau */ 1795d686fbbSSepherosa Ziehau #define CSR_WRITE_STREAM_4(sc, reg, val) \ 1805d686fbbSSepherosa Ziehau bus_space_write_stream_4(sc->re_btag, sc->re_bhandle, reg, val) 1815d686fbbSSepherosa Ziehau #define CSR_WRITE_4(sc, reg, val) \ 1825d686fbbSSepherosa Ziehau bus_space_write_4(sc->re_btag, sc->re_bhandle, reg, val) 1835d686fbbSSepherosa Ziehau #define CSR_WRITE_2(sc, reg, val) \ 1845d686fbbSSepherosa Ziehau bus_space_write_2(sc->re_btag, sc->re_bhandle, reg, val) 1855d686fbbSSepherosa Ziehau #define CSR_WRITE_1(sc, reg, val) \ 1865d686fbbSSepherosa Ziehau bus_space_write_1(sc->re_btag, sc->re_bhandle, reg, val) 1875d686fbbSSepherosa Ziehau 1885d686fbbSSepherosa Ziehau #define CSR_READ_4(sc, reg) \ 1895d686fbbSSepherosa Ziehau bus_space_read_4(sc->re_btag, sc->re_bhandle, reg) 1905d686fbbSSepherosa Ziehau #define CSR_READ_2(sc, reg) \ 1915d686fbbSSepherosa Ziehau bus_space_read_2(sc->re_btag, sc->re_bhandle, reg) 1925d686fbbSSepherosa Ziehau #define CSR_READ_1(sc, reg) \ 1935d686fbbSSepherosa Ziehau bus_space_read_1(sc->re_btag, sc->re_bhandle, reg) 1945d686fbbSSepherosa Ziehau 1955d686fbbSSepherosa Ziehau #define CSR_SETBIT_1(sc, reg, val) \ 1965d686fbbSSepherosa Ziehau CSR_WRITE_1(sc, reg, CSR_READ_1(sc, reg) | (val)) 1975d686fbbSSepherosa Ziehau #define CSR_CLRBIT_1(sc, reg, val) \ 1985d686fbbSSepherosa Ziehau CSR_WRITE_1(sc, reg, CSR_READ_1(sc, reg) & ~(val)) 199