1 /* 2 * Copyright (c) 2001-2013, Intel Corporation 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions are met: 7 * 8 * 1. Redistributions of source code must retain the above copyright notice, 9 * this list of conditions and the following disclaimer. 10 * 11 * 2. Redistributions in binary form must reproduce the above copyright 12 * notice, this list of conditions and the following disclaimer in the 13 * documentation and/or other materials provided with the distribution. 14 * 15 * 3. Neither the name of the Intel Corporation nor the names of its 16 * contributors may be used to endorse or promote products derived from 17 * this software without specific prior written permission. 18 * 19 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 20 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 21 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 22 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 23 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 24 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 25 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 26 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 27 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 28 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 29 * POSSIBILITY OF SUCH DAMAGE. 30 */ 31 32 #ifndef _IF_IX_H_ 33 #define _IF_IX_H_ 34 35 /* Tunables */ 36 37 /* 38 * MSI-X count 39 */ 40 #define IX_MAX_MSIX 64 41 #define IX_MAX_MSIX_82598 16 42 43 /* 44 * RX ring count 45 */ 46 #define IX_MAX_RXRING 16 47 #define IX_MIN_RXRING_RSS 2 48 49 /* 50 * TX ring count 51 */ 52 #define IX_MAX_TXRING_82598 32 53 #define IX_MAX_TXRING_82599 64 54 #define IX_MAX_TXRING_X540 64 55 56 /* 57 * Default number of segments received before writing to RX related registers 58 */ 59 #define IX_DEF_RXWREG_NSEGS 32 60 61 /* 62 * Default number of segments sent before writing to TX related registers 63 */ 64 #define IX_DEF_TXWREG_NSEGS 8 65 66 /* 67 * TxDescriptors Valid Range: 64-4096 Default Value: 256 This value is the 68 * number of transmit descriptors allocated by the driver. Increasing this 69 * value allows the driver to queue more transmits. Each descriptor is 16 70 * bytes. Performance tests have show the 2K value to be optimal for top 71 * performance. 72 */ 73 #define IX_DEF_TXD 1024 74 #define IX_PERF_TXD 2048 75 #define IX_MAX_TXD 4096 76 #define IX_MIN_TXD 64 77 78 /* 79 * RxDescriptors Valid Range: 64-4096 Default Value: 256 This value is the 80 * number of receive descriptors allocated for each RX queue. Increasing this 81 * value allows the driver to buffer more incoming packets. Each descriptor 82 * is 16 bytes. A receive buffer is also allocated for each descriptor. 83 * 84 * Note: with 8 rings and a dual port card, it is possible to bump up 85 * against the system mbuf pool limit, you can tune nmbclusters 86 * to adjust for this. 87 */ 88 #define IX_DEF_RXD 1024 89 #define IX_PERF_RXD 2048 90 #define IX_MAX_RXD 4096 91 #define IX_MIN_RXD 64 92 93 /* Alignment for rings */ 94 #define IX_DBA_ALIGN 128 95 96 #define IX_MAX_FRAME_SIZE 0x3F00 97 98 /* Flow control constants */ 99 #define IX_FC_PAUSE 0xFFFF 100 #define IX_FC_HI 0x20000 101 #define IX_FC_LO 0x10000 102 103 /* 104 * RSS related registers 105 */ 106 #define IX_NRSSRK 10 107 #define IX_RSSRK_SIZE 4 108 #define IX_RSSRK_VAL(key, i) (key[(i) * IX_RSSRK_SIZE] | \ 109 key[(i) * IX_RSSRK_SIZE + 1] << 8 | \ 110 key[(i) * IX_RSSRK_SIZE + 2] << 16 | \ 111 key[(i) * IX_RSSRK_SIZE + 3] << 24) 112 #define IX_NRETA 32 113 #define IX_RETA_SIZE 4 114 115 /* 116 * EITR 117 */ 118 #define IX_EITR_INTVL_MASK_82598 0xffff 119 #define IX_EITR_INTVL_MASK 0x0fff 120 #define IX_EITR_INTVL_RSVD_MASK 0x0007 121 #define IX_EITR_INTVL_MIN IXGBE_MIN_EITR 122 #define IX_EITR_INTVL_MAX IXGBE_MAX_EITR 123 124 /* 125 * Used for optimizing small rx mbufs. Effort is made to keep the copy 126 * small and aligned for the CPU L1 cache. 127 * 128 * MHLEN is typically 168 bytes, giving us 8-byte alignment. Getting 129 * 32 byte alignment needed for the fast bcopy results in 8 bytes being 130 * wasted. Getting 64 byte alignment, which _should_ be ideal for 131 * modern Intel CPUs, results in 40 bytes wasted and a significant drop 132 * in observed efficiency of the optimization, 97.9% -> 81.8%. 133 */ 134 #define IX_RX_COPY_LEN 160 135 #define IX_RX_COPY_ALIGN (MHLEN - IX_RX_COPY_LEN) 136 137 #define IX_MAX_MCASTADDR 128 138 139 #define IX_MSIX_BAR_82598 3 140 #define IX_MSIX_BAR_82599 4 141 142 #define IX_TSO_SIZE (IP_MAXPACKET + \ 143 sizeof(struct ether_vlan_header)) 144 145 /* 146 * MUST be less than 38. Though 82598 does not have this limit, 147 * we don't want long TX chain. 33 should be large enough even 148 * for 64K TSO (32 x 2K mbuf cluster and 1 x mbuf header). 149 * 150 * Reference: 151 * - 82599 datasheet 7.2.1.1 152 * - X540 datasheet 7.2.1.1 153 */ 154 #define IX_MAX_SCATTER 33 155 #define IX_TX_RESERVED 3 /* 1 for TX ctx, 2 reserved */ 156 157 /* MSI and legacy interrupt */ 158 #define IX_TX_INTR_VEC 0 159 #define IX_TX_INTR_MASK (1 << IX_TX_INTR_VEC) 160 #define IX_RX0_INTR_VEC 1 161 #define IX_RX0_INTR_MASK (1 << IX_RX0_INTR_VEC) 162 #define IX_RX1_INTR_VEC 2 163 #define IX_RX1_INTR_MASK (1 << IX_RX1_INTR_VEC) 164 165 #define IX_INTR_RATE 8000 166 #define IX_MSIX_RX_RATE 8000 167 #define IX_MSIX_TX_RATE 6000 168 169 /* IOCTL define to gather SFP+ Diagnostic data */ 170 #define SIOCGI2C SIOCGIFGENERIC 171 172 /* TX checksum offload */ 173 #define CSUM_OFFLOAD (CSUM_IP|CSUM_TCP|CSUM_UDP) 174 175 #define IX_EICR_STATUS (IXGBE_EICR_LSC | IXGBE_EICR_ECC | \ 176 IXGBE_EICR_GPI_SDP1 | IXGBE_EICR_GPI_SDP2 | \ 177 IXGBE_EICR_TS) 178 179 /* This is used to get SFP+ module data */ 180 struct ix_i2c_req { 181 uint8_t dev_addr; 182 uint8_t offset; 183 uint8_t len; 184 uint8_t data[8]; 185 }; 186 187 struct ix_tx_buf { 188 struct mbuf *m_head; 189 bus_dmamap_t map; 190 }; 191 192 struct ix_rx_buf { 193 struct mbuf *m_head; 194 struct mbuf *fmp; 195 struct mbuf *lmp; 196 bus_dmamap_t map; 197 bus_addr_t paddr; 198 u_int flags; 199 #define IX_RX_COPY 0x1 200 }; 201 202 struct ix_softc; 203 204 struct ix_tx_ring { 205 struct lwkt_serialize tx_serialize; 206 struct ifaltq_subque *tx_ifsq; 207 struct ix_softc *tx_sc; 208 volatile uint32_t *tx_hdr; 209 union ixgbe_adv_tx_desc *tx_base; 210 struct ix_tx_buf *tx_buf; 211 bus_dma_tag_t tx_tag; 212 uint32_t tx_idx; 213 uint16_t tx_avail; 214 uint16_t tx_next_avail; 215 uint16_t tx_next_clean; 216 uint16_t tx_ndesc; 217 uint16_t tx_wreg_nsegs; 218 uint16_t tx_intr_nsegs; 219 uint16_t tx_nsegs; 220 int16_t tx_intr_vec; 221 int tx_intr_cpuid; 222 uint32_t tx_eims; 223 uint32_t tx_eims_val; 224 struct ifsubq_watchdog tx_watchdog; 225 226 bus_dma_tag_t tx_base_dtag; 227 bus_dmamap_t tx_base_map; 228 bus_addr_t tx_base_paddr; 229 230 bus_dma_tag_t tx_hdr_dtag; 231 bus_dmamap_t tx_hdr_map; 232 bus_addr_t tx_hdr_paddr; 233 } __cachealign; 234 235 struct ix_rx_ring { 236 struct lwkt_serialize rx_serialize; 237 struct ix_softc *rx_sc; 238 union ixgbe_adv_rx_desc *rx_base; 239 struct ix_rx_buf *rx_buf; 240 bus_dma_tag_t rx_tag; 241 bus_dmamap_t rx_sparemap; 242 uint32_t rx_idx; 243 uint16_t rx_flags; 244 #define IX_RXRING_FLAG_LRO 0x01 245 #define IX_RXRING_FLAG_DISC 0x02 246 uint16_t rx_next_check; 247 uint16_t rx_ndesc; 248 uint16_t rx_mbuf_sz; 249 uint16_t rx_wreg_nsegs; 250 int16_t rx_intr_vec; 251 uint32_t rx_eims; 252 uint32_t rx_eims_val; 253 struct ix_tx_ring *rx_txr; /* piggybacked TX ring */ 254 255 #ifdef IX_RSS_DEBUG 256 u_long rx_pkts; 257 #endif 258 259 bus_dma_tag_t rx_base_dtag; 260 bus_dmamap_t rx_base_map; 261 bus_addr_t rx_base_paddr; 262 } __cachealign; 263 264 struct ix_intr_data { 265 struct lwkt_serialize *intr_serialize; 266 driver_intr_t *intr_func; 267 void *intr_hand; 268 struct resource *intr_res; 269 void *intr_funcarg; 270 int intr_rid; 271 int intr_cpuid; 272 int intr_rate; 273 int intr_use; 274 #define IX_INTR_USE_RXTX 0 275 #define IX_INTR_USE_STATUS 1 276 #define IX_INTR_USE_RX 2 277 #define IX_INTR_USE_TX 3 278 const char *intr_desc; 279 char intr_desc0[64]; 280 }; 281 282 struct ix_softc { 283 struct arpcom arpcom; 284 285 struct ixgbe_hw hw; 286 struct ixgbe_osdep osdep; 287 288 struct lwkt_serialize main_serialize; 289 uint32_t intr_mask; 290 291 boolean_t link_active; 292 293 int rx_ring_inuse; 294 int tx_ring_inuse; 295 296 struct ix_rx_ring *rx_rings; 297 struct ix_tx_ring *tx_rings; 298 299 struct callout timer; 300 int timer_cpuid; 301 302 uint32_t optics; 303 uint32_t fc; /* local flow ctrl setting */ 304 uint32_t link_speed; 305 bool link_up; 306 boolean_t sfp_probe; /* plyggable optics */ 307 308 struct ixgbe_hw_stats stats; 309 310 int rx_ring_cnt; 311 int rx_ring_msix; 312 313 int tx_ring_cnt; 314 int tx_ring_msix; 315 316 int intr_type; 317 int intr_cnt; 318 struct ix_intr_data *intr_data; 319 320 /* sysctl tree glue */ 321 struct sysctl_ctx_list sysctl_ctx; 322 struct sysctl_oid *sysctl_tree; 323 324 device_t dev; 325 bus_dma_tag_t parent_tag; 326 struct ifmedia media; 327 328 struct resource *mem_res; 329 int mem_rid; 330 331 struct resource *msix_mem_res; 332 int msix_mem_rid; 333 334 int nserialize; 335 struct lwkt_serialize **serializes; 336 337 uint8_t *mta; /* Multicast array memory */ 338 339 int if_flags; 340 int advspeed; /* advertised link speeds */ 341 uint16_t max_frame_size; 342 int16_t sts_msix_vec; /* status MSI-X vector */ 343 344 #ifdef IX_RSS_DEBUG 345 int rss_debug; 346 #endif 347 }; 348 349 #define IX_ENABLE_HWRSS(sc) ((sc)->rx_ring_cnt > 1) 350 #define IX_ENABLE_HWTSS(sc) ((sc)->tx_ring_cnt > 1) 351 352 #endif /* _IF_IX_H_ */ 353