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 $ 365d686fbbSSepherosa Ziehau */ 375d686fbbSSepherosa Ziehau 3870be79a4SSepherosa Ziehau #define RE_RX_DESC_CNT_DEF 256 3970be79a4SSepherosa Ziehau #define RE_TX_DESC_CNT_DEF 256 4053d4588aSSepherosa Ziehau #define RE_RX_DESC_CNT_MAX 1024 4153d4588aSSepherosa Ziehau #define RE_TX_DESC_CNT_MAX 1024 4253d4588aSSepherosa Ziehau 4353d4588aSSepherosa Ziehau #define RE_RX_LIST_SZ(sc) ((sc)->re_rx_desc_cnt * sizeof(struct re_desc)) 4453d4588aSSepherosa Ziehau #define RE_TX_LIST_SZ(sc) ((sc)->re_tx_desc_cnt * sizeof(struct re_desc)) 45998e7079SSepherosa Ziehau #define RE_RING_ALIGN 256 46998e7079SSepherosa Ziehau #define RE_IFQ_MAXLEN 512 47998e7079SSepherosa Ziehau #define RE_MAXSEGS 16 486525b950SSepherosa Ziehau #define RE_TXDESC_SPARE 5 49a7d57e62SSepherosa Ziehau #define RE_JBUF_COUNT(sc) (((sc)->re_rx_desc_cnt * 3) / 2) 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) 54e5a5a436SSepherosa Ziehau #define RE_RXBYTES(x) (le32toh((x)->re_cmdstat) & RE_RDESC_STAT_GFRAGLEN) 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 60b0c15aadSSepherosa Ziehau #define RE_MTU_6K (6 * 1024) 61b0c15aadSSepherosa Ziehau #define RE_MTU_9K (9 * 1024) 62b0c15aadSSepherosa Ziehau 63b0c15aadSSepherosa Ziehau #define RE_ETHER_EXTRA (ETHER_HDR_LEN + ETHER_CRC_LEN + EVL_ENCAPLEN) 64b0c15aadSSepherosa Ziehau #define RE_FRAMELEN(mtu) ((mtu) + RE_ETHER_EXTRA) 65b0c15aadSSepherosa Ziehau 66b0c15aadSSepherosa Ziehau #define RE_FRAMELEN_6K RE_FRAMELEN(RE_MTU_6K) 67b0c15aadSSepherosa Ziehau #define RE_FRAMELEN_9K RE_FRAMELEN(RE_MTU_9K) 68b0c15aadSSepherosa Ziehau #define RE_FRAMELEN_MAX RE_FRAMELEN_9K 69b0c15aadSSepherosa Ziehau 70adfa5aa6SSepherosa Ziehau #define RE_RXBUF_ALIGN 8 71adfa5aa6SSepherosa Ziehau #define RE_JBUF_SIZE roundup2(RE_FRAMELEN_MAX, RE_RXBUF_ALIGN) 72a7d57e62SSepherosa Ziehau 73a7d57e62SSepherosa Ziehau struct re_softc; 74a7d57e62SSepherosa Ziehau struct re_jbuf { 75a7d57e62SSepherosa Ziehau struct re_softc *re_sc; 76a7d57e62SSepherosa Ziehau int re_inuse; 77a7d57e62SSepherosa Ziehau int re_slot; 78a7d57e62SSepherosa Ziehau caddr_t re_buf; 79a7d57e62SSepherosa Ziehau bus_addr_t re_paddr; 80a7d57e62SSepherosa Ziehau SLIST_ENTRY(re_jbuf) re_link; 81a7d57e62SSepherosa Ziehau }; 82a7d57e62SSepherosa Ziehau 835d686fbbSSepherosa Ziehau struct re_list_data { 8453d4588aSSepherosa Ziehau struct mbuf **re_tx_mbuf; 8553d4588aSSepherosa Ziehau struct mbuf **re_rx_mbuf; 8653d4588aSSepherosa Ziehau bus_addr_t *re_rx_paddr; 875d686fbbSSepherosa Ziehau int re_tx_prodidx; 885d686fbbSSepherosa Ziehau int re_rx_prodidx; 895d686fbbSSepherosa Ziehau int re_tx_considx; 905d686fbbSSepherosa Ziehau int re_tx_free; 9153d4588aSSepherosa Ziehau bus_dmamap_t *re_tx_dmamap; 9253d4588aSSepherosa Ziehau bus_dmamap_t *re_rx_dmamap; 933580fc56SSepherosa Ziehau bus_dmamap_t re_rx_spare; 948aaa1e58SSepherosa Ziehau bus_dma_tag_t re_rx_mtag; /* RX mbuf mapping tag */ 958aaa1e58SSepherosa Ziehau bus_dma_tag_t re_tx_mtag; /* TX mbuf mapping tag */ 965d686fbbSSepherosa Ziehau bus_dma_tag_t re_stag; /* stats mapping tag */ 975d686fbbSSepherosa Ziehau bus_dmamap_t re_smap; /* stats map */ 985d686fbbSSepherosa Ziehau struct re_stats *re_stats; 995d686fbbSSepherosa Ziehau bus_addr_t re_stats_addr; 1005d686fbbSSepherosa Ziehau bus_dma_tag_t re_rx_list_tag; 1015d686fbbSSepherosa Ziehau bus_dmamap_t re_rx_list_map; 1025d686fbbSSepherosa Ziehau struct re_desc *re_rx_list; 1035d686fbbSSepherosa Ziehau bus_addr_t re_rx_list_addr; 1045d686fbbSSepherosa Ziehau bus_dma_tag_t re_tx_list_tag; 1055d686fbbSSepherosa Ziehau bus_dmamap_t re_tx_list_map; 1065d686fbbSSepherosa Ziehau struct re_desc *re_tx_list; 1075d686fbbSSepherosa Ziehau bus_addr_t re_tx_list_addr; 108a7d57e62SSepherosa Ziehau 109a7d57e62SSepherosa Ziehau bus_dma_tag_t re_jpool_tag; 110a7d57e62SSepherosa Ziehau bus_dmamap_t re_jpool_map; 111a7d57e62SSepherosa Ziehau caddr_t re_jpool; 112a7d57e62SSepherosa Ziehau struct re_jbuf *re_jbuf; 113a7d57e62SSepherosa Ziehau struct lwkt_serialize re_jbuf_serializer; 114a7d57e62SSepherosa Ziehau SLIST_HEAD(, re_jbuf) re_jbuf_free; 1155d686fbbSSepherosa Ziehau }; 1165d686fbbSSepherosa Ziehau 1175d686fbbSSepherosa Ziehau struct re_softc { 1185d686fbbSSepherosa Ziehau struct arpcom arpcom; /* interface info */ 119e5a5a436SSepherosa Ziehau device_t dev; 1205d686fbbSSepherosa Ziehau bus_space_handle_t re_bhandle; /* bus space handle */ 1215d686fbbSSepherosa Ziehau bus_space_tag_t re_btag; /* bus space tag */ 122d511b4cfSSepherosa Ziehau int re_res_rid; 123d511b4cfSSepherosa Ziehau int re_res_type; 1245d686fbbSSepherosa Ziehau struct resource *re_res; 1255d686fbbSSepherosa Ziehau struct resource *re_irq; 1265d686fbbSSepherosa Ziehau void *re_intrhand; 1275d686fbbSSepherosa Ziehau bus_dma_tag_t re_parent_tag; 1285d686fbbSSepherosa Ziehau bus_dma_tag_t re_tag; 1297816ba83SSepherosa Ziehau struct ifpoll_compat re_npoll; 1305d686fbbSSepherosa Ziehau struct re_list_data re_ldata; 131*80492964SSepherosa Ziehau void (*re_start_xmit)(struct re_softc *); 1325d686fbbSSepherosa Ziehau struct callout re_timer; 1335d686fbbSSepherosa Ziehau struct mbuf *re_head; 1345d686fbbSSepherosa Ziehau struct mbuf *re_tail; 1355bed1fbdSSepherosa Ziehau uint32_t re_caps; /* see RE_C_ */ 13653d4588aSSepherosa Ziehau int re_rx_desc_cnt; 13753d4588aSSepherosa Ziehau int re_tx_desc_cnt; 138957a8760SSepherosa Ziehau int re_bus_speed; 1395d686fbbSSepherosa Ziehau int rxcycles; 140a7d57e62SSepherosa Ziehau int re_rxbuf_size; 141a7d57e62SSepherosa Ziehau int (*re_newbuf)(struct re_softc *, int, int); 1424dce912aSTim Bisson int re_irq_type; 1434dce912aSTim Bisson int re_irq_rid; 1445d686fbbSSepherosa Ziehau 145d4d77345SSepherosa Ziehau uint32_t re_flags; /* see RE_F_ */ 146e5a5a436SSepherosa Ziehau int re_saved_ifflags; 147d4d77345SSepherosa Ziehau 148*80492964SSepherosa Ziehau void (*re_write_imr)(struct re_softc *, uint32_t); 149*80492964SSepherosa Ziehau void (*re_write_isr)(struct re_softc *, uint32_t); 150*80492964SSepherosa Ziehau uint32_t (*re_read_isr)(struct re_softc *); 151*80492964SSepherosa Ziehau uint32_t re_intrs; 1525d686fbbSSepherosa Ziehau uint16_t re_tx_ack; 1531bdb2a81SSepherosa Ziehau uint16_t re_rx_ack; 154d4d77345SSepherosa Ziehau int re_tx_time; 155d4d77345SSepherosa Ziehau int re_rx_time; 156d4d77345SSepherosa Ziehau int re_sim_time; 157d4d77345SSepherosa Ziehau int re_imtype; /* see RE_IMTYPE_ */ 1585d686fbbSSepherosa Ziehau 1595d686fbbSSepherosa Ziehau uint32_t saved_maps[5]; /* pci data */ 1605d686fbbSSepherosa Ziehau uint32_t saved_biosaddr; 1615d686fbbSSepherosa Ziehau uint8_t saved_intline; 1625d686fbbSSepherosa Ziehau uint8_t saved_cachelnsz; 1635d686fbbSSepherosa Ziehau uint8_t saved_lattimer; 164e5a5a436SSepherosa Ziehau 165e5a5a436SSepherosa Ziehau /* 166e5a5a436SSepherosa Ziehau * Used by Realtek re(4) backend. 167e5a5a436SSepherosa Ziehau */ 168e5a5a436SSepherosa Ziehau int re_if_flags; 169e5a5a436SSepherosa Ziehau uint8_t re_type; 170e5a5a436SSepherosa Ziehau u_int16_t re_device_id; 171e5a5a436SSepherosa Ziehau u_int8_t re_hw_supp_now_is_oob_ver; 172e5a5a436SSepherosa Ziehau int max_jumbo_frame_size; 173e5a5a436SSepherosa Ziehau int re_rx_mbuf_sz; 174e5a5a436SSepherosa Ziehau u_int8_t RequireAdcBiasPatch; 175e5a5a436SSepherosa Ziehau u_int16_t AdcBiasPatchIoffset; 176e5a5a436SSepherosa Ziehau u_int16_t SwrCnt1msIni; 177e5a5a436SSepherosa Ziehau u_int8_t RequireAdjustUpsTxLinkPulseTiming; 178e5a5a436SSepherosa Ziehau u_int8_t re_hw_enable_msi_msix; 179e5a5a436SSepherosa Ziehau u_int8_t re_coalesce_tx_pkt; 18052bafeb8SSepherosa Ziehau u_int8_t re_pad_runt; 181e5a5a436SSepherosa Ziehau u_int8_t re_8169_MacVersion; 182e5a5a436SSepherosa Ziehau u_int8_t re_8169_PhyVersion; 183e5a5a436SSepherosa Ziehau int re_tx_cstag; 184e5a5a436SSepherosa Ziehau int re_rx_cstag; 185e5a5a436SSepherosa Ziehau struct ifmedia media; 186e5a5a436SSepherosa Ziehau u_int16_t cur_page; 187e5a5a436SSepherosa Ziehau u_int8_t re_unit; 188e6e07291SSepherosa Ziehau u_int8_t re_efuse_ver; 189e6e07291SSepherosa Ziehau u_int16_t re_sw_ram_code_ver; 190e6e07291SSepherosa Ziehau u_int16_t re_hw_ram_code_ver; 191e6e07291SSepherosa Ziehau u_int8_t RequiredSecLanDonglePatch; 192e6e07291SSepherosa Ziehau u_int8_t HwSuppDashVer; 193e6e07291SSepherosa Ziehau u_int8_t re_dash; 194e6e07291SSepherosa Ziehau bus_space_handle_t re_mapped_cmac_handle; /* bus space tag */ 195e6e07291SSepherosa Ziehau bus_space_tag_t re_mapped_cmac_tag; /* bus space tag */ 196e6e07291SSepherosa Ziehau bus_space_handle_t re_cmac_handle; /* bus space handle */ 197e6e07291SSepherosa Ziehau bus_space_tag_t re_cmac_tag; /* bus space tag */ 198e6e07291SSepherosa Ziehau u_int8_t HwPkgDet; 199*80492964SSepherosa Ziehau u_int8_t hw_hw_supp_serdes_phy_ver; 200*80492964SSepherosa Ziehau u_int8_t RequirePhyMdiSwapPatch; 201*80492964SSepherosa Ziehau u_int16_t phy_reg_anlpar; 2025d686fbbSSepherosa Ziehau }; 2035d686fbbSSepherosa Ziehau 2045bed1fbdSSepherosa Ziehau #define RE_C_HWIM 0x4 /* hardware interrupt moderation */ 205a7d57e62SSepherosa Ziehau #define RE_C_CONTIGRX 0x400 /* need contig buf to RX jumbo frames */ 206043ecbf0SSepherosa Ziehau 207d4d77345SSepherosa Ziehau /* Interrupt moderation types */ 208d4d77345SSepherosa Ziehau #define RE_IMTYPE_NONE 0 209d4d77345SSepherosa Ziehau #define RE_IMTYPE_SIM 1 /* simulated */ 210d4d77345SSepherosa Ziehau #define RE_IMTYPE_HW 2 /* hardware based */ 211d4d77345SSepherosa Ziehau 212d4d77345SSepherosa Ziehau #define RE_F_TIMER_INTR 0x1 213a7d57e62SSepherosa Ziehau #define RE_F_USE_JPOOL 0x2 214ffa3a109SSepherosa Ziehau #define RE_F_DROP_RXFRAG 0x4 215ffa3a109SSepherosa Ziehau #define RE_F_LINKED 0x8 216ffa3a109SSepherosa Ziehau #define RE_F_SUSPENDED 0x10 217d4d77345SSepherosa Ziehau 2185d686fbbSSepherosa Ziehau /* 2195d686fbbSSepherosa Ziehau * register space access macros 2205d686fbbSSepherosa Ziehau */ 2215d686fbbSSepherosa Ziehau #define CSR_WRITE_STREAM_4(sc, reg, val) \ 2225d686fbbSSepherosa Ziehau bus_space_write_stream_4(sc->re_btag, sc->re_bhandle, reg, val) 2235d686fbbSSepherosa Ziehau #define CSR_WRITE_4(sc, reg, val) \ 2245d686fbbSSepherosa Ziehau bus_space_write_4(sc->re_btag, sc->re_bhandle, reg, val) 2255d686fbbSSepherosa Ziehau #define CSR_WRITE_2(sc, reg, val) \ 2265d686fbbSSepherosa Ziehau bus_space_write_2(sc->re_btag, sc->re_bhandle, reg, val) 2275d686fbbSSepherosa Ziehau #define CSR_WRITE_1(sc, reg, val) \ 2285d686fbbSSepherosa Ziehau bus_space_write_1(sc->re_btag, sc->re_bhandle, reg, val) 2295d686fbbSSepherosa Ziehau 2305d686fbbSSepherosa Ziehau #define CSR_READ_4(sc, reg) \ 2315d686fbbSSepherosa Ziehau bus_space_read_4(sc->re_btag, sc->re_bhandle, reg) 2325d686fbbSSepherosa Ziehau #define CSR_READ_2(sc, reg) \ 2335d686fbbSSepherosa Ziehau bus_space_read_2(sc->re_btag, sc->re_bhandle, reg) 2345d686fbbSSepherosa Ziehau #define CSR_READ_1(sc, reg) \ 2355d686fbbSSepherosa Ziehau bus_space_read_1(sc->re_btag, sc->re_bhandle, reg) 2365d686fbbSSepherosa Ziehau 2375d686fbbSSepherosa Ziehau #define CSR_SETBIT_1(sc, reg, val) \ 2385d686fbbSSepherosa Ziehau CSR_WRITE_1(sc, reg, CSR_READ_1(sc, reg) | (val)) 2395d686fbbSSepherosa Ziehau #define CSR_CLRBIT_1(sc, reg, val) \ 2405d686fbbSSepherosa Ziehau CSR_WRITE_1(sc, reg, CSR_READ_1(sc, reg) & ~(val)) 241