15330213cSSepherosa Ziehau /* 25330213cSSepherosa Ziehau * Copyright (c) 2001-2008, Intel Corporation 35330213cSSepherosa Ziehau * All rights reserved. 45330213cSSepherosa Ziehau * 55330213cSSepherosa Ziehau * Redistribution and use in source and binary forms, with or without 65330213cSSepherosa Ziehau * modification, are permitted provided that the following conditions are met: 75330213cSSepherosa Ziehau * 85330213cSSepherosa Ziehau * 1. Redistributions of source code must retain the above copyright notice, 95330213cSSepherosa Ziehau * this list of conditions and the following disclaimer. 105330213cSSepherosa Ziehau * 115330213cSSepherosa Ziehau * 2. Redistributions in binary form must reproduce the above copyright 125330213cSSepherosa Ziehau * notice, this list of conditions and the following disclaimer in the 135330213cSSepherosa Ziehau * documentation and/or other materials provided with the distribution. 145330213cSSepherosa Ziehau * 155330213cSSepherosa Ziehau * 3. Neither the name of the Intel Corporation nor the names of its 165330213cSSepherosa Ziehau * contributors may be used to endorse or promote products derived from 175330213cSSepherosa Ziehau * this software without specific prior written permission. 185330213cSSepherosa Ziehau * 195330213cSSepherosa Ziehau * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 205330213cSSepherosa Ziehau * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 215330213cSSepherosa Ziehau * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 225330213cSSepherosa Ziehau * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 235330213cSSepherosa Ziehau * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 245330213cSSepherosa Ziehau * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 255330213cSSepherosa Ziehau * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 265330213cSSepherosa Ziehau * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 275330213cSSepherosa Ziehau * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 285330213cSSepherosa Ziehau * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 295330213cSSepherosa Ziehau * POSSIBILITY OF SUCH DAMAGE. 305330213cSSepherosa Ziehau */ 315330213cSSepherosa Ziehau 325330213cSSepherosa Ziehau #ifndef _IF_EMX_H_ 335330213cSSepherosa Ziehau #define _IF_EMX_H_ 345330213cSSepherosa Ziehau 355330213cSSepherosa Ziehau /* Tunables */ 365330213cSSepherosa Ziehau 375330213cSSepherosa Ziehau /* 385330213cSSepherosa Ziehau * EMX_TXD: Maximum number of Transmit Descriptors 395330213cSSepherosa Ziehau * Valid Range: 256-4096 for others 405330213cSSepherosa Ziehau * Default Value: 512 415330213cSSepherosa Ziehau * This value is the number of transmit descriptors allocated by the driver. 425330213cSSepherosa Ziehau * Increasing this value allows the driver to queue more transmits. Each 435330213cSSepherosa Ziehau * descriptor is 16 bytes. 445330213cSSepherosa Ziehau * Since TDLEN should be multiple of 128bytes, the number of transmit 455330213cSSepherosa Ziehau * desscriptors should meet the following condition. 465330213cSSepherosa Ziehau * (num_tx_desc * sizeof(struct e1000_tx_desc)) % 128 == 0 475330213cSSepherosa Ziehau */ 485330213cSSepherosa Ziehau #define EMX_MIN_TXD 256 495330213cSSepherosa Ziehau #define EMX_MAX_TXD 4096 505330213cSSepherosa Ziehau #define EMX_DEFAULT_TXD 512 515330213cSSepherosa Ziehau 525330213cSSepherosa Ziehau /* 535330213cSSepherosa Ziehau * EMX_RXD - Maximum number of receive Descriptors 545330213cSSepherosa Ziehau * Valid Range: 256-4096 for others 555330213cSSepherosa Ziehau * Default Value: 512 565330213cSSepherosa Ziehau * This value is the number of receive descriptors allocated by the driver. 575330213cSSepherosa Ziehau * Increasing this value allows the driver to buffer more incoming packets. 585330213cSSepherosa Ziehau * Each descriptor is 16 bytes. A receive buffer is also allocated for each 595330213cSSepherosa Ziehau * descriptor. The maximum MTU size is 16110. 605330213cSSepherosa Ziehau * Since TDLEN should be multiple of 128bytes, the number of transmit 615330213cSSepherosa Ziehau * desscriptors should meet the following condition. 625330213cSSepherosa Ziehau * (num_tx_desc * sizeof(struct e1000_tx_desc)) % 128 == 0 635330213cSSepherosa Ziehau */ 645330213cSSepherosa Ziehau #define EMX_MIN_RXD 256 655330213cSSepherosa Ziehau #define EMX_MAX_RXD 4096 665330213cSSepherosa Ziehau #define EMX_DEFAULT_RXD 512 675330213cSSepherosa Ziehau 685330213cSSepherosa Ziehau /* 695330213cSSepherosa Ziehau * Receive Interrupt Delay Timer (Packet Timer) 705330213cSSepherosa Ziehau * 715330213cSSepherosa Ziehau * NOTE: 725330213cSSepherosa Ziehau * RDTR and RADV are deprecated; use ITR instead. They are only used to 735330213cSSepherosa Ziehau * workaround hardware bug on certain 82573 based NICs. 745330213cSSepherosa Ziehau */ 755330213cSSepherosa Ziehau #define EMX_RDTR_82573 32 765330213cSSepherosa Ziehau 775330213cSSepherosa Ziehau /* 785330213cSSepherosa Ziehau * Receive Interrupt Absolute Delay Timer (Not valid for 82542/82543/82544) 795330213cSSepherosa Ziehau * 805330213cSSepherosa Ziehau * NOTE: 815330213cSSepherosa Ziehau * RDTR and RADV are deprecated; use ITR instead. They are only used to 825330213cSSepherosa Ziehau * workaround hardware bug on certain 82573 based NICs. 835330213cSSepherosa Ziehau */ 845330213cSSepherosa Ziehau #define EMX_RADV_82573 64 855330213cSSepherosa Ziehau 865330213cSSepherosa Ziehau /* 875330213cSSepherosa Ziehau * This parameter controls the duration of transmit watchdog timer. 885330213cSSepherosa Ziehau */ 895330213cSSepherosa Ziehau #define EMX_TX_TIMEOUT 5 905330213cSSepherosa Ziehau 91dc07210eSSepherosa Ziehau /* One for TX csum offloading desc, the other 2 are reserved */ 92dc07210eSSepherosa Ziehau #define EMX_TX_RESERVED 3 935330213cSSepherosa Ziehau 94b1e3f139SSepherosa Ziehau /* Large enough for 64K TSO segment */ 95b1e3f139SSepherosa Ziehau #define EMX_TX_SPARE 33 965330213cSSepherosa Ziehau 975330213cSSepherosa Ziehau #define EMX_TX_OACTIVE_MAX 64 985330213cSSepherosa Ziehau 995330213cSSepherosa Ziehau /* Interrupt throttle rate */ 1003245f71eSSepherosa Ziehau #define EMX_DEFAULT_ITR 6000 1015330213cSSepherosa Ziehau 10255471c55SSepherosa Ziehau /* Number of segments sent before writing to TX related registers */ 10355471c55SSepherosa Ziehau #define EMX_DEFAULT_TXWREG 8 10455471c55SSepherosa Ziehau 1055330213cSSepherosa Ziehau /* 1065330213cSSepherosa Ziehau * This parameter controls whether or not autonegotation is enabled. 1075330213cSSepherosa Ziehau * 0 - Disable autonegotiation 1085330213cSSepherosa Ziehau * 1 - Enable autonegotiation 1095330213cSSepherosa Ziehau */ 1105330213cSSepherosa Ziehau #define EMX_DO_AUTO_NEG 1 1115330213cSSepherosa Ziehau 1125330213cSSepherosa Ziehau /* Tunables -- End */ 1135330213cSSepherosa Ziehau 1145330213cSSepherosa Ziehau #define EMX_AUTONEG_ADV_DEFAULT (ADVERTISE_10_HALF | \ 1155330213cSSepherosa Ziehau ADVERTISE_10_FULL | \ 1165330213cSSepherosa Ziehau ADVERTISE_100_HALF | \ 1175330213cSSepherosa Ziehau ADVERTISE_100_FULL | \ 1185330213cSSepherosa Ziehau ADVERTISE_1000_FULL) 1195330213cSSepherosa Ziehau 1205330213cSSepherosa Ziehau #define EMX_AUTO_ALL_MODES 0 1215330213cSSepherosa Ziehau 1225330213cSSepherosa Ziehau /* PHY master/slave setting */ 1235330213cSSepherosa Ziehau #define EMX_MASTER_SLAVE e1000_ms_hw_default 1245330213cSSepherosa Ziehau 1255330213cSSepherosa Ziehau /* 1265330213cSSepherosa Ziehau * Micellaneous constants 1275330213cSSepherosa Ziehau */ 1285330213cSSepherosa Ziehau #define EMX_VENDOR_ID 0x8086 1295330213cSSepherosa Ziehau 1305330213cSSepherosa Ziehau #define EMX_BAR_MEM PCIR_BAR(0) 131a5807b81SSepherosa Ziehau #define EMX_BAR_FLASH PCIR_BAR(1) 1325330213cSSepherosa Ziehau 1335330213cSSepherosa Ziehau #define EMX_JUMBO_PBA 0x00000028 1345330213cSSepherosa Ziehau #define EMX_DEFAULT_PBA 0x00000030 1355330213cSSepherosa Ziehau #define EMX_SMARTSPEED_DOWNSHIFT 3 1365330213cSSepherosa Ziehau #define EMX_SMARTSPEED_MAX 15 1375330213cSSepherosa Ziehau #define EMX_MAX_INTR 10 1385330213cSSepherosa Ziehau 1395330213cSSepherosa Ziehau #define EMX_MCAST_ADDR_MAX 128 1405330213cSSepherosa Ziehau #define EMX_FC_PAUSE_TIME 1000 1415330213cSSepherosa Ziehau #define EMX_EEPROM_APME 0x400; 1425330213cSSepherosa Ziehau 143*74dc3754SSepherosa Ziehau #define EMX_PCICFG_DESC_RING_STATUS 0xe4 144*74dc3754SSepherosa Ziehau #define EMX_FLUSH_DESC_REQUIRED 0x100 145*74dc3754SSepherosa Ziehau 1465330213cSSepherosa Ziehau /* 1475330213cSSepherosa Ziehau * TDBA/RDBA should be aligned on 16 byte boundary. But TDLEN/RDLEN should be 1485330213cSSepherosa Ziehau * multiple of 128 bytes. So we align TDBA/RDBA on 128 byte boundary. This will 1495330213cSSepherosa Ziehau * also optimize cache line size effect. H/W supports up to cache line size 128. 1505330213cSSepherosa Ziehau */ 1515330213cSSepherosa Ziehau #define EMX_DBA_ALIGN 128 1525330213cSSepherosa Ziehau 1535330213cSSepherosa Ziehau /* 154d84018e9SSepherosa Ziehau * Speed mode bit in TARC0. 1555330213cSSepherosa Ziehau * 82571EB/82572EI only, used to improve small packet transmit performance. 1565330213cSSepherosa Ziehau */ 1575330213cSSepherosa Ziehau #define EMX_TARC_SPEED_MODE (1 << 21) 1585330213cSSepherosa Ziehau 159*74dc3754SSepherosa Ziehau #define EMX_TARC_COMPENSATION_MODE (1 << 7) /* Compensation Mode */ 160*74dc3754SSepherosa Ziehau 161*74dc3754SSepherosa Ziehau #define EMX_TARC_MQ_FIX (1 << 23) | \ 162*74dc3754SSepherosa Ziehau (1 << 24) | \ 163*74dc3754SSepherosa Ziehau (1 << 25) /* Handle errata in MQ mode */ 164*74dc3754SSepherosa Ziehau #define EMX_TARC_ERRATA (1 << 26) /* 82574 errata */ 165*74dc3754SSepherosa Ziehau 166d84018e9SSepherosa Ziehau /* 167d84018e9SSepherosa Ziehau * Multiple TX queues arbitration count mask in TARC0/TARC1. 168d84018e9SSepherosa Ziehau */ 169d84018e9SSepherosa Ziehau #define EMX_TARC_COUNT_MASK 0x7f 170d84018e9SSepherosa Ziehau 1715330213cSSepherosa Ziehau #define EMX_MAX_SCATTER 64 1723eb0ea09SSepherosa Ziehau #define EMX_TSO_SIZE (IP_MAXPACKET + \ 1735330213cSSepherosa Ziehau sizeof(struct ether_vlan_header)) 1743eb0ea09SSepherosa Ziehau #define EMX_MAX_SEGSIZE PAGE_SIZE 1755330213cSSepherosa Ziehau #define EMX_MSIX_MASK 0x01F00000 /* For 82574 use */ 1765330213cSSepherosa Ziehau 1775330213cSSepherosa Ziehau #define EMX_CSUM_FEATURES (CSUM_IP | CSUM_TCP | CSUM_UDP) 1785330213cSSepherosa Ziehau 1795330213cSSepherosa Ziehau /* 1805330213cSSepherosa Ziehau * 82574 has a nonstandard address for EIAC 1815330213cSSepherosa Ziehau * and since its only used in MSIX, and in 1825330213cSSepherosa Ziehau * the em driver only 82574 uses MSIX we can 1835330213cSSepherosa Ziehau * solve it just using this define. 1845330213cSSepherosa Ziehau */ 1855330213cSSepherosa Ziehau #define EMX_EIAC 0x000DC 1865330213cSSepherosa Ziehau 1873f939c23SSepherosa Ziehau #define EMX_NRSSRK 10 18889d8e73dSSepherosa Ziehau #define EMX_RSSRK_SIZE 4 18989d8e73dSSepherosa Ziehau #define EMX_RSSRK_VAL(key, i) (key[(i) * EMX_RSSRK_SIZE] | \ 19089d8e73dSSepherosa Ziehau key[(i) * EMX_RSSRK_SIZE + 1] << 8 | \ 19189d8e73dSSepherosa Ziehau key[(i) * EMX_RSSRK_SIZE + 2] << 16 | \ 19289d8e73dSSepherosa Ziehau key[(i) * EMX_RSSRK_SIZE + 3] << 24) 19389d8e73dSSepherosa Ziehau 1943f939c23SSepherosa Ziehau #define EMX_NRETA 32 19589d8e73dSSepherosa Ziehau #define EMX_RETA_SIZE 4 19689d8e73dSSepherosa Ziehau #define EMX_RETA_RINGIDX_SHIFT 7 1973f939c23SSepherosa Ziehau 19853d76a93SSepherosa Ziehau #define EMX_RDRTABLE_SIZE (EMX_NRETA * EMX_RETA_SIZE) 19953d76a93SSepherosa Ziehau 200c39e3a1fSSepherosa Ziehau #define EMX_NRX_RING 2 201d84018e9SSepherosa Ziehau #define EMX_NTX_RING 2 202d84018e9SSepherosa Ziehau #define EMX_NSERIALIZE 5 203c39e3a1fSSepherosa Ziehau 204235b9d30SSepherosa Ziehau typedef union e1000_rx_desc_extended emx_rxdesc_t; 205235b9d30SSepherosa Ziehau 206235b9d30SSepherosa Ziehau #define rxd_bufaddr read.buffer_addr /* 64bits */ 207235b9d30SSepherosa Ziehau #define rxd_length wb.upper.length /* 16bits */ 208235b9d30SSepherosa Ziehau #define rxd_vlan wb.upper.vlan /* 16bits */ 209235b9d30SSepherosa Ziehau #define rxd_staterr wb.upper.status_error /* 32bits */ 2103f939c23SSepherosa Ziehau #define rxd_mrq wb.lower.mrq /* 32bits */ 2113f939c23SSepherosa Ziehau #define rxd_rss wb.lower.hi_dword.rss /* 32bits */ 212235b9d30SSepherosa Ziehau 2139cc86e17SSepherosa Ziehau #define EMX_RXDMRQ_RSSTYPE_MASK 0xf 2149cc86e17SSepherosa Ziehau #define EMX_RXDMRQ_NO_HASH 0 2159cc86e17SSepherosa Ziehau #define EMX_RXDMRQ_IPV4_TCP 1 2169cc86e17SSepherosa Ziehau #define EMX_RXDMRQ_IPV4 2 2179cc86e17SSepherosa Ziehau #define EMX_RXDMRQ_IPV6_TCP 3 2189cc86e17SSepherosa Ziehau #define EMX_RXDMRQ_IPV6 5 2199cc86e17SSepherosa Ziehau 2209f831fa8SSepherosa Ziehau struct emx_softc; 2219f831fa8SSepherosa Ziehau 222c39e3a1fSSepherosa Ziehau struct emx_rxdata { 2236d435846SSepherosa Ziehau struct lwkt_serialize rx_serialize; 2249f831fa8SSepherosa Ziehau struct emx_softc *sc; 2259f831fa8SSepherosa Ziehau int idx; 2266d435846SSepherosa Ziehau 227c39e3a1fSSepherosa Ziehau /* 228c39e3a1fSSepherosa Ziehau * Receive definitions 229c39e3a1fSSepherosa Ziehau * 230c39e3a1fSSepherosa Ziehau * we have an array of num_rx_desc rx_desc (handled by the 231c39e3a1fSSepherosa Ziehau * controller), and paired with an array of rx_buffers 232c39e3a1fSSepherosa Ziehau * (at rx_buffer_area). 233c39e3a1fSSepherosa Ziehau * The next pair to check on receive is at offset next_rx_desc_to_check 234c39e3a1fSSepherosa Ziehau */ 235235b9d30SSepherosa Ziehau emx_rxdesc_t *rx_desc; 236c39e3a1fSSepherosa Ziehau uint32_t next_rx_desc_to_check; 237c39e3a1fSSepherosa Ziehau int num_rx_desc; 238323e5ecdSSepherosa Ziehau struct emx_rxbuf *rx_buf; 239c39e3a1fSSepherosa Ziehau bus_dma_tag_t rxtag; 240c39e3a1fSSepherosa Ziehau bus_dmamap_t rx_sparemap; 241c39e3a1fSSepherosa Ziehau 242c39e3a1fSSepherosa Ziehau /* 243c39e3a1fSSepherosa Ziehau * First/last mbuf pointers, for 244c39e3a1fSSepherosa Ziehau * collecting multisegment RX packets. 245c39e3a1fSSepherosa Ziehau */ 246c39e3a1fSSepherosa Ziehau struct mbuf *fmp; 247c39e3a1fSSepherosa Ziehau struct mbuf *lmp; 248c39e3a1fSSepherosa Ziehau 249c39e3a1fSSepherosa Ziehau /* RX statistics */ 2503f939c23SSepherosa Ziehau unsigned long rx_pkts; 251c39e3a1fSSepherosa Ziehau 252c39e3a1fSSepherosa Ziehau bus_dma_tag_t rx_desc_dtag; 253c39e3a1fSSepherosa Ziehau bus_dmamap_t rx_desc_dmap; 254c39e3a1fSSepherosa Ziehau bus_addr_t rx_desc_paddr; 255d721525cSSepherosa Ziehau } __cachealign; 256c39e3a1fSSepherosa Ziehau 257ec1c60bbSSepherosa Ziehau struct emx_txdata { 2586d435846SSepherosa Ziehau struct lwkt_serialize tx_serialize; 259ec1c60bbSSepherosa Ziehau struct emx_softc *sc; 260d84018e9SSepherosa Ziehau struct ifaltq_subque *ifsq; 261ec1c60bbSSepherosa Ziehau int idx; 262fec28316SSepherosa Ziehau int16_t tx_running; 263fec28316SSepherosa Ziehau #define EMX_TX_RUNNING 100 264fec28316SSepherosa Ziehau #define EMX_TX_RUNNING_DEC 25 265fec28316SSepherosa Ziehau uint16_t tx_flags; 266d84018e9SSepherosa Ziehau #define EMX_TXFLAG_TSO_PULLEX 0x1 267d84018e9SSepherosa Ziehau #define EMX_TXFLAG_ENABLED 0x2 268d84018e9SSepherosa Ziehau #define EMX_TXFLAG_FORCECTX 0x4 2696d435846SSepherosa Ziehau 2705330213cSSepherosa Ziehau /* 2715330213cSSepherosa Ziehau * Transmit definitions 2725330213cSSepherosa Ziehau * 2735330213cSSepherosa Ziehau * We have an array of num_tx_desc descriptors (handled 2745330213cSSepherosa Ziehau * by the controller) paired with an array of tx_buffers 2755330213cSSepherosa Ziehau * (at tx_buffer_area). 2765330213cSSepherosa Ziehau * The index of the next available descriptor is next_avail_tx_desc. 2775330213cSSepherosa Ziehau * The number of remaining tx_desc is num_tx_desc_avail. 2785330213cSSepherosa Ziehau */ 2795330213cSSepherosa Ziehau struct e1000_tx_desc *tx_desc_base; 280323e5ecdSSepherosa Ziehau struct emx_txbuf *tx_buf; 2815330213cSSepherosa Ziehau uint32_t next_avail_tx_desc; 2825330213cSSepherosa Ziehau uint32_t next_tx_to_clean; 2835330213cSSepherosa Ziehau int num_tx_desc_avail; 2845330213cSSepherosa Ziehau int num_tx_desc; 2855330213cSSepherosa Ziehau bus_dma_tag_t txtag; /* dma tag for tx */ 2865330213cSSepherosa Ziehau int spare_tx_desc; 2875330213cSSepherosa Ziehau int oact_tx_desc; 288fec28316SSepherosa Ziehau int tx_nmbuf; 2895330213cSSepherosa Ziehau 2905330213cSSepherosa Ziehau /* Saved csum offloading context information */ 2915330213cSSepherosa Ziehau int csum_flags; 2923eb0ea09SSepherosa Ziehau int csum_lhlen; 2935330213cSSepherosa Ziehau int csum_iphlen; 2943eb0ea09SSepherosa Ziehau 2953eb0ea09SSepherosa Ziehau int csum_thlen; /* TSO */ 2963eb0ea09SSepherosa Ziehau int csum_mss; /* TSO */ 2973eb0ea09SSepherosa Ziehau int csum_pktlen; /* TSO */ 2983eb0ea09SSepherosa Ziehau 2995330213cSSepherosa Ziehau uint32_t csum_txd_upper; 3005330213cSSepherosa Ziehau uint32_t csum_txd_lower; 3015330213cSSepherosa Ziehau 3027f32a9b0SSepherosa Ziehau int tx_wreg_nsegs; 3037f32a9b0SSepherosa Ziehau 3045330213cSSepherosa Ziehau /* 3055330213cSSepherosa Ziehau * Variables used to reduce TX interrupt rate and 3065330213cSSepherosa Ziehau * number of device's TX ring write requests. 3075330213cSSepherosa Ziehau * 3085330213cSSepherosa Ziehau * tx_nsegs: 3095330213cSSepherosa Ziehau * Number of TX descriptors setup so far. 3105330213cSSepherosa Ziehau * 3115330213cSSepherosa Ziehau * tx_int_nsegs: 3125330213cSSepherosa Ziehau * Once tx_nsegs > tx_int_nsegs, RS bit will be set 3135330213cSSepherosa Ziehau * in the last TX descriptor of the packet, and 3145330213cSSepherosa Ziehau * tx_nsegs will be reset to 0. So TX interrupt and 3155330213cSSepherosa Ziehau * TX ring write request should be generated roughly 3165330213cSSepherosa Ziehau * every tx_int_nsegs TX descriptors. 3175330213cSSepherosa Ziehau * 3185330213cSSepherosa Ziehau * tx_dd[]: 3195330213cSSepherosa Ziehau * Index of the TX descriptors which have RS bit set, 3205330213cSSepherosa Ziehau * i.e. DD bit will be set on this TX descriptor after 3215330213cSSepherosa Ziehau * the data of the TX descriptor are transfered to 3225330213cSSepherosa Ziehau * hardware's internal packet buffer. Only the TX 3235330213cSSepherosa Ziehau * descriptors listed in tx_dd[] will be checked upon 3245330213cSSepherosa Ziehau * TX interrupt. This array is used as circular ring. 3255330213cSSepherosa Ziehau * 3265330213cSSepherosa Ziehau * tx_dd_tail, tx_dd_head: 3275330213cSSepherosa Ziehau * Tail and head index of valid elements in tx_dd[]. 3285330213cSSepherosa Ziehau * tx_dd_tail == tx_dd_head means there is no valid 3295330213cSSepherosa Ziehau * elements in tx_dd[]. tx_dd_tail points to the position 3305330213cSSepherosa Ziehau * which is one beyond the last valid element in tx_dd[]. 3315330213cSSepherosa Ziehau * tx_dd_head points to the first valid element in 3325330213cSSepherosa Ziehau * tx_dd[]. 3335330213cSSepherosa Ziehau */ 334d84018e9SSepherosa Ziehau int tx_intr_nsegs; 3355330213cSSepherosa Ziehau int tx_nsegs; 3365330213cSSepherosa Ziehau int tx_dd_tail; 3375330213cSSepherosa Ziehau int tx_dd_head; 3385330213cSSepherosa Ziehau #define EMX_TXDD_MAX 64 3395330213cSSepherosa Ziehau #define EMX_TXDD_SAFE 48 /* 48 <= val < EMX_TXDD_MAX */ 3405330213cSSepherosa Ziehau int tx_dd[EMX_TXDD_MAX]; 3415330213cSSepherosa Ziehau 342d84018e9SSepherosa Ziehau struct ifsubq_watchdog tx_watchdog; 343fec28316SSepherosa Ziehau struct callout tx_gc_timer; 344d84018e9SSepherosa Ziehau 345ec1c60bbSSepherosa Ziehau /* TX statistics */ 346d84018e9SSepherosa Ziehau unsigned long tx_pkts; 347ec1c60bbSSepherosa Ziehau unsigned long tso_segments; 348ec1c60bbSSepherosa Ziehau unsigned long tso_ctx_reused; 349fec28316SSepherosa Ziehau unsigned long tx_gc; 350ec1c60bbSSepherosa Ziehau 351ec1c60bbSSepherosa Ziehau bus_dma_tag_t tx_desc_dtag; 352ec1c60bbSSepherosa Ziehau bus_dmamap_t tx_desc_dmap; 353ec1c60bbSSepherosa Ziehau bus_addr_t tx_desc_paddr; 354ec1c60bbSSepherosa Ziehau } __cachealign; 355ec1c60bbSSepherosa Ziehau 356ec1c60bbSSepherosa Ziehau struct emx_softc { 357ec1c60bbSSepherosa Ziehau struct arpcom arpcom; 358ec1c60bbSSepherosa Ziehau struct e1000_hw hw; 359ec1c60bbSSepherosa Ziehau int flags; 360ec1c60bbSSepherosa Ziehau #define EMX_FLAG_SHARED_INTR 0x0001 361ec1c60bbSSepherosa Ziehau #define EMX_FLAG_HAS_MGMT 0x0004 362ec1c60bbSSepherosa Ziehau #define EMX_FLAG_HAS_AMT 0x0008 363ec1c60bbSSepherosa Ziehau #define EMX_FLAG_HW_CTRL 0x0010 364ec1c60bbSSepherosa Ziehau 365ec1c60bbSSepherosa Ziehau /* DragonFly operating-system-specific structures. */ 366ec1c60bbSSepherosa Ziehau struct e1000_osdep osdep; 367ec1c60bbSSepherosa Ziehau device_t dev; 368ec1c60bbSSepherosa Ziehau 369ec1c60bbSSepherosa Ziehau bus_dma_tag_t parent_dtag; 370ec1c60bbSSepherosa Ziehau 371ec1c60bbSSepherosa Ziehau struct resource *memory; 372ec1c60bbSSepherosa Ziehau int memory_rid; 373ec1c60bbSSepherosa Ziehau 374a5807b81SSepherosa Ziehau struct resource *flash; 375a5807b81SSepherosa Ziehau int flash_rid; 376a5807b81SSepherosa Ziehau 377ec1c60bbSSepherosa Ziehau struct resource *intr_res; 378ec1c60bbSSepherosa Ziehau void *intr_tag; 379ec1c60bbSSepherosa Ziehau int intr_rid; 380ec1c60bbSSepherosa Ziehau int intr_type; 381ec1c60bbSSepherosa Ziehau 382ec1c60bbSSepherosa Ziehau struct ifmedia media; 383ec1c60bbSSepherosa Ziehau struct callout timer; 384ec1c60bbSSepherosa Ziehau int if_flags; 385ec1c60bbSSepherosa Ziehau 386ec1c60bbSSepherosa Ziehau /* WOL register value */ 387ec1c60bbSSepherosa Ziehau int wol; 388ec1c60bbSSepherosa Ziehau 389ec1c60bbSSepherosa Ziehau /* Multicast array memory */ 390ec1c60bbSSepherosa Ziehau uint8_t *mta; 391ec1c60bbSSepherosa Ziehau 392ec1c60bbSSepherosa Ziehau /* Info about the board itself */ 393ec1c60bbSSepherosa Ziehau uint8_t link_active; 394ec1c60bbSSepherosa Ziehau uint16_t link_speed; 395ec1c60bbSSepherosa Ziehau uint16_t link_duplex; 396ec1c60bbSSepherosa Ziehau uint32_t smartspeed; 397ec1c60bbSSepherosa Ziehau int int_throttle_ceil; 398ec1c60bbSSepherosa Ziehau 399ec1c60bbSSepherosa Ziehau struct lwkt_serialize main_serialize; 400ec1c60bbSSepherosa Ziehau struct lwkt_serialize *serializes[EMX_NSERIALIZE]; 401ec1c60bbSSepherosa Ziehau 402d84018e9SSepherosa Ziehau int tx_ring_cnt; 403d84018e9SSepherosa Ziehau int tx_ring_inuse; 404d84018e9SSepherosa Ziehau struct emx_txdata tx_data[EMX_NTX_RING]; 405ec1c60bbSSepherosa Ziehau 40613890b61SSepherosa Ziehau int rss_debug; 40713890b61SSepherosa Ziehau int rx_ring_cnt; 408c39e3a1fSSepherosa Ziehau struct emx_rxdata rx_data[EMX_NRX_RING]; 4095330213cSSepherosa Ziehau 41081ac62f7SSepherosa Ziehau int ifm_flowctrl; 411212c030eSSepherosa Ziehau 4125330213cSSepherosa Ziehau /* Misc stats maintained by the driver */ 4135330213cSSepherosa Ziehau unsigned long rx_overruns; 4145330213cSSepherosa Ziehau 4155330213cSSepherosa Ziehau struct e1000_hw_stats stats; 41653d76a93SSepherosa Ziehau 41753d76a93SSepherosa Ziehau struct if_ringmap *rx_rmap; 41853d76a93SSepherosa Ziehau struct if_ringmap *tx_rmap; 41953d76a93SSepherosa Ziehau int rdr_table[EMX_RDRTABLE_SIZE]; 4205330213cSSepherosa Ziehau }; 4215330213cSSepherosa Ziehau 422323e5ecdSSepherosa Ziehau struct emx_txbuf { 4235330213cSSepherosa Ziehau struct mbuf *m_head; 4245330213cSSepherosa Ziehau bus_dmamap_t map; 4255330213cSSepherosa Ziehau }; 4265330213cSSepherosa Ziehau 427323e5ecdSSepherosa Ziehau struct emx_rxbuf { 428323e5ecdSSepherosa Ziehau struct mbuf *m_head; 429323e5ecdSSepherosa Ziehau bus_dmamap_t map; 430323e5ecdSSepherosa Ziehau bus_addr_t paddr; 431323e5ecdSSepherosa Ziehau }; 432323e5ecdSSepherosa Ziehau 433ec1c60bbSSepherosa Ziehau #define EMX_IS_OACTIVE(tdata) \ 434ec1c60bbSSepherosa Ziehau ((tdata)->num_tx_desc_avail <= (tdata)->oact_tx_desc) 4355330213cSSepherosa Ziehau 4365330213cSSepherosa Ziehau #define EMX_INC_TXDD_IDX(idx) \ 4375330213cSSepherosa Ziehau do { \ 4385330213cSSepherosa Ziehau if (++(idx) == EMX_TXDD_MAX) \ 4395330213cSSepherosa Ziehau (idx) = 0; \ 4405330213cSSepherosa Ziehau } while (0) 4415330213cSSepherosa Ziehau 4425330213cSSepherosa Ziehau #endif /* !_IF_EMX_H_ */ 443