xref: /dragonfly/sys/dev/netif/ix/if_ix.h (revision dd5ce676d9b4496101d795200cb99fd0ddf5b254)
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_MAX_RXRING_X550    64
48 #define IX_MIN_RXRING_RSS     2
49 
50 /*
51  * TX ring count
52  */
53 #define IX_MAX_TXRING                   16
54 #define IX_MAX_TXRING_82598   32
55 #define IX_MAX_TXRING_82599   64
56 #define IX_MAX_TXRING_X540    64
57 #define IX_MAX_TXRING_X550    64
58 
59 /*
60  * Default number of segments received before writing to RX related registers
61  */
62 #define IX_DEF_RXWREG_NSEGS   32
63 
64 /*
65  * Default number of segments sent before writing to TX related registers
66  */
67 #define IX_DEF_TXWREG_NSEGS   8
68 
69 /*
70  * TxDescriptors Valid Range: 64-4096 Default Value: 256 This value is the
71  * number of transmit descriptors allocated by the driver. Increasing this
72  * value allows the driver to queue more transmits. Each descriptor is 16
73  * bytes. Performance tests have show the 2K value to be optimal for top
74  * performance.
75  */
76 #define IX_DEF_TXD            1024
77 #define IX_PERF_TXD           2048
78 #define IX_MAX_TXD            4096
79 #define IX_MIN_TXD            64
80 
81 /*
82  * RxDescriptors Valid Range: 64-4096 Default Value: 256 This value is the
83  * number of receive descriptors allocated for each RX queue. Increasing this
84  * value allows the driver to buffer more incoming packets. Each descriptor
85  * is 16 bytes.  A receive buffer is also allocated for each descriptor.
86  *
87  * Note: with 8 rings and a dual port card, it is possible to bump up
88  *        against the system mbuf pool limit, you can tune nmbclusters
89  *        to adjust for this.
90  */
91 #define IX_DEF_RXD            1024
92 #define IX_PERF_RXD           2048
93 #define IX_MAX_RXD            4096
94 #define IX_MIN_RXD            64
95 
96 /* Alignment for rings */
97 #define IX_DBA_ALIGN                    128
98 
99 #define IX_MAX_FRAME_SIZE     9728
100 #define IX_MTU_HDR            (ETHER_HDR_LEN + ETHER_CRC_LEN + EVL_ENCAPLEN)
101 #define IX_MAX_MTU            (IX_MAX_FRAME_SIZE - IX_MTU_HDR)
102 
103 
104 /* Flow control constants */
105 #define IX_FC_PAUSE           0xFFFF
106 #define IX_FC_HI              0x20000
107 #define IX_FC_LO              0x10000
108 
109 /*
110  * RSS related registers
111  */
112 #define IX_NRSSRK             10
113 #define IX_RSSRK_SIZE                   4
114 #define IX_RSSRK_VAL(key, i)  (key[(i) * IX_RSSRK_SIZE] | \
115                                          key[(i) * IX_RSSRK_SIZE + 1] << 8 | \
116                                          key[(i) * IX_RSSRK_SIZE + 2] << 16 | \
117                                          key[(i) * IX_RSSRK_SIZE + 3] << 24)
118 #define IX_NRETA              32
119 #define IX_NRETA_X550                   128
120 #define IX_NRETA_MAX                    128
121 #define IX_RETA_SIZE                    4
122 
123 #define IX_RDRTABLE_SIZE      (IX_NRETA_MAX * IX_RETA_SIZE)
124 
125 /*
126  * EITR
127  */
128 #define IX_EITR_INTVL_MASK_82598 0xffff
129 #define IX_EITR_INTVL_MASK    0x0fff
130 #define IX_EITR_INTVL_RSVD_MASK         0x0007
131 #define IX_EITR_INTVL_MIN     IXGBE_MIN_EITR
132 #define IX_EITR_INTVL_MAX     IXGBE_MAX_EITR
133 
134 /*
135  * Used for optimizing small rx mbufs.  Effort is made to keep the copy
136  * small and aligned for the CPU L1 cache.
137  *
138  * MHLEN is typically 168 bytes, giving us 8-byte alignment.  Getting
139  * 32 byte alignment needed for the fast bcopy results in 8 bytes being
140  * wasted.  Getting 64 byte alignment, which _should_ be ideal for
141  * modern Intel CPUs, results in 40 bytes wasted and a significant drop
142  * in observed efficiency of the optimization, 97.9% -> 81.8%.
143  */
144 #define IX_RX_COPY_LEN                  160
145 #define IX_RX_COPY_ALIGN      (MHLEN - IX_RX_COPY_LEN)
146 
147 #define IX_MAX_MCASTADDR      128
148 
149 #define IX_MSIX_BAR_82598     3
150 #define IX_MSIX_BAR_82599     4
151 
152 #define IX_TSO_SIZE           (IP_MAXPACKET + \
153                                          sizeof(struct ether_vlan_header))
154 
155 /*
156  * MUST be less than 38.  Though 82598 does not have this limit,
157  * we don't want long TX chain.  33 should be large enough even
158  * for 64K TSO (32 x 2K mbuf cluster and 1 x mbuf header).
159  *
160  * Reference:
161  * - 82599 datasheet 7.2.1.1
162  * - X540 datasheet 7.2.1.1
163  */
164 #define IX_MAX_SCATTER                  33
165 #define IX_TX_RESERVED                  3         /* 1 for TX ctx, 2 reserved */
166 
167 /* MSI and legacy interrupt */
168 #define IX_TX_INTR_VEC                  0
169 #define IX_TX_INTR_MASK                 (1 << IX_TX_INTR_VEC)
170 #define IX_RX0_INTR_VEC                 1
171 #define IX_RX0_INTR_MASK      (1 << IX_RX0_INTR_VEC)
172 #define IX_RX1_INTR_VEC                 2
173 #define IX_RX1_INTR_MASK      (1 << IX_RX1_INTR_VEC)
174 
175 #define IX_INTR_RATE                    8000
176 #define IX_MSIX_RX_RATE                 8000
177 #define IX_MSIX_TX_RATE                 6000
178 
179 /* IOCTL define to gather SFP+ Diagnostic data */
180 #define SIOCGI2C              SIOCGIFGENERIC
181 
182 /* TX checksum offload */
183 #define CSUM_OFFLOAD                    (CSUM_IP|CSUM_TCP|CSUM_UDP)
184 
185 #define IX_EICR_STATUS                  (IXGBE_EICR_LSC | IXGBE_EICR_ECC | \
186                                          IXGBE_EICR_GPI_SDP1 | IXGBE_EICR_GPI_SDP2 | \
187                                          IXGBE_EICR_TS)
188 
189 /* This is used to get SFP+ module data */
190 struct ix_i2c_req {
191           uint8_t             dev_addr;
192           uint8_t             offset;
193           uint8_t             len;
194           uint8_t             data[8];
195 };
196 
197 struct ix_mc_addr {
198           uint8_t             addr[IXGBE_ETH_LENGTH_OF_ADDRESS];
199           uint32_t  vmdq;
200 };
201 
202 struct ix_tx_buf {
203           struct mbuf         *m_head;
204           bus_dmamap_t        map;
205 };
206 
207 struct ix_rx_buf {
208           struct mbuf         *m_head;
209           struct mbuf         *fmp;
210           struct mbuf         *lmp;
211           bus_dmamap_t        map;
212           bus_addr_t          paddr;
213           u_int               flags;
214 #define IX_RX_COPY  0x1
215 };
216 
217 struct ix_softc;
218 
219 struct ix_tx_ring {
220           struct lwkt_serialize         tx_serialize;
221           struct ifaltq_subque          *tx_ifsq;
222           struct ix_softc               *tx_sc;
223           volatile uint32_t   *tx_hdr;
224           union ixgbe_adv_tx_desc       *tx_base;
225           struct ix_tx_buf    *tx_buf;
226           bus_dma_tag_t                 tx_tag;
227           int8_t                        tx_running;
228 #define IX_TX_RUNNING                   100
229 #define IX_TX_RUNNING_DEC     25
230           uint8_t                       tx_flags;
231 #define IX_TXFLAG_ENABLED     0x1
232           uint16_t            tx_nmbuf;
233           uint32_t            tx_idx;
234           uint16_t            tx_avail;
235           uint16_t            tx_next_avail;
236           uint16_t            tx_next_clean;
237           uint16_t            tx_ndesc;
238           uint16_t            tx_wreg_nsegs;
239           uint16_t            tx_intr_nsegs;
240           uint16_t            tx_nsegs;
241           int16_t                       tx_intr_vec;
242           int                           tx_intr_cpuid;
243           uint32_t            tx_eims;
244           uint32_t            tx_eims_val;
245           struct ifsubq_watchdog        tx_watchdog;
246           struct callout                tx_gc_timer;
247 
248           u_long                        tx_gc;
249 
250           bus_dma_tag_t                 tx_base_dtag;
251           bus_dmamap_t                  tx_base_map;
252           bus_addr_t                    tx_base_paddr;
253 
254           bus_dma_tag_t                 tx_hdr_dtag;
255           bus_dmamap_t                  tx_hdr_map;
256           bus_addr_t                    tx_hdr_paddr;
257 } __cachealign;
258 
259 struct ix_rx_ring {
260           struct lwkt_serialize         rx_serialize;
261           struct ix_softc               *rx_sc;
262           union ixgbe_adv_rx_desc       *rx_base;
263           struct ix_rx_buf    *rx_buf;
264           bus_dma_tag_t                 rx_tag;
265           bus_dmamap_t                  rx_sparemap;
266           uint32_t            rx_idx;
267           uint16_t            rx_flags;
268 #define IX_RXRING_FLAG_LRO    0x01
269 #define IX_RXRING_FLAG_DISC   0x02
270           uint16_t            rx_next_check;
271           uint16_t            rx_ndesc;
272           uint16_t            rx_mbuf_sz;
273           uint16_t            rx_wreg_nsegs;
274           int16_t                       rx_intr_vec;
275           uint32_t            rx_eims;
276           uint32_t            rx_eims_val;
277           struct ix_tx_ring   *rx_txr;  /* piggybacked TX ring */
278 
279 #ifdef IX_RSS_DEBUG
280           u_long                        rx_pkts;
281 #endif
282 
283           bus_dma_tag_t                 rx_base_dtag;
284           bus_dmamap_t                  rx_base_map;
285           bus_addr_t                    rx_base_paddr;
286 } __cachealign;
287 
288 struct ix_intr_data {
289           struct lwkt_serialize         *intr_serialize;
290           driver_intr_t                 *intr_func;
291           void                          *intr_hand;
292           struct resource               *intr_res;
293           void                          *intr_funcarg;
294           int                           intr_rid;
295           int                           intr_cpuid;
296           int                           intr_rate;
297           int                           intr_use;
298 #define IX_INTR_USE_RXTX      0
299 #define IX_INTR_USE_STATUS    1
300 #define IX_INTR_USE_RX                  2
301 #define IX_INTR_USE_TX                  3
302           const char                    *intr_desc;
303           char                          intr_desc0[64];
304 };
305 
306 struct ix_softc {
307           struct arpcom                 arpcom;
308 
309           struct ixgbe_hw               hw;
310           struct ixgbe_osdep  osdep;
311 
312           struct lwkt_serialize         main_serialize;
313           uint32_t            intr_mask;
314 
315           boolean_t           link_active;
316 
317           int                           rx_ring_inuse;
318           int                           tx_ring_inuse;
319 
320           struct ix_rx_ring   *rx_rings;
321           struct ix_tx_ring   *tx_rings;
322 
323           struct callout                timer;
324           int                           timer_cpuid;
325 
326           int                           ifm_media;          /* IFM_ */
327           uint32_t            link_speed;
328           bool                          link_up;
329           boolean_t           sfp_probe;          /* pluggable optics */
330           uint32_t            phy_layer;
331 
332           uint16_t            caps;               /* IX_CAP_ */
333 #define IX_CAP_DETECT_FANFAIL 0x0001
334 #define IX_CAP_TEMP_SENSOR    0x0002
335 #define IX_CAP_EEE            0x0004
336 #define IX_CAP_LEGACY_INTR    0x0008
337 #define IX_CAP_FW_RECOVERY    0x0010
338 
339           uint16_t            flags;              /* IX_FLAG_ */
340 #define IX_FLAG_FW_RECOVERY   0x0001
341 
342           struct callout                fw_timer;
343 
344           struct ixgbe_hw_stats         stats;
345 
346           int                           rx_ring_cnt;
347           int                           rx_ring_msix;
348 
349           int                           tx_ring_cnt;
350           int                           tx_ring_msix;
351 
352           int                           intr_type;
353           int                           intr_cnt;
354           struct ix_intr_data *intr_data;
355 
356           device_t            dev;
357           bus_dma_tag_t                 parent_tag;
358           struct ifmedia                media;
359 
360           struct resource               *mem_res;
361           int                           mem_rid;
362 
363           struct resource     *msix_mem_res;
364           int                           msix_mem_rid;
365 
366           int                           nserialize;
367           struct lwkt_serialize         **serializes;
368 
369           struct ix_mc_addr   *mta;               /* Multicast array memory */
370 
371           int                           if_flags;
372           int                           advspeed; /* advertised link speeds */
373           uint32_t            wufc;               /* power management */
374           uint16_t            dmac;               /* DMA coalescing */
375           uint16_t            max_frame_size;
376           int16_t                       sts_msix_vec;       /* status MSI-X vector */
377 
378           struct if_ringmap   *tx_rmap;
379           struct if_ringmap   *tx_rmap_intr;
380           struct if_ringmap   *rx_rmap;
381           struct if_ringmap   *rx_rmap_intr;
382 
383           int                           rdr_table[IX_RDRTABLE_SIZE];
384 
385           struct task                   wdog_task;
386           int                           direct_input;
387 #ifdef IX_RSS_DEBUG
388           int                           rss_debug;
389 #endif
390 };
391 
392 #define IX_ENABLE_HWRSS(sc)   ((sc)->rx_ring_cnt > 1)
393 #define IX_ENABLE_HWTSS(sc)   ((sc)->tx_ring_cnt > 1)
394 
395 #endif /* _IF_IX_H_ */
396